Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring3文件夹国际化_Spring_Properties_Internationalization - Fatal编程技术网

Spring3文件夹国际化

Spring3文件夹国际化,spring,properties,internationalization,Spring,Properties,Internationalization,我想使用Spring的i18n实用程序,使所有语言都由文件夹分隔。我计划使用这种文件夹结构使事情比将所有内容都放在一个文件夹中更有条理: i18n 嗯 messages.properties 应用程序属性 fr messages.properties 应用程序属性 这可能吗 这可能吗 是的 我最初想到的一个简单解决方案是使用属性设置消息源,如下所示: <bean id="messageSource" class="org.springframework.co

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

  • i18n

      • messages.properties
      • 应用程序属性
    • fr

      • messages.properties
      • 应用程序属性
这可能吗

这可能吗

是的

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

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