0

从我在 Django 文档中读到的内容来看,这就是 LocaleMiddleware 所做的:

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

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

否则,它会在当前用户的会话中查找 django_language 键。

如果做不到这一点,它会寻找一个 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/(如果没有这样的设置),并且还使用国际 url /en/、/bg/。还必须有一个语言切换选项。这样搜索引擎就不会有问题,我根本不会使用地理定位。

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

4

2 回答 2

0

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

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

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

于 2013-05-08T07:54:43.263 回答
0

I found this, that is very usefull:

Middleware that will force django to use settings.LANGUAGE_CODE for default language and not use 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']

Source: https://gist.github.com/vstoykov/1366794

于 2013-05-08T10:40:50.003 回答