2015年7月2日 星期四

讀取國際化資源

讀取國際化資源還蠻常用的,如下有四個properties,分別代表簡中、繁中、美國、什麼都沒有時顯示的
簡中:Morning_zh_CN.properties
msg=\u65e9\u4e0a\u597d,{0}!{1}{2}
繁中:Morning_zh_TW.properties
msg=\u65e9\u5b89,{0}!{1}{2}
美國:Morning_en_US.properties
msg=Good Morning,{0}!{1}{2}
預設:Morning.properties
msg=original{0}{1}{2}

_xx_xx:要真的有這個國家,不然找不到
\uxxxx:因為properties不能打ascii以外的字,應該吧,反正中文不行,所以有一個工具在java安裝資料夾的bin,裡面有一支native2ascii.exe,點兩下打中文就會出現了,按右鍵即複製,貼到properties裡。
{number}:可無限遞增,從程式碼傳過去的參數
P.S 但我的環境是繁中,叫出native2ascii.exe,我打簡體或日文都會出現?,所以只能打繁中。
我找到一個小方法,在執行打charmap會叫出字元對應表,如下

勾進階檢視,會出現更多選項,字元集選簡中,分組方式可以更小範圍搜索,按隨便一個字,如我按的這個「蝇」左下角就有U+8747,把+去掉,最前面加「\」,改個小寫比較像,這樣子就完成了,只是要特定的字不知有沒有辦法,雖然有搜尋目標的框,可是好像沒用。

找到一個更好的方法了,切換到Properties活頁標籤,直接打在裡面,然後切回Source就自動會轉換了,所以可以不用native2ascii.exe了


寫個程式來測試一下
final String prop = "Morning";
final String res = "msg";
ResourceBundle simple = ResourceBundle.getBundle(prop, Locale.PRC);
ResourceBundle traditional = ResourceBundle.getBundle(prop, Locale.TAIWAN);
ResourceBundle english = ResourceBundle.getBundle(prop, Locale.US);
System.out.println("简中:" + simple.getString(res));
System.out.println("繁中:" + traditional.getString(res));
System.out.println("English:" + english.getString(res));
System.out.println();
System.out.println(MessageFormat.format(simple.getString(res), "小龙哥", "测试1", "测试2"));
System.out.println(MessageFormat.format(traditional.getString(res), "小龍哥", "測試1", "測試2"));
System.out.println(MessageFormat.format(english.getString(res), "small dragon guy", "test1", "test2"));

結果:
简中:早上好,{0}!{1}{2}
繁中:早安,{0}!{1}{2}
English:Good Morning,{0}!{1}{2}

早上好,小龙哥!测试1测试2
早安,小龍哥!測試1測試2
Good Morning,small dragon guy!test1test2

※1.第一行getBundle的第一個參數要打properties的名稱,不包括_後面的,副檔名也不用,不然會報錯
2.第五行,若getString不到也會報錯
3.MessageFormat.format第二個參數是…,所以可以一直加,對應{0}{1}…,如果不夠會把{0}{1}這些顯示出來
4.假如zh_TW打錯了,譬如zh_TM,那就代表抓不到,會抓到預設的Morning.properties,如果連Morning.properties檔都沒有,就會報錯,所以這個檔不是必要的
5.xx_xx這個東西可以來這查

沒有留言:

張貼留言