國(guó)際化又叫118N是一種處理引擎,通過(guò)它們一個(gè)應(yīng)用程序能夠適應(yīng)各種語(yǔ)言和地區(qū)而不用修改應(yīng)用邏輯。為了支持國(guó)際化,一個(gè)應(yīng)用必須考慮下列問(wèn)題。
1.文本,錯(cuò)誤提示,異常提示,GUI組件標(biāo)簽必須放到資源文件中。這些資源文件容納下面介紹的特定的信息。
2.日期,時(shí)間,貨幣,數(shù)字,計(jì)量單位和電話號(hào)碼必須基于本地參數(shù)和文化格式化顯示。
在今天的全球化市場(chǎng)一個(gè)帶國(guó)際化支持的應(yīng)用是很重要的。實(shí)現(xiàn)國(guó)際化功能比在程序開發(fā)完后合并多語(yǔ)言要方便得多。國(guó)際化類通過(guò)JDK提供的本地類處理本地顯示。一個(gè)本地對(duì)象表現(xiàn)了一個(gè)特定地區(qū)的地理,政治,文化。下面討論struts怎么實(shí)現(xiàn)國(guó)際化。
本地對(duì)象
struts類提供了118N支持,用getAttribute(Action.LOCALE_KEY)從HttpSession中獲得本地特定信息。本地對(duì)象使用下面介紹的幾種方式保存在session中。
使用HtmlTag:定制的標(biāo)簽org.apache.struts.taglib.html.HtmlTag插入到j(luò)sp中.這是也聲明的方式保存。當(dāng)locale為true時(shí),標(biāo)簽邏輯會(huì)使用HttpServletRequest.getLocale()方法獲得本地對(duì)象。getLocale方法返回客戶端瀏覽器基于Accept-Language header接受的內(nèi)容的首選本地對(duì)象。當(dāng)客戶端沒(méi)有提供一個(gè)Accept-Language header一個(gè)默認(rèn)的本地對(duì)象將返回。如果session不存在就會(huì)創(chuàng)建,然后本地對(duì)象將用Action.LOCALE_KEY存到session對(duì)象中。HTML標(biāo)簽接著使用本地對(duì)象的語(yǔ)言屬性設(shè)置特定語(yǔ)言到輸出流中。這種方式本地對(duì)象存儲(chǔ)一次;以后的locale=true的操作將不能替換session中的本地對(duì)象。這種方式最好用在用戶更改瀏覽器本地設(shè)置時(shí)。
使用action對(duì)象
如果要變成改變本地對(duì)象,action類提供了setLocale方法使用Action.LOCALE_KEY保存本地對(duì)象到session中。這種設(shè)置本地對(duì)象的方式最好用在用戶通過(guò)點(diǎn)擊UI組件選擇HTML表單的本地化方式時(shí)。但是,如果本地化資源正在加載,而用戶正在改變本地化方式時(shí)會(huì)引起錯(cuò)誤。當(dāng)一個(gè)本地化改變時(shí)最好在重置所有本地資源且可控的方式下進(jìn)行。
使用
在struts-config.xml文件中通過(guò)controller標(biāo)簽,標(biāo)記RequestProcessor從
國(guó)際化提示和標(biāo)簽
因?yàn)橐С謬?guó)際化,所以所有的錯(cuò)誤提示,指導(dǎo)性的提示,信息,標(biāo)題,GUI組件的標(biāo)簽,輸入標(biāo)簽必須必須單獨(dú)保存,通過(guò)本地特定方式處理。struts框架提供了MessageResources類用來(lái)模擬JDK提供的ResourceBundle類。本地特定的資源包提供一個(gè)分離本地特定信息的方式。資源包的成員都使用一個(gè)共同的基本名字,但是名字的額外部分標(biāo)識(shí)不同的本地性。默認(rèn)的資源包也有同樣的基本名字,沒(méi)有找到匹配的本地信息時(shí)就用默認(rèn)包。例如:
如果資源包名為MyApplicationResources,這這個(gè)包家族的成員名字會(huì)是。
MyApplicationResources_en 英文包
MyApplicationResources_fr 法語(yǔ)包
MyApplicationResources_fr_FR 法國(guó)的法語(yǔ)包
MyApplicationResources_fr_CA 加拿大的法語(yǔ)包
資源包搜索順序如下:
1. MyApplicationResources_fr_FR 預(yù)期的包
2. MyApplicationResources_fr 預(yù)期包沒(méi)有時(shí)找它
3. MyApplicationResources_en_US 沒(méi)有匹配包時(shí)用默認(rèn)包
4. MyApplicationResources_en 沒(méi)有默認(rèn)包時(shí)用它
5. MyApplicationResources 最基本的包
struts使用MessageResources對(duì)象提供相對(duì)容易的方式實(shí)現(xiàn)上述的機(jī)制。MessageResources對(duì)象通過(guò)下面的屬性文件定義的名/值對(duì)初始化。你只需要在struts-config.xml定義MessageResources的基本名字,就可以按一致的搜索方式處理本地資源文件。
配置文件中的parameter屬性值聲明了基本的不帶本地信息的屬性文件。這個(gè)基本的資源文件名為MyApplicationResources.properties,本地文件可能取名為MyApplicationResoures_localeSpecificExtension.properties.對(duì)每一個(gè)程序,我們可以定義一個(gè)或多個(gè)基本包名字。消息資源對(duì)象由控制器中的ActionServlet根據(jù)Globals.MESSAGES_KEY(和Action.MESSAGES_KEY相同)保存到ServletContext中,或者是多個(gè)消息資源時(shí),所有消息資源對(duì)象使用
要獲得本地消息,傳遞本地消息key參數(shù)給MessageResources.getMessage即可。使用Action.LOCALE_KEY可以從session中獲得本地對(duì)象。當(dāng)給MessageResources.getMessage提供一個(gè)對(duì)象參數(shù),獲得的消息將作為一個(gè)消息格式模式并轉(zhuǎn)換為消息格式對(duì)象。消息格式對(duì)象然后調(diào)用MessageFormat.format方法同時(shí)傳遞被適當(dāng)格式化的對(duì)象。消息格式化類不是本地特定的,因此相關(guān)消息格式模式和對(duì)象必須獲得本地化信息到帳號(hào)中。消息資源API提供了許多方法處理消息;相關(guān)JavaDoc可以在http://jakarta.apache.org/struts/api/index.html查到。