使用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:

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"(控制节点常用)的属性和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模板

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