Django 的 get_current_language 奇怪行为
Django's get_current_language strange behavior
我想根据 settings.py 中定义的语言,将 html 标记中的 lang 属性设置为当前区域设置的语言。我不使用 LocaleMiddleware,用户无法选择语言。
(同一个页面我有不同的域名。如果有人想看不同语言的网站,用户必须去不同的网站)
settings.py
LANGUAGE_CODE = 'pl-PL'
USE_I18N = True
USE_L10N = True
LANGUAGES = [
('en', 'English'),
('de', 'German'),
('pl', 'Polish'),
('ru', 'Russian'),
('uk', 'Ukrainian'),
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'pipeline.middleware.MinifyHTMLMiddleware',
'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',
'django.contrib.redirects.middleware.RedirectFallbackMiddleware',
]
Django 版本
Django==2.0.9
模板
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% get_language_info for LANGUAGE_CODE as lang %}
<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE }}">
输出
如果我在没有交互的情况下刷新页面,我有时会得到:
- pl
- pl-pl
- pl-PL
为什么会这样?
您可以尝试使用 {{ lang.code }}
只获取 pl
部分(这取决于语言)。
在这种情况下,Django 从 Accept-Language HTTP header 获取用户语言偏好,它通常包含几种语言代码,具有优先级。
对于一种基本语言,它可能包含多个 language-codes,具体取决于您的系统区域设置、浏览器设置等;即 pl-PL,pl-pl,pl;q=0.7 其中 q 优先。
Django 解析 header 并根据优先级对语言代码进行排序。由于多个代码的优先级相同 - 它们将在每个请求的结果中以不同的顺序出现,并且将使用第一个。
我想根据 settings.py 中定义的语言,将 html 标记中的 lang 属性设置为当前区域设置的语言。我不使用 LocaleMiddleware,用户无法选择语言。
(同一个页面我有不同的域名。如果有人想看不同语言的网站,用户必须去不同的网站)
settings.py
LANGUAGE_CODE = 'pl-PL'
USE_I18N = True
USE_L10N = True
LANGUAGES = [
('en', 'English'),
('de', 'German'),
('pl', 'Polish'),
('ru', 'Russian'),
('uk', 'Ukrainian'),
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'pipeline.middleware.MinifyHTMLMiddleware',
'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',
'django.contrib.redirects.middleware.RedirectFallbackMiddleware',
]
Django 版本
Django==2.0.9
模板
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% get_language_info for LANGUAGE_CODE as lang %}
<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE }}">
输出
如果我在没有交互的情况下刷新页面,我有时会得到:
- pl
- pl-pl
- pl-PL
为什么会这样?
您可以尝试使用 {{ lang.code }}
只获取 pl
部分(这取决于语言)。
在这种情况下,Django 从 Accept-Language HTTP header 获取用户语言偏好,它通常包含几种语言代码,具有优先级。
对于一种基本语言,它可能包含多个 language-codes,具体取决于您的系统区域设置、浏览器设置等;即 pl-PL,pl-pl,pl;q=0.7 其中 q 优先。
Django 解析 header 并根据优先级对语言代码进行排序。由于多个代码的优先级相同 - 它们将在每个请求的结果中以不同的顺序出现,并且将使用第一个。