从我在 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/。还必须有一个语言切换选项。这样搜索引擎就不会有问题,我根本不会使用地理定位。
编辑:还有这个问题,这里(在保加利亚)大多数浏览器标题都设置为更喜欢英语,这不是一个好的选择:(