spring i18n:多个属性文件的问题

时间:2011-04-11 07:23:19

标签: spring internationalization

我的messages.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>

但是,我无法访问新属性文件中定义的任何属性。 是否真的可以指定多个属性文件(对于单个语言环境)?

5 个答案:

答案 0 :(得分:43)

基本名称(最后的s)属性接受一个基本名称数组:

  

设置一个基本名称数组,每个基本名称遵循上述特殊约定。在解析消息代码时,将依次检查关联的资源包。

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

答案 1 :(得分:20)

另一种干净的方法:

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

答案 2 :(得分:1)

已经提到过的替代解决方案是使用属性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>

答案 3 :(得分:0)

对于那些(像我一样),寻找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...-

答案 4 :(得分:0)

我已使用以下 bean 配置成功地将多个消息属性加载到 Spring Boot 应用程序中。

@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource
            = new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames("classpath:/messages/exception/messages",
            "classpath:/messages/response/messages");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}
相关问题