Локализация

Средний Обновлено 9 июл. 2026 г.

Содержание

Локализация встроена в пайплайн, а не прикручена сбоку: каждый язык получает собственный текст, озвучку и анимацию липсинка. Всё это производит одна и та же сборка.

Как это устроено

  • Квесты пишутся на одном исходном языке (source_culture квеста, например en).
  • Переводы хранятся в CSV-сайдкарах Loc/<Quest>.<culture>.csv, ключом служат стабильные id реплик. Непереведённые ключи откатываются к исходному тексту; исходный файл никогда не перезаписывается.
  • Культуры, которые собирает проект, перечислены в Project Settings → Plugins → Questwright Studio → Build Cultures (вкладка Localization управляет этим списком за вас).

Вкладка Localization

Добавляйте языки, смотрите покрытие перевода по каждому квесту и переводите недостающие реплики машинно со своим ключом Claude или OpenAI. Машинные результаты помечаются как «машинный, требует вычитки», так что ручную проверку легко отслеживать. Ключи хранятся у каждого пользователя локально и никогда не попадают в репозиторий, точно так же, как ключи для озвучки.

Вкладка Localization с покрытием по языкам и действием машинного перевода

Сборка языков

На вкладке Build есть чекбокс для каждой культуры. Каждый собранный язык получает:

  • собственные String Tables (диалоги, варианты выбора, текст журнала);
  • собственную озвучку с голосовым составом для этого языка с вкладки Voice;
  • собственное запекание липсинка из аудио этого языка.

Ассеты каждой культуры лежат в /L10N/<culture>/, а подменяет их штатная система локализации движка.

Единственный нюанс: PIE и упакованная сборка

Unreal подменяет ассеты по культуре (аудио, лицевую анимацию) только в упакованных/приготовленных сборках; в PIE вы всегда слышите голос исходной культуры. Текстовая локализация работает везде, включая PIE. Это поведение движка, а не настройка, которую можно поправить; проверяйте локализованную озвучку в упакованной сборке.

Динамический текст и локализация

Плейсхолдеры {PlayerName} и собственные {Token} переживают перевод: подстановка происходит в момент отображения через FText::Format, поэтому переводчики могут свободно переставлять токены внутри предложения.