国际化英文单词为:Internationalization,又称I18N,I为因为单词的第一个字母,18为这个单词的长度,而N代表这个单词的最后一个字母。国际化又称本地化(Localization,L10N)。
国际化相关的Java类
Java国际化主要通过如下3个类完成
- java.util.ResourceBundle:用于加载一个资源包
- java.util.Locale:对应一个特定的国家/区域、语言环境。
- java.text.MessageFormat:用于将消息格式化
国际化资源文件
为实现程序的国际化,必须提供程序所需要的资源文件。资源文件的内容由key-value对组成。
资源文件的命名可以有3种格式:
- basename_language_country.properties
- basename_language.properties
- basename_properties
若资源文件包含非西方字符,则需要用JDK自带的工具来处理:native2ascii,这个工具的语法格式如下:
native2ascii 资源文件名 目标资源文件名
如:
native2ascii mess_zh_XXX.proerties mess_zh_CN.proerties
Locale类可获取各国区域环境(如:Locale.ENGLISH、Locale.CHINESE,这些常量返回一个Locale实例),也可以获取当前系统所使用的区域语言环境。
ResourceBundle类可根据指定参数获取相应的资源,常用方法如下
ResourceBundle.getBundle(basename)//获取当前系统所使用的区域环境获得指定资源文件
ResourceBundle.getBundle(basename,locale)//根据指定的区域获取对应的资源文件
语言环境
在 Java 语言中,语言环境(locale)仅仅是一个标识符,而不是一组本地化的属性。java.util.Locale 类的一个实例表示一个特定的地理政治区域,使用表示语言、区域以及国家或地区的参数创建。每个与语言环境相关的类都维护着它自己的一组本地化属性,并且确定如何对含有 Locale 参数的方法请求做出响应。Java支持的语言和国家
若要获取Java所支持的语言和国家,可调用Locale类的getAvailableLocale方法获取,该方法返回一个Locale数组,该数组里包含了java所支持的语言和国家。
java代码如下:
Locale[] localeList = Locale.getAvailableLocales(); for ( int i= 0 ; i<localeList.length; i++) { System.out.println(localeList[i].getDisplayCountry()+ "=" +localeList[i].getCounrtry() + " " + localeList[i].getDisplayLanguage() + "=" +localeList[i].getLanguage()); } } |
程序运行结果如下:
Japan=JP Japanese=ja
Peru=PE Spanish=es= English=enJapan=JP Japanese=jaPanama=PA Spanish=esBosnia and Herzegovina=BA Serbian=sr= Macedonian=mkGuatemala=GT Spanish=esUnited Arab Emirates=AE Arabic=arNorway=NO Norwegian=noAlbania=AL Albanian=sq= Bulgarian=bgIraq=IQ Arabic=arYemen=YE Arabic=ar= Hungarian=huPortugal=PT Portuguese=ptCyprus=CY Greek=elQatar=QA Arabic=arMacedonia=MK Macedonian=mk= Swedish=svSwitzerland=CH German=deUnited States=US English=enFinland=FI Finnish=fi= Icelandic=is= Czech=csMalta=MT English=enSlovenia=SI Slovenian=slSlovakia=SK Slovak=sk= Italian=itTurkey=TR Turkish=tr= Chinese=zh= Thai=thSaudi Arabia=SA Arabic=ar= Norwegian=noUnited Kingdom=GB English=enSerbia and Montenegro=CS Serbian=sr= Lithuanian=lt= Romanian=roNew Zealand=NZ English=enNorway=NO Norwegian=noLithuania=LT Lithuanian=ltNicaragua=NI Spanish=es= Dutch=nlIreland=IE Irish=gaBelgium=BE French=frSpain=ES Spanish=esLebanon=LB Arabic=ar= Korean=koCanada=CA French=frEstonia=EE Estonian=etKuwait=KW Arabic=arSerbia=RS Serbian=srUnited States=US Spanish=esMexico=MX Spanish=esSudan=SD Arabic=arIndonesia=ID Indonesian=in= Russian=ru= Latvian=lvUruguay=UY Spanish=esLatvia=LV Latvian=lv= Hebrew=iwBrazil=BR Portuguese=ptSyria=SY Arabic=ar= Croatian=hr= Estonian=etDominican Republic=DO Spanish=esSwitzerland=CH French=frIndia=IN Hindi=hiVenezuela=VE Spanish=esBahrain=BH Arabic=arPhilippines=PH English=enTunisia=TN Arabic=ar= Finnish=fiAustria=AT German=de= Spanish=esNetherlands=NL Dutch=nlEcuador=EC Spanish=esTaiwan=TW Chinese=zhJordan=JO Arabic=ar= Belarusian=beIceland=IS Icelandic=isColombia=CO Spanish=esCosta Rica=CR Spanish=esChile=CL Spanish=esEgypt=EG Arabic=arSouth Africa=ZA English=enThailand=TH Thai=thGreece=GR Greek=elItaly=IT Italian=it= Catalan=caHungary=HU Hungarian=hu= French=frIreland=IE English=enUkraine=UA Ukrainian=ukPoland=PL Polish=plLuxembourg=LU French=frBelgium=BE Dutch=nlIndia=IN English=enSpain=ES Catalan=caMorocco=MA Arabic=arBolivia=BO Spanish=esAustralia=AU English=en= Serbian=srSingapore=SG Chinese=zh= Portuguese=pt= Ukrainian=ukEl Salvador=SV Spanish=esRussia=RU Russian=ruSouth Korea=KR Korean=ko= Vietnamese=viAlgeria=DZ Arabic=arVietnam=VN Vietnamese=viMontenegro=ME Serbian=sr= Albanian=sqLibya=LY Arabic=ar= Arabic=arChina=CN Chinese=zhBelarus=BY Belarusian=beHong Kong=HK Chinese=zh= Japanese=jaIsrael=IL Hebrew=iwBulgaria=BG Bulgarian=bg= Indonesian=inMalta=MT Maltese=mtParaguay=PY Spanish=es= Slovenian=slFrance=FR French=frCzech Republic=CZ Czech=csSwitzerland=CH Italian=itRomania=RO Romanian=roPuerto Rico=PR Spanish=esCanada=CA English=enGermany=DE German=de= Irish=gaLuxembourg=LU German=de= German=deArgentina=AR Spanish=es= Slovak=skMalaysia=MY Malay=msCroatia=HR Croatian=hrSingapore=SG English=en= Danish=da= Maltese=mt= Polish=plOman=OM Arabic=ar= Turkish=trThailand=TH Thai=th= Greek=el= Malay=msSweden=SE Swedish=svDenmark=DK Danish=daHonduras=HN Spanish=es
通过该程序,我们就可以获得Java程序所支持的国家/语言环境。
JAVA程序的国际化
原始程序:
system.out.println("Hello");
其中Hello字符串需国际化,定义资源文件,文件名分别为base_zh_CN.properties和base_en_US
base_zh_CN.properties文件内容如下:
hello=你好
base_en_US.properties文件内容如下:
hello=Hello
将这两个文件放入某个包中,如“com.jj.test”,用native2ascii重新生成资源文件
修改程序:
Locale myLocale = Locale.getDefault();//获得系统默认的国家/语言环境
ResourceBundle bundle = ResourceBundle.getBundle("base",myLocale);//根据指定的国家/语言环境加载对应的资源文件
System.out.println(bundle.getString(hello"));//获得本地化字符串
JAVA国际化流程
ResourceBundle根据Locale加载资源文件->返回一个ResourceBundle实例->ResourceBundle调用getString方法返回指定key对应的字符串
带占位符的消息
上面的输出消息是一个间的的消息,若要输出的消息中必须包含动态的内容,这些内容必须是从程序中获取的,可利用带占位符的国际化资源文件来实现。
例如下面的字符串:
你好,Eason!今天是07-5-30 下午 13:00
Eason是浏览者的姓名,必须动态改变,后面的时间也必须动态改变,则此处需要2个占位符。
资源文件示例:
msg=你好,{0}!今天是{1}
程序中需要使用MessageFormat类
该类有个静态方法:
format(String pattern,Object … values)
上例对应的JAVA中的字符串输出代码如下:
ResourceBundle bundle = ResourceBundle.getBundle("MyResource", currentLocale);
String msg = bundle.getString("msg");
System.out.println(MessageFormat.format(msg,"Eason", new Date()));
使用类文件代替资源文件
Java允许使用类文件来代替资源文件,即手动书写代码来实现国际化,
- 该类要求继承于ListResourceBundle,并重写getContents方法该方法返回Object数组,该数组的每一个项都是key-value对。
- 类的名字必须为basename_language_contry,这与属性文件的命名相似。
如:
public class MyResource_zh_CN extends ListResourceBundle {
private final Object myData[][]= {
{"msg","{0},Hello"}
};
public Object[][] getContents() {return myData;}
}
上面这个是简体中文语言环境下的资源文件,该类可以替换MyResource_zh_CN.properties属性文件。
如果系统同时存在资源文件、类文件,系统将以类文件为主,而不会调用资源文件。例如对于basename为MyResourse的这一系列中文资源文件,系统搜索顺序如下:
- MyResourse_zh_CN。class
- MyResourse_zh_CN.properties
- MyResourse_zh.class
- MyResourse_zh.properties
- MyResourse.class
- MyResourse.properties 来源: <>