即國(guó)際化,又簡(jiǎn)稱為 i18n质蕉。國(guó)際化的目的是讓程序能靈活應(yīng)對(duì)世界不同地區(qū)和國(guó)家的訪問。
1.Locale
本地化對(duì)象,封裝語(yǔ)言翩肌、國(guó)家信息的對(duì)象模暗,由java.util提供
// 模擬中國(guó)語(yǔ)言等環(huán)境
// Locale locale = Locale.CHINA;
Locale locale = Locale.getDefault(); // 當(dāng)前系統(tǒng)默認(rèn)的語(yǔ)言環(huán)境
System.out.println(locale.getCountry()); // CN 國(guó)家的簡(jiǎn)稱
System.out.println(locale.getDisplayCountry()); //中國(guó) 國(guó)家名稱
System.out.println(locale.getLanguage()); // zh 語(yǔ)言簡(jiǎn)稱
// 模擬美國(guó)國(guó)家
Locale l_us = Locale.US;
System.out.println(l_us.getCountry()); //US
System.out.println(l_us.getDisplayCountry());//美國(guó)
System.out.println(l_us.getLanguage());//en
2.ResourceBundle
用于描述一個(gè)資源包,并且 ResourceBundle類提供了相應(yīng)的方法getBundle念祭,這個(gè)方法可以根據(jù)來(lái)訪者的國(guó)家地區(qū)自動(dòng)獲取與之對(duì)應(yīng)的資源文件予以顯示
一個(gè)資源包中的每個(gè)資源文件都必須擁有共同的基名兑宇。除了基名,每個(gè)資源文件的名稱中還必須有標(biāo)識(shí)其本地信息的附加部分粱坤。例如:一個(gè)資源包的基名是“myproperties”隶糕,則與中文、英文環(huán)境相對(duì)應(yīng)的資源文件名則為: “myproperites_zh.properties” “myproperites_en.properties”
每個(gè)資源包都應(yīng)有一個(gè)默認(rèn)資源文件站玄,這個(gè)文件不帶有標(biāo)識(shí)本地信息的附加部分枚驻。若ResourceBundle對(duì)象在資源包中找不到與用戶匹配的資源文件,它將選擇該資源包中與用戶最相近的資源文件株旷,如果再找不到再登,則使用默認(rèn)資源文件。例如:myproperites.properties
資源文件的內(nèi)容通常采用“關(guān)鍵字=值”的形式晾剖,軟件根據(jù)關(guān)鍵字檢索值顯示在頁(yè)面上锉矢。一個(gè)資源包中的所有資源文件的關(guān)鍵字必須相同,值則為相應(yīng)國(guó)家的文字齿尽。
并且資源文件中采用的是properties格式文件沽损,所以文件中的所有字符都必須是ASCII字碼,對(duì)于像中文這樣的非ACSII字符循头,須先進(jìn)行編碼绵估。(java提供了一個(gè)native2ascII命令用于編碼)。例:屬性文件是不能保存中文的
實(shí)例:
// 設(shè)置語(yǔ)言環(huán)境
Locale locale = Locale.US;
// Locale locale = Locale.getDefault();
// 創(chuàng)建工具類對(duì)象ResourceBundle
ResourceBundle bundle = ResourceBundle.getBundle(
"cn.itcast.f_i18n.msg", locale);
// 根據(jù)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.國(guó)際化動(dòng)態(tài)文本
3.1 國(guó)際化貨幣
public void testI18N3() throws Exception {
// 模擬語(yǔ)言環(huán)境
Locale locale = Locale.CHINA;
// 數(shù)據(jù)準(zhǔn)備
double number = 100;
// 工具類
NumberFormat nf = NumberFormat.getCurrencyInstance(locale);
// 國(guó)際化貨幣
String m = nf.format(number);
// 測(cè)試
System.out.println(m);// ¥100.00
}
// 面試題: 代碼計(jì)算: $100 * 10
@Test
public void eg() throws Exception {
String str = "$100";
int num = 10;
// 1. 分析str值是哪一國(guó)家的貨幣
Locale us = Locale.US;
// 2. 國(guó)際化工具類
NumberFormat nf = NumberFormat.getCurrencyInstance(us);
// 3. 解析str國(guó)幣
Number n = nf.parse(str);
System.out.println(n.intValue() * num);//1000
}
3.2.國(guó)際化數(shù)值
public void testI18N4() throws Exception {
// 模擬語(yǔ)言環(huán)境
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.國(guó)際化日期
/*
* 日期 FULL 2015年3月4日 星期三 LONG 2015年3月4日 FULL 2015年3月4日 星期三 MEDIUM 2015-3-4
* SHORT 15-3-4
*
* 時(shí)間 FULL 下午04時(shí)31分59秒 CST LONG 下午04時(shí)32分37秒 MEDIUM 16:33:00 SHORT 下午4:33
*/
@Test
public void testI18N5() throws Exception {
// 日期格式
int dateStyle = DateFormat.SHORT;
// 時(shí)間格式
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: 請(qǐng)將時(shí)間值:09-11-28 上午10時(shí)25分39秒 CST贷岸,反向解析成一個(gè)date對(duì)象壹士。
@Test
public void eg2() throws Exception {
String str = "09-11-28 上午10時(shí)25分39秒 CST";
// 創(chuàng)建DateFormat工具類,國(guó)際化日期
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
}