2009-03-29 5 views
2

Я интернационализация приложения Python, с двумя целями:Каков наилучший способ интернационализации приложения Python с несколькими доменами i18n?

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

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

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

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

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

ответ

2

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

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

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

Смежные вопросы