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