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

问题描述 投票:0回答:2

设置.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[私有模式] 而不在其中附加任何语言时,它会在 URL 中使用“en”而不是“hi”进行重定向。我在这里缺少什么来使其默认指向“hi”语言?

python django
2个回答
4
投票

您在使用

LocaleMiddleware
吗?请参阅:Django 如何发现语言偏好

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

  • 首先,它在请求的 URL 中查找语言前缀。这是 仅当您在中使用 i18n_patterns 函数时执行 根 URLconf。 [...]

  • 如果失败,它会寻找 cookie。 使用的 cookie 的名称由 LANGUAGE_COOKIE_NAME 设置 环境。 (默认名称是 django_language。)

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

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


1
投票

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
    ) 是否存在。
© www.soinside.com 2019 - 2024. All rights reserved.