国际化英文单词为: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=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
 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程序所支持的国家/语言环境。

 

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的这一系列中文资源文件,系统搜索顺序如下:

  1. MyResourse_zh_CN。class
  2. MyResourse_zh_CN.properties
  3. MyResourse_zh.class
  4. MyResourse_zh.properties
  5. MyResourse.class
  6. MyResourse.properties