Django如何在i18n_patterns中设置默认语言?

时间:2017-03-02 10:56:54

标签: python django

settings.py

from django.utils.translation import ugettext_lazy as _
LANGUAGE_CODE = 'hi'
# list of activated languages
LANGUAGES = (
    ('hi', _('Hindi')),
    ('en', _('English')),
)

urls.py

urlpatterns += i18n_patterns(
    url(r'^', include('howdy.urls')),
    url(r'^', include('accounts.urls')),
    url(r'^admin/', admin.site.urls),
    url(r'^i18n/', include('django.conf.urls.i18n')),
    url(r'^accounts/', include('allauth.urls'))
)

中间件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'django.middleware.locale.LocaleMiddleware',
]

所以我在这里设置的默认值是"hi",但每当我点击URL [私人模式]而不添加任何语言时,它会重新定向" en"在网址中,而不是" hi"。我在这里缺少的是使它默认指向" hi"语言?

2 个答案:

答案 0 :(得分:1)

您使用的是LocaleMiddleware吗?请参阅:How Django discovers language preference

  

LocaleMiddleware尝试通过以下方式确定用户的语言首选项   遵循此算法:

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

  •   
  • 如果失败,它会查找当前的LANGUAGE_SESSION_KEY键   用户会话。

  •   
  • 如果失败,就会找到一个cookie。   使用的Cookie名称由LANGUAGE_COOKIE_NAME设置   设置。 (默认名称为django_language。)

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

  •   
  • 如果失败,则使用全局LANGUAGE_CODE设置。

  •   

答案 1 :(得分:0)

Locale Middleware 按以下顺序获取响应的语言代码:

  • 在 urlpatterns 中使用 i18n_patterns 时的 URL 语言前缀 (/en/,/hi/)
  • django.conf.global_settings.LANGUAGE_COOKIE_NAME 请求对象中的 cookie
  • 接受语言 HTTP 标头
  • LANGUAGE_CODE 设置

如果用户点击 / 并且浏览器上未设置语言 cookie,则 LocaleMiddleware 使用 Accept-Language 标头中的第一个兼容语言。在这种情况下,这就是错误的来源。

可行的解决方案是

  1. 如果不影响您的开发,请删除 LocaleMiddleware
  2. 创建一个位于 LocaleMiddleware 之前的自定义中间件,并在 request.COOKIES 字典中设置一个键。这有点hacky,但它有效。您可以在发送响应时设置语言 cookie,并将其保存在浏览器中。为确保您不会覆盖用户的设置,您可以检查会话的密钥是否存在以检查语言代码 (django.utils.translation.LANGUAGE_SESSION_KEY) 是否存在。