2013-05-08 89 views
0

从我的Django文档阅读,这是LocaleMiddleware做什么:Django的国际化与地理位置

LocaleMiddleware试图通过下面这个算法来确定用户的语言首选项:

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

如果失败,它会在当前用户的 会话中查找django_language键。

如果没有,它会寻找一个cookie。

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

如果失败,它将查看Accept-Language HTTP标头。这个头文件 由您的浏览器发送,并通过优先顺序告诉服务器您偏好哪种语言(s)。 Django尝试使用标题 中的每种语言,直到找到包含可用翻译的语言。

失败的是,它使用全局LANGUAGE_CODE设置。

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

如何做到这一点:

我心里有两个想法:

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

  • 更换LocaleMiddleware和,而不是寻找的Accept-Language HTTP标头使用Django GeoLocation中

您怎么看?

或者可能还有另一种更简单的方法?

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

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

回答

0

其实它不是整体一个非常好的主意。您应该很少希望设置为客户端的语言,这就是为什么大多数网站使用可选的语言表单。 (标志按钮或可能的下拉选择)。

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

如果强制进行语言设置,爬网程序也不会正确地刮页。

+0

我将可以选择更改语言,问题仅在您第一次打开网站时出现。我现在正在考虑为默认网站语言/ bg /(如果没有这样的设置)设置django_language,并且还使用国际urls/en /,/ bg /。也必须有语言切换选项。这样,搜索引擎就没有问题,我根本不会使用地理定位。 – 2013-05-08 08:24:50

+0

也有这个问题,在这里(在保加利亚)大多数浏览器标题设置为更喜欢英语语言,这不是一个好的选择:( – 2013-05-08 08:32:41

0

我发现这一点,这是非常有用的:

中间件,这将迫使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