事实上,Java语言不可能支持所有国家和语言,如需要获取Java语言所支持的语言和国家,可调用Locale类的getAvailableLocale方法获取,该方法返回一个Locale数组,该数组里包含了Java所支持的语言和国家.
Java程序的国际化主要通过如下三个类完成
java.util.ResourceBundle:用于加载一个国家,语言资源包
java.util.Locale:用于封装一个特定的国家/区域,语言环境
java.text.MessageFormat:用于格式化带占位符的字符串
下面的程序简单地示范了如何获取Java所支持的国家和语言
import java.util.ResourceBundle;import java.util.Locale;import java.text.MessageFormat;public class LocaleList{ public static void main(String[] args) { //返回java所支持的全部国家和语言的数组 Locale[] localeList=Locale.getAvailableLocales(); //遍历数组的每个元素,依次获取所支持的国家和语言 for (int i=0;i<localeList.length;i++) { //打印出所支持的国家和语言 System.out.println(localeList[i].getDisplayCountry()+"="+localeList[i].getCountry()+" "+localeList[i].getDisplayLanguage()+"="+localeList[i].getLanguage()); } }}
运行结果
日本=JP 日文=ja秘鲁=PE 西班牙文=es= 英文=en日本=JP 日文=ja巴拿马=PA 西班牙文=es波斯尼亚和黑山共和国=BA 塞尔维亚文=sr= 马其顿文=mk危地马拉=GT 西班牙文=es阿拉伯联合酋长国=AE 阿拉伯文=ar挪威=NO 挪威文=no阿尔巴尼亚=AL 阿尔巴尼亚文=sq= 保加利亚文=bg伊拉克=IQ 阿拉伯文=ar也门=YE 阿拉伯文=ar= 匈牙利文=hu葡萄牙=PT 葡萄牙文=pt塞浦路斯=CY 希腊文=el卡塔尔=QA 阿拉伯文=ar马其顿王国=MK 马其顿文=mk= 瑞典文=sv瑞士=CH 德文=de美国=US 英文=en芬兰=FI 芬兰文=fi= 冰岛文=is= 捷克文=cs马耳他=MT 英文=en斯洛文尼亚=SI 斯洛文尼亚文=sl斯洛伐克=SK 斯洛伐克文=sk= 意大利文=it土耳其=TR 土耳其文=tr= 中文=zh= 泰文=th沙特阿拉伯=SA 阿拉伯文=ar= 挪威文=no英国=GB 英文=en塞尔维亚及黑山=CS 塞尔维亚文=sr= 立陶宛文=lt= 罗马尼亚文=ro新西兰=NZ 英文=en挪威=NO 挪威文=no立陶宛=LT 立陶宛文=lt尼加拉瓜=NI 西班牙文=es= 荷兰文=nl爱尔兰=IE 爱尔兰文=ga比利时=BE 法文=fr西班牙=ES 西班牙文=es黎巴嫩=LB 阿拉伯文=ar= 朝鲜文=ko加拿大=CA 法文=fr爱沙尼亚=EE 爱沙尼亚文=et科威特=KW 阿拉伯文=ar塞尔维亚=RS 塞尔维亚文=sr美国=US 西班牙文=es墨西哥=MX 西班牙文=es苏丹=SD 阿拉伯文=ar印度尼西亚=ID 印度尼西亚文=in= 俄文=ru= 拉托维亚文(列托)=lv乌拉圭=UY 西班牙文=es拉脱维亚=LV 拉托维亚文(列托)=lv= 希伯来文=iw巴西=BR 葡萄牙文=pt叙利亚=SY 阿拉伯文=ar= 克罗地亚文=hr= 爱沙尼亚文=et多米尼加共和国=DO 西班牙文=es瑞士=CH 法文=fr印度=IN 印地文=hi委内瑞拉=VE 西班牙文=es巴林=BH 阿拉伯文=ar菲律宾=PH 英文=en突尼斯=TN 阿拉伯文=ar= 芬兰文=fi奥地利=AT 德文=de= 西班牙文=es荷兰=NL 荷兰文=nl厄瓜多尔=EC 西班牙文=es台湾地区=TW 中文=zh约旦=JO 阿拉伯文=ar= 白俄罗斯文=be冰岛=IS 冰岛文=is哥伦比亚=CO 西班牙文=es哥斯达黎加=CR 西班牙文=es智利=CL 西班牙文=es埃及=EG 阿拉伯文=ar南非=ZA 英文=en泰国=TH 泰文=th希腊=GR 希腊文=el意大利=IT 意大利文=it= 加泰罗尼亚文=ca匈牙利=HU 匈牙利文=hu= 法文=fr爱尔兰=IE 英文=en乌克兰=UA 乌克兰文=uk波兰=PL 波兰文=pl卢森堡=LU 法文=fr比利时=BE 荷兰文=nl印度=IN 英文=en西班牙=ES 加泰罗尼亚文=ca摩洛哥=MA 阿拉伯文=ar玻利维亚=BO 西班牙文=es澳大利亚=AU 英文=en= 塞尔维亚文=sr新加坡=SG 中文=zh= 葡萄牙文=pt= 乌克兰文=uk萨尔瓦多=SV 西班牙文=es俄罗斯=RU 俄文=ru韩国=KR 朝鲜文=ko= 越南文=vi阿尔及利亚=DZ 阿拉伯文=ar越南=VN 越南文=vi黑山=ME 塞尔维亚文=sr= 阿尔巴尼亚文=sq利比亚=LY 阿拉伯文=ar= 阿拉伯文=ar中国=CN 中文=zh白俄罗斯=BY 白俄罗斯文=be香港=HK 中文=zh= 日文=ja以色列=IL 希伯来文=iw保加利亚=BG 保加利亚文=bg= 印度尼西亚文=in马耳他=MT 马耳他文=mt巴拉圭=PY 西班牙文=es= 斯洛文尼亚文=sl法国=FR 法文=fr捷克共和国=CZ 捷克文=cs瑞士=CH 意大利文=it罗马尼亚=RO 罗马尼亚文=ro波多黎哥=PR 西班牙文=es加拿大=CA 英文=en德国=DE 德文=de= 爱尔兰文=ga卢森堡=LU 德文=de= 德文=de阿根廷=AR 西班牙文=es= 斯洛伐克文=sk马来西亚=MY 马来文=ms克罗地亚=HR 克罗地亚文=hr新加坡=SG 英文=en= 丹麦文=da= 马耳他文=mt= 波兰文=pl阿曼=OM 阿拉伯文=ar= 土耳其文=tr泰国=TH 泰文=th= 希腊文=el= 马来文=ms瑞典=SE 瑞典文=sv丹麦=DK 丹麦文=da洪都拉斯=HN 西班牙文=es
总结
通过上面该程序,我们就可以获得Java程序所支持的国家/环境,虽然可以通过查阅相关资料来获取Java语言所支持的国家/语言环境,但如果这些资料不是随手可得,则可以通过上面程序来获得Java语言所支持的国家/语言环境
我们使用java.lang.Locale来构造Java国际化的情境。
java.lang.Locale代表特定的地理、政治和文化。需要Locale来执行其任务的操作叫语言环境敏感的操作。
构造一个系统默认的Locale
Locale defaultLocale = Locale.getDefault();
获得此Java虚拟机当前线程默认的语言环境值
获取当前Java虚拟机线程默认的国家和语言信息
String country = defaultLocale.getCountry();//返回国家地区代码
String language = defaultLocale.getLanguage();//返回国家的语言
String displayCountry = defaultLocale.getDisplayCountry();//返回适合向用户显示的国家信息
String displayLanaguage = defaultLocale.getDisplayLanaguage();//返回适合向用户展示的语言信息
String displayName = defaultLocale.getDisplayName();//返回适合向用户展示的语言环境名
加入当前Java虚拟机线程所处的操作系统的区域语言设置为“中文(简体,中国)”,则上边的运行结果依次将会是:
CN
zh
中国
中文
中文(中国)
根据国家地区和语言构造一个Locale(语言环境)
Locale currentLocale = new Locale(“zh”, ”CN”);
构造方法为:Locale(String language, String country);
使用ResouceBundle读取国际化资源文件
ResourceBundle资源包包含特定语言环境的对象。使用其可以加载并读取语言环境资源。
- 轻松的本地化或者翻译成不同的语言
- 一次处理多个语言环境
- 以后可以轻松的进行修改,一遍支持更多的语言环境。
当程序需要特定于语言环境的对象时,它使用getBundle()方法加载ResourceBundle类
ResourceBundle rb = 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中:
- //接受客户端传过来的语言请求信息
- String language = request.getParameter(“myLanguage”);
- //定义语言地区信息
- Locale currentLocale = null;
- //根据不同的请求创建不同的语言环境信息
- if (“zh”.equals(language)) {
- currentLocale = new Locale(“zh”, “CN”);
- } else if (“en”.equals(language)) {
- currentLocale = new Locale(“en”, “US”);
- }
- //……
- //将session中的信息更改掉
- this.setLocale(request, currentLocale);
- //当然,在页面显示资源文件信息的时候采用如下这种方式:
- //<bean:message key=”key” />