第十四部分_Struts2.1国际化详解

国际化:i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是"国际化"的简称。

我们通过三个实例进行讲解:

新建一个com.i18.com包,包下面建立一个类Test1:

package com.i18n;



import java.util.Locale;



public class Test1

{

	public static void main(String[] args)

	{

		Locale[] locales = Locale.getAvailableLocales();

		

		for(Locale locale: locales)

		{

			System.out.println(locale.getDisplayCountry() + " : "

					+ locale.getCountry());

		}

	}

}



/*output:

  日本 : JP

秘鲁 : PE

 : 

日本 : JP

巴拿马 : PA

波斯尼亚和黑山共和国 : BA

 : 

危地马拉 : GT

阿拉伯联合酋长国 : AE

挪威 : NO

阿尔巴尼亚 : AL

 : 

伊拉克 : IQ

也门 : YE

 : 

葡萄牙 : PT

塞浦路斯 : CY

卡塔尔 : QA

马其顿王国 : MK

 : 

瑞士 : CH

美国 : US

芬兰 : FI

 : 

 : 

马耳他 : MT

斯洛文尼亚 : SI

斯洛伐克 : SK

 : 

土耳其 : TR

 : 

 : 

沙特阿拉伯 : SA

 : 

英国 : GB

塞尔维亚及黑山 : CS

 : 

 : 

新西兰 : NZ

挪威 : NO

立陶宛 : LT

尼加拉瓜 : NI

 : 

爱尔兰 : IE

比利时 : BE

西班牙 : ES

黎巴嫩 : LB

 : 

加拿大 : CA

爱沙尼亚 : EE

科威特 : KW

塞尔维亚 : RS

美国 : US

墨西哥 : MX

苏丹 : SD

印度尼西亚 : ID

 : 

 : 

乌拉圭 : UY

拉脱维亚 : LV

 : 

巴西 : BR

叙利亚 : SY

 : 

 : 

多米尼加共和国 : DO

瑞士 : CH

印度 : IN

委内瑞拉 : VE

巴林 : BH

菲律宾 : PH

突尼斯 : TN

 : 

奥地利 : AT

 : 

荷兰 : NL

厄瓜多尔 : EC

台湾地区 : TW

约旦 : JO

 : 

冰岛 : IS

哥伦比亚 : CO

哥斯达黎加 : CR

智利 : CL

埃及 : EG

南非 : ZA

泰国 : TH

希腊 : GR

意大利 : IT

 : 

匈牙利 : HU

 : 

爱尔兰 : IE

乌克兰 : UA

波兰 : PL

卢森堡 : LU

比利时 : BE

印度 : IN

西班牙 : ES

摩洛哥 : MA

玻利维亚 : BO

澳大利亚 : AU

 : 

新加坡 : SG

 : 

 : 

萨尔瓦多 : SV

俄罗斯 : RU

韩国 : KR

 : 

阿尔及利亚 : DZ

越南 : VN

黑山 : ME

 : 

利比亚 : LY

 : 

中国 : CN

白俄罗斯 : BY

香港 : HK

 : 

以色列 : IL

保加利亚 : BG

 : 

马耳他 : MT

巴拉圭 : PY

 : 

法国 : FR

捷克共和国 : CZ

瑞士 : CH

罗马尼亚 : RO

波多黎哥 : PR

加拿大 : CA

德国 : DE

 : 

卢森堡 : LU

 : 

阿根廷 : AR

 : 

马来西亚 : MY

克罗地亚 : HR

新加坡 : SG

 : 

 : 

 : 

阿曼 : OM

 : 

泰国 : TH

 : 

 : 

瑞典 : SE

丹麦 : DK

洪都拉斯 : HN

*/

继续,在包下面建立一个Test2:

package com.i18n;



import java.util.Locale;

import java.util.ResourceBundle;



public class Test2

{

	public static void main(String[] args)

	{

		Locale locale = Locale.US; // Locale.CHINESE

		

		ResourceBundle bundle = ResourceBundle.getBundle("hellofile", locale);

		

		String value = bundle.getString("hello");

		

		System.out.println(value);

	}

}

