我有一些不一致之处,需要一些专家意见。我正在使用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(这是我的系统lang)。
但是,如果我尝试以编程方式获取语言环境,则总会得到“ en”。我已经尝试过以下选项:
选项1:
@Autowired
private LocaleResolver localeResolver;
....
localeResolver.resolveLocale(request);
选项2:
LocaleContextHolder.getLocale();
选项3:
RequestContextUtils.getLocale(request);
所有这些都以“ en” lang表示。
问题是,如何获取spring:message标签使用的语言环境?
根据文档,
收到请求时,DispatcherServlet会查找语言环境解析器,如果找到了它,则尝试使用它来设置语言环境。使用RequestContext.getLocale()方法,您始终可以检索由语言环境解析器解析的语言环境。
但是我在最终html中的所有文本都在“ es”中,并且此方法返回“ en”
最佳答案
好吧,我会回答自己。我对它进行了足够深入的调试,以发现问题是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();