使用Babel:如何保护GNU gettext PO文件中的翻译注释(及旧翻译)?
使用基于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 个回答
与其使用 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"