Localization
Localization為本地化的意思, 也就是依照不同的地區顯示不同的文字日期格及貨幣格式. 比如在華語地區顯示中文字, 英文系國家顯示英文, 日本地區顯示日文, 此時就需使用多國語系. 如此就可以一支程式適用全球各地, 而不需發行不同的版本.
建立多國語系的步驟
- 在專案視窗中切換到Files, 在專案按右鍵/new Folder/建立resources目錄
- 切換到Projects, 在專案按右鍵/Properties/Sources/Source Package Folders add Folders/選擇resources
- resources按右鍵/other, 再由彈出視窗中的Other選取Empty file, 分別建立檔名message_zh_TW.properties及message_en_US.properties.
message為等會Java代碼要打開的檔案名稱, 後面再加上語系及國碼, 然後副檔名為.properties - 在二個檔案中, 使用key/value 分別輸入不同的語言
Example
如下代碼中, 使用ResourceBundle.getBundle取得要使用的資源檔, 比如currentLocale為zh_TW, 則開啟resource/message_zs_TW.properties, 若為en_US, 則開啟resource/message_en_US.properties.
public class LocalTest { static Locale usLocale=Locale.US; static Locale zhLocale=new Locale("zh", "TW"); //static Locale currentLocale=Locale.getDefault(); static Locale currentLocale=usLocale; static ResourceBundle msg=ResourceBundle.getBundle("message", currentLocale); public static void main(String[] args) { printMenu(); } public static void printMenu(){ System.out.println("1."+msg.getString("menu1")); System.out.println("2."+msg.getString("menu2")); } } 新增的檔案內容如下 message_zh_TW.properties menu1 = 英文 menu2 = 中文 message_en_US.properties menu1 = English menu2 = Chinese
使用Locale 設定語系
有二種方式
Locale zhLocale=new Locale(“zh”, “TW”);
Locale zhLocale=Locale.TAIWAN;
使用ResourceBundle 變更語系
ResourceBundle messages=ResourceBundle.getBundle(“message”, zhLocale);
使用ResourceBundle 取得字串
messages.getString(“menu1″), 然後將之印出
Properties檔案命名規則
message_語系_國別.properties
en_US
zh_CN
zh_TW
語系為小寫, 國別為大寫
顯示日期
日期的顯示格式, 可以先使用DateFormat.getXXX來設定. 日期格式有如下三種
DateFormat.getDateInstance() : 可設定日期格式
DateFormat.getTimeInstance() : 可設定時間格式
DateFormat.getDateTimeInstance() : 可設定日期, 時間格式
上述的最後一個參數可以加入Locale.
格式有四種.
DateFormat.SHORT : 12.13.52 3:30PM
DateFormat.MEDIUM : Jan 12, 1952
DateFormat.LONG : January 12, 1952 3:30:32pm
DateFormat.FULL : Tuesday, April 12, 1952 3:30:42pm PST
public static void main(String[] args) { Locale zhLocale=Locale.TAIWAN; DateFormat []df=new DateFormat[8]; df[0]=DateFormat.getDateInstance(DateFormat.SHORT, zhLocale); df[1]=DateFormat.getTimeInstance(DateFormat.SHORT, zhLocale); df[2]=DateFormat.getDateInstance(DateFormat.MEDIUM, zhLocale); df[3]=DateFormat.getTimeInstance(DateFormat.MEDIUM, zhLocale); df[4]=DateFormat.getDateInstance(DateFormat.LONG, zhLocale); df[5]=DateFormat.getTimeInstance(DateFormat.LONG, zhLocale); df[6]=DateFormat.getDateInstance(DateFormat.FULL, zhLocale); df[7]=DateFormat.getTimeInstance(DateFormat.FULL, zhLocale); for (int i=0;i<df.length;i++){ System.out.printf("%s\n",df[i].format(new Date())); } }
結果如下
2018/7/14 下午 10:24 2018/7/14 下午 10:24:14 2018年7月14日 下午10時24分14秒 2018年7月14日 星期六 下午10時24分14秒 TST
SimpleDateFormat
OCP認証考式中, 超愛考上述的DateFormat. 但相信我, 一般專案中用到的機會非常小. 反而是SimpleDateFormat最常用
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy/MM/dd"); System.out.println(sdf1.format(new Date())); SimpleDateFormat sdf2=new SimpleDateFormat("HH:mm:ss"); System.out.println(sdf2.format(new Date()));
常見的格式如下
yyyy : 4位數西洋年
MM : 2位數月份, 不足2位補0
dd : 2位數日期
hh : 時, 12小時制
HH: 時, 24小時制
mm: 分
ss: 秒
Calendar
new Date()可以取得目前的系統時間. 但若要指定某個日期時間的話, 則需使用到Calendar
Calendar calendar=Calendar.getInstance(); calendar.set(2000, 6, 18, 14, 25, 59); SimpleDateFormat sdf1=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); System.out.println(sdf1.format(calendar.getTime()));
上述calendar要使用getTime()轉換成Date物件, 再交由sdf列轉換格式列印出來
顯示貨幣
NumberFormat currency=NumberFormat.getCurrencyInstance(Locale.CHINA);
System.out.println(currency.format(100000));
結果如下
¥100,000.00