国际化的含义 Struts1.x系列教程(13):国际化
Struts1.x系列教程(13):国际化
对于一个面向全球的Web应用程序 按著不同国家的要求显示相关信息(称为国际化)显得尤为重要 国际化的工作非常复杂和繁琐 因为要翻译很多Web界面 信息格式等 然而 Struts为我们提供了完成国际化工作的更容易的方式 在本文将介绍如何使用Struts来简化国际化的工作
一 处理客户端界面的编码问题
由于Web浏览器可以使用不同的编码格式来解析客户端代码 这主要取决于用户的默认设置或偏好 由于存在这种情况 因此 在服务端向客户端发送数据时 就必须使用和客户端一致的编码格式
通常的做法是使用Internet上比较常用的UTF 编码 这主要是因为UTF 编码格式所描述的字符包括了世界上所有以知国家和地区的语言编码 这样服务端就不用根据客户端的编码格式不断地调整服务端响应信息的编码格式了 对于JSP页面来说 可以使用page指定来设置响应信息的编码格式 如下面代码所示
<%@ page contentType= text/; charset=UTF %>
当然 如果我们在Web程序中使用了Struts框架 还可以在struts config xml文件中使用如下的代码来设置编码格式
<controller contentType= text/; charset=UTF />
如果使用上面的设置 所有通过 do或<forward>元素访问的页面都会继承这一编码设置 但是如果单独访问JSP页面 就会绕过Struts的这个设置
对于静态页面(如HTML)来说 需要使用<meta>元素来设置编码格式 如下面代码所示
<head> <meta equiv= content type content= text/; charset=UTF ></head>
除了使用通用的UTF 编码格式外 也可以从HTTP请求头字段Accept Charset中获得客户端的编码格式 然后根据这个编码格式来设置响应信息的编码格式 然而 虽然根据HTML 规范 Web浏览器可以设置 Accept Charset字段 但是有很多浏览器可以会忽略这一字段 因此 只使用这个字段来确定Web浏览器所使用的编码格式是不可靠的 所以最好的国际化编码格式解决方案仍然是UTF
二 本地化属性文件
本地化最重要的部分就是根据用户所处的语言环境来显示响应语言的界面 如用户在英文操作系统下 就会显示英文界面 如果在中文操作系统下 就会显示中文界面 最理想的情况是这种显示效果的切换是完全透明的
在Struts中提供了这种技术 使我们可以更容易地实现透明地界面切换 在Struts Bean标签库中有一个<bean message>标签 它可以根据客户端浏览器所处的语言环境自动选择相应的属性文件来读取界面显示信息 为了演示如何使用<bean message>以及不同的属性文件来实现国际化的程序 让我们先来看一个例子
在本例中 选用了三个国家的语言环境(中文 英文和法文)来演示国际化的实现 由于读者可能不便于输入法文 因此 法文信息仍然用中文代替 只是后面多了个 (法文) 作为标识 我们需要如下四步来完成这个例子
【第 步】建立一个默认的属性文件
在<samples工程目录>srcstruts目录中建立一个application properties文件 内容如下
title = 这是一个国际化的web程序(默认值)name = 姓名(默认值)submit = 提交(默认值)
application properties文件是默认的属性文件 如果客户端浏览器所处的语言环境在服务端未找到相应的属性文件 <bean message>标签就会从application properties文件中读取字符串信息
在Eclipse中编辑非ISO 编码格式的字符时 应使用在《属性(资源)文件乱码问题的解决之道》介绍的两个Eclipse插件 或使用native ascii exe命令进行转换 否则在显示属性文件中的信息时会出现乱码
【第 步】在struts config xml文件中配置属性文件
在Struts中所有的属性文件都必须在struts config xml文件中配置 否则<bean message>标签就会由于无法找到相应的属性文件而抛出异常
为了配置application properties 需要在struts config xml文件中的<struts config>标签中加入如下的代码
<message resources parameter= struts application key = global />
由于在struts config xml文件中已经有一个ErrorDescription properties作为默认的属性文件 因此 application properties文件要使用一个key加以标识 在使用<bean message>标签时必须要使用bundle属性指定这个key才能找到application properties文件
【第 步】加入不同语言的属性文件
在这一步我们来加入中文 英文 法文的属性文件 这三个属性文件的文件名如下
中文 application_zh properties
英文 application_en properties
法文 application_fr properties
将这三个文件放到<samples工程目录>srcstruts目录中 它们的内容如下
application_zh propertiestitle = 这是一个国际化的web程序name = 姓名submit = 提交application_en propertiestitle = This is an internationalization web program name = namesubmit = submitapplication_fr propertiestitle = 这是一个国际化的web程序(法语)name = 姓名(法语)submit = 提交(法语)
这三个属性文件是不需要在struts config xml中配置的 Struts会自动根据客户端浏览器所处的语言环境来寻找这三个文件

