【问题标题】:How do I tell why Django is ignoring the Accept-Language header?如何判断 Django 忽略 Accept-Language 标头的原因?
【发布时间】:2010-12-12 03:18:00
【问题描述】:

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

settings.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',
  ...

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

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

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

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

我看到了this question,但对我没有帮助。

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

【问题讨论】:

  • Django 首先查找名为django_language 的cookie。您是否尝试过清除 cookie?

标签: django google-app-engine internationalization google-app-engine-patch


【解决方案1】:

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

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

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

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

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

祝你好运!

【讨论】:

  • 我很欣赏这种解释,但有没有办法判断这些东西中的哪一个实际上是匹配的?我可以完成您描述的所有歌曲和舞蹈,但仍然不确定导致问题的原因。
  • 我假设您已经清除了会话和 cookie,但它仍然不起作用?我从来没有真正需要进一步调查它,因为 Django i18n 一直对我很好,至少在 1.0 及更高版本中。
  • 这是不准确的:settings.LANGUAGE_CODE 是最后被检查的东西:github.com/django/django/blob/stable/1.4.x/django/utils/…
  • 感谢丹尼尔森的更正。我绝对应该根据代码的顺序来解释它。如果只是忽略执行顺序,我认为这个解释仍然成立。
【解决方案2】:

取自this page,您可以从请求中删除HTTP_ACCEPT_LANGUAGE,然后使用LocaleMiddleware

class ForceDefaultLanguageMiddleware(object):
    """
    Ignore Accept-Language HTTP headers

    This will force the I18N machinery to always choose settings.LANGUAGE_CODE
    as the default initial language, unless another one is set via sessions or cookies

    Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'],
    namely django.middleware.locale.LocaleMiddleware
    """

    def process_request(self, request):
        if request.META.has_key('HTTP_ACCEPT_LANGUAGE'):
            del request.META['HTTP_ACCEPT_LANGUAGE']

【讨论】:

  • 我收到此错误:'dict' object has no attribute 'has_key'
  • @Flimm 因为在那个 Django 版本中它不是字典。替换为if "HTTP_ACCEPT_LANGUAGE" in request.META:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 2013-02-10
  • 2017-10-31
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多