即国际化,又简称为 i18n。国际化的目的是让程序能灵活应对世界不同地区和国家的访问。
1.Locale
本地化对象,封装语言、国家信息的对象,由java.util提供
// 模拟中国语言等环境
// Locale locale = Locale.CHINA;
Locale locale = Locale.getDefault(); // 当前系统默认的语言环境
System.out.println(locale.getCountry()); // CN 国家的简称
System.out.println(locale.getDisplayCountry()); //中国 国家名称
System.out.println(locale.getLanguage()); // zh 语言简称
// 模拟美国国家
Locale l_us = Locale.US;
System.out.println(l_us.getCountry()); //US
System.out.println(l_us.getDisplayCountry());//美国
System.out.println(l_us.getLanguage());//en
2.ResourceBundle
用于描述一个资源包,并且 ResourceBundle类提供了相应的方法getBundle,这个方法可以根据来访者的国家地区自动获取与之对应的资源文件予以显示
一个资源包中的每个资源文件都必须拥有共同的基名。除了基名,每个资源文件的名称中还必须有标识其本地信息的附加部分。例如:一个资源包的基名是“myproperties”,则与中文、英文环境相对应的资源文件名则为: “myproperites_zh.properties” “myproperites_en.properties”
每个资源包都应有一个默认资源文件,这个文件不带有标识本地信息的附加部分。若ResourceBundle对象在资源包中找不到与用户匹配的资源文件,它将选择该资源包中与用户最相近的资源文件,如果再找不到,则使用默认资源文件。例如:myproperites.properties
资源文件的内容通常采用“关键字=值”的形式,软件根据关键字检索值显示在页面上。一个资源包中的所有资源文件的关键字必须相同,值则为相应国家的文字。
并且资源文件中采用的是properties格式文件,所以文件中的所有字符都必须是ASCII字码,对于像中文这样的非ACSII字符,须先进行编码。(java提供了一个native2ascII命令用于编码)。例:属性文件是不能保存中文的
实例:
// 设置语言环境
Locale locale = Locale.US;
// Locale locale = Locale.getDefault();
// 创建工具类对象ResourceBundle
ResourceBundle bundle = ResourceBundle.getBundle(
"cn.itcast.f_i18n.msg", locale);
// 根据key获取配置文件中的值
System.out.println(bundle.getString("hello"));
System.out.println(bundle.getString("username"));
System.out.println(bundle.getString("pwd"));
msg.properties
hello=\u4F60\u597D
username=\u7528\u6237\u540D
pwd=\u5BC6\u7801
title=\u767B\u9646\u9875\u9762
submit=\ \u767B\u9646
msg_en_US.properties
hello=Hello
username=User Name
pwd=Password
title=Login Page
submit=Submit \!
3.国际化动态文本
3.1 国际化货币
public void testI18N3() throws Exception {
// 模拟语言环境
Locale locale = Locale.CHINA;
// 数据准备
double number = 100;
// 工具类
NumberFormat nf = NumberFormat.getCurrencyInstance(locale);
// 国际化货币
String m = nf.format(number);
// 测试
System.out.println(m);// ¥100.00
}
// 面试题: 代码计算: $100 * 10
@Test
public void eg() throws Exception {
String str = "$100";
int num = 10;
// 1. 分析str值是哪一国家的货币
Locale us = Locale.US;
// 2. 国际化工具类
NumberFormat nf = NumberFormat.getCurrencyInstance(us);
// 3. 解析str国币
Number n = nf.parse(str);
System.out.println(n.intValue() * num);//1000
}
3.2.国际化数值
public void testI18N4() throws Exception {
// 模拟语言环境
Locale locale = Locale.CHINA;
NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
String str = nf.format(1000000000);
System.out.println(str);//1,000,000,000
}
3.3.国际化日期
/*
* 日期 FULL 2015年3月4日 星期三 LONG 2015年3月4日 FULL 2015年3月4日 星期三 MEDIUM 2015-3-4
* SHORT 15-3-4
*
* 时间 FULL 下午04时31分59秒 CST LONG 下午04时32分37秒 MEDIUM 16:33:00 SHORT 下午4:33
*/
@Test
public void testI18N5() throws Exception {
// 日期格式
int dateStyle = DateFormat.SHORT;
// 时间格式
int timeStyle = DateFormat.SHORT;
// 工具类
DateFormat df = DateFormat.getDateTimeInstance(dateStyle, timeStyle,
Locale.CHINA);
String date = df.format(new Date());
System.out.println(date);// 17-6-9 上午11:29
}
// 面试2: 请将时间值:09-11-28 上午10时25分39秒 CST,反向解析成一个date对象。
@Test
public void eg2() throws Exception {
String str = "09-11-28 上午10时25分39秒 CST";
// 创建DateFormat工具类,国际化日期
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.FULL, Locale.getDefault());
Date d = df.parse(str);
System.out.println(d);//Sat Nov 28 10:25:39 CST 2009
}
网友评论