语言环境

Spring 架构的大部分内容都支持国际化,就像 Spring web MVC 框架一样。DispatcherServlet 允许您通过使用客户端的区域设置来自动解析消息。这是通过LocaleResolver 对象完成的。

当请求进来时,DispatcherServlet 会查找区域设置解析器,如果找到,则尝试使用它来设置区域设置。通过使用RequestContext.getLocale() 方法,您始终可以检索由区域设置解析器解析的区域设置。

除了自动区域设置解析之外,您还可以将拦截器附加到处理程序映射(有关处理程序映射拦截器的更多信息,请参阅拦截),以便在特定情况下(例如,基于请求中的参数)更改区域设置。

区域设置解析器和拦截器定义在org.springframework.web.servlet.i18n 包中,并以正常方式在您的应用程序上下文中配置。Spring 中包含以下区域设置解析器选择。

时区

除了获取客户端的区域设置外,了解其时区通常也很有用。LocaleContextResolver 接口提供了一个扩展到LocaleResolver,它允许解析器提供更丰富的LocaleContext,其中可能包含时区信息。

如果可用,可以使用RequestContext.getTimeZone() 方法获取用户的TimeZone。任何与 Spring 的ConversionService 注册的日期/时间ConverterFormatter 对象都会自动使用时区信息。

标头解析器

此区域设置解析器检查客户端发送的请求(例如,Web 浏览器)中的accept-language 标头。通常,此标头字段包含客户端操作系统的区域设置。请注意,此解析器不支持时区信息。

此区域设置解析器检查客户端可能存在的Cookie,以查看是否指定了LocaleTimeZone。如果是,则使用指定的详细信息。通过使用此区域设置解析器的属性,您可以指定 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 的属性

会话解析器

SessionLocaleResolver 允许您从可能与用户请求关联的会话中检索LocaleTimeZone。与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>