语言环境
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>