2013年6月4日星期二

Struts2的国际化支持

Struts2的国际化支持

443人阅读 评论(0) 收藏 举报
软件的国际化涉及以下几个方面:
1.       界面静态的文字显示。
2.       提示信息,主要包括错误提示和操作提示、在线帮助等。
3.       日期时间、数字、度量以及货币等与使用习惯相关的一些提示。
4.       邮政编码格式、尊称和称谓习惯、电话号码格式以及地址格式等需要改变页面布局的一些内容。
5.       声音图片等涉及文化习惯的一些资源。


    Struts2的国际化是建立在Java国际化的基础之上的,也是使用资源包的方式,通过getBundle()方法来寻找指定Local相关联的资源包,再从资源包文件中查找指定Key所对应的国际化资源信息。  Struts2框架的底层国际化与Java国际化是一致的,作为一个良好的MVC框架,Struts2Java的国际化功能进行了封装和简化。

一、    配置资源文件
Struts2强调的是各个组件之间的松散耦合,各个组件之间都是通过配置文件来实现相关联和交互的。Struts2框架的国际化也是如此。
Struts2框架加载资源文件一般都是通过常量设置来完成的。配置资源文件常量,即配置Struts2框架的struts.custom.i18n.resources常量,该常量定义了Struts2框架全局国际化资源文件的basename

配置struts.custom.i18n.resources常量,可以在属性文件struts.properties中定义,也可以在配置文件struts.xml或者web.xml中定义。
假设要定义配置一个basenameglobalMessagesstruts.custom.i18n.resources常量,可以在struts.properties文件中做如下配置:
#在属性文件中定义basename
                 struts.custom.i18n.resources=globalMessages
       也可以在struts.xml文件中配置basename
          <constant  name=" struts.custom.i18n.resources "  value=" globalMessages "/>
              同样,也可以在web.xml文件中定义:
          <init-param>
              <param-name> struts.custom.i18n.resources </param-name>
                         <param-value> globalMessages </param-value>
</init-param>
                   
二、    Struts2的国际化应用
只要开发者指定了struts.custom.i18n.resources常量,即指定了国际化资源文件的basename,那么就可以开发国际化应用了。

 1. 建立中文和英文的资源文件,globalMessages_en_US.propertiesglobalMessages_zh_CN.properties ,内容如下:
   globalMessages_en_US.properties文件:
     bbs_id=Article_Id
bbs_title=Title
bbs_author=Author
bbs_text=Context
bbs_date=date
bbs_first=First Page
bbs_next=Next Page
bbs_pre=Pre Page
bbs_last=Last Page
   globalMessages_zh_CN.properties 文件:
          bbs_id=/u6587/u7AE0/u5E8F/u53F7           (文章编号)
bbs_title=/u6587/u7AE0/u4E3B/u9898         (文章标题)
bbs_author=/u6587/u7AE0/u4F5C/u8005       (作者)
bbs_text=/u6587/u7AE0/u5185/u5BB9          (内容)
bbs_date=/u53D1/u8868/u65E5/u671F          (日期)
bbs_first=/u9996/u9875                      (首页)
bbs_next=/u4E0B/u9875                     (下页)
bbs_pre=/u4E0A/u9875                      (上页)
bbs_last=/u672B/u9875                      (末页)

                   注意:由于中文为非西欧字符集,而Java使用的是Unicode作为字符编码,所
以中文要转换为Unicode编码。MyEclipse中提供了自动转换。

2.       访问资源文件
1. 用户视图访问国际化资源
<s:text/>是显示静态文本,该标签中可以使用key属性来输出国际化信息。Form元素的标签也可以使用key来获得国际化信息。例如:     
      <s:text name="bbs_title"/>
      <s:textfield name="bbs_author" key="bbs_author"/>

2.Action访问国际化资源
                         Struts2提供了一个ActionSupport工具类,开发自己的Action,只要继承该类就可以了。在该类的API文档中,该类提供了一个getText(String tTextName)方法,该方法根据资源文件中的key值来返回一个国际化资源信息。
                        例如:ActionSystem.out.println(getText("bbs_author")+":"+bbs_author);

三、    使用占位符
globalMessages_en_US.properties文件:
welcomemsg=Hello {0}Now is {1}
     globalMessages_zh_CN.properties 文件:
              welcomemsg=你好 {0},现在时间是:{1}
1、  JSP视图中输出支持占位符的国际化资源信息需要使用标签库,可以再<s:text/>标签中定义多个<s:param …/>子元素,来分别对应<s:text…/>标签中引用的国际化资源中的占位符。
如:<% Date now=new Date();%>
<s:text name="welcomemsg">
  <s:param><s:property value="userName"/></s:param>
  <s:param><%=now%></s:param>
</s:text>

2、  Action中使用国际化资源占位符,仍然使用getText()方法,ActionSupport类中声明了多个getText()方法:
String getText(String aTextName):以国际化资源文件中的key为参数查找国际化信息。
String getText(String aTextNameList args):增加了一个List参数,作为填充占位符的参数,定义与MessageFormat一致。
String getText(String keyString[] args):增加了一个字符串数组参数,作为填充占位符的参数,定义与MessageFormat一致。
……等等方法
应用示例:
             Date now=new Date();
             System.out.println(getText("welcomemsg"),new String []       
             {username,now.toString()});

四、    包范围和Action范围的资源文件
前面使用的资源文件,是根据Struts2框架常量struts.custom.i18n.resources指定的basename来建立的,该资源文件是全局资源文件。  Struts2框架还允许建立包范围的资源文件、Action范围内的资源文件等。
1、         使用包资源文件的方法是:在包的根路径下建立多个文件名为package_language_country.properties的资源文件。 建好该包范围的资源文件后,该包中的所有的Action都可以访问了。
注意:上面package_language_country.properties中的package不是指配置文件中定义的包名,而是固定的名称:package
2、          Action范围资源文件就是为单独的Action指定国际化资源。方法为:
Action类所在的目录下,建立一个命名规范为ActionName_language_country.properties的资源文件。建立后,该Action就可以通过Action范围资源文件的访问来实现程序的国际互功能。

五、    动态访问国际化资源文件

配置文件struts-default.xml定义了一个国际化资源拦截器,部分代码如下:
  <interceptor name="i18n"
  class="com.opensymphony.xwork2.interceptor.I18nInterceptor" />
在该拦截器执行Action之前,会在用户请求中查找名为request_local的参数,如果该参数存在,拦截器将读取该值,转换为local对象,并将其设置为Action所使用的local。下面代码可以通过改变request_local请求参数来动态访问国际化资源文件。
             <s:url id="url" action="DynamicAction">
                    <s:param name="request_local">en_US</param>
     </s:url>
     <s:a href="%{url}">English</s:a>

     <s:url id="url" action="DynamicAction">
                   <s:param name="request_local">zh_CN</param>
     </s:url>
     <s:a href="%{url}">Chinese</s:a>

没有评论:

发表评论