3

i18n ローカリゼーションを使用しようとしましたが、行き詰まりました。

私が使用する場合:

I18n i18n = new I18n(slingRequest);
i18n.get("myMessage");

私はいつもキーの英語のメッセージを受け取ります: myMessage.

accept-language ヘッダーには、次の値が表示されます: de,en;q=0.5

しかし:

  • request.getLocale() の戻り値: en

  • request.getLocales() の戻り値: en

以下のコードを使用すると、すべて問題ありません。

Locale myLocale = new Locale("de");    
ResourceBundle resourceBundle = slingRequest.getResourceBundle(myLocale);   
I18n i18n = new I18n(resourceBundle);

「accept-language」リクエストヘッダーを cq で読み取らないのはなぜですか?

ps: スタンドアロンの cq jar を使用しています...

前もって感謝します!

4

2 に答える 2

4

CQ/Sling (5.6 以降) は、取得した(または暗黙的にそのロケールを使用する) ロケールの Accept-Language ヘッダーを読み取ら、代わりにユーザーの言語設定 ( JCR 内) または構成可能なデフォルト (1) を使用します。 .slingRequest.getLocale()slingRequest.getResourceBundle(null)~/preferences/@language

その理由は、言語ヘッダーを推測するよりも、デバイス間で異なるブラウザーを使用する場合でも、固定設定の方がはるかに安定しているからです。

ただし、拡張可能です。(2)の値を提供するサービスであるカスタムorg.apache.sling.i18n.RequestLocaleResolverサービス (より高いサービス ランク) をフックできます。slingRequest.getLocale()これは、受け入れ言語も考慮に入れることができます。基になるサーブレット リクエスト オブジェクトにアクセスし、Accept-Language ヘッダー値を提供する必要がありますgetLocale()(getLocales()少なくとも CQ の組み込みサーブレット エンジンは 5.4 以降でこれを行います)。

(1) このサービスでデフォルトのロケールを構成します。http://localhost:4502/system/console/configMgr/org.apache.sling.i18n.impl.JcrResourceBundleProvider

(2) スタック トレースでおそらく見たことがある SlingI18nFilterは、すでにすべての魔法を実行し、 andサービスを使用してslingRequest.getLocale()andslingRequest.getResourceBundle()実装を提供する要求をラップします。RequestLocaleResolverResourceBundleProvider

于 2013-05-23T16:35:42.003 に答える
0

最初のコード例のコピーは貼り付けられていますか?サンプルがコードから貼り付けられている場合は、キーのタイプミスが問題である可能性があります。これは、例の言語キーが「myMesage」であり、投稿の後半で示されている「myMessage」ではないためです。

于 2012-12-20T20:47:19.370 に答える