地區設定

Spring 架構的大部分元件都支援國際化,如同 Spring Web MVC 框架一樣。DispatcherServlet 讓您可以使用用戶端的地區設定自動解析訊息。這是透過 LocaleResolver 物件完成的。

當請求進入時,DispatcherServlet 會尋找地區設定解析器,如果找到,則嘗試使用它來設定地區設定。透過使用 RequestContext.getLocale() 方法,您可以隨時擷取由地區設定解析器解析的地區設定。

除了自動地區設定解析之外,您還可以將攔截器附加到處理常式對應(有關處理常式對應攔截器的更多資訊,請參閱 攔截),以在特定情況下變更地區設定(例如,根據請求中的參數)。

地區設定解析器和攔截器在 org.springframework.web.servlet.i18n 套件中定義,並以正常方式在您的應用程式 Context 中組態。Spring 中包含以下地區設定解析器選項。

時區

除了取得用戶端的地區設定之外,了解其時區通常也很有用。LocaleContextResolver 介面提供 LocaleResolver 的擴充功能,讓解析器可以提供更豐富的 LocaleContext,其中可能包含時區資訊。

如果可用,可以使用 RequestContext.getTimeZone() 方法取得使用者的 TimeZone。時區資訊會自動由任何已向 Spring 的 ConversionService 註冊的 Date/Time ConverterFormatter 物件使用。

標頭解析器

此地區設定解析器會檢查用戶端傳送的請求中的 accept-language 標頭(例如,Web 瀏覽器)。通常,此標頭欄位包含用戶端作業系統的地區設定。請注意,此解析器不支援時區資訊。

此地區設定解析器會檢查用戶端上可能存在的 Cookie,以查看是否已指定 LocaleTimeZone。如果是,則使用指定的詳細資訊。透過使用此地區設定解析器的屬性,您可以指定 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 的屬性

Session 解析器

SessionLocaleResolver 讓您可以從可能與使用者請求相關聯的會話中擷取 LocaleTimeZone。與 CookieLocaleResolver 相反,此策略將本機選擇的地區設定儲存在 Servlet 容器的 HttpSession 中。因此,這些設定對於每個會話都是暫時性的,並且在每個會話結束時會遺失。

請注意,這與外部會話管理機制(例如 Spring Session 專案)沒有直接關係。此 SessionLocaleResolver 會針對目前的 HttpServletRequest 評估和修改對應的 HttpSession 屬性。

地區設定攔截器

您可以透過將 LocaleChangeInterceptor 新增至其中一個 HandlerMapping 定義來啟用地區設定變更。它會偵測請求中的參數並相應地變更地區設定,並在 Dispatcher 的應用程式 Context 上呼叫 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>