区域设置
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
对象会自动使用时区信息。
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>