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

С помощью утилит gettext Babel на основе 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 ""

Как я могу обновить файлы переводов, не теряя при этом свои комментарии и старые переводы?


person Malcolm    schedule 26.05.2010    source источник
comment
Можете ли вы указать, какие библиотеки вы используете, и предоставить файл с примером?   -  person Jamie Cockburn    schedule 22.07.2014
comment
@JamieCockburn Это помогает?   -  person Dan Getz    schedule 23.07.2014


Ответы (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"
person vac    schedule 18.08.2014