java - MessageResources 奇怪的行为

标签 java jsp internationalization struts struts-1

我有一个网络应用程序。出于多语言目的,我将 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;
    }
            
}

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

  • 都是意大利人
  • 索引和检索意大利语密码和英语注册
  • 都是意大利语,只有一些找回密码和注册的单词是英语
  • ... 当我重新启动 tomcat 时,它以意大利语重新显示所有页面

其他信息:

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

最佳答案

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

Sets the default locale for this instance of the Java Virtual Machine.
...
Since changing the default locale may affect many different areas of functionality, this method should only be used if the caller is prepared to reinitialize locale-sensitive code running within the same Java Virtual Machine.

通常设置一个 session 属性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);

关于java - MessageResources 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296994/

相关文章:

c# - C# 中的字符串复数化和本地化

java - 从 FTP 转换为 SFTP

javascript - 如何 out.println Apache JKEnvVar SSL_CLIENT_DN 从 mod_ssl 到 java、javascript 或 html?

java - 在 list 中指定 -javaagent 选项

java - jsp中的IE后退按钮问题

jsp - 你能把一个 WebFilter 打包成一个库吗

java - 如何通过超链接从 JSP 向 Servlet 发送对象?

internationalization - 使用 ActiveAdmin 翻译自定义页面

java - 覆盖android Material 设计警报对话框

php - 根据用户在一个共享站点结构中的位置提供独特的内容(不是翻译)。 (PHP/MySQL)