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

2024-04-25 12:31:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从未见过的奇怪问题。我用的是django1.10。在

我有几个字典文件:

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

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

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

^{pr2}$

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

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

我已经重新启动了开发服务器,以防它是由于旧的设置。我已经在一个新的、独立的dev虚拟机上试过了。在这两种情况下,我对中国人都有同样的问题。什么会导致这个错误?在

编辑-附加信息:

从设置.py在

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

如前所述,在POST中更新语言FormView时,request.session[translation.LANGUAGE_SESSION_KEY]代码设置为zh,页面以中文显示。在对同一视图的GET请求中,页面以英语显示(但是,检查request.session[translation.LANGUAGE_SESSION_KEY]显示它被设置为zh,尽管显示了英文文本)。在

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


Tags: 文件django模板语言表单return字典页面
2条回答

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

zh实际上不是有效的语言代码。您必须在简体zh-hans和繁体zh-hant之间进行选择,而且在设置会话语言之后,页面用中文奇怪地呈现给HttpResponse,这让我觉得问题出在会话,而不是设置。

您正确地inferredzh不是默认LANGUAGES设置的一部分,因此无法正常工作。

你在制作第一页时得到中文的原因是你打了一个相当于translation.activate("zh")的电话。此调用不检查LANGUAGES。它盲目地激活zh语言的翻译。如果文件是针对“zh”的,那就没有问题了。你可以做translation.activate("turnip"),只要“turnip”语言的文件存在,Django就可以了。。

它在随后的页面请求中不起作用的原因是locale middlewareLANGUAGES进行检查,并拒绝此处未列出的值:它将切换回您为站点配置的默认语言。

下面是说明这两种情况的代码:

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”或其变体。在我的系统上,输出是:

^{pr2}$

相关问题 更多 >

    热门问题