Java国际化主要通过如下3个类完成
为实现程序的国际化,必须提供程序所需要的资源文件。资源文件的内容由key-value对组成。
资源文件的命名可以有3种格式:
若资源文件包含非西方字符,则需要用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所支持的语言和国家,可调用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=en Japan=JP Japanese=ja Panama=PA Spanish=es Bosnia and Herzegovina=BA Serbian=sr = Macedonian=mk Guatemala=GT Spanish=es United Arab Emirates=AE Arabic=ar Norway=NO Norwegian=no Albania=AL Albanian=sq = Bulgarian=bg Iraq=IQ Arabic=ar Yemen=YE Arabic=ar = Hungarian=hu Portugal=PT Portuguese=pt Cyprus=CY Greek=el Qatar=QA Arabic=ar Macedonia=MK Macedonian=mk = Swedish=sv Switzerland=CH German=de United States=US English=en Finland=FI Finnish=fi = Icelandic=is = Czech=cs Malta=MT English=en Slovenia=SI Slovenian=sl Slovakia=SK Slovak=sk = Italian=it Turkey=TR Turkish=tr = Chinese=zh = Thai=th Saudi Arabia=SA Arabic=ar = Norwegian=no United Kingdom=GB English=en Serbia and Montenegro=CS Serbian=sr = Lithuanian=lt = Romanian=ro New Zealand=NZ English=en Norway=NO Norwegian=no Lithuania=LT Lithuanian=lt Nicaragua=NI Spanish=es = Dutch=nl Ireland=IE Irish=ga Belgium=BE French=fr Spain=ES Spanish=es Lebanon=LB Arabic=ar = Korean=ko Canada=CA French=fr Estonia=EE Estonian=et Kuwait=KW Arabic=ar Serbia=RS Serbian=sr United States=US Spanish=es Mexico=MX Spanish=es Sudan=SD Arabic=ar Indonesia=ID Indonesian=in = Russian=ru = Latvian=lv Uruguay=UY Spanish=es Latvia=LV Latvian=lv = Hebrew=iw Brazil=BR Portuguese=pt Syria=SY Arabic=ar = Croatian=hr = Estonian=et Dominican Republic=DO Spanish=es Switzerland=CH French=fr India=IN Hindi=hi Venezuela=VE Spanish=es Bahrain=BH Arabic=ar Philippines=PH English=en Tunisia=TN Arabic=ar = Finnish=fi Austria=AT German=de = Spanish=es Netherlands=NL Dutch=nl Ecuador=EC Spanish=es Taiwan=TW Chinese=zh Jordan=JO Arabic=ar = Belarusian=be Iceland=IS Icelandic=is Colombia=CO Spanish=es Costa Rica=CR Spanish=es Chile=CL Spanish=es Egypt=EG Arabic=ar South Africa=ZA English=en Thailand=TH Thai=th Greece=GR Greek=el Italy=IT Italian=it = Catalan=ca Hungary=HU Hungarian=hu = French=fr Ireland=IE English=en Ukraine=UA Ukrainian=uk Poland=PL Polish=pl Luxembourg=LU French=fr Belgium=BE Dutch=nl India=IN English=en Spain=ES Catalan=ca Morocco=MA Arabic=ar Bolivia=BO Spanish=es Australia=AU English=en = Serbian=sr Singapore=SG Chinese=zh = Portuguese=pt = Ukrainian=uk El Salvador=SV Spanish=es Russia=RU Russian=ru South Korea=KR Korean=ko = Vietnamese=vi Algeria=DZ Arabic=ar Vietnam=VN Vietnamese=vi Montenegro=ME Serbian=sr = Albanian=sq Libya=LY Arabic=ar = Arabic=ar China=CN Chinese=zh Belarus=BY Belarusian=be Hong Kong=HK Chinese=zh = Japanese=ja Israel=IL Hebrew=iw Bulgaria=BG Bulgarian=bg = Indonesian=in Malta=MT Maltese=mt Paraguay=PY Spanish=es = Slovenian=sl France=FR French=fr Czech Republic=CZ Czech=cs Switzerland=CH Italian=it Romania=RO Romanian=ro Puerto Rico=PR Spanish=es Canada=CA English=en Germany=DE German=de = Irish=ga Luxembourg=LU German=de = German=de Argentina=AR Spanish=es = Slovak=sk Malaysia=MY Malay=ms Croatia=HR Croatian=hr Singapore=SG English=en = Danish=da = Maltese=mt = Polish=pl Oman=OM Arabic=ar = Turkish=tr Thailand=TH Thai=th = Greek=el = Malay=ms Sweden=SE Swedish=sv Denmark=DK Danish=da Honduras=HN Spanish=es
通过该程序,我们就可以获得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"));//获得本地化字符串
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允许使用类文件来代替资源文件,即手动书写代码来实现国际化,
如:
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的这一系列中文资源文件,系统搜索顺序如下: