我有一些不一致的地方,我需要一些专家建议。我正在使用Spring MVC 3.2
拥有这个豆子:
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
<property name="defaultEncoding" value="UTF-8"/>
<property name="cacheSeconds" value="10" /> <!-- for easier development -->
</bean>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="en"/>
</bean>
两个不同的消息文件:
messages.properties
messages_es.properties
使用spring标记时,语言环境解析为“es”并按预期使用messages_es(这是我的系统语言)。
但是,如果我尝试以编程方式获取语言环境,我总是得到“en”。我尝试过这个选项:
选项1:
@Autowired
private LocaleResolver localeResolver;
....
localeResolver.resolveLocale(request);
选项2:
LocaleContextHolder.getLocale();
选项3:
RequestContextUtils.getLocale(request);
所有这些都以“en”lang结果。
问题是,如何获取spring:message tag ??
使用的语言环境根据文件,
当请求进入时,DispatcherServlet会查找区域设置解析程序,如果找到,则会尝试使用它来设置区域设置。使用RequestContext.getLocale()方法,您始终可以检索由区域设置解析程序解析的区域设置。
但最终html中的所有文本都在“es”中,此方法返回“en”
答案 0 :(得分:1)
通常,可以使用RequestContext.getLocale()
(reference)以编程方式访问区域设置。
但是,在控制器的@RequestMapping
处理程序方法中,您可以依靠Spring来获取Locale。
由于Locale
是supported argument type,因此只需声明类型为Locale
的变量作为控制器方法的参数即可访问当前区域设置。
<强>拦截强>
在显示的配置中,locale拦截器被声明为bean,但未注册为拦截器。试试这个,来自Spring documentation:
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/>
</list>
</property>
</bean>
或者,从Spring 3.0开始,您可以使用mvc:interceptors
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>
答案 1 :(得分:1)
好吧,我会自己回答。我深入调试它,发现问题是ReloadableResourceBundleMessageSource定义中缺少的属性。添加fallbackToSystemLocale = false并删除localeResolver中的默认语言环境现在语言环境在请求中解析为“es”。
到目前为止一切顺利。可悲的是,通过“?lang = en”参数更改语言环境的部分不起作用,但这是另一个故事。
决议:
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
<property name="defaultEncoding" value="UTF-8"/>
<property name="cacheSeconds" value="2" />
<property name="fallbackToSystemLocale" value="false" />
</bean>
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
和
LocaleContextHolder.getLocale();
答案 2 :(得分:0)
消息代码使用RequestContext
来检索MessageSource
和当前Locale
。这可以在MessageTag类的resolveMessage方法中看到:
return messageSource.getMessage(this.message, getRequestContext().getLocale());