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