Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django国际化与地理定位_Django_Internationalization_Geolocation - Fatal编程技术网

Django国际化与地理定位

Django国际化与地理定位,django,internationalization,geolocation,Django,Internationalization,Geolocation,根据我在Django文档中所读到的内容,LocaleMiddleware就是这样做的: LocaleMiddleware尝试通过以下算法确定用户的语言偏好: 首先,它在请求的URL中查找语言前缀。这是 仅当您在应用程序中使用i18n_patterns函数时执行 根URLconf。有关更多信息,请参见URL模式中的国际化 有关语言前缀和如何国际化URL的信息 模式 否则,它将在当前用户的 会议 如果做不到这一点,它会寻找一块饼干 使用的cookie的名称由语言\u cookie\u name设置

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

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

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

否则,它将在当前用户的 会议

如果做不到这一点,它会寻找一块饼干

使用的cookie的名称由语言\u cookie\u name设置 背景(默认名称为django_语言。)

否则,它将查看Accept Language HTTP头。此标题 由浏览器发送,并告诉服务器您使用哪种语言 优先权,按优先顺序排列。Django尝试标头中的每种语言 直到它找到一个可用的翻译

否则,它将使用全局语言代码设置

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

如何做到这一点:

我有两个想法:

  • 编写一个新的中间件,在LocaleMiddleware之前执行,如果没有cookie语言\u cookie\u名称,则在该中间件中使用django GeoLocation进行设置

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

你觉得怎么样

或者有没有其他更简单的方法


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


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

实际上,总体来说这不是一个很好的主意。你应该很少想为客户端设置语言,这就是为什么大多数网站使用可选的语言形式。(标记按钮或可能是下拉选择)

LocaleMiddleware
沿着分层路径运行,最有可能选择正确的翻译(如果可用)。正确的解决方案是向客户提供一个表单来设置或切换他们的首选项。如果处理表单,您可以填充
django_语言
会话键


此外,如果强制使用语言设置,爬虫程序也不会正确地刮取页面。

我发现这一点非常有用:

将强制django使用默认语言的settings.LANGUAGE\u代码而不使用equest.META['HTTP\u ACCEPT\u 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']

来源:

我有一个更改语言的选项,只有当你第一次打开网站时才有问题。我现在正在考虑将django_语言设置为默认网站语言/bg/(如果没有这样的设置)也可以使用国际URL/en/,/bg/。还必须有一个语言切换选项。这样搜索引擎就不会有问题,我也不会使用地理位置。还有一个问题是,在保加利亚,大多数浏览器的标题都设置为更喜欢英语,这不是一个好的选项:(