Прежде всего! Не осуждайте меня за то, что я использую 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"/>
Это не меняется! Но в то же время я передаю некоторые переводы с помощью контроллера в переменную JavaScript, например:
//Некоторая страница.jsp
<script>
translations = ${translations == null? '{}' : translations};
</script>
Поскольку контроллеры подключены к источнику сообщений:
@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 - нет.
Кто-нибудь знает, что мне не хватает? Или как это исправить?
Спасибо, что дочитали до сюда и извините за длинный вопрос.