Spring i18n: проблема с несколькими файлами свойств
Мои сообщения .properties - действительно большой файл.
Итак, я попытался переместить некоторые свойства в messages.properties в новый файл, скажем, newmessages.properties и обновленный spring bean конфигурационный xml с обоими файлами следующим образом:
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:i18n/messages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<bean id="anotherMessageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:i18n/newmessages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
Но я не могу получить доступ к свойствам, указанным в новом файле свойств.
Можно ли указать несколько файлов свойств (для одного языкового стандарта)?
Ответы
Ответ 1
Свойство basenames (s
at the end) принимает массив базовых имен:
Установить массив базовых имен, каждый из которых соответствует вышеупомянутому специальному соглашению. Связанные пакеты ресурсов будут проверяться последовательно при разрешении кода сообщения.
@see java doc: ReloadableResourceBundleMessageSource.setBasenames
Итак, у вас должен быть только один источник сообщений с файлами списка (попробуйте разделить их запятой).
<bean id="anotherMessageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames" value="classpath:i18n/newmessages,classpath:i18n/messages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
Ответ 2
Еще один чистый способ сделать то же самое:
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:messages1</value>
<value>classpath:messages2</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
Ответ 3
Альтернативное решение для уже упомянутых будет использовать свойство parentMessageSource
, которое делегирует поиск сообщения родительскому объекту, если он не находит его в текущем экземпляре.
В вашем случае, вероятно, лучше остаться с массивом basenames
. Наличие источника иерархического сообщения может иметь больше смысла, если источники сообщений используют разные реализации. Например. второй - чтение сообщений из db.
Обратите внимание, что в этом случае, когда Spring находит два экземпляра MessageSource
, поэтому первичный будет с id MessageSource
.
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="parentMessageSource"><ref bean="anotherMessageSource"/></property>
<property name="basename" value="classpath:i18n/messages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<bean id="anotherMessageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:i18n/newmessages"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
Ответ 4
Для тех (как я), ища решение для java-конфигурации:
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("i18n/messages", "i18n/newmessages");
return messageSource;
}
jdoc: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/support/AbstractResourceBasedMessageSource.html#setBasenames-java.lang.String...-