7

我有一个想要国际化的 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',
  ...

我在 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。

4

2 回答 2

6

Django 根据 i18n 做事有一定的顺序。

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

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

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

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

祝你好运!

于 2009-11-03T10:20:46.247 回答
1

从此页面获取,您可以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']
于 2019-06-17T12:16:27.013 回答