Интернационализация игр

Введение

Sería excelente que el mundo hablara solo un idioma (Было бы замечательно, если бы весь мир говорил только на одном языке). К сожалению, для нас, разработчиков, это не так. Если инди- или нишевые игры обычно не нуждаются в локализации, то игры, ориентированные на массовый рынок, часто требуют это. Godot предлагает множество инструментов, чтобы упростить этот процесс, поэтому данное руководство больше похоже на сборник советов и приёмов.

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

Примечание

В качестве примера мы будем использовать официальную демонстрацию; вы можете скачать ее из библиотеки ассетов.

Настройка импортированного перевода

Переводы могут обновляться и повторно импортироваться при их изменении, но они все равно должны быть добавлены в проект. Это делается в разделе Проект → Настройки проекта → Локализация:

../../_images/localization_dialog.png

Приведенное выше диалоговое окно используется для добавления или удаления переводов в рамках всего проекта.

Локализация ресурсов

Также можно указать Godot использовать альтернативные версии ассетов (ресурсов) в зависимости от текущего языка. Для этого можно использовать вкладку Remaps:

../../_images/localization_remaps.png

Выберите ресурс для перемапирования, затем добавьте несколько альтернатив для каждой локали.

Преобразование ключей в текст

Некоторые элементы управления, такие как Button и Label, автоматически получают перевод, если их текст соответствует ключу перевода. Например, если текст метки имеет значение "MAIN_SCREEN_GREETING1" и этот ключ существует в текущем переводе, то текст будет автоматически переведен.

Такое поведение автоматического перевода может быть нежелательным в некоторых случаях. Например, при использовании Label для отображения имени игрока вы, скорее всего, не захотите, чтобы имя игрока переводилось, если оно соответствует ключу перевода. Чтобы отключить автоматический перевод на конкретном узле, используйте Object.set_message_translation и отправьте Object.notification для обновления перевода:

func _ready():
    # This assumes you have a node called "Label" as a child of the node
    # that has the script attached.
    var label = get_node("Label")
    label.set_message_translation(false)
    label.notification(NOTIFICATION_TRANSLATION_CHANGED)

Для более сложных узлов пользовательского интерфейса, таких как OptionButton, возможно, придется использовать следующее:

func _ready():
    var option_button = get_node("OptionButton")
    option_button.set_message_translation(false)
    option_button.notification(NOTIFICATION_TRANSLATION_CHANGED)
    option_button.get_popup().set_message_translation(false)
    option_button.get_popup().notification(NOTIFICATION_TRANSLATION_CHANGED)

В коде можно использовать функцию Object.tr(). Она будет просто искать текст в переводах и преобразовывать его, если он найден:

level.set_text(tr("LEVEL_5_NAME"))
status.set_text(tr("GAME_STATUS_" + str(status_index)))

Изменение размеров элементов управления

Один и тот же текст на разных языках может сильно отличаться по длине. Для этого обязательно прочитайте руководство по Size and anchors, так как динамическая настройка размеров элементов управления может помочь. Container может быть полезен, также как и опции обертывания текста, доступные в Label.

TranslationSеrver

В Godot есть сервер для низкоуровневого управления переводами, который называется TranslationServer. Переводы могут быть добавлены или удалены во время выполнения; текущий язык также может быть изменен во время выполнения.

Testing translations

Вам может потребоваться протестировать перевод проекта перед его выпуском. Godot предоставляет два способа сделать это.

Во-первых, в настройках проекта, в разделе Input Devices > Locale, есть свойство Test. Присвойте этому свойству код языкового стандарта тестируемого языка. Godot запустит проект с этим языковым стандартом при запуске проекта (либо из редактора, либо при экспорте).

../../_images/locale_test.png

Keep in mind that since this is a project setting, it will show up in version control when it is set to a non-empty value. Therefore, it should be set back to an empty value before committing changes to version control.

Translations can also be tested when running Godot from the command line. For example, to test a game in French, the following argument can be supplied:

godot --language fr

Перевод названия проекта

Имя проекта становится именем приложения при экспорте в различные операционные системы и платформы. Чтобы указать имя проекта на нескольких языках, создайте новый параметр application/name в Project Settings и добавьте к нему идентификатор локали. Например, для испанского языка это будет application/name_es:

../../_images/localized_name.png

Если вы не уверены в том, какой код языка использовать, обратитесь к списку кодов локалей.