本地化
使用 GNU gettext 本地化你的应用程序需要一些努力,但很简单。我们将在你的项目根目录下创建一个 po
子目录来存放所有本地化信息。
生成 .pot 和 .po 文件
在你的主 meson.build 文件中,将 po
子目录包含在构建过程中。
subdir('po')
在这个 po
子目录中,我们需要
-
LINGUAS
:用空格分隔的语言列表 -
POTFILES
:要扫描的源文件列表,以查找可翻译的字符串。 -
meson.build
:本地化相关的 Meson 文件
LINGUAS
包含用空格分隔的语言列表的文件。一个 LINGUAS 示例可能如下所示。
aa ab ae af
POTFILES
列出 gettext 应该扫描的所有源文件,以查找要翻译的字符串的文件。该文件的语法是每行一个源文件,并且该行必须包含相对于源根目录的相对路径。一个 POTFILES 示例可能如下所示。
src/file1.c
src/file2.c
src/subdir/file3.c
include/mything/somefile.h
meson.build
本地化相关的 Meson 文件。它导入并使用 i18n
模块。如果之前未定义,则需要定义 GETTEXT_PACKAGE
全局变量。
i18n = import('i18n')
# define GETTEXT_PACKAGE
add_project_arguments('-DGETTEXT_PACKAGE="intltest"', language:'c')
i18n.gettext(meson.project_name())
第一条命令导入提供 gettext 功能的 i18n
模块。第四行执行实际调用。第一个参数是 gettext 包名称。这会导致两件事发生。第一件事是,Meson 将生成二进制 mo 文件并将它们放在适当的位置,以便在进行安装时使用。第二件事是它创建一个构建规则来重新生成主 pot 文件。如果你使用 Ninja 后端,这就是你如何调用重建的方式。
生成 .pot 文件
然后我们需要生成主 pot 文件。pot 文件可以有任何名称,但通常是 gettext 包的名称。假设项目名为 intltest。在这种情况下,相应的 pot 文件将被称为 intltest.pot
。
从你的构建文件夹运行以下命令来生成 pot 文件。建议之后手动检查它并填写例如适当的版权和联系信息。
$ meson compile intltest-pot
生成 .po 文件
对于上面数组中列出的每种语言,我们都需要一个相应的 .po
文件。可以通过从你的构建文件夹运行以下命令来生成这些文件。
$ meson compile intltest-update-po
搜索结果为