Struts 框架很好的支持国际化, 这 主要从静态硬编码和动态文本消息两方面来实现的。
一、struts 硬编码国际化问题
1 、建立各版本的资源文件
资源文件是 用于适应多语言环境,随着系统的语言环境的变化,读取不同的资源文件,显示对应的语言。 propertes 文件特点就是简单 , key=value 存放一组配置,通俗点讲就相当于定义一个变量,在这个文件里面定义这些变量的值,在程序里面可以调用这些变量,好处就是,如果程序中的参数值需要变动,直接来改这个 .property 文件就可以了,不用再去修改源代码。资源文件的命名规则 baseName+Locale.properties, 一个项目的 baseName 必须相同,如中文版的资源文件为 MessageResources_zh_CN.properties, 则 英文版的资源文件为 MessageResources_en_US.properties, 还应该提供一个默认资源文件 MessageResources.properties 当找不到匹配版本的资源文件时就访问该文件。
各资源文件的代码为:
MessageResources.properties :
# -- standard errors --
errors.header=<UL>
errors.prefix=<LI><font color="red">
errors.suffix=</font></LI>
errors.footer=</UL>
user.title=User Login
user.username=User Name
user.password=Password
user.button.login=Login
user.login.success={0},Login Success
user.login.userNameNotFound=User Name Not Found,Name=[{0}]
user.login.passwordError=Password Error
user.login.error=Login Error!!!!!!
user.login.success=Login Success!!!!!
MessageResources_zh_CN.properties : * 注意:需要用 jdk 自带的工具 nativa2ascii.exe( 或集成 propertiesEditor 插件到 MyEclipse) 将中文转换为 Unicode 编码 , 下面是用 propertiesEditor 插件处理的:
# -- standard errors --
errors.header=<UL>
errors.prefix=<LI><font color="red">
errors.suffix=</font></LI>
errors.footer=</UL>
user.title= 用户登录
user.username= 用户名
user.password= 密码
user.button.login= 登录
user.login.success={0}, 登录成功!
user.login.userNameNotFound= 用户名不存在,用户名 =[{0}]
user.login.passwordError= 密码错误
user.login.error= 登录失败!!!
user.login.success= 登录成功!!!!
MessageResources_en_US.properties :
# -- standard errors --
errors.header=<UL>
errors.prefix=<LI><font color="red">
errors.suffix=</font></LI>
errors.footer=</UL>
user.title=User Login
user.username=User Name
user.password=Password
user.button.login=Login
user.login.success={0},Login Success
user.login.userNameNotFound=User Name Not Found,Name=[{0}]
user.login.passwordError=Password Error
user.login.error=Login Error!!!!!!
user.login.success=Login Success!!!!!
2 、配置:在struts-config.xml 文件中导入资源文件:( 其中res 是包名)
<message-resources parameter="res.MessageResource"/>
3 、在jsp 页面中用<bean:message/> 标签引用资源文件中的key 值:login.jsp :
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title><bean:message key="user.title"/></title>
</head>
<body>
<h1><bean:message key="user.title"/></h1>
<form action="login.do" method="post">
<bean:message key="user.username"/> : <input type="text" name="username"><br>
<bean:message key="user.password"/>:<input type="password" name="password"><br>
<input type="submit" value="<bean:message key="user.button.login"/>">
</form>
</body>
</html>
这样就实现了Struts
的硬编码国际化,当客户端本地语言环境为中文就显示中文:
为英文或其他语言就显示英文:
4
、利用struts
中默认将Locale
信息设置到session
中的特性,可完成采用编程方式切换语言设置:
Action 中的实现代码为:
String lang = request.getParameter("lang");
Locale currentLocale = null;
if("zh".equals(lang)){
currentLocale = new Locale("zh","CN");
}else if("en".equals(lang)){
currentLocale = new Locale("en","US");
}
request.getSession().setAttribute(Globals.LOCALE_KEY, currentLocale);
return mapping.findForward("login");
二、 struts 动态文本国际化处理步骤:
1 、 在各资源文件中加入资源( 如上面的资源文件代码)
2 、 在Action 中创建国际化消息:
ActionMessages messages = new ActionMessages();
ActionMessage message = new ActionMessage("user.login.success",username);
messages.add("loginSuccess", message);
上面的ActionMessage 消息必须add 到ActionMessages 消息集中
3 、 传递国际化消息, 调用savaMessages 传递普通消息,调用saveErrors 传递错误消息到相应的作用范围( 如request):
this.saveMessages(request, messages);
this.saveErrors(request, messages);
4、在Jsp页面显示国际化信息:
* 用<html:messages/>标签显示(可显示普通消息和错误消息,默认为错误消息,需设置message=true才显示普通消息):
<html:messages id="mes" message="true" property="loginSuccess">
<bean:write name="mes"/>
</html:messages>
* 用<html:errors/>标签显示错误消息:
<html:errors />
到此,Struts的国际化问题基本解决。。。。。