Локализация: от каталога до интерфейса
Первый перевод, выбор CSV или PO, смена языка, fallback и проверка интерфейса перед выпуском.
Локализация игры
Перевод текста, выбор языка, отображение шрифтов и локализованные ресурсы — отдельные части работы. Этот раздел описывает язык игры. Переключатель языка самого портала не меняет настройки вашего проекта.
Получить первый перевод
- Подготовьте каталог RU/EN. Для общей таблицы используйте CSV; для отдельных языковых файлов, контекстов и форм множественного числа — PO. В руководствах приведены готовые входные файлы.
- Импортируйте и зарегистрируйте переводы в Project Settings → Localization → Translations. Для CSV регистрируются созданные
.translation, для PO — сам.po. Одна загрузка ресурса через ResourceLoader не добавляет его в поиск переводов. Подробности — подключение каталогов. - Для проверки используйте ключ
PLAYиз CSV-примера. ПослеTranslationServer.SetLocale("en")вызовTranslationServer.Translate("PLAY").ToString()даётPlay, после SetLocale("ru") —Играть. - У статического Label задайте ключ в Text и разрешите автоматический перевод. Text сохраняет исходный ключ; отображаемый текст меняется отдельно. Для вычисляемой надписи переводите целый шаблон и пересчитывайте её при NotificationTranslationChanged. Полный пример — локализованный интерфейс.
Не регистрируйте несколько каталогов с одним сочетанием ключа, контекста и языка, рассчитывая на случайный порядок перезаписи. Выберите устойчивые ключи и сохраняйте параметры форматирования во всех переводах.
Выбрать следующий шаг
| Задача | Руководство и результат |
|---|---|
| Переводить вместе с командой в таблице | CSV: заголовки языков, разделители, кавычки, контексты и множественное число |
| Передавать переводчикам отдельные каталоги | PO/gettext: заголовок Language, контекст, формы и пропускаемые записи |
| Выбрать язык игрока | Коды локалей: список реально поставляемых языков, регион и явно заданный резервный язык |
| Обновлять интерфейс при смене языка | Интернационализация игры: статический и вычисляемый текст, ресурсы, шрифты и направления интерфейса |
| Найти обрезанные или непереводимые строки | Псевдолокализация: расширение текста и ограничения C#-плейсхолдеров |
Смена языка и недостающие сообщения
Показывайте игроку только языки, каталоги которых поставляются с игрой. Распознаваемый движком код не означает наличие перевода. TranslationServer.SetLocale() меняет локаль текущего процесса и уведомляет интерфейс; предпочтение игрока нужно сохранять отдельно, например через настройки и сохранения.
Задайте резервный язык в internationalization/locale/fallback и проверьте отсутствующую запись. Если сообщения нет ни в выбранном, ни в резервном каталоге, результатом может стать исходный ключ. Для текстового и ресурсного fallback правила различаются: отсутствие подходящей локализованной замены ресурса возвращает исходный ресурс, а не автоматически вариант текстового резервного языка.
Множественное число выбирает шаблон, а не подставляет число: после TranslatePlural выполняйте форматирование полного сообщения. Не собирайте фразу из отдельных переведённых слов. Пользовательские имена и чат не должны автоматически становиться ключами перевода.
Проверить результат и экспорт
| Проверка | Что должно получиться |
|---|---|
| Сменить en → ru при открытом интерфейсе | Статические надписи обновляются; вычисляемые пересчитаны вашим обработчиком |
| Оставить один перевод пустым | Используется предусмотренный резервный текст; полностью неизвестный ключ виден как ключ |
| Показать пользовательское имя, совпадающее с ключом | Оно остаётся пользовательским текстом при отключённом автопереводе |
| Проверить длинную строку в минимальном окне | Текст помещается или переносится; управляющие элементы остаются доступны |
| Проверить нужные символы и RTL | Реальный шрифт покрывает текст; направление и расположение элементов проверены отдельно |
| Запустить экспортированную игру | Каталоги и локализованные ресурсы присутствуют, переключение работает вне редактора |
Псевдолокализация не заменяет проверку реальных языков, CJK-шрифтов, арабского shaping или RTL. Изменение Label.Language не выбирает каталог перевода; изменение Control.LayoutDirection не меняет язык сообщений. Удаление ресурсов профилем экспорта тоже проверяйте отдельно.
Примеры в связанных руководствах проверены на установленном Windows-runtime. Для этого входного маршрута повторно использованы только указанные в техническом отчёте проверки каталогов, переключения, fallback и форматов. Визуальное покрытие шрифтов, RTL-вёрстка и экспорт на все платформы этим отчётом не подтверждены.