我想模仿Grails解决i18n消息的方式。
在WEB-INF / i18n /中我有以下目录:
管理 /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文件但没有明确告诉它每个子目录是什么的方法。 没有 列表 basenames 指向 / WEB-INF / i18n / admin / 和 / WEB-INF / I18N /网站/
我希望WEB-INF / i18n /目录是动态的,并且可以创建bundle(目录)而无需重新修改xml配置文件。
我没有尝试使用管理员和网站子目录解决这个特定的例子
这可能吗?
谢谢!
答案 0 :(得分:2)
以下是解决方案:
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>
享受!