国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么Web框架,它都是必须掌握的技能。 其实,Struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作,例如,如果您要输出一条国际化的信息,只需在代码包中加入FILE -NAME_xx_XX.properties(其中FILE-NAME为默认资源文件的文件名),然后在struts-config.xml中指明其路径,再在页面用<bean:message>标志输出即可。 不过,所谓“没有最好,只有更好”。Struts 2.0并没有在这部分止步,而是在原有的简单易用的基础上,将其做得更灵活、更强大。 国际化Hello World下面让我们看一个例子——HelloWorld。这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。
<
s:textfield
name
="name"
label
="%{getText('UserName')}"
/>
资源文件查找顺序之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源(properties)文件。在Struts 2.0中有下面几种方法:
上面我列举了四种配置和访问资源的方法,它们的范围分别是从大到小,而Struts 2.0在查找国际化字符串所遵循的是特定的顺序,如图3所示: 图3 资源文件查找顺序图 假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作:
参数化国际化字符串许多情况下,我们都需要在动行时(runtime)为国际化字符插入一些参数,例如在输入验证提示信息的时候。在Struts 2.0中,我们通过以下两种方法做到这点:
让用户方便地选择语言开发国际化的应用程序时,有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中,通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过,由于这是一个比较普遍的应用场景(Scenario),所以Struts 2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptor chain)中。它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为 “WW_TRANS_I18N_LOCALE”的属性中。 下面,我将提供一完整示例演示它的使用方法。
package
tutorial; tutorial/Locales.javaimport java.util.Hashtable; import java.util.Locale; import java.util.Map; public class Locales { public Map<String, Locale> getLocales() { Map<String, Locale> locales =new Hashtable<String, Locale>(2); locales.put("American English", Locale.US); locales.put("Simplified Chinese", Locale.CHINA); return locales; } }
<%
@taglib prefix
=
"
s
"
uri
=
"
/struts-tags
"
%>
LangSelector.jsp < script type ="text/javascript" > <!-- function langSelecter_onChanged() { document.langForm.submit(); } // --> </ script > < s:set name ="SESSION_LOCALE" value ="#session['WW_TRANS_I18N_LOCALE']" /> < s:bean id ="locales" name ="tutorial.Locales" /> < form action ="<s:url includeParams=" get" encode ="true" /> " name="langForm" style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;"> Language: < s:select label ="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" /> </ form > 上述代码的原理为,LangSelector.jsp先实例化一个Locales对象,并把对象的Map类型的属性locales赋予下拉列表(select)。如此一来,下拉列表就获得可用语言的列表。大家看到LangSelector有<s:form>标志和一段Javascript脚本,它们的作用就是在用户在下拉列表中选择了后,提交包含“reqeust_locale”变量的表单到Action。在打开页面时,为了下拉列表的选中的当前区域,我们需要到session取得当前区域(键为“WW_TRANS_I18N_LOCALE”的属性),而该属性在没有设置语言前是为空的,所以通过值栈中locale属性来取得当前区域(用户浏览器所设置的语言)。 你可以把LangSelector.jsp作为一个控件使用,方法是在JSP页面中把它包含进来,代码如下所示:
<
s:include
value
="/LangSelector.jsp"
/>
在例1中的HellloWorld.jsp中<body>后加入上述代码,并在struts.xml中新建Action,代码如下:
<
action
name
="HelloWorld"
>
< result > /HelloWorld.jsp </ result > </ action > 或者,如果你多个JSP需要实现上述功能,你可以使用下面的通用配置,而不是为每一个JSP页面都新建一个Action。
<
action
name
="*"
>
< result > /{1}.jsp </ result > </ action > 分布运行程序,在浏览器的地址栏中输入http://localhost:8080/Struts2_i18n/HelloWorld.action,出现图4所示页面: 图3 HelloWorld.action 在下拉列表中,选择“American English”,出现图5所示页面: 图4 HelloWorld.action
|
【Struts2.0】在Struts 2.0中国际化(i18n)您的应用程序
最新推荐文章于 2022-05-25 11:44:24 发布