Struts2(十二):国际化

来源:互联网 发布:淘宝会员号是什么 编辑:程序博客网 时间:2024/06/04 20:09

国际化:在程序设计领域,把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术

步骤:

  • 为不同国家、语言提供对应的消息资源文件
  • Struts2框架会根据请求中包含的locale加载对应的资源文件
  • 通过程序代码取得该资源文件中指定key对应的消息

1.配置国际化资源文件:

    (1) Action 范围资源文件:在Action类文件所在的路径建立名为ActionName_language_country.properties 的文件
    (2)包范围资源文件:在包的根路径下建立文件名为package_language_country.properties 的属性文件,一旦建立,处于该包下的所有 Action 都可以访问该资源文件。注意:包范围资源文件的 baseName 就是package,不是Action所在的包名。
   (3)全局资源文件:

  • 命名方式: basename_language_country.properties
  • struts.xml:<constant name="struts.custom.i18n.resources" value="baseName"/>
  • struts.properties:struts.custom.i18n.resources=baseName
   (4)临时指定资源文件:<s:i18n.../> 标签的 name 属性指定临时的国际化资源文件

加载顺序:距离当前Action较近的被优先加载。

代码举例:

i18n.properties:

username=UserNamepassword=Passwordsubmit=Submittime=Time:{0}time2=Time:${date}   //可以直接访问
i18n_en_US.properties

username=UserNamepassword=Passwordsubmit=Submittime=Time:{0}time2=Time:${date}

i18n_zh_CN.properties

username=\u7528\u6237\u540Dpassword=\u5BC6\u7801submit=\u63D0\u4EA4time=\u65F6\u95F4:{0}time2=\u65F6\u95F4:${date}

2.在页面上和Action类中访问国际化资源文件的value值

  (1):在Action类中,若Action实现了TextProvider接口,则可以调用getText()方法获取value值。通过继承ActionSupport的方式

代码示例:

package i18n;import com.opensymphony.xwork2.ActionSupport;import java.util.Arrays;import java.util.Date;public class Testi18n extends ActionSupport {    private Date date=null;    public void setDate(Date date) {        this.date = date;    }    public Date getDate() {        return date;    }    @Override    public String execute() throws Exception {        date=new Date();        //1.在Action中访问国际化资源        String username=getText("username");        System.out.println(username);   //控制台输出        //带占位符的        String date=getText("time", Arrays.asList(new Date()));        return SUCCESS;    }}

要在struts.xml里面配置 

 (2)页面上可以使用s:text标签。对于表单标签可以使用表单标签的key属性值

  • 如果有占位符,可以使用s:text标签的s:param的子标签来填充占位符
  •  可以利用标签和OGNL表达式直接访问值栈中的属性值(对象栈和Map栈)(“${}”)

  (3)可以用label访问:在栈顶有DefaultTextProvider一个实例,该对象提供访问资源文件的getText()方法。(在值栈中)可以用OGNL来进行访问,同时还需要通知 struts2 框架 label 中放入的不再是一个普通的字符串, 而是一个 OGNL 表达式. 所以使用 %{} 把 getText()包装起来, 以强制进行 OGNL 解析. 

代码举例:

<s:form >      <s:text name="username"/>:<s:textfield name="username" label="%{getText('username')}"></s:textfield>     <s:textfield name="username" label="%{getText('username')}"></s:textfield>        <!--国际化-->        <s:textfield name="username" key="username"></s:textfield>        <s:textfield name="password" key="password"></s:textfield>        <s:submit key="submit"></s:submit>    </s:form>
     (4)直接访问:在国际化资源文件中使用OGNL表达式

time2=Time:${date}   //可以直接访问
在index文件中可以直接访问:

<s:text name="time2"></s:text>