Использование Babel: как защитить комментарии переводчика (и старые переводы) в GNU gettext PO файлах?

С помощью Babel gettext-утилит, есть ли какие-либо методы для сохранения комментариев переводчика и старых ( "устаревших" ) переводов (помечено #~) в файлах .po через обновления из файла .pot?

В первый раз, когда устаревший перевод находится в файле .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 используйте 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"