說起來真是慚愧,用java這麼久,一直都沒有真正使用過properties file,今天就來練習一下:(其實是因為專案需要多國語系的關係啦,不得不用...)
假設我們設計一個網站 or app 需要支援多國語系,但不可能有人願意把每個跟語系有關的文字harcode在程式裡,畢竟那太愚蠢了,變成一個專案多個版本,卻只是為了那些不同的顯示文字,使用properties可以很好地解決這個問題:
今天我需要依照不同的語系,輸出不同的招呼語(中文=你好,英文=hello,日文=こんにちは),我該怎麼做呢:
首先是專案架構:
很簡單src只有一個檔案,而resource下的3個properties就是今天的主角囉,properties.sh只是方便執行測試的sh檔案,先看唯一的code Main.java:
package com.example.shihanne.properties; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Locale; import java.util.ResourceBundle; public class Main { public static void main(String[] args) throws IOException { Locale locale = Locale.getDefault(); String key = "hello"; if(args.length == 1) key = args[0]; if(args.length == 2){ key = args[0]; locale = Locale.forLanguageTag(args[1]); } System.out.println(new Main().getMessageByBundle(key,locale)); } public String getMessageByBundle(String key,Locale local) throws UnsupportedEncodingException{ ResourceBundle rs = ResourceBundle.getBundle("config",local); return new String(rs.getString(key).getBytes("ISO-8859-1"),"UTF-8"); } }
以下是我的properties file:
config_en.properties:
hello=hello
config_zh_TW.properties:
hello=你好
config_ja.properties:
hello=こんにちは
很簡單,都各只有一行,=左邊的hello代表這個propertie的參數名稱(key),=右邊的也就是我們要輸出的各國語系value啦~
必須要注意的是properties的命名規則:[filename]_[locale].properties
在這裡我們使用的檔案名稱為config,繁體中文的locale=zh_TW,日文locale=ja,英文=en
程式很簡單,Main先偵測是否有指定參數:
第一個參數為欲讀取的properties key(此例為hello),第二個參數為語系(若沒有,則使用本機的預設語系(當然是zh_TW囉) )
之後我們再使用ResourceBundle.getBundle(basename,locale) 讀取properties file,最後再使用ResourceBundle.getString(key)讀出我們需要的value
properties.sh如下:
java -cp ../bin:../resource com.example.shihanne.properties.Main $1 $2
結果畫面: