Локализация с помощью gettext

В дополнение к Импорт переводов в формате CSV, Godot также поддерживает загрузку файлов переводов, написанных в формате GNU gettext (.po).

Примечание

Для ознакомления с gettext посмотрите A Quick Gettext Tutorial. Он написан для проектов на C, но большая часть советов применима и к Godot (за исключением xgettext).

Преимущества

  • gettext - это стандартный формат, который можно редактировать с помощью любого текстового редактора или редакторов с графическим интерфейсом, таких как Poedit.

  • gettext поддерживается такими платформами перевода, как Transifex и Weblate, что облегчает совместную работу людей над локализацией.

  • По сравнению с CSV, gettext лучше работает с системами контроля версий, такими как Git, поскольку каждая локаль имеет свой собственный файл сообщений.

  • Многострочные строки удобнее редактировать в gettext-файлах по сравнению с CSV-файлами.

Недостатки

  • gettext - это более сложный формат, чем CSV, и его может быть труднее понять тем, кто только начинает заниматься локализацией программного обеспечения.

  • Людям, поддерживающим файлы локализации, придется установить в своей системе инструменты gettext. Однако, поскольку Godot не использует скомпилированные объектные файлы сообщений (.mo), переводчики могут тестировать свою работу без установки инструментов gettext.

Оговорки

  • Поскольку Godot использует свой собственный парсер PO-файлов за кулисами (который более ограничен, чем эталонная реализация GNU gettext), некоторые функции, такие как множественное число, не поддерживаются.

Установка инструментов gettext

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

  • Windows: Загрузите программу установки с этой страницы <https://mlocati.github.io/articles/gettext-iconv-windows.html>`_. Работает любая архитектура и бинарный тип (разделяемый или статический); если есть сомнения, выбирайте 64-битный статический инсталлятор.

  • macOS: Установите gettext либо с помощью Homebrew с командой brew install gettext, либо с помощью MacPorts <https://www.macports.org/>`_ с командой ``sudo port install gettext.

  • Linux: В большинстве дистрибутивов установите пакет ``gettext'' из менеджера пакетов вашего дистрибутива.

Создание шаблона PO (POT) вручную

В настоящее время Godot не поддерживает извлечение исходных строк с помощью xgettext, поэтому файл .pot должен быть создан вручную. Этот файл может быть размещен в любом месте каталога проекта, но рекомендуется хранить его в подкаталоге, так как каждая локаль будет определена в своем собственном файле.

Создайте каталог с именем locale в каталоге проекта. В этом каталоге сохраните файл с именем messages.pot со следующим содержимым:

# Don't remove the two lines below, they're required for gettext to work correctly.
msgid ""
msgstr ""

msgid "Hello world!"
msgstr ""

Сообщения в gettext состоят из пар msgid и msgstr. msgid - это исходная строка (обычно на английском языке), msgstr - это переведенная строка.

Значение msgstr в файлах шаблонов PO (.pot) должно всегда быть пустым. Локализация будет выполнена в сгенерированных файлах .po вместо этого.

Создание шаблона PO (POT) с помощью pybabel

Python инструмент pybabel имеет поддержку Godot и может быть использован для автоматического создания и обновления POT файла из ваших файлов сцен и сценариев.

После установки babel и babel-godot, например, с помощью pip:

pip3 install babel babel-godot

Напишите файл отображения (например, babelrc), который будет указывать, какие файлы должен обрабатывать pybabel (обратите внимание, что мы обрабатываем GDScript как Python, чего обычно достаточно):

[python: **.gd]
encoding = utf-8

[godot_scene: **.tscn]
encoding = utf-8

Затем вы можете запустить pybabel следующим образом:

pybabel extract -F babelrc -k text -k LineEdit/placeholder_text -k tr -o godot-l10n.pot .

Используйте опцию -k, чтобы указать, что должно быть извлечено. В этом случае будут переведены аргументы к tr(), а также свойства с именем "text" (обычно используется узлами Control) и свойство LineEdit "placeholder_text".

Создание файла сообщений из шаблона PO

Команда msginit используется для превращения шаблона PO в файл сообщений. Например, чтобы создать файл французской локализации, используйте следующую команду, находясь в каталоге locale:

msginit --no-translator --input=messages.pot --locale=fr

Приведенная выше команда создаст файл с именем fr.po в том же каталоге, что и шаблон PO.

Кроме того, это можно сделать графически с помощью Poedit или загрузив файл POT на выбранную вами веб-платформу.

Загрузка файла сообщений в Godot

Чтобы зарегистрировать файл сообщений в качестве перевода в проекте, откройте Настройки проекта, затем перейдите на вкладку Локализация. В разделе Переводы нажмите Добавить... и выберите файл .po в диалоге файлов. Локаль будет определена из Язык: <code>\n" в файле сообщений.

Примечание

Смотрите Интернационализация игр для получения дополнительной информации об импорте и тестировании переводов в Godot.

Обновление файлов сообщений в соответствии с шаблоном PO

После обновления шаблона PO вам нужно будет обновить файлы сообщений, чтобы они содержали новые строки, удалив при этом строки, которые больше не присутствуют в шаблоне PO. Это можно сделать автоматически с помощью инструмента msgmerge:

# The order matters: specify the message file *then* the PO template!
msgmerge --update --backup=none fr.po messages.pot

Если вы хотите сохранить резервную копию исходного файла сообщения (который в данном примере будет сохранен как fr.po~), удалите аргумент --backup=none.

Проверка достоверности файла или шаблона PO

Проверить правильность синтаксиса файла gettext можно, выполнив приведенную ниже команду:

msgfmt fr.po --check

Если есть синтаксические ошибки или предупреждения, они будут выведены в консоль. В противном случае ``msgfmt'' ничего не выведет.