2

一部の言語の翻訳済みURLを設定しました。djangoのデフォルト言語はen-USに設定されています。

Accept-Languageヘッダーとしてnl-NLを使用してページ/registration/を要求すると、404が返されます。そのような動作は予期していませんでした。むしろ、Accept-Languageヘッダーに対応する翻訳されたURLである/registratie/にリダイレクトされることを望んでいました。もちろん、nl-NlAccept-Languageヘッダーを持つ/registratie /は正常に機能し、期待される200を提供します。

私はこれが得ることができるのと同じくらい正常だと思いますか?

ユーザーが何らかのWebサイトからリンクを取得し、リンクが英語用に作成されている可能性はありませんが、問題のユーザーは、サポートされている言語設定が異なるAccept-Languageヘッダーを持っていますか?このような場合、彼には404が表示されます。英語(デフォルト)のコンテンツが表示されるか、サポートされている場合は、その言語の正しいURLにリダイレクトされる必要があります。

また、ユーザーがサポートされていない言語設定を持っている場合はどうなりますか?djangoのデフォルトLANGUAGE_CODEが使用されますか?私の場合はen-USですか?

これを回避する方法、または別のより良い方法で処理する方法はありますか?

urls.pyファイルからの抜粋は、翻訳されたURLをどのように設定したかを示しています。

url(_(r'^step1/$'), AccountTypeSelectionView.as_view(), name="registration_step1"),
4

1 に答える 1

2

私は_がugettext_lazyであるというワイルドな仮定をしています。

また、ユーザーがサポートされていない言語設定を持っている場合はどうなりますか?djangoのデフォルトのLANGUAGE_CODEが使用されますか?私の場合はen-USですか?

はい、特定の値が設定されていない場合、ugettextはデフォルト値を使用します。この動作は、django.utils.translation.trans_realのdo_translateで確認できます。

ugettext_lazyで発生するのは、URLが検索される直前に、URLがユーザーの言語に翻訳され、URLの一部がこれらすべてに対してチェックされることです。(Djangoは、ユーザーの選択を反映するように変更されたスレッドごとの言語設定を使用します。)

ユーザーが何らかのWebサイトからリンクを取得し、リンクが英語用に作成されている可能性はありませんが、問題のユーザーは、サポートされている言語設定が異なるAccept-Languageヘッダーを持っていますか?このような場合、彼には404が表示されます。英語(デフォルト)のコンテンツが表示されるか、サポートされている場合は、その言語の正しいURLにリダイレクトされる必要があります。

はい、それはサポートされている機能であるはずですが、ソースをざっと見てみると、これに対応するためにURL解決を少し変更する必要があるように見えました。

できることは、カスタム404ページを使用することです(ここでエラービューのカスタマイズで簡単に説明します)。

あなたのurls.pyで:

handler404 = 'mysite.views.i18n_retry'

とビューで

from django.utils.translation import override
from django.core.urlresolvers import resolve
def i18n_retry(request):
    for language in settings.LANGUAGES:
        with override(language, deactivate=True):
           try:
              result = resolve(request.path)
              #here you will know what language the url is in
              #if it is a supported format
              #and can do something smart about it
           except Http404:
              #Http404 is thrown whenever resolving fails
              pass
     #here you should probably return a real 404

Django1.4のオーバーライドコンテキストマネージャーを使用しました。しかし、それなしで同じことをするより長い方法があります。

于 2012-07-09T17:37:32.847 に答える