java

位置:IT落伍者 >> java >> 浏览文章

Struts1.x系列教程(13):国际化


发布日期:2022年10月04日
 
Struts1.x系列教程(13):国际化

对于一个面向全球的Web应用程序按着不同国家的要求显示相关信息(称为国际化)显得尤为重要国际化的工作非常复杂和繁琐因为要翻译很多Web界面信息格式等然而Struts为我们提供了完成国际化工作的更容易的方式在本文将介绍如何使用Struts来简化国际化的工作

处理客户端界面的编码问题

由于Web浏览器可以使用不同的编码格式来解析客户端代码这主要取决于用户的默认设置或偏好由于存在这种情况因此在服务端向客户端发送数据时就必须使用和客户端一致的编码格式

通常的做法是使用Internet上比较常用的UTF编码这主要是因为UTF编码格式所描述的字符包括了世界上所有以知国家和地区的语言编码这样服务端就不用根据客户端的编码格式不断地调整服务端响应信息的编码格式了对于JSP页面来说可以使用page指定来设置响应信息的编码格式如下面代码所示

<%@pagecontentType=text/html;charset=UTF%>

当然如果我们在Web程序中使用了Struts框架还可以在strutsconfigxml文件中使用如下的代码来设置编码格式

<controllercontentType=text/html;charset=UTF/>

如果使用上面的设置所有通过do或<forward>元素访问的页面都会继承这一编码设置但是如果单独访问JSP页面就会绕过Struts的这个设置

对于静态页面(如HTML)来说需要使用<meta>元素来设置编码格式如下面代码所示

<head>

<metahttpequiv=contenttypecontent=text/html;charset=UTF>

</head>

除了使用通用的UTF编码格式外也可以从HTTP请求头字段Accept Charset中获得客户端的编码格式然后根据这个编码格式来设置响应信息的编码格式然而虽然根据HTML规范Web浏览器可以设置 AcceptCharset字段但是有很多浏览器可以会忽略这一字段因此只使用这个字段来确定Web浏览器所使用的编码格式是不可靠的所以最好的国际化编码格式解决方案仍然是UTF

本地化属性文件

本地化最重要的部分就是根据用户所处的语言环境来显示响应语言的界面如用户在英文操作系统下就会显示英文界面如果在中文操作系统下就会显示中文界面最理想的情况是这种显示效果的切换是完全透明的

在Struts中提供了这种技术使我们可以更容易地实现透明地界面切换在Struts Bean标签库中有一个<beanmessage>标签它可以根据客户端浏览器所处的语言环境自动选择相应的属性文件来读取界面显示信息为了演示如何使用<beanmessage>以及不同的属性文件来实现国际化的程序让我们先来看一个例子

在本例中选用了三个国家的语言环境(中文英文和法文)来演示国际化的实现由于读者可能不便于输入法文因此法文信息仍然用中文代替只是后面多了个(法文)作为标识我们需要如下四步来完成这个例子

【第步】建立一个默认的属性文件

在<samples工程目录>\src\struts目录中建立一个applicationproperties文件内容如下

title=这是一个国际化的web程序(默认值)

name=姓名(默认值)

submit=提交(默认值)

applicationproperties文件是默认的属性文件如果客户端浏览器所处的语言环境在服务端未找到相应的属性文件<beanmessage>标签就会从applicationproperties文件中读取字符串信息

在Eclipse中编辑非ISO 编码格式的字符时应使用在《属性(资源)文件乱码问题的解决之道》介绍的两个Eclipse插件或使用nativeasciiexe命令进行转换否则在显示属性文件中的信息时会出现乱码

【第步】在strutsconfigxml文件中配置属性文件

在Struts中所有的属性文件都必须在strutsconfigxml文件中配置否则<beanmessage>标签就会由于无法找到相应的属性文件而抛出异常

为了配置applicationproperties需要在strutsconfigxml文件中的<strutsconfig>标签中加入如下的代码

<messageresourcesparameter=strutsapplicationkey=global/>

由于在strutsconfigxml文件中已经有一个ErrorDescriptionproperties作为默认的属性文件因此applicationproperties文件要使用一个key加以标识在使用<beanmessage>标签时必须要使用bundle属性指定这个key才能找到applicationproperties文件

【第步】加入不同语言的属性文件

在这一步我们来加入中文英文法文的属性文件这三个属性文件的文件名如下

中文application_zhproperties

英文application_enproperties

法文application_frproperties

将这三个文件放到<samples工程目录>\src\struts目录中它们的内容如下

application_zhproperties

title=这是一个国际化的web程序

name=姓名

submit=提交

application_enproperties

title=Thisisaninternationalizationwebprogram

name=name

submit=submit

application_frproperties

title=这是一个国际化的web程序(法语)

name=姓名(法语)

submit=提交(法语)

这三个属性文件是不需要在strutsconfigxml中配置的Struts会自动根据客户端浏览器所处的语言环境来寻找这三个文件

【第步】编写JSP页面

在这个JSP页面中使用了<beanmessage>来根据客户端浏览器所处的语言环境来读取相应的属性文件中的内容在web根目录中建立一个globaljsp文件代码如下

<%@pagepageEncoding=UTF%>

<%@tagliburi=beanprefix=bean%>

