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"语言?
答案 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 按以下顺序获取响应的语言代码:
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
) 是否存在。