Локалізація за допомогою gettext
Окрім Імпорт перекладів у форматі CSV, Godot також підтримує завантаження файлів перекладу, написаних у форматі GNU gettext (на основі тексту .po і скомпільований .mo, починаючи з Godot 4.0).
Примітка
Для знайомства з gettext, перегляньте Короткий Посібник з Gettext. Він написаний для проектів на С, але велика частина порад підійде і для Godot (за винятком xgettext).
Переваги
gettext - це стандартний формат, який можна редагувати за допомогою будь-якого текстового редактора, або редактора графічного інтерфейсу, таких як Poedit.
gettext підтримується платформами перекладу, такими як Transifex та Weblate, що полегшує людям співпрацю по локалізації.
У порівнянні з CSV, gettext краще працює з системами керування версіями, такими як Git, оскільки кожна мова має свій власний файл повідомлень.
Багаторядковий текст зручніше редагувати у файлах gettext, ніж у файлах CSV.
Недоліки
gettext є складнішим форматом, ніж CSV, і може здаватися важким для людей, нових в локалізації програмного забезпечення.
Люди, які підтримують файли локалізації, повинні будуть встановити в свою систему інструменти gettext. Однак, оскільки Godot підтримує використання текстових файлів повідомлень (
.po), перекладачі можуть перевіряти свою роботу без необхідності встановлювати інструменти gettext.
Встановлення інструментів gettext
Інструменти командного рядка gettext необхідні для виконання операцій технічного обслуговування, таких як оновлення файлів повідомлень. Тому настійно рекомендуємо їх встановити.
Windows: Завантажте інсталятор з цієї сторінки. Працює будь-яка архітектура і бінарний тип (спільний, чи статичний); якщо ви сумніваєтеся, виберіть 64-розрядний статичний інсталятор.
macOS: Встановіть gettext або за допомогою Homebrew за допомогою команди
brew install gettext, або за допомогою MacPorts з командоюsudo port install gettext.Linux: У більшості дистрибутивів встановіть
gettextпакет із диспетчера пакунків дистрибутива.
Створення шаблону замовлення на замовлення
Автоматична генерація за допомогою редактора
Починаючи з Godot 4.0, редактор може автоматично генерувати шаблон PO з указаної сцени та файлів GDScript. Це покоління POT також підтримує контексти перекладу та множину, якщо використовується в сценарії, з додатковим другим аргументом tr() і tr_n() методом.
Відкрийте вкладку Локалізація > Створення POT у налаштуваннях проекту, а потім скористайтеся кнопкою Додати…, щоб указати шлях до сцен і сценаріїв вашого проекту, які містять рядки, які можна локалізувати:
Створення шаблону замовлення на замовлення на вкладці Локалізація > Створення POT у налаштуваннях проекту
Після додавання принаймні однієї сцени або сценарію натисніть Створити POT у верхньому правому куті, а потім укажіть шлях до вихідного файлу. Цей файл можна розмістити будь-де в каталозі проекту, але рекомендується зберігати його в підкаталозі, наприклад locale, оскільки кожна локаль буде визначена в окремому файлі.
Дивіться below, щоб дізнатися, як додати коментарі для перекладачів або виключити деякі рядки з додавання до шаблону PO для файлів GDScript.
Потім ви можете перейти до створення файлу повідомлень із шаблону PO.
Примітка
Не забувайте повторно генерувати шаблон PO після внесення будь-яких змін у локалізовані рядки або після додавання нових сцен чи сценаріїв. Інакше щойно додані рядки не можна буде локалізувати, а перекладачі не зможуть оновити переклади для застарілих рядків.
Ручне створення
Якщо підхід автоматичного створення не підходить для ваших потреб, ви можете створити шаблон замовлення на замовлення вручну в текстовому редакторі. Цей файл можна розмістити будь-де в каталозі проекту, але рекомендується зберігати його в підкаталозі, оскільки кожна локаль буде визначена в окремому файлі.
Створіть каталог під назвою locale у каталозі проекту. У цьому каталозі збережіть файл із назвою messages.pot із таким вмістом:
# Don't remove the two lines below, they're required for gettext to work correctly.
msgid ""
msgstr ""
# Example of a regular string.
msgid "Hello world!"
msgstr ""
# Example of a string with pluralization.
msgid "There is %d apple."
msgid_plural "There are %d apples."
msgstr[0] ""
msgstr[1] ""
# Example of a string with a translation context.
msgctxt "Actions"
msgid "Close"
msgstr ""
Повідомлення в gettext складаються з пар msgid і msgstr. msgid є вихідним рядком (зазвичай англійською мовою), msgstr буде перекладеним рядком.
Попередження
Значення msgstr у файлах шаблонів PO (.pot) завжди має бути порожнім. Локалізацію буде зроблено у згенерованих файлах .po.
Створення файлу повідомлень із шаблону PO
Команда msginit використовується для перетворення шаблону PO у файл повідомлень. Наприклад, щоб створити файл локалізації французької мови, скористайтеся такою командою, перебуваючи в каталозі locale:
msginit --no-translator --input=messages.pot --locale=fr
Команда вище створить файл fr.po, в тому ж каталозі, що і шаблон PO.
Крім того, ви можете зробити це графічно за допомогою Poedit, або завантаживши файл POT на свою веб-платформу за вибором.
Завантаження файлу повідомлень у Godot
Щоб зареєструвати файл повідомлень як переклад у проекті, відкрийте Параметри проекту, а потім перейдіть на вкладку Локалізація. У розділі Переклади натисніть кнопку Додати... і виберіть файл .po чи .mo в діалоговому вікні. Локалізація буде визначена на основі властивості "Language: <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.
Примітка
Після запуску msgmerge, рядки, змінені на мові оригіналу, матимуть "нечіткий" коментар, доданий до них у файлі .po. Цей коментар означає, що переклад повинен бути оновлений відповідно до нового вихідного рядка, оскільки переклад, швидше за все, буде неточним, поки він не буде оновлений.
Рядки з "нечіткими" коментарями ("fuzzy") не будуть прочитані Godot, поки переклад не буде оновлений і "нечіткий" коментар не буде видалений.
Перевірка дійсності файлу PO, або шаблону
Перевірити, чи є синтаксис файлу gettext дійсним, можна, виконавши команду нижче:
msgfmt fr.po --check
Якщо є синтаксичні помилки, або попередження, вони будуть відображатися в консолі. В іншому випадку msgfmt, нічого не буде виводити.
Використання бінарних файлів MO (корисно лише для великих проектів)
У великих проектах, де потрібно перекласти кілька тисяч рядків або більше, замість текстових PO-файлів варто використовувати бінарні (скомпільовані) файли MO-повідомлень. Бінарні MO-файли мають менший розмір і швидше читаються, ніж еквівалентні PO-файли.
Ви можете створити файл MO за допомогою команди нижче:
msgfmt fr.po --no-hash -o fr.mo
Якщо файл PO дійсний, ця команда створить файл fr.mo крім файлу PO. Потім цей MO-файл можна завантажити в Godot, як описано вище.
Оригінальний файл PO слід зберігати в системі керування версіями, щоб ви могли оновити свій переклад у майбутньому. Якщо ви втратите оригінальний файл PO і хочете декомпілювати файл MO у текстовий файл PO, ви можете зробити це за допомогою:
msgunfmt fr.mo > fr.po
Декомпільований файл не міститиме коментарів або нечітких рядків, оскільки вони ніколи не компілюються у файлі MO.
Вилучення локалізованих рядків із файлів GDScript
Вбудований плагін редактора розпізнає різноманітні шаблони у вихідному коді, щоб витягти локалізовані рядки з файлів GDScript, включаючи, але не обмежуючись цим:
Виклики
tr(),tr_n(),atr()іatr_n();призначення властивостей
text,placeholder_textіtooltip_text;add_tab(),add_item(),set_tab_title()та інші виклики;FileDialogфільтрує як"*.png; PNG зображення".
Примітка
Аргумент або правий операнд має бути постійним рядком, інакше плагін не зможе обчислити вираз і проігнорує його.
Якщо плагін витягує непотрібні рядки, ви можете проігнорувати їх за допомогою коментаря NO_TRANSLATE. Ви також можете надати додаткову інформацію для перекладачів за допомогою коментаря TRANSLATORS:. Ці коментарі повинні бути розміщені або в одному рядку з розпізнаним шаблоном, або перед ним.
$CharacterName.text = "???" # NO_TRANSLATE
# NO_TRANSLATE: Language name.
$TabContainer.set_tab_title(0, "Python")
item.text = "Tool" # TRANSLATORS: Up to 10 characters.
# TRANSLATORS: This is a reference to Lewis Carroll's poem "Jabberwocky",
# make sure to keep this as it is important to the plot.
say(tr("He took his vorpal sword in hand. The end?"))