ленивые функции 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" %}

это то, что вы уже пробовали ?