设置.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”语言?
您在使用
LocaleMiddleware
吗?请参阅:Django 如何发现语言偏好:
LocaleMiddleware 尝试通过以下方式确定用户的语言偏好 遵循这个算法:
首先,它在请求的 URL 中查找语言前缀。这是 仅当您在中使用 i18n_patterns 函数时执行 根 URLconf。 [...]
如果失败,它会寻找 cookie。 使用的 cookie 的名称由 LANGUAGE_COOKIE_NAME 设置 环境。 (默认名称是 django_language。)
如果失败,它会查看 Accept-Language HTTP 标头。这个标题 由您的浏览器发送并告诉服务器您使用哪种语言 更喜欢,按优先顺序排列。 Django 尝试标头中的每种语言 直到找到具有可用翻译的版本。
如果失败,它将使用全局 LANGUAGE_CODE 设置。
Locale Middleware 按以下顺序获取响应的语言代码:
django.conf.global_settings.LANGUAGE_COOKIE_NAME
请求对象中的cookieLANGUAGE_CODE
设置如果用户点击 / 并且浏览器上未设置语言 cookie,则
LocaleMiddleware
使用 Accept-Language 标头中的第一个兼容语言。这就是本例中错误的根源。
可行的解决方案是
LocaleMiddleware
。LocaleMiddleware
之前的自定义中间件,并在 request.COOKIES
字典中设置一个键。这有点 hacky 但它确实有效。您可以在发送响应时设置语言 cookie,并将其保存在浏览器上。为了确保您不会覆盖用户的设置,您可以检查会话的密钥是否存在,以检查语言代码 (django.utils.translation.LANGUAGE_SESSION_KEY
) 是否存在。