您的位置:首页 > 移动开发 > 微信开发

[041] 微信公众帐号开发教程第17篇-应用实例之智能翻译

2015-06-09 12:53 661 查看
内容概要

本篇文章为大家演示如何在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译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编码。
在调用接口前,我们要先获取到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类

[java] view
plaincopy

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集合,该类的代码如下:

[java] view
plaincopy

/**

* 结果对

*

* @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)接口调用

[java] view
plaincopy

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进行翻译;如果输入的只有“翻译”两个字,就提示智能翻译功能的使用指南。关键代码如下:

[java] view
plaincopy

// 文本消息

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()方法得到的就是智能翻译功能的使用指南,代码如下:

[java] view
plaincopy

/**

* 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字符串的解析方法,这样就能够自己学会调用更多互联网上开放的接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: