Java平臺的,Local對象,ResourceBundle對象

一套有實效的軟件系統(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 方法可以通過查看文檔獲得。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 中文翻譯 ng help ng build 構(gòu)建您的應(yīng)用程序并將其放入輸出路徑(dist /默認情況下)。 別名:...
    4ea0af17fd67閱讀 2,144評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 20年前的今天,奶奶離我們而去。僅以此文記念奶奶過世20周年。 我奶奶1915年出生在揚州大運河邊上,知書達理,善...
    TNGRY閱讀 505評論 0 5
  • 早晨,天突然很冷,還下雨,按照之前的慣例,今天該穿班服。給孩子找了秋天的校服,孩子執(zhí)拗不穿,說會扣班級的分...
    宸溪媽閱讀 2,677評論 0 0
  • 在生物學上,如果剛孵化的小動物沒有看見自己的媽媽,它們就會緊跟它所看到的第一個大的行動目標行走。這叫做印隨現(xiàn)象! ...
    靜夜思靜閱讀 1,817評論 0 1

友情鏈接更多精彩內(nèi)容