Spring MVC ResourceBundleMessageSource XML configuration



我想模仿Grails解析i18n消息的方法。

在WEB-INF/i18n/I中有以下目录:

admin/messages_EN.properties

admin/messages_FR.properties

网站/messages_EN.properties

网站/messages_FR.properties

请忽略本例中的语言词尾(EN和FR(

在我的xml配置中,我目前有:

<!-- Register the welcome.properties -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  <property name="defaultEncoding" value="utf-8" />
  <property name="basename" value="/WEB-INF/i18n/" />
</bean>

我在这里寻找的是一种方法,告诉Spring在i18n下查找.properties文件,但不明确地告诉它每个子目录是什么。这就是没有一个基名称列表,指向/WEB-INF/i18n/admin//VEB-INF/i18n/website/

我希望WEB-INF/i18n/目录是动态的,并且可以在不必重新修改xml配置文件的情况下创建bundle(目录(。

我不想用管理员和网站子目录来解决这个特定的例子

这可能吗?

谢谢!

以下是解决方案:

package com.mypackage.core.src;
import java.io.File;
import java.util.ArrayList;
import javax.servlet.ServletContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
public class UnderDirectoryReloadableResourceBundleMessageSource extends ReloadableResourceBundleMessageSource {
    @Autowired
    ServletContext servletContext;
    public void setWorkingDirectory(String directoryPath) {
        File rootDir = new File( servletContext.getRealPath(directoryPath) );
        ArrayList<String> baseNames = new ArrayList<String>();
        iterateScanDirectoryAndAddBaseNames(baseNames, rootDir);
        setBasenames(baseNames.toArray(new String[baseNames.size()]));
    }
    private void iterateScanDirectoryAndAddBaseNames(ArrayList<String> baseNames, File directory) {
        File[] files = directory.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                iterateScanDirectoryAndAddBaseNames(baseNames, file);
            } else {
                if (file.getName().endsWith(".properties")) {
                    String filePath = file.getAbsolutePath().replaceAll("\\", "/").replaceAll(".properties$", "");
                    filePath = filePath.substring(filePath.indexOf("/WEB-INF/"), filePath.length());
                    baseNames.add(filePath);
                    System.out.println("Added file to baseNames: " + filePath);
                }
            }
        }
    }
}

XML配置:

<bean id="messageSource" class="com.mypackage.core.src.UnderDirectoryReloadableResourceBundleMessageSource">
  <property name="defaultEncoding" value="utf-8" />
  <property name="workingDirectory" value="/WEB-INF/webspring/i18n" />
  <property name="cacheSeconds" value="3" />
  <property name="fallbackToSystemLocale" value="false" />
</bean>

享受吧!

最新更新