我想使用 LocaleMiddleware 在模板层获取用户首选语言,为每种语言显示不同的内容。根据 django 文档,LocaleMiddleware 执行以下操作:
首先,它在请求的 URL 中查找语言前缀。仅当您在根 URLconf 中使用 i18n_patterns 函数时才会执行此操作。有关语言前缀以及如何国际化 URL 模式的更多信息,请参阅国际化:在 URL 模式中。
否则,它会在当前用户的会话中查找 django_language 键。
如果做不到这一点,它会寻找一个 cookie。使用的 cookie 的名称由 LANGUAGE_COOKIE_NAME 设置设置。(默认名称是 django_language。)
如果做不到这一点,它会查看 Accept-Language HTTP 标头。此标头由您的浏览器发送,并按优先级告诉服务器您喜欢哪种语言。Django 会尝试标题中的每种语言,直到找到具有可用翻译的语言。
否则,它将使用全局 LANGUAGE_CODE 设置。
当它使用 Accept-Language 标头时,它似乎工作正常。但是,当我访问 set_language 重定向时,LocaleMiddleware 开始失败并出现以下错误:
AttributeError at /
'NoneType' object has no attribute '_info'
如果我从中间件列表中排除 LocaleMiddleware 或清除浏览器 cookie,则错误不会再出现,直到我再次转到 set_language 重定向。
这是我的配置:
设置.py
LANGUAGE_CODE = 'en-us'
USE_I18N = True
LANGUAGES = (
('en', 'English'),
('es', 'Español'),
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
#Uncomment the next line for simple clickjacking protection:
#'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
以下模式指向 urls.py 中的 set_language 重定向:
(r'^i18n/', include('django.conf.urls.i18n')),
我已经阅读了一些关于类似错误和错误的信息,但没有一个能解决我的问题。有什么线索吗?