我怎么知道为什么 Django 忽略 Accept-Language 标头?

dfr*_*kow 5 django google-app-engine internationalization google-app-engine-patch

我有一个想要国际化的 Django 应用程序(在 Google App Engine 上)。

设置.py:

USE_I18N = True
LANGUAGE_CODE = 'en'

# Restrict supported languages (and JS media generation)
LANGUAGES = (
  ('en', 'English'),
  ('fr', 'French'),
)

MIDDLEWARE_CLASSES = (
  'ragendja.middleware.ErrorMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  # i18n
  'django.middleware.locale.LocaleMiddleware',
  ...
Run Code Online (Sandbox Code Playgroud)

我在 locale/fr/LC_MESSAGES 中为我​​的应用程序生成了 .po 和 .mo 文件(虽然不是在全局级别)。

我将浏览器的 Accept-Language 标题设置为“fr”,Django 忽略它。当我查看 request.LANGUAGE_CODE 时,它总是“en”。

我可以判断浏览器是正确的,因为我访问了其他一些支持 i18n 的站点,它返回法语。

我如何找到 Django 认为我的设置缺少的内容?

我看到了这个问题,但对我没有帮助。

我在 Google App Engine 上使用应用引擎补丁 1.0.2.2 运行 Django 1.0。

lem*_*nad 6

Django 在 i18n 方面做事有一定的顺序。

首先它检查LANGUAGE_CODE. 这是站点范围的语言,如果没有其他设置,这就是用户获得的语言。

其次,由于您添加了LocaleMiddleware,它会检查django_language用户会话中是否设置了 。我建议清除数据库中的会话信息或创建一个全新的用户来尝试。

第三,它检查是否有django_languagecookie 集(或者,实际上,cookie 的名称由 定义LANGUAGE_COOKIE_NAME)。我建议删除这个cookie。

第四,它查找Accept-LanguageHTTP 标头。这是您的浏览器设置的来源。

祝你好运!

  • 这是不准确的:`settings.LANGUAGE_CODE` 是最后检查的东西:https://github.com/django/django/blob/stable/1.4.x/django/utils/translation/trans_real.py#L366 (7认同)