2013-09-16 110 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

相關問題