django languange更改仅在重新加载后生效

时间:2018-09-08 09:31:44

标签: django django-templates django-i18n

在我的应用中,我可以通过以下方式更改语言:

from django.utils.translation import LANGUAGE_SESSION_KEY
# LANGUAGE_SESSION_KEY is "_language"
...
def my_view(request, my_lang=en):
    request.session[LANGUAGE_SESSION_KEY] = my_lang
    ...
    context = {"mysession": session}
    return render(request, "mytemplate.html", context)

这大致上可以预期。但是,尽管正确设置了会话变量,但该视图的直接响应仍以以前的语言呈现。换句话说,以下模板给出了恕我直言矛盾的输出:

{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
<b>Debug:</b>
current_language: {{ LANGUAGE_CODE }}
session_variable: {{mysession|get:"_language"}}

请注意,要从下划线开始访问属性_language,我必须使用自定义过滤器,请参见this answer

Django输出:

  

调试:current_language:会话变量:de

所有{% trans ... }语句都被处理为LANGUAGE_CODE的(过时)内容,这很烦人。更改语言后,使用有望立即生效。如果刷新页面或加载其他视图,则正确使用了新语言。

  1. 我明白什么地方不对吗?
  2. 如何在即时响应中正确设置current_language。

1 个答案:

答案 0 :(得分:1)

您在会话中设置了语言代码,但实际上并没有在视图中activate the new language

from django.utils import translation
...
translation.activate(my_lang)