使用Babel:如何保护GNU gettext PO文件中的翻译注释(及旧翻译)?

10 投票
1 回答
2063 浏览
提问于 2025-04-15 23:12

使用基于Python的Babel gettext工具时,有没有什么方法可以在从.pot文件更新到.po文件时,保留翻译者的评论和旧的(“过时的”)翻译(用#~标记)呢?

当一个过时的翻译第一次出现在.po文件中,并且运行pybabel update命令时,这个翻译会被标记为#~。这样做的目的是,一方面它被当作评论处理,不会被使用,直到翻译者查看并修改它;另一方面,它又不会被删除,这样翻译者可以参考它,或者从中复制文本到其他翻译中。

但是,下次运行pybabel update时,所有的评论会被永久删除。这意味着那些用#~标记的翻译也会被删除。

例如,在Babel版本0.9.6和Jinja2版本2.6下,假设有以下文件:

./babel.ini:

[jinja2: **/templates/**.html]
encoding = utf-8

./templates/test.html:

<html><body>
<h1>{% trans %}My website{% endtrans %}</h1>
</body></html>

./i18n/pt_PT/LC_MESSAGES/messages.po:

# ... header stuff generated from
#     pybabel init -l pt_PT -d i18n -i i18n/messages.pot ...

# Don't forget, I want to remember something about this!
#~ msgid "My web page"
#~ msgstr "A minha página de web"

在运行以下命令后:

$ pybabel extract -F babel.ini -o i18n/messages.pot .
$ pybabel update -l pt_PT -d i18n -i i18n/messages.pot

葡萄牙语的messages.po文件会失去所有旧的评论,只剩下:

./i18n/pt_PT/LC_MESSAGES/messages.po:

# ... similar header stuff ...

#: templates/test.html:2
msgid "My web site"
msgstr ""

我该如何更新我的翻译文件而不丢失评论和旧的翻译呢?

1 个回答

11

与其使用 pybabel update,不如用 msgmerge 这个工具,它是 gettext 工具包的一部分。

在你的情况下,可以这样使用:

msgmerge ./i18n/pt_PT/LC_MESSAGES/messages.po ./i18n/messages.pot -o ./i18n/pt_PT/LC_MESSAGES/messages.po

举个例子:

假设你有一个 reference.pot 文件:

msgid ""
msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: templates/test.html:2
msgid "My web site"
msgstr ""

还有一个 pt_previous.po 文件,里面是你之前的翻译:

msgid ""
msgstr ""
"Language-Team: \n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt\n"

# Don't forget, I want to remember something about this!
#~ msgid "My web site"
#~ msgstr "A minha página de web"

运行这个命令:

msgmerge pt_previous.po reference.pot -o pt_new.po

会生成一个 ./pt_new.po 文件,内容大概是这样的:

msgid ""
msgstr ""
"Language-Team: \n"
"Language: pt\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

# Don't forget, I want to remember something about this!
#: templates/test.html:2
msgid "My web site"
msgstr "A minha página de web"

撰写回答