struts2学习笔记(13)——struts2中的国际

首先看看java中对国际化的支持

在java中就已经包含了对国际化的支持,在java中使用国际化需要用到一下几个类:

resourceBundle类        提供相应的资源包

locale类                       对应到某一地区

MessageFormat           格式化字符串

新建一个包cn.tshining.i18n

首先来查看一下系统中支持的语言,熟悉一下java中的国际化。

 

view plaincopy to clipboardprint?
package cn.tshining.i18n;   
 
import java.util.Locale;   
 
public class Test1 {   
 
    public static void main(String[] args) {   
 
        Locale[] locales = Locale.getAvailableLocales();   
 
        for(Locale locale : locales){   
 
            System.out.println(locale.getCountry() + " : " + locale.getDisplayCountry());   
 
            System.out.println(locale.getLanguage() + " : " + locale.getDisplayLanguage());   
 
        }   
    }   
 
}  
package cn.tshining.i18n;

import java.util.Locale;

public class Test1 {

    public static void main(String[] args) {

        Locale[] locales = Locale.getAvailableLocales();

        for(Locale locale : locales){

            System.out.println(locale.getCountry() + " : " + locale.getDisplayCountry());

            System.out.println(locale.getLanguage() + " : " + locale.getDisplayLanguage());

        }
    }

}
 

 

这个例子中使用到了Locale类,通过该类可以获得地区和语言相关的信息。

当然要实现国际化,需要使用使用properties文件,在文件中写入相关信息。

该properties文件的命名是需要注意的,命名格式为baseName_language_country.properties

其中baseName是自定义的,language是地区的语言名,country是国家或地区名,在上面的例子中应该有所了解。

在src目录下新建hello_en_US.properties文件,内容为

hello=hello world

新建hello_zh_CN.properties,内容为

hello=/u4f60/u597d

注意在properties文件中不能使用中文,要将中文转换成unicode码才行,可以使用native2ascii这个工具。

 

view plaincopy to clipboardprint?
//Test2.java   
 
package cn.tshining.i18n;   
 
import java.util.Locale;   
import java.util.ResourceBundle;   
 
public class Test2 {   
 
    public static void main(String[] args) {   
        Locale locale = Locale.getDefault();   
 
        ResourceBundle bundle = ResourceBundle.getBundle("hello", locale);   
        String value = bundle.getString("hello");   
        System.out.println(value);   
    }   
 
}  
//Test2.java

package cn.tshining.i18n;

import java.util.Locale;
import java.util.ResourceBundle;

public class Test2 {

    public static void main(String[] args) {
        Locale locale = Locale.getDefault();

        ResourceBundle bundle = ResourceBundle.getBundle("hello", locale);
        String value = bundle.getString("hello");
        System.out.println(value);
    }

}

 

这个例子中使用ResourceBundle这个类,这个类可以获得一个资源文件。

其静态方法getBundle返回一个资源包,接受两个参数,第一个为资源文件的baseName,第二个为所选的地区名。

运行时在控制台中输出“你好”。

修改

Locale locale = Locale.US;

运行时在控制台中输出“hello world”。

当然也可以在properties文件中也可以使用参数。

修改上述两个properties文件内容分别为:

hello=hello world {0}

hello=/u4f60/u597d {0}

 

view plaincopy to clipboardprint?
//Test3.java   
 
package cn.tshining.i18n;   
 
import java.text.MessageFormat;   
import java.util.Locale;   
import java.util.ResourceBundle;   
 
public class Test3 {   
 
    public static void main(String[] args) {   
 
        Locale locale = Locale.getDefault();   
 
        ResourceBundle bundle = ResourceBundle.getBundle("hello", locale);   
        String value = bundle.getString("hello");   
        String result = MessageFormat.format(value, new Object[]{"arno"});   
        System.out.println(result);   
    }   
 
}  
//Test3.java

package cn.tshining.i18n;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

public class Test3 {

    public static void main(String[] args) {

        Locale locale = Locale.getDefault();

        ResourceBundle bundle = ResourceBundle.getBundle("hello", locale);
        String value = bundle.getString("hello");
        String result = MessageFormat.format(value, new Object[]{"arno"});
        System.out.println(result);
    }

}

 

这个示例还是用到了MessageFormat这个类,其静态方法format往得到的value中传入了一个对象数组,用来格式化相关的信息。

因为java是基于unicode的,所以可以很轻松地实现国际化。

 

struts2中的国际化

在struts2中需要做国际化的有:

jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化,校验错误信息的国际化

在之前的例子中已经做过和国际化相关的例子了,在struts.xml中配置过

 

