Django国际化问题与fr-ca,es-us

时间:2012-05-24 20:17:06

标签: python django internationalization

正在进行国际化,主要是现在的网址,一个网站,除了加拿大法语(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标题时遇到问题。**)< / p>


更新 - @ilvar已经提供了简短而又甜蜜的答案

很好,我终于挖到了Django源(因为它非常开源,所有)

文件[django/utils/translation/trans_real.py][1]是我找到,验证的答案。

以下是函数get_language_from_request的第45行:

...
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 install conf/locale目录(在site-packages中)dirname是请求中的区域设置名称,就我而言fr-ca。因此,如果Django安装不包含请求中的区域设置(它没有fr-ca),它将恢复为fr

如果你正在使用i18n路由,那么首先在URL中检查语言,然后在语言cookie中。如果它存在,则立即返回语言代码,因此Django安装中不存在该语言无关紧要。

对于2/3场景以不同方式处理它会让我失望,但是因为浏览器可以发送任何内容而有所帮助,但是如果你设置了一个cookie | url那么那就是你的问题。

感谢@ilvar的答案,即使我质疑它;)
我所做的只是将fr复制到fr_CA,在Django的区域内,瞧...

1 个答案:

答案 0 :(得分:4)

Django完全supports only语言环境,它是shipped with。但您可以在Django的库路径中手动添加必要的语言环境(例如,从esfr复制它们)。