1. 程式人生 > >android 呼叫百度翻譯API 實現線上翻譯

android 呼叫百度翻譯API 實現線上翻譯

內容概要

本篇文章為大家演示如何在微信公眾帳號上實現“智慧翻譯”,本例中翻譯功能是通過呼叫“百度翻譯API”實現的。智慧翻譯是指使用者任意輸入想要翻譯的內容(單詞或句子),系統能自動識別使用者採用的語言,並將其翻譯為其他語言,目前支援的翻譯方向:中->英、英->中和日->中。下面我們來看看智慧翻譯最終做出來的效果:

    

我們通過輸入關鍵詞“翻譯”或者點選選單“翻譯”能夠看到該功能的使用幫助,然後輸入“翻譯+內容”就能對內容進行翻譯了。

百度翻譯API介紹

點選檢視百度翻譯API使用說明,其實這份文件已經說的很詳細了,筆者只是將我們呼叫該介面時最關心的內容摘取出來,主要如下:

1)通過傳送HTTP GET請求呼叫百度翻譯API。

2)百度翻譯API請求地址:

3)呼叫API需要傳遞from、to、client_id和q四個引數,描述如下:

key value 描述
from 源語言語種:語言程式碼或auto 僅支援特定的語言組合,下面會單獨進行說明
to 目標語言語種:語言程式碼或auto 僅支援特定的語言組合,下面會單獨進行說明
client_id 開發者在百度連線平臺上註冊得到的授權API key
q 待翻譯內容 該欄位必須為UTF-8編碼,並且以GET方式呼叫API時,需要進行urlencode編碼。

在呼叫介面前,我們要先獲取到api key。獲取方式比較簡單,根據提示一步步操作就可以,筆者就不再贅述了。4)對於智慧翻譯,引數from和to的傳都是auto。 4)引數q的編碼方式為UTF-8,傳遞之前要進行urlencode編碼。

5)介面返回結果示例如下:

{"from":"en","to":"zh","trans_result":[{"src":"today","dst":"\u4eca\u5929"}]}

返回結果裡的中文是unicode編碼,需要通過json_decode進行轉換,轉換後的示例如下:

{
    "from": "en",
    "to": "zh",
    "trans_result": [
        {
            "src": "today",
            "dst": "今天"
        },
        {
            "src": "tomorrow",
            "dst": "明天"
        }
    ]
}

JSON處理工具包Gson介紹

Gson是Google提供的用於在Java物件和JSON資料之間進行轉換的Java類庫。通過使用Gson類庫,我們可以將JSON字串轉成Java物件,反之亦然。下載地址:https://code.google.com/p/google-gson/downloads/list,Gson的使用比較簡單,直接呼叫它的方法toJson()或fromJson()就能完成相應的轉換,但需要注意的是:在使用Gson將json字串轉換成Java物件之前,需要先建立好與目標Java物件。讀者可以在維基百科上學習它的使用示例http://zh.wikipedia.org/wiki/Gson

程式碼實現

1)建立與百度翻譯API返回的JSON相對應的Java類

import java.util.List;  

  

/** 

 * 呼叫百度翻譯api查詢結果 

 *  

 * @author liufeng 

 * @date 2013-10-21 

 */  

public class TranslateResult {  

    // 實際採用的源語言  

    private String from;  

    // 實際採用的目標語言  

    private String to;  

    // 結果體  

    private List<ResultPair> trans_result;  

  

    public String getFrom() {  

        return from;  

    }  

  

    public void setFrom(String from) {  

        this.from = from;  

    }  

  

    public String getTo() {  

        return to;  

    }  

  

    public void setTo(String to) {  

        this.to = to;  

    }  

  

    public List<ResultPair> getTrans_result() {  

        return trans_result;  

    }  

  

    public void setTrans_result(List<ResultPair> trans_result) {  

        this.trans_result = trans_result;  

    }  

}  

注意:這裡的類名可以任意取,但是成員變數的名字應於翻譯API返回的JSON字串中的屬性名保持一致,否則將JSON轉換成TranslateResult物件時會報錯。

TranslateResult類中的trans_result屬性是一個ResultPair集合,該類的程式碼如下:


/** 

 * 結果對 

 *  

 * @author liufeng 

 * @date 2013-10-21 

 */  

public class ResultPair {  

    // 原文  

    private String src;  

    // 譯文  

    private String dst;  

  

    public String getSrc() {  

        return src;  

    }  

  

    public void setSrc(String src) {  

        this.src = src;  

    }  

  

    public String getDst() {  

        return dst;  

    }  

  

    public void setDst(String dst) {  

        this.dst = dst;  

    }  

}  

說明:這兩個類的封裝是Gson類庫所要求的,如果讀者不是用Gson解析json字串,而是用JSON-lib,就沒有必要封裝這兩個類。

2)介面呼叫 

import java.io.BufferedReader;  

import java.io.InputStream;  

import java.io.InputStreamReader;  

import java.io.UnsupportedEncodingException;  

import java.net.HttpURLConnection;  

import java.net.URL;  

import com.google.gson.Gson;  

  

/** 

 *  

 * @author liufeng 

 * @date 2013-10-21 

 */  

public class BaiduTranslateService {  

    /** 

     * 發起http請求獲取返回結果 

     *  

     * @param requestUrl 請求地址 

     * @return 

     */  

