Struts2教程10:国际化
对于一个面向全球的Web应用程序,按着不同国家的要求显示相关信息(称为国际化)显得尤为重要。国际化的工作非常复杂和繁琐。因为要翻译很多Web界面,信息格式等。然而,Struts为我们提供了完成国际化工作的更容易的方式。在本文将介绍如何使用Struts来简化国际化的工作。
由于Web浏览器可以使用不同的编码格式来解析客户端代码,这主要取决于用户的默认设置或偏好。由于存在这种情况,因此,在服务端向客户端发送数据时,就必须使用和客户端一致的编码格式。
通常的做法是使用Internet上比较常用的UTF-8编码,这主要是因为UTF-8编码格式所描述的字符包括了世界上所有以知国家和地区的语言编码。这样服务端就不用根据客户端的编码格式不断地调整服务端响应信息的编码格式了。对于JSP页面来说,可以使用page指定来设置响应信息的编码格式,如下面代码所示:
对于静态页面(如HTML)来说,需要使用<meta>元素来设置编码格式,如下面代码所示:
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
【第1步】建立一个默认的属性文件
name = 姓名(默认值)
submit = 提交(默认值)
在Eclipse中编辑非ISO 8859-1编码格式的字符时,应使用在《属性(资源)文件乱码问题的解决之道》介绍的两个Eclipse插件,或使用native2ascii.exe命令进行转换。否则在显示属性文件中的信息时会出现乱码。
为了配置application.properties,需要在struts-config.xml文件中的<struts-config>标签中加入如下的代码:
- 中文:application_zh.properties
- 英文:application_en.properties
- 法文:application_fr.properties
title = 这是一个国际化的web程序
name = 姓名
submit = 提交
application_en.properties
title = This is an internationalization web program.
name = name
submit = submit
application_fr.properties
title = 这是一个国际化的web程序(法语)
name = 姓名(法语)
submit = 提交(法语)
【第4步】编写JSP页面
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<html>
<head>
<title>国际化</title>
</head>
<body>
<bean:message key="title" bundle="global" /><p/>
<form action="">
<bean:message key="name" bundle="global" />:
<input type="text" name="name" /><p/>
<input type="submit" value=<bean:message key="submit" bundle="global"/> />
</form>
</body>
</html>
读者在使用属性文件进行国际化时应注意如下三点:
1. 由于语言还可以继续细分,如中文可以分为简体和繁体,英文也可以分为不同国家或地区的英文,如爱尔兰、澳大利亚等。因此,对于更细化的语言,可以在属性文件后面再加一个代表国家或地区的后缀,如application_zh_TW.properties代表中国台湾所使用的繁体中文,application_en_AU.properties代表澳大利亚英文。Struts在寻找属性文件时,会首先查找带有国家或地区后缀的属性文件,如果这类文件不存在,会继续查找只有语言后缀的属性文件,如果还不存在,最后会读取默认属性文件,也就是application.properties的内容。假设我们在“语言首选项”中选择了“中文(台湾) [zh-tw]”,那么读取文件的顺序(从最左边开始,如果文件不存在,依次读取右边的文件)如下:
2. 在建立属性文件时要注意,后缀的连接符为下划线( _ ),而不能用减号( - )。
3. 代表语言的后缀(如zh、fr、en等)必须小写,而代表国家或地区的后缀(如CN、TW、AU等)必须大写。如写成application_ZH_tw.properties是不正确的。
在Struts HTML标签库中的标签中以key为后缀的属性值就是属性文件中的key,如下面的代码所示:
<bean:message key = “title” bundle = “global” />
</html:submit>
在上面所讲的国际化只是根据客户端浏览器所处的语言环境来自动设置界面语言。而我们在Internet上会看到很多Web程序在主界面上都提供了对不同语言的选择。在本节我们就来讲一下如何通过编程的方式来干预服务端对属性文件的选择。
实现上,Java使用java.util.Locate类来描述语言,一个Locate类的对象实例就代表一种语言。并且从客户端获得的语言信息使用“org.apache.struts.action.LOCALE”保存在了session中,因此,我们只要在调用<bean:message>或其他使用属性文件的语句之前修改session中保存的Locale对象,就可以达到我们的目的。现在我们来对global.jsp页面进行修改(新建一个文件newGlobal.jsp)。global.jsp中所有的代码都不用动,只需要在第一个<bean:message>标签的前面加上如下的代码:
<%
if("en".equals(request.getParameter("language")))
session.setAttribute("org.apache.struts.action.LOCALE", new java.util.Locale("en"));
else if("zh".equals(request.getParameter("language")))
session.setAttribute("org.apache.struts.action.LOCALE", new java.util.Locale("zh"));
else if("fr".equals(request.getParameter("language")))
session.setAttribute("org.apache.struts.action.LOCALE", new java.util.Locale("fr"));
%>
<bean:message key="title" bundle="global" />
<html>
<head>
<title>多语言支持</title>
</head>
<body>
<a href="newGlobal.jsp?language=en" target="_blank">英文</a><p/>
<a href="newGlobal.jsp?language=zh" target="_blank">中文</a><p/>
<a href="newGlobal.jsp?language=fr" target="_blank">法文</a>
</body>
</html>
http://localhost:8080/samples/mainGlobal.jsp
点击mainGlobal.jsp页面上的三个链接,就会分别显示三种语言的页面。
在Struts Action类中的也可以使用Action类提供的setLocale方法来设置语言。如在execute方法中设置语言的代码如下:
1. java.util.Locale的构造方法的第一个参数表示语言,第二个参数表示国家或地区,这两个参数值和属性文件的后缀不同,它不区分大小写,因此,也可以写成如下的形式: