Подтвердить что ты не робот

Django: Как получить код языка в шаблоне?

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

Подробное объяснение было бы оценено =)

4b9b3361

Ответ 1

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

Поместите это где-нибудь:

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.core.context_processors.i18n. Вы можете получить к нему доступ как LANGUAGE_CODE.

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

def i18n(request):
    from django.utils import translation

    context_extras = {}
    context_extras['LANGUAGES'] = settings.LANGUAGES
    context_extras['LANGUAGE_CODE'] = translation.get_language()
    context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi()

    return context_extras

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

Ответ 2

Это старая тема. Но некоторым может показаться, что это полезно.

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

Django ссылка и пример.

Ответ 3

Протестировано с помощью 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() и работает аналогично, за исключением того, что он не делает запрос доступным в ответ. Он не рекомендуется и, вероятно, будет устаревшим в будущее.