调用有道词典翻译api

时间:2024-04-16 20:03:57

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