**struts程序的国际化(上)-JAVA程序国际化

国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。例如,如果请求来自于中文操作系统的客户端,则应用程序中的各种标签、错误提示和帮助等都使用中文:如果客户端使用英文操作系统,则应用程序能自动识别,并作出英文的响应。国际化的英文单词是Internationalization ,有时也简称I18N。其中I 是这个单词的第一个字母, 18 表示这个单词的长度,而N 代表这个单词的最后一个字母。
Struts 的国际化也是基于Java 的国际化的,下面先介绍Java 程序的国际化。
一、Java 程序的国际化
Java 程序的国际化思路是将程序中的标签、提示等信息放在资源文件中,每个程序需要所有支持的国家飞语言,都必须提供对应的资源文件。其资源文件是key-value 对,每个资源文件中的key 是不变的,但value 则随不同国家飞语言而变化。
Java 程序的国际化主要通过如下三个类完成。
• java.util.ResourceBundle: 对应用于加载一个资源包。
• java.util.Locale: 对应一个特定的国家/区域及语言环境。
• java.text.MessageFormat: 用于将消息格式化。
为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的内容是和很多key-value 对。其中key 是程序使用的部分,而value 则是程序界面的显示。
资源文件的命名可以有如下三种形式。
• baseName_language_country.properties。
• baseName_language.properties。
• baseName.properties 。
其中baseName 是资源文件的基本名,用户可以自由定义。而language 和country都不可随意变化,必须是Java 所支持的语言和国家。
(1)国际化支持的语言和国家
事实上, Java 也不可能支持所有国家和语言,如需要获取Java 所支持的语言和国家,可调用Locale 类的getAvailableLocale 方法来获取。该方法返回一个Locale 数组,该数组里包含了Java 所支持的语言和国家。
下面的程序简单地示范了如何获取Java 所支持的国家和语言:
import java.util.Locale;
public class qq {
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());
}
}
}

运行结果如下:
= 阿拉伯文=ar
阿拉伯联合酋长国=AE 阿拉伯文=ar
巴林=BH 阿拉伯文=ar
阿尔及利亚=DZ 阿拉伯文=ar
埃及=EG 阿拉伯文=ar
伊拉克=IQ 阿拉伯文=ar
约旦=JO 阿拉伯文=ar
科威特=KW 阿拉伯文=ar
黎巴嫩=LB 阿拉伯文=ar
利比亚=LY 阿拉伯文=ar
摩洛哥=MA 阿拉伯文=ar
阿曼=OM 阿拉伯文=ar
卡塔尔=QA 阿拉伯文=ar
沙特阿拉伯=SA 阿拉伯文=ar
苏丹=SD 阿拉伯文=ar
叙利亚=SY 阿拉伯文=ar
突尼斯=TN 阿拉伯文=ar
也门=YE 阿拉伯文=ar
印度=IN 印地文=hi
= 希伯来文=iw
以色列=IL 希伯来文=iw
= 日文=ja
日本=JP 日文=ja
= 朝鲜文=ko
韩国=KR 朝鲜文=ko
= 泰文=th
泰国=TH 泰文=th
泰国=TH 泰文=th
= 越南文=vi
越南=VN 越南文=vi
= 中文=zh
中国=CN 中文=zh
香港=HK 中文=zh
台湾地区=TW 中文=zh
= 白俄罗斯文=be
白俄罗斯=BY 白俄罗斯文=be
= 保加利亚文=bg
保加利亚=BG 保加利亚文=bg
= 加泰罗尼亚文=ca
西班牙=ES 加泰罗尼亚文=ca
= 捷克文=cs
捷克共和国=CZ 捷克文=cs
= 丹麦文=da
丹麦=DK 丹麦文=da
= 德文=de
奥地利=AT 德文=de
瑞士=CH 德文=de
德国=DE 德文=de
卢森堡=LU 德文=de
= 希腊文=el
希腊=GR 希腊文=el
澳大利亚=AU 英文=en
加拿大=CA 英文=en
英国=GB 英文=en
爱尔兰=IE 英文=en
印度=IN 英文=en
新西兰=NZ 英文=en
南非=ZA 英文=en
= 西班牙文=es
阿根廷=AR 西班牙文=es
玻利维亚=BO 西班牙文=es
智利=CL 西班牙文=es
哥伦比亚=CO 西班牙文=es
哥斯达黎加=CR 西班牙文=es
多米尼加共和国=DO 西班牙文=es
厄瓜多尔=EC 西班牙文=es
西班牙=ES 西班牙文=es
危地马拉=GT 西班牙文=es
洪都拉斯=HN 西班牙文=es
墨西哥=MX 西班牙文=es
尼加拉瓜=NI 西班牙文=es
巴拿马=PA 西班牙文=es
秘鲁=PE 西班牙文=es
波多黎哥=PR 西班牙文=es
巴拉圭=PY 西班牙文=es
萨尔瓦多=SV 西班牙文=es
乌拉圭=UY 西班牙文=es
委内瑞拉=VE 西班牙文=es
= 爱沙尼亚文=et
爱沙尼亚=EE 爱沙尼亚文=et
= 芬兰文=fi
芬兰=FI 芬兰文=fi
= 法文=fr
比利时=BE 法文=fr
加拿大=CA 法文=fr
瑞士=CH 法文=fr
法国=FR 法文=fr
卢森堡=LU 法文=fr
= 克罗地亚文=hr
克罗地亚=HR 克罗地亚文=hr
= 匈牙利文=hu
匈牙利=HU 匈牙利文=hu
= 冰岛文=is
冰岛=IS 冰岛文=is
= 意大利文=it
瑞士=CH 意大利文=it
意大利=IT 意大利文=it
= 立陶宛文=lt
立陶宛=LT 立陶宛文=lt
= 拉托维亚文(列托)=lv
拉脱维亚=LV 拉托维亚文(列托)=lv
= 马其顿文=mk
马其顿王国=MK 马其顿文=mk
= 荷兰文=nl
比利时=BE 荷兰文=nl
荷兰=NL 荷兰文=nl
= 挪威文=no
挪威=NO 挪威文=no
挪威=NO 挪威文=no
= 波兰文=pl
波兰=PL 波兰文=pl
= 葡萄牙文=pt
巴西=BR 葡萄牙文=pt
葡萄牙=PT 葡萄牙文=pt
= 罗马尼亚文=ro
罗马尼亚=RO 罗马尼亚文=ro
= 俄文=ru
俄罗斯=RU 俄文=ru
= 斯洛伐克文=sk
斯洛伐克=SK 斯洛伐克文=sk
= 斯洛文尼亚文=sl
斯洛文尼亚=SI 斯洛文尼亚文=sl
= 阿尔巴尼亚文=sq
阿尔巴尼亚=AL 阿尔巴尼亚文=sq
= 塞尔维亚文=sr
波斯尼亚和黑山共和国=BA 塞尔维亚文=sr
塞尔维亚及黑山=CS 塞尔维亚文=sr
= 瑞典文=sv
瑞典=SE 瑞典文=sv
= 土耳其文=tr
土耳其=TR 土耳其文=tr
= 乌克兰文=uk
乌克兰=UA 乌克兰文=uk
美国=US 英文=en
= 英文=en

