Коды локалей и выбор языка
Какие коды использовать, чем известные локали отличаются от переводов игры и как выбирать RU/EN.
Локаль обозначает язык и при необходимости письменность или регион. Распознавание кода не означает, что в игре есть перевод. Отделяйте каталог локалей движка от списка языков, которые действительно входят в игру.
Выбрать код каталога
| Код | Значение | Применение |
|---|---|---|
| en | Английский | общий английский каталог |
| ru | Русский | общий русский каталог |
| en_US | Английский, США | региональные формулировки |
| en_GB | Английский, Великобритания | региональные формулировки |
| zh_Hans | Китайский, упрощённая письменность | перевод для конкретной письменности |
| zh_Hant_TW | Китайский, традиционная письменность, Тайвань | перевод с учётом письменности и региона |
| sr_Latn | Сербский, латиница | отличие от сербской кириллицы |
Каноническая запись: language_Script_COUNTRY_VARIANT. Язык обычно записывают строчными буквами, необязательную письменность — с заглавной, необязательную страну — прописными. Используйте распознаваемые коды и только те различия, для которых действительно подготовлены переводы. Регион сам по себе не выбирает валюту, единицы измерения или сервер игры.
Укажите ru/en в заголовках CSV, свойстве Translation.Locale или заголовке Language каталога PO. Имя файла ru.po не переопределяет заголовок PO.
Нормализовать и сравнить
TranslationServer.StandardizeLocale("ru-RU") возвращает ru_RU; zh-Hant-TW становится zh_Hant_TW. Распознаваемое обозначение письменности sr@latin превращается в sr_Latn. Передавайте канонический регистр: нормализация не проверяет произвольный ввод игрока и не гарантирует исправление каждого некорректного кода.
Необязательный аргумент addDefaults влияет на некоторые неоднозначные локали. Например, StandardizeLocale("zh") возвращает zh, а StandardizeLocale("zh", true) — zh_Hans_CN в текущем движке. Не добавляйте значения по умолчанию вслепую, когда игрок явно выбрал письменность или региональный каталог.
CompareLocales возвращает 10 при точном или эквивалентном совпадении, положительную оценку при совпадении языка и 0 для разных языков. Положительный результат — оценка сходства, а не доказательство наличия каталогов, символов шрифта или переведённых сообщений. Для двух письменностей одного языка могут требоваться разные материалы.
Выбрать язык, который входит в игру
Полный GameLanguage.cs намеренно поддерживает только ru и en. Он сводит региональный запрос к подготовленному языковому каталогу и выбирает en во всех остальных случаях. Это не универсальный алгоритм сопоставления локалей:
using Reckfell;
public static class GameLanguage
{
// This game ships only ru and en catalogs.
public static string Resolve(string requested)
{
if (string.IsNullOrWhiteSpace(requested)) return "en";
string normalized = TranslationServer.StandardizeLocale(requested);
string language = normalized.Split('_')[0];
return language == "ru" ? "ru" : "en";
}
public static void Apply(string requested)
{
TranslationServer.SetLocale(Resolve(requested));
}
}Сначала зарегистрируйте оба каталога. В методе запуска вызывайте GameLanguage.Apply(savedLocale), если выбор игрока сохранён; иначе — GameLanguage.Apply(OS.GetLocale()). Оставьте возможность ручного переключения. Resolve возвращает ru для ru-RU и en для en-GB, fr-FR или пустого запроса. Сохраняйте выбор отдельно: Apply его не записывает.
При добавлении региональных языков или разных письменностей замените это правило RU/EN явным списком поддерживаемых локалей. Сохраняйте выбранную письменность: нельзя объединять zh_Hant и zh_Hans в общий zh только потому, что пример для RU/EN отбрасывает регион.
Получить полные актуальные каталоги кодов
Используйте методы SDK вместо копирования статической таблицы, которая может разойтись с установленным движком:
| Идентификаторы | Читаемое название |
|---|---|
| TranslationServer.GetAllLanguages() | GetLanguageName(code) |
| TranslationServer.GetAllScripts() | GetScriptName(code) |
| TranslationServer.GetAllCountries() | GetCountryName(code) |
Эти каталоги описывают распознаваемые коды. TranslationServer.GetLoadedLocales() возвращает локали ресурсов, зарегистрированных в основном домене переводов. Результат может быть пустым, хотя GetAllLanguages содержит ru и en. Список подключённых локалей тоже не доказывает, что переведено каждое сообщение.
Для меню игры используйте подготовленный список доступных языков с подписями вроде Русский и English. Не предлагайте все известные движку языки так, будто они уже переведены.
Диагностика выбора языка
| Симптом | Что проверить |
|---|---|
| Код распознаётся, но видны ключи | Регистрацию каталога, его сообщения и локаль |
| При запросе en_GB показан общий английский | В игру включён только en либо поиск использует его как подходящий каталог |
| Выбранная письменность потерялась | Ваш алгоритм сократил локаль до языка |
| После перезапуска вернулся язык ОС | Настройка игрока не сохранена или применена до чтения сохранённого выбора |
| Текст правильный, символы, направление или формат — нет | Шрифт, обработку текста, вёрстку и формат чисел: одно сопоставление локали их не проверяет |
Связанные инструкции: подключение переводов и резервный язык, контекст и множественные формы CSV.
В движке проверены приведённые примеры нормализации, категории сравнения, запросы каталогов кодов, отличие от подключённых локалей и точный алгоритм RU/EN. Получение локали на разных ОС, сохранение выбора, все возможные сочетания локалей, отображение шрифтов и экспорт не проверялись.