reckfellENGINE

Локализация плагина: отдельный домен RU/EN

Язык редактора, наследование домена и очистка переводов.

На этой странице

Переводы дополнения должны иметь отдельный домен. Это отделяет одинаковые ключи от строк игры и других плагинов. Локаль редактора и локаль запущенного проекта могут различаться — не меняйте глобальную локаль проекта ради панели инструмента.

Полный пример RU/EN

Создайте asset://addons/docs_localized/, сохраните LocalizedDockPlugin.cs и plugin.cfg, соберите проект и включите дополнение:

C#
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 и живое переключение языка не проверялись.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.