[標(biāo)題]:[原]Struts2-國(guó)際化
[時(shí)間]:2009-8-9
[摘要]:Struts2 internationalization
[關(guān)鍵字]:浪曦視頻,Struts2應(yīng)用開發(fā)系列,WebWork,Apache,國(guó)際化,i18n,multi-lingual,多語言,資源文件
[環(huán)境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
[作者]:Winty (wintys@gmail.com) http://www.tkk7.com/wintys
[正文]:
首先要在struts.xml中配置全局國(guó)際化文件Basename為message:
<constant name="struts.custom.i18n.resources" value="
message" />
1、JSP頁面的國(guó)際化
a.普通信息國(guó)際化
在src目錄下新建message.properties(optional,沒有zh_CN和en_US等資源文件時(shí)就會(huì)找message.properties),新建對(duì)應(yīng)的中文和英文properties為:
message_zh_CN.properties、message_en_US.properties。
/StrutsHelloWorld/src/
message_en_US.properties:
wintys.i18n.title=Register
/StrutsHelloWorld/src/
message_zh_CN.properties:
wintys.i18n.title=注冊(cè)
在JSP頁面中使用:
<s:text name="wintys.i18n.title" />
在瀏覽器中訪問時(shí),會(huì)根據(jù)不同的Locale顯示相應(yīng)的國(guó)際化信息。
b.表單信息國(guó)際化
同樣是在message_zh_CN.properties、message_en_US.properties中配置key=value。
JSP頁面中的表單:
<s:form action="...">
......
<s:textfield name="name" key="wintys.i18n.name" />
......
</s:form>
沒有國(guó)際化時(shí)是用<s:textfield label="name" />,國(guó)際化后應(yīng)該用<s:textfield name="name"
key="wintys.i18n.name" />
注意,
國(guó)際化時(shí),表單的theme不能為simple。
c.國(guó)際化標(biāo)簽<s:i18n />
除了可以使用<s:text />國(guó)際化,還可以使用<s:i18n />。<s:text />會(huì)在message_XX_XX.properties中查找key(如果有包級(jí)別、類級(jí)別的properties,則會(huì)優(yōu)先應(yīng)用包級(jí)別和類級(jí)別的properties)。而<s:i18n name="basename"/>則在basename指明的文件(/src/basename_XX_XX.properties)中查找key。
/StrutsHelloWorld/src/messagefile_en_US.properties:
wintys.i18n.desc = description
wintys.i18n.addition = {0} , additional information
/StrutsHelloWorld/src/messagefile_zh_CN.properties:
wintys.i18n.desc = "u8BF4"u660E
wintys.i18n.addition ={0} , "u989D"u5916"u4FE1"u606F
使用如下:
<s:i18n name="
messagefile">
<s:text name="wintys.i18n.desc"/><br/>
<s:text name="wintys.i18n.addition">
<s:param>Hello</s:param>
</s:text>
</s:i18n>
2、Action中的國(guó)際化
ActionSupport類中有一系列重載的getText()方法,用于國(guó)際化。
一句話:addActionError(
getText("wintys.i18n.name.invalid"));。addFieldError()也類似。
/StrutsHelloWorld/src/wintys/struts2/i18n/I18nAction.java:
package wintys.struts2.i18n;
import com.opensymphony.xwork2.ActionSupport;
/**
*
* @author Winty (wintys@gmail.com)
* @version 2009-8-9
* @see http://wintys.blogjava.net
*/
public class I18nAction extends ActionSupport {
private static final long serialVersionUID = 2188344424923390101L;
private String name;
private int age;
//此處省略了getter and setter
@Override
public void validate() {
if(name == null || "".equals(name.trim()) ){
//before i18n
//addActionError("name should not be empty");
//after i18n
//帶參數(shù)也可以:getText(String key , String[] args);
addActionError(getText("wintys.i18n.name.invalid"));
}
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
3、驗(yàn)證框架的國(guó)際化
一句話:<message
key="wintys.i18n.age.conversion.error" />。
還可以使用<message>${getText("name.invalid")}</message>。
/StrutsHelloWorld/src/wintys/struts2/i18n/I18nAction-validation.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="age">
<field-validator type="conversion" short-circuit="true">
<!-- before i18n:<message>age conversion error</message> -->
<message key="wintys.i18n.age.conversion.error" />
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<!-- <message>age range: ${min} ~ ${max}</message> -->
<message key="wintys.i18n.age.exceed.range"/>
</field-validator>
</field>
</validators>
4、局部國(guó)際化文件
前面所定義的key都是在全局國(guó)際化文件message_XX_XX.properties中定義的,也可以定義包級(jí)別和類級(jí)別的properties,其中key的優(yōu)先級(jí)是:類級(jí)別>包級(jí)別>全局。
a.包級(jí)別properties
在包中新建"
package_XX_XX.properties"。
/StrutsHelloWorld/src/wintys/struts2/i18n/
package_en_US.properties:
wintys.i18n.name = Name
wintys.i18n.age = Age
wintys.i18n.submit = Submit
/StrutsHelloWorld/src/wintys/struts2/i18n/
package_zh_CN.properties:
wintys.i18n.name = \u59D3\u540D
wintys.i18n.age = \u5E74\u9F84
wintys.i18n.submit = \u63D0\u4EA4
b.類級(jí)別properties
在包中新建"類名_XX_XX.properties"。
/StrutsHelloWorld/src/wintys/struts2/i18n/
I18nAction_en_US.properties:
wintys.i18n.name = Name(class level)
wintys.i18n.age = Age(class level)
wintys.i18n.submit = Submit(class level)
/StrutsHelloWorld/src/wintys/struts2/i18n/
I18nAction_zh_CN.properties:
wintys.i18n.name = \u59D3\u540D(\u7C7B\u7EA7\u522B)
wintys.i18n.age = \u5E74\u9F84(\u7C7B\u7EA7\u522B)
wintys.i18n.submit = \u63D0\u4EA4(\u7C7B\u7EA7\u522B)
注意:包級(jí)別、類級(jí)別properties只有在jsp頁面提交到action,正在顯示的頁面是.action時(shí),才能被讀取并顯示。
5、其它
a.Struts國(guó)際化由I18n攔截器實(shí)現(xiàn)(xwork-2.1.2.jar/com.opensymphony.xwork2.interceptor.I18nInterceptor)。
b.在瀏覽器中設(shè)置不同的語言首選項(xiàng)即可看到國(guó)際化的效果。
6、詳細(xì)代碼
/StrutsHelloWorld/WebRoot/i18n/input.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>register</title>
<meta http-equiv="pragma" content="no-cache">
</head>
<body>
<s:actionerror/>
<s:text name="wintys.i18n.title" />
<s:form action="i18n" >
<!--s:textfield name="name" label="姓名"/ -->
<!-- s:textfield name="age" label="年齡" / -->
<!-- s:submit name="submit" value=" 提交 " / -->
<s:textfield name="name" key="wintys.i18n.name"></s:textfield><br/>
<s:textfield name="age" key="wintys.i18n.age"></s:textfield><br/>
<s:submit name="submit" key="wintys.i18n.submit"></s:submit>
</s:form>
<s:i18n name="messagefile">
<s:text name="wintys.i18n.desc"/><br/>
<s:text name="wintys.i18n.addition">
<s:param>Hello</s:param>
</s:text>
</s:i18n>
</body>
</html>
/StrutsHelloWorld/WebRoot/i18n/output.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'output.jsp' starting page</title>
</head>
<body>
姓名:<s:property value="name"/><br/>
年齡:<s:property value="age"/><br/>
</body>
</html>
struts.xml配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 定義全局錯(cuò)誤信息資源文件message.properties -->
<constant name="struts.custom.i18n.resources" value="message" />
<package name="MyStruts" extends="struts-default">
<!-- 國(guó)際化 -->
<action name="i18n" class="
wintys.struts2.i18n.I18nAction">
<result name="success">/i18n/output.jsp</result>
<result name="input">/i18n/input.jsp</result>
</action>
</package>
</struts>
/StrutsHelloWorld/src/message_en_US.properties:
wintys.i18n.title=Register
wintys.i18n.name.invalid=NAME should not be empty.
wintys.i18n.age.conversion.error = age conversion error.
wintys.i18n.age.exceed.range = age exceed range: ${min} ~ ${max}
wintys.i18n.name = Name(global level)
wintys.i18n.age = Age(global level)
wintys.i18n.submit = Submit(global level)
/StrutsHelloWorld/src/message_zh_CN.properties:
wintys.i18n.title=\u6CE8\u518C
wintys.i18n.name.invalid =\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A
wintys.i18n.age.conversion.error =\u5E74\u9F84\u8F6C\u6362\u9519\u8BEF
wintys.i18n.age.exceed.range =\u5E74\u9F84\u8D85\u51FA\u8303\u56F4\: ${min} ~ ${max}
wintys.i18n.name = \u59D3\u540D(\u5168\u5C40)
wintys.i18n.age = \u5E74\u9F84(\u5168\u5C40)
wintys.i18n.submit =\u63D0\u4EA4(\u5168\u5C40)
[參考資料]:
[1] 《浪曦視頻之Struts2應(yīng)用開發(fā)系列》
[2] 【Java EE】struts2國(guó)際化 :
http://www.cnitblog.com/intrl/archive/2009/04/18/56464.html
[3] Struts2 的國(guó)際化 : http://hi.baidu.com/countryroadtao/blog/item/4ac77e2b6ec3c4305243c125.html
[附件]:
源代碼 :
http://www.tkk7.com/Files/wintys/Struts_helloworld_i18n.zip
posted on 2009-08-10 18:13
天堂露珠 閱讀(770)
評(píng)論(2) 編輯 收藏 所屬分類:
Struts