Джанго: Как получить код языка в шаблоне? - PullRequest
38 голосов
/ 25 ноября 2011

Существует ли какая-либо глобальная переменная для получения кода языка в шаблоне django или, по крайней мере, его пропуск через представление? что-то вроде: {{ LANG }} должно выдавать "en", например .. Мне действительно не комфортно, когда люди используют request.LANGUAGE_CODE.

Подробное объяснение будет оценено =)

Ответы [ 3 ]

109 голосов
/ 02 марта 2013

Это старая тема. Но некоторые могут найти это полезным.

{% load i18n %}
...
{% get_current_language as LANGUAGE_CODE %}

Джанго ссылка и пример .

19 голосов
/ 25 ноября 2011

Если его еще не было, вам нужно написать процессор контекста шаблона . Вот как ты это сделаешь.

Положите это куда-нибудь:

def lang_context_processor(request):
    return {'LANG': request.LANGUAGE_CODE}

Затем добавьте ссылку на параметр TEMPLATE_CONTEXT_PROCESSORS. Примерно так:

from django.conf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'myproject.myapp.templatecontext.lang_context_processor',
)

(Я рекомендую добавить к глобальным настройкам, потому что это означает, что вы не нарушаете работу случайно, когда к значениям по умолчанию добавляется новый процессор контекста.)

Однако, он существует, как встроенный обработчик контекста шаблона django.template.context_processors.i18n. Вы можете получить к нему доступ как LANGUAGE_CODE.

Чисто для интереса, вот определение этой функции:

def i18n(request):
    from django.utils import translation
    return {
        'LANGUAGES': settings.LANGUAGES,
        'LANGUAGE_CODE': translation.get_language(),
        'LANGUAGE_BIDI': translation.get_language_bidi(),
    }

Убедитесь, что вы используете RequestContext для рендеринга шаблона, а не обычный Context, иначе он не будет работать.

9 голосов
/ 26 июня 2017

Проверено с Django==1.11.2.

Включить I18N и использовать i18n шаблонный процессор контекста.

# setings.py

USE_I18N = True
# ...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # ...
                'django.template.context_processors.i18n',
                # ...
            ],
        },
    },
]

А потом все просто в шаблоне.

# template.html

{% load i18n %}
{{ LANGUAGE_CODE }}


Но используйте render(), а не render_to_response(), в вашей функции просмотра, чтобы переменная LANGUAGE_CODE была доступна в шаблоне:

render_to_response () * * тысяча двадцать-одна

Эта функция предшествовала введению render () и работ аналогично, за исключением того, что он не делает запрос доступным в ответ. Это не рекомендуется и, скорее всего, не рекомендуется в будущее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...