Spring i18n: проблема с несколькими файлами свойств - PullRequest
20 голосов
/ 11 апреля 2011

Мои messages.properties действительно большой файл. Итак, я попытался переместить некоторые свойства в messages.properties в новый файл, например, newmessages.properties и обновил конфигурацию XML bean-компонента Spring с обоими файлами следующим образом:

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

Но я не могу получить доступ к каким-либо свойствам, определенным в новом файле свойств. Действительно ли возможно указать несколько файлов свойств (для одной локали)?

Ответы [ 4 ]

43 голосов
/ 11 апреля 2011

Свойство basenames (s в конце) принимает массив базовых имен:

Установить массив базовых имен, каждое из которых следует вышеупомянутому специальному соглашению. Связанные пакеты ресурсов будут проверяться последовательно при разрешении кода сообщения.

@ см. Документацию java: 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>
20 голосов
/ 20 декабря 2013

Еще один чистый способ сделать то же самое:

<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>
1 голос
/ 09 июня 2016

Альтернативным решением для уже упомянутых было бы использование свойства parentMessageSource, которое делегирует поиск сообщения родителю, если оно не находит его в текущем экземпляре.

В вашем случае, вероятно, лучшеостаться с массивом basenames.Наличие иерархического источника сообщений может иметь больше смысла, если источники сообщений используют разные реализации.Например, второе чтение сообщений из базы данных.

Обратите внимание, что в этом случае, когда Spring находит два экземпляра MessageSource, поэтому основным будет тот, который имеет идентификатор 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>
0 голосов
/ 28 декабря 2016

Для тех (как я), ищущих решение для конфигурации 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...-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...