Struts 2 之资源国际化

时间:2023-03-08 18:12:49

首先在struts.properties文件中加入以下内容:

struts.custom.i18n.resources=messageResource 

或在struts.xml中加入

<constant name="struts.custom.i18n.resources" value="messageResource"></constant>  

资源文件的命名格式: 名称_语言代码_国家代码.Properties 

如果创建中文和英语国际化,那么资源文件名称为

messageResource_zh_CN.properties和messageResource_en_US.properties

国际化资源文件分为三种级别

(1) 全局资源文件,可以被整个应该程序引用,也就是struts.custom.i18n.resources=messageResource指定的文件 

(2) 包级资源文件,每个包的根目录下可以新建资源文件,仅被当前包中的类访问.文件名格式为:package_语言代码_国家代码. 

(3) Action级资源文件,仅被当前Action引用,名称为action名_语言代码_国家代码 

查找顺序为从小范围到大范围, Action级优先级最大

jsp页面的国际化

通过使用标签<s:textname="label.helloWorld"/>输出国际化,label.helloWorld为资源文件中定义的key。

在messageResource_en_US.properties加入以下内容

label.hello=hello{0}
label.helloWorld=hello,world   

在messageResource_zh_CN.properties加入以下内容

label.hello=你好 {0}
label.helloWorld=你好,世界 

(1). <s:text name="label.helloWorld"/>

<s:property value="%{getText('label.helloWorld')}"/> 

上面两个都为输出一个hello word的两种表示

<s:textfield name="name" key="label.helloWorld"/>
<s:textfield name="name" label="%{getText('label.helloWorld')}"/> 

显示一个文本框,文本框的标题进行国际化    

(2). 使用<s:i18n>标签指定从某个特定的资源文件中取数据

<s:i18n name="messageResource">
      <s:text name="label.helloWorld"></s:text>
</s:i18n> 

指定在从messageResource取资源    

(3).

<s:text name="label.hello">
             <s:param>clf</s:param>
 </s:text> 

使用带参数的资源.<s:param>可以替换label.hello=hello{0}中的{0}

Action的国际化

Action的国际化主要是通过getText(Stringkey)方法实现的 

Java代码

public String execute() throws Exception {
//getText(String) string为key
String str1 =getText("label.helloWorld");
System.out.println(str1);

// 带参数的
String str2 =getText("label.hello",new String[]{"clf"});
System.out.println(str2); 

// 与上一种实现一样
List l = newArrayList();
l.add("callan");
String str3 =getText("label.hello",l);
System.out.println(str3);
return SUCCESS;
}  

action错误的国际化

在message_en_US.properties中增加以下内容

username.invalid=usernameinvalid...

在message_zh_CN.properties中增加以下内容

username.invalid=\u7528\u6237\u540d\u4e0d\u5408\u6cd5...

修改RegisterAction中的validate方法,将错误加到ActionError中,在这里将使用到ActionSupport中的getText方法获得和国际化资源文件相关的信息。

以username验证为例:

if (null ==username || username.length() < 5 || username.length() > 10) {  

    this.addActionError(this.getText("username.invalid"));  

}  

这样就从资源文件中读取username.invalid的值,增加到ActionError中。

验证框架的国际化(field级别错误)

在message_en_US.properties文件中增加以下内容

username.xml.invalid=validateinformation

在message_zh_CN.properties文件中增加以下内容

username.xml.invalid=\u9a8c\u8bc1\u6846\u67b6\u4fe1\u606f

然后修改验证框架,需要将在properties文件中的内容增加到框架中。

以username为例

<field name="username">
    <field-validator type="requiredstring">
        <param name="trim">true</param>
        <message key="username.xml.invalid"></message>
    </field-validator>
</field>  

在message标签中增加属性key,值为properties文件中的key

标签中key大多是和国际化相关的