Привет! В этой статье я поделюсь своим опытом локализации игр и приложений в Unity, а также расскажу о своем плагине Simple Localization, который доступен в Asse Store. Уровень статьи — Easy. Кода не будет вообще, он вам не пригодится.
С точки зрения общей концепции все просто. У нас должен быть список словарей для каждого языка с одинаковыми ключами, из которых мы и будем получать локализованные значения. С технической стороны нужно определить:
- Какими будут наши словари?
- Где они будут храниться?
- Как мы будем их редактировать и расширять?
- Как реализовать связку с интерфейсом приложения?
При реализации я руководствовался двумя принципами: простота и удобство. Итак, самый простой структурированный формат, который подойдет для словарей — CSV (Comma Separated Values). Это текстовый файл, в котором все ячейки разделены разделителем — либо запятой (","), либо точкой с запятой (";"), в зависимости от региональных настроек. CSV можно открыть и редактировать в любом текстовом редакторе, но лучше всего для этого подойдет Excel. Храниться CSV будут, конечно же, в папке Resources, чтобы приложение в любой момент могло прочитать их.
Формат будет следующий: первая колонка — ключи, все последующие колонки — словари. Первая строка — заголовок. Можно иметь один общий CSV, если текстов в приложении немного, а можно разбить на несколько CSV по какому-либо принципу, например: меню, настройки, достижения и т.д.
Идем дальше. Редактирование локализации в Excel, это, конечно, здорово, но я предлагаю загрузить их в Google Sheets. Тогда редактировать их можно будет из любого места, в любое время и с любого устройства. Но самое главное — локализацию можно будет расшарить переводчикам, и у них не будет никаких сложностей с переводом. Посмотреть на словарь можно по ссылке.
И последний пункт — интеграция с Unity, с uGUI. Тут тоже все просто — на каждый текстовый компонент Text добавим свой компонент LocalizedText, в котором укажем ключ. При запуске этот компонент получит локализованное значение и установит его в Text.
Дальше возникает несколько вопросов:
- Как и когда инициализировать словарь? Достаточно сделать вызов LocalizationManager.Read из управляющего скрипта. Это можно сделать в Awake или Start, если вас устроит автоматическое определение языка (Application.systemLanguage), или после загрузки профиля, когда уже будут известны пользовательские настройки.
- Что делать, если мы заранее не знаем, какое именно значение будет иметь компонент Text? Не добавляем компонент LocalizedText, а потом присвоим ему значение из кода, обратившись к словарю через LocalizationManager.Localize(string localizationKey).
- Что делать, если в локализованное значение нужно вставить параметр? Просто используем в локализованной строке форматирование, например «Level {0}», а потом через string.Format выполним подстановку. Для этого есть перегрузка LocalizationManager.Localize(string localizationKey, params object[] args).
- Как изменить локализацию в runtime? Просто меняем язык через LocalizationManager.Language. При этом возникнет событие, на которое подписаны все компоненты LocalizedText. Однако, локализованные из кода компоненты Text (у которых нет компонента LocalizedText) нужно будет обновить вручную.
- Что делать, с другими элементами, например, с выпадающим списком Dropdown? Очевидно, использовать компонент LocalizedDropdown =)
Ну и последняя плюшка в моем ассете — он умеет автоматически скачивать все листы из Google Sheets и сохранять их в ресурсах игры. Для этого есть компонент LocalizationSync, у которого есть кнопка Sync (в инспекторе).
Скачать можно в Asset Store: Simple Localization.
Автор: Олег Мекекечко