java国际化——资源包
【0】README
1) 本文部分文字描述轉自 core java volume 2 , 旨在理解 java國際化——資源包 的基礎知識 ;
2) 本文源代碼idea 轉自: (利用properties 文件進行國際化)https://docs.oracle.com/javase/tutorial/i18n/resbundle/propfile.html 和 (利用.class 文件進行國際化)https://docs.oracle.com/javase/tutorial/i18n/resbundle/list.html
【1】java國際化——資源包相關
1)problem+solution
- 1.1)problem: 當本地化一個應用時, 可能會有大量的消息字符串, 按鈕標簽和其它的東西需要被翻譯;
- 1.2)solution: 你會希望在外部定義消息字符串, 通常稱之為資源。 在java中, 需要使用屬性文件來設定字符串資源,并為其它類型的資源實現相應的類; (干貨——java 資源的定義)
【2】定位資源包
1)當本地化一個應用時,會制造出很多資源包。每個包都是一個屬性文件或者是一個描述了與 locale 相關的項的類。對于每一個包, 都要為所有你想要支持的 locale 提供相應的版本;
2)想要對這些包使用一種統一的命名規則: (干貨——資源包統一命名規則)
2.1)包名語言國家;
2.2)包名_語言;
來命名所有和語言相關的資源。
2.3)最后,作為后備, 可以把默認資源放到一個沒有后綴的文件中;
2.3.1)可以用下面的命令加載一個包:
ResourceBundle resource = ResourceBundle.getBundle(bundleName, currentLocale);
2.3.2) getBundle 方法試圖加載匹配當前 locale 定義的語言和國家的包。如果失敗, 通過依次放棄國家和語言來繼續進行查找, 然后同樣的查找被應用于默認的 locale;
- 2.3.3)最后, 如果還不行的話就去查看默認的包文件, 如果這也失敗了, 就拋出一個異常 MissingResourceException;
3)也就是說, getBundle 方法試圖加載以下的包: (干貨—— getBundle 方法試圖加載包名的順序)
(1)包名當前locale的語言當前Locale的國家_當前Locale的變量;
(2)包名當前locale的語言當前Locale的國家;
(3)包名_當前locale的語言;
(4)包名默認locale的語言默認Locale的國家_默認Locale的變量;
(5)包名默認locale的語言默認Locale的國家;
(6)包名_默認locale的語言;
(7)包名;
4)總之, java 的資源包機制會自動定位與給定的locale 匹配得最好的項。
- 4.1)可以很容易地吧越來越多的本地化信息加到已有的程序中: 你需要做的只是增加額外的資源包;
【2】利用屬性文件進行國際化
1)對字符串進行國際化是很直接的, 你可以吧字符串放到一個屬性文件中, 典型的 屬性文件內容如下: (干貨——屬性文件引入原因——為了對字符串進行國際化,需要定義屬性文件)
computeButton=Rechnen
colorName=black
defaultPaperSize=210X297
1.1)然后利用以上提到的規則去命名你的屬性文件;
MyprocStrings.properties
MyprocStrings_en.properties
MyprocStrings_de_DE.properties1.2)你可以直接加載包:如
ResourceBundle bundle = ResourceBundle.getBundle(“MyProcStrings”, locale);
1.3)要查找一個具體的字符串,可以調用:
string str = bundle.getString(“colorName”);Warning)
- W1)存儲屬性的文件都是ASCII文件, 如果你需要將 Unicode 字符放到屬性文件中, 那么請用\uxxxx 編碼方式對它們進行編碼。
- W2)你可以使用 native2ascii 工具來產生這些文件;
2)看個利用.properties文件進行國際化的荔枝:
- 2.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter5/ResourceBundle_Properties
- 2.2)key source code at a glance:
2.3)relative printing results as follows:
【3】利用包類進行國際化
1) 為了提供字符串外的資源,需要定義類, 它必須擴展于 ResourceBundle 類, 應該使用標準的命名規則來命名你的類, 如:(干貨——資源綁定類引入原因——為了對字符串外的資源進行國際化,需要定義資源綁定類)(干貨——包類的命名規則)
MyprogResources.java
MyprogResources_en.java
MyprogResources_de_DE.java
2)你可以使用 與 加載屬性文件相同的getBundle 方法來加載這個類: (干貨——加載資源綁定類與資源包的方法相同,即getBuddle)
ResourceBundle bundle = ResourceBundle .getBundle(“MyprogResources”, locale);
Warning) 當搜索包時, 如果在類中的包和在屬性文件中的包中都存在匹配, 優先選擇類中的包;
3)每一個資源綁定類都實現了一個查詢表。
3.1)你需要為每一個你想定位的設置都提供一個關鍵字字符串, 使用這個字符串來提取相應的設置, 如;
Color background = (Color) bundle.getObject(“background”);
double[] papersize = (double[]) bundle.getObject(“defaultSize”);3.2)使用資源綁定類的最簡單方法就是 繼承 ListReourceBundle類; (干貨——使用資源綁定類的最簡單方法就是 繼承 ListReourceBundle類)
- 3.3)ListReourceBundle: 讓你把所有資源都放到一個對象數組并提供查找功能, 請遵循以下框架代碼:
public class bundleName_language_country extends ListResourceBundle
{
private static final Object[][] contents =
{
{key1, value1];
{key1, value1];
…
}
public Object[][] getContents() { return contents ; }
}
4)看個荔枝: public class ProgramResource_de extends ListResourceBundle {private static final Object[][] contents = {{"background",Color.black];{"defaultPaperSize", new double[]{210, 297}}...} public Object[][] getContents() { return contents ; } } **5)**或者, 你的資源綁定類可以擴展 ResourceBundle 類。 然后需要實現兩個方法, 一個是枚舉所有鍵,二是用給定的鍵查找相應的值: Enumeration<String> getKeys(); Object handleGetObject(String key); ResourceBundle 類的 getObject 方法會調用你提供的 handleGetBundle 方法;
6)看個利用.class文件進行國際化的荔枝:
- 6.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter5/ResourceBundle_Class
- 6.2)key source code at a glance:
- 6.3)relative printing results as follows:
總結
以上是生活随笔為你收集整理的java国际化——资源包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ISO语言代码和国家代码+Locale常
- 下一篇: NanoHTTPD web server