Подключение перевода игры
Импорт RU/EN, регистрация ресурсов, выбор локали и резервный язык.
Используйте постоянные ключи для текста интерфейса, храните переводы отдельно и зарегистрируйте ресурсы перевода в проекте. Одного импорта таблицы недостаточно.
Подключить русский и английский
- Создайте в проекте Locale/ui.csv в кодировке UTF-8. Полная таблица приведена ниже.
- Дождитесь импорта в редакторе. Рядом с CSV появятся ресурсы Locale/ui.en.translation и Locale/ui.ru.translation.
- Откройте Project Settings → Localization → Translations и добавьте оба созданных ресурса .translation. Добавляйте ресурсы, а не ui.csv.
- Установите internationalization/locale/fallback в en. Укажите PLAY в свойстве Text у Label; оставьте автоматический перевод включённым у него и в родительской иерархии.
- Запустите проект. Вызовите TranslationServer.SetLocale("ru"), затем TranslationServer.SetLocale("en"). Текст должен меняться между Играть и Play.
keys,en,ru
PLAY,Play,Играть
ONLY_EN,English fallback,Эквивалентная настройка project.reckfell: при закрытом редакторе объедините этот раздел с существующим содержимым файла.
[internationalization]
locale/fallback="en"
locale/translations=PackedStringArray("asset://Locale/ui.en.translation", "asset://Locale/ui.ru.translation")Не заменяйте остальное содержимое project.reckfell. Дополнительные ресурсы перевода добавляйте в тот же массив translations.
Выбрать язык явно
TranslationServer.SetLocale("ru");
string play = TranslationServer.Translate("PLAY").ToString();Это инструкции внутри метода. Смена локали выбирает готовый текст: она не переводит произвольные строки и не сохраняет выбор игрока. Сохраните выбранную локаль вместе с другими настройками и применяйте при запуске игры.
Обозначение локали нормализуется: ru-RU превращается в ru_RU. Запрос ru_RU может использовать ресурс ru. Не рассчитывайте на порядок выбора между несколькими ресурсами с одинаковым ключом для одной локали: у сообщения должен быть один источник.
Если перевода нет
Поиск сначала использует выбранную локаль, затем резервную. Если ни в одной нет непустого перевода, Translate возвращает ключ.
| Вызов при локали ru | Результат с таблицей выше |
|---|---|
| Translate("PLAY") | Играть |
| Translate("ONLY_EN") | English fallback |
| Translate("UNKNOWN") | UNKNOWN |
| Translate("play") | play: регистр ключей учитывается |
Пустая ячейка не означает «показать пустой текст»: сообщение остаётся без перевода для этой локали. Если элемент нужно скрыть, задайте отдельное правило видимости.
Подключение во время игры
Регистрация в настройках проекта загружает ресурсы при запуске. Для необязательного языкового пакета вызовите ResourceLoader.Load<Translation>(path), проверьте результат и передайте ресурс в TranslationServer.AddTranslation. Сама загрузка ресурс не регистрирует. RemoveTranslation прекращает использовать переданный ресурс.
Храните ссылку на ресурсы, которые планируете отключать. Не загружайте и не регистрируйте один пакет каждый кадр. После изменения набора ресурсов обновляйте самостоятельно вычисленный текст: регистрация не заменяет логику обновления интерфейса.
Диагностика
| Симптом | Что проверить |
|---|---|
| На экране буквально PLAY | Ресурс зарегистрирован; локаль подходит; ключ и контекст совпадают точно |
| Часть русского текста стала английской | Русская ячейка пуста или отсутствует, а резервная локаль — en |
| Локаль поменялась, вычисленная строка — нет | Пересчитывайте её при NotificationTranslationChanged; полный пример Label есть в руководстве по CSV |
| Обычный Label не переводится | AutoTranslateMode не отключён у элемента или предка; в Text сохранён ключ |
| Вместо букв квадраты или пропуски | Покрытие шрифта, резервные шрифты и вёрстку: успешный поиск строки не доказывает правильное отображение символов |
В разделе таблиц CSV разобраны кавычки, контекст, множественные формы и полный пример C#. Раздел каталогов PO подходит для отдельного файла gettext на каждый язык.
Граница проверки
В Reckfell 1.0.0 проверены настоящий импорт CSV, регистрация при запуске проекта, нормализация локали, региональный запрос, отсутствующие ключи, резервный английский и подключение/отключение ресурсов. Пример Label проверен через уведомления о смене локали. Названия пунктов редактора сверены с исходниками; работа мышью, отображение шрифтов, RTL и экспорт на платформы этими проверками не подтверждаются.