Java的ResourceBundle是一個很好用的工具,可以很方便的用來實現軟體的國際化和本地化功能。因為ResourceBundle能夠按照一定的規則,自動尋找目錄下符合某個文化和地區的資源檔(.properties檔案)。通過為不同的文化和地區提供不同的資源檔,然後讓java自動根據規則來讀取這些資源檔,實際上就完成軟體的本地化工作。
先看一個小例子,建立一個test工程,目錄結構如下:
test/
classMain.java
message_zh.properties
message_en.properties
2個message*.properties檔案都只有一行,分別是:
message_zh.properties:
msg0="Chinese locale"
message_en.properties:
msg0="English locale"
classMain.java同樣簡單,主程式只有2行:
import java.util.*;
public class classMain{
public static void main(String args[])
{
ResourceBundle rb = ResourceBundle.getBundle("message"--);
System.out.println(rb.getString("msg0"));
}
}
編譯javac classMain.java即可產生classMain.class檔案,分別在中文Locale和英文Locale下運行java classMain.class,會發現輸出的字串分別是“Chinese locale“和“English locale“。
看看上面的2行代碼,關鍵在於ResourceBundle.getBundle(“message“)。顯然這個message與那兩個message*.properties檔案大有關係。查閱一下JDK的文檔可以發現,ResourceBundle實際上是把“message“當作一個basename使用,然後根據當前的Locale和國家來尋找basename_*.properties檔案,所以當Local分別為中文和英文時,ResourceBundle分別使用的就是message_zh.properties和message_en.properties檔案。然後ResourceBundle讀入找到的.properties檔案,並對其中的資源進行處理,這就不難理解ResourceBundle.getString(“msg0“)的結果了(msg0=“** locale“)。
為了求證以上的分析,我又查看了一下java的原始碼,getBundle實際上會轉而調用getBundleImpl,getBundleImpl先確定實際使用的Locale,然後根據搜尋規則形成一個搜尋列表,再交給findBundle處理,然後由findBundle完成實際.properties檔案的搜尋工作。所有代碼均在JDK的java.util.ResourceBundle.java中,不再列舉。
Eclipse的國際化和本地化的實現,實際上就是基於ResourceBundle來實現的(當然,要感謝Eclipse強大的外掛程式機制)。本人因為工作需要,稍稍做了一下瞭解,順手記下來,以防忘卻。
本人是Java新手,如有錯誤,歡迎批評,歡迎鄙視。