0%

国际化(i18n)和本地化(i10n)工具GNU gettext

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文件的工具。

工作流程是这样的:

  1. 在源码中使用约定的语法来书写字符串,如 gettext("my text")。也可用 _("my text")
  2. 使用 xgettext 从源码中扫描出需要翻译的文本,建立 POT 文件;
  3. 使用 msginit 命令根据 POT 文件建立 PO 文件。或者直接在上一步也可以直接建立 PO 文件;
  4. 进行人工翻译,翻译的结果保存在 PO 文件中;
  5. 使用 msgfmt 命令将 PO 文件编译成面向机器的 MO 文件(二进制文件);
  6. 在程序中实现调用命令,本项目中是 _() 函数,这个函数将读取并解析 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
2
3
4
5
#: src/name.c:36

msgid "My name is %s.\n"

msgstr "我的名字是 %s.\n"

这种纯文本文件方便翻译人员进行翻译。



Poedit 简介

gettext 提供的工具集都是基于命令行的,它没有提供用于翻译工作者的对照翻译工具。

Poedit 是一个基于gettext工具集的图形化工具, 它从源码中提取文本生成 PO 文件,并提供了一个GUI界面用于对照翻译。

它还可以直接生成最终的 MO 文件, 在GUI背后依然是使用 gettext 来处理的,但这些具体的细节被隐藏了。

安装工具:

1
​apt-get install poedit    

配置:

开启 Poedit,点击 编辑 - 首选项.

  1. 在”常规”选项卡, 填入自己的个人信息, 勾选“在保存时自动编译MO文件”, “检查拼写”

  2. 切换到 “提取器” 选项卡,这里提供了几种源码解析器,但默认没有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
  3. 打开项目中的 xxx.po 翻译文件, 路径位于项目根目录 / i18n / locale / 下.

在增加的了翻译文本后, 点击工具的“更新”按钮, 即可自动提取翻译文本.

编写好翻译内容后, 点击保存, 即可自动更新mo文件

备注:

​ 在增加插件时, 需将新插件路径加入配置文件, 方法: “编目” - “属性” , 点击“源路径”标签, 将新插件目录加入。