Struts对国际化的支持

我们在很多网站中发现,他可以支持多种语言,比如谷歌,百度,还有这段时间学英语常用的italki,youtube等等,都可以由用户自定义该网站的语言,十分便捷,而且,我们要想让自己的软件走向国际化,实现支持多种语言功能也是必须要走的一步,那么,我们该如何让自己的程序实现国际化走向世界呢?


I18N问题

人们常把I18N作为“国际化”的简称,其来源是英文单词 internationalization的首末字符i和n。18为中间的字符数。

随着全球经济的一体化,软件开发者应该开发出支持多国语言、国际化的Web应用。对于Web应用来说,同样的页面在不同的语言环境下需要显示不同的效果。也就是说,一个Web应用程序在运行时能够根据客户端请求所来自的国家和语言显示不同的用户界面。这样 ,当需要在应用程序中添加对一种新的语言的支持时,无需修改应用程序的代码。

在Struts框架中进行应用程序的国际化,支持重点在于应用程序的文本和图像表示,最主要的工作就是准备Resource Bundle资源包。事实上,准备资源包的过程,就是把对应不同语言的用户所涉及的文本和图片保存在多个文本文件中,客户端根据不同的环境需要进行更换。这些文件被称为“属性文件”,所有属性文件合在一起被称为资源包(Resource Bundle)。

一般我们要处理国际化问题,都从三个方面来分析,首先,页面字符串国际化问题,也就是显示在页面上的文字的不同语言,第二个,即异常消息处理的国际化问题,我们需要对抛出错误提示进行国际化处理;第三个,提示信息的异常处理问题,即我们需要处理一些提示信息。

下面我们通过一个简单的登录来对这三个问题进行讲解:



需求分析:


需求:我们需要一个登陆界面:



如果输入错误出现错误提示:




如果登陆成功,则进入成功界面:



以上需求只适合中文用户的读者,现在我们要扩展,需要全英的界面支持:这里我们配置一个选择语言页面:




代码实现:



提供配置文件:


下面,我们根据上面给的需求,一点点的解决问题:

首先,我们需要两套配置文件,一套中文的,一套英文的,这样程序在改变语言时,只需要调用不同的配置文件即可.

英文配置文件MessageResources_en_US.properties:

login.form.field.username=User Name
login.form.field.password=Password
login.form.button.login=Login
login.success={0},Login Success
login.user.not.found=User Not Found,UserName=[{0}]
login.password.error=Password Error

中文配置文件MessageResources_zh_CN.properties(注意,这里需要对中文进行转码):

login.form.field.username=\u7528\u6237\u540D
login.form.field.password=\u5BC6\u7801
login.form.button.login=\u767B\u9646
login.success={0},\u767B\u9646\u6210\u529F
login.user.not.found=\u7528\u6237\u540D\u4E0D\u80FD\u627E\u5230\uFF0C\u7528\u6237\u540D\u79F0=\u3010{0}\u3011
login.password.error=\u5BC6\u7801\u9519\u8BEF

注意:

在写配置文件的时候要注意,一些配置信息时需要占位符的,比如登陆成功提示,一般情况要求是xxx,登陆成功,所以这里的XXX就是占位符,一般从0开始写起。

同时,配置文件的命名需要在struts-config.xml中配置,这里我放在sourses文件下,所以这里配置为<message-resources parameter="resources.MessageResources"></message-resources>。


第一步,实现选择语言页:

这里我们覆盖struts的execute方法,设置语言,讲语言设置到session中,以便后来界面使用。

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		String lang = request.getParameter("lang");
		Locale locale= Locale.getDefault();
		//确定初始化的语言
		if("zh".equals(lang)){
			locale = new Locale("zh","CN");
		}else if("en".equals(lang)){
			locale=new Locale("en","US");
		}
		
		//将Locale设置到session中
		//request.getSession().setAttribute(Globals.LOCALE_KEY,locale);
		this.setLocale(request, locale);
		return mapping.findForward("index");
	}


第二步,显示登陆页面:

登陆,转向到登陆界面,在登陆页面中,我们引入struts中的<%@tagliburi="http://jakarta.apache.org/struts/tags-bean"prefix="bean"%>需要其中的<bean:messagekey=" "/>因为我们之前已经配置过语言了,所以只需要从选定的语言包中点出内容即可,通过key值来确定内容:

