Django会话翻译设置对所有语言都是粘性的,除了中文?

时间:2017-01-02 19:52:12

标签: python django gettext django-i18n

我有一个非常奇怪的问题,我以前从未见过。我使用的是Django 1.10。

我有几个字典文件:

/locale/fr/LC_MESSAGES/django.po
/locale/de/LC_MESSAGES/django.po
/locale/zh/LC_MESSAGES/django.po

应用程序字符串是用英语编写的。字典文件已完成,并已编译为mo个文件。

我将每个用户的语言偏好设置存储在language的{​​{1}}字段中。更新其个人资料时,我将语言翻译应用于会话。

UserProfile

这适用于法语和德语。 # 'up' is a UserProfile object pertaining to the user up.update(language=form.cleaned_data['language']) translation.activate(up.language) self.request.session[translation.LANGUAGE_SESSION_KEY] = up.language return super(self, UpdateUserProfile).form_valid(form) 以法语/德语呈现表单模板,然后我可以导航到其他页面并查看法语/德语文本。

它对中文(语言代码' zh')不起作用。 return super页面用中文呈现表单模板(并且我在保存后验证了shell中的语言设置),但是与法语和德语不同,当我离开时,所有其他页面都会恢复为英语。 / p>

我已经重新启动了dev服务器,以防它是由于旧的设置。我已经在一个新的,孤立的开发虚拟机上干净地拉出了那个分支。在这两种情况下,我对中文都有同样的问题。什么可能导致此错误?

编辑 - 附加信息:

来自settings.py

return super

如上所述,在UpdateLanguage LANGUAGE_CODE = 'en-us' LOCALE_PATHS = [ BASE_DIR + '/locale/', ] USE_I18N = True USE_L10N = True 的POST上,FormView代码设置为request.session[translation.LANGUAGE_SESSION_KEY],页面显示为中文。在对同一视图的GET请求中,页面以英语显示(但是检查zh显示尽管显示英文文本,但它仍设置为request.session[translation.LANGUAGE_SESSION_KEY]

我没有在网址中使用语言前缀。

2 个答案:

答案 0 :(得分:3)

您正确地inferred zh不是默认LANGUAGES设置中的代码,因此无效。

您在制作首页时获得中文的原因是您拨打的电话相当于translation.activate("zh")。此调用不会检查LANGUAGES。它盲目地激活语言zh的翻译。如果文件是" zh"没问题。你可以做translation.activate("turnip"),只要语言的文件"萝卜" Django就可以了。存在..

它对后续页面请求不起作用的原因是locale middleware 执行检查LANGUAGES并拒绝未在其中列出的值:它切换回您为网站配置的默认语言。

以下代码说明了两种情况:

import os

import django
from django.utils.translation import trans_real as translation, LANGUAGE_SESSION_KEY
from django.middleware.locale import LocaleMiddleware

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "btw.settings")
django.setup()

#
# Calling translation.activate directly.
#
translation.activate("zh")
value = translation._active.value
print "translation:", value.language()

#
# Middleware processing
#
class FakeRequest(object):

    path_info = ""
    session = {}
    COOKIES = {}
    META = {}

middleware = LocaleMiddleware()

for lang in ("fr", "zh", "zh-hans"):
    print "Trying:", lang
    request = FakeRequest()
    request.session[LANGUAGE_SESSION_KEY] = lang

    middleware.process_request(request)
    print request.LANGUAGE_CODE

您将在第二部分使用中间件看到当您选择" zh"作为语言,request.LANGUAGE_CODE设置为您网站的默认语言,而不是" zh"或者它的一些变体。在我的系统上,输出是:

translation: zh
Trying: fr
fr
Trying: zh
en-us
Trying: zh-hans
zh-hans

答案 1 :(得分:2)

哇,django调试工具栏的所有调试输出都表明我做的是正确的,所以我查看了global_settings.py的来源

zh实际上并不是有效的语言代码。您必须在简化的zh-hans和传统的zh-hant之间进行选择,并且在设置会话语言之后,在HttpResponse中使用中文奇怪地呈现的页面这一事实使得问题在于会话,而不是设置。