13

プロジェクトを国際化したいと思っています。公式ドキュメントに記載されている方法に従いましたが、ローカリゼーションはまだ機能しません。ユーザーロケールを取得する方法は次のとおりです。

def get_locale_name(request):
    """ Return the :term:`locale name` associated with the current
    request (possibly cached)."""
    locale_name = getattr(request, 'locale_name', None)
    if locale_name is None:
       locale_name = negotiate_locale_name(request)
       request.locale_name = locale_name
   return locale_name

ただしrequest、attr "local_name"はありませんが、 "Accept-Language"があるため、関数get_local_nameがリクエストで "local_name"を見つけられない場合は、別の関数を呼び出します。

def negotiate_locale_name(request):
    """ Negotiate and return the :term:`locale name` associated with
    the current request (never cached)."""
    try:
        registry = request.registry
    except AttributeError:
        registry = get_current_registry()
    negotiator = registry.queryUtility(ILocaleNegotiator,
                                       default=default_locale_negotiator)
    locale_name = negotiator(request)

   if locale_name is None:
        settings = registry.settings or {}
        locale_name = settings.get('default_locale_name', 'en')

   return locale_name

グローバル環境からローカルを取得しようとしているのをどのように確認できnegotiatorますが、それができない場合は、configから設定値を取得します。そして、Pyramidがリクエストのフィールド「Accept-Language」から直接ロケールを取得しない理由を理解できませんか?

そして、どうすればロケールを正しく判断できますか?

4

3 に答える 3

15

ピラミッドは、ロケールのネゴシエーション方法を指示しません。サイトの言語を「Accept-Language」ヘッダーに基づいていると、ほとんどのユーザーが好みのブラウザ言語を設定する方法を知らないため、問題が発生する可能性があります。ユーザーが言語を簡単に切り替えられるようにし、Cookieを使用して将来の訪問のためにその設定を保存できるようにします。

_LOCALE_リクエストにキーを設定するか(たとえば、イベントハンドラーを介して)、独自のカスタムロケールネゴシエーターを提供する必要があります。

NewRequest次に、イベントと、 webobクラスのインスタンスであるaccept_languageヘッダーを使用した例を示します。Accept

from pyramid.events import NewRequest
from pyramid.events import subscriber

@subscriber(NewRequest)
def setAcceptedLanguagesLocale(event):
    if not event.request.accept_language:
        return
    accepted = event.request.accept_language
    event.request._LOCALE_ = accepted.best_match(('en', 'fr', 'de'), 'en')
于 2012-06-30T13:52:35.570 に答える
2

request._LOCALE_機能するのは、デフォルトでロケール ネゴシエーターがdefault_locale_negotiator. 非常に複雑なチェックがある場合、たとえば Cookie が存在しない場合に DB からユーザーをフェッチする必要がある場合、NewRequest ハンドラーには、変換を必要としないリクエストのオーバーヘッドがあります。それらについては、次のようなカスタム ロケール ネゴシエーターを使用することもできます。

def my_locale_negotiator(request):
    if not hasattr(request, '_LOCALE_'):
        request._LOCALE_ = request.accept_language.best_match(
            ('en', 'fr', 'de'), 'en')

    return request._LOCALE_


from pyramid.config import Configurator
config = Configurator()
config.set_locale_negotiator(my_locale_negotiator)
于 2012-07-02T07:44:31.537 に答える