生成本地化文件的最简单方法
Posted
技术标签:
【中文标题】生成本地化文件的最简单方法【英文标题】:Easiest way to generate localization files 【发布时间】:2010-10-18 20:48:29 【问题描述】:我目前正在用 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 并生成文件——我只是希望已经制作了一些东西。
【问题讨论】:
【参考方案1】:您想如何在不编辑每种语言的 .po 文件的情况下实现真正的翻译?魔法?
编辑(评论后) - 如何自动生成 .po 文件:
我不使用 Gettext,但从 wiki page 看来您只需拨打电话
msginit --locale=xx --input=name.pot
适用于您想要支持的每种语言。我会生成一个脚本来生成所有语言文件,将它们提供给翻译人员,当你得到它们时,在它们上运行 msgfmt。
【讨论】:
显然,我希望编辑 .po 文件,但是一个一个打开它们是非常浪费时间的。有没有办法在电子表格或其他东西中定义所有语言和翻译,然后生成 .po 文件?【参考方案2】:我正在使用poEdit 进行翻译。
【讨论】:
【参考方案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】:您可以尝试Translate Toolkit 进行各种 po 文件转换(例如 po2csv)。子项目Pootle 允许通过网络管理翻译。
【讨论】:
【参考方案5】:我的建议是django-rosetta,它为您提供了一个基于网络的界面来编辑您的翻译。 Django 根本不需要参与您的应用程序,您只是将它用于在线 .PO 编辑工具。
另一个有趣的新翻译网站是Transifex,我相信它是使用 Django/Pinax 构建的,虽然我不确定它是否允许直接编辑 .PO 文件。
【讨论】:
【参考方案6】:我刚刚为我正在做的一个项目做了这个,对我们来说过程是这样的:
首先,我有一个 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 是最好的选择!我们在bugsense.com 使用它,我们想不出任何其他方式来管理本地化以上是关于生成本地化文件的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章
在一个 python 文件上运行 Sphinx 的最简单方法
在本地运行一次计时器触发的 Azure 函数的最简单方法是啥?