国际化.docx

上传人:b****6 文档编号:7974106 上传时间:2023-01-27 格式:DOCX 页数:35 大小:141.96KB
下载 相关 举报
国际化.docx_第1页
第1页 / 共35页
国际化.docx_第2页
第2页 / 共35页
国际化.docx_第3页
第3页 / 共35页
国际化.docx_第4页
第4页 / 共35页
国际化.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

国际化.docx

《国际化.docx》由会员分享,可在线阅读,更多相关《国际化.docx(35页珍藏版)》请在冰豆网上搜索。

国际化.docx

国际化

窗体顶端

MaxOnJava

Thevalueofhands-onexperienceascomparedtobooklearningissmallerinsoftwaredevelopmentthaninmanyotherfields.

BlogJava  首页  新随笔联系  聚合

  管理

随笔-32 评论-1869 文章-0 trackbacks-0

在Struts2.0中国际化(i18n)您的应用程序

国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么Web框架,它都是必须掌握的技能。

其实,Struts1.x在此部分已经做得相当不错了。

它极大地简化了我们程序员在做国际化时所需的工作,例如,如果您要输出一条国际化的信息,只需在代码包中加入FILE-NAME_xx_XX.properties(其中FILE-NAME为默认资源文件的文件名),然后在struts-config.xml中指明其路径,再在页面用

message>标志输出即可。

不过,所谓“没有最好,只有更好”。

Struts2.0并没有在这部分止步,而是在原有的简单易用的基础上,将其做得更灵活、更强大。

国际化HelloWorld

下面让我们看一个例子——HelloWorld。

这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。

1.在Eclipse创建工程配置开发和运行环境(如果对这个步骤有问题,可以参考我早前的文章《为Struts2.0做好准备》)。

2.在src文件夹中加入struts.properties文件,内容如下:

struts.custom.i18n.resources=globalMessages

Struts2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。

ostruts.xml用于应用程序相关的配置

ostruts.properties用于Struts2.0的运行时(Runtime)的配置

3.在src文件夹中加入globalMessages_en_US.properties文件,内容如下:

HelloWorld=HelloWorld!

4.在src文件夹中加入globalMessages_zh_CN.properties文件,内容如下:

HelloWorld=你好,世界!

在此想和大家分享一个不错的编写properties文件的Eclipse插件(plugin),有了它我们在编辑一些简体中文、繁体中文等Unicode文本时,就不必再使用native2ascii编码了。

您可以通过Eclipse中的软件升级(SoftwareUpdate)安装此插件,步骤如下:

1、展开Eclipse的Help菜单,将鼠标移到SoftwareUpdate子项,在出现的子菜单中点击FindandInstall;

2、在Install/Update对话框中选择Searchfornewfeaturestoinstall,点击Next;

3、在Install对话框中点击NewRemoteSite;

4、在NewUpdateSite对话框的Name填入“PropEdit”或其它任意非空字符串,在URL中填入http:

//propedit.sourceforge.jp/eclipse/updates/;

5、在Sitetoincludetosearch列表中,除上一步加入的site外的其它选项去掉,点击Finsih;

6、在弹出的Updates对话框中的Selectthefeaturestoinstall列表中将所有结尾为“3.1.x”的选项去掉(适用于Eclipse3.2版本的朋友);

7、点击Finish关闭对话框;

8、在下载后,同意安装,再按提示重启Eclipse,在工具条看到形似vi的按钮表示安装成功,插件可用。

此时,Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。

5.在WebContent文件夹下加入HelloWorl.jsp文件,内容如下:

<%@page contentType="text/html;charset=UTF-8"%>

<%@taglibprefix="s"uri="/struts-tags"%>

  HelloWorld

  

textname="HelloWorld"/>

  

propertyvalue="%{getText('HelloWorld')}"/>

6.发布运行应用程序,在浏览器地址栏中输入http:

//localhost:

8080/Struts2_i18n/HelloWorld.jsp,出现图1所示页面。

图1中文输出

7.将浏览器的默认语言改为“英语(美国)”,刷新页面,出现图2所示页面。

图2英文输出

上面的例子的做法,与Struts1.x的做法相似,似乎并不能体现Struts2.0的优势。

不过,我在上面的例子用了两种方法来显示国际化字符串,其输出是相同的。

其实,这就是Struts2.0的一个优势,因为它默认支持EL,所示我们可以用getText方法来简洁地取得国际化字符串。

另外更普遍的情况——在使用UI表单标志时,getText可以用来设置label属性,例如:

textfieldname="name"label="%{getText('UserName')}"/>

资源文件查找顺序

之所以说Struts2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源(properties)文件。

在Struts2.0中有下面几种方法:

1.使用全局的资源文件,方法如上例所示。

这适用于遍布于整个应用程序的国际化字符串,它们在不同的包(package)中被引用,如一些比较共用的出错提示;

2.使用包范围内的资源文件。

做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。

这就适用于在包中不同类访问的资源;

3.使用Action范围的资源文件。

