一、国际化资源文件
国际化资源文件一般使用.properties文件存储国际化信息,主要是使用键值对的形式,即key=value。国际化资源文件的命名规则是:resourceName_language_country.properties。其中resourceName是可以自定义的资源文件名,language表示地区语言代码(不能自定义,例如zh表示简体中文,en表示英语等),country表示国家地区代码(不能自定义,例如CN代表中国,US代表美国等)。
二、配置资源方式有三种:
假设国际化资源名称是:globalMessages_en_US.properties
1、使用struts.xml配置文件:
只需在struts.xml文件中加入:<constant name="struts.custom.i18n.resources" value="globalMessages"></constant>
2、使用struts.properties文件:
struts.custom.i18n.resources=globalMessages
3、使用web.xml文件:
<init-param>
<param-name>struts.custom.i18n.resources</param-name>
<param-value>globalMessages</param-value>
</init-param>
注意:最好使用前两种方式。struts.custom.i18n.resources在struts2中表示国际化常量。
三、加载国际化资源文件的方式:
I. Action 范围资源文件: 在Action类文件所在的路径建立名为ActionName_language_country.properties 的文件
II. 包范围资源文件: 在包的根路径下建立文件名为package_language_country.properties 的属性文件,一旦建立,处于该包下的所有 Action 都可以访问该资源文件。注意:包范围资源文件的 baseName 就是package,不是Action所在的包名。
III. 全局资源文件
> 命名方式: basename_language_country.properties
> struts.xml <constant name="struts.custom.i18n.resources" value="baseName"/>
四、struts2国际化应用:
1、一般国际化应用:
页面index.jsp:
<%@taglib prefix="s" uri="/struts-tags" %>
<title><s:text name="loginpage"></s:text></title>
<h2><s:text name="userlogin"></s:text></h2>
<s:i18n name="globalMessages">
<s:form action="LoginAction!login.action" method="post" namespace="/">
<s:textfield name="username" key="username"></s:textfield>
<s:textfield name="password" key="password"></s:textfield>
<s:submit key="loginbtn"></s:submit>
</s:form>
</s:i18n>
struts.xml配置文件:
<constant name="struts.custom.i18n.resources" value="globalMessages"></constant>
globalMessages_zh_CN.properties:
username=\u59D3\u540D
password=\u5BC6\u7801
loginbtn=\u767B\u5F55
loginpage=\u767B\u5F55\u754C\u9762
userlogin=\u6D4B\u8BD5 struts2 \u56FD\u9645\u5316
globalMessages_en_US.properties:
username=username
password=password
loginbtn=login
loginpage=loginpage
userlogin=Test Struts2 I18N
实现界面:
2、带占位符的国际化资源文件
方法一:在jsp页面上填充占位符
globalMessages_zh_CN.properties:
showpage=\u663E\u793A\u9875\u9762
loginsuccess=\u767B\u9646\u6210\u529F
logindate=\u767B\u9646\u65F6\u95F4\u4E3A {0}
loginmsg=\u606D\u559C\u60A8: {0},\u767B\u9646\u6210\u529F!
title=\u6D4B\u8BD5I18N\u56FD\u9645\u5316\u767B\u5F55\u6210\u529F\u754C\u9762
globalMessages_en_US.properties:
showpage=showpage
loginsuccess=LoginSuccess
logindate=Login Date is {0}
loginmsg=Congratulation: {0},Login Success!
title=Test I18N Success Show Page
创建一个登陆使用的action:
package com.web.action;
import java.util.Date;
//测试国际化的用户登录action
public class LoginAction extends BaseAction {
private String username;
private String password;
private Date loginDate;
public String login() {
if (username.equals("admin") && password.equals("123456")) {
return SUCCESS;
} else {
this.addFieldError("username", "姓名或密码不正确!");
return INPUT;
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getLoginDate() {
loginDate = new Date();
return loginDate;
}
public void setLoginDate(Date loginDate) {
this.loginDate = loginDate;
}
}
struts.xml配置文件:
<struts>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.custom.i18n.resources" value="globalMessages"></constant>
<!-- 配置包元素 -->
<package name="default" extends="struts-default" namespace="/">
<action name="LoginAction" class="com.web.action.LoginAction1">
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>
登陆成功页面success.jsp:
<h2><s:text name="title"></s:text></h2>
<s:text name="loginmsg">
<s:param><s:property value="username"/></s:param>
</s:text>
<br><br>
<s:text name="logindate">
<s:param><s:date name="loginDate" format="yyyy-MM-dd HH:mm:ss"/></s:param>
</s:text>
方法二:在action中填充占位符
用户登录使用的action:
package com.web.action;
import java.util.Date;
public class LoginAction1 extends BaseAction {
private String username;
private String password;
private String logindate; // 存储登陆成功的时间信息
private String msg; // 存储登录成功的信息
public String login() {
System.out.println(new Date().toString());
// 填充国际化资源文件中的loginmsg占位符
this.msg = getText("loginmsg", new String[] { this.username });
// 填充国际化资源文件中loginDate的占位符
this.logindate = getText("logindate", new String[] { new Date().toString() });
if (username.equals("admin") && password.equals("123456")) {
return SUCCESS;
} else {
this.addFieldError("username", "姓名或密码不正确!");
return INPUT;
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getLogindate() {
return logindate;
}
public void setLogindate(String logindate) {
this.logindate = logindate;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
登录页面index.jsp同上
登陆成功界面success.jsp:
<s:property value="msg"/>
<br><br>
<s:property value="logindate"/>
实现效果截图:
3、实现自由选择语言环境
在很多成熟的、完善的商业软件或网站系统中,通常都可以实现自由切换语言环境的功能,用户可以根据自己的喜好切换语言环境,增加了用户的体验度。
代码:
实现选择语言环境的action:ChooseAction.java
package com.web.action;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
public class ChooseAction extends BaseAction {
// 定义本地化对象current
private Locale current;
public String chooseLanguage() {
return SUCCESS;
}
public Map getLocales() {
// 定义map类型实例化对象locales
Map locales = new HashMap(2);
// 获取系统的默认国家/语言环境
ResourceBundle bundle = ResourceBundle.getBundle("globalMessages", current);
// 向集合中装载美国英语语言对象
locales.put(bundle.getString("lang.en"), Locale.US);
// 向集合中装载简体中文语言对象
locales.put(bundle.getString("lang.cn"), Locale.CHINA);
// 返回本地化信息
return locales;
}
public Locale getCurrent() {
return current;
}
public void setCurrent(Locale current) {
this.current = current;
}
}
struts.xml配置文件中添加:
<action name="ChooseAction" class="com.web.action.ChooseAction">
<result name="success">/chooselanguage.jsp</result>
</action>
globalMessages_en_US.properties:
chooselang=Language
lang.en=American English
lang.cn=Simplified Chinese
globalMessages_zh_CN.properties:
chooselang=\u9009\u62E9\u8BED\u8A00
lang.en=\u7F8E\u56FD\u82F1\u8BED
lang.cn=\u7B80\u4F53\u4E2D\u6587
实现自由切换的页面chooselanguage.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<script type="text/javascript">
function changeLocal(){
document.myform.submit();
}
</script>
</head>
<body>
<!-- 将用户session中的i18n信息设置成SESSION_LOCALE -->
<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"></s:set>
<!-- 通过 com.web.action.ChooseAction类,将SESSION_LOCALE的值传入current
如果改值为null,则为本地locale,否则为选择的SESSION_LOCALE-->
<!-- 通过使用bean标签向ChooseAction类中的current属性赋值 -->
<s:bean id="localeList" name="com.web.action.ChooseAction">
<s:param name="current" value="#SESSION_LOCALE==null?locale:#SESSION_LOCALE"></s:param>
</s:bean>
<s:form action="ChooseAction!chooseLanguage.action" method="post" name="myform">
<s:text name="chooselang"></s:text>
<!-- 使用select标签生成下拉框,列表项为ChooseAction类中getLocales()方法中返回的map对象 -->
<s:select list="#localeList.locales" name="request_locale"
value="#SESSION_LOCALE==null?locale:#SESSION_LOCALE" id="langSelect"
listKey="value" listValue="key" οnchange="changeLocal()" theme="simple"></s:select>
<s:textfield name="username" key="username"></s:textfield>
<s:password name="password" key="password"></s:password>
<s:submit key="loginbtn"></s:submit>
</s:form>
</body>
</html>
实现页面: