致力于国际化,主要是现在的网址,一个网站,除了加拿大法语(fr-ca)和美国西班牙语(es-us)之外,所有内容似乎都在工作。
我正在使用 Django 1.4
settings.py
已django.middleware.locale.LocaleMiddleware
为已安装的中间件
我的语言列表是:
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('en-gb', ugettext('English United Kingdom')),
('es', ugettext('Spanish')),
('es-us', ugettext('Spanish United States')),
('fr', ugettext('French')),
('fr-ca', ugettext('French Canada')),
)
urls.py:
from django.conf.urls.defaults import patterns, include
from django.conf.urls.i18n import i18n_patterns
urlpatterns = patterns('myapp',
(r'^example/?$', 'main.views.example'),
(r'^$', 'main.views.index'),
(r'', include('myapp.main.urls')),
)
urlpatterns += i18n_patterns('myapp.main.views',
(r'^example/?$', 'example'),
(r'^example_1/?$', 'example1'),
(r'^example_2/?$', 'example2'),
(r'^$', 'index'),
)
我跑了
# django-admin.py makemessages -l en
# django-admin.py makemessages -l en-GB
# django-admin.py makemessages -l fr
# django-admin.py makemessages -l fr_CA
# django-admin.py makemessages -l es
# django-admin.py makemessages -l es_US
#
# django-admin.py compilemessages
这就是我得到的:
| Accept-Language Header | Response Language | Expected Language |
|--------------------------------------|--------------------|--------------------|
| fr-ca;q=0.9, fr;q=0.8 | fr | fr-ca |
| fr-ca;q=0.9 | fr | fr-ca |
| | | |
| es-us;q=0.9, es-mx;q=0.8, es;q=0.7 | es | es-us |
| es-us;q=0.9 | es | es-us |
| | | |
| en-gb;q=0.8, en-us;q=0.7, en;q=0.6 | en-gb | en-gb |
| en-us;q=0.9 | en | en |
| | | |
| fr-ca;q=0.8, en-gb;q=0.7 | fr | fr-ca |
| fr-ca;q=0.7, en-gb;q=0.8 | en-gb | en-gb |
|--------------------------------------|--------------------|--------------------|
如果我将区域设置代码放在 URL 中,则会收到正确的区域设置响应:
http://localhost:8000/fr-ca/ I get fr-ca text back
http://localhost:8000/fr/ I get fr text back
http://localhost:8000/en/ I get en text back
http://localhost:8000/en-gb/ I get en-gb text back
http://localhost:8000/es-us/ I get es-us text back
http://localhost:8000/es/ I get es text back
http://localhost:8000/ I get en text back _(Default in settings.py)_
en-gb 按预期工作,在最后一个请求中返回而不是更高的优先级 fr-ca。
我只是错过了什么,还是 fr-ca/es-us 只是无法使用 Django?
(** 我还发送了默认的 django_language
cookie,一切都按预期工作,所以看起来我只是在使用 Accept-Language
标头时才遇到问题。
更新 - @ilvar已经提供了简短而甜蜜的答案
Awright,我终于深入研究了 Django 源代码(因为它是非常开源的,而且所有)
文件[django/utils/translation/trans_real.py][1]
是我找到并验证答案的地方。
下面是函数 get_language_from_request
第 350 行的片段:
...
for path in all_locale_paths():
if os.path.exists(os.path.join(path, dirname, 'LC_MESSAGES', 'django.mo')):
_accepted[normalized] = lang
return lang
...
path
设置为Django安装的conf/locale
目录(在站点包中),dirname
是请求中的语言环境名称,在我的情况下fr-ca
。因此,如果 Django 安装不包含来自请求的语言环境,它没有 fr-ca
,它将恢复为一个,即 fr
.
如果您使用的是 i18n 路由,则首先在代码段上方检查语言,然后在语言 cookie 中检查语言。如果它存在于任何一个中,那么该语言代码将立即返回,因此该语言在 Django 安装中不存在并不重要。
对于 2/3 场景,以不同的方式处理它让我失望,但这是有道理的,因为浏览器可以发送任何东西,但如果你设置了一个 cookie|url,那么在这一点上这就是你的问题。
谢谢@ilvar的回答,即使我对此提出质疑;)
我所做的只是将fr
复制到 fr_CA
中,在 Django 的语言环境中,瞧......
Django 完全支持它附带的语言环境。但是你可以在 Django 的库路径中手动添加必要的语言环境(例如,从 es
或 fr
复制它们)。