1. 建立资源文件
中文资源:language_zh_CN.properties (language-自定义名称,zh-中文,CN-中国)
英文资源:language_en_US.properties (language保持一致,en-英文,US-美国)
其内容就是键值对,俩资源文件的键名对应保持一致,值分别对应中文与英文
其中中文在MyEclipse环境下,用Properties进行编辑,直接输入中文
如:password 密码
那么从Source看时,就可看到中文是用Unicode表示的
如:password=\u5BC6\u7801
2. 配置
struts.xml文件中,配置i18n的源,值取资源文件的自定义名称部分(如果资源文件不是在src下,记得加上包路径):
<constant name="struts.custom.i18n.resources" value="language"></constant>
web.xml文件中,配置Struts2:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. jsp中使用资源
加入标签引用:<%@ taglib prefix="s" uri="/struts-tags" %>
s:text标签用健名取资源值:<s:text name="password"/>
或者表单元素用:key="password"
4. 在action中使用资源
用ActionSupport类中的方法取资源值:getText("password")
二、js中要获取以上的资源值,就比较麻烦了
单独建立一套资源的话,就需要维护两套资源,重复且维护麻烦
1. js中使用量较少时,可在jsp页面中定义变量先取出资源值
用js代码如:var curPassword='<s:text name="password"/>'
或:var curLang = {
password : '<s:text name="password"/>',
user : '<s:text name="user"/>'
}
那单独的js文件中就可直接使用了
2. 另外想到的是从Java资源中全部取出,在js中再建立一个语言的对象
struts国际化,是建立在java国际化之上,做了一次封装
java国际化,用到的有两个类:Locale、ResourceBundle
Locale是语言类,选定当前的语言与地域,如:Locale locale = new Locale("zh","CN")
ResourceBundle是资源类,加载的是资源
如:ResourceBundle bundle = new ResourceBundle.getBundle("language",locale)
有个方法可取键值:bundle.getString("password")
找到一个方法可取全部键名:Set<String>keys=bundle.keySet()
好,再看Struts2中如何取ResourceBundle对象:
ActionSupport类中方法:ResourceBundle bundle=getTexts("langauge")
Action中添加方法:
protected String getCurLang(String resourceName){
ResourceBundle bundle=getTexts(resourceName)
if(null != bundle){
Set<String>keys=bundle.keySet()
Iterator<String>it = keys.iterator()
StringBuffer curLang = new StringBuffer()
curLang.append("{")
int id=0
String key
while(it.hasNext()){
key=it.next()
if(id>0){
curLang.append(",")
}
curLang.append(key)
curLang.append(":\'")
curLang.append(getText(key))
curLang.append("\'")
id++
}
curLang.append("}")
return curLang.toString()
}
return ""
}
然后放入session中:session.setAttribute("curLang",getCurLang("langauge"))
或前台调用Ajex通讯取得
最后,前台把它转为对象,如:
var strvar curLang="<%=session.getAttribute("curLang")%>"
那么js文件中就可直接使用了:curLang["password"]
json数据格式其实就是字符串类型的键值对格式,并不适合数组传递,其实lz完全可以将数组转换成字符串格式,然后后台写个转换方法就ok了。如:js代码
var intArray = [1,2,3,4]
var stringInt = ""
for(var i=0i<intArray.lengthi++){
stringInt = stringInt+intArray[i]+","//连接符其实可以换的
}
stringInt = stringInt.substring(0,stringInt.length-1)
java代码
public Object[] getArray(String stringArray){
return stringArray.split(",")//其实这个里面还可以做很多操作,封装对象,过滤,判断等等
}