2013-09-16 147 views
2

我有一些不一致之处,我需要一些专家建议。我使用Spring MVC的3.2Spring MVC:spring之间的区别:消息和请求区域设置

有了这个豆:

<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> 

和两个diferent消息文件:

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结果。

问题是,我如何获得春季使用的语言环境:消息标签?

Acording的文档,

当一个请求时,DispatcherServlet寻找一个本地化解析器,如果找到它就使用它来设置语言环境。使用RequestContext.getLocale()方法,您始终可以检索由区域设置解析程序解析的区域设置。

但是,所有我在最终的HTML文本是在“ES”和此方法返回“EN”

回答

1

好吧,我会回答自己。我调试了足够深,发现问题是ReloadableResourceBundleMessageSource定义中缺少的属性。在localeResolver中添加fallbackToSystemLocale = false并删除默认语言环境现在语言环境在请求中解析为“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(); 
+1

关于拦截器:将拦截器声明为一个bean是不够的,你应该使用mvc:interceptor或[简单URL映射](http://docs.spring.io/spring/docs/2.5.6 /reference/mvc.html#mvc-handlermapping-interceptor) – MPavesi

0

消息标签使用RequestContext检索MessageSource和当前Locale。由此可看出在MessageTag类的resolveMessage方法:

return messageSource.getMessage(this.message, getRequestContext().getLocale()); 

参见:https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/MessageTag.java

+0

我调试弹簧源代码,直到这一行和区域设置为 “连接” 在此Poing的,然而,返回的消息是来自“ES “消息文件!我完全迷失了:S – jpaoletti

1

一般而言,语言环境,可以编程方式使用RequestContext.getLocale()reference)进行访问。

但是,在控制器的@RequestMapping处理程序方法中,可以依靠Spring获取Locale。 由于Localesupported argument type,只要声明一个类型为Locale的变量作为控制器方法的参数就可以访问当前的语言环境。

拦截
在所示的结构中,区域设置拦截被声明为豆,但没有注册为拦截。试试这个,从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:拦截

<mvc:interceptors> 
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> 
</mvc:interceptors> 
+0

尝试了一个参数,仍然是“en”。 – jpaoletti

+0

好点! mvc:拦截器解决了第二个问题。谢谢! – jpaoletti

相关问题