1)通过发送HTTP GET请求调用百度翻译API。
2)百度翻译API请求地址:
http://openapi.baidu.com/public/2.0/bmt/translate
3)调用API需要传递from、to、client_id和q四个参数,描述如下:
key value 描述
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": "明天"
}
]
}
[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("网络真强大"));
}
}
[java] view plaincopy说明:希望通过本例的学习,除了掌握百度翻译API的调用之外,读者还能够掌握json字符串的解析方法,这样就能够自己学会调用更多互联网上开放的接口。
// 文本消息
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();
}