我有一个网络应用程序。出于多语言目的,我使用 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
italian
其他信息:
request.getSession().setAttribute("lingua", <int>)
在 servlet 中使用,以正确的语言将信息检索到数据库中;这总是正确的。这是因为您使用了
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);
您介意吗,尝试使用以下逻辑来实现它:
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)
}
}
我确信,它不会让您陷入异常/意外情况的池中。