自己英語不咋好,然后公司文檔看不懂,word格式的還好,直接復制粘貼到google就ok了,可是excel文檔都是一個單元格一個單元格的,一個一個復制太慢了,所以就想到了用代碼調用api來實現翻譯。
找度娘發現google的翻譯api已經開始收費了,十分滴沮喪,找了半天發現有道詞典還是免費的,欣喜!!不管好不好用,能用就行:
首先要有操作獲取的接受數據的json jar包
1.創建連接的 TranslaterAPIConnection:
1 package org.lewe.lang.translate.connection; 2 3 import java.io.IOException; 4 import java.net.HttpURLConnection; 5 import java.net.InetSocketAddress; 6 import java.net.MalformedURLException; 7 import java.net.Proxy; 8 import java.net.URL; 9 10 import org.lewe.util.StringUtils; 11 12 public class TranslaterAPIConnection { 13 14 public static HttpURLConnection getHttpConnection(String urlString) { 15 return getHttpConnection(urlString, "", 0); 16 } 17 18 public static HttpURLConnection getHttpConnection(String urlString, 19 String proxyAddress, int proxyport) { 20 21 HttpURLConnection con = null; 22 23 try { 24 if (!StringUtils.isNullOrEmpty(proxyAddress) && proxyport != -1) { 25 26 InetSocketAddress addr = new InetSocketAddress(proxyAddress, 27 proxyport); 28 29 // Socket 代理 30 // Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); 31 // http 代理 32 Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); 33 34 con = (HttpURLConnection) new URL(urlString) 35 .openConnection(proxy); 36 37 } else { 38 con = (HttpURLConnection) new URL(urlString).openConnection(); 39 } 40 41 } catch (MalformedURLException e) { 42 // TODO Auto-generated catch block 43 e.printStackTrace(); 44 } catch (IOException e) { 45 // TODO Auto-generated catch block 46 e.printStackTrace(); 47 } 48 49 return con; 50 51 } 52 53 public static boolean closeHttpConnection(HttpURLConnection con) { 54 try { 55 con.getInputStream().close(); 56 return true; 57 } catch (IOException e) { 58 // TODO Auto-generated catch block 59 e.printStackTrace(); 60 } 61 return false; 62 } 63 }
2.創建翻譯器接口ITranslater和實現類YoudaoTranslater
1 package org.lewe.lang.translate; 2 3 public interface ITranslater { 4 public String translate(String text); 5 }
package org.lewe.lang.translate.impl; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URLEncoder; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.lewe.lang.translate.ITranslater; import org.lewe.lang.translate.connection.TranslaterAPIConnection; import org.lewe.util.CommonConstants; public class YoudaoTranslater implements ITranslater { /** * 有道數據接口 版本:1.1,請求方式:get,編碼方式:utf-8 主要功能:中英互譯,同時獲得有道翻譯結果和有道詞典結果(可能沒有) 參數說明: * type - 返回結果的類型,固定為data doctype - 返回結果的數據格式,xml或json或jsonp version - * 版本,當前最新版本為1.1 q - 要翻譯的文本,不能超過200個字符,需要使用utf-8編碼 errorCode:0 - 正常 20 - * 要翻譯的文本過長 30 - 無法進行有效的翻譯 40 - 不支持的語言類型 50 - 無效的key */ public final static String URL_STRING = "http://fanyi.youdao.com/openapi.do?keyfrom=lewe518&key=70654389&type=data&doctype=json&version=1.1&q="; /** * 如果使用代理,可以定義代理地址 */ public final static String proxyAddress = ""; /** * 如果使用代理,可以定義代理端口 */ public final static int proxyport = -1; public String translate(String text) { System.out.println("目標文字 : " + text); String jsonStr = ""; HttpURLConnection httpURLConnection = null; String YoudaoAPIURL = getAdressUrl(text); httpURLConnection = TranslaterAPIConnection.getHttpConnection( YoudaoAPIURL, proxyAddress, proxyport); // 讀取返回流數據 try { BufferedReader br = new BufferedReader(new InputStreamReader( httpURLConnection.getInputStream(), CommonConstants.DEFAULT_ENCODING)); StringBuilder sb = new StringBuilder(); String str; while ((str = br.readLine()) != null) { sb.append(str); sb.append('\n'); } jsonStr = sb.toString(); } catch (Exception e) { System.err.println("讀取流數據異常"); } finally { TranslaterAPIConnection.closeHttpConnection(httpURLConnection); } // 解析返回的Json數據 JSONObject jsonObj = null; try { jsonObj = (JSONObject) new JSONParser().parse(jsonStr); if ("0".equals(jsonObj.get("errorCode").toString())) { jsonStr = jsonObj.get("translation").toString(); } } catch (Exception e) { // TODO Auto-generated catch block System.err.println(e.getMessage()); } System.out.println("結果: " + jsonStr); return jsonStr; } private static String getAdressUrl(String text) { StringBuilder YoudaoAPIURL = new StringBuilder(); try { YoudaoAPIURL.append(URL_STRING).append( URLEncoder.encode(text, CommonConstants.DEFAULT_ENCODING)); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return YoudaoAPIURL.toString(); } }
然后可以測試一下,只要調用translate方法,傳入想翻譯的詞,就可以實現自動翻譯,目前該有道詞典的api不支持定制翻譯,不能指定翻譯的目標和結果語言,只能自動轉換,如果是英文的就翻譯成中文的,如果是中文則翻譯成英文。
期待有道詞典支持定制翻譯!
3.操作excel文檔的就省略了,不是本文的重點,主函數調用代碼如下:
1 public class Main { 2 3 /** 4 * @param args 5 * @throws Exception 6 */ 7 public static void main(String[] args) throws Exception { 8 translateExcel(); 9 } 10 11 /** 12 * Translate an Excel document to Chinese 13 */ 14 public static void translateExcel() throws Exception { 15 16 POIExcelHandler handler = new POIExcelHandler(new YoudaoTranslater()); 17 18 // Copy the excel document 19 FileUtils.copyExcel("D:\\1.xls", "D:\\2.xls"); 20 21 // Translate 22 handler.translateExcel("D:\\2.xls"); 23 } 24 }
首先把要翻譯的excel文件copy出來一個,然后進行翻譯,大功告成,很easy吧!