2014-10-10 50 views
4

我有一個web應用程序。爲了多語言的目的,我使用了帶有MessageResources的java struts 1.3。默認語言是italianMessageResources.properties),第二種語言是englishMessageResources_en.properties)。MessageResources怪異行爲

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; 
    } 

} 

設置爲瀏覽器語言「意大利」它打印總是情況下:它 - 它 但在這裏它是奇怪的現象:我的索引,登記或找回密碼頁面可以

  • 所有意大利
  • 索引和檢索密碼,意大利和註冊的英文
  • 都在意大利,只是當我重新啓動Tomcat它重新顯示在意大利的所有頁面檢索英文
  • ... 密碼和註冊的一些話

其它信息:

  • 的應用程序的登錄之後似乎是從這個奇怪的問題
  • 的應用程序在虛擬服務器託管與英文操作系統
  • 安全當我嘗試應用在我的本地PC上(使用意大利語操作系統),不會發生此問題
  • request.getSession().setAttribute("lingua", <int>)用於servlet以正確的語言將信息檢索到數據庫中;這一直工作正常

謝謝大家

回答

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)  
    } 
} 

我肯定,它不會降落在你的異常池/意外情況。

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); 
+0

Unfortunatey後與你的建議良好的行爲幾天,我重新部署了我應用程序,我又遇到了同樣的問題(部署+ Tomcat重啓)。 – Nogothwen 2014-10-30 12:48:48

+1

你在Tomcat上是否部署了其他應用程序? – 2014-10-30 12:56:54

+0

是的我有一個演示版本。 – Nogothwen 2014-10-30 15:46:14