|
國(guó)際化是商業(yè)系統(tǒng)中不可或缺的一部分,所以無(wú)論您學(xué)習(xí)的是什么Web框架,它都是必須掌握的技能。 其實(shí),Struts 1.x在此部分已經(jīng)做得相當(dāng)不錯(cuò)了。它極大地簡(jiǎn)化了我們程序員在做國(guó)際化時(shí)所需的工作,例如,如果您要輸出一條國(guó)際化的信息,只需在代碼包中加入FILE-NAME_xx_XX.properties(其中FILE-NAME為默認(rèn)資源文件的文件名),然后在struts-config.xml中指明其路徑,再在頁(yè)面用<bean:message>標(biāo)志輸出即可。 不過(guò),所謂“沒(méi)有最好,只有更好”。Struts 2.0并沒(méi)有在這部分止步,而是在原有的簡(jiǎn)單易用的基礎(chǔ)上,將其做得更靈活、更強(qiáng)大。 國(guó)際化Hello World下面讓我們看一個(gè)例子——HelloWorld。這個(gè)例子演示如何根據(jù)用戶瀏覽器的設(shè)置輸出相應(yīng)的HelloWorld。
<s:textfield name="name" label="%{getText(‘UserName‘)}"/>
資源文件查找順序之所以說(shuō)Struts 2.0的國(guó)際化更靈活是因?yàn)樗梢阅芨鶕?jù)不同需要配置和獲取資源(properties)文件。在Struts 2.0中有下面幾種方法:
上面我列舉了四種配置和訪問(wèn)資源的方法,它們的范圍分別是從大到小,而Struts 2.0在查找國(guó)際化字符串所遵循的是特定的順序,如圖3所示: ![]() 圖3 資源文件查找順序圖 假設(shè)我們?cè)谀硞€(gè)ChildAction中調(diào)用了getText("user.title"),Struts 2.0的將會(huì)執(zhí)行以下的操作:
參數(shù)化國(guó)際化字符串許多情況下,我們都需要在動(dòng)行時(shí)(runtime)為國(guó)際化字符插入一些參數(shù),例如在輸入驗(yàn)證提示信息的時(shí)候。在Struts 2.0中,我們通過(guò)以下兩種方法做到這點(diǎn):
讓用戶方便地選擇語(yǔ)言開(kāi)發(fā)國(guó)際化的應(yīng)用程序時(shí),有一個(gè)功能是必不可少的——讓用戶快捷地選擇或切換語(yǔ)言。在Struts 2.0中,通過(guò)ActionContext.getContext().setLocale(Locale arg)可以設(shè)置用戶的默認(rèn)語(yǔ)言。不過(guò),由于這是一個(gè)比較普遍的應(yīng)用場(chǎng)景(Scenario),所以Struts 2.0為您提供了一個(gè)名i18n的攔截器(Interceptor),并在默認(rèn)情況下將其注冊(cè)到攔截器鏈(Interceptor chain)中。它的原理為在執(zhí)行Action方法前,i18n攔截器查找請(qǐng)求中的一個(gè)名為"request_locale"的參數(shù)。如果其存在,攔截器就將其作為參數(shù)實(shí)例化Locale對(duì)象,并將其設(shè)為用戶默認(rèn)的區(qū)域(Locale),最后,將此Locale對(duì)象保存在session的名為“WW_TRANS_I18N_LOCALE”的屬性中。 下面,我將提供一完整示例演示它的使用方法。 package tutorial;![]() import java.util.Hashtable; import java.util.Locale; import java.util.Map;![]() publicclass 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先實(shí)例化一個(gè)Locales對(duì)象,并把對(duì)象的Map類(lèi)型的屬性locales賦予下拉列表(select) 。如此一來(lái),下拉列表就獲得可用語(yǔ)言的列表。大家看到LangSelector有<s:form>標(biāo)志和一段Javascript腳本,它們的作用就是在用戶在下拉列表中選擇了后,提交包含“reqeust_locale”變量的表單到Action。在打開(kāi)頁(yè)面時(shí),為了下拉列表的選中的當(dāng)前區(qū)域,我們需要到session取得當(dāng)前區(qū)域(鍵為“WW_TRANS_I18N_LOCALE”的屬性),而該屬性在沒(méi)有設(shè)置語(yǔ)言前是為空的,所以通過(guò)值棧中l(wèi)ocale屬性來(lái)取得當(dāng)前區(qū)域(用戶瀏覽器所設(shè)置的語(yǔ)言)。 你可以把LangSelector.jsp作為一個(gè)控件使用,方法是在JSP頁(yè)面中把它包含進(jìn)來(lái),代碼如下所示:<s:include value="/LangSelector.jsp"/>
在例1中的HellloWorld.jsp中<body>后加入上述代碼,并在struts.xml中新建Action,代碼如下: <action name="HelloWorld">
<result>/HelloWorld.jsp</result> </action> 或者,如果你多個(gè)JSP需要實(shí)現(xiàn)上述功能,你可以使用下面的通用配置,而不是為每一個(gè)JSP頁(yè)面都新建一個(gè)Action。 <action name="*">
<result>/{1}.jsp</result> </action> 分布運(yùn)行程序,在瀏覽器的地址欄中輸入http://localhost:8080/Struts2_i18n/HelloWorld.action,出現(xiàn)圖4所示頁(yè)面: ![]() 圖3 HelloWorld.action 在下拉列表中,選擇“American English”,出現(xiàn)圖5所示頁(yè)面: ![]() 圖4 HelloWorld.action
評(píng)論: # re: 在Struts 2.0中國(guó)際化(i18n)您的應(yīng)用程序 2006-11-02 11:22 | Java菜鳥(niǎo)[匿名]
十分感謝你的關(guān)于Struts 2的一系列文章,最近我正在學(xué)習(xí)Struts 2,由于時(shí)間緊,資料少,所以很感謝你的文章!
請(qǐng)問(wèn)你的文章來(lái)源是哪里,能不能共享一下,因?yàn)槲业捻?xiàng)目趕時(shí)間,另外請(qǐng)問(wèn)你關(guān)于Struts2與Webwork2有什么區(qū)別和進(jìn)步,有沒(méi)有這方面的文章,多謝指教! 回復(fù) # re: 在Struts 2.0中國(guó)際化(i18n)您的應(yīng)用程序 2006-11-07 15:03 | Frank[匿名]
謝謝Max的回復(fù).我試過(guò)關(guān)閉防火墻了,而且網(wǎng)絡(luò)連接沒(méi)有問(wèn)題,但問(wèn)題依舊.錯(cuò)誤提示如下:
在搜索期間遇到了網(wǎng)絡(luò)連接問(wèn)題。 無(wú)法訪問(wèn)“http://propedit./eclipse/updates/">http://propedit./eclipse/updates/">http://propedit./eclipse/updates/">http://propedit./eclipse/updates/”。 無(wú)法訪問(wèn)站點(diǎn):“http://propedit./eclipse/updates/">http://propedit./eclipse/updates/">http://propedit./eclipse/updates/">http://propedit./eclipse/updates/” [java.io.IOException] 無(wú)法訪問(wèn)站點(diǎn):“http://propedit./eclipse/updates/">http://propedit./eclipse/updates/">http://propedit./eclipse/updates/">http://propedit./eclipse/updates/” [java.io.IOException] 回復(fù) |
|
|