Unity 6.3
0 онлайн 55 гостей 3 в системе
Вход
UI Toolkit для продвинутых разработчиков Глава 11 из 14 Оригинал, стр. 96

Локализация

Локализация

Локализация интерфейса помогает игре выйти на мировую аудиторию и делает приложение понятным и привычным на любом языке. Unity 6 упрощает процесс благодаря прямой интеграции пакета Localization с UI Toolkit. Она позволяет предлагать игрокам содержимое с учётом их региона, где бы они ни находились. Ключевую роль в локализации Unity играет класс Locale: он представляет конкретный язык и управляет региональными параметрами, например форматами валют и чисел. Рассмотрим простой пример настройки локализации в UI Toolkit. После такой настройки приложение сможет динамически менять содержимое в соответствии с выбранным Locale.

элементы управления |

Пример локализации на испанский язык в UI Toolkit Sample - Dragon Crashers

Как это работает Основные возможности пакета Localization: - Локализация строк: класс LocalizedString позволяет управлять строками, которые автоматически обновляются при смене Locale во время выполнения. Smart Strings поддерживают заполнители, формы множественного числа и другие языковые особенности.

- Локализация ресурсов: текстуры и другие ресурсы можно заменять в зависимости от Locale, создавая региональные варианты не только текста, но и другого содержимого. - Привязка данных: пакет Localization интегрирован с привязкой данных UI Toolkit во время выполнения и связывает элементы интерфейса с String Table и Asset Table. Изменение данных, Locale или состояния загрузки автоматически обновляет интерфейс. - Управление String Table и Asset Table: таблицы хранят пары «ключ - значение» для перевода текста или замены других ресурсов вариантами, соответствующими Locale. Централизованный интерфейс даёт общее представление обо всех локализованных строках и ресурсах проекта. - Переключение Locale: язык можно менять в реальном времени без перезапуска приложения. Выберите новый Locale во время выполнения, и интерфейс сразу обновится.

При адаптации к разной длине и оформлению текста используйте FlexBox-контейнеры и элементы UI Toolkit с автоматическим размером. Это помогает создавать интерфейсы, которые лучше приспосабливаются к разным языкам.

элементы управления |

Настройка локализации Чтобы начать использовать пакет Localization Unity с UI Toolkit, выполните следующие основные действия: подготовьте локализованное содержимое и свяжите его с элементами интерфейса в UI Builder.

Установите пакет Localization через Package Manager.

1. Настройте Localization Settings. Установите пакет Localization через Package Manager, затем откройте Project Settings > Localization и создайте ресурс Localization Settings. В нём настраиваются все локализованные ресурсы проекта.

Создание и настройка Localization Settings в Project Settings.

элементы управления |

2. Создайте Locale. С помощью Locale Generator определите поддерживаемые языки и регионы. Для каждого Locale будет создан ресурс с уникальным двухбуквенным кодом: например, en для английского, fr для французского и es для испанского. Укажите Locale по умолчанию, который будет использоваться при запуске приложения.

Добавление Locale.

3. Создайте String Table и Asset Table. Используйте String Table для хранения текстовых записей каждого Locale. Добавьте строки элементов интерфейса: надписей, кнопок и вариантов раскрывающихся списков.

Создание String Table и Asset Table.

элементы управления |

4. В окне Localization Tables (Window > Asset Management > Localization Tables) добавьте пары «ключ - значение» для каждого текстового элемента интерфейса. Ключ обозначает конкретный текстовый элемент, например метку или кнопку, а значение содержит перевод этого элемента для каждой локали. 5. Храните региональные ресурсы, например изображения или GameObject, в таблицах ресурсов (Asset Tables). В частности, туда можно добавить спрайты или текстуры значков для каждой локали. Свяжите каждый ключ с ресурсами, предназначенными для соответствующей локали и учитывающими региональные или культурные особенности.

