Использование settings.LANGUAGES с правильно переведенными именами с использованием gettext () - PullRequest
5 голосов
/ 25 августа 2009

Из документации Django:

Если вы определяете пользовательский LANGUAGES настройки, можно пометить языки как строки перевода (как в значение по умолчанию отображается выше) - но использовать функцию "пустышка" gettext(), а не один в django.utils.translation. Вы никогда не должны импортировать django.utils.translation изнутри ваш файл настроек, потому что это модуль сам по себе зависит от настройки, и это вызвало бы круговой импорт. Решение состоит в том, чтобы используйте "пустышку" gettext() функцию. Вот пример файла настроек:

gettext = lambda s: s LANGUAGES = ( ('de', gettext('German')), ('en', gettext('English')), )

При таком расположении django-admin.py makemessages все равно найдет и пометит эти строки для перевода, но перевод не произойдет в время выполнения - так что вам придется помнить обернуть языки в реале gettext() в любом коде, который использует LANGUAGES во время выполнения.

Что именно означает перенос языков в реальном gettext()? Как это должно называться в коде?

Ответы [ 4 ]

4 голосов
/ 20 марта 2017

Согласно последним документам вы можете использовать ugettext_lazy в настройках, не вызывая циклический импорт:

from django.utils.translation import ugettext_lazy as _

LANGUAGES = [
    ('de', _('German')),
    ('en', _('English')),
]
3 голосов
/ 25 августа 2009

Именно то, что написано: вызывайте gettext () для названий языков, когда вы их используете, или покажите их пользователю:

from django.utils.translation import ugettext

for lang_code, lang_name in settings.LANGUAGES:
    translated_name = ugettext(lang_name)
    ...

(Обычно вы должны использовать ugettext, а не gettext, так как весь текст в Django является Unicode.)

Чтобы сделать эквивалент в шаблоне, просто используйте тег {% blocktrans%}, который просто вызывает ugettext за кулисами:

{% for lang in LANGUAGES %}
  {% blocktrans %}{{ lang.1 }}{% endblocktrans %}
{% endfor %}
0 голосов
/ 07 октября 2013

в шаблоне вы можете просто сделать следующее:

{% for lang in LANGUAGES %}
      {% trans lang.1 %}
{% endfor %}
0 голосов
/ 14 июля 2012

Это действительно комментарий и дальнейшее объяснение вышеуказанных вопросов и ответов. Я не мог заставить свои переводы работать, читать и перечитывать документы, часами искал в Интернете, и после прочтения этого поста я понял, что все сводится к следующему:

У меня изначально было:

LANGUAGES = (
    ('en', 'English'),
    ('nl', 'Dutch'),
    )

Что бы не сработало, тогда после прочтения попробовал

ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('nl', ugettext('Dutch')),
    )

Что заставило все работать ... и я только что искал это, и это в документе в https://docs.djangoproject.com/en/1.4/topics/i18n/translation/#how-django-discovers-language-preference, к нижней части этого раздела ...

...