2

現在、主に URL の国際化に取り組んでおり、カナダ フランス語 (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_languageCookie も送信しましたが、すべてが期待どおりに機能するため、Accept-Languageヘッダーを使用している場合にのみ問題が発生しているようです。**)


更新-短くて甘い答えは@ilvarによってすでに提供されています

ようやく Django のソースを掘り下げました(これは素晴らしいオープン ソースなので)。

ファイル[django/utils/translation/trans_real.py][1]は、私が見つけ、検証した、答えの場所です。

関数のスニペット、get_language_from_request350 行目は次のとおりです。

...
for path in all_locale_paths():
    if os.path.exists(os.path.join(path, dirname, 'LC_MESSAGES', 'django.mo')):
        _accepted[normalized] = lang
        return lang  
...  

はDjango インストール(サイト パッケージ内)のディレクトリにpath設定され、私の場合はリクエストからのロケール名です。そのため、Django のインストールにリクエストからのロケールが含まれていない場合、. conf/localedirnamefr-cafr-cafr

スニペットのすぐ上で、最初に URL 内で言語がチェックされ、i18n ルートを使用している場合は、次に言語 Cookie 内でチェックされます。どちらかに存在する場合、その言語コードはすぐに返されるため、その言語が Django インストール内に存在しなくても問題ありません。

2/3 のシナリオで別の方法で処理することは私を失望させましたが、ブラウザは何でも送信できるのである程度は理にかなっていますが、cookie|url を設定した場合、その時点でそれはあなたの問題です。

質問したにもかかわらず、答えてくれた@ilvarに感謝します;)私がしたことは、Djangoのロケール内でto を
コピーするだけでした...frfr_CA

4

1 に答える 1

4

Djangoは、同梱されているロケールのみを完全にサポートします。ただし、Django のライブラリ パスに必要なロケールを手動で追加できます (たとえば、またはからコピーします)。esfr

于 2012-05-25T05:48:41.613 に答える