我想以所有語言按文件夾分隔的方式使用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