初识Struts(八)----Struts国际化I18N
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");
????????????????????????
???????????????????????? LocalecurrentLocale = null;
???????????????????????? if("zh".equals(lang)){
??????????????????????????????????????? currentLocale= new Locale("zh","CN");
???????????????????????? }elseif("en".equals(lang)){
??????????????????????????????????????? currentLocale= new Locale("en","US");
???????????????????????? }
????????????????????????
???????????????????????? request.getSession().setAttribute(Globals.LOCALE_KEY,currentLocale);
????????????????????????
????????????????????????
???????????????????????? returnmapping.findForward("login");
?
???????????
? 二、? struts动态文本国际化处理步骤:
????????? 1、 在各资源文件中加入资源(如上面的资源文件代码)
?
??????? ??2、 在Action中创建国际化消息:
ActionMessages messages = new ActionMessages();
ActionMessage message = newActionMessage("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:errors/>标签显示错误消息:
<html:errors />?
到此,Struts的国际化问题基本解决。。。。。