什么时候生成.mo文件?

什么时候生成.mo文件?

我正在创建一个 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

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

答案1

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

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

创建 MO 文件很困难

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

po/
po/ca.po
po/de.po
...

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

$ msgfmt -c po/ca.po -o build/locale/LC_MESSAGES/ca/myapp.mo

但是,如果已经有专门为构建 MO 文件的操作而建立的方法和自动化工具,您就不会想这样做。

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

以巧妙的方式创建 MO 文件

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

DistUtilsExtra.auto.setup(
    name='myapp',
    version='0.1',
    #license='GPL-3',
    #author='Your Name',
    #author_email='[email protected]',
    #description='UI for managing …',
    #long_description='Here a longer description',
    #url='https://launchpad.net/myapp'
)

它会帮你解决一切问题。

如果您想在发布翻译之前对其进行测试,您可以使用build_i18npython-distutils-extra 中的便捷命令:

$ python setup.py build_i18n

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

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

gettext.bindtextdomain(domain='myapp', localedir='/home/me/dev/myapp/build')

更加聪明

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

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

包装

作为发布的一部分,您组装的 tarball 不应包含 .mo 文件。也就是说,您不必手动构建它们。这需要在某人构建 tarball 内容以进行手动安装时或创建 Debian 二进制包时进行。

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

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

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

答案2

鉴于您使用的是 Python,我假设您使用 setuptools/distribute/distutils 作为构建系统。在这种情况下,您可以改用 DistUtilsExtra.auto:


from DistUtilsExtra.auto import setup

setup(
    name="Your Project",
    version="0.1",
    ...
)

您可以像平常为包传递参数一样将相同的参数传递给 setup()。DistUtilsExtra.auto 可以自动处理许多系统集成部分(例如翻译),包括翻译静态文本文件(例如 .desktop 文件)。

相关内容