【问题标题】:Spring 3 Internationalization by folderSpring 3 按文件夹国际化
【发布时间】:2013-01-15 06:20:12
【问题描述】:

我想以所有语言都由文件夹分隔的方式使用 Spring 的 i18n 实用程序。我计划使用这种文件夹结构来使事情比将所有内容都放在一个文件夹中更有条理:

  • i18n

    • zh
      • messages.properties
      • application.properties
    • f

      • messages.properties
      • application.properties

这可能吗?

【问题讨论】:

    标签: spring properties internationalization


    【解决方案1】:

    这可能吗?

    是的。

    我最初想到的一个简单解决方案是使用basenames 属性设置消息源,如下所示:

    <bean id="messageSource"
            class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="useCodeAsDefaultMessage" value="true" />
        <property name="basenames">
            <list>
                <value>i18n.en.messages</value>
                <value>i18n.en.application</value>
                <value>i18n.fr.messages</value>
                <value>i18n.fr.application</value>
            </list>
        </property>
    </bean>
    

    再想一想,我意识到 上述方法行不通。基于ResourceBundles strategy to instantiate bundles,给定一个包的名称,包列表中的第一个名称将解析包(例如,查找messages_fr.properties,该策略将查找i18n/en/messages_fr.properties,然后解析为i18n/en/messages.properties作为未找到messages_fr.properties 时的默认值)。

    您将需要基于自定义文件夹配置发现您的捆绑包的东西。 您必须编写自己的 MessageSource 实现并在您的应用程序中使用它,而不是 Spring 提供的默认实现。基本实现可能如下所示:

    package pack.age;
    import java.util.Locale;
    import java.util.ResourceBundle;
    
    import org.springframework.context.support.ResourceBundleMessageSource;
    
    public class ByFolderResourceBundleMessageSource extends ResourceBundleMessageSource {
        private String rootFolder;
    
        @Override
        protected ResourceBundle getResourceBundle(String basename, Locale locale) {
            String langCode = locale.getLanguage().toLowerCase();
            String fullBaseName = this.rootFolder + "." + langCode + "." + basename;
    
            ResourceBundle bundle = super.getResourceBundle(fullBaseName, locale);
            if (bundle == null) {
                String defaultBaseName = this.rootFolder + ".Default." + basename;
                bundle = super.getResourceBundle(defaultBaseName, locale);
            }
            return bundle;
        }
    
        public void setRootFolder(String rootFolder) {
            this.rootFolder = rootFolder;
        }
    }
    

    配置如下:

    <bean id="messageSource" 
            class="pack.age.ByFolderResourceBundleMessageSource">
        <property name="useCodeAsDefaultMessage" value="true" />
        <property name="rootFolder" value="i18n" />
        <property name="basenames">
            <list>
                <value>messages</value>
                <value>application</value>
            </list>
        </property>
    </bean>
    

    并使用如下文件夹设置:

    i18n
      ├───Default
      │     ├─── application.properties
      │     └─── messages.properties
      │
      ├─── en
      │     ├─── application.properties
      │     └─── messages.properties
      │
      └─── fr
            ├─── application.properties
            └─── messages.properties
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多