做法为Action的包下新建文件名(除文件扩展名外)与Action类名同样的资源文件。

它只能在该Action中访问。

如此一来,我们就可以在不同的Action里使用相同的properties名表示不同的值。

例如,在ActonOne中title为“动作一”,而同样用title在ActionTwo表示“动作二”,节省一些命名工夫;

4.使用

i18n>标志访问特定路径的properties文件。

使用方法请参考我早前的文章《常用的Struts2.0的标志(Tag)介绍》。

在您使用这一方法时,请注意

i18n>标志的范围。

i18nname="xxxxx">到

i18n>之间,所有的国际化字符串都会在名为xxxxx资源文件查找,如果找不到,Struts2.0就会输出默认值(国际化字符串的名字)。

上面我列举了四种配置和访问资源的方法,它们的范围分别是从大到小,而Struts2.0在查找国际化字符串所遵循的是特定的顺序,如图3所示:

图3资源文件查找顺序图

假设我们在某个ChildAction中调用了getText("user.title"),Struts2.0的将会执行以下的操作:

1.查找ChildAction_xx_XX.properties文件或ChildAction.properties;

2.查找ChildAction实现的接口,查找与接口同名的资源文件MyInterface.properties;

3.查找ChildAction的父类ParentAction的properties文件,文件名为ParentAction.properties;

4.判断当前ChildAction是否实现接口ModelDriven。

如果是,调用getModel()获得对象,查找与其同名的资源文件;

5.查找当前包下的package.properties文件;

6.查找当前包的父包,直到最顶层包;

7.在值栈(ValueStack)中,查找名为user的属性,转到user类型同名的资源文件,查找键为title的资源;

8.查找在struts.properties配置的默认的资源文件,参考例1;

9.输出user.title。

参数化国际化字符串

许多情况下,我们都需要在动行时(runtime)为国际化字符插入一些参数,例如在输入验证提示信息的时候。

在Struts2.0中,我们通过以下两种方法做到这点:

1.在资源文件的国际化字符串中使用OGNL,格式为${表达式},例如:

validation.require=${getText(fileName)}isrequired

2.使用java.text.MessageFormat中的字符串格式,格式为{参数序号(从0开始),格式类形(number|date|time|choice),格式样式},例如:

validation.between=Datemustbetween{0,date,short}and{1,date,short}

在显示这些国际化字符时,同样有两种方法设置参数的值:

1.使用标志的value0、value1...valueN的属性,如:

textname="validation.required"value0="UserName"/>

2.使用param子元素,这些param将按先后顺序,代入到国际化字符串的参数中,例如:

textname="validation.required">

  

paramvalue="UserName"/>

text>

让用户方便地选择语言

开发国际化的应用程序时,有一个功能是必不可少的——让用户快捷地选择或切换语言。

在Struts2.0中,通过ActionContext.getContext().setLocale(Localearg)可以设置用户的默认语言。

不过,由于这是一个比较普遍的应用场景(Scenario),所以Struts2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptorchain)中。

它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。

如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中。

下面,我将提供一完整示例演示它的使用方法。

packagetutorial;

importjava.util.Hashtable;

importjava.util.Locale;

importjava.util.Map;

publicclassLocales

{

  publicMapgetLocales()

{

    Maplocales=newHashtable

(2);

    locales.put("AmericanEnglish",Locale.US);

    locales.put("SimplifiedChinese",Locale.CHINA);

    returnlocales;

  }

}

tutorial/Locales.java

<%@taglibprefix="s"uri="/struts-tags"%>

--

  functionlangSelecter_onChanged(){

    document.langForm.submit();

  }

//-->

setname="SESSION_LOCALE"value="#session['WW_TRANS_I18N_LOCALE']"/>

beanid="locales"name="tutorial.Locales"/>

urlincludeParams="get"encode="true"/>"name="langForm" 

  style="background-color:

powderblue;padding-top:

4px;padding-bottom:

4px;">

  Language:

selectlabel="Language" 

    list="#locales.locales"listKey="value"  listValue="key"

    value="#SESSION_LOCALE==null?

locale:

#SESSION_LOCALE"

    name="request_locale"id="langSelecter" 

    onchange="langSelecter_onChanged()"theme="simple"/>

LangSelector.jsp

上述代码的原理为,LangSelector.jsp先实例化一个Locales对象,并把对象的Map类型的属性locales赋予下拉列表(select)。

如此一来,下拉列表就获得可用语言的列表。

大家看到LangSelector有

form>标志和一段Javascript脚本,它们的作用就是在用户在下拉列表中选择了后,提交包含“reqeust_locale”变量的表单到Action。

在打开页面时,为了下拉列表的选中的当前区域,我们需要到session取得当前区域(键为“WW_TRANS_I18N_LOCALE”的属性),而该属性在没有设置语言前是为空的,所以通过值栈中locale属性来取得当前区域(用户浏览器所设置的语言)。

你可以把LangSelector.jsp作为一个控件使用,方法是在JSP页面中把它包含进来,代码如下所示:

