2

我想使用 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')),

我已经阅读了一些关于类似错误和错误的信息,但没有一个能解决我的问题。有什么线索吗?

4

1 回答 1

1

这是 Django 的说法“未找到所请求语言的翻译”。

你有没有运行编译消息?

于 2012-08-30T00:31:44.480 回答