sdolan объяснил , почему ваш код не работал, и предоставил отличное решение. Но у него есть неудобство: вы должны импортировать gettext в каждый модуль, для которого вы хотите включить переводы .
Эльф Штернберг предоставил очень удобный подход: вручную сделать gettext видимым во всем проекте. Но это выглядит немного загадочно и, по его словам, это чистое зло :). Он также предлагает, по неизвестной причине, совершенно не связанный Ugettext Django. Не нужно Django, придерживайтесь стандартного gettext lib, как вы делали раньше.
Могу ли я предложить третий, официально одобренный подход? В том же __init__.py
, который вы пробовали ранее, используйте это:
import gettext
gettext.install('brainz', '../datas/translations/')
И это все! Доступность всего проекта _()
доступным, не зашифрованным, элегантным и удобным способом, используя стандартный модуль gettext
. Но, честно говоря, если вы посмотрите на исходный код gettext, вы увидите, что используется тот же прием, который предложил Эльф. Так что, по сути, это тоже Чистое Зло (тм). Но это прекрасно , если модуль 'brainz' используется только вашим приложением и не предназначен для импорта другими приложениями .
Если вы хотите поделиться «brainz» с другими приложениями, вы должны использовать подход sdolan: импортируйте его в каждый модуль. Но, опять же, вместо использования bindtextdomain
и textdomain
, как вы это сделали, я предлагаю следующее:
import gettext
t = gettext.translation('brainz', '../datas/translations/')
_ = t.ugettext
Разница заключается в использовании основанного на классах API gettext вместо API gettext GNU. Посмотрите в официальном справочнике , почему. Подход install
также является частью API на основе классов.
Примечание: вы заметите, что в документах предлагается использовать pygettext
вместо GNU xgettext
. Не надо! Pygettext крайне устарел и не имеет нескольких функций. xgettext
гораздо более мощный и гибкий, и полностью поддерживает Python.