applicationContext.xml で、次のように MessageSource を定義しました。
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>/WEB-INF/i18n/messages</value>
</list>
</property>
</bean>
また、ローカライズされたすべてのメッセージをロードする必要があるため、独自のクラスを作成しました。
public class ErpMessageSource extends ResourceBundleMessageSource {
public Map<String, String> getMessages(String basename, Locale locale) {
Set<String> keys = getKeys(basename, locale);
Map<String, String> m = new HashMap<String, String>();
for (String key : keys) {
try {
m.put(key, getMessage(key, null, locale));
} catch (Exception e) {
System.err.println(key + " - " + e.getLocalizedMessage());
}
}
return m;
}
private Set<String> getKeys(String basename, Locale locale) {
ResourceBundle bundle = getResourceBundle(basename, locale);
return bundle.keySet();
}
}
これには2つの問題があります:
問題 1: メッセージ ファイルが WEB-INF/i18n ディレクトリにあります。このファイルには、messages_en.properties と messages_hr.properties の 2 つのファイルのみが含まれています。
上記のコードを実行しようとすると、「MessageSource の ResourceBundle [messages] not found: Can't find bundle for base name messages, locale 'some locale'」という警告が表示されます。
メッセージ ファイルを WEB-INF/classes フォルダーに移動すると、問題はなくなりますが、2 つ目の問題が発生します。
問題 2: メッセージが WEB-INF/classes ディレクトリの下にあるときに上記のコードを実行すると、例外が発生します: 「ロケール 'some locale' のコード 'some.code' の下にメッセージが見つかりません」 .
質問: WEB-INF/i18n フォルダー内にメッセージを保持することで問題 1 を回避する方法と、そこで何が起こっているのか本当にわからないため、2 番目の問題の解決策が必要です。