JSTL使用一种语言版本的资源包“陷入困境”

时间:2012-08-14 16:40:59

标签: java java-ee web-applications internationalization jstl

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

1 个答案:

答案 0 :(得分:0)

这个问题似乎是由与Struts一起打包的JAR引起的,它也是JSTL:jstl-1.0.2.jar和standard-1.0.2.jar。

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