1、国际化窗体顶端Max On JavaThe value of hands-on experience as compared to book learning is smaller in software development than in many other fields. BlogJava 首页 新随笔 联系 聚合 管理 随笔-32 评论-1869 文章-0 trackbacks-0 在Struts 2.0中国际化(i18n)您的应用程序 国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么Web框架,它都是必须掌握的技能。其实,Struts 1.x在此部分已经做得相当不错了。
2、它极大地简化了我们程序员在做国际化时所需的工作,例如,如果您要输出一条国际化的信息,只需在代码包中加入FILE-NAME_xx_XX.properties(其中FILE-NAME为默认资源文件的文件名),然后在struts-config.xml中指明其路径,再在页面用标志输出即可。 不过,所谓“没有最好,只有更好”。Struts 2.0并没有在这部分止步,而是在原有的简单易用的基础上,将其做得更灵活、更强大。国际化Hello World下面让我们看一个例子HelloWorld。这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。1. 在Eclipse创建工程配置开发和运行环境(
3、如果对这个步骤有问题,可以参考我早前的文章为Struts 2.0做好准备)。 2. 在src文件夹中加入struts.properties文件,内容如下: struts.custom.i18n.resources=globalMessagesStruts 2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。 o struts.xml用于应用程序相关的配置 o struts.properties用于Struts 2.0的运行时(Runtime)的配置3. 在src文件夹中加入globalMessages_en_US.prope
4、rties文件,内容如下:HelloWorld=Hello World!4. 在src文件夹中加入globalMessages_zh_CN.properties文件,内容如下:HelloWorld=你好,世界!在此想和大家分享一个不错的编写properties文件的Eclipse插件(plugin),有了它我们在编辑一些简体中文、繁体中文等Unicode文本时,就不必再使用native2ascii编码了。您可以通过Eclipse中的软件升级(Software Update)安装此插件,步骤如下:1、展开Eclipse的Help菜单,将鼠标移到Software Update子项,在出现的子菜单中
5、点击Find and Install;2、在Install/Update对话框中选择Search for new features to install,点击Next;3、在Install对话框中点击New Remote Site;4、在New Update Site对话框的Name填入“PropEdit”或其它任意非空字符串,在URL中填入http:/propedit.sourceforge.jp/eclipse/updates/;5、在Site to include to search列表中,除上一步加入的site外的其它选项去掉,点击Finsih;6、在弹出的Updates对话框中的Se
6、lect the features to install列表中将所有结尾为“3.1.x”的选项去掉(适用于Eclipse 3.2版本的朋友);7、点击Finish关闭对话框;8、在下载后,同意安装,再按提示重启Eclipse,在工具条看到形似vi的按钮表示安装成功,插件可用。此时,Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。 5. 在WebContent文件夹下加入HelloWorl.jsp文件,内容如下: Hello World 6. 发布运行应用程序,在浏览器地址栏中输入http:/localhost:8080/Struts2_i18n/HelloWor
7、ld.jsp ,出现图1所示页面。图1 中文输出 7. 将浏览器的默认语言改为“英语(美国)”,刷新页面,出现图2所示页面。图2 英文输出 上面的例子的做法,与Struts 1.x的做法相似,似乎并不能体现Struts 2.0的优势。不过,我在上面的例子用了两种方法来显示国际化字符串,其输出是相同的。其实,这就是Struts 2.0的一个优势,因为它默认支持EL,所示我们可以用getText方法来简洁地取得国际化字符串。另外更普遍的情况在使用UI表单标志时,getText可以用来设置label属性,例如:资源文件查找顺序之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和
8、获取资源(properties)文件。在Struts 2.0中有下面几种方法:1. 使用全局的资源文件,方法如上例所示。这适用于遍布于整个应用程序的国际化字符串,它们在不同的包(package)中被引用,如一些比较共用的出错提示; 2. 使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源; 3. 使用Action范围的资源文件。做法为Action的包下新建文件名(除文件扩展名外)与Action类名同样的资源文件。它只能在该Action中访问。如此一来,我们就可以在不同的
9、Action里使用相同的properties名表示不同的值。例如,在ActonOne中title为“动作一”,而同样用title在ActionTwo表示“动作二”,节省一些命名工夫; 4. 使用标志访问特定路径的properties文件。使用方法请参考我早前的文章常用的Struts 2.0的标志(Tag)介绍。在您使用这一方法时,请注意标志的范围。在到之间,所有的国际化字符串都会在名为xxxxx资源文件查找,如果找不到,Struts 2.0就会输出默认值(国际化字符串的名字)。上面我列举了四种配置和访问资源的方法,它们的范围分别是从大到小,而Struts 2.0在查找国际化字符串所遵循的是特定
10、的顺序,如图3所示:图3 资源文件查找顺序图 假设我们在某个ChildAction中调用了getText(user.title),Struts 2.0的将会执行以下的操作: 1. 查找ChildAction_xx_XX.properties文件或ChildAction.properties; 2. 查找ChildAction实现的接口,查找与接口同名的资源文件MyInterface.properties; 3. 查找ChildAction的父类ParentAction的properties文件,文件名为ParentAction.properties; 4. 判断当前ChildAction是否实
11、现接口ModelDriven。如果是,调用getModel()获得对象,查找与其同名的资源文件; 5. 查找当前包下的package.properties文件; 6. 查找当前包的父包,直到最顶层包; 7. 在值栈(Value Stack)中,查找名为user的属性,转到user类型同名的资源文件,查找键为title的资源; 8. 查找在struts.properties配置的默认的资源文件,参考例1; 9. 输出user.title。参数化国际化字符串许多情况下,我们都需要在动行时(runtime)为国际化字符插入一些参数,例如在输入验证提示信息的时候。在Struts 2.0中,我们通过以下
12、两种方法做到这点:1. 在资源文件的国际化字符串中使用OGNL,格式为$表达式,例如:validation.require=$getText(fileName) is required2. 使用java.text.MessageFormat中的字符串格式,格式为 参数序号(从0开始), 格式类形(number | date | time | choice), 格式样式,例如:validation.between=Date must between 0, date, short and 1, date, short在显示这些国际化字符时,同样有两种方法设置参数的值:1. 使用标志的value0、
13、value1.valueN的属性,如:2. 使用param子元素,这些param将按先后顺序,代入到国际化字符串的参数中,例如: 让用户方便地选择语言开发国际化的应用程序时,有一个功能是必不可少的让用户快捷地选择或切换语言。在Struts 2.0中,通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过,由于这是一个比较普遍的应用场景(Scenario),所以Struts 2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptor chain)中。它的原理为
14、在执行Action方法前,i18n拦截器查找请求中的一个名为request_locale的参数。如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中。下面,我将提供一完整示例演示它的使用方法。package tutorial;import java.util.Hashtable;import java.util.Locale;import java.util.Map;publicclass Locales public Map getLocale
15、s() Map locales =new Hashtable(2); locales.put(American English, Locale.US); locales.put(Simplified Chinese, Locale.CHINA); return locales; tutorial/Locales.javaform action= name=langForm style=background-color: powderblue; padding-top: 4px; padding-bottom: 4px; Language: LangSelector.jsp 上述代码的原理为,L
16、angSelector.jsp先实例化一个Locales对象,并把对象的Map类型的属性locales赋予下拉列表(select) 。如此一来,下拉列表就获得可用语言的列表。大家看到LangSelector有标志和一段Javascript脚本,它们的作用就是在用户在下拉列表中选择了后,提交包含“reqeust_locale”变量的表单到Action。在打开页面时,为了下拉列表的选中的当前区域,我们需要到session取得当前区域(键为“WW_TRANS_I18N_LOCALE”的属性),而该属性在没有设置语言前是为空的,所以通过值栈中locale属性来取得当前区域(用户浏览器所设置的语言)。你
17、可以把LangSelector.jsp作为一个控件使用,方法是在JSP页面中把它包含进来,代码如下所示: 在例1中的HellloWorld.jsp中后加入上述代码,并在struts.xml中新建Action,代码如下: /HelloWorld.jsp或者,如果你多个JSP需要实现上述功能,你可以使用下面的通用配置,而不是为每一个JSP页面都新建一个Action。 /1.jsp分布运行程序,在浏览器的地址栏中输入http:/localhost:8080/Struts2_i18n/HelloWorld.action,出现图4所示页面:图3 HelloWorld.action在下拉列表中,选择“Am
18、erican English”,出现图5所示页面:图4 HelloWorld.action可能大家会问为什么一定要通过Action来访问页面呢?你可以试一下不用Action而直接用JSP的地址来访问页面,结果会是无论你在下拉列表中选择什么,语言都不会改变。这表示不能正常运行的。其原因为如果直接使用JSP访问页面,Struts 2.0在web.xml的配置的过滤器(Filter)就不会工作,所以拦截器链也不会工作。posted on 2006-11-01 19:06 Max 阅读(44843) 评论(115) 编辑 收藏 所属分类: Struts 2.0系列 评论共2页:12下一页 评论: #r
19、e: 在Struts 2.0中国际化(i18n)您的应用程序 2006-11-28 17:04 | tongor顶你个肺 向你学习!回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2006-12-09 16:47 | konhon 优华建議簡單解釋下原理. 如: request_locale參數是怎麼樣加進來的.回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-03-11 13:41 | praguesky谢谢的文章我现在也慢慢开始从struts1 向转型了你的文章比较基础不过让我转型的步伐大大加快真的很感谢回复更多评论#re
20、: 在Struts 2.0中国际化(i18n)您的应用程序未登录 2007-03-15 11:29 | hunter學習中回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-03-16 15:19 | film頂你個肺回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-03-16 15:28 | yangdamao非常感謝提供寶貴資源并耐心回覆!回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序未登录 2007-03-16 18:37 | bird我頂你個肺例子咋不能運行 将浏览器的默认语言改为“
21、英语(美国)”這句話啥意思 怎么改怎么沒有配置struts.xml 速度急回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-03-21 15:07 | Rookiebird Search the fuck web 回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-03-23 19:43 | coombe辛苦啦:) 请教一个问题,我想把List里的内容存在资源文件中,比如说: 我写了两个单选钮分别用来表示男和女,我试验了好多次都 行不通,多谢了!回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序
22、 2007-03-24 22:32 | Maxcoombe 你可以用getText()在代码读取资源文件。回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-03-27 09:41 | coombe非常感谢_ 不过,如果我没猜错的话,你是想让我在Action的Input方法里用getText读出资源,然后再生成List对象传到页面。 这种方法是可行的,不过有时也会出问题。比如说,我给页面添加了自动校验功能,如果校验失败,List对象就没了:(在execute方法里再传一遍都不行:( 后来实在没办法,我就把它放到了Session里了。但是感觉这种方法太龌龊了,
23、所以就问你一下啦:) 我现在的做法是把List里的元素单个保存在资源文件里,然后在页面里读出来之后再拼装。不知道你有没有更好的方法? 回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-04-12 09:57 | crayz你好刚接触struts的新手 我依照你的 为Struts 2.0做好准备 测试成功 然后在想自己添加properties文件 。 定义一个properties文件 里面添加了 context.hello=Its a fine day today 保存 为Hello.properties保存在Hello.class一个目录中 然后改 了 S
24、ayHello.jsp的 把原来标签的改成了 保存 可浏览SayHello.jsp时标题显示为context.name而不是我定义的 Its a fine day today 用getText 的话则出现 标题为空的情况 接着我按照文档 把Hello.properties文件改成 package.properties放 到跟目录 失败 放到classes目录 失败. 放到tutorial目录也 失败 自定义properties文件 在classes文件夹中新建 struts.properties 添加了 struts.custom.i18n.resources=pa.properties He
25、llo.properties也相应改成了pa.properties 放到classes文件夹 也失败了. 已经困惑两天了. 你看我哪里出错了? struts.xml 和web.xml都没动 lib加了最需要的5个jar(我用的是2.06之有个core.jar 没有struts2-api和struts2-extra.jar) 运行环境是tomcat 6.0 谢谢了 回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-04-12 09:59 | crayz更正下 应该是 没有写错 回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-04-13 09:50 | Maxcrayz 可能你漏了什么东西,要不我把我的源代码发给你。回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-04-16 22:37 | 杰克propEdit插件里的vi插件包是模拟vi编辑器环境的吧?我看不需要安装。回复更多评论#re: 在Struts 2.0中国际化(i18n)您的应用程序
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1