【第 步】编写JSP页面
在这个JSP页面中使用了<bean message>来根据客户端浏览器所处的语言环境来读取相应的属性文件中的内容 在web根目录中建立一个global jsp文件 代码如下
<%@ page pageEncoding= UTF %> <%@ taglib uri= bean prefix= bean %> <> <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> </>
由于安装不同语言的操作系统很不方便 在这里我们采用另一种方法来模拟不同的语言环境测试这个程序 首先在IE中使用「工具」>「Internet 选项」> 「常规」>「语言」来打开 语言首选项 对话框 使用 添加 按钮添加 中文 [zh] 英文 [en] 和 法语(法国) [fr] 再添加一种其他语言 如 梵文 [sa] 添加后的界面如下图所示
然后分别将这四种语言上移到列表顶端 然后点击 确定 按钮保存设置 在启动Tomcat后 在IE中输入如下的URL
根据语言设置的不同 在IE中会显示不同语言的界面 如中文和英文的页面分别如下面两个图所示
如果在刷新时页面语言未更新 可能是因为IE的Cache的原因 读者可以启一个新的IE窗口 再进行测试
读者在使用属性文件进行国际化时应注意如下三点
由于语言还可以继续细分 如中文可以分为简体和繁体 英文也可以分为不同国家或地区的英文 如爱尔兰 澳大利亚等 因此 对于更细化的语言 可以在属性文件后面再加一个代表国家或地区的后缀 如application_zh_ properties代表中国台湾所使用的繁体中文 application_en_AU properties代表澳大利亚英文 Struts在寻找属性文件时 会首先查找带有国家或地区后缀的属性文件 如果这类文件不存在 会继续查找只有语言后缀的属性文件 如果还不存在 最后会读取默认属性文件 也就是application properties的内容 假设我们在 语言首选项 中选择了 中文(台湾) [zh ] 那么读取文件的顺序(从最左边开始 如果文件不存在 依次读取右边的文件)如下
application_zh_ properties > application_zh properties > application properties
如果选择的语言是 中文 [zh] 那么就直接从application_zh properties开始读取
在建立属性文件时要注意 后缀的连接符为下划线( _ ) 而不能用减号( )
代表语言的后缀(如zh fr en等)必须小写 而代表国家或地区的后缀(如CN AU等)必须大写 如写成application_ZH_ properties是不正确的
在Struts HTML标签库中的标签中以key为后缀的属性值就是属性文件中的key 如下面的代码所示
<:submit value= 提交 titleKey= title bundle= global />
上面的代码将< submit>标签的title属性值设为属性文件的title键的值 但是在< submit>标签中的value属性无法使用属性文件中的键值 解决的方法是使用< submit>标签的另一种写法 代码如下
<:submit> <bean:message key = title bundle = global /> </:submit>
三 实现多种语言界面的Web程序
在上面所讲的国际化只是根据客户端浏览器所处的语言环境来自动设置界面语言 而我们在Internet上会看到很多Web程序在主界面上都提供了对不同语言的选择 在本节我们就来讲一下如何通过编程的方式来干预服务端对属性文件的选择
实现上 Java使用java util Locate类来描述语言 一个Locate类的对象实例就代表一种语言 并且从客户端获得的语言信息使用 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( apache struts action LOCALE new java util Locale( en ));else if( zh equals(request getParameter( language )))session setAttribute( apache struts action LOCALE new java util Locale( zh ));else if( fr equals(request getParameter( language )))session setAttribute( apache struts action LOCALE new java util Locale( fr )); %><bean:message key= title bundle= global />
在Web根目录中建立一个mainGlobal jsp文件 如下面的代码所示
<%@ page pageEncoding= UTF %> <> <head> <title>多语言支持</title> </head> <body> <a target= _blank >英文</a><p/> <a target= _blank >中文</a><p/> <a target= _blank >法文</a> </body> </>
启动Tomcat后 在IE中输入如下的URL
点击mainGlobal jsp页面上的三个链接 就会分别显示三种语言的页面
在Struts Action类中的也可以使用Action类提供的setLocale方法来设置语言 如在execute方法中设置语言的代码如下
setLocale(request new java util Locale( zh ));
使用setLocale方法设置语言时应注意两点
java util Locale的构造方法的第一个参数表示语言 第二个参数表示国家或地区 这两个参数值和属性文件的后缀不同 它不区分大小写 因此 也可以写成如下的形式
setLocale(request new java util Locale( ZH ));
lishixinzhi/Article/program/Java/ky/201311/28202