欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深度解析Java中的國(guó)際化底層類ResourceBundle

 更新時(shí)間:2023年03月10日 08:22:40   作者:了不起  
做項(xiàng)目應(yīng)該都會(huì)實(shí)現(xiàn)國(guó)際化,那么大家知道Java底層是如何實(shí)現(xiàn)國(guó)際化的嗎?這篇文章就來(lái)和大家深度解析一下Java中的國(guó)際化底層類ResourceBundle,希望對(duì)大家有所幫助

在Java開發(fā)中,ResourceBundle是一種方便地管理本地化資源的機(jī)制。它可以使得程序能夠根據(jù)當(dāng)前系統(tǒng)環(huán)境的語(yǔ)言和國(guó)家/地區(qū)來(lái)自動(dòng)加載相應(yīng)的本地化資源文件,從而避免了硬編碼和減少了重復(fù)的代碼。以下是使用ResourceBundle的基本步驟:

1. 準(zhǔn)備資源文件

ResourceBundle通過(guò)加載資源文件來(lái)實(shí)現(xiàn)本地化,因此需要為每種語(yǔ)言和國(guó)家/地區(qū)準(zhǔn)備一個(gè)對(duì)應(yīng)的資源文件。資源文件可以是.properties格式的文本文件,也可以是.class文件或.jar文件。

在資源文件中,需要為每個(gè)需要本地化的字符串指定一個(gè)屬性名,然后為每個(gè)屬性名分別提供該語(yǔ)言下的翻譯。例如,以下是一個(gè)名為messages.properties的資源文件的示例:

greeting=Hello
farewell=Goodbye

在不同的語(yǔ)言和國(guó)家/地區(qū)下,可以為同一屬性名提供不同的翻譯。例如,以下是名為messages_fr.properties的法語(yǔ)資源文件的示例:

greeting=Bonjour
farewell=Au revoir

2. 加載資源文件

在Java中,可以使用ResourceBundle類來(lái)加載資源文件。ResourceBundle類提供了幾種不同的構(gòu)造函數(shù)來(lái)加載資源文件,例如:

ResourceBundle?rb?=?ResourceBundle.getBundle("messages",?Locale.getDefault());

這個(gè)語(yǔ)句會(huì)根據(jù)當(dāng)前系統(tǒng)環(huán)境的默認(rèn)語(yǔ)言和國(guó)家/地區(qū)來(lái)加載名為messages的資源文件。如果系統(tǒng)環(huán)境是英語(yǔ)和美國(guó),那么這個(gè)語(yǔ)句會(huì)加載messages.properties資源文件。如果系統(tǒng)環(huán)境是法語(yǔ)和法國(guó),那么這個(gè)語(yǔ)句會(huì)加載messages_fr.properties資源文件。

如果需要加載指定語(yǔ)言和國(guó)家/地區(qū)下的資源文件,可以使用帶有Locale參數(shù)的getBundle()方法。例如:

Locale?locale?=?new?Locale("fr",?"FR");
ResourceBundle?rb?=?ResourceBundle.getBundle("messages",?locale);

這個(gè)語(yǔ)句會(huì)加載名為messages_fr_FR.properties的法語(yǔ)/法國(guó)資源文件。

3. 獲取本地化字符串

一旦成功加載了資源文件,就可以使用ResourceBundle的getString()方法來(lái)獲取本地化字符串。例如:

String?greeting?=?rb.getString("greeting");
String?farewell?=?rb.getString("farewell");

這些語(yǔ)句會(huì)從資源文件中獲取屬性名為greeting和farewell的本地化字符串,并將它們分別賦值給greeting和farewell變量。如果無(wú)法找到指定的屬性名,getString()方法會(huì)拋出MissingResourceException異常。

4. ResourceBundle 使用技巧

除了上述基本步驟,使用ResourceBundle還有以下一些值得注意的特點(diǎn)和技巧:

4.1 選擇合適的資源文件格式

ResourceBundle支持多種資源文件格式,包括.properties、.xml和.class文件等。對(duì)于簡(jiǎn)單的本地化字符串,.properties格式通常是最常用的選擇,因?yàn)樗?jiǎn)單易用、易于編輯和本地化。