Каждый локализуемый элемент представлен парой «ключ значение».

6. Создайте интерфейс в UXML. В UI Builder создайте UXML-файл с такими элементами, как Button, DropdownField и Label. В демонстрационной сцене этот UXML содержит несколько элементов, подготовленных к локализации. Для текстовых полей используйте запись из таблицы строк (String Table), а для нетекстовых, например текстур, - запись из таблицы ресурсов (Asset Table).

Демонстрационная сцена

Пример реализации локализации находится в сцене LocalizationDemo проекта QuizU. Чтобы открыть его во время выполнения, перейдите в главное меню и выберите Demos > Localization. Также можно отключить загрузчик (Quiz > Don’t Load Bootstrap Scene on Play) и загрузить сцену LocalizationDemo напрямую.

элементы управления |

Добавьте в UI Builder привязки данных к локализованным строкам и ресурсам.

7. Привяжите данные к элементам интерфейса в UI Builder. Здесь раскрываются возможности системы привязки данных UI Toolkit во время выполнения. Выберите в UI Builder элемент, который требуется локализовать. Откройте панель Inspector и в поле содержимого выберите Add Binding: например, для Label это поле text, а для изображения - backgroundImage. В качестве типа привязки выберите LocalizedString или другой локализованный ресурс и укажите соответствующую запись в таблице строк или ресурсов. По мере локализации новых элементов добавляйте записи в эти таблицы.

Для предварительного просмотра локализации используйте раскрывающийся список локалей в окне Game View.

элементы управления |

8. Для проверки выберите нужные языки в раскрывающемся списке локалей окна Game View и убедитесь, что элементы интерфейса правильно отображаются в каждой локали.

Базовая настройка завершена! Теперь в этом примере текстовые свойства кнопок и меток можно переключать на любой настроенный язык. Чтобы локализовать весь интерфейс, создайте в таблице строк отдельную запись для каждого фрагмента текста. Пакет Localization позволяет гибко организовать содержимое: крупный проект можно разделить на удобные разделы с помощью нескольких таблиц строк или сгруппировать записи по категориям. Для локализации текстур и других нетекстовых ресурсов используйте таблицы ресурсов. После добавления привязок локализации в UI Builder они сохраняются непосредственно в элементах UXML-файла. В результате получается такой блок кода, где каждое локализованное свойство связано с конкретной записью в таблице строк или ресурсов:

<Bindings> <UnityEngine.Localization.LocalizedString property="text" table="GUID:6aaa262cde38a4024bc3fc7f5ce6d50d" entry="Id(104135776002048)" /> </Bindings>

Этот фрагмент UXML создаёт привязку данных, которая связывает свойство text элемента интерфейса с записью в таблице строк или ресурсов.

При каждом обновлении таблиц локализации связанные элементы интерфейса автоматически получают актуальное локализованное содержимое. Примечание. UI Builder упрощает создание привязок данных, однако опытные пользователи могут редактировать UXML напрямую, чтобы точнее управлять локализованным содержимым.

Использование API локализации Раскрывающийся список локалей в окне Game View удобен для проверки разных языков в редакторе, но в сборке приложения его не будет. Чтобы пользователи могли менять язык в готовом приложении, создайте собственный интерфейс переключения локалей.

Выбор локали Если известен двухбуквенный идентификатор локали, активную локаль можно задать через LocalizationSettings. Затем свяжите это действие с кнопками: используйте манипулятор clicked каждой кнопки или метод RegisterCallback<ClickEvent>.

элементы управления |

Один из вариантов реализации показан в скрипте LocalizationDemo из примера проекта:

C#
void SelectLocale(string localeCode) {
Locale locale = LocalizationSettings.AvailableLocales.GetLocale(localeCode);
LocalizationSettings.SelectedLocale = locale;
}
C#
void RegisterCallbacks() {
    m_ButtonDanish.clicked += () => SelectLocale("da");
    m_ButtonEnglish.clicked += () => SelectLocale("en");
    m_ButtonSpanish.clicked += () => SelectLocale("es");
    m_ButtonFrench.clicked += () => SelectLocale("fr");
}

