Django:如何在模板中获取语言代码?

时间:2011-11-25 05:22:29

标签: django internationalization

在django模板中是否有一些gettin'语言代码的全局变量或至少通过视图传递它? 例如:{{ LANG }}应该产生“en”例如.. 当人们使用request.LANGUAGE_CODE时,我真的不舒服。

详细解释将被赞赏=)

3 个答案:

答案 0 :(得分:109)

这是一个古老的话题。但有些人可能觉得它很有用。

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

Django reference and example

答案 1 :(得分:19)

如果它尚不存在,则需要编写template context processor。这是你如何做到的。

把它放在某个地方:

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,否则无效。

答案 2 :(得分:9)

使用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()之前有效   同样地,除了它没有使请求可用   响应。它不推荐,可能会被弃用   将来