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

标签 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文件。

我将每个用户的语言首选项存储在 UserProfilelanguage 字段中。更新他们的个人资料时,我将语言翻译应用于 session 。

# '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)

这适用于法语和德语。 return super 以法语/德语呈现表单模板,然后我可以导航到其他页面并查看法语/德语文本。

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

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

编辑 - 附加信息:

来自 settings.py

LANGUAGE_CODE = 'en-us'
LOCALE_PATHS = [ 
    BASE_DIR + '/locale/',
]
USE_I18N = True
USE_L10N = True

如前所述,在 UpdateLanguage FormView 的 POST 上,request.session[translation.LANGUAGE_SESSION_KEY] 代码设置为 zh,并且页面显示中文。在对同一 View 的 GET 请求中,页面以英文显示(但是检查 request.session[translation.LANGUAGE_SESSION_KEY] 显示它被设置为 zh 尽管显示英文文本)。

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

最佳答案

你答对了inferred zh 不是默认 LANGUAGES 设置的一部分的代码,因此无法正常工作。

在生成第一页时出现中文的原因是您进行了相当于translation.activate("zh") 的调用。此调用不检查 LANGUAGES。它盲目地激活语言 zh 的翻译。如果文件存在于“zh”,则没有问题。您可以执行 translation.activate("turnip"),只要“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

关于python - Django session 翻译设置对所有语言都是粘性的,除了中文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41432581/

相关文章:

python - 通过 odeint(或 solve_ivp)计算系统对时变输入的响应

python - 我应该如何使用 Spark 在 s3 上加载文件?

python - 更改 is_superuser Django 的 verbose_name

mysql - 在主键以外的字段上加入另一个表

java - Spring:如何获得 "ACTUAL"/"CURRENT"区域设置,就像它适用于消息一样?

java - getText() 方法不打印所有下拉值

python - "col_level"在melt函数中起什么作用?

python - 将多个索引展平到 DataFrame header 中

regex - Django - 在模型中存储原始字符串文字以供正则表达式使用?

php - 覆盖 gettext .mo 文件