详解Java中用于国际化的locale类
1.Locale介绍
Locale表示地区。每一个Locale对象都代表了一个特定的地理、政治和文化地区。
在操作Date,Calendar等表示日期/时间的对象时,经常会用到;因为不同的区域,时间表示方式都不同。
下面说说Locale对象的3种常用创建方式。
(1)获取默认的Locale
使用方法:
Localelocale=Locale.getDefault()
(2) 直接使用Locale的静态对象
Locale.java中提供了以下静态对象
publicstaticfinalLocaleCANADA publicstaticfinalLocaleCANADA_FRENCH publicstaticfinalLocaleCHINA publicstaticfinalLocaleCHINESE publicstaticfinalLocaleENGLISH publicstaticfinalLocaleFRANCE publicstaticfinalLocaleFRENCH publicstaticfinalLocaleGERMAN publicstaticfinalLocaleGERMANY publicstaticfinalLocaleITALIAN publicstaticfinalLocaleITALY publicstaticfinalLocaleJAPAN publicstaticfinalLocaleJAPANESE publicstaticfinalLocaleKOREA publicstaticfinalLocaleKOREAN publicstaticfinalLocalePRC publicstaticfinalLocaleROOT publicstaticfinalLocaleSIMPLIFIED_CHINESE publicstaticfinalLocaleTAIWAN publicstaticfinalLocaleTRADITIONAL_CHINESE publicstaticfinalLocaleUK publicstaticfinalLocaleUS
使用方法:下面的Locale对象是对应“中国(大陆)”的
Localelocale=Locale.SIMPLIFIED_CHINESE
(3)通过Locale的构造函数创建Locale对象
Locale的构造函数共有3个。如下:
Locale(Stringlanguage) Locale(Stringlanguage,Stringcountry) Locale(Stringlanguage,Stringcountry,Stringvariant)
使用方法:
Localelocal=newLocale("zh","CN");
Locale类支持非常多的国家和地区。我们可以通过以下方法,查看Locale支持的全部区域:
Locale[]ls=Locale.getAvailableLocales(); for(Localelocale:ls){ System.out.println("locale:"+locale); }
输入结果如下:
AllLocales:ja_JP,es_PE,en,ja_JP_JP,es_PA,sr_BA,mk,es_GT,ar_AE,no_NO,sq_AL,bg,ar_IQ,ar_YE,hu,pt_PT,el_CY,ar_QA,mk_MK,sv,de_CH,en_US,fi_FI,is,cs,en_MT,sl_SI,sk_SK,it,tr_TR,zh,th,ar_SA,no,en_GB,sr_CS,lt,ro,en_NZ,no_NO_NY,lt_LT,es_NI,nl,ga_IE,fr_BE,es_ES,ar_LB,ko,fr_CA,et_EE,ar_KW,sr_RS,es_US,es_MX,ar_SD,in_ID,ru,lv,es_UY,lv_LV,iw,pt_BR,ar_SY,hr,et,es_DO,fr_CH,hi_IN,es_VE,ar_BH,en_PH,ar_TN,fi,de_AT,es,nl_NL,es_EC,zh_TW,ar_JO,be,is_IS,es_CO,es_CR,es_CL,ar_EG,en_ZA,th_TH,el_GR,it_IT,ca,hu_HU,fr,en_IE,uk_UA,pl_PL,fr_LU,nl_BE,en_IN,ca_ES,ar_MA,es_BO,en_AU,sr,zh_SG,pt,uk,es_SV,ru_RU,ko_KR,vi,ar_DZ,vi_VN,sr_ME,sq,ar_LY,ar,zh_CN,be_BY,zh_HK,ja,iw_IL,bg_BG,in,mt_MT,es_PY,sl,fr_FR,cs_CZ,it_CH,ro_RO,es_PR,en_CA,de_DE,ga,de_LU,de,es_AR,sk,ms_MY,hr_HR,en_SG,da,mt,pl,ar_OM,tr,th_TH_TH,el,ms,sv_SE,da_DK,es_HN
下面选择其中的两个进行说明,如何利用它们来创建Locale对象:
例如,第一个输出是“ja_JP”。
其中,ja代表“语言”,这里指日语;“JP”代表国家,这里指日本。
我们可以通过如下方法,创建“语言是日语,国家是日本的Locale对象”。
Localelocale=newLocale("ja","JP");
例如,第三个输出是“en”。
其中,en代表“语言”,这里指英语。
我们可以通过如下方法,创建“语言是英文的Locale对象”。
Localelocale=newLocale("en");
Locale函数列表
//Locale的构造函数 Locale(Stringlanguage) Locale(Stringlanguage,Stringcountry) Locale(Stringlanguage,Stringcountry,Stringvariant)
Objectclone() booleanequals(Objectobject) staticLocale[]getAvailableLocales() StringgetCountry() staticLocalegetDefault() StringgetDisplayCountry(Localelocale) finalStringgetDisplayCountry() finalStringgetDisplayLanguage() StringgetDisplayLanguage(Localelocale) StringgetDisplayName(Localelocale) finalStringgetDisplayName() finalStringgetDisplayVariant() StringgetDisplayVariant(Localelocale) StringgetISO3Country() StringgetISO3Language() staticString[]getISOCountries() staticString[]getISOLanguages() StringgetLanguage() StringgetVariant() synchronizedinthashCode() synchronizedstaticvoidsetDefault(Localelocale) finalStringtoString()
2.Locale示例
下面通过示例演示在Date中使用Locale的。
参考代码如下(LocaleTest.java):
importjava.util.Locale; importjava.util.Date; importjava.util.Calendar; importjava.text.SimpleDateFormat; importjava.text.DateFormat; /** *Locale的测试程序 */ publicclassLocaleTest{ publicstaticvoidmain(String[]args){ //2种不同的Locale的创建方法 testDiffDateLocales(); //显示所有的Locales testAllLocales(); } /** *2种不同的Locale的创建方法 */ privatestaticvoidtestDiffDateLocales(){ //date为2013-09-1914:22:30 Datedate=newDate(113,8,19,14,22,30); //创建“简体中文”的Locale LocalelocaleCN=Locale.SIMPLIFIED_CHINESE; //创建“英文/美国”的Locale LocalelocaleUS=newLocale("en","US"); //获取“简体中文”对应的date字符串 Stringcn=DateFormat.getDateInstance(DateFormat.MEDIUM,localeCN).format(date); //获取“英文/美国”对应的date字符串 Stringus=DateFormat.getDateInstance(DateFormat.MEDIUM,localeUS).format(date); System.out.printf("cn=%s\nus=%s\n",cn,us); } /** *显示所有的Locales */ privatestaticvoidtestAllLocales(){ Locale[]ls=Locale.getAvailableLocales(); System.out.print("AllLocales:"); for(Localelocale:ls){ System.out.printf(locale+","); } System.out.println(); } }
3.使用ResouceBundle读取国际化资源文件
ResourceBundle资源包包含特定语言环境的对象。使用其可以加载并读取语言环境资源。
1.轻松的本地化或者翻译成不同的语言
2.一次处理多个语言环境
3.以后可以轻松的进行修改,一遍支持更多的语言环境。
当程序需要特定于语言环境的对象时,它使用getBundle()方法加载ResourceBundle类
ResourceBundlerb=ResourceBundle.getBundle(“res.MessageBundle”,currentLocale);
其中,res.MessageBundle代表的是我们在src下建立了一个res文件夹,而res文件夹下有一个名为MessageBundle.properteis的资源文件。我们允许在此建立多个国际化资源文件:
MessageBundle_zh_CN.properties;MessageBundle_en_US.properteis;
其中MessageBundle就是要在构造ResourceBundle时使用的字符串,这个名字合法即可,不需要特定约束。后边的名字一定要遵循规则,
resourceName_language_country.properteis;
然后我们使用rb.getString(key);就可以获取资源文件中的Key对应的value.
使用Struts1.x实现国际化自动切换
查看Struts源码就可以发现,语言环境信息就存放在session中,通过this.setLocale(request,locale);
所以要实现国际化就要在页面上点击超链接经过Action的时候改变会话中Locale(语言环境)的值。在Action中:
//接受客户端传过来的语言请求信息 Stringlanguage=request.getParameter(“myLanguage”); //定义语言地区信息 LocalecurrentLocale=null; //根据不同的请求创建不同的语言环境信息 if(“zh”.equals(language)){ currentLocale=newLocale(“zh”,“CN”); }elseif(“en”.equals(language)){ currentLocale=newLocale(“en”,“US”); } //…… //将session中的信息更改掉 this.setLocale(request,currentLocale); //当然,在页面显示资源文件信息的时候采用如下这种方式: //<bean:messagekey=”key”/>