什么时候应该生成 .mo 文件?

nik*_*k90 6 python translation application-development

我正在创建一个 python GTK3 程序。我想添加翻译支持。我知道如何创建 .pot 和 .po 文件。但是,为了使应用程序以多种语言可用,我需要生成 .mo 文件。我在这里读到生成 .mo 文件的方法是使用msgfmt.make命令。

我的问题是我(开发人员)是否应该在我的计算机中手动生成 .mo 文件,然后指示 .deb 安装程序在安装时将文件移动到 usr/share/locale/en_GB/ 文件夹中?或者 .deb 安装程序应该在用户在他的系统上安装我的程序时生成这些 .mo 文件吗?

在某种程度上,这可以概括为“ .mo 文件是否依赖于机器?

我的文件夹结构如下

nstrain-0.1
   /debian
   /data
   /help
   /nstrain_lib
   nstrain.desktop
   nstrain.py
Run Code Online (Sandbox Code Playgroud)

其中 nstrain.py 是 .desktop 文件在用户单击我的程序时运行的主要可执行文件。

Dav*_*lla 5

二进制MO 文件需要在构建时生成。这意味着您的构建系统需要有一个构建目标来读取用作源的文本PO 文件并将它们转换为将安装在用户系统中的二进制 MO 文件。正如您正确指出的那样,msgfmt命令(gettext 工具的一部分)最终将创建它们。

所以要回答问题的最后一部分,是的,MO 文件依赖于机器。

以艰难的方式创建 MO 文件

现在讨论如何创建它们,在标准的 gettext 布局中,您通常会将所有 PO 文件放在同一目录中,每种语言一个,并以每种语言的 ISO-639 2 字母或 3 字母代码命名:

po/
po/ca.po
po/de.po
...
Run Code Online (Sandbox Code Playgroud)

如果您想手动构建它们,则必须遍历该目录中的每个文件并msgfmt手动调用,例如

$ msgfmt -c po/ca.po -o build/locale/LC_MESSAGES/ca/myapp.mo
Run Code Online (Sandbox Code Playgroud)

但是,当已经建立了专门用于构建 MO 文件的操作和自动化工具时,您不想这样做。

此外,这些工具负责其他相关任务,例如从代码中提取翻译并将它们全部放在一个 POT 文件中,以便翻译人员完成他们的工作。

以聪明的方式创建 MO 文件

如果您使用的是 Python,我非常推荐使用python-distutils-extra包(安装 pde),它可以自动化并隐藏复杂性,只需在setup.py您将用于构建、安装和分发的文件中指定以下内容你的应用程序。与@dobey 已经在他的回答中指出的示例相同:

DistUtilsExtra.auto.setup(
    name='myapp',
    version='0.1',
    #license='GPL-3',
    #author='Your Name',
    #author_email='email@ubuntu.com',
    #description='UI for managing …',
    #long_description='Here a longer description',
    #url='https://launchpad.net/myapp'
)
Run Code Online (Sandbox Code Playgroud)

这将为您处理一切。

如果你想在发送之前测试翻译,你可以使用build_i18npython-distutils-extra 中的方便命令:

$ python setup.py build_i18n
Run Code Online (Sandbox Code Playgroud)

这将在您的/po文件夹中构建所有 PO 文件,并将它们放在build(如果它不存在,它将创建)以 gettext 在系统中安装时所期望的相同布局。

然后,您可以通过以下方式使用翻译测试您的应用程序: * 复制/buildto的内容/usr/share/locale,或 * 使用以下gettext.bindtextdomain()函数将您的应用程序指向构建目录:

gettext.bindtextdomain(domain='myapp', localedir='/home/me/dev/myapp/build')
Run Code Online (Sandbox Code Playgroud)

更聪明

站在巨人的肩膀上。只需使用Quickly创建一个测试应用程序并复制在 中设置翻译的方式setup.py,这基本上归结为DistutilsExtraauto模式中使用模块,如上所述。

您也可以使用测试应用程序来生成翻译并了解生成的工作原理。

包装

您作为发行版的一部分放在一起的 tarball 不应包含 .mo 文件。也就是说,您不必手动构建它们。当有人构建要手动安装的 tarball 内容或正在创建 Debian 二进制包时,需要发生这种情况。

查看您的源代码树,我再次建议使用诸如 python-distutils-extra 之类的构建系统,这也有助于打包。粗略地说,您需要:

  • 创建一个setup.py与上面建议的内容类似的文件
  • 在 debian/ 下创建打包控制文件。使用 pde 您的debian/rules文件可以变得非常简单并且只包含几行。

实际上,您可能只想使用 Quickly 为您的应用程序的构建和打包系统创建工具,然后用您的应用程序代码替换 Quickly 为测试应用程序生成的源代码。