Использование Babel: Как защитить комментарии переводчиков (и старые переводы) в файлах PO GNU gettext? - PullRequest
10 голосов
/ 27 мая 2010

С помощью утилит Babel gettext на основе Python существуют ли какие-либо методы для сохранения комментариев переводчиков и старых ("устаревших") переводов (отмеченных #~) в файлах .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 Ответ

9 голосов
/ 19 августа 2014

Вместо использования обновления 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"
...