python - Django fr-ca、es-us 国际化问题

标签 python django internationalization

致力于国际化,现在主要是网址,一个网站,除了加拿大法语 (fr-ca) 和美国西类牙语 (es-us) 之外,一切似乎都正常。

我使用的是 Django 1.4

settings.pydjango.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')),
)  

url.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 header 时遇到了这个问题。**)


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

好吧,我终于深入研究了 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设置为conf/locale Django 安装目录(在站点包中)dirname是请求中的区域设置名称,在我的例子中 fr-ca 。因此,如果 Django 安装不包含请求中的区域设置(它没有 fr-ca) ,它将恢复为 fr

在代码片段上方,如果您使用的是 i18n 路由,则首先在 URL 中检查语言,然后在语言 cookie 中进行检查。如果它存在于其中任何一个中,那么该语言代码将立即返回,因此如果该语言在 Django 安装中不存在也没关系。

对于 2/3 的情况以不同的方式处理它是让我失望的,但这是有道理的,因为浏览器可以发送任何内容,但如果你设置了 cookie|url 那么此时这是你的问题。

感谢@ilvar的回答,尽管我对此提出质疑;)
我所做的只是复制 frfr_CA ,在 Django 的语言环境中,瞧...

最佳答案

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

关于python - Django fr-ca、es-us 国际化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10744684/

相关文章:

python - 使用 python 操作原始二进制图像数据

python - 计算有限制的字符串的子串

python - Django Rest 框架中的 POST 方法在 EC2 实例上返回服务器错误 500

internationalization - 在 Phoenix 框架中使用 hex linguist 包

perl - 如何在 ActiveState Perl 中获取正确的非 ASCII 命令行参数?

python - 在 python 脚本中使用 slurm 创建作业,迭代列表中的项目

python - 按百/个对列表进行排序

python - mod_wsgi 启动时速度过慢?

python - 如何在 Django 测试框架中修改 session

Python 的 string.maketrans 在家工作但在 Google App Engine 上失败