Android 调用百度翻译API 实现在线翻译

目录

内容概要

百度翻译API介绍

JSON处理工具包Gson介绍

代码实现

公众账号后台调用


内容概要

本篇文章为大家演示如何在微信公众帐号上实现 “智能翻译”,本例中翻译功能是通过调用 “百度翻译API” 实现的。智能翻译是指用户任意输入想要翻译的内容(单词或句子),系统能自动识别用户采用的语言,并将其翻译为其他语言,目前支持的翻译方向:中 → 英、英 → 中、日 →中。下面我们来看看智能翻译最终做出来的效果:

    

我们通过输入关键词 “翻译” 或者点击菜单 “翻译” 能够看到该功能的使用帮助,然后输入“翻译+内容” 就能对内容进行翻译了。

百度翻译API介绍

点击查看百度翻译API使用说明,其实这份文档已经说的很详细了,笔者只是将我们调用该接口时最关心的内容摘取出来,主要如下:

1. 通过发送HTTP GET请求调用百度翻译API。

2. 百度翻译API请求地址 : http://openapi.baidu.com/public/2.0/bmt/translate。

3. 调用API需要传递from、to、client_id和q四个参数,描述如下:

keyvalue描述
from源语言语种:语言代码或auto仅支持特定的语言组合,下面会单独进行说明
to目标语言语种:语言代码或auto仅支持特定的语言组合,下面会单独进行说明
client_id开发者在百度连接平台上注册得到的授权API key请阅读如何获取api key
q待翻译内容该字段必须为UTF-8编码,并且以GET方式调用API时,需要进行urlencode编码。

3. 对于智能翻译,参数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查询结果 
 */  
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;  
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. 封装了一个http请求方法httpRequest()。

2. 封装了一个urlEncodeUTF8()方法,用于对url中的参数进行UTF-8编码。

3. client_id需要替换成自己申请的api key。

4. 对url中的中文进行编码。以后凡是遇到通过url传递中文参数的情况,一定要显示地对中文进行编码,否则很可能出现程序在本机能正常运行,但部署到服务器上却有问题,因为本机与服务器的默认编码方式可能不一样。

5. 使用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));  
    }  
}  

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字符串的解析方法,这样就能够自己学会调用更多互联网上开放的接口。

 

当然,我可以帮你提供一个使用百度翻译 APIAndroid 代码示例。在使用之前,请确保已经申请到了百度翻译 API 的密钥。 首先,在你的 Android 项目中,创建一个新的 Java 类,例如 `BaiduTranslateUtil`。然后在该类中添加以下代码: ```java import android.os.AsyncTask; import android.util.Log; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; public class BaiduTranslateUtil { private static final String API_URL = "https://fanyi-api.baidu.com/api/trans/vip/translate"; private static final String API_KEY = "YOUR_API_KEY"; private static final String API_SECRET = "YOUR_API_SECRET"; public interface TranslationCallback { void onTranslationComplete(String result); void onTranslationError(String errorMessage); } public static void translate(String text, String sourceLanguage, String targetLanguage, TranslationCallback callback) { String encodedText = URLEncoder.encode(text); String url = API_URL + "?q=" + encodedText + "&from=" + sourceLanguage + "&to=" + targetLanguage + "&appid=" + API_KEY + "&salt=123456&sign=" + generateSign(text); new TranslationTask(callback).execute(url); } private static String generateSign(String text) { String sign = API_KEY + text + "123456" + API_SECRET; sign = MD5Util.encode(sign); return sign; } private static class TranslationTask extends AsyncTask<String, Void, String> { private TranslationCallback callback; public TranslationTask(TranslationCallback callback) { this.callback = callback; } @Override protected String doInBackground(String... urls) { try { URL url = new URL(urls[0]); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); return response.toString(); } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(String result) { if (result != null) { Log.d("Translation", result); callback.onTranslationComplete(result); } else { callback.onTranslationError("Translation error occurred."); } } } } ``` 在上述代码中,你需要将 `YOUR_API_KEY` 和 `YOUR_API_SECRET` 替换为你在百度翻译 API 平台上申请到的密钥。 接下来,你可以在你的 Activity 或 Fragment 中使用 `BaiduTranslateUtil` 类的 `translate` 方法来调用百度翻译 API。例如: ```java BaiduTranslateUtil.translate("Hello world!", "en", "zh", new BaiduTranslateUtil.TranslationCallback() { @Override public void onTranslationComplete(String result) { // 处理翻译结果 } @Override public void onTranslationError(String errorMessage) { // 处理翻译错误 } }); ``` 这个示例代码会将英文的 "Hello world!" 翻译成中文。你可以根据自己的需求修改源语言和目标语言。 请注意,该示例代码仅提供了基本的使用方法,并未处理网络请求的线程问题。在实际开发中,你可能需要使用更合适的网络请求库来处理异步请求和错误处理。 希望这能帮到你!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值