對(duì)于較復(fù)雜的本地化資源,如圖像、聲音、視頻等,可能需要使用其他格式的資源文件。例如,可以使用.class文件或.jar文件來(lái)包含圖像或聲音文件,并使用ResourceBundle的ClassLoader.getSystemClassLoader()方法來(lái)加載這些文件。

4.2 處理本地化字符串中的特殊字符

在本地化字符串中可能包含各種特殊字符,如換行符、制表符、Unicode字符等。如果直接將這些字符嵌入到資源文件中,可能會(huì)導(dǎo)致不必要的麻煩和錯(cuò)誤。

為了避免這些問(wèn)題,可以使用Java的轉(zhuǎn)義字符來(lái)表示這些特殊字符。例如,可以使用"\n"表示換行符,"\t"表示制表符,"\uXXXX"表示Unicode字符等。

4.3 處理缺失的本地化字符串

在某些情況下,可能存在某些語(yǔ)言下的本地化字符串沒(méi)有提供翻譯的情況。為了避免程序出現(xiàn)MissingResourceException異常,可以在資源文件中為這些缺失的字符串提供一個(gè)默認(rèn)的翻譯,如英語(yǔ)翻譯。例如,以下是一個(gè)帶有默認(rèn)翻譯的messages_fr.properties文件的示例:

greeting=Bonjour
farewell=Au?revoir
warning=Attention:?This?message?has?no?translation?in?French.?Please?refer?to?the?English?version.

這樣,在法語(yǔ)環(huán)境下,如果無(wú)法找到某個(gè)屬性名的本地化字符串,ResourceBundle就會(huì)自動(dòng)返回該屬性名的默認(rèn)翻譯,從而避免了程序出現(xiàn)異常。

4.4 處理動(dòng)態(tài)本地化字符串

有些本地化字符串可能包含動(dòng)態(tài)內(nèi)容,如時(shí)間、日期、數(shù)字、貨幣等。為了正確地本地化這些字符串,需要使用Java的格式化機(jī)制,如MessageFormat和NumberFormat等。例如,以下是一個(gè)使用MessageFormat來(lái)本地化動(dòng)態(tài)字符串的示例:

String?pattern?=?rb.getString("greeting");
Object[]?arguments?=?{"John"};
String?greeting?=?MessageFormat.format(pattern,?arguments);

這個(gè)示例中,pattern是一個(gè)包含占位符"{0}"的本地化字符串,"{0}"表示需要替換為動(dòng)態(tài)內(nèi)容的位置。arguments是一個(gè)包含實(shí)際動(dòng)態(tài)內(nèi)容的數(shù)組,它會(huì)按照順序依次替換"{0}"的位置。最后,MessageFormat.format()方法會(huì)返回一個(gè)本地化后的字符串。

4.5 處理多個(gè)資源文件

在一些情況下,可能需要使用多個(gè)資源文件來(lái)管理不同類型或不同用途的本地化資源。在這種情況下,可以使用ResourceBundle.Control類的方法來(lái)指定資源文件的搜索路徑和加載順序。

例如,可以使用ResourceBundle.Control.getControl()方法來(lái)獲取默認(rèn)的ResourceBundle.Control實(shí)例,然后使用ResourceBundle.getBundle()方法來(lái)指定基礎(chǔ)名稱和Locale信息,以便查找合適的資源文件。例如,以下是一個(gè)使用多個(gè)資源文件來(lái)管理本地化字符串的示例:

ResourceBundle.Control?control?=?ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_PROPERTIES);
ResourceBundle?messages?=?ResourceBundle.getBundle("Messages",?new?Locale("fr"),?control);
ResourceBundle?errors?=?ResourceBundle.getBundle("Errors",?new?Locale("fr"),?control);

String?greeting?=?messages.getString("greeting");
String?error?=?errors.getString("invalid_input");

System.out.println(greeting);?//?Bonjour
System.out.println(error);?//?Entrée?invalide

