MessageResources奇怪的行为

时间:2014-10-10 10:11:17

标签: java jsp internationalization struts struts-1

我有一个网络应用程序。对于多语言目的,我使用带有MessageResources的java struts 1.3。默认语言为italianMessageResources.properties),第二语言为englishMessageResources_en.properties)。

struts-config.xml中的

<!--Message Resources  -->
<message-resources parameter="MessageResources" />

index.jsp

<% String language = request.getLocale().getLanguage(); %>
        var lang = '<%=language%>';
<script type="text/javascript" src="js/language.js"></script>
js/language.js中的

$(document).ready(function() {
    var browser = null;
    var val = navigator.userAgent.toLowerCase();
    if(val.indexOf("firefox") > -1) browser = 'FIREFOX';
    else if(val.indexOf("msie") > -1) browser = 'IE';
    else if(val.indexOf("chrome") > -1) browser = 'CHROME'; 

    $.ajax({
        url:"SetDefaultLanguage.do", 
        data: "isolingua="+lang+"&browser="+browser+"&val="+val,
        success: function (response) {}
        });
});
SetDefaultLanguage.java中的

//parametro del browser
if(request.getParameter("isolingua") != null)
{
    isolingua = request.getParameter("isolingua");

    switch (isolingua) 
    {
        case "en":
            request.getSession().setAttribute("lingua", 2);
            Locale.setDefault(Locale.ENGLISH);
            request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH);
            System.out.println("CASE EN: "+Locale.getDefault()+" - "+request.getSession().getAttribute(Globals.LOCALE_KEY));
            break;

        case "it":
            request.getSession().setAttribute("lingua", 1);
            Locale.setDefault(Locale.ITALIAN);
            request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ITALIAN);
            System.out.println("CASE IT: "+Locale.getDefault()+" - "+request.getSession().getAttribute(Globals.LOCALE_KEY));
            break;

        default:
            request.getSession().setAttribute("lingua", 1);
            Locale.setDefault(Locale.ITALIAN);
            request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ITALIAN);
            System.out.println("CASE DEFAULT: "+Locale.getDefault()+" - "+request.getSession().getAttribute(Globals.LOCALE_KEY));
            break;
    }

}

设置为浏览器语言“意大利语”它始终打印CASE IT:它 - 它 但这里是奇怪的行为:我的索引,注册或检索密码页面可以是

  • all italian
  • 索引并检索密码意大利语和英文注册
  • 全部是意大利文,只是一些检索密码和英文注册的字样
  • ... 当我重新启动tomcat时,它会重新显示意大利语中的所有页面

其他信息:

  • 登录后,应用程序似乎可以避免这个奇怪的问题
  • 该应用程序托管在具有英文操作系统
  • 的虚拟服务器中
  • 当我在我的本地电脑上使用应用程序(使用意大利语操作系统)时,不会出现此问题
  • request.getSession().setAttribute("lingua", <int>)在servlet中用于以正确的语言将信息检索到db中;这总是可以正常工作

谢谢大家

2 个答案:

答案 0 :(得分:2)

这是因为您使用Locale.setDefault()文档说的内容:

  

设置此Java虚拟机实例的默认语言环境   ...
  由于更改默认语言环境可能会影响许多不同的区域        功能,此方法只应在调用者使用        准备重新初始化运行的区域设置敏感代码        在同一个Java虚拟机中。

通常设置会话属性Globals.LOCALE_KEY足以更改区域设置,您可以使用代码保存区域设置

// Extract attributes we will need
HttpSession session = request.getSession();

// Get locale from request, if any
Locale locale = request.getLocale();

// If supplied, set Locale based on request parameter        
String language = request.getParameter("isolingua");

if (language != null && language.length() > 0) {
  switch (language) {
    case "en":
      locale = Locale.ENGLISH;
      session.setAttribute("lingua", 2);
      break;
    default:
      locale = Locale.ITALIAN;
      session.setAttribute("lingua", 1);
      break;
  }
}

//Save locale
session.setAttribute(Globals.LOCALE_KEY, locale);

答案 1 :(得分:0)

请注意,尝试使用以下逻辑实现它:

if (request.getParameter("isolingua") != null) { // check to avoid null pointer excptn.
  if (request.getParameter("isolingua").equals("en")) {    
    // set english locale    
  }
  else {    
    // set italian locale (our default)    
  }
}

我确信,它不会让你陷入异常/意外情况的困境中。