在src下面建立两个文件:hellofile_en_US.properties,add一个name为"hello",value为"hello world"的键值对;hellofile_zh_CN.properties,add一个name为"hello",value为"你好"的键值对。运行这个程序,它会根据我们注释部分的代码的不同输出hello world或是你好。

最后,继续在该包下建立一个类Test3:

package com.i18n;



import java.text.MessageFormat;

import java.util.Locale;

import java.util.ResourceBundle;



public class Test3

{

	public static void main(String[] args)

	{

		Locale locale = Locale.US; // Locale.CHINESE

		

		ResourceBundle bundle = ResourceBundle.getBundle("hellofile", locale);

		

		String value = bundle.getString("hello");

		

		String message = MessageFormat.format(value, new Object[]{"中国"}); // 把对应的占位符({0})给替换掉

		

		System.out.println(message);

	}

}

把hellofile_en_US.properties中的值改为"hello world:{0}",hellofile_zh_CN.properties中name的值改为"你好:{0}",运行程序,根据Locale.US或是Locale.CHINESE的不同输出信息为:

hello world:中国 或者 你好:中国


最后,我们使用struts2包装好的工具来实现国际化:

我们仍然使用register.jsp:

 <body>

   	<s:actionerror cssStyle="color:red"/><%--actionerror中增加的所有信息显示到页面上 --%> 



  	<s:form action="register">

  		<s:textfield name="username" label="username"></s:textfield>

  		<s:password name="password" label="password"></s:password>

  		<s:password name="repassword" label="repassword"></s:password>

  		<s:textfield name="age" label="age"></s:textfield>

  		<s:textfield name="birthday" label="birthday"></s:textfield>

  		<s:textfield name="graduation" label="graduation"></s:textfield>

  		

  		<s:submit value="submit"></s:submit>

  	</s:form>

  </body>

写好它的处理类RegisterAction:

package com.test.action;



import java.util.Calendar;

import java.util.Date;



import com.opensymphony.xwork2.ActionSupport;



public class RegisterAction extends ActionSupport

{

	private String username;

	

	private String password;

	

	private String repassword;

	

	private int age;

	

	private Date birthday;

	

	private Date graduation;



	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 getRepassword()

	{

		return repassword;

	}



	public void setRepassword(String repassword)

	{

		this.repassword = repassword;

	}



	public int getAge()

	{

		return age;

	}



	public void setAge(int age)

	{

		this.age = age;

	}



	public Date getBirthday()

	{

		return birthday;

	}



	public void setBirthday(Date birthday)

	{

		this.birthday = birthday;

	}



	public Date getGraduation()

	{

		return graduation;

	}



	public void setGraduation(Date graduation)

	{

		this.graduation = graduation;

	}



	@Override

	public String execute() throws Exception

	{

		System.out.println("execute invoked");

		return SUCCESS;

	}

	

	@Override

	public void validate()

	{

		System.out.println("validate~~~~~~~~~~~~~~~~");

		if(null == username || username.length() < 6 || username.length() > 10)

		{

			// 进行错误信息的输出

			// this.addActionError("username invalid");

			

			this.addActionError(this.getText("username.invlalid", new String[]{username}));

			

		}

	}

	

}

然后再该Action对应的包com.test.action下,建立两个文件:RegisterAction_en_US.properties(name为"username.invalid",value为"user:{0} invalid")、RegisterAction_zh_CN.properties(name为"username.invalid",value为"用户:{0}无效")。

然后,在浏览器中访问:http://localhost:8080/struts2/register.jsp;下面是其输出样例(可以在浏览器的Internet首选项中将英语(美国)[en-US]添加到第一个位置,这样请求对象就会封装相关的信息,可以得到英文的错误提示):

第十四部分_Struts2.1国际化详解第十四部分_Struts2.1国际化详解

它是如何实现的?其实底层的实现正如我们在Test3中讲述的那样。 

你可能感兴趣的:(struts2)