struts2国际化

struts2国际化我通过一个Demo来理解的。

国际化的配置文件包括:1.全局配置文件的国际化  2.包下配置文件的国际化   3.Action的国际化。如下图所示:

需要注意的是,国际化的配置文件命名规则是: resource_country_language.properties。

其中country表示国家或地区,它的取值由ISO-639定义的大写的、两个字母组成的代码,以下左表列出了常用的ISO-639语言代码。右表列出了常用的ISO-3166国家和地区代码

1.global__en_US.properties与global__zh_CN.properties是全局范围资源文件,应放在src下

global__en_US.properties配置如下:
id=ID
name=NAME
age=AGE
date=CREATEDATE
username=(G)username
password=(G)password
submit=(G)submit
chinese=(G)Chinese
english=(G)English
language=(G)Language
login=(G)Login Page
firstpage=This is the first page,you can change the language in any pages if you like

global__zh_CN.properties配置如下:
id=编号
name=用户名
age=年龄
date=申请时间
username=(G)用户名
password=(G)密码
submit=(G)提交
chinese=(G)中文
english=(G)英文
language=(G)语言
login=(G)登录页面
firstpage=这是首页,你可以根据你的需求更改语言

2.package_en_US.properties与package_zh_CN.properties是包范围的配置文件,放在所需要的包内,基名必须package开头的。

3.LoginAction__en_US.properties与LoginAction__zh_CN.properties是Action范围资源文件,应放在LoginAction.java同一目录下:

   ChangeLocale_en_US.properties与ChangeLocale_zh_CN.properties也是Action范围的资源文件,作用是用来切换国际化的。

LoginAction_en_US.properties配置如下:
validate=Username or Password is validate!

LoginAction_zh_CN.properties配置如下:
validate=用户名或密码错误!

ChangeLocale_en_US.properties配置如下:
chinese=(A)Chinese
english=(A)English
language=(A)Language

ChangeLocale_zh_CN.properties配置如下:
chinese=(A)中文
english=(A)英文
language=(A)语言

4.action文件的配置

LoginAction.java代码如下:
@Action("/login")
@Results({ @Result(name = "loginSuc", location = "/firstpage.jsp"),
		@Result(name = "loginErr", location = "/login.jsp") })
public class LoginAction extends ActionSupport {
	private String username;
	private String password;

	public String loginCheck() {
		if ("admin".equals(username) && "admin".equals(password)) {
			return "loginSuc";
		} else {
			addActionError(getText("validate"));
			return "loginErr";
		}
	}

	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;
	}
}

ChangeLocale.java的代码如下:
@Action("/changeLocale")
@Results({ @Result(name = "changeLocaleSuc", location = "/login.jsp") })
public class ChangeLocale extends ActionSupport {
	private String key;

	public String changeLocale() {
		HttpSession session = ServletActionContext.getRequest().getSession();
		Locale locale;
		if (key.equals("1")) {
			locale = Locale.CHINA;
		} else {
			locale = Locale.US;
		}
		ActionContext.getContext().setLocale(locale);
		session.setAttribute("WW_TRANS_I18N_LOCALE", locale);
		return "changeLocaleSuc";
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}
}

ChangeLanguage.java的代码如下:

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;

public class ChangeLanguage extends ActionSupport {

public Map<String, Locale> getLocales() {
Map<String, Locale> map = new HashMap<String, Locale>();
map.put(getText("chinese"), Locale.CHINA);
map.put(getText("english"), Locale.US);
return map;
}
}

5.struts.xml中要配置上国际化的信息

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<constant name="struts.custom.i18n.resources" value="global"/> <!-- global为国际化配置文件的基名,配置上之后struts会首先默认读取此基名的配置文件 -->
	<constant name="struts.i18n.encoding" value="UTF-8"/>
	<constant name="struts.convention.action.fileProtocols" value="jar,zip" />  
	<constant name="struts.convention.action.includeJars" value=".*?/_wl_cls_gen.*?jar(!/)?" />  
	<constant name="struts.convention.action.suffix" value="Action" />
	<constant name="struts.convention.action.mapAllMatches" value="true" />
	<constant name="struts.convention.default.parent.package"
		value="struts-default" />
	<constant name="struts.convention.package.locators" value="action,i18n" />
</struts>

5.jsp页面国际化的实现

login.jsp页面中,普通调用通过<s:text name="language"/>来实现,其中name为配置文件中的key名称。form表单中通过<s:textfield name="username" key="username"/>实现,key值为配置文件中的key名称。以此映射关系来对应中英文切换。
<body>
	<center>
		<table>
			<tr>
				<td><s:text name="language"/>:</td>
				<td>
					<a href="changeLocale!changeLocale?key=1"><s:text name="chinese"/></a>
					<a href="changeLocale!changeLocale?key=0"><s:text name="english"/></a>
				</td>
			</tr>
		</table>
		<h1><s:property value="%{getText('login')}"/></h1>
		<s:actionerror/>
		<s:form action="login!loginCheck">
			<s:textfield name="username" key="username"/>
			<s:password name="password" key="password"/>
			<s:submit key="submit"/>
		</s:form>
	</center>
</body>

firstpage.jsp页面:

<body>
  <s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>
  <s:bean id="locales" name="com.yimao.i18n.ChangeLanguage"/>
  <form name="form">
    <s:select
      key="language"
      list="#locales.locales"
      listKey="value"
      listValue="key"
      value="#SESSION_LOCALE==null?locale:#SESSION_LOCALE"
      name="request_locale" onchange="selectLanguage_onchanged()"/>
   </form>
   <s:text name="firstpage"/>
</body>

页面实现效果:

点击语言栏的(A)中文连接页面变成中文显示:

点击语言栏的(A)英文连接页面变成英文显示:

英文状态下的提交结果:

中文状态下的提交结果:

在这里可以根据下拉列表中的提示进行中英文切换。

以上是比较简单的实现,更多的实现有待补充。

原文地址:https://www.cnblogs.com/daisyleamo/p/3061271.html