Localization addon с читаемыми fallback
✅ Source verified 🌐 Localization pattern API source generation 1.9.0
Creator API Political World строится вокруг правила:
localization может быть optional, но её отсутствие не должно превращать addon content в нечитаемый мусор.
В source:
public const string DefaultFallbackLanguage = "en";Три источника текста
Заголовок раздела «Три источника текста»Addon может использовать:
- literal fallback fields вроде
DisplayName/Description; - обычные locale files NeoModLoader;
- runtime localization через PoliticalWorldAPI.
Способы можно комбинировать.
Одна translation
Заголовок раздела «Одна translation»PoliticalWorldAPI.RegisterLocalization( AddonId, "ru", AddonId + ".technocracy.name", "Технократия");Source требует:
- зарегистрированный addon;
- непустой language ID;
- непустые key/value;
- key принадлежит addon.
Localization pack
Заголовок раздела «Localization pack»PoliticalWorldAPI.RegisterLocalizationPack( AddonId, "ru", new Dictionary<string, string> { [AddonId + ".technocracy.name"] = "Технократия", [AddonId + ".technocracy.description"] = "Власть технических специалистов." });Также есть:
PoliticalWorldAPI.RegisterEnglishLocalization(...)для default fallback language.
Ownership localization
Заголовок раздела «Ownership localization»API хранит owner каждого localization key.
Если key уже принадлежит другому addon, registration отклоняется, а diagnostics получает:
PWDIAG190Localization keys становятся частью общего collision-safe namespace.
Интеграция с NML LM
Заголовок раздела «Интеграция с NML LM»После записи в собственный registry Political World пытается добавить translation в NeoModLoader localization manager:
LM.Add(language, key, value)Если language сейчас активен, значение добавляется и в current locale.
Если регистрируется English, а в текущем locale ещё нет значения, English/default может быть добавлен как читаемый fallback.
Даже если LM integration бросит exception, собственный Political World registry продолжает хранить translation, поэтому ResolveLocalization(...) всё ещё может её разрешить.
Resolution order
Заголовок раздела «Resolution order»Проверенный ResolveLocalization(key, fallback) фактически проходит:
1. Political World translation для текущего language2. NeoModLoader LM translation3. Political World English/default translation4. literal fallback argument5. сам localization keyПоследний пункт намеренный: стабильный raw key полезнее пустого label.
Пример content definition
Заголовок раздела «Пример content definition»new PoliticalWorldAPI.IdeologyDefinition{ Id = AddonId + ".technocracy", NameKey = AddonId + ".technocracy.name", DisplayName = "Technocracy", DescriptionKey = AddonId + ".technocracy.description", Description = "Government led by technical specialists."}Даже без русского перевода content остаётся читаемым через English/default literal.
Seed fallback
Заголовок раздела «Seed fallback»При регистрации creator definitions Political World может автоматически положить DisplayName / Description в English fallback registry, если keys валидны и принадлежат addon.
Автор может сразу дать читаемый literal, а полноценный locale pack добавить позже.
Что именно проверяется у language ID
Заголовок раздела «Что именно проверяется у language ID»В текущем source language ID только trim’ится и проверяется длина от 2 до 24 символов.
Эта страница не утверждает, что Political World сверяет language ID с фиксированным ISO list.
UI всё равно надо тестировать
Заголовок раздела «UI всё равно надо тестировать»Readable fallback не гарантирует, что layout выдержит любой язык.
Нужны тесты:
- длинных translated labels;
- Cyrillic/Latin/CJK;
- wrapping/clipping;
- font support;
- dynamic-width UI.
Общий вывод
Заголовок раздела «Общий вывод»Localization fallback должен быть цепочкой разрешения, а не:
есть перевод / пустая строкаХороший framework превращает неполный перевод в читаемый fallback, а не в сломанный UI.