Локалізація за допомогою gettext

In addition to Імпорт перекладів in CSV format, Godot also supports loading translation files written in the GNU gettext format (text-based .po and compiled .mo since Godot 3.5).

Примітка

Для знайомства з gettext, перегляньте Короткий Посібник з Gettext. Він написаний для проектів на С, але велика частина порад підійде і для Godot (за винятком xgettext).

Переваги

  • gettext - це стандартний формат, який можна редагувати за допомогою будь-якого текстового редактора, або редактора графічного інтерфейсу, таких як Poedit.

  • gettext підтримується платформами перекладу, такими як Transifex та Weblate, що полегшує людям співпрацю по локалізації.

  • У порівнянні з CSV, gettext краще працює з системами керування версіями, такими як Git, оскільки кожна мова має свій власний файл повідомлень.

  • Багаторядковий текст зручніше редагувати у файлах gettext, ніж у файлах CSV.

Недоліки

  • gettext є складнішим форматом, ніж CSV, і може здаватися важким для людей, нових в локалізації програмного забезпечення.

  • People who maintain localization files will have to install gettext tools on their system. However, as Godot supports using text-based message files (.po), translators can test their work without having to install gettext tools.

Застереження

  • Оскільки Godot використовує власний аналізатор файлів PO за лаштунками (що є більш обмеженим, ніж реалізація тексту GNU gettext), деякі функції, такі як багатозначні числа, не підтримуються.

Встановлення інструментів gettext

Інструменти командного рядка gettext необхідні для виконання операцій технічного обслуговування, таких як оновлення файлів повідомлень. Тому настійно рекомендуємо їх встановити.

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

  • macOS: Встановіть gettext або за допомогою `Homebrew<https://brew.sh/>`_ за допомогою команди 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

To register a messages file as a translation in a project, open the Project Settings, then go to the Localization tab. In Translations, click Add… then choose the .po or .mo file in the file dialog. The locale will be inferred from the "Language: <code>\n" property in the messages file.

Примітка

Дивіться Інтернаціоналізація ігор, щоб дізнатися більше про імпорт і тестування перекладів у 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.

Примітка

Після запуску msgmerge, рядки, змінені на мові оригіналу, матимуть "нечіткий" коментар, доданий до них у файлі .po. Цей коментар означає, що переклад повинен бути оновлений відповідно до нового вихідного рядка, оскільки переклад, швидше за все, буде неточним, поки він не буде оновлений.

Рядки з "нечіткими" коментарями ("fuzzy") не будуть прочитані Godot, поки переклад не буде оновлений і "нечіткий" коментар не буде видалений.

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

Перевірити, чи є синтаксис файлу gettext дійсним, можна, виконавши команду нижче:

msgfmt fr.po --check

Якщо є синтаксичні помилки, або попередження, вони будуть відображатися в консолі. В іншому випадку msgfmt, нічого не буде виводити.

Using binary MO files (useful for large projects only)

For large projects with several thousands of strings to translate or more, it can be worth it to use binary (compiled) MO message files instead of text-based PO files. Binary MO files are smaller and faster to read than the equivalent PO files.

You can generate a MO file with the command below:

msgfmt fr.po --no-hash -o fr.mo

If the PO file is valid, this command will create a fr.mo file besides the PO file. This MO file can then be loaded in Godot as described below.

The original PO file should be kept in version control so you can update your translation in the future. In case you lose the original PO file and wish to decompile a MO file into a text-based PO file, you can do so with:

msgunfmt fr.mo > fr.po

The decompiled file will not include comments or fuzzy strings, as these are never compiled in the MO file in the first place.