Использование 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"