程式碼高𠅙

2008/11/11

Google Translate 非官方翻譯 API

之前為了將系統的多語化,其中一個議題就是要產生各種語系的訊息資源檔。繁簡中文的對譯,只要透過 Word 就行了,要是英日語,就得人工作業。靈機一動,想說何不借助既有的翻譯服務,為 resource 檔提供預設的簡中、英、日翻譯。

就這樣,找到了一些應用 Google Translate API 的討論。試用了之後,多少都有語系編碼的問題。我最後實作了一個版本,可以在輸入正體中文時,正常產出簡中、英、日語系的翻譯。

一開始我是採用 C# 語言測試,程式碼如下:

public static string TranslateText(string fromLang, string toLang, string msg)
{
  string target = "http://www.google.com/translate_t?ie=UTF-8&oe=UTF-8&text={2}&langpair={0}|{1}";
  string url = String.Format(target, fromLang, toLang, msg);
  WebClient webClient = new WebClient();
  webClient.Encoding = System.Text.Encoding.UTF8;
  string result = webClient.DownloadString(url);
  string sign = "<div id=result_box dir=\"ltr\">";
  result = result.Substring(result.IndexOf(sign) + sign.Length);
  result = result.Substring(0, result.IndexOf("</div"));
  return result.Replace("<br>", "\n");;
}

後來又做了一個 Java 的版本,程式碼如下:

public static String translateText(String fromLang, String toLang, String msg) throws IOException{
  String target = "http://www.google.com/translate_t?ie=UTF-8&oe=UTF-8&langpair=%s|%s&text=%s";
  String url = String.format(target, fromLang, toLang, URLEncoder.encode(msg, "utf-8"));
  String result = getUrlContent(url);
  String sign = "<div id=result_box dir=\"ltr\">";
  result = result.substring(result.indexOf(sign) + sign.length());
  result = result.substring(0, result.indexOf("</div"));
  return result.replaceAll("<br>", "\n");
}

public static String getUrlContent(String url) throws IOException {
  URL u = new URL(url);   
  HttpURLConnection conn = (HttpURLConnection)u.openConnection();   
  conn.setRequestProperty("User-agent","Mozilla/4.0");
  conn.setRequestProperty("Content-Language","UTF-8" );
  conn.connect();
  return slurp(conn.getInputStream());            
}

public static String slurp (InputStream in) throws IOException {
  StringBuffer out = new StringBuffer();
  byte[] b = new byte[4096];
  for (int n; (n = in.read(b)) != -1;) {
    out.append(new String(b, 0, n, "UTF-8"));
  }
  return out.toString();
}

測試程式長得像這樣:

public static void main(String []argv) throws IOException{
  System.out.println(GoogleTranslate.translateText("zh-TW", "zh-CN", "書不同文、車不同軌、世界不大同!"));
  System.out.println(GoogleTranslate.translateText("zh-TW", "en", "書不同文、車不同軌、世界不大同!"));
  System.out.println(GoogleTranslate.translateText("zh-TW", "ja", "書不同文、車不同軌、世界不大同!"));          
}

稍微說明一下我的測試心得。

首先,就是使用 Google Translate 時,最好是明確指定你所用的輸入編碼及輸出編碼,即上面 URL 連結中的 ie=UTF-8&oe=UTF-8。若不明確指定,Google 可是會依據你的輸入語言,而決定輸出編碼。例如,你輸入的語言是 "zh-CN",它預設會採用 gb2312 編碼回應。這會造成處理上的困擾。

其次,由於 .NET 與 Java 平台內建皆採用 UTF-8 編碼,因此在我們指定輸入編碼及輸出編碼時,當然是優先考量 UTF-8。

最後,如果你用 Eclipse 做測試,你可能會發現 console 裡有部分亂碼。請依照下圖,在 Run/Run Configurations... 裡面做設定,將 Console Encoding 指定為 UTF-8:

eclipse-console-utf8

最後就能產出正常的顯示了。

eclipse-console-utf8-2

2008/11/07

正妹牆螢幕保護程式

foxsaver-beauty1

辦公室前面擺了一個 40 幾吋的電漿螢幕,放置不用殊為可惜。與同事閒聊之際,突然靈機一動,何不拿來展示正妹牆,24 下時輪播,慰勞整天辛勞的宅男工程師。

有了這個想法,首先想到了就是要找個能播放 media rss 的螢幕保護程式。試了幾個,包括:

效果都出不來。決定拿 FoxSaver 一試 -- 嘿,別看太久,年輕人會流鼻血的。

FoxSaver 是 Firefox 的一個 Extension,可以把 Firefox 變成螢幕保護程式。從它的選項來看,圖片來源可以來自本機目錄,RSS 或一般網頁。由於這個 Extension 還在實驗中,在 addons.mozilla.org 網站上需要登入才能安裝。我在安裝之後,使用上是沒有大問題。重點來了,怎麼設定 FoxSaver 讀取正妹牆 RSS 呢。一圖勝千言,請見右圖 。

如此之後,在 Firefox 狀態列上的 FoxSaver 按鈕上點右鍵,選擇「FoxSaver 開始」就行了。

當然,也有人推薦用 PicLens/Cooliris 來觀正妹牆,除了可以自己操刀,將正妹們拉遠拉近觀看外(是不是第一次感受到那種呼之即來,揮之即去的操作感 >_<|||),要透過 Cooliris 來達到類似螢幕保護程式的效果,記得按一下三角型的播放鈕,這 -- 不就變成美女自動送上門的桌上版了嗎。