struts2中I18N国际化

国际化主要是指语言国际化。一般的比较成熟的网站都会实现国际化,以便于不同国家的人浏览网站。

一、国际化资源文件
国际化资源文件一般使用.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>

实现页面:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值