此版本仍在开发中,尚未稳定。如需最新的稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

区域设置

Spring架构的大部分支持国际化,就像Spring Web MVC框架一样。DispatcherServlet允许你通过使用客户端的区域设置自动解析消息。这是通过LocaleResolver对象完成的。spring-doc.cadn.net.cn

当一个请求到来时,DispatcherServlet 会查找一个区域设置解析器,并且如果找到的话,它会尝试使用它来设置区域设置。通过使用 RequestContext.getLocale() 方法,你可以始终检索由区域设置解析器解析的区域设置。spring-doc.cadn.net.cn

除了自动本地化解析外,你还可以将拦截器附加到处理器映射(有关处理器映射拦截器的更多信息,请参见拦截)以在特定情况下更改本地化(例如,基于请求中的参数)。spring-doc.cadn.net.cn

Locale resolvers 和 interceptors 在 org.springframework.web.servlet.i18n 包中定义,并以正常方式在您的应用程序上下文中配置。以下是一些包含在 Spring 中的 locale resolver 选择。spring-doc.cadn.net.cn

时区

除了获取客户端的区域设置,通常还希望知道其时区。LocaleContextResolver接口提供了一个扩展到LocaleResolver的方法,允许解析器提供更丰富的LocaleContext,其中可能包含时区信息。spring-doc.cadn.net.cn

当可用时,可以通过使用RequestContext.getTimeZone()方法获取用户的TimeZone。时区信息会自动用于任何已注册到Spring的ConversionService中的Date/TimeConverterFormatter对象。spring-doc.cadn.net.cn

标题解析器

此本地化解析器检查客户端(例如,网络浏览器)发送的请求中的accept-language标头。通常,此标头字段包含客户端操作系统的本地设置。请注意,此解析器不支持时区信息。spring-doc.cadn.net.cn

此区域解析器检查客户端上可能存在的Cookie,以查看是否指定了LocaleTimeZone。如果指定了,它将使用指定的详细信息。通过使用此区域解析器的属性,您可以指定cookie的名称以及最大存活时间。以下示例定义了一个CookieLocaleResolver bean:spring-doc.cadn.net.cn

@Configuration
public class WebConfiguration {

	@Bean
	public LocaleResolver localeResolver() {
		CookieLocaleResolver localeResolver = new CookieLocaleResolver("clientlanguage");
		localeResolver.setCookieMaxAge(Duration.ofSeconds(100000));
		return localeResolver;
	}
}
@Configuration
class WebConfiguration {

	@Bean
	fun localeResolver(): LocaleResolver = CookieLocaleResolver("clientlanguage").apply {
		setCookieMaxAge(Duration.ofSeconds(100000))
	}
}
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">

	<constructor-arg index="0" value="clientlanguage"/>

	<!-- in seconds. If set to -1, the cookie is not persisted (deleted when browser shuts down) -->
	<property name="cookieMaxAge" value="100000"/>

</bean>

会话解析器

The SessionLocaleResolver 让你从可能与用户请求相关的会话中检索 LocaleTimeZone。与 CookieLocaleResolver 不同,这种策略将本地化设置存储在 Servlet 容器的 HttpSession 中。因此,这些设置对每个会话都是临时的,并且在每个会话结束时丢失。spring-doc.cadn.net.cn

请注意,这里没有与外部会话管理机制的直接关系, 例如Spring Session项目。这个SessionLocaleResolver评估并 修改与当前HttpServletRequest对应的HttpSession属性。spring-doc.cadn.net.cn

本地化拦截器

可以通过向某个LocaleChangeInterceptor定义中添加HandlerMapping来启用地区切换。它会检测请求中的参数并相应地更改地区,调用分派器应用上下文中LocaleResolversetLocale方法。下一个示例表明,对所有包含名为siteLanguage的参数的*.view资源的请求现在会改变地区。因此,例如,对URLdomain.com/home.view?siteLanguage=nl的请求会将站点语言更改为荷兰语。以下示例展示了如何拦截地区设置:spring-doc.cadn.net.cn

@Configuration
public class WebConfiguration {

	@Bean
	public LocaleResolver localeResolver() {
		return new CookieLocaleResolver();
	}

	@Bean
	public SimpleUrlHandlerMapping urlMapping() {
		SimpleUrlHandlerMapping urlHandlerMapping = new SimpleUrlHandlerMapping();
		LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
		interceptor.setParamName("siteLanguage");
		urlHandlerMapping.setInterceptors(interceptor);
		urlHandlerMapping.setUrlMap(Map.of("/**/*.view", "someController"));
		return urlHandlerMapping;
	}
}
@Configuration
class WebConfiguration {

	@Bean
	fun localeResolver(): LocaleResolver {
		return CookieLocaleResolver()
	}

	@Bean
	fun urlMapping() = SimpleUrlHandlerMapping().apply {
		setInterceptors(LocaleChangeInterceptor().apply {
			paramName = "siteLanguage"
		})
		urlMap = mapOf("/**/*.view" to "someController")
	}
}
<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>