【问题标题】:spring i18n: problem with multiple property filesspring i18n:多个属性文件的问题
【发布时间】:2011-08-02 20:22:50
【问题描述】:

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

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

【问题讨论】:

    标签: spring internationalization


    【解决方案1】:

    我已使用以下 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;
    }
    

    【讨论】:

      【解决方案2】:

      对于那些(像我一样),正在寻找 java config 解决方案:

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

      【讨论】:

        【解决方案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】:

          另一种干净的方式来做同样的事情:

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

          【讨论】:

          • 说我有 message1_en,message2_en 和 m 发送 en 作为语言环境到那时 spring 将如何知道要使用哪个文件? @spgodara
          【解决方案5】:

          basenames(末尾为s)属性接受一个basenames数组:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-24
            • 2013-08-21
            • 1970-01-01
            • 2012-02-14
            • 2016-05-05
            • 2012-12-05
            • 1970-01-01
            • 2017-08-18
            相关资源
            最近更新 更多