之前為了將系統的多語化,其中一個議題就是要產生各種語系的訊息資源檔。繁簡中文的對譯,只要透過 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:
最後就能產出正常的顯示了。