GNU gettext, 它是一套国际化(i18n)和本地化(i10n)工具,在类Unix系统中被大量采用, ubuntu , wordpress 都采用 gettext 实现多语言支持。 国际化标准 ISO 639-1
使用GNU text 的好处是, 它可以自动扫描提取源文件的待翻译内容, 源文件新增的待翻译片段也可以自动扫描提取。
参考:
https://zh.wikipedia.org/wiki/Gettext
https://www.cnblogs.com/linux-wang/p/9001368.html
https://www.atjiang.com/gnu-gettext-intro/
gettext 是一套工具集的名称。这套工具集包含 xgettext/msginit/msgfmt 等一套建立模版(POT)、创建PO文件和编译MO文件的工具。
工作流程是这样的:
- 在源码中使用约定的语法来书写字符串,如
gettext("my text")
。也可用_("my text")
; - 使用 xgettext 从源码中扫描出需要翻译的文本,建立 POT 文件;
- 使用 msginit 命令根据 POT 文件建立 PO 文件。或者直接在上一步也可以直接建立 PO 文件;
- 进行人工翻译,翻译的结果保存在 PO 文件中;
- 使用 msgfmt 命令将 PO 文件编译成面向机器的 MO 文件(二进制文件);
- 在程序中实现调用命令,本项目中是
_()
函数,这个函数将读取并解析 MO 文件,根据调用的原始语言文本返回翻译之后的文本。
PO 是 Portable Object (可移植对象)的缩写形式;
MO 是 Machine Object (机器对象) 的缩写形式。
PO 文件是面向翻译人员的、提取于源代码的一种资源文件。当软件升级的时候,通过使用 gettext 软件包处理 PO 文件,可以在一定程度上使翻译成果得以继承,减轻翻译人员的负担。
MO 文件是面向计算机的、由 PO 文件通过 gettext 软件包编译而成的二进制文件。程序通过读取 MO 文件使自身的界面转换成用户使用的语言。
目前, C、Python、Java、Perl、PHP等多数编程语言对其提供了支持。 为了减少输入量和代码量,此功能通常以标记别名“”的形式使用,所以例如以下C语言代码:
1 | printf(_("My name is %s.\n"), my_name); |
xgettext程序从源代码扫描提取待翻译片段生成.po文件,作为源代码中需翻译内容。一个典型的.po文件条目应当是这样的:
1 | #: src/name.c:36 |
这种纯文本文件方便翻译人员进行翻译。
Poedit 简介
gettext 提供的工具集都是基于命令行的,它没有提供用于翻译工作者的对照翻译工具。
Poedit 是一个基于gettext工具集的图形化工具, 它从源码中提取文本生成 PO 文件,并提供了一个GUI界面用于对照翻译。
它还可以直接生成最终的 MO 文件, 在GUI背后依然是使用 gettext 来处理的,但这些具体的细节被隐藏了。
安装工具:
1 | apt-get install poedit |
配置:
开启 Poedit,点击 编辑 - 首选项.
在”常规”选项卡, 填入自己的个人信息, 勾选“在保存时自动编译MO文件”, “检查拼写”
切换到 “提取器” 选项卡,这里提供了几种源码解析器,但默认没有Lua。我们加入Lua源码解析。
1
2
3
4
5
6
7
8
9
10
11
12
13点击 New 新建一个源码解析器. 设置如下:
语言:Lua
扩展名列表: *.lua
提取翻译命令: xgettext -C --force-po -o %o %C %K %F
在关键字列表中的项: -k%k
在输入文件列表中的项: %f
源代码字符集: --from-code=%c打开项目中的 xxx.po 翻译文件, 路径位于项目根目录 / i18n / locale / 下.
在增加的了翻译文本后, 点击工具的“更新”按钮, 即可自动提取翻译文本.
编写好翻译内容后, 点击保存, 即可自动更新mo文件
备注:
在增加插件时, 需将新插件路径加入配置文件, 方法: “编目” - “属性” , 点击“源路径”标签, 将新插件目录加入。