В исходном коде моего приложения я обернул строки gettext по-русски, так что это мой язык по умолчанию и * .po файлы на его основе. Теперь мне нужно сделать откаты цепочки - строку, которая не переведенную в испанского каталога следует искать в английского каталога и чем, если она не переведена будет возвращены в себя русском.Gettext fallbacks не работает с нетранслированными строками
Я пытался сделать это с add_fallback метод, но непереведенные строки в self._catalog из GNUTranslations (NullTranslations) уже заменила собой и ugettext метод никогда не делать резервные объявления.
Что я делаю неправильно?
Пример:
Текущая локаль является испанской, и мы не получили ни одного перевода для строки «Титул должен быть уникальным» в испанском каталоге и в результате «Название должно быть уникальным» с английского каталог должен быть возвращен.
испанский * .po файл
msgid "Титул должен быть уникальным"
msgstr "" # <— We've got no translation for this string
Английский * .po файл
msgid "Титул должен быть уникальным"
msgstr "Title should be unique"
Русский * .po файл не содержит переводы, так как этот язык используется в качестве ключей в исходном коде (язык по умолчанию)
msgid "Титул должен быть уникальным"
msgstr ""
У меня есть испанский переводчик (объект GNUTranslations), и я добавляю Englis h traslator (объект GNUTranslations) как резерв для него с помощью метода add_fallback. Итак, мой es_translator._fallback - объект en_translator.
В ugettext функции мы пытаемся получить значение из self._catalog сообщения в качестве ключа, и только если он отсутствует, мы делаем self._fallback вызова. Но self._catalog.get (message) для непереведенной строки. self._catalog["Титул должен быть уникальным"] -> "Титул должен быть уникальным"
и мы никогда не выполняем поиск в английском каталоге.
def add_fallback(self, fallback):
if self._fallback:
self._fallback.add_fallback(fallback)
else:
self._fallback = fallback
def ugettext(self, message):
missing = object()
tmsg = self._catalog.get(message, missing)
if tmsg is missing:
if self._fallback:
return self._fallback.ugettext(message)
return unicode(message)
return tmsg
Однако если сообщение помечено как нечеткое это does't включает в self._catalog и запасной вариант работает хорошо.
У меня возникли проблемы с пониманием ваш вопрос. Не могли бы вы предоставить минимальный пример? – hildred
Спасибо за внимание, я попытался объяснить свою боль :) – elatonsev