ленивые функции ugettext и ugettext, не распознанные makemessages в Python Django
я работаю с Django 1.5.1, и я испытываю некоторое "странное поведение" с переводами. Я использую ugettext
и ugettext_lazy
в том же файле Python. Если я организую импорт как:
from django.utils.translation import ugettext as trans
from django.utils.translation import ugettext_lazy as _
или
from django.utils.translation import ugettext as trans, ugettext_lazy as _
строки, помеченные как trans("string")
пропускаются при выполнении .
однако, если я не переименую ugettext
он хорошо работает с обеими версиями:
from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _
или
from django.utils.translation import ugettext, ugettext_lazy as _
теперь trans("string")
хорошо работать.
Итак, кто-нибудь знает, почему это переименование импорта приводит к тому, что переименованная функция не вызывается? является ли это фактическим "ограничением" Python, которое я не знал при переименовании более одной функции внутри одного модуля?
обновление
после некоторого тестирования я понял, что даже создание пустого модуля python внутри приложения со следующим кодом не работа:
from django.utils.translation import ugettext_lazy as translate
a = translate("string")
при использовании _
для псевдонима он работает:
from django.utils.translation import ugettext_lazy as _
a = _("string")
мой вывод - это: вы можете использовать только _
псевдоним ugettext
и ugettext_lazy
(или любая другая связанная функция перевода) в Django или иначе она не будет распознана makemessages
команда. Техническое объяснение можно найти в ответе Роберта Лухо.
спасибо!
3 ответов
командная утилита Django makemessages внутренне вызывает xgettext такой:
cmd = (
'xgettext -d %s -L Python %s %s --keyword=gettext_noop '
'--keyword=gettext_lazy --keyword=ngettext_lazy:1,2 '
'--keyword=ugettext_noop --keyword=ugettext_lazy '
'--keyword=ungettext_lazy:1,2 --keyword=pgettext:1c,2 '
'--keyword=npgettext:1c,2,3 --keyword=pgettext_lazy:1c,2 '
'--keyword=npgettext_lazy:1c,2,3 --from-code UTF-8 '
'--add-comments=Translators -o - "%s"' %
(domain, wrap, location, work_file))
(источник можно найти здесь). Таким образом, некоторые ключевые слова предопределены xgettext утилита (проверьте ссылку на -- keyword):
- для python-gettext, ugettext, dgettext, ngettext, ungettext, dngettext,_
и некоторые добавлены утилитой django:
- gettext_lazy , ngettext_lazy , ugettext_noop , ugettext_lazy , ungettext_lazy , pgettext , npgettext , pgettext_lazy , npgettext_lazy
Ключевое слово транс нет ни в одном из этих наборов ключевых слов, поэтому вы не должны использовать его для маркировки текстов для переводов.
неожиданные псевдонимы ugettext могут быть обработаны путем переопределения , например:
from django.core.management.commands import makemessages
class Command(makemessages.Command):
"""
Extends the makemessages command to look for additional aliases.
"""
xgettext_options = makemessages.Command.xgettext_options + ['--keyword=_lazy']
см https://docs.djangoproject.com/en/1.8/topics/i18n/translation/#customizing-the-makemessages-command
эти заметки о поддержка нескольких языков для проекта Django может позволить вам определить, что является неправильным. Скорее всего, переименование не является основной причиной сбоя.
некоторые предупреждения в этих заметках:
каждый шаблон для вашего веб-сайта должен загрузить библиотеку тегов i18n с помощью
{% load %}
перед запуском makemessages вам необходимо вручную создать каталог локали-что вы обычно делали, если вы не получаете сообщение об ошибке
языковые файлы должны быть скомпилированы в
.mo
файлы, прежде чем использовать их, - то ты тоже
редактировать
на странице, которую я связал с моим сообщением, они используют этот синтаксис в шаблонах:
{% trans "Hello" %}
это то, что вы уже пробовали ?