加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

检测语言&django locale-url

发布时间:2020-12-20 12:15:44 所属栏目:Python 来源:网络整理
导读:我想用英语和英语部署一个网站西班牙语并检测用户浏览器语言重定向到正确的区域设置站点. 我的网站是www.elmalabarista.com 我安装了django-localeurl,但我发现没有正确检测到该语言. 这是我的中间件: MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.mid
我想用英语和英语部署一个网站西班牙语并检测用户浏览器语言&重定向到正确的区域设置站点.

我的网站是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

然后,我破解了locale-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”URL重定向到“es”.所以不可能用英语导航.

更新:这是最终代码(在Carl Meyer的输入之后)修复了“/”的情况:

def process_request(self,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",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 Accept-Language作为后备,如果LOCALEURL_USE_ACCEPT_LANGUAGE设置为True.那么OP的所需行为现在可用而无需编写自定义中间件).

同时启用Django的内置LocaleMiddleware和LocaleURLMiddleware是没有意义的.它们旨在作为相互排斥的替代方案,并且在选择语言方面具有不同的逻辑. Locale-url在tin上执行它所说的内容:locale由URL组件定义(因此不是由Accept-Language标头定义). Django的LocaleMiddleware将是choose the language based on a session value or cookie or Accept-Language header.启用这两个只意味着最后一个获胜,这就是你看到LocaleURLMiddleware行为的原因.

听起来好像你想要两种混合,其中初始语言(当访问网站的根URL时?)是基于Accept-Language选择的,然后由URL定义?现在还不完全清楚你想要什么样的行为,所以澄清这是第一步.然后,您可能需要编写自己的LocaleMiddleware来实现该行为.您第一次尝试黑客攻击LocaleURLMiddleware总是使用Accept-Language代替URL中定义的内容.相反,您需要在“if not locale:”部分中进一步检查Accept-Language标题,默认为settings.LANGUAGE_CODE.更像这样的东西(未经测试的代码):

def process_request(self,path = self.split_locale_from_request(request)
    locale_path = utils.locale_path(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()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读