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

hol*_*lms 42 django internationalization

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

详细解释将被赞赏=)

小智 115

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

{% load i18n %}
...
{% get_current_language as LANGUAGE_CODE %}
Run Code Online (Sandbox Code Playgroud)

Django 参考和示例.


Chr*_*gan 20

如果它尚不存在,则需要编写模板上下文处理器.这是你如何做到这一点.

把它放在某个地方:

def lang_context_processor(request):
    return {'LANG': request.LANGUAGE_CODE}
Run Code Online (Sandbox Code Playgroud)

然后,添加对它的引用TEMPLATE_CONTEXT_PROCESSORS设置.像这样的东西:

from django.conf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'myproject.myapp.templatecontext.lang_context_processor',
)
Run Code Online (Sandbox Code Playgroud)

(我建议添加到全局设置,因为这意味着当新的上下文处理器添加到默认值时,您不会意外地破坏.)

但是,它确实存在,作为内置模板上下文处理器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(),
    }
Run Code Online (Sandbox Code Playgroud)

确保您使用的RequestContext是模板渲染,而不是普通模板Context,否则它将无效.

  • (+1)老实说,总是使用`RequestContext`.现在养成这个习惯.使用`Context`是一个错误; 将来*总会*会让你希望你普遍使用`RequestContext`. (3认同)

Duš*_*ďar 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',
                # ...
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

然后它在模板中很简单.

# template.html

{% load i18n %}
{{ LANGUAGE_CODE }}
Run Code Online (Sandbox Code Playgroud)


但是,在视图函数中使用render(),而不是在模板中访问变量:render_to_response()LANGUAGE_CODE

render_to_response()这个

此函数在引入render()之前,其工作方式类似,但它不会使响应中的请求可用.不建议这样做,将来可能会被弃用.