Локализация плагина: отдельный домен RU/EN
Язык редактора, наследование домена и очистка переводов.
Переводы дополнения должны иметь отдельный домен. Это отделяет одинаковые ключи от строк игры и других плагинов. Локаль редактора и локаль запущенного проекта могут различаться — не меняйте глобальную локаль проекта ради панели инструмента.
Полный пример RU/EN
Создайте asset://addons/docs_localized/, сохраните LocalizedDockPlugin.cs и plugin.cfg, соберите проект и включите дополнение:
using Reckfell;
[Tool]
public partial class LocalizedDockPlugin : EditorPlugin
{
public const string DomainName = "addons/docs_localized";
private TranslationDomain? _domain;
private Translation? _en, _ru;
private EditorDock? _dock;
public override void _EnterTree()
{
_domain = TranslationServer.GetOrAddDomain(DomainName);
_domain.SetLocaleOverride(EditorInterface.Singleton.GetEditorLanguage());
_en = new Translation { Locale = "en" };
_en.AddMessage("Localized plugin", "Localized plugin");
_en.AddMessage("Inspect settings", "Inspect settings");
_ru = new Translation { Locale = "ru" };
_ru.AddMessage("Localized plugin", "Локализованный плагин");
_ru.AddMessage("Inspect settings", "Проверить настройки");
_domain.AddTranslation(_en); _domain.AddTranslation(_ru);
_dock = new EditorDock { Name = "DocsLocalizedDock", DefaultSlot = EditorDock.DockSlot.LeftUl };
_dock.SetTranslationDomain(DomainName);
_dock.Title = _dock.Tr("Localized plugin");
_dock.AddChild(new Button { Name = "Action", Text = "Inspect settings" });
AddDock(_dock);
}
public override void _ExitTree()
{
if (_dock is not null) { RemoveDock(_dock); _dock.QueueFree(); _dock = null; }
TranslationServer.RemoveDomain(DomainName);
_domain?.Dispose(); _domain = null;
_en?.Dispose(); _ru?.Dispose(); _en = null; _ru = null;
}
}[plugin]
name="Docs localized dock"
description="Private translation domain with RU and EN messages"
author="Reckfell documentation"
version="1.0.0"
script="LocalizedDockPlugin.cs"В примере два небольших словаря создаются кодом, поэтому нет скрытой зависимости от файлов перевода. Для большого дополнения загрузите свои Translation-ресурсы и добавьте их в тот же домен; импорт PO/CSV не проверялся этим набором.
Что обеспечивает изоляцию
GetOrAddDomain("addons/docs_localized") создаёт или возвращает домен с уникальным именем. Код владеет этим доменом; не используйте пустое имя основного домена и не удаляйте общий домен другого дополнения.
SetLocaleOverride(GetEditorLanguage()) выбирает язык интерфейса редактора при включении, а не язык игры. SetTranslationDomain() назначается панели до добавления детей; дочерняя кнопка наследует домен. В проверке её GetTranslationDomain() совпал с именем дополнения, а глобальная локаль проекта не изменилась.
Button.Text хранит исходный ключ. Не проверяйте локализацию только сравнением этого свойства с русским текстом: перевод используется при отображении. Прямой Tr() в проверке вернул Inspect settings для en и Проверить настройки для ru. Для отсутствующего ключа вернулся исходный текст.
Заголовок EditorDock.Title в примере заполняется уже переведённой строкой. Он вычислен при создании панели. Пример не обещает живого переключения всех строк при изменении языка редактора: после такого изменения отключите/включите дополнение или реализуйте явное обновление своего UI.
Поля Inspector и другие объекты
Наследование домена работает по иерархии Entity. EditorInspectorPlugin является отдельным ref-counted объектом, а созданный им EditorProperty оказывается в дереве Inspector. Не предполагайте, что они автоматически наследуют домен EditorPlugin. При адаптации назначайте нужный домен этим объектам явно и отдельно проверяйте подписи; пример Inspector.
Отключение
Сначала снимите регистрацию и удалите свою панель, затем удалите принадлежащий плагину домен и освободите словари. Если домен разделяют несколько модулей, нужен общий владелец с подсчётом использования, а не безусловный RemoveDomain каждым участником.
Проверены наследование домена кнопкой, editor-language override, RU/EN-поиск, fallback исходного ключа, неизменность локали проекта и очистка при повторном включении. Видимые пиксели перевода, PO/CSV-импорт, множественные формы, формат чисел, перевод поля Inspector и живое переключение языка не проверялись.