【问题标题】:Django Internationalization with GeolocationDjango 国际化与地理定位
【发布时间】:2013-05-08 07:39:47
【问题描述】:

根据我在 Django 文档中阅读的内容,这就是 LocaleMiddleware 所做的:

LocaleMiddleware 尝试通过以下算法确定用户的语言偏好:

首先,它在请求的 URL 中查找语言前缀。这是 仅在您使用 i18n_patterns 函数时执行 根 URLconf。有关更多信息,请参阅国际化:在 URL 模式中 有关语言前缀以及如何国际化 URL 的信息 模式。

如果失败,它会在当前用户的 会话。

如果失败,它会寻找一个 cookie。

使用的 cookie 的名称由 LANGUAGE_COOKIE_NAME 设置 环境。 (默认名称是 django_language。)

如果失败,它会查看 Accept-Language HTTP 标头。这个标题 由您的浏览器发送并告诉服务器您使用哪种语言 喜欢,按优先顺序排列。 Django 尝试标题中的每种语言 直到找到一个有可用翻译的。

否则,它将使用全局 LANGUAGE_CODE 设置。

我希望我的 django 项目检测用户国家并在选择默认语言时使用它?

如何做到这一点:

我有两个想法:

  • 编写一个新的中间件,在 LocaleMiddleware 之前执行,如果没有 cookie LANGUAGE_COOKIE_NAME 使用 django GeoLocation 设置它,则在此中间件中执行

  • 替换 LocaleMiddleware 而不是寻找 Accept-Language HTTP 标头来使用 django GeoLocation

你怎么看?

或者可能有其他更简单的方法?

编辑:我将有一个更改语言的选项,问题仅在于您第一次打开网站(任何页面,而不仅仅是首页)时。我现在正在考虑将 django_language 设置为默认网站语言 /bg/(如果没有这样的设置),并且还使用国际 urls /en/、/bg/。还必须有一个语言切换选项。这样搜索引擎就没有问题了,我根本不会使用地理定位。

编辑:还有一个问题是这里(在保加利亚)大多数浏览器标题都设置为更喜欢英语,这不是一个好的选择:(

【问题讨论】:

    标签: django internationalization geolocation


    【解决方案1】:

    实际上,总体而言,这不是一个好主意。您应该很少设置客户端的语言,这就是大多数网站使用可选语言表单的原因。 (标记按钮或可能的下拉选择)。

    LocaleMiddleware 沿着分层路径运行,很可能会选择正确的翻译(如果可用)。一个合适的解决方案是给你的客户一个表格来设置或切换他们的偏好。如果表单已处理,您可以填充 django_language 会话密钥。

    如果强制进行语言设置,爬虫也不会正确抓取页面。

    【讨论】:

    • 我会有一个更改语言的选项,问题是只有当您第一次打开网站时。我现在正在考虑将 django_language 设置为默认网站语言 /bg/(如果没有这样的设置),并且还使用国际 urls /en/、/bg/。还必须有一个语言切换选项。这样搜索引擎就没有问题了,我根本不会使用地理定位。
    • 还有一个问题,这里(在保加利亚)大多数浏览器的标题都设置为更喜欢英语,这不是一个好的选择:(
    【解决方案2】:

    我发现了这个,非常有用:

    将强制 django 使用 settings.LANGUAGE_CODE 作为默认语言而不使用 equest.META['HTTP_ACCEPT_LANGUAGE']

    的中间件
    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']
    

    来源:https://gist.github.com/vstoykov/1366794

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多