struts2之5--国际化支持

来源:互联网 发布:淘宝粉红色高跟鞋 编辑:程序博客网 时间:2024/05/22 01:27

1  struts2支持国际化的原理

struts2的程序国际化支持建立在java程序国际化的基础之上,

原理思想: 程序界面中需要输出国际化信息的地方,我们不要在页面上直接去输出信息,而是输出一个key值,该key值在不同语言环境下对应不同的字符串。当程序需要显示的时候,程序将根据不同的语言环境,加载该key对应该语言环境下的字符串--这样就可以完成程序的国际化。如果需要程序支持更多的语言环境,只需要增加更多语言资源文件即可。资源文件是key-value对,每个资源文件中的key是不变的,但value则随不同国家\语言变化。

2 资源文件的文件名命名格式

资源文件的命名可以有如下3种形式
   baseName_language_country.properties
   baseName_language.properties
   baseName.properties
  其中baseName是资源文件的基本名,用户可以自由定义。而language和country都不可随意变化,必须是java所支持的语言和国家。
 如果需要获取java所支持的语言和国家,可调用Locale类的getAvailableLocale方法获取,该方法返回一个Locale数组,该数组里包含了Java所支持的语言和国家。

如中文如下:
 messageResouce_zh_CN.properties
 美国英文如下:
 messageResouce_en_US.properties

3 如何加载国际化资源文件

struts2提供了很多加载国际化资源文件的方式,最简单,最常用的就是加载全局的国际化资源文件,加载全局的国际化资源文件的方式通过配置常量来实现。不管在struts.xml文件中配置常量,还是在struts.properties文件中配置常量,只需要配置struts.custom.i18n.resources常量即可。指定全局国际化资源文件的baseName.
struts.properties 这个文件不是必须的。
因为  struts.xml文件中 有 <constant> 这个节点, 你可以把你想写在struts.properties的自定义配置写在 struts.xml文件当中。
struts.properties文件通常放在Web应用的WEB-INF/classes路径下. 实际上, 只要将该文件放在Web应用的CLASSPATH路径下, Struts 2框架就可以加载该文件.

//我定义struts2 的资源文件的baseName是messageResource

struts.custom.i18n.resources=messageResource
注意:
 以上是资源文件默认加载WEB/classes下的资源文件,如果将改资源文件保存在WEB-INF/classes的子目录下,例如 保存在
  WEB-INF/classes/liweiguo路径下,则需要修改struts.properties中的定义。
   表达的意思是1 baseName是messageResource 2 在 WEB-INF/classes/liweiugo文件夹下。
struts.custom.i18n.resources=liweiguo.messageResource。

4 解释i18n

 引入国际化的目的是为了提供自适应,更友好的用户界面,而并未改变程序的逻辑功能。
国际化的英文单词是internationalization internationalization 
 但因为这个单词太长了,有时候也简称I18N,其中I是这个单词的第一个字母,18表示这个单词的长度,而N代表这个单词
的最后一个字母。

5  国际化关键的3个类

   java.util.Locale: 对应一个特定的国家/区域,语言环境。
   java.util.ResourceBundle: 用于加载一个资源包
   java.text.MessageFormat: 用于将消息格式化。 使用MessageFormat 为带占位符的字符串传入参数。
 主要的代码如下:
     //获取系统默认的国家/语言环境
     Locale myLocale=Locale.getDefault();
     //根据指定国家/语言环境加载资源文件  第一个参数是资源文件的基本名
     // java程序国际化的关键类是ResourceBundle 它有一个静态方法。getBundle(String baseName,Locale locale);
     ResourceBundle bundle=ResourceBundle.getBundle("mess",myLocale);
     //打印从资源文件中取得的信息
     System.out.println(bundle.getString("keyMessage"));

6 直接上示例 

  首先看工程结构

  

 struts.properties 文件内容
# baseName=messageResource
struts.custom.i18n.resources=messageResource

src/messageResource_en_US.properties 文件的内容
user=User Name
address=User Address

src/messageResource_zh_CN.properties 文件的内容
user=\u7528\u6237
address=\u7c4d\u8d2f\u5730\u5740


关于对messageResource_zh_CN.properties 这个文件的建立过程

使用java 提供的native2ascii工具处理baseName_zh_CN.properties文件 把处理后生成的文件内容再贴回原来的baseName_zh_CN.properties中去。就是需要把这个属性文件中的中文变成unicode编码格式。
 eclipse开发的时候,有这个的转换插件,会方便很多。

主要的操作如下:

操作步骤如下:
把 baseName_zh_CN.properties 放在 C:\Documents and Settings\user 下
执行native2ascii命令
生成一个新的properties文件 new.properties文件 
内容覆盖baseName_zh_CN.properties内容就可以了。


图2



图3 




修改原来的文件 WebRoot/jsp/myModule/myModulePage.jsp


<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>我的模块</title>
</head>
<body>
  <s:form action="testAction" method="post" namespace="/module"  >
     <table>
   <tr><td><s:text name="user" /><s:textfield name="name" ></s:textfield></td></tr>
   <tr><td><s:property value="%{getText('address')}" /><s:textfield name="address" ></s:textfield></td></tr>
   <tr><td>
    <s:submit value="提交"></s:submit>
    <s:submit value="提交到另一个方法" method="otherMethod"  ></s:submit>
   </td></tr>
   </table>
  </s:form>
</body>
</html>

说明一下:jsp中输出国际化信息

struts2 提供了如下两种方式来输出国际化信息:
   1 <s:text name="messageKey" />: 使用s:text标签来输出国际化信息。
   2 <s:property value="%{getText("messageKey")}" /> 使用表达式方式输出国际化信息。


借助struts2实现jsp视图页面国际化就是这么简单。验证国际化,Action信息国际化实现过程相仿。


7 配置文件的模块化开发

     struts2 允许针对不同模块,不同Action来组织对应的国际化资源文件。
   7.1      为struts2应用指定包范围资源文件的方法是: 在包的根路径下建立多个文件名为package_language_country.properties的文件。
     一旦建立,处于这个包下的所有Action都可以访问这个资源文件。
    注意 这个包范围的资源文件的baseName就是package 即 baseName=package 不是Action所在的包名称。
     这个国际化的资源文件直接放在该包的根路径下即可。
   7.2   Action类专用国际化资源文件
     在Action类所在的路径下建立文件名为ActionName_language_country.properties的文件。
     注意 这个Action范围的资源文件的baseName是 指定Action类的类名。和Action类的类名保持一致。如
     针对 src/com/mycom/LoginAction.java  是 LoginAction_zh_CN.properties,LoginAction_en_US.properties










原创粉丝点击