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

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

但是尽管我的操作系统和浏览器设置是西类牙语,但该站点始终会到达美国。
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”网址重定向到“es”。所以用英语导航是不可能的。

更新:这是最终代码(在 Carl Meyer 的输入之后),修复了“/”的情况:
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 Accept-Language 作为后备,如果 LOCALEURL_USE_ACCEPT_LANGUAGE 设置为 True。因此现在无需编写自定义中间件即可使用 OP 所需的行为)。

同时启用 Django 的内置 LocaleMiddleware 和 LocaleURLMiddleware 是没有意义的。它们旨在作为相互排斥的替代方案,并且在选择语言时具有不同的逻辑。 Locale-url 做它在锡上所说的:语言环境由 URL 组件定义(因此不是由 Accept-Language header 定义)。 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 中定义的内容。相反,您想进一步检查 Accept-Language header ,在默认为 settings.LANGUAGE_CODE 的“if not locale:”部分中。更像这样的东西(未经测试的代码):

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()

关于django - 检测语言和 django locale-url,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1527997/

10-13 04:38