問題: JSTL は、リソース バンドルの 1 つの言語バージョンを使用すると「スタック」します。1 つのセッションだけでなく、新しいセッションも対象となります。同じページのStrutsbean:message
タグは、同じリソース バンドルを使用し、言語を切り替えます。
質問とは関係ありませんが (私が思うに?)、Struts1 アクションは、URL でパラメーターが渡されたかどうかをチェックして、言語を英語とフランス語の間で切り替えます。
String localeSwitch = request.getParameter("locale");
if (localeSwitch != null) {
if (localeSwitch.equalsIgnoreCase("en")) {
Locale locale = new Locale(Locale.ENGLISH.getLanguage(), Locale.CANADA.getCountry());
request.getSession().setAttribute(Globals.LOCALE_KEY, locale);
Config.set(request.getSession(), Config.FMT_LOCALE, locale);
} else if (localeSwitch.equalsIgnoreCase("fr")) {
Locale locale = new Locale(Locale.FRENCH.getLanguage(), Locale.CANADA.getCountry());
request.getSession().setAttribute(Globals.LOCALE_KEY, locale);
Config.set(request.getSession(), Config.FMT_LOCALE, locale);
}
}
Config.FMT_LOCALE
は JSTL 用、Globals.LOCALE_KEY
は Struts 用です。
JSPでは(私は本当に混乱しているため)、次のようにしています。
<%
out.println("Config.FMT_LOCALE="+Config.get(request.getSession(), Config.FMT_LOCALE));
%>
<fmt:bundle basename="proj.resources.Resource">
<fmt:message var="mymessage" key="mymessage" />
</fmt:bundle>
${mymessage}
<%
out.println("Config.FMT_LOCALE="+Config.get(request.getSession(), Config.FMT_LOCALE));
%>
リソース ファイルは および と呼ばれResource.properties
ますResource_fr.properties
。
次のそれぞれの間に、アプリケーション サーバー (JBoss) が再起動されました。
- (期待される動作) 言語を指定せずにページにアクセス:
Config.FMT_LOCALE=null
出力、英語のメッセージが表示されます。 - (期待される動作) 英語を指定してページにアクセス:
Config.FMT_LOCALE=en_CA
出力、英語のメッセージが表示されます。 - (期待される動作) フランス語を指定してページにアクセス:
Config.FMT_LOCALE=fr_CA
出力、フランス語のメッセージが表示されます。 - (予期しない動作) 言語を指定せずにページにアクセスし、次にフランス語を指定してページにアクセス:
Config.FMT_LOCALE=fr_CA
出力、英語のメッセージが表示されます。 - (予期しない動作) 英語を指定してページにアクセスし、次にフランス語を指定してページにアクセス:
Config.FMT_LOCALE=fr_CA
出力、英語のメッセージが表示されます。 - (予期しない動作) フランス語を指定してページにアクセスし、次に英語を指定してページにアクセス:
Config.FMT_LOCALE=en_CA
出力、英語のメッセージが表示されます。