2015-03-31 9 views
1

В исходном коде моего приложения я обернул строки 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 и запасной вариант работает хорошо.

+0

У меня возникли проблемы с пониманием ваш вопрос. Не могли бы вы предоставить минимальный пример? – hildred

+0

Спасибо за внимание, я попытался объяснить свою боль :) – elatonsev

ответ

1

ОК, python делает что-то отличное от стандартного резервного механизма для дополнительной функциональности, которая не работает, как вы думаете. Это может гарантировать отчет об ошибке.

В стандартном резервном механизме есть только один откат, если строка отсутствует в переводе: используйте исходную строку. В большинстве случаев это английский (язык C или POSIX не ищет поисковых запросов), но в вашем случае, потому что сообщения в исходном тексте языка C имеют русский текст (что может вызвать другие проблемы, потому что иногда языковой стандарт C предполагает ascii не utf8). Рекомендуемой в настоящее время лучшей практикой является использование английского языка в языке C, закодированного в семи бит ascii, а затем перевода на все другие языки.Это значительный редизайн (и, по общему признанию, англоцентрический), но если кто-то не улучшит инструменты (что еще более значило бы перепроектировать), это, вероятно, лучший выбор.

+0

Спасибо за ответ! Конечно, мы допустили ошибку, когда выбрали русский как основной ключевой язык, но теперь у нас есть много исходного кода и 6 каталогов с переводами на разных языках, и теперь это проблема для повторного воспроизведения. Попытка найти альтернативное решение. – elatonsev

+0

Это случай, когда фильтрация источника может быть решением. это написать программу для перевода исходного кода при копировании. Если вам нужна помощь в этом, я сделал это раньше. Если это проект с открытым исходным кодом, отправьте мне ссылку, и я это сделаю. Если он закрыт и хочет, чтобы я сделал это за вас, я был бы готов, если бы заплатил. – hildred

0

Единственный способ решить это - удалить непереведенные строки при компиляции файлов * .mo. Patch столпотворение/сообщения/mofile.py write_mo с

messages = [m for m in messages if m.string]