在django模板中是否有一些gettin'语言代码的全局变量或至少通过视图传递它?
例如:{{ LANG }}
应该产生“en”例如..
当人们使用request.LANGUAGE_CODE
时,我真的不舒服。
详细解释将被赞赏=)
答案 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()之前有效 同样地,除了它没有使请求可用 响应。它不推荐,可能会被弃用 将来