最简单的生成本地化文件的方法

时间:2009-04-11 01:16:15

标签: python localization internationalization translation

我目前正在用Python编写应用程序并需要为其提供本地化。

我可以使用gettext及其附带的实用程序来生成.po和.mo文件。但是,逐个编辑每种语言的.po文件似乎有点单调乏味。然后,为每种语言创建目录并逐个生成.mo文件,似乎有点矫枉过正。最终结果如下:

/en_US/LC_MESSAGES/en_US.mo
/en_CA/LC_MESSAGES/en_CA.mo
etc.

我可能错了,但似乎必须有更好的方法来做到这一点。有没有人有我尚未找到的工具,技巧或一般知识?

提前致谢!

编辑:为了更清楚一点,我正在寻找能够加速这一过程的东西。因为它已经非常简单了。例如,在.NET中,我可以生成需要转换为excel文件的所有字符串。然后,翻译人员可以填写excel文件并为每种语言添加列。然后,我可以使用xls2resx生成语言资源文件。 gettext有什么类似的吗?我意识到我可以编写一个脚本来创建和读取csv并生成文件 - 我只是希望已经有了一些东西。

7 个答案:

答案 0 :(得分:29)

我刚刚为我正在进行的项目做了这个,对我们来说,这个过程是这样的:

首先,我有一个POTFILES.in文件,其中包含需要翻译的源文件列表。我们实际上有两个文件(例如admin.in和user.in),因为管理界面并不总是需要翻译。因此,我们只能向翻译人员发送包含用户看到的字符串的文件。

运行以下命令将从POTFILES.in:

创建.pot模板
xgettext --files-from=POTFILES.in --directory=.. --output=messages.pot

从po /目录运行上面的命令,该目录应该是项目的子目录并包含POTFILES.in文件。 .pot文件具有与.po文件完全相同的格式,但它是不包含翻译的模板。只要将新的可翻译字符串添加到源文件,就可以创建新模板。

要更新已翻译的.po文件并向其添加新字符串,请运行:

msgmerge --update --no-fuzzy-matching --backup=off da.po messages.pot

在上面的例子中,我禁用了模糊匹配,因为我们的字符串是乱七八糟的,它弊大于利。我也禁用了备份文件,因为这里的所有内容都是subversion。对每种语言运行上面的命令,在这种情况下我更新了丹麦语翻译。

最后运行msgfmt以从.po文件创建.mo文件:

msgfmt nl.po --output-file nl.mo

当然,你不希望每次都手动运行它,所以创建一些脚本(或者最好是一个或多个Makefile)来为你做这个。

请注意,您的目录布局与我的情况略有不同,因此您必须稍微调整输出文件名/路径,但步骤应该相同。

答案 1 :(得分:6)

你可以使用很多Python项目(Django,Mercurial)使用的Transifex。它有一个基于Web的编辑器和用于自动化的命令行客户端,并且还支持.NET,如果它可以提供帮助。

免责声明:我是Transifex项目负责人。

答案 2 :(得分:4)

如果不想编辑每种语言的.po文件,我想要实现真正的翻译?魔法?

编辑(评论后) - 如何自动生成 .po 文件:

我不使用Gettext,但是从wiki page看起来你只需要调用

  

msginit --locale = xx --input = name.pot

您想要支持的每种语言。我会生成一个脚本,生成所有语言文件,将它们提供给翻译人员,当你让他们回来时,运行 msgfmt

答案 3 :(得分:3)

使用脚本。假设您的源代码位于$ SRC目录中,因此为i18n文件(pot,po,mo等)创建目录$ SRC / po。然后创建文件$ SRC / po / POTFILES.in,其中使用gettext函数调用指定源代码文件的路径。它可能看起来像:

[encoding: UTF-8]
./main.cpp
./plugins/list.cpp

现在您可以使用以下命令(在$ SRC目录中):

用于更新主文件messages.pot:

intltool-update --pot --gettext-package=messages --verbose

用于将来自messages.pot的更改合并到fr.po文件,例如:

msgmerge -U fr.po messages.pot

生成mo文件使用命令:

msgmerge -o - fr.po messages.pot | msgfmt -c -o fr/LC_MESSAGES/programname.mo -

当然目录fr / LC_MESSAGES /必须在调用之前创建,你也可以在执行前删除现有的fr / LC_MESSAGES / programname.mo

为了加快处理过程,将所有这些命令放入相应的.sh文件中。例如。

答案 4 :(得分:3)

您可以尝试Translate Toolkit进行各种po文件转换(例如po2csv)。子项目Pootle允许通过网络管理翻译。

答案 5 :(得分:2)

我正在使用poEdit进行翻译。

答案 6 :(得分:2)

我的建议是django-rosetta,它为您提供了一个基于网络的界面来编辑您的翻译。 Django根本不需要涉及您的应用程序,您只是将其用于在线.PO编辑工具。

我认为使用Django / Pinax构建的另一个有趣的新翻译网站是Transifex,但我不确定它是否允许直接编辑.PO文件。