← Назад к вопросам

Как реализовать локализацию игры в Unity?

2.0 Middle🔥 131 комментариев
#C# и ООП

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подходы к реализации локализации в Unity

Локализация (L10n) в Unity — это комплексный процесс, выходящий за рамки простого перевода текста. Я практикую многоуровневый подход, который обеспечивает гибкость, производительность и удобство поддержки. Вот ключевые стратегии и их техническая реализация.

1. Выбор архитектуры хранения данных

Первое решение — где и как хранить переводимые строки.

Вариант A: CSV/Excel файлы Идеально для команд с отдельными локализаторами. Используется потоковая загрузка через Resources, Addressables или TextAsset.

// Пример загрузки CSV в Dictionary
public Dictionary<string, string> LoadLocalizationCSV(string langCode) {
    TextAsset csvFile = Resources.Load<TextAsset>($"Locales/{langCode}");
    var dictionary = new Dictionary<string, string>();
    string[] lines = csvFile.text.Split('\n');
    foreach (string line in lines) {
        string[] keyValue = line.Split(';');
        if (keyValue.Length == 2) {
            dictionary[keyValue[0]] = keyValue[1];
        }
    }
    return dictionary;
}

Вариант B: JSON-файлы Более структурированный подход, позволяет вкладывать данные.

{
    "ui": {
        "start_game": "Начать игру",
        "options": "Настройки"
    },
    "dialogue": {
        "welcome": "Добро пожаловать!"
    }
}

Вариант C: Asset Bundles или Addressables Для крупных проектов, где важна динамическая загрузка и обновление локализаций без патчей.

2. Ключевые компоненты системы

Менеджер локализации — центральный синглтон, отвечающий за:

  • Загрузку актуального языкового пакета
  • Смену языка во время выполнения
  • Уведомление всех подписчиков о смене языка (через события Action или UnityEvent)
public class LocalizationManager : MonoBehaviour {
    public static LocalizationManager Instance;
    public event Action OnLanguageChanged;
    
    private Dictionary<string, string> _currentDictionary;
    private string _currentLanguage = "en";
    
    void Awake() {
        if (Instance == null) Instance = this;
        LoadLanguage(_currentLanguage);
    }
    
    public void ChangeLanguage(string langCode) {
        LoadLanguage(langCode);
        OnLanguageChanged?.Invoke();
    }
    
    public string GetText(string key) {
        if (_currentDictionary.TryGetValue(key, out string value)) {
            return value;
        }
        return $"#{key}#";
    }
}

Локализуемый компонент — автоматически обновляемый UI-элемент.

[RequireComponent(typeof(Text))]
public class LocalizedText : MonoBehaviour {
    [SerializeField] private string _localizationKey;
    
    void Start() {
        UpdateText();
        LocalizationManager.Instance.OnLanguageChanged += UpdateText;
    }
    
    void UpdateText() {
        GetComponent<Text>().text = 
            LocalizationManager.Instance.GetText(_localizationKey);
    }
    
    void OnDestroy() {
        LocalizationManager.Instance.OnLanguageChanged -= UpdateText;
    }
}

3. Расширенные возможности локализации

Плюральные формы Некоторые языки имеют сложные правила склонений (например, русский: 1 предмет, 2 предмета, 5 предметов). Реализуется через специальные ключи или формулы.

public string GetPlural(string key, int count) {
    int pluralForm = GetPluralForm(_currentLanguage, count);
    string specificKey = $"{key}_plural_{pluralForm}";
    return GetText(specificKey);
}

Локализация спрайтов и аудио Часто требуется замена графики (баннеры с текстом) или озвучки. Реализуется через систему подстановки ассетов:

public Sprite GetLocalizedSprite(string spriteKey) {
    string path = $"Sprites/{_currentLanguage}/{spriteKey}";
    return Resources.Load<Sprite>(path);
}

4. Работа с UI Toolkit и TextMesh Pro

Для TextMesh Pro используйте компонент TMP_Dropdown для выбора языка и подписывайтесь на события смены. Для UI Toolkit (новый UI-фреймворк Unity) локализация реализуется через UXML-переменные и перезапись текстовых элементов в рантайме.

5. Технические рекомендации

  • Оптимизация: Используйте кэширование загруженных языковых пакетов
  • Резервный язык: Всегда назначайте язык по умолчанию (обычно английский)
  • Автоопределение: Используйте Application.systemLanguage для начальной установки, но давайте игроку выбор
  • Тестирование: Создайте режим "псевдолокализации", где все символы заменяются на ###, чтобы выявить проблемы с переполнением UI
  • Контекст: Добавляйте комментарии для переводчиков, так как одна фраза может иметь разные значения в разных контекстах

6. Инструменты и интеграция

Для профессиональных проектов рекомендую интеграцию с внешними системами:

  • Google Sheets + API для синхронизации переводов
  • PO-файлы (gettext) — стандарт для многих локализационных сервисов
  • I2 Localization или Lunar Unity — готовые ассет-сторе решения, если требуется быстрое внедрение

Критически важный момент: Заложите архитектуру локализации на ранних этапах разработки. Рефакторинг системы локализации в готовом проекте с сотнями текстовых элементов — трудоемкая и рискованная задача. Всегда используйте ключи вместо прямых строк в коде, даже на ранних прототипах.

Как реализовать локализацию игры в Unity? | PrepBro