Локализация в Unity

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Здравствуй, игродел!
В этой статье ты узнаешь как сделать удобную локализацию в своей игре.

Проблема:

Язык - пожалуй, один из главных порогов для игроков, если ваша игра поддерживает английский, многие смогут понимать, что в ней происходит, но как быть с аудиторией, не владеющей этим языком? Да и играть в игру с поддержкой родного языка всегда приятнее.
Для малоопытного разработчика может быть весьма неочевидно, как реализовать многоязычность своей игры, порой этот вопрос возникает, когда часть игры уже закончена, в таком случаи система локализации должна быть "надстройкой" к уже существующей базе кода, а не перестраивать её в связи с новой задачей.

Пути решения:

Как и с любой задачей в программировании игры, мы можем найти массу путей решения, так и здесь.

1) Assets, мощный инструмент Unity, позволяющий использовать реализованный кем-то функционал в своём проекте, локализация - не исключение, например simple localization, однако использование такого решения может быть сложным, если проект небольшой и займет больше времени чем собственная реализация, к тому же оно не дает понимания того, как работает локализация в играх.

2) Разные версии игры на разных языках. Сомнительный метод, однако раньше его часто использовали для экономии памяти и упрощения самой игры, однако то время прошло и сейчас дополнительный скрипт и файл в ресурсах игры - мелочь, способная сэкономить массу времени на поиске в коде текста подлежащего переводы.

3) Перевод по файлу, на мой взгляд лучший способ, который мы и реализуем ниже своими руками. Переводчику будет просто работать с одним текстовым файлом.

Решение:

Для начала нам нужно создать csv файл, в котором будем хранить перевод всех текстовых надписей в игре. Сделать это можно в Exсel или просто в блокноте (ведь csv - текстовый файл):

Структура файла такова: первая строка - наименования столбцов, " ; " - разделитель элементов разных столбцов, находящихся на одной строке. id - уникальный индикатор текста, переводы которого хранятся в соответствующих столбцах той же строки.

Когда вы разместите Localization.csv в Resources (там я создал папку "Localization" и уже в неё поместил сsv) своей игры вы увидите, что Unity воспринимает ваш файл как Text Asset, так и должно быть, для него в Unity есть свои методы загрузки, потому нам не придётся заниматься парсингом.

Итак, перед непосредственной локализацией текста нам нужно реализовать выбор языка:

// Language_changer.cs
using UnityEngine;

public class Language_changer : MonoBehaviour
{
    public void Set_RU()
    {
    		// сохраняем пару ключ-значение
        PlayerPrefs.SetString("GameLanguage", "RU");
        // выведем сведетельство того, что игра увидела смену языка
        Debug.Log("Language changed to RUSSIAN");
    }
    public void Set_EN()
    {
        PlayerPrefs.SetString("GameLanguage", "EN");
        Debug.Log("Language changed to ENGLISH");
    }
}

Этот скрипт надо прикрепить к префабу, а его повесить на кнопки, отвечающие за выбор языка:

Наконец можно писать сам скрипт-локализатор, который в последствии мы будем вешать на всё, что имеет поле Text...

// Localizator.cs
using UnityEngine;
using UnityEngine.UI;
using System.Text.RegularExpressions;

public class Localizator : MonoBehaviour{
    public string id;
    void Awake(){  // если язык выбран...
        if (PlayerPrefs.HasKey("GameLanguage")){
            string GameLanguage = PlayerPrefs.GetString("GameLanguage");  //  RU/EN
            change_text(localized_text(id, GameLanguage));
        }else{  // если язык не выбран то английский по умолчанию
            change_text(localized_text(id, "EN"));
        }
    }

    private void change_text(string new_text){
        // вставляем текст в текстовое поле объекта на котором висит скрипт
        GetComponent<Text>().text = new_text;
    }
  
    private string localized_text(string id, string lang){  // вытаскиваем из таблицы значение
      // читаем из Resources/Localization/Localization.csv
      TextAsset mytxtData=(TextAsset)Resources.Load("localization/localization");
        string loc_txt=mytxtData.text;
        string[] rows = loc_txt.Split('\n');
        for (int i = 1; i < rows.Length; i++);
            string[] cuted_row = Regex.Split(rows[i], ";");
            if(id == cuted_row[0]){
                if(lang == "EN"){
                    return cuted_row[1];
                }else if(lang == "RU"){
                    return cuted_row[2];
                }
                break;
            }
        }
        return "translation not found";  // если перевод не найден в таблице
    }
}

Готово! Все что нужно для локализации - просто прикрепить скрипт к объекту (имеющему поле Text), указывать id (публичную переменную скрипта) и внести id с соответствующими переводами в файл локализации.

пример использования
пример использования
Источник: https://habr.com/ru/post/594813/


Интересные статьи

Интересные статьи

Одна из самых важных (на мой взгляд) функций в Битрикс24 это бизнес-процессы. Теоретически они позволяют вам полностью избавиться от бумажных служебок и перенести их в эл...
Привет! Не секрет, что существует множество программ для взлома игр и приложений. Способов взлома тоже много. Например, декомпиляция и модификация исходного кода (с последующей пу...
Вам когда-либо приходилось думать над тем, как сделать управление сценами в вашем проекте менее болезненным? Когда у вас достаточно простая игра, в которой всего несколько сцен идущих...
Всем привет, на связи Александр Панов, техлид из Pixonic. В компании я отвечаю за межпроектные решения и околопроектную периферию и сегодня хочу поделиться своим опытом и наработками. Плат...
Устраивать конкурсы в инстаграме сейчас модно. И удобно. Инстаграм предоставляет достаточно обширный API, который позволяет делать практически всё, что может сделать обычный пользователь ручками.