view plaincopy to clipboardprint?
<constant name="struts.custom.i18n.resources" value="message"></constant>  
<constant name="struts.custom.i18n.resources" value="message"></constant> 

 

其中的message就是国际化资源文件的baseNmae。

我们先看看简单的在jsp中进行国际化

在src目录下新建message_en_US.properties,内容为

hello=add user

新建message_zh_CN.properties文件,内容为

hello=/u589e/u52a0/u7528/u6237

然后修改register2.jsp

要想使用国际化显示,可以将信息添加到<s:text></s:text> 标签中,也可以放在<s:i18n></s:i18n> 中,

在这里,先使用标签 <s:text></s:text>

增加以下内容:

 

view plaincopy to clipboardprint?
<s:text name="hello"></s:text>  
<s:text name="hello"></s:text> 

 

重启服务器后,浏览该页,默认会显示出“增加用户”,可以在IE中打开Internet选项,在常规中选择语言,增加英语(美国)[en-US],然后设置为第一项,刷新就可以看到输出“add user”。


 

action错误的国际化

在message_en_US.properties中增加以下内容

username.invalid=username invalid...

在message_zh_CN.properties中增加以下内容

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

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

以username验证为例:

 

view plaincopy to clipboardprint?
if (null == username || username.length() < 5 || username.length() > 10) {   
 
    this.addActionError(this.getText("username.invalid"));   
 
}  
        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=validate information

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

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

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

以username为例


 

view plaincopy to clipboardprint?
<field name="username">   
    <field-validator type="requiredstring">   
        <param name="trim">true</param>   
        <message key="username.xml.invalid"></message>   
    </field-validator>   
</field>  
    <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大多是和国际化相关的


 

国际化资源文件的分类

当应用程序很大时,需要国际化的东西会很多,因此需要将国际化资源文件进行分类。

需要知道的是在src中的properties文件是全局资源文件,另外还可以分为包级别的和类级别的

首先看看包级别的

命名规则为package_language_country.properties

新建package_en_US.properties,内容为

username.xml.invalid=package validate information

新建package_zh_CN.properties,内容为

username.xml.invalid=/u5305/u9a8c/u8bc1/u4fe1/u606f

可以看到输出的信息为“包验证信息”,由此可见包级别的国际化资源文件的优先级高于全局国际化资源文件。


 

类级别

新建RegisterAction_en_US.properties,内容为

username.xml.invalid=class validate information

新建RegisterAction_zh_CN.properties,内容为

username.xml.invalid=/u7c7b/u9a8c/u8bc1/u4fe1/u606f

此时可以看到输出的信息为“类验证信息”。

由此可以得到国际化资源文件的优先级


全局<包级别<类级别

另外要进行表单的国际化时,要去掉theme="simple"

在RegisterAction_en_US.properties中增加

username.name=username

在RegisterAction_zh_CN.properties中增加

username.name=/u7528/u6237/u540d

修改表单标签

 

view plaincopy to clipboardprint?
<s:textfield name="username" key="username.name"></s:textfield>  
<s:textfield name="username" key="username.name"></s:textfield> 

 

注意到key一般是和国际化相关的。

另外除了用

 

 

另外除了用<s:text>这个标签外,还可以使用<s:i18n>这个标签

 

view plaincopy to clipboardprint?
<s:i18n name="temp"></s:i18n>  
<s:i18n name="temp"></s:i18n> 

 

标签中包含name,代表着可以定义资源文件的baseName,如可以定义成temp,那么对应着

temp_en_US.properties和temp_zh_CN.properties这两个资源文件。

 

如定义:

 

 

view plaincopy to clipboardprint?
<s:i18n name="hello">   
    <s:text name="world">   
        <s:param>struts2</s:param>   
    </s:text>   
</s:i18n>  
        <s:i18n name="hello">
            <s:text name="world">
                <s:param>struts2</s:param>
            </s:text>
        </s:i18n> 

 

注意到可以在<s:text>标签中增加<s:i18n> 标签。

在hello_en_US.properties文件中增加

world=hello {0}

hello_zh_CN.properties中增加

world=/u4f60/u597d,struts2

在struts2的默认拦截器栈中已经定义了i18n拦截器,所以struts2已经是一个国际化的框架了。

struts2会查找从客户端提交的request_locale属性,并存到session中的WW_TRANS_I18N_LOCALE字段

中。

这个<s:text> 标签外,还可以使用<s:i18n> 这个标签 

  1. <s:i18n name="temp"></s:i18n>   

<s:i18n name="temp"></s:i18n>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值