地區設定
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 Converter
和 Formatter
物件使用。
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 對您網站特定部分的能見度。當指定 |
Session 解析器
SessionLocaleResolver
讓您可以從可能與使用者請求相關聯的會話中擷取 Locale
和 TimeZone
。與 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>