本地化

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

搜索结果为