一套有實效的軟件系統(tǒng)也要考慮用戶的語言和地理區(qū)域,語言和區(qū)域形成了本地環(huán)境,描述了軟件本地化的配置和上下文,再Java平臺上,通過Java.util.Locale對象來描述本地化。
Java.util.Locale
如下代碼會一句這些設(shè)置的屬性來打印出local
import java.util.Locale;
public class Default{
? public static void main(String args[]){
? ? System.out.println(Locale.getDefault());
}
根據(jù)如上代碼來做個試驗,運行在U.S的英語系統(tǒng)時候,該代碼會輸出en_US
如何用ResourceBundle來讀取配置文件
Locale?locale?=?new?Locale("en",?"US");??
ResourceBundle?labels?=?ResourceBundle.getBundle("i18n.MyBundle",?locale);?
?System.out.println(labels.getString("label1"));??
上面的例子中,你需要將MyBundle放在包i18n中。 resource bundle 的名稱類似類名。如i18n.MyBundle意思是,包i18n中的屬性文件MyBundle.properties。
下面是屬性文件中的內(nèi)容。
label1?=?Label?1?is?done!??
label2?=?Label?2?is?through!??
上述文件是由一組key,value對構(gòu)成。key在=號左側(cè),value在右側(cè)。value是你要本地化的內(nèi)容。
對于java基礎(chǔ)很好的人來說,這個應(yīng)該是簡單的不能再簡單的了。不過估計一些java新手不一定會知道(比如我,上次為別人寫一個東西,需要從外存讀文件來設(shè)置對象的值,因為不知道有ResourceBundle這種東西,就自己用FileReader在那搞,折騰了半天,最后還不能把配置文件和jar包打在一起發(fā)布,郁悶)。
java.util.ResourceBundle
ResourceBundle的類層次結(jié)構(gòu)
ResourceBundle類有兩個子類,PropertyResourceBundle及ListResourceBundle。下面是這幾個類的結(jié)構(gòu)圖。

PropertyResourceBundle將本地化的文本存儲于Java property文件中
創(chuàng)建ResourceBundle
//basename為本地語言配置文件名?
public static final ResourceBundle getBundle(String basename,Locale locale);?
可以按照下面方式,創(chuàng)建ResourceBundle類的實例
//建立本地語言對象
Locale locale=new Locale("en","US");
//把本地語言對象作為參數(shù),傳給ResourceBundle對象
ResourceRundle lables=ResourceBundle.getBundle("本地語言配置的文件名",locale);
System.out.println(lables.getString(“xx”)); ? ? ? ? ? ? //打印結(jié)果為這個鍵所對應(yīng)的配置值
首先要創(chuàng)建Locale實例,然后將Locale實例傳給ResourceBundle.getBundle(String basename,Locale locale)方法,
此外還需要傳遞加載的resource bundle名稱,最后用過ResourceBundle的getString()方法,getObjec()方法訪問本地化值。
實際上并沒有創(chuàng)建ResourceBundle實例,而是創(chuàng)建了ResourceBundle子類的實例,實例創(chuàng)建都是通過工廠方法來完成,首先ResourceBundle類將會查找ListResourceBundle,隨后會查找PropertyResourceBundle。查找是根據(jù)ListResourceBundle類名來匹配resource bundle的名字來完成(getBundle()方法的第一個參數(shù)),如果找不到,則根據(jù)PropertyResourceBundle resource bundle來匹配。
Property Files作為ResourceBundle
可以使用標準的屬性文件來存儲本地化文本??梢酝ㄟ^ResourceBundle 類加載這些屬性。
Locale?locale?=?new?Locale("en",?"US");??
ResourceBundle?labels?=?ResourceBundle.getBundle("i18n.MyBundle",?locale);??
System.out.println(labels.getString("label1"));??
上面的例子中,你需要將MyBundle放在包i18n中。 resource bundle 的名稱類似類名。如i18n.MyBundle意思是,包i18n中的屬性文件MyBundle.properties。
下面是屬性文件中的內(nèi)容。
label1?=?Label?1?is?done!??
label2?=?Label?2?is?through!??
上述文件是由一組key,value對構(gòu)成。key在=號左側(cè),value在右側(cè)。value是你要本地化的內(nèi)容。


將不同語言,放置于不同的屬性文件中
為了提供不同語言的字符串,需要為每種語言創(chuàng)建屬性文件,文件名的格式為 xxxx_語言編碼。例如:
MyBundle.properties??
MyBundle_da.properties??
MyBundle_de.properties??
MyBundle_fr.properties??
這些文件應(yīng)該放在同一個包中。
沒有語言后綴的文件(例如:MyBundle.properties)是默認的屬性文件。
帶有語言編碼后綴的屬性文件包含同樣的key但是value是以不同的語言來標識。如danish ?屬性文件:
label1?=?Label?1?er?klar!?
?label2?=?Label?2?er?igennem!??
將類作為ResourceBundle
也可以使用一組類來獲取資源,使用類,還可以使用除字符串值外的其它類型資源。
與屬性文件類似,可以創(chuàng)建帶有 bundle base名稱與語言后綴的一組類。
例如:
i18n.MyClassBundle
i18n.MyClassBundle_da
i18n.MyClassBundle_en
i18n.MyClassBundle_de
下面是一個默認的bundle class文件實現(xiàn)的例子。
import?java.util.ListResourceBundle;??
public?class?MyClassBundle?extends?ListResourceBundle?{??
@Override??
protected?Object[ ][ ]?getContents()?{??
return?contents;??
????}??
private?Object[ ][ ]?contents?=?{??
{"price"???,?new?Double(10.00)?},??
{"currency",?"EUR"?},??
????};??
}??
下面是danish(丹麥語)? resource bundle的實現(xiàn)。
public?class?MyClassBundle_da?extends?ListResourceBundle?{??
@Override??
protected?Object[][]?getContents()?{??
return?contents;??
????}??
private?Object[][]?contents?=?{??
{"price"???,?new?Double(75.00)?},??
{"currency",?"DKK"?},??
????};??
}??
注意contents數(shù)組,是一個包含key,value的二維數(shù)組。price,currency是key,而key右側(cè)為本地化的值。獲取ListResourceBundle 實例的方式與獲取PropertyResourceBundle實例的方式一樣,下面是獲取默認ResourceBundle 及丹麥語ResourceBundle 的例子。
//獲取德國
Locale?locale?=?new?Locale("de",?"DE");?//no?bundle?for?German?->?default??
ResourceBundle?bundle?=?ResourceBundle.getBundle("i18n.MyClassBundle",?locale); ?
System.out.println("price???:?"?+?bundle.getObject("price"));??
System.out.println("currency:?"?+?bundle.getObject("currency"));??
//獲取丹麥
locale?=new?Locale("da",?"DK");??
bundle?=?ResourceBundle.getBundle("i18n.MyClassBundle",?locale); ?
System.out.println("price???:?"?+?bundle.getObject("price"));??
System.out.println("currency:?"?+?bundle.getObject("currency"));??
輸出是:??
price???:10.0??
currency:?EUR??
price???:75.0??
currency:?DKK??
從ResourceBundle中獲取值
獲取ResourceBundle實例后可以通過下面的方法獲得本地化值。
getObject(String key);
getString(String key);
getStringArray(String key);
還可以通過keySet()方法獲取所有的key。Set keys = bundle.keySet();
其它ResourceBundle 方法可以通過查看文檔獲得。