0

问题:当我认为 JSTL 应该在它们之间切换时,JSTL 使用资源包的一种语言版本“卡住”了;不仅是一个会话,还包括新会话。同一页面上的Strutsbean: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.propertiesResource_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输出,显示英文消息。
4

1 回答 1

0

问题似乎是由使用 Struts 打包的 JAR 引起的,这些 JAR 也执行 JSTL:jstl-1.0.2.jar 和 standard-1.0.2.jar。

在创建 WAR 文件(导致使用 JBoss jstl.jar)时更改我的构建文件以排除这些文件可以解决问题。

于 2012-08-15T13:08:50.550 回答