Locale

Spring 架構的大部分都支援國際化,Spring Web MVC 框架也是如此。DispatcherServlet 允許您透過使用客戶端的區域設定自動解析訊息。這是透過 LocaleResolver 物件完成的。

當請求到來時,DispatcherServlet 會查詢區域設定解析器,如果找到,它會嘗試使用它來設定區域設定。透過使用 RequestContext.getLocale() 方法,您始終可以檢索由區域設定解析器解析的區域設定。

除了自動區域設定解析之外,您還可以將攔截器附加到處理程式對映(有關處理程式對映攔截器的更多資訊,請參閱攔截)以在特定情況下更改區域設定(例如,基於請求中的引數)。

區域設定解析器和攔截器在 org.springframework.web.servlet.i18n 包中定義,並以正常方式在您的應用程式上下文中配置。以下是 Spring 中包含的區域設定解析器選擇。

時區

除了獲取客戶端的區域設定之外,瞭解其時區也通常很有用。LocaleContextResolver 介面提供了 LocaleResolver 的擴充套件,允許解析器提供更豐富的 LocaleContext,其中可能包含時區資訊。

如果可用,可以使用 RequestContext.getTimeZone() 方法獲取使用者的 TimeZone。任何註冊到 Spring 的 ConversionService 的日期/時間 ConverterFormatter 物件都會自動使用時區資訊。

Header 解析器

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

此區域設定解析器檢查客戶端上可能存在的 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 的屬性

會話解析器

SessionLocaleResolver 允許您從可能與使用者請求關聯的會話中檢索 LocaleTimeZone。與 CookieLocaleResolver 不同,此策略將本地選擇的區域設定儲存在 Servlet 容器的 HttpSession 中。因此,這些設定對每個會話都是臨時的,因此在每個會話結束時都會丟失。

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

區域設定攔截器

您可以透過將 LocaleChangeInterceptor 新增到 HandlerMapping 定義之一來啟用區域設定更改。它檢測請求中的引數並相應地更改區域設定,呼叫排程程式應用程式上下文中 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>
© . This site is unofficial and not affiliated with VMware.