Locale
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 物件都會自動使用時區資訊。
Header 解析器
此區域設定解析器檢查客戶端(例如,Web 瀏覽器)傳送的請求中的 accept-language 頭部。通常,此頭部欄位包含客戶端作業系統的區域設定。請注意,此解析器不支援時區資訊。
Cookie 解析器
此區域設定解析器檢查客戶端上可能存在的 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 的屬性
| 財產 | 預設值 | 描述 |
|---|---|---|
|
類名 + LOCALE |
Cookie 的名稱 |
|
Servlet 容器預設值 |
Cookie 在客戶端上存活的最長時間。如果指定 |
|
/ |
將 cookie 的可見性限制到您網站的特定部分。當指定 |
會話解析器
SessionLocaleResolver 允許您從可能與使用者請求關聯的會話中檢索 Locale 和 TimeZone。與 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>