检测语言和django语言环境-url

问题描述:

我想部署一个英文网站&西班牙语并检测用户浏览器语言&重定向到正确的语言环境网站。检测语言和django语言环境-url

我的网站是www.elmalabarista.com

我安装django-localeurl,但我发现,语言不能正确检测。

这是我的中间件:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware',  
    'multilingual.middleware.DefaultLanguageMiddleware', 
    'middleware.feedburner.FeedburnerMiddleware', 
    'lib.threadlocals.ThreadLocalsMiddleware', 
    'middleware.url.UrlMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'maintenancemode.middleware.MaintenanceModeMiddleware', 
    'middleware.redirect.RedirectMiddleware', 
    'openidconsumer.middleware.OpenIDMiddleware', 
    'django.middleware.doc.XViewMiddleware', 
    'middleware.ajax_errors.AjaxMiddleware', 
    'pingback.middleware.PingbackMiddleware', 
    'localeurl.middleware.LocaleURLMiddleware', 
    'multilingual.flatpages.middleware.FlatpageFallbackMiddleware', 
    'django.middleware.common.CommonMiddleware', 
) 

但总是网站找到我们,尽管事实上我的OS &浏览器设置为西班牙语。

LANGUAGES = (
    ('en', ugettext('English')), 
    ('es', ugettext('Spanish')), 
) 
DEFAULT_LANGUAGE = 1 

然后,我砍区域设置的URL的中间件和做到这一点:

def process_request(self, request): 
    locale, path = self.split_locale_from_request(request) 
    if request.META.has_key('HTTP_ACCEPT_LANGUAGE'): 
     locale = utils.supported_language(request.META['HTTP_ACCEPT_LANGUAGE'].split(',')[0]) 
    locale_path = utils.locale_path(path, locale) 

    if locale_path != request.path_info: 
     if request.META.get("QUERY_STRING", ""): 
      locale_path = "%s?%s" % (locale_path, 
        request.META['QUERY_STRING']) 
     return HttpResponseRedirect(locale_path) 
    request.path_info = path 
    if not locale: 
     locale = settings.LANGUAGE_CODE 
    translation.activate(locale) 
    request.LANGUAGE_CODE = translation.get_language() 

然而,这种检测精细的语言,但是重定向“EN”的网址为“ES”。所以用英语导航是不可能的。

UPDATE:这是最后的代码为 “/” 的情况下的定位点(从卡尔迈耶输入后):

def process_request(self, request): 
    locale, path = self.split_locale_from_request(request) 
    if (not locale) or (locale==''): 
     if request.META.has_key('HTTP_ACCEPT_LANGUAGE'): 
      locale = utils.supported_language(request.META['HTTP_ACCEPT_LANGUAGE'].split(',')[0]) 
     else: 
      locale = settings.LANGUAGE_CODE 
    locale_path = utils.locale_path(path, locale) 
    if locale_path != request.path_info: 
     if request.META.get("QUERY_STRING", ""): 
      locale_path = "%s?%s" % (locale_path, request.META['QUERY_STRING']) 
     return HttpResponseRedirect(locale_path) 
    request.path_info = path 
    translation.activate(locale) 
    request.LANGUAGE_CODE = translation.get_language() 

更新:DJANGO-localeurl的LocaleURLMiddleware现在直接支持HTTP接受语言作为后备,如果LOCALEURL_USE_ACCEPT_LANGUAGE设置为True。所以OP的期望的行为是可无需编写自定义的中间件)。

它没有意义的同时拥有Django的内置LocaleMiddleware和LocaleURLMiddleware启用。它们旨在作为相互排斥的替代品,并且在选择语言时有不同的逻辑。 Locale-url完成它在锡上所说的内容:语言环境由URL组件定义(因此不由Accept-Language头部定义)。 Django的LocaleMiddleware将choose the language based on a session value or cookie or Accept-Language header。启用这两者意味着无论哪个人最后获胜,这就是您看到LocaleURLMiddleware行为的原因。

听起来也许你想要某种两个,其中选择初始语言(访问该网站的根网址是什么时候?)的组合的基础上接受语言,然后通过下面的网址定义?目前还不完全清楚你想要什么行为,所以澄清这是第一步。那么你可能需要编写你自己的LocaleMiddleware来实现这种行为。您首次尝试黑客入侵LocaleURLMiddleware时,始终使用Accept-Language代替URL中定义的内容。相反,您希望进一步向下检查Accept-Language头,在“if not locale:”部分中默认设置为.LANGUAGE_CODE。更像这样(未经测试的代码):

def process_request(self, request): 
    locale, path = self.split_locale_from_request(request) 
    locale_path = utils.locale_path(path, locale) 

    if locale_path != request.path_info: 
     if request.META.get("QUERY_STRING", ""): 
      locale_path = "%s?%s" % (locale_path, request.META['QUERY_STRING']) 
     return HttpResponseRedirect(locale_path) 
    request.path_info = path 
    if not locale: 
     if request.META.has_key('HTTP_ACCEPT_LANGUAGE'): 
      locale = utils.supported_language(request.META['HTTP_ACCEPT_LANGUAGE'].split(',')[0]) 
     else: 
      locale = settings.LANGUAGE_CODE 
    translation.activate(locale) 
    request.LANGUAGE_CODE = translation.get_language() 
+0

是的,我想BTOH的混合多国语言:获取defaul语言形式接受语言的第一次,但在那之后使用URL风格。 我不知道将它存储在cookie中是否也很重要......但我认为更好的行为是你描述的。 – mamcx 2009-10-07 14:54:41

+0

感谢您的意见。我把你的代码,但修复的情况下,“/” – mamcx 2009-10-07 17:42:41

+0

这是给我的错误。哪个文件我需要改变。它给出错误 区域设置,路径= self.split_locale_from_request(请求) – ha22109 2010-06-10 13:39:32

我也需要这种行为。 是您只使用自定义的中间件现在得到的语言或者你还在使用LocaleURLMiddleware和LocaleMiddleware结合在上面的代码中间件?

+0

我发现智能补丁localeurl将被合并到主干。它工作得很好。 http://code.google.com/p/django-localeurl/issues/detail?id=27&colspec=ID%20Type%20Status%20Priority%20Milestone%20Reporter%20Owner%20Summary – user276805 2010-02-24 15:16:35

实际上它应该是这样的:

可以有按优先顺序接受

def process_request(self, request): 
    locale, path = utils.strip_path(request.path_info) 
    if (not locale) or (locale==''): 
     if request.META.has_key('HTTP_ACCEPT_LANGUAGE'): 
     l = [x.strip()[:2] for x in request.META['HTTP_ACCEPT_LANGUAGE'].split(',')] 
     for lang_code in l: 
       locale = utils.supported_language(lang_code) 
       if locale: 
      break 
     else: 
      locale = settings.LANGUAGE_CODE 
    locale_path = utils.locale_path(path, locale) 
    if locale_path != request.path_info: 
     if request.META.get("QUERY_STRING", ""): 
      locale_path = "%s?%s" % (locale_path, 
        request.META['QUERY_STRING']) 
     return HttpResponseRedirect(locale_path) 
    request.path_info = path 
    if not locale: 
     try: 
      locale = request.LANGUAGE_CODE 
     except AttributeError: 
      locale = settings.LANGUAGE_CODE 
    translation.activate(locale) 
    request.LANGUAGE_CODE = translation.get_language()