2014年10月21日 星期二

JAVA - 基本properties的運用


說起來真是慚愧,用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

結果畫面:

2014年10月20日 星期一

Android GCM 某些裝置無法成功接收訊息

參考:
http://developer.android.com/google/gcm/client.html#manifest
http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/


將近一年沒有再碰過android,這兩天為了火燒屁股的專案不得已再撿回來碰,
這次測試的是使用Android GCM機制來發送Notification,但奇怪的是五台測試裝置,分別為Android:4.1.1,4.1.2,4.2.2,4.0.4,與2.3.3

但是,怎麼發送訊息,4.0.4與2.3.3的就是無法成功接收訊息,試驗了老半天,最後在上述參考網站2發現問題點,原來是AndroidManifest.xml設定的問題,我原先設定如下:



    
    
    
    
    

    
    

    
        
            
                
                
            
        
        
    



原因就出在其中的




因為我是直接偷懶貼google教學(如上參考網址1),結果沒有把其中的com.example.gcm替換為我的pkg:com.xxx
因此,只要將這兩行的pkg也替換掉為我的pkg,就可以順利運作了。

不過這種錯誤實在是太難找了..因為4.1.1,4.1.2,4.2.2的都運作正常啊...難道是因為版本比較高所以自動錯誤修正嗎....?