Теперь каждая кнопка может переключать интерфейс на указанную для неё локаль. При нажатии кнопки English, French, Spanish или Danish текст интерфейса меняется во время выполнения.

Кнопки позволяют переключать локали.

Использование SetBinding Настраивать привязки данных в UI Builder удобно и наглядно. Однако иногда привязку требуется создать скриптом во время выполнения - например, если элементы интерфейса создаются динамически или данные для привязки становятся доступны только во время игры.

элементы управления |

Чтобы настроить привязку данных в C#, вызовите метод SetBinding у визуального элемента. Ниже показано, как связать свойство text элемента Label с записью LocalizedString в StringTable:

C#
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.UIElements;
C#
public class LocalizationDemo : MonoBehaviour {
    // Set in Inspector

    [SerializeField] LocalizedString m_LocalizedText;
    Label m_LocalizedLabel;
    UIDocument m_UIDocument;
    void Start() {
        m_LocalizedLabel = m_UIDocument.rootVisualElement.Q<Label>("text__label");
        m_LocalizedLabel.SetBinding("text", m_LocalizedText);
    }

} В этой конфигурации полю m_LocalizedText через Inspector назначается запись из DemoStringTable. Код связывает свойство text элемента m_LocalizedLabel с указанным объектом LocalizedString, поэтому при смене локали текст обновляется автоматически.

Отслеживание смены локали Иногда при смене локали нужно не только обновить локализованные строки, но и выполнить дополнительные действия. Если требуется запускать определённую логику при каждом изменении локали, подпишитесь на событие SelectedLocaleChanged API LocalizationSettings.

элементы управления |

C#
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
public class LocalizationExample: MonoBehaviour {
    void OnEnable() {
        LocalizationSettings.SelectedLocaleChanged += OnLocaleChanged;
    }
    void OnDisable() {
        LocalizationSettings.SelectedLocaleChanged -= OnLocaleChanged;
    }
    void OnLocaleChanged(Locale newLocale) {
C#
// Perform actions when the Locale changes, like updating UI elements Debug.Log($"Locale changed to: {newLocale.Identifier.Code}");

}
}

В данном случае метод OnLocaleChanged вызывается при каждой смене локали, позволяя обновить другие элементы или выполнить пользовательскую логику. С помощью этого обработчика можно корректировать свойства и стили интерфейса, особенно если переведённый текст не помещается в текущую компоновку.

Работа с таблицами строк Основная часть локализации выполняется с помощью таблиц строк (String Tables), в которых хранятся все текстовые переводы для интерфейса и меток. Откройте окно Localization Tables (Window > Asset Management > Localization Tables) и создайте или выберите коллекцию таблиц строк (String Table Collection). Здесь можно добавлять записи, задавать для них уникальные ключи и вводить перевод для каждой локали.

Импорт и экспорт строковых данных

CSV-файлы Таблицу строк можно заполнить, импортировав данные из CSV-файла (значения, разделённые запятыми), поэтому дизайнеры смогут подготовить текст во внешнем редакторе. Чтобы редактировать существующие записи в обычном текстовом формате, экспортируйте таблицу строк в CSV.

элементы управления |

Импортируйте или экспортируйте CSV-файлы.

После редактирования импортируйте файл обратно в Unity: записи автоматически обновятся по своим ключам.

Синхронизация с Google Таблицами Чтобы подключить проект к Google Таблицам, потребуется ресурс Sheets Service Provider. Он управляет аутентификацией и позволяет создавать таблицы непосредственно в редакторе. Для его создания выберите Assets > Create > Localization > Google Sheets Service. .

Создайте сервис Google Таблиц и выполните авторизацию.

элементы управления |

Сервис Google Таблиц поддерживает два способа авторизации: OAuth и API Key. Используйте OAuth, если нужен доступ к закрытым таблицам для чтения и записи. Ключ API подходит, если требуется только читать общедоступные таблицы. Для полного доступа на чтение и запись необходимо получить разрешение Google. Подробнее см. в документации Google Таблиц в разделе Authorizing Requests. Чтобы связать коллекцию таблиц строк с Google Таблицей, добавьте расширение Google Sheet в список Extensions этой коллекции. Выберите ресурс String Table, затем в Inspector нажмите кнопку Add (+) рядом с разделом Extensions. В одну коллекцию таблиц строк можно добавить несколько расширений и при необходимости назначить каждой локали отдельную таблицу. Для синхронизации таблицы строк с Google Таблицей подключите её к ресурсу Sheets Service Provider. Инструкции по созданию и настройке ресурса см. в разделе Sheets Service Provider.

Добавьте сервис Google Таблиц в список расширений StringTable.

После настройки синхронизации дизайнеры и другие участники команды, не занимающиеся разработкой, смогут редактировать записи локализации непосредственно в Google Таблицах.

элементы управления |

Использование Smart Strings Smart Strings - мощная альтернатива String.Format для создания динамических строк. Они позволяют использовать шаблоны на основе данных с поддержкой форм множественного числа, условного форматирования, списков и других языковых правил. Благодаря этому настройка локализации становится проще.

Чтобы использовать Smart String, пометьте строку как интеллектуальную в окне Localization Tables. Откройте это окно, затем в меню ( ) выберите Smart Format и убедитесь, что рядом с записью появился значок {S}. Другой способ - включить параметр Smart в редакторе Localized String в Inspector.

Включить Smart Strings можно в окне StringTable или в Inspector.

Настройка Smart String в скрипте Чтобы управлять SmartString из скрипта:

- Настройте локализованную строку с заполнителями. Smart String состоит из обычного текста и заполнителей в фигурных скобках {}, как в String.Format, но обладает более гибкими возможностями. Создайте в таблице строк запись с заполнителем, например "Welcome, {0}!". Здесь {0} будет заменён данными во время выполнения.

элементы управления |

- Используйте LocalizedString и аргументы. Создайте в скрипте объект LocalizedString для этой записи и передайте данные времени выполнения через свойство Arguments. Например, следующий фрагмент из SmartStringDemo показывает, как заменить один заполнитель:

C#
// //
C#
Replaces placeholder with player name (e.g., "Welcome, {0}!" => "Welcome, Player One!")
C#
m_PlaceholderLabel = root.Q<Label>("welcome__label");
m_PlaceholderMessage.Arguments = new object[] { m_PlayerName };
m_PlaceholderLabel.SetBinding("text", m_PlaceholderMessage);
Этот код связывает LocalizedString со свойством text метки и во время выполнения подставляет имя игрока. Исходная запись "Welcome, {0}

!" может отобразиться на экране как "Welcome, Player One!".

Принцип работы заполнителей Заполнители Smart Strings не ограничиваются простой подстановкой {0}. Они могут иметь более сложную структуру и предназначены для расширенных сценариев. Заполнитель может состоять из нескольких частей, включая:

- Селектор: определяет, какие данные использовать. Например, {player.name} выбирает свойство name объекта player. - Имя форматтера: задаёт применяемый форматтер, например plural для выбора формы числа.

- Параметры форматтера: настраивают его поведение, например задают формы единственного и множественного числа. - Формат: определяет представление результата, например преобразование числа в слово нужной формы, форматирование даты или времени либо выбор фразы в зависимости от входных данных.

Заполнитель может состоять из нескольких частей.

элементы управления |

Селекторы отличаются гибкостью и позволяют динамически получать данные во время выполнения. Они могут обращаться к свойствам и полям объектов. Например, селектор {gameObject.name} возвращает свойство name объекта GameObject, а {slider.value} свойство value ползунка.

Форматтеры преобразуют полученные данные в итоговую строку. С их помощью можно форматировать даты, время и списки, выбирать формы множественного числа и даже применять условную логику. После получения данных форматтер преобразует их в итоговый результат. У каждого форматтера есть собственные параметры и правила форматирования. В примере проекта используются два форматтера:

- Форматтер Choose: {0:choose(1|2|3):morning|afternoon|evening|anytime} выбирает значение "morning", "afternoon" или "evening" в зависимости от входных данных.

- Форматтер Plural: {0:plural:one item|{} items} выбирает форму единственного или множественного числа. Измените значения в Inspector и перейдите в режим Play, чтобы увидеть полученный текст.

Smart Strings - альтернатива String.Format.

элементы управления |

Smart Strings предоставляют ряд встроенных форматтеров, которые расширяют возможности локализации и позволяют адаптировать текст к состоянию игры или контексту:

- Форматтер Choose: применяет условную логику на основе числового значения. - Форматтер Plural: автоматически выбирает форму числа в зависимости от количества.

- Форматтер Time: отображает дату и время. - Форматтер Conditional: реализует логику, подобную if/else. - Форматтер List: форматирует массивы и списки. - Форматтер Is Match: выбирает отображаемый текст по шаблону регулярного выражения. С помощью API также можно создавать собственные форматтеры. Дополнительные сведения см. в документации по Smart Strings.

Предварительная обработка строк В некоторых случаях прямая привязка элементов интерфейса к LocalizedString неудобна. Например, перед отображением локализованного текста может потребоваться дополнительное форматирование или преобразование. В таких ситуациях LocalizedString можно предварительно обработать до вывода в интерфейсе.

GetLocalizedString Для этого подходит метод GetLocalizedString: во время выполнения он преобразует LocalizedString в обычную строку. До передачи обработанной строки в интерфейс к ней можно применить собственное форматирование - например, добавить префикс или объединить несколько строк. Пример:

C#
[SerializeField] int m_PlayerLevel = 1;
LocalizedString m_LevelMessage = new LocalizedString("My_Table", "My_Entry");
// A property that retrieves the localized string and replaces the placeholder {0}

with the player’s level
[CreateProperty] public string LevelMessage => m_LevelMessage.GetLocalizedString(m_PlayerLevel);
В этом примере свойство LevelMessage заменяет заполнитель {0}

в LocalizedString текущим уровнем игрока. Атрибут [CreateProperty] позволяет использовать это свойство в системе привязки данных во время выполнения и напрямую связывать его с элементами интерфейса. В простых случаях подобные свойства, как показанное выше LevelMessage, могут инкапсулировать логику форматирования без дополнительных обработчиков событий.

элементы управления |

Использование события StringChanged Событие StringChanged объекта LocalizedString удобно использовать для такой предварительной обработки. Оно срабатывает при каждом обновлении LocalizedString, например при смене локали, и позволяет изменить текст перед отрисовкой. Для этого подпишите обработчик на StringChanged. Следующий фрагмент создаёт объект LocalizedString из записи My_Entry таблицы My_Table:

LocalizedString localizedString = new LocalizedString ("My_Table", "My_Entry"); localizedString.StringChanged += OnLocalizedStringChanged; Обратите внимание: обработчик OnLocalizedStringChanged автоматически получает результат как обычную строку. Затем перед отображением текста к нему можно применить собственную логику:

void OnLocalizedStringChanged(string value) {

C#
// Example: Add a prefix based on certain conditions string processedString = $"[Prefix] {value}";
// Update the UI element with the processed string m_TextLabel.text = processedString;

}

Динамические элементы управления интерфейса Разумеется, предварительная обработка LocalizedString не ограничивается простыми текстовыми полями. Она особенно полезна для сложных свойств и структур интерфейса, когда одной Smart String недостаточно для требуемой логики или форматирования. Например, свойство choices элемента DropdownField содержит список строк. Предварительная обработка позволяет динамически локализовать этот список вариантов в соответствии с активной локалью.

элементы управления |

В данном случае скрипт PreprocessDemo локализует варианты DropdownField и обновляет их каждый раз, когда игрок выбирает другой язык. Логика перестроения списка снова запускается в ответ на событие StringChanged.

Предварительная обработка LocalizedString с помощью события StringChanged.

Ниже приведён фрагмент скрипта PreprocessDemo, демонстрирующий этот механизм:

C#
[SerializeField] LocalizedString m_Choice1LocalizedString;
[SerializeField] LocalizedString m_Choice2LocalizedString;
[SerializeField] LocalizedString m_Choice3LocalizedString;
[SerializeField] LocalizedString m_Choice4LocalizedString;
public void Initialize(VisualElement root) {
    m_DropdownField = root.Q<DropdownField>("dropdown__field");
    m_Choice1LocalizedString.StringChanged += UpdateDropdownChoices;
    m_Choice2LocalizedString.StringChanged += UpdateDropdownChoices;
    // … register other choices // Initial population UpdateDropdownChoices(null);

}

элементы управления |

При срабатывании события StringChanged список вариантов раскрывающегося поля перестраивается, а текущее выбранное значение сохраняется: void UpdateDropdownChoices(string value) {

C#
// Save the current selection int selection = m_DropdownField.index;
// Remove previous choices m_DropdownField.choices.Clear();
// Add current localized values m_DropdownField.choices.Add(m_Choice1LocalizedString.GetLocalizedString());

m_DropdownField.choices.Add(m_Choice2LocalizedString.GetLocalizedString());
// … Add other choices // Restore selected index and value m_DropdownField.index = selection;

m_DropdownField.SetValueWithoutNotify(m_DropdownField.choices[selection]);
}

Метод SetValueWithoutNotify обновляет отображаемое значение раскрывающегося поля, не вызывая ChangeEvent. Это предотвращает рекурсивные обновления и сохраняет выбор пользователя при изменении списка вариантов. В примере проекта DropdownField динамически обновляет свойство choices на основе значений LocalizedString. При выборе новой локали язык обновляется и в вариантах раскрывающегося списка. Таким образом, предварительная обработка служит дополнительным инструментом для создания локализованных интерфейсов, учитывающих контекст. Smart Strings решают многие задачи локализации, включая заполнители и формы множественного числа, а предварительная обработка обеспечивает дополнительную гибкость и форматирование в случаях, с которыми Smart Strings самостоятельно не справляются.

элементы управления |

Локализация ресурсов Хотя основная часть локализации связана со строками, помимо текста иногда требуется локализовать и ресурсы. Например, в демонстрационном проекте предусмотрены значки, соответствующие настроенным локалям.

Каждую локаль обозначают флаг и значок «Hello, world».

Настройка локализации ресурсов Локализация ресурсов устроена почти так же, как локализация строк. Для локализованного текста используются таблицы строк, а для локализованных ресурсов таблицы ресурсов (Asset Tables). Рабочий процесс у них схож: в таблицы добавляют записи, на которые затем ссылаются из скриптов или UXML-файлов. Локализованные ресурсы можно привязать к элементам интерфейса в UI Builder или в скрипте C#. Например, свойство style.backgroundImage визуального элемента можно связать с локализованным спрайтом или текстурой.

элементы управления |

В примере проекта: - Привязка данных одного элемента задана в UXML с помощью UI Builder. - Привязка другого элемента настроена в скрипте C#. Теперь при выборе локали во время выполнения значки обновляются вместе с текстовыми метками, наглядно показывая активную локаль.

Объекты LocalizedTexture обновляются при каждой смене локали.

элементы управления |

