java程序都国际化思路是将程序中的标签、提示等信息放在资源文件中,程序需要支持哪些国家、语言环境,就对应提供哪些相应的资源文件。资源文件就是key-value,每个资源文件的key可以保持不变的,但value则虽不同的国家、语言而改变。

1.java程序国际化主要通三个类来实现的,java.util.ResourceBundle:用于加载国家、语言资源包;java.util.Locale:用于封装特定的国家|区域、语言环境。java.text.MessageFormat:用于格式化带占位符的字符串。

2.java不可能支持所有的国家和语言,我们可以通过调用Locale类的getAvailableLocales()方法,该方法返回一个Locale数组,该数组里面包含了java支持的国家和语言。

package com.lanou.test;

import java.util.Locale;

public class Demo005 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Locale[] localelist = Locale.getAvailableLocales();
		for (int i = 1; i < localelist.length; i++) {
			System.out.println(localelist[i].getDisplayCountry() + "=" + localelist[i].getCountry() + "   "
					+ localelist[i].getDisplayLanguage() + "=" + localelist[i].getLanguage());
		}

	}

}

3.使用MessageFormat处理包含占位符的字符串,除了使用属性的文件作为资源文件外,java也允许使用类文件代替资源文件,即将所有的key-value对存入到class的文件中,而不是属性文件。使用类文件代替资源文件必须满足条件为该类名字必须为baseName_language_country,这与属性文件的命名相似。该类必须继承ListResourceBundle,并重写getContents(),该方法返回Object数组,该数组的每一项都是key-value对。

4.MessageFormat类是抽象类Format的子类,Format抽象类的另外两个子类:NumberFormat和DateFormat,他们分别是用来实现数值、日期的格式化,可以将数值、日期转化成字符串,也可以将字符串装换成数值日期。NumberFormat和DateFormat都包含了format()和parse(),其中format()用于将数组、日期格式转换成字符串,parse()用于将字符串解析成数值、日期。NumberFormat也是一个抽象基类,所以无法用构造器来创建NumberFormat对象,可通过如下几个类方法来得到NumberFormat对象。getCurrencyInstance():返回默认的locale的货币格式器。getInterInstance():返回默认Locale的整数格式器。getNumberInstance():返回默认Locale的通用的数字格式。getPrecentInstance():返回默认Lacale的百分数格式器。一旦获取了NumberFormat对象可以调用他的format()方法来格式化数值。

package com.lanou.test;

import java.text.NumberFormat;
import java.util.Locale;

public class Demo06 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		double a=13140.126;
		Locale[] locales={Locale.CHINA,Locale.JAPAN,
				Locale.ENGLISH,Locale.US};
		NumberFormat[] nf=new NumberFormat[12];
		for(int i=0;i<locales.length;i++){
			nf[i*3]=NumberFormat.getNumberInstance(locales[i]);
			nf[i*3+1]=NumberFormat.getPercentInstance(locales[i]);
			nf[i*3+2]=NumberFormat.getCurrencyInstance(locales[i]);
		}
		for(int i=0;i<locales.length;i++){
			String tip=i==0?"------中国的格式------":
				i==1?"----日本的格式--------":
			    i==2?"----英国格式-------":"------美国的格式-------"	;
			System.out.println(tip);
			System.out.println("通用的数值格式:" +nf[i].format(a));
			System.out.println("百分数比值格式:" +nf[i*3+1].format(a));
			System.out.println("货币数值格式:" +nf[i*3+2].format(a));	
		}
	}
}


结果:

------中国的格式------
通用的数值格式:13,140.126
百分数比值格式:13,140.126
货币数值格式:13,140.126
----日本的格式--------
通用的数值格式:13,140.126
百分数比值格式:1,314,013%
货币数值格式:¥13,140
----英国格式-------
通用的数值格式:13,140.126
百分数比值格式:1,314,013%
货币数值格式:¤13,140.13
------美国的格式-------
通用的数值格式:13,140.126
百分数比值格式:1,314,013%
货币数值格式:$13,140.13

4.使用DateFormat格式化日期、时间,它与NumberFormat相似也是一个抽象的类,也提供如下几个类方法来获取DateFormat对象。getDateInstance():返回一个日期格式器,它格式化后的字符串只有日期、没有时间。getTimeInstance():返回一个时间格式器,他的格式后的字符串只有时间,没有日期。getDateTimeInstance():返回一个时间日期的格式,他的格式后的字符串既有时间也有时间。

5.使用SimpleDateFormat格式化日期,DateFormat的parse()方法可以把字符串解析成Date对象,但实际上DateFormat的parse()方法还不够灵活--他要求必须是解析的字符串,而SimpleDateFormat是DateFormat的子类,SimpleDateFormat可以非常灵活的格式化Date,可以用于解析各种格式的日期字符串,创建SimpleDateFormat对象是需要传入一个Pattern字符串,这只是一个日期模型。

package com.lanou.test;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo07 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Date date=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("Gyyyy-mm--dd--hh--mm--ss");
		String datedtr=sdf.format(date);
		System.out.println(datedtr);
	}
}