自己英语不咋好,然后公司文档看不懂,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 block43 e.printStackTrace();44 } catch (IOException e) {45 // TODO Auto-generated catch block46 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 block59 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 Chinese13 */14 public static void translateExcel() throws Exception {15 16 POIExcelHandler handler = new POIExcelHandler(new YoudaoTranslater());17 18 // Copy the excel document19 FileUtils.copyExcel("D:\\1.xls", "D:\\2.xls");20 21 // Translate22 handler.translateExcel("D:\\2.xls");23 }24 }
首先把要翻译的excel文件copy出来一个,然后进行翻译,大功告成,很easy吧!