includevalue="/LangSelector.jsp"/>

在例1中的HellloWorld.jsp中后加入上述代码,并在struts.xml中新建Action,代码如下:

  /HelloWorld.jsp

或者,如果你多个JSP需要实现上述功能,你可以使用下面的通用配置,而不是为每一个JSP页面都新建一个Action。

  /{1}.jsp

分布运行程序,在浏览器的地址栏中输入http:

//localhost:

8080/Struts2_i18n/HelloWorld.action,出现图4所示页面:

图3HelloWorld.action

在下拉列表中,选择“AmericanEnglish”,出现图5所示页面:

图4HelloWorld.action

可能大家会问为什么一定要通过Action来访问页面呢?

你可以试一下不用Action而直接用JSP的地址来访问页面,结果会是无论你在下拉列表中选择什么,语言都不会改变。

这表示不能正常运行的。

其原因为如果直接使用JSP访问页面,Struts2.0在web.xml的配置的过滤器(Filter)就不会工作,所以拦截器链也不会工作。

postedon2006-11-0119:

06Max阅读(44843)评论(115) 编辑 收藏所属分类:

Struts2.0系列

评论共2页:

 1 2 下一页 

评论:

# re:

在Struts2.0中国际化(i18n)您的应用程序2006-11-2817:

04|tongor

顶你个肺^^

向你学习!

!

!

  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2006-12-0916:

47|konhon优华

建議簡單解釋下原理.

如:

urlincludeParams="get"encode="true"/>

request_locale參數是怎麼樣加進來的.  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-03-1113:

41|praguesky

谢谢MAX的文章...我现在也慢慢开始从struts1向2转型了.你的文章比较基础.不过让我转型的步伐大大加快..真的很感谢  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序[未登录]2007-03-1511:

29|hunter

學習中﹗﹗  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-03-1615:

19|film

頂你個肺  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-03-1615:

28|yangdamao

非常感謝提供寶貴資源并耐心回覆!

  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序[未登录]2007-03-1618:

37|bird

我頂你個肺﹗﹗﹗例子咋不能運行﹗﹗

将浏览器的默认语言改为“英语(美国)”這句話啥意思﹗﹗

怎么改﹗怎么沒有配置struts.xml

速度﹗﹗急﹗﹗﹗  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-03-2115:

07|Rookie

@bird

Searchthefuckweb

  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-03-2319:

43|coombe

辛苦啦:

请教一个问题,我想把List里的内容存在资源文件中,比如说:

我写了两个单选钮分别用来表示男和女,我试验了好多次都

行不通,多谢了!

  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-03-2422:

32|Max

@coombe

你可以用getText()在代码读取资源文件。

  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-03-2709:

41|coombe

非常感谢^_^

不过,如果我没猜错的话,你是想让我在Action的Input方法里用getText读出资源,然后再生成List对象传到页面。

这种方法是可行的,不过有时也会出问题。

比如说,我给页面添加了自动校验功能,如果校验失败,List对象就没了:

(在execute方法里再传一遍都不行:

后来实在没办法,我就把它放到了Session里了。

但是感觉这种方法太龌龊了,所以就问你一下啦:

我现在的做法是把List里的元素单个保存在资源文件里,然后在页面里读出来之后再拼装。

不知道你有没有更好的方法?

  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-04-1209:

57|crayz

你好~刚接触struts的新手

我依照你的为Struts2.0做好准备测试成功

然后在想自己添加properties文件。

定义一个properties文件里面添加了

context.hello=It'safinedaytoday

保存为Hello.properties保存在Hello.class一个目录中

然后改了SayHello.jsp的把原来标签的改成了</p><p><title><s:</p><p>textname="context.name"/>

保存

可浏览SayHello.jsp时标题显示为context.name而不是我定义的

It'safinedaytoday

用getText的话则出现标题为空的情况

接着我按照文档把Hello.properties文件改成

package.properties放到跟目录失败

放到classes目录失败..

放到tutorial目录也失败

自定义properties文件

在classes文件夹中新建struts.properties

添加了struts.custom.i18n.resources=pa.properties

Hello.properties也相应改成了pa.properties放到classes文件夹

也失败了..

已经困惑两天了..

你看我哪里出错了?

struts.xml和web.xml都没动

lib加了最需要的5个jar(我用的是2.06之有个core.jar没有struts2-api和struts2-extra.jar)

运行环境是tomcat6.0

谢谢了

  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-04-1209:

59|crayz

更正下

<s:</p><p>textname="context.name"/>

应该是<s:</p><p>textname="context.hello"/>

没有写错~

  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-04-1309:

50|Max

@crayz

可能你漏了什么东西,要不我把我的源代码发给你。

  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序2007-04-1622:

37|杰克

propEdit插件里的vi插件包是模拟vi编辑器环境的吧?

我看不需要安装。

  回复  更多评论

  

# re:

在Struts2.0中国际化(i18n)您的应用程序

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1