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

Введение

Sería excelente que el mundo hablara solo un idioma (It would be great if the world spoke only one language). Unfortunately for us developers, that is not the case. While indie or niche games usually do not need localization, games targeting a more massive market often require localization. Godot offers many tools to make this process more straightforward, so this tutorial is more like a collection of tips and tricks.

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

Примечание

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

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

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

../../_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.

TranslationServer

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

Командная строка

Язык можно проверить при запуске Godot из командной строки. Например, чтобы проверить игру на французском языке, можно указать следующий аргумент:

godot --language fr

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

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

../../_images/localized_name.png

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