    public static String httpRequest(String requestUrl) {  

        StringBuffer buffer = new StringBuffer();  

        try {  

            URL url = new URL(requestUrl);  

            HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();  

  

            httpUrlConn.setDoOutput(false);  

            httpUrlConn.setDoInput(true);  

            httpUrlConn.setUseCaches(false);  

  

            httpUrlConn.setRequestMethod("GET");  

            httpUrlConn.connect();  

  

            // 將返回的輸入流轉換成字串  

            InputStream inputStream = httpUrlConn.getInputStream();  

            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  

            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  

  

            String str = null;  

            while ((str = bufferedReader.readLine()) != null) {  

                buffer.append(str);  

            }  

            bufferedReader.close();  

            inputStreamReader.close();  

            // 釋放資源  

            inputStream.close();  

            inputStream = null;  

            httpUrlConn.disconnect();  

  

        } catch (Exception e) {  

        }  

        return buffer.toString();  

    }  

  

    /** 

     * utf編碼 

     *  

     * @param source 

     * @return 

     */  

    public static String urlEncodeUTF8(String source) {  

        String result = source;  

        try {  

            result = java.net.URLEncoder.encode(source, "utf-8");  

        } catch (UnsupportedEncodingException e) {  

            e.printStackTrace();  

        }  

        return result;  

    }  

  

    /** 

     * 翻譯(中->英 英->中 日->中 ) 

     *  

     * @param source 

     * @return 

     */  

    public static String translate(String source) {  

        String dst = null;  

  

        // 組裝查詢地址  

        String requestUrl = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=AAAAAAAAAAAAAAAAAAAAAAAA&q={keyWord}&from=auto&to=auto";  

        // 對引數q的值進行urlEncode utf-8編碼  

        requestUrl = requestUrl.replace("{keyWord}", urlEncodeUTF8(source));  

  

        // 查詢並解析結果  

        try {  

            // 查詢並獲取返回結果  

            String json = httpRequest(requestUrl);  

            // 通過Gson工具將json轉換成TranslateResult物件  

            TranslateResult translateResult = new Gson().fromJson(json, TranslateResult.class);  

            // 取出translateResult中的譯文  

            dst = translateResult.getTrans_result().get(0).getDst();  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

  

        if (null == dst)  

            dst = "翻譯系統異常,請稍候嘗試!";  

        return dst;  

    }  

  

    public static void main(String[] args) {  

        // 翻譯結果:The network really powerful  

        System.out.println(translate("網路真強大"));  

    }  

}  

程式碼解讀: 1)第21-53行封裝了一個http請求方法httpRequest(),相信讀過之前教程的讀者已經很熟悉了。

2)第61-69行封裝了一個urlEncodeUTF8()方法,用於對url中的引數進行UTF-8編碼。

3)第81行程式碼中的client_id需要替換成自己申請的api key。

4)第83行程式碼是對url中的中文進行編碼。以後凡是遇到通過url傳遞中文引數的情況,一定要顯示地對中文進行編碼,否則很可能出現程式在本機能正常執行,但部署到伺服器上卻有問題,因為本機與伺服器的預設編碼方式可能不一樣。

5)第88行程式碼就是呼叫百度翻譯API。

6)第90行程式碼是使用Gson工具將json字串轉換成TranslateResult物件,是不是發現Gson的使用真的很簡單?另外,前面提到過呼叫百度翻譯API返回的json裡如果有中文是用unicode表示的,形如“\u4eca\u5929”,那為什麼這裡沒有做任何處理?因為Gson的內部實現已經幫我們搞定了。

公眾賬號後臺呼叫

在公眾賬號後臺,需要對接收到的文字訊息進行判斷,如果是以“翻譯”兩個字開頭的,就認為是在使用智慧翻譯功能,然後將“翻譯”兩個字之後的內容作為翻譯物件,呼叫API進行翻譯;如果輸入的只有“翻譯”兩個字,就提示智慧翻譯功能的使用指南。關鍵程式碼如下:

// 文字訊息   

if (WeixinUtil.REQ_MESSAGE_TYPE_TEXT.equals(msgType)) {  

    String content = requestMap.get("Content").trim();  

    if (content.startsWith("翻譯")) {  

        String keyWord = content.replaceAll("^翻譯", "").trim();  

        if ("".equals(keyWord)) {  

            textMessage.setContent(getTranslateUsage());  

        } else {  

            textMessage.setContent(BaiduTranslateService.translate(keyWord));  

        }  

        out.print(WeixinUtil.textMessageToXml(textMessage));  

    }  

}  

第7行getTranslateUsage()方法得到的就是智慧翻譯功能的使用指南,程式碼如下:

/** 

 * Q譯通使用指南 

 *  

 * @return 

 */  

public static String getTranslateUsage() {  

    StringBuffer buffer = new StringBuffer();  

    buffer.append(XiaoqUtil.emoji(0xe148)).append("Q譯通使用指南").append("\n\n");  

    buffer.append("Q譯通為使用者提供專業的多語言翻譯服務,目前支援以下翻譯方向:").append("\n");  

    buffer.append("    中 -> 英").append("\n");  

    buffer.append("    英 -> 中").append("\n");  

    buffer.append("    日 -> 中").append("\n\n");  

    buffer.append("使用示例:").append("\n");  

    buffer.append("    翻譯我是中國人").append("\n");  

    buffer.append("    翻譯dream").append("\n");  

    buffer.append("    翻譯さようなら").append("\n\n");  

    buffer.append("回覆“?”顯示主選單");  

    return buffer.toString();  

}  

說明:希望通過本例的學習,除了掌握百度翻譯API的呼叫之外,讀者還能夠掌握json字串的解析方法,這樣就能夠自己學會呼叫更多網際網路上開放的介面。