ロケール
Spring のアーキテクチャのほとんどの部分は、Spring Web MVC フレームワークがサポートするように、国際化をサポートしています。DispatcherServlet
では、クライアントのロケールを使用してメッセージを自動的に解決できます。これは、LocaleResolver
オブジェクトを使用して行われます。
リクエストが受信すると、DispatcherServlet
はロケールリゾルバーを探し、見つかった場合はそれを使用してロケールを設定しようとします。RequestContext.getLocale()
メソッドを使用すると、ロケールリゾルバーによって解決されたロケールを常に取得できます。
自動ロケール解決に加えて、インターセプターをハンドラーマッピングにアタッチして(ハンドラーマッピングインターセプターの詳細についてはインターセプトを参照)、特定の状況(たとえば、リクエストのパラメーターに基づいて)でロケールを変更することもできます。
ロケールリゾルバーとインターセプターは org.springframework.web.servlet.i18n
パッケージで定義され、通常の方法でアプリケーションコンテキストで構成されます。以下のロケールリゾルバーの選択が Spring に含まれています。
タイムゾーン
クライアントのロケールを取得することに加えて、多くの場合、タイムゾーンを知ることは有用です。LocaleContextResolver
インターフェースは LocaleResolver
の拡張機能を提供します。これにより、リゾルバーはより豊富な LocaleContext
を提供でき、タイムゾーン情報を含めることができます。
利用可能な場合、RequestContext.getTimeZone()
メソッドを使用してユーザーの TimeZone
を取得できます。タイムゾーン情報は、Spring の ConversionService
に登録されている日付 / 時刻 Converter
および Formatter
オブジェクトによって自動的に使用されます。
ヘッダーリゾルバー
このロケールリゾルバーは、クライアント(Web ブラウザーなど)によって送信されたリクエスト内の accept-language
ヘッダーをインスペクションします。通常、このヘッダーフィールドには、クライアントのオペレーティングシステムのロケールが含まれています。このリゾルバーはタイムゾーン情報をサポートしていないことに注意してください。
クッキーリゾルバー
このロケールリゾルバーは、クライアントに存在する可能性のある Cookie
をインスペクションして、Locale
または TimeZone
が指定されているかどうかを確認します。その場合、指定された詳細を使用します。このロケールリゾルバーのプロパティを使用することにより、Cookie の名前と最大有効期間を指定できます。次の例では、CookieLocaleResolver
を定義しています。
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<!-- in seconds. If set to -1, the cookie is not persisted (deleted when browser shuts down) -->
<property name="cookieMaxAge" value="100000"/>
</bean>
次の表で、プロパティ CookieLocaleResolver
について説明します。
プロパティ | デフォルト | 説明 |
---|---|---|
| クラス名 + ロケール | クッキーの名前 |
| サーブレットコンテナーのデフォルト | Cookie がクライアントに保持される最大時間。 |
| / | Cookie の可視性をサイトの特定の部分に制限します。 |
セッションリゾルバー
SessionLocaleResolver
を使用すると、ユーザーのリクエストに関連付けられている可能性のあるセッションから Locale
および TimeZone
を取得できます。CookieLocaleResolver
とは対照的に、この戦略はローカルで選択されたロケール設定をサーブレットコンテナーの HttpSession
に保存します。結果として、これらの設定はセッションごとに一時的であるため、各セッションが終了すると失われます。
Spring Session プロジェクトなどの外部セッション管理メカニズムと直接的な関連はないことに注意してください。この SessionLocaleResolver
は、現在の HttpServletRequest
に対して対応する HttpSession
属性を評価および変更します。
ロケールインターセプター
LocaleChangeInterceptor
を HandlerMapping
定義の 1 つに追加することにより、ロケールの変更を有効にできます。リクエスト内のパラメーターを検出し、それに応じてロケールを変更し、ディスパッチャーのアプリケーションコンテキストで LocaleResolver
の setLocale
メソッドを呼び出します。次の例は、siteLanguage
という名前のパラメーターを含むすべての *.view
リソースへの呼び出しがロケールを変更することを示しています。たとえば、URL www.sf.net/home.view?siteLanguage=nl (英語)
のリクエストは、サイトの言語をオランダ語に変更します。次の例は、ロケールをインターセプトする方法を示しています。
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="siteLanguage"/>
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/>
</list>
</property>
<property name="mappings">
<value>/**/*.view=someController</value>
</property>
</bean>