gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:01:43 24 4
gpt4 key购买 nike

致力于国际化,现在主要是 url,一个站点和除加拿大法语 (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')),
)

网址.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 已经提供了简短而贴心的答案

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

就在代码段上方,如果您使用国际化路由,首先会在 URL 中检查语言,然后在语言 cookie 中检查。如果它存在,那么该语言代码将立即返回,因此 Django 安装中是否存在该语言并不重要。

对于 2/3 的场景以不同方式处理它是让我失望的原因,但在某种程度上是有道理的,因为浏览器可以发送任何内容,但如果您设置了 cookie|url,那么这就是您的问题了。

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

最佳答案

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com