标记要翻译的字符串

源代码中的字符串字面量应该以英文键入,但应将其包含在对gettext()函数的调用中。这些字符串将被提取以进行翻译,并且在运行时翻译可以替代原始的英文字符串。

GNU gettext允许你标记源代码中的字符串,提取这些字符串进行翻译,并在你的应用程序中使用翻译好的字符串。

Glib定义了gettext()支持宏,这些宏更为简单易用,要使用这些宏请#include <glibmm/i18n.h>然后将:

display_message("Getting ready for i18n.");
替换为:
display_message(_("Getting ready for i18n."));

可以生成一个包含代码中出现的所有字符串(即使没有被标记为需要翻译)以及其文件名与行号引用的文件作为参考。要生成名为my-strings的文件,请在源代码目录执行以下命令:

xgettext -a -o my-strings --omit-header *.cc *.h

最后,要让你的程序使用当前环境的翻译,请将以下代码添加到你的main.cc文件的开头,以初始化gettext()

bindtextdomain(GETTEXT_PACKAGE, PROGRAMNAME_LOCALEDIR);
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);

25.2.1. gettext如何工作

intltool-updatexgettext脚本提取字符串并将其放入mypackage.pot文件中。应用程序的翻译人员首先将此.pot文件复制到localename.po中以创建翻译。语言环境标识一种语言和该语言使用的编码,包括日期和数字使用的格式。在之后,当源代码中的文本更改时,使用msgmergeintltool-update脚本重新生成的.pot文件更新localename.po文件。

在安装时,.po将被转换为二进制格式(扩展名为.mo),并将其放置于系统所有的区域设置文件夹中,例如/usr/share/locale/

当应用程序运行时,gettext将检查系统目录是否存在与用户语言环境对应的.mo文件(你可以使用以下命令指定语言环境,例如:在bash控制台上输入export LANG=de_DE.UTF-8)。稍后在程序到达gettext调用时,它将从中寻找特定字符串的翻译,如果未找到则使用原始字符串。

25.2.2. 测试和添加翻译

为了说服自己做得很好,你可能希望为新的语言环境添加翻译。为此请转到项目的po子文件夹并执行以下命令:

intltool-update --pot

这将创建一个名为programname.pot的文件。现在将该文件复制到languagecode.po,例如de.pohu.po。接着将该语言代码添加到LINGUAS文件中。.po文件包含标头和英语字符串列表,并为翻译文本预留了空间。请确保将.po文件的编码设置(在标头中指定,但也指定其内容的编码)为了UTF-8

.po文件中有些字符串可能被标记为fuzzy。这些翻译将不会替代原始字符串。如果要使其显示,只需要将fuzzy标记删除即可(通常该标记意味着翻译需要更新,不检查翻译直接删除标记是不对的)。

25.2.3. 资源

更多与国际化与本地化有关的信息,请参阅以下内容: