私は自分のプロジェクトの国際化を行いたいと思います。私はそれが公式の文書に記載されている方法に従ったが、ローカリゼーションはまだ機能しない。Pyramidでユーザー言語を決定する
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」を持っていますが、機能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
は、地球環境からローカル取得しようとするが、それは設定からその設定値これを行うに傾けるかどうかを確認することができます、それは別の関数を呼び出します。 そして、なぜピラミッドがリクエストのフィールド「Accept-Language」から直接ロケールを取得しないのか理解できませんか?
そして、どうすればロケールを正しく決定できますか?
しかし、accept_language原因accept_languageはAccept()のallreadyインスタンスであり、best_match()メソッド自体は持っているオブジェクトを作成する必要はありません。それは多くのおかげでピラミッドバージョン1.2を試しています – Denis
@Denis:あなたは確かに正しいです; 'accept_language'はすでに' Accept'のインスタンスです。修正されました。 –
@Martijin Pietersとにかくありがとう、すべて正常に動作します)) – Denis