ロケール

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 について説明します。

セッションリゾルバー

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>