如何在 Struts 1 中更改不同语言环境的 MessageResources 属性?

问题描述 投票:0回答:2

我有一个网络应用程序。出于多语言目的,我使用 Java Struts 1.3 和

MessageResources
。默认语言为
italian
(
MessageResources.properties
),第二语言为
english
(
MessageResources_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;
    }
            
}

设置为浏览器语言

"italian"
,它总是打印

CASE IT: it - it

但这里有一个奇怪的行为:我的索引、注册或检索密码页面可以是:

  • 全部
    italian
  • 索引并找回密码
    italian
    并在
    english
  • 中注册
  • 全部在
    italian
    ,只是找回密码和注册的一些话在
    english
  • ... 当我重新启动 Tomcat 时,它会重新显示
    italian
  • 中的所有页面

其他信息:

  • 登录后,应用程序似乎不会出现这个奇怪的问题
  • 该应用程序托管在具有英语操作系统的虚拟服务器中
  • 当我在本地电脑(使用意大利操作系统)上尝试该应用程序时,不会出现此问题
  • request.getSession().setAttribute("lingua", <int>)
    在 servlet 中使用,以正确的语言将信息检索到数据库中;这总是正确的。
java jsp internationalization struts struts-1
2个回答
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
投票

您介意吗,尝试使用以下逻辑来实现它:

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

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.