Каков наилучший способ интернационализации приложения Python с несколькими доменами i18n? - PullRequest
2 голосов
/ 29 марта 2009

Я интернационализирую приложение Python, имея в виду две цели:

  1. Приложение загружает классы из нескольких пакетов, каждый из которых имеет собственный домен i18n. Поэтому модули в пакете A используют домен A, модули в пакете B используют домен B и т. Д.

  2. Язык можно изменить во время работы приложения.

Модуль Python gettext делает интернационализацию однодоменного одноязычного приложения очень простой; Вы просто устанавливаете локаль, затем вызываете gettext.install(), который находит правильный Translation и устанавливает его метод ugettext в глобальном пространстве имен как _. Но очевидно, что глобальное значение работает только для одного домена, и поскольку оно загружает один Translation, оно работает только для этой локали.

Вместо этого я мог бы загрузить Translation в верхней части каждого модуля и связать его метод ugettext как _. Тогда каждый модуль будет использовать _ для своего собственного домена. Но это все равно ломается при изменении локали, потому что _ для неправильной локали.

Так что, я думаю, я мог бы загрузить правильные ugettext вверху каждой функции, но это кажется ужасно громоздким. Альтернативой было бы делать это для каждого модуля, но вместо привязки ugettext я бы подставил свою собственную функцию, которая проверила бы текущую локаль, получила бы ее Translation и перешлала бы ей строку. У кого-нибудь есть более чистое решение?

1 Ответ

2 голосов
/ 29 марта 2009

как насчет того, чтобы связать _ с функцией, примерно такой (для каждого модуля):

def _(message):
    return my_gettext(__name__, message)

Это позволяет вам использовать gettext, в то же время выполняя любой поиск для каждого модуля на базу вызова, что также позволяет переключать локаль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...