<html>

<head>

<title>国际化</title>

</head>

<body>

<bean:messagekey=titlebundle=global/><p/>

<formaction=>

<bean:messagekey=namebundle=global/>

<inputtype=textname=name/><p/>

<inputtype=submitvalue=<bean:messagekey=submitbundle=global/>/>

</form>

</body>

</html>

由于安装不同语言的操作系统很不方便在这里我们采用另一种方法来模拟不同的语言环境测试这个程序首先在IE中使用「工具」>「Internet 选项」> 「常规」>「语言」来打开语言首选项对话框使用添加按钮添加中文 [zh]英文 [en]法语(法国) [fr]再添加一种其他语言梵文 [sa]添加后的界面如下图所示

然后分别将这四种语言上移到列表顶端然后点击确定按钮保存设置在启动Tomcat后在IE中输入如下的URL

根据语言设置的不同在IE中会显示不同语言的界面如中文和英文的页面分别如下面两个图所示

如果在刷新时页面语言未更新可能是因为IE的Cache的原因读者可以启一个新的IE窗口再进行测试

读者在使用属性文件进行国际化时应注意如下三点

由于语言还可以继续细分如中文可以分为简体和繁体英文也可以分为不同国家或地区的英文如爱尔兰澳大利亚等因此对于更细化的语言可以在属性文件后面再加一个代表国家或地区的后缀如application_zh_TWproperties代表中国台湾所使用的繁体中文application_en_AUproperties代表澳大利亚英文Struts在寻找属性文件时会首先查找带有国家或地区后缀的属性文件如果这类文件不存在会继续查找只有语言后缀的属性文件如果还不存在最后会读取默认属性文件也就是applicationproperties的内容假设我们在语言首选项中选择了中文(台湾) [zhtw]那么读取文件的顺序(从最左边开始如果文件不存在依次读取右边的文件)如下

application_zh_TWproperties>application_zhproperties>applicationproperties

如果选择的语言是中文 [zh]那么就直接从application_zhproperties开始读取

在建立属性文件时要注意后缀的连接符为下划线( _ )而不能用减号(

代表语言的后缀(如zhfren等)必须小写而代表国家或地区的后缀(如CNTWAU等)必须大写如写成application_ZH_twproperties是不正确的

在Struts HTML标签库中的标签中以key为后缀的属性值就是属性文件中的key如下面的代码所示

<html:submitvalue=提交titleKey=titlebundle=global/>

上面的代码将<htmlsubmit>标签的title属性值设为属性文件的title键的值但是在<htmlsubmit>标签中的value属性无法使用属性文件中的键值解决的方法是使用< htmlsubmit>标签的另一种写法代码如下

<html:submit>

<bean:messagekey=titlebundle=global/>

</html:submit>

实现多种语言界面的Web程序

在上面所讲的国际化只是根据客户端浏览器所处的语言环境来自动设置界面语言而我们在Internet上会看到很多Web程序在主界面上都提供了对不同语言的选择在本节我们就来讲一下如何通过编程的方式来干预服务端对属性文件的选择

实现上Java使用javautilLocate类来描述语言一个Locate类的对象实例就代表一种语言并且从客户端获得的语言信息使用orgapachestrutsactionLOCALE保存在了session中因此我们只要在调用<beanmessage>或其他使用属性文件的语句之前修改session中保存的Locale对象就可以达到我们的目的现在我们来对globaljsp页面进行修改(新建一个文件newGlobaljsp)globaljsp中所有的代码都不用动只需要在第一个<beanmessage>标签的前面加上如下的代码

<%

if(enequals(requestgetParameter(language)))

sessionsetAttribute(orgapachestrutsactionLOCALEnewjavautilLocale(en));

elseif(zhequals(requestgetParameter(language)))

sessionsetAttribute(orgapachestrutsactionLOCALEnewjavautilLocale(zh));

elseif(frequals(requestgetParameter(language)))

sessionsetAttribute(orgapachestrutsactionLOCALEnewjavautilLocale(fr));

%>

<bean:messagekey=titlebundle=global/>

在Web根目录中建立一个mainGlobaljsp文件如下面的代码所示

<%@pagepageEncoding=UTF%>

<html>

<head>

<title>多语言支持</title>

</head>

<body>

<atarget=_blank>英文</a><p/>

<atarget=_blank>中文</a><p/>

<atarget=_blank>法文</a>

</body>

</html>

启动Tomcat后在IE中输入如下的URL

点击mainGlobaljsp页面上的三个链接就会分别显示三种语言的页面

在Struts Action类中的也可以使用Action类提供的setLocale方法来设置语言如在execute方法中设置语言的代码如下

setLocale(requestnewjavautilLocale(zhTW));

使用setLocale方法设置语言时应注意两点

javautilLocale的构造方法的第一个参数表示语言第二个参数表示国家或地区这两个参数值和属性文件的后缀不同它不区分大小写因此也可以写成如下的形式

setLocale(requestnewjavautilLocale(ZHtw));

所有经过<forward>元素或do的程序都会继承setLocale方法设置后的语言但<action>元素的forward和input属性所指的页面除外

               

上一篇:12个小技巧,让你高效使用Eclipse

下一篇:Eclipse远程调试Java