>问题:JSTL使用资源包的一种语言版本时被"卡住",而我认为它应该在它们之间切换;不仅对于一个会话,而且对于新会话。同一页面上的支柱bean:message
标签使用与预期相同的资源包和切换语言。
这与这个问题无关(我认为?),但 Struts1 Action 会检查是否在 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
输出,显示英文消息。
这个问题似乎是由与 Struts 打包的 JAR 引起的,这些 JAR 也支持 JSTL:jstl-1.0.2.jar 和 standard-1.0.2.jar。
在创建 WAR 文件时更改我的构建文件以排除这些(导致使用 JBoss jstl.jar)纠正了问题。