我想以所有语言按文件夹分隔的方式使用Spring的i18n实用程序。我打算使用这种文件夹结构,以保持事情不是让所有在一个文件夹更有条理:Spring 3按文件夹国际化
国际化
- 连接
- messages.properties
- application.properties
fr
个- messages.properties
- application.properties
- 连接
这可能吗?
我想以所有语言按文件夹分隔的方式使用Spring的i18n实用程序。我打算使用这种文件夹结构,以保持事情不是让所有在一个文件夹更有条理:Spring 3按文件夹国际化
国际化
fr
个这可能吗?
这可能吗?
是的。
一个简单的解决方案,我最初以为是设置与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>
虽然给它一个第二个想法,我意识到以上将无法正常工作 。根据ResourceBundle
s strategy to instantiate bundles,给定捆绑软件的名称,捆绑软件列表中的第一个名称将解析捆绑软件(例如,查找messages_fr.properties
策略将查找i18n/en/messages_fr.properties
,然后在messages_fr.properties
未找到时作为默认设置解析为i18n/en/messages.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