Таблицы ресурсов и таблицы строк Работа с таблицами ресурсов во многом повторяет работу с таблицами строк. Оба типа позволяют задавать записи для каждой локали и получать их во время выполнения. Однако между ними есть различия:

- Обработка событий: таблицы ресурсов уведомляют об изменении локализованных ресурсов событием AssetChanged, тогда как для строк используется StringChanged. - Методы привязки: и строки, и ресурсы можно привязывать методом SetBinding, но целевое свойство зависит от типа данных - например, text для строк и style.backgroundImage для текстур.

В следующем фрагменте демонстрационный код получает LocalizedTexture из таблицы ресурсов по имени, а затем привязывает её к свойству style.backgroundImage:

C#
m_LocalizedTexture = new LocalizedTexture() {
    TableReference = "DemoAssetTable", TableEntryReference = "HelloWorld_Icon"
}
;
m_IconElement = root.Q<VisualElement>("icon__hello-world");
m_IconElement.SetBinding("style.backgroundImage", m_LocalizedTexture);

Распространённые локализуемые ресурсы в UI Toolkit Локализуемые ресурсы бывают разных типов. При работе с UI Toolkit чаще всего встречаются следующие: - Локализованные текстуры: идеально подходят для значков, фонов и других декоративных изображений. Их можно напрямую привязать к свойствам визуального элемента, например style.backgroundImage.

- Локализованные спрайты: встречаются реже, но полезны для пользовательских компонентов и графики на основе спрайтов. - Локализованные шрифты: позволяют переключать шрифты, чтобы поддерживать письменность или особенности типографики разных языков. - Локализованные объекты: подходят для ссылок на сложные ресурсы, например префабы или ресурсы на основе данных, которые должны меняться в зависимости от локали. Используя эти ресурсы вместе с таблицами ресурсов, можно динамически адаптировать к активной локали не только текст интерфейса, но и его визуальное оформление.

элементы управления |

Локализация в примере Dragon Crashers Демонстрационный проект UI Toolkit Sample - Dragon Crashers показывает несколько приёмов локализации в действии. На экране Settings можно выбрать один из поддерживаемых языков в раскрывающемся меню. После выбора нового языка система LocalizationSettings обнаруживает изменение и обновляет интерфейс в реальном времени.

Выберите локаль в раскрывающемся меню Language.

Самостоятельно изучая проект, обратите внимание на следующие аспекты:

- Выбор локали в SettingsScreen: экран настроек позволяет выбрать локаль из раскрывающегося меню. Интерфейс отслеживает изменения LocalizationSettings, обнаруживает выбор новой локали и обновляется в реальном времени. - Приёмы привязки данных: в интерфейсе сочетаются разные способы локализации. Статические свойства привязываются непосредственно в UI Builder и сохраняются в UXML. Для динамически заполняемых полей привязку данных выполняют скрипты во время выполнения. Метод SetBinding связывает текстовые свойства с объектами LocalizedString, поэтому интерфейс соответствует выбранной локали.

элементы управления |

- Предварительно отформатированные объекты LocalizedString в ScriptableObject: некоторые ресурсы ScriptableObject содержат заранее отформатированные свойства LocalizedString. Например, на экране Settings раскрывающиеся поля Theme и Language динамически перестраивают списки из локализованных значений, переводя доступные варианты. Другие элементы, такие как RadioButtonGroup и пользовательский SlideToggle, также предварительно обрабатывают LocalizedString с помощью события StringChanged.

Независимо от способа локализации - привязки данных в UXML или настройки из скрипта C# - интерфейс реагирует на смену локали в реальном времени. Используйте решения из демонстрационного проекта как основу для локализованных интерфейсов в собственных проектах Unity. Сочетание привязки данных и UI Toolkit позволяет создать гибкий многоязычный интерфейс для игроков со всего мира.

Дополнительные примеры локализации представлены в проекте UI Toolkit Sample - Dragon Crashers.