Я интернационализирую приложение Python, имея в виду две цели:
Приложение загружает классы из нескольких пакетов, каждый из которых имеет собственный домен i18n. Поэтому модули в пакете A используют домен A, модули в пакете B используют домен B и т. Д.
Язык можно изменить во время работы приложения.
Модуль Python gettext
делает интернационализацию однодоменного одноязычного приложения очень простой; Вы просто устанавливаете локаль, затем вызываете gettext.install()
, который находит правильный Translation
и устанавливает его метод ugettext
в глобальном пространстве имен как _
. Но очевидно, что глобальное значение работает только для одного домена, и поскольку оно загружает один Translation
, оно работает только для этой локали.
Вместо этого я мог бы загрузить Translation
в верхней части каждого модуля и связать его метод ugettext как _
. Тогда каждый модуль будет использовать _
для своего собственного домена. Но это все равно ломается при изменении локали, потому что _
для неправильной локали.
Так что, я думаю, я мог бы загрузить правильные ugettext
вверху каждой функции, но это кажется ужасно громоздким. Альтернативой было бы делать это для каждого модуля, но вместо привязки ugettext
я бы подставил свою собственную функцию, которая проверила бы текущую локаль, получила бы ее Translation
и перешлала бы ей строку. У кого-нибудь есть более чистое решение?