在struts2中需要做國際化的有:
jsp頁面的國際化,action錯誤信息的國際化,轉換錯誤信息的國際化,校驗錯誤信息的國際化
在之前的例子中已經做過和國際化相關的例子了,在struts.xml中配置過
view plaincopy to clipboardprint?
<constant name="struts.custom.i18n.resources" value="message"></constant>
其中的message就是國際化資源文件的baseNmae。
我們先看看簡單的在jsp中進行國際化
在src目錄下新建message_en_US.properties,內容為
hello=add user
新建message_zh_CN.properties文件,內容為
hello=\u589e\u52a0\u7528\u6237
然後修改register2.jsp
要想使用國際化顯示,可以將信息添加到<s:text></s:text> 標簽中,也可以放在<s:i18n></s:i18n> 中,
在這裡,先使用標簽 <s:text></s:text>
增加以下內容:
view plaincopy to clipboardprint?
<s:text name="hello"></s:text>
重啟服務器後,浏覽該頁,默認會顯示出“增加用戶”,可以在IE中打開Internet選項,在常規中選擇語言,增加英語(美國)[en-US],然後設置為第一項,刷新就可以看到輸出“add user”。
action錯誤的國際化
在message_en_US.properties中增加以下內容
username.invalid=username invalid...
在message_zh_CN.properties中增加以下內容
username.invalid=\u7528\u6237\u540d\u4e0d\u5408\u6cd5...
修改RegisterAction中的validate方法,將錯誤加到ActionError中,在這裡將使用到ActionSupport中的getText方法獲得和國際化資源文件相關的信息。
以username驗證為例:
view plaincopy to clipboardprint?
if (null == username || username.length() < 5 || username.length() > 10) {
this.addActionError(this.getText("username.invalid"));
}
這樣就從資源文件中讀取username.invalid的值,增加到ActionError中。
查看該頁面不輸入任何數據,提交後就可以看到顯示效果了。
驗證框架的國際化(field級別錯誤)
在message_en_US.properties文件中增加以下內容
username.xml.invalid=validate information
在message_zh_CN.properties文件中增加以下內容
username.xml.invalid=\u9a8c\u8bc1\u6846\u67b6\u4fe1\u606f
然後修改驗證框架,需要將在properties文件中的內容增加到框架中。
以username為例
view plaincopy to clipboardprint?
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="username.xml.invalid"></message>
</field-validator>
</field>
在message標簽中增加屬性key,值為properties文件中的key
標簽中key大多是和國際化相關的
國際化資源文件的分類
當應用程序很大時,需要國際化的東西會很多,因此需要將國際化資源文件進行分類。
需要知道的是在src中的properties文件是全局資源文件,另外還可以分為包級別的和類級別的
首先看看包級別的
命名規則為package_language_country.properties
新建package_en_US.properties,內容為
username.xml.invalid=package validate information
新建package_zh_CN.properties,內容為
username.xml.invalid=\u5305\u9a8c\u8bc1\u4fe1\u606f
可以看到輸出的信息為“包驗證信息”,由此可見包級別的國際化資源文件的優先級高於全局國際化資源文件。
類級別
新建RegisterAction_en_US.properties,內容為
username.xml.invalid=class validate information
新建RegisterAction_zh_CN.properties,內容為
username.xml.invalid=\u7c7b\u9a8c\u8bc1\u4fe1\u606f
此時可以看到輸出的信息為“類驗證信息”。
由此可以得到國際化資源文件的優先級
全局<包級別<類級別
另外要進行表單的國際化時,要去掉theme="simple"
在RegisterAction_en_US.properties中增加
username.name=username
在RegisterAction_zh_CN.properties中增加
username.name=\u7528\u6237\u540d
修改表單標簽
view plaincopy to clipboardprint?
<s:textfield name="username" key="username.name"></s:textfield>
注意到key一般是和國際化相關的。
另外除了用
另外除了用<s:text>這個標簽外,還可以使用<s:i18n>這個標簽
view plaincopy to clipboardprint?
<s:i18n name="temp"></s:i18n>
標簽中包含name,代表著可以定義資源文件的baseName,如可以定義成temp,那麼對應著
temp_en_US.properties和temp_zh_CN.properties這兩個資源文件。
如定義:
view plaincopy to clipboardprint?
<s:i18n name="hello">
<s:text name="world">
<s:param>struts2</s:param>
</s:text>
</s:i18n>
注意到可以在<s:text>標簽中增加<s:i18n> 標簽。
在hello_en_US.properties文件中增加
world=hello {0}
hello_zh_CN.properties中增加
world=\u4f60\u597d,struts2
在struts2的默認攔截器棧中已經定義了i18n攔截器,所以struts2已經是一個國際化的框架了。
struts2會查找從客戶端提交的request_locale屬性,並存到session中的WW_TRANS_I18N_LOCALE字段
中。
這個<s:text> 標簽外,還可以使用<s:i18n> 這個標簽
view plaincopy to clipboardprint?
<s:i18n name="temp"></s:i18n>
總結一下顯示方法:
<s:textname="hello"></s:text>
getText("username.invalid")
<message key="username.xml.invalid"></message>
<s:textfield name="username" key="username.name"></s:textfield>
<s:i18n name="temp"></s:i18n>