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

22

我目前正在使用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个回答

31

我刚刚为我正在开发的一个项目做了这件事,对于我们来说,流程如下:

首先,我有一个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
在上面的例子中,我禁用了模糊匹配,因为我们的字符串很混乱,而且它造成的伤害比好处多。我还禁用了备份文件,因为这里的所有内容都在版本控制下。针对每种语言运行上述命令,在这种情况下我更新了丹麦语翻译。

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

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

当然,你不会想手动运行这个程序,所以要创建一些脚本(最好是一个或多个Makefile)来为你完成这个过程。

请注意,你的目录结构与我的情况略有不同,因此你需要稍微调整输出文件名/路径,但步骤应该是相同的。


7
你可以使用Transifex,它被许多Python项目(如Django、Mercurial)使用。它具有基于Web的编辑器和命令行客户端以进行自动化,并且还支持.NET,如果这有帮助的话。
免责声明:我是Transifex项目负责人。

Transifex是不二选择!我们在http://www.bugsense.com使用它,无法想象其他管理本地化的方式。 - PanosJee

5
我不明白你如何想要在不编辑每种语言的.po文件的情况下实现真正的翻译?魔法吗?
编辑(评论后) - 如何自动化生成.po文件:
我不使用Gettext,但从维基页面上看,似乎只需要调用
msginit --locale=xx --input=name.pot
对于您想要支持的每种语言。我会生成一个脚本来生成所有语言文件,将它们交给翻译人员,在收到回复后运行msgfmt。

显然,我希望编辑.po文件,但逐个打开它们是一种极大的时间浪费。难道没有一种方法可以在电子表格或其他东西中定义所有语言和翻译,然后生成.po文件吗? - landyman

3

使用脚本。假设您的源代码位于目录$SRC中,因此创建目录$SRC/po以用于i18n文件(pot、po、mo等)。然后创建文件$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文件中。


3
你可以尝试使用翻译工具包进行各种po文件转换(例如po2csv)。子项目Pootle允许通过网络管理翻译。

2
我的建议是使用django-rosetta,它提供了一个基于Web的界面来编辑你的翻译。Django在你的应用程序中不需要有任何涉及,你只是使用它作为在线.PO编辑工具。

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


2
我正在使用 poEdit 进行翻译。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接