使用gettext进行本地化

除了csv格式的 导入翻译 外,Godot还支持加载GNU gettext(.po)格式的翻译文件.

注解

有关GetText的介绍, 请查看 `A Quick GetText Tutorial<https://www.labri.fr/perso/fleury/posts/programming/a-quick-gettext-tutorial.html>`_ . 它是在考虑C项目的情况下编写的, 但是很多建议也适用于Godot(除了 xgettext ).

优势

缺点

  • Gettext是一种比CSV更复杂的格式, 对于刚接触软件本地化的人来说可能更难理解.

  • 维护本地化文件的人员必须在其系统上安装gettext工具. 但是, 由于Godot不使用编译的消息对象文件(.mo), 因此翻译人员无需安装gettext工具即可测试他们的工作.

注意事项

  • 由于Godot在幕后使用自己的PO文件解析器(这比参考GNU gettext实现有更多限制), 因此不支持诸如多元化之类的一些特性.

安装gettext工具

需要命令行gettext工具来执行维护操作, 如更新消息文件. 因此, 强烈建议您安装它们.

  • windows:本页 . 下载安装程序任何体系结构和二进制类型(共享或静态)都可以工作;如果有疑问, 请选择64位静态安装程序.

  • macOS: 使用 Homebrewbrew install gettext 命令来安装gettext,或使用 MacPortssudo port install gettext 命令来安装。

  • Linux: 在大多数发行版上, 请从发行版的包管理器安装 gettext 包.

手动创建(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中的消息由 msgidmsgstr 对组成.``msgid`` 为源字符串(一般为英文),``msgstr`` 为翻译后的字符串.

PO模板文件( .pot )中的 msgstr 值应 始终 为空. 而是在生成的 .po 文件中进行本地化.

使用pybabel创建PO模板 (POT)

Python工具pybabel支持Godot, 可用于从场景文件和脚本自动创建和更新POT文件.

安装 Babelbabel-godot 后, 例如使用pip:

pip 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"(控制节点常用)的属性和LineEdit的 placeholder_text 属性.

从PO模板创建消息文件

msginit 命令用于将采购订单模板转换为消息文件. 例如, 要创建法语本地化文件, 请在 locale 目录中使用以下命令:

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

上面的命令会在采购订单模板所在的目录下创建一个名为 fr.po 的文件.

或者, 您可以使用Poedit以图形方式完成此操作, 或者通过将POT文件上传到您选择的Web平台.

在Godot中加载信息文件

若要在工程中将消息文件注册为翻转, 请打开 Project Settings工程设置 , 然后进入 Localization本地化 选项. 在 Translations翻转 , 单击**Add…* 添加* 然后在文件对话框中选择 .po 文件 区域设置将从消息文件中的``"Language: <code>n"`` 属性中推算出来.

注解

关于在Godot中导入和测试翻译的更多信息, 请参见 使游戏国际化 .

消息更新文件遵循PO模板

After updating the PO template, you will have to update message files so that they contain new strings, while removing strings that are no longer present in the PO template. This can be done automatically using the msgmerge tool:

# 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" 不会输出任何东西.