自己英语不咋好,然后公司文档看不懂,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吧!