您的位置:首页 > 编程语言 > Java开发

struts的国际化理解

2015-06-17 20:42 429 查看
国际化在很多Java-Web系统中重要的功能部分,国际可以使用一套应用程序在不同的区域环境下显示不同的语言效果。因些为跨区域的应用开发提供了便利。因些在众多WEB开发框架中都提供了良好的国际化支持,下面我们来看一Strust2 框架中是如何实现国际化的。

  1.Java_SE环境上使用国际化

在开始了解Strsut2 国际化之前我们要先搞清楚国际化的原理。

首先我先在SE环境下使用一下java的国际化。

查看JavaAPI  我们会发现这样一个类: java.uil. ResourceBundle  这个类是资源包的意思,包含了特定语言环境的对象,如果程序需要某一特定语言环境下的资源时,应用程序会在该语言环境下加载它。

Java.util.Loacle  代表特定的地理,政治,文化区域的语言环境。

Locale(String language)  根据指定语言创建一个语言环境

Locale(String language, String country)  根据指定国家和语言创建一个语言环境。

下面是这个类的构造方法,在这个类中提供了很多常量表示一个区域。

Locale 类中还在一个方法 
getAvailableLocales() 
方法,获取所有已经安装的语言环境


getCountry
()  
获取区域环境名称


getDisplayCountry
()  
获取区域环境对应的代码


getLanuage()    
获取区域环境下语言环称


getDiaplayLanuage() 
获取区域环境下语言环境代码


下面我们可以打印一下计算机的所有配置的语言:

Locale[] locales=Locale.getAvailableLocales();

                   for(Locale locale:locales){

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

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

                   }

下面我们看一下:

publicstaticvoid main(String[] args) {

                   //获取系统当前默认Locale

//                 Locale locale=Locale.getDefault();

                   Locale locale=Locale.US;

                   //获取当前Locale对应的资源包

                   ResourceBundle bundle=ResourceBundle.getBundle("hellofile",locale);

                  

                   String value=bundle.getString("hello");

                   System.out.println(value);

                  

      }

上面locale 代表的是美国语言环境,根据语言环境我可以得到一个资源包,ResourceBundle.getBundle("hellofile",locale); 第一个参数是资源文件的名字,第个就是区别语言环境,这样的话,我们就可以到美国语言环境下的一个资源包,下面对其进行操作取出该资源包下面的hello 字符串,打印来就是资源文件中的数据。资源文件如下(文件新建在src的目录下,否则会报异常):

hellofile_zh_CN.properties 文件:

hello = /u46f60/u597d!

Hellofile_en_US.properties 文件

hello = hello ni hao!

如何上面我们使用Loacle.US环境,打印出来就hello nihao! 如果采用Local.CN 打印出来就是“你好!“;

 

接着往下面看:

publicstaticvoid main(String[] args) {

//               Locale locale=Locale.getDefault();

                  

                   Locale locale=Locale.US;

                   ResourceBundle bundle=ResourceBundle.getBundle("hellofile",locale);

                  

                   String value=bundle.getString("hello");

                  

                   String result=MessageFormat.format(value, new Object[]{"Hi"});

                  

                   System.out.println(result);

         }

我们经常会看到一此资源配置文件中会出现占位符{0} 这样的东西,而上面并没有定义占位符,估不采取任何操作,他的功能相当于C#语言中的占位符,{0},{1}{2};是用来代替后来传进来的字符串

例如:String result =  MessageFormat.format("zhansan
{0} ", 
new Object[]{"Hi"});那么[b]zhansan [b]Hi;[/b][/b]
String result =  MessageFormat.format("zhansan
{0}  {1} {2}", 
new Object[]{"Hi","zhangsan","lisi"});那么zhansan Hizhangsan[b]lisi[/b];

当然我们也可以使用这样占位符,当程序运行时给其传参数。(注意该文件建在src的目录下)

hellofile_zh_CN.properties 文件:

hello = /u46f60/u597d {0} !

Hellofile_en_US.properties 文件

hello = hello ni hao {0}!

我们打算传一个姓名过来,只后显示,如何做呢?

查找javaAPI我们会发现一具java.util.MessageFormat 类,这个类提供了格式化对象,并将格式化之后的数据插入到模型中行当的位置。

上面是SE环境下如何使用国际化。

 

2.Strsut2的中的国际化

Strsut2 中主要包括两方面的国际化:

1.静态信息的国际化,即在jsp页面上如何实现。

2.错误信息的国际化 

3.校验框架上怎么实现的

一、在jsp页面上实现

1、在页面中使用Struts2 标签库 



2、定义全局文件,注意是在src的目录下 

命名规范:

2.1、在这里说一下,资源文件命名是要有规范的文件名_语言代码_国家区域代码.properties,例如

messageResources_en_US.properties


messageResources_zh_CN.properties 


并添加元素。



2.2、并且这个(全局)资源文件要在strsut2.xml 中常量进行配置,才能起作用。

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


这样运行以后便可以了。

二.我们经常需要对表单验证的错误信息进行国际化

Validate() 方法的验证的错误信息;

1、必须在Action目录下面定义国际化文件 ActionName_[b]语言代码_国家区域代码.properties[/b]

[b]例如:LoginAction_en_US.properties 或者 LoginAction_zh_CN.properties

(注意如二中所配置的国际化文件也是可以直接用的,若两者都定义了的话,就选择ActionName所定义的文件)
[/b]

首先我们查看一下ActionSupport 类的API,我们会发现里面有一堆getText() 方法的重载方法,这些方法是可以根据key获取资源文件中key对应的值。

getText(String key); 根据key获取值   getText(String key,String[] value); 可以给错误信息中的占位符进行传值

具体用法:

在向FieldErrors 或ActionErrors 中添加错误信息时使用:

 this.addActionError(this.getText("username",new String[]{username}));

 

三.  校验框架中错误信息国际化使用

1、必须在Action目录下面定义国际化文件 ActionName_语言代码_国家区域代码.properties

例如:LoginAction_en_US.properties 或者 LoginAction_zh_CN.properties

(注意如果定义了全局的配置文件是可以直接用的,若两者都定义了的话,就选择局部的ActionName所定义的配置文件)


在配置中使用

<field name="username">

       <field-validator type="requiredstring" short-circuit="false">

           <param name="trim">true</param>

           <message key="username" />       </field-validator>

       <field-validator type="stringlength">

           <param name="minLength">6</param>

           <param name="maxLength">10</param>

           <message key="username" />

       </field-validator>

    </field>

为错误的信息message 提供一个key 值,这样就可以实现错误信息国际化。

四.使用i18n标签

    <s:i18n name="temp">

        <s:text name="hello">

           <s:param>lilp</s:param>

        </s:text>

    </s:i18n>



在页面上使用这样的标签,指定在temp配置文件中找资源,上面的配置是在temp资源文件中找hello 对应的值,中间的占位符用lilp替换。例如我在temp.zh_CN.properties中定义了
hello=用户名:{0}


则网页上显示  用户名lilp

参考与:http://blog.csdn.net/cankingapp/article/details/7627709
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息