(2)编写国际化所需的资源
国际化所需的资源文件内容是key-value 对,下面提供了两个资源文件,这两个资源文件很简单,只包含一个key-value 对。
下面是MyResource.properties 的文件的内容:
// 资源文件的内容: key-value 对。
msg=Hello , {O} ! Today is {1}.
下面是MyResource_zh_CN.properties 文件的内容:
// 资源文件的内容: key-value 对
msg=你好 , {O}! 今天是{l}。
所有资源文件的key 都是相同的,只是value 会随国家和语言的不同而变化。
对于所有的非西欧文字还必须使用native2ascii 命令转化,该命令负责将非西欧文字转换成系统可以识别的文字。
因此必须对MyResouce_zh_CN.properties文件进行转化。命令的格式如下:
native2ascii MyResouce_zh_CN.properties MyResouce_x.properties
转换后新生成的文件内容会出现很多乱码,这是正常的。可将其转换成生成的MyResouce_x.properties文件重命名为MyResouce_zh_CN.properties 即可。
(3)完成程序国际化
上面的资源文件实质上有如下两种。
• MyResouce_zh_CN.properties: 指定了确定的国家和语言的资源文件。
• MyResouce.properties: 没有指定国家和语言的资源文件。
下面的程序可实现程序的国际化:
import java.text.MessageFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;

public class qq {
public static void main(String[] args) {
Locale currentLocale = null;
// 如果运行程序时指定了国家和语言参数,则以此创建Locale 对象
if (args.length == 2) {
currentLocale = new Locale(args[0], args[1]);
}
// 否则,直接使用默认的国家和语言
else {
currentLocale = Locale.getDefault();
}
// 根据Locale 加载资源包
ResourceBundle bundle = ResourceBundle.getBundle("MyResource",
currentLocale);
// 根据key 获取对应的资源
String msg = (String) bundle.getObject("msg");
// 创建MessageFormat对象,用于获取格式化消息
MessageFormat mf = new MessageFormat("");
// 创建Locale 对象
// 设置国际化时所使用的Locale 实例
mf.setLocale(currentLocale);
// 设置需要格式化的消息
mf.applyPattern(msg);
Date now = new Date();
// 为消息中需要的参数指定值
Object[] msgParams = { "yeeku", now };
// 输出国际化消息
System.out.println(mf.format(msgParams));
}
}

运行时,如果指定了两个参数: en Us ,则表明用于显示美国英语的环境
但是,程序并没有指定MyResource_en_US.properties 文件,程序从哪里获取资源呢?在ResourceBundle 加载资源时按如下顺序搜索。搜索所有国家和语言都匹配的资源文件,例如,对于简体中文的环境,先搜索如下文件:MyResource_zh_CN.properties。如果没有找到国家和语言都匹配的资源文件,则再搜索语言匹配的文件,即搜索如下文件:MyResource_zh.properties。如果上面的文件依然无法搜索到,则搜索baseNarne 匹配的文件,即搜索如下文件:MyResource.properties
(4)使用类文件代替资源文件
Java 也允许使用类文件代替资源文件,即将所有的key-value对存入class 文件,而不是属性文件。
用来代替资源文件的Java 文件必须满足如下条件。
·类的名字必须为baseName_language_country,这与属性文件的命名相似。
·该类必须继承ListResourceBundle,并重写getContents 方法,该方法返回Object数组,该数组的每一个项都是key-value 对。
下面的类文件可以代替上面的属性文件:
import java.util.ListResourceBundle;
public class MyResource_zh_CN extends ListResourceBundle {
// 定义资源
private final Object myData[][] = { { "msg", "{0},您好!今天是{1}" } };
// 重写方法getContents()
public Object[][] getContents() {
//该方法返回资源的key-value对
return myData;
}
}

如果系统同时存在资源文件及类文件,则系统将以类文件为主,而不会调用资源文件。对于简体中文的Lοcale, ResourceBundle 搜索资源的顺序是:
(1) baseName_zh_CN.class 。
(2) baseName_zh_CN.properties。
(3) baseName_zh.class 。
(4) baseName_zh.properties。
(5) baseName.class。
(6) baseName.properties。
当系统按上面的顺序搜索资源文件时,如果前面的文件不存在,则会使用下一个;如果一直找不到对应的文件,系统将抛出异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值