区域设置
Spring 架构的大部分都支持国际化,Spring Web MVC 框架也是如此。DispatcherServlet
允许您通过使用客户端的区域设置自动解析消息。这是通过 LocaleResolver
对象完成的。当请求进来时,DispatcherServlet
会查找区域设置解析器,如果找到,则尝试使用它来设置区域设置。通过使用 RequestContext.getLocale()
方法,您始终可以检索由区域设置解析器解析的区域设置。
除了自动区域设置解析,您还可以向 handler mapping 附加一个拦截器(请参阅拦截了解更多关于 handler mapping 拦截器的信息),以在特定情况下(例如,基于请求中的参数)更改区域设置。
区域设置解析器和拦截器定义在 org.springframework.web.servlet.i18n
包中,并以通常的方式在应用上下文中进行配置。Spring 中包含了以下几种区域设置解析器。
时区
除了获取客户端的区域设置外,了解其时区也通常很有用。LocaleContextResolver
接口是 LocaleResolver
的一个扩展,它允许解析器提供更丰富的 LocaleContext
,其中可能包含时区信息。
此区域设置解析器检查客户端(例如,Web 浏览器)发送的请求中的 accept-language
头部。通常,此头部字段包含客户端操作系统的区域设置。请注意,此解析器不支持时区信息。
此区域设置解析器检查客户端可能存在的 Cookie
,以查看是否指定了 Locale
或 TimeZone
。如果指定,则使用指定的详细信息。通过使用此区域设置解析器的属性,您可以指定 Cookie 的名称以及最大生存期。以下示例定义了一个 CookieLocaleResolver
下表描述了 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>
表 1. CookieLocaleResolver 属性
默认值 | 描述 | cookieName |
---|---|---|
|
Cookie 的名称 |
cookieMaxAge |
|
Cookie 在客户端上保留的最长时间。如果指定 |
cookiePath |
|
/ |
SessionLocaleResolver
允许您从可能与用户请求关联的 session 中检索 Locale
和 TimeZone
。与 CookieLocaleResolver
不同,此策略将本地选择的区域设置存储在 Servlet 容器的 HttpSession
中。因此,这些设置对于每个 session 都是临时的,并在 session 结束时丢失。
通过将 LocaleChangeInterceptor
添加到某个 HandlerMapping
定义中,您可以启用区域设置的更改。它检测请求中的一个参数,并相应地更改区域设置,调用 dispatcher 应用上下文中的 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>