我正在创建一个 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_i18n
python-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 文件)。