使用OSGi作为服务更改语言环境的JSP Spring国际化无法正常工作

时间:2013-08-16 09:12:43

标签: java spring internationalization osgi eclipse-virgo

首先!不要判断我使用MessageSource作为服务的原因。因为我正在学习OSGi和Spring。

我有一个项目,在他们的页面中有许多模块,因为我正在进行国际化。我看到他们使用相同的消息,因此我将代码放在每个模块使用它的公共模块中。我将消息作为服务osgi-context.xml分享:

<osgi:service ref="messageSource" interface="org.springframework.context.support.ReloadableResourceBundleMessageSource"/>
<osgi:service ref="localeResolver" interface="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<osgi:service ref="localeChangeInterceptor" interface="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>

并在module-context.xml中使用bean:

<bean id="messageSource" scope="bundle" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>

<bean id="localeResolver" scope="bundle"
      class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="et" />
</bean>

<bean id="localeChangeInterceptor" scope="bundle"
      class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lang" />
</bean>

在使用该服务的模块中:

<osgi:reference id="messageSource" interface="org.springframework.context.support.ReloadableResourceBundleMessageSource"/>
<osgi:reference id="localeResolver" interface="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<osgi:reference id="localeChangeInterceptor" interface="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>

所以国际化有效!但并非完全......当我尝试更改区域设置时,问题就出现了,它部分有效。我使用标签消息的jsp页面如:

<spring:message code="general.welcome"/>

它不会改变!但同时我使用Controller将一些翻译传递给JavaScript var:

//一些page.jsp

<script>
    translations = ${translations == null? '{}' : translations};
</script>

由于控制器连接到messageSource:

@Autowired
MessageSource messageSource;
...
//the way that the request is returned by a method
//A map in JSON using messageSource is return 
model.addAttribute("translations", someJSONmap);

它正在运作!

因此,在控制器中,语言环境更改正在起作用,但在JSP页面中却没有。

有谁知道我错过了什么?或者如何解决它?

感谢您阅读,直到这里为长期问题感到抱歉。

1 个答案:

答案 0 :(得分:0)

通过删除服务解决了问题:

模块-context.xml中:

<bean id="localeChangeInterceptor" scope="bundle"
      class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lang" />
</bean>

OSGi的context.xml中:

<osgi:service ref="localeChangeInterceptor" interface="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>

并将其放入使用服务applicationContext.xml:

的模块中
<mvc:interceptors>
    ...
    <bean id="localeChangeInterceptor"
      class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang" />
    </bean>
</mvc:interceptors>