<%@ page language="java"contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean"prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html"prefix="html" %>
   
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 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>Insert title here</title>
</head>
<body>
   <form action="login.do" method= "post">
      <bean:message key="login.form.field.username"/>:<input type = "text" name="username"><br>
      <bean:message key="login.form.field.password"/>:<input type ="text" name="password"><br>
      <input type ="submit" value="<bean:message key="login.form.button.login"/>"><br>
   </form>
</body>
</html>



第三步,异常信息提示处理

当我们点击登录时,如果用户名或密码错误时,这里需要抛出异常,当然,排除的异常语言也应该是我们开始选定的语言:我们从LoginAction中设置该语言:

这里,我们同样需要覆盖execute方法:

LoginActionForm laf = (LoginActionForm)form;
		String username = laf.getUsername();
		String password = laf.getPassword();
		
		UserManager userManager = new UserManager();
		ActionMessages messages = new ActionMessages();
		try{
		userManager.login(username, password);
		
		//创建国际化消息文本
		ActionMessage message= new ActionMessage("login.success",username);
		messages.add("login_success_1",message);
		
		//传递国际化消息
		this.saveMessages(request, messages);
		return mapping.findForward("success"); 
		
		}catch(UserNotFoundException e){
			e.printStackTrace();
			
			//创建国际化消息文本
			ActionMessage error= new ActionMessage("login.user.not.found",username);
			messages.add("error_1",error);
			
			//传递国际化消息
			this.saveErrors(request, messages);
		}catch(PasswordErrorException e){
			e.printStackTrace();
			//创建国际化消息文本
			ActionMessage error= new ActionMessage("login.password.error");
			messages.add("error_2",error);
			
			//传递国际化消息
			this.saveErrors(request, messages);
		}
	
		return mapping.findForward("error");
	}

在这里,我们把错误信息写入massages中,只需要在页面中调用即可:

   <font color="red">
   <html:messages id="msg" property="error_1">
      <bean:write name="msg"/>
   </html:messages>
   </font>
      <font color="blue">
      <html:messages id="msg" property="error_2">
         <bean:write name="msg"/>
      </html:messages>
   </font>

当然,我们可以手动设置错误信息的颜色和样式,但是如果我们需要统一所有网站的错误信息和样式的话,手动设置就显得比较愚蠢了,所以我们这里同样用到国际化文件:

errors.header=<UL>
errors.prefix=<font color="red"><LI>
errors.suffix=</LI></font>
errors.footer=</UL>

从上到下一次为错误头,内容前缀,内容后缀,结尾,这样,在国际化文件中加入这样的配置之后,我们的错误信息样式就是列表型,前面一个点,字体为红色。

还有一个比较简单的错误显示方法:

   <html:errors/>

一句话搞定,当然,在写这些的时候,一定要引入struts文件<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>


第四步,登陆成功页面:

最后就是登陆成功提示了,这里的跳转和显示跟前面提到的显示用户名和密码是一样的,就不写代码了。


最后,感受

这样,基本就完成了国际化,如果有其他国家语言需要加入的时候,只需要增加国际化的配置文件已经在首页面添加一个选择按钮即可。

其实整理一下上面的内容,你可能会想,国际化标准也就是多了几个配置文件已经几个标签而已,并没有什么新鲜的,但是如果这里我们不用struts框架,直接使用jsp和servlet自己写的话,呵呵,那就乐呵了,所以,从这里我们也可以看出框架大大减少了我们的工作量,使我们的工作更加轻松便捷,但是,我们在写代码的时候也会发现一些问题,就是当我们拿到一个页面的时候,全都是代码,我们不知道<bean:messagekey="login.form.field.password"/>代表了什么,大家试想一下,我们需要做一个类似于新浪新闻这样的网页,我们的代码将密密麻麻的全都是代码,你完全不知道这些代码代表什么,或者你有对应的配置文件,但是很可能出现记住这个忘了那个,所以,国际化对于程序员来说,则增加了不少理解上的困难,在写这样的网页的时候,注释一定要少不了。




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值