在這個(gè)示例中,我們使用ResourceBundle.Control.FORMAT_PROPERTIES指定了資源文件的格式為.properties文件,然后分別使用Messages和Errors作為基礎(chǔ)名稱來(lái)獲取不同類型的資源文件。這樣,我們就可以輕松地管理不同類型的本地化資源,從而使程序更加可讀和易于維護(hù)。

4.6 自定義資源加載器

如果默認(rèn)的資源加載機(jī)制無(wú)法滿足需求,我們還可以自定義資源加載器來(lái)實(shí)現(xiàn)更高級(jí)的功能。自定義資源加載器需要繼承java.util.ResourceBundle.Control類,并重寫其中的方法來(lái)實(shí)現(xiàn)自定義邏輯。

例如,以下是一個(gè)使用自定義資源加載器來(lái)加載本地化字符串的示例:

public?class?MyResourceLoader?extends?ResourceBundle.Control?{
????@Override
????public?ResourceBundle?newBundle(String?baseName,?Locale?locale,?String?format,?ClassLoader?loader,?boolean?reload)
????????????throws?IllegalAccessException,?InstantiationException,?IOException?{
????????String?bundleName?=?toBundleName(baseName,?locale);
????????String?resourceName?=?toResourceName(bundleName,?"myproperties");
????????InputStream?stream?=?loader.getResourceAsStream(resourceName);
????????if?(stream?!=?null)?{
????????????try?{
????????????????return?new?PropertyResourceBundle(stream);
????????????}?finally?{
????????????????stream.close();
????????????}
????????}?else?{
????????????return?super.newBundle(baseName,?locale,?format,?loader,?reload);
????????}
????}
}

ResourceBundle.Control?control?=?new?MyResourceLoader();
ResourceBundle?messages?=?ResourceBundle.getBundle("Messages",?new?Locale("fr"),?control);

String?greeting?=?messages.getString("greeting");

System.out.println(greeting);?//?Bonjour

在這個(gè)示例中,我們定義了一個(gè)名為MyResourceLoader的自定義資源加載器,并重寫了其中的newBundle()方法來(lái)實(shí)現(xiàn)自定義資源加載邏輯。然后,我們使用這個(gè)自定義資源加載器來(lái)獲取Messages資源文件中的本地化字符串。這樣,我們就可以實(shí)現(xiàn)更高級(jí)的資源加載功能,從而滿足更復(fù)雜的需求。

4.7 動(dòng)態(tài)更新資源文件

有時(shí)候,在應(yīng)用程序運(yùn)行期間,可能需要?jiǎng)討B(tài)地更新資源文件中的某些值。在Java中,我們可以使用PropertyResourceBundle類來(lái)實(shí)現(xiàn)這個(gè)功能。

PropertyResourceBundle是ResourceBundle的一個(gè)子類,它可以讀取.properties格式的資源文件,并將其轉(zhuǎn)換為一個(gè)鍵值對(duì)的形式。然后,我們可以通過(guò)這個(gè)鍵值對(duì)來(lái)動(dòng)態(tài)地更新資源文件中的值。

例如,以下是一個(gè)使用PropertyResourceBundle來(lái)動(dòng)態(tài)更新本地化字符串的示例:

//?加載資源文件
InputStream?stream?=?new?FileInputStream("Messages.properties");
PropertyResourceBundle?bundle?=?new?PropertyResourceBundle(stream);

//?動(dòng)態(tài)更新本地化字符串
bundle.handleKey("greeting",?(key,?value)?->?"Hello");

//?輸出本地化字符串
String?greeting?=?bundle.getString("greeting");
System.out.println(greeting);?//?Hello

在這個(gè)示例中,我們首先使用FileInputStream來(lái)加載Messages.properties資源文件,然后將其轉(zhuǎn)換為一個(gè)PropertyResourceBundle對(duì)象。然后,我們使用handleKey()方法來(lái)動(dòng)態(tài)地更新greeting這個(gè)鍵對(duì)應(yīng)的值。最后,我們使用getString()方法來(lái)獲取更新后的本地化字符串。

這種動(dòng)態(tài)更新資源文件的方式可以使應(yīng)用程序更加靈活,能夠快速響應(yīng)變化。但是需要注意的是,這種方式需要保證資源文件的正確性和一致性,否則可能會(huì)導(dǎo)致應(yīng)用程序運(yùn)行出錯(cuò)。

5. 總結(jié)

Java中的ResourceBundle提供了一種便捷的方式來(lái)管理本地化資源,使得應(yīng)用程序能夠輕松地適應(yīng)不同的語(yǔ)言和文化環(huán)境。通過(guò)熟練掌握ResourceBundle的使用方法,我們可以在開發(fā)Java應(yīng)用程序時(shí)更加靈活和高效。

以上就是深度解析Java中的國(guó)際化底層類ResourceBundle的詳細(xì)內(nèi)容,更多關(guān)于Java ResourceBundle的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java實(shí)現(xiàn)表格tr拖動(dòng)的實(shí)例(分享)

    java實(shí)現(xiàn)表格tr拖動(dòng)的實(shí)例(分享)

    下面小編就為大家分享一篇java實(shí)現(xiàn)表格tr拖動(dòng)的實(shí)例。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • SpringCloud Gateway的熔斷限流配置實(shí)現(xiàn)方法

    SpringCloud Gateway的熔斷限流配置實(shí)現(xiàn)方法

    Spring Cloud Gateway支持通過(guò)配置熔斷和限流機(jī)制來(lái)保證服務(wù)的穩(wěn)定性和可用性,可通過(guò)Hystrix和Resilience4j兩種方式實(shí)現(xiàn)。Hystrix通過(guò)注解和配置文件實(shí)現(xiàn)熔斷限流,Resilience4j通過(guò)編程式配置實(shí)現(xiàn)
    2023-04-04
  • @Transactional跟@DS動(dòng)態(tài)數(shù)據(jù)源注解沖突的解決

    @Transactional跟@DS動(dòng)態(tài)數(shù)據(jù)源注解沖突的解決

    這篇文章主要介紹了@Transactional跟@DS動(dòng)態(tài)數(shù)據(jù)源注解沖突的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中的Hashtable源碼詳細(xì)解析

    Java中的Hashtable源碼詳細(xì)解析

    這篇文章主要介紹了Java中的Hashtable源碼詳細(xì)解析,Hashtable 的函數(shù)都是同步的,這意味著它是線程安全的,它的key、value都不可以為null,此外,Hashtable中的映射不是有序的,需要的朋友可以參考下
    2023-11-11
  • Spring實(shí)戰(zhàn)之容器后處理器操作示例

    Spring實(shí)戰(zhàn)之容器后處理器操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之容器后處理器操作,結(jié)合實(shí)例形式分析了spring容器后處理器配置、使用操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • Java兩種常用的隨機(jī)數(shù)生成方式(小白總結(jié))

    Java兩種常用的隨機(jī)數(shù)生成方式(小白總結(jié))

    這篇文章主要介紹了Java兩種常用的隨機(jī)數(shù)生成方式(小白總結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 通過(guò)實(shí)例學(xué)習(xí)Spring @Required注釋原理

    通過(guò)實(shí)例學(xué)習(xí)Spring @Required注釋原理

    這篇文章主要介紹了通過(guò)實(shí)例學(xué)習(xí)Spring @Required注釋原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java 中序列化與readResolve()方法的實(shí)例詳解

    java 中序列化與readResolve()方法的實(shí)例詳解

    這篇文章主要介紹了java 中序列化與readResolve()方法的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家理解這部分知識(shí),需要的朋友可以參考下
    2017-08-08
  • java圖片和文本同時(shí)提交到表單的實(shí)例代碼

    java圖片和文本同時(shí)提交到表單的實(shí)例代碼

    在本篇文章里小編給大家整理的是關(guān)于java實(shí)現(xiàn)圖片和文本同時(shí)提交到表單的相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • 詳解mybatis三種分頁(yè)方式

    詳解mybatis三種分頁(yè)方式

    本文主要介紹了詳解mybatis三種分頁(yè)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論