調用有道詞典翻譯api


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM