有时候在公众号中需要对接一些翻译的功能或者其他。最常见的翻译API就是中英互译,程序员用的最多的也就是中译英。
1.到百度翻译官网申请账号
http://api.fanyi.baidu.com/api/trans/product/desktop
登录之后就选择需要开通的服务。到http://api.fanyi.baidu.com/api/trans/product/apichoose 页面可以选择开通的服务。比如我已开通的服务:
开通的时候可以选择版本,对于我个人用户来说开通一个标准版就可以了,标准版享有的权限为: 可不限调用字符量免费使用(QPS为1,Queries-per-second 也就是每秒钟1次)。
也可以到管理控制台查看自己开通的服务以及版本,最关心的就是版本。标准版是免费的。
2. 接下来以官方的例子运行即可
http://api.fanyi.baidu.com/api/trans/product/apidoc#joinFile
官方例子的入口类如下:
package cn.qlq.utils.baidutranslate; public class Main { // 在平台申请的APP_ID 详见 // http://api.fanyi.baidu.com/api/trans/product/desktop?req=developer private static final String APP_ID = ""; private static final String SECURITY_KEY = ""; public static void main(String[] args) { TransApi api = new TransApi(APP_ID, SECURITY_KEY); String query = "you are my son!"; System.out.println(api.getTransResult(query, "auto", "auto")); } }
注释也说了从网站可以获取自己的APP_ID和SECURITY_KEY,需要两个参数就可以接口调用。
更换上面两个参数之后测试结果如下:
{"from":"en","to":"zh","trans_result":[{"src":"you are my son!","dst":"\u4f60\u662f\u6211\u7684\u513f\u5b50\uff01"}]}
文档对接口的解释如下:(经过自己测试from和to都可以设为auto,默认是中英或英中互译)
输入参数:
字段名 | 类型 | 必填参数 | 描述 | 备注 |
---|---|---|---|---|
q | TEXT | Y | 请求翻译query | UTF-8编码 |
from | TEXT | Y | 翻译源语言 | 语言列表(可设置为auto) |
to | TEXT | Y | 译文语言 | 语言列表(不可设置为auto) |
appid | TEXT | Y | APP ID | 可在管理控制台查看 |
salt | TEXT | Y | 随机数 | |
sign | TEXT | Y | 签名 | appid+q+salt+密钥 的MD5值 |
以下字段仅开通了词典、TTS者需填写 | ||||
tts | STRING | N | 是否显示语音合成资源 | tts=0显示,tts=1不显示 |
dict | STRING | N | 是否显示词典资源 | dict=0显示,dict=1不显示 |
返回结果是JSON格式 的数据,参数如下:
字段名 | 类型 | 描述 | 备注 |
---|---|---|---|
from | TEXT | 翻译源语言 | 返回用户指定的语言,或自动检测的语言(源语言设为auto时) |
to | TEXT | 译文语言 | 返回用户指定的目标语言 |
trans_result | MIXED LIST | 翻译结果 | 返回翻译结果,包含src 和 dst 字段。 |
src | TEXT | 原文 | |
dst | TEXT | 译文 | |
error_code | Int32 | 错误码 | 仅当出现错误时显示 |
以下字段仅开通词典、TTS资源者可见 | |||
src_tts | 原文tts | mp3格式,暂时无法指定发音 | |
dst_tts | 译文tts | mp3格式,暂时无法指定发音 | |
dict | 中英词典资源 | 返回中文或英文词典资源,包含音标、简明释义等内容 |
支持的语言列表如下:
源语言语种不确定时可设置为 auto,目标语言语种不可设置为auto。但对于非常用语种,语种自动检测可能存在误差。
语言简写 | 名称 |
---|---|
auto | 自动检测 |
zh | 中文 |
en | 英语 |
yue | 粤语 |
wyw | 文言文 |
jp | 日语 |
kor | 韩语 |
fra | 法语 |
spa | 西班牙语 |
th | 泰语 |
ara | 阿拉伯语 |
ru | 俄语 |
pt | 葡萄牙语 |
de | 德语 |
it | 意大利语 |
el | 希腊语 |
nl | 荷兰语 |
pl | 波兰语 |
bul | 保加利亚语 |
est | 爱沙尼亚语 |
dan | 丹麦语 |
fin | 芬兰语 |
cs | 捷克语 |
rom | 罗马尼亚语 |
slo | 斯洛文尼亚语 |
swe | 瑞典语 |
hu | 匈牙利语 |
cht | 繁体中文 |
vie | 越南语 |
3. 接下来编写为工具类对接微信公众号
修改TransApi类为翻译的入口类,静态方法提供翻译
package cn.qlq.utils.baidutranslate; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONObject; public class TransApi { private static final String TRANS_API_HOST = "http://api.fanyi.baidu.com/api/trans/vip/translate"; // 在平台申请的APP_ID 详见 // http://api.fanyi.baidu.com/api/trans/product/desktop?req=developer private static final String APP_ID = "yourId"; private static final String SECURITY_KEY = "yourKey"; public static String translate(String keyWords) { return translate(keyWords, "auto", "auto"); } public static String translate(String keyWords, String from, String to) { String transResult = getTransResult(keyWords, from, to); if (StringUtils.isBlank(transResult)) { return ""; } JSONObject parseObject = JSONObject.parseObject(transResult); if (parseObject != null && parseObject.containsKey("trans_result") && parseObject.get("trans_result") != null) { return parseObject.get("trans_result").toString(); } return ""; } private static String getTransResult(String query, String from, String to) { Map<String, String> params = buildParams(query, from, to); return HttpGet.get(TRANS_API_HOST, params); } private static Map<String, String> buildParams(String query, String from, String to) { Map<String, String> params = new HashMap<String, String>(); params.put("q", query); params.put("from", from); params.put("to", to); params.put("appid", APP_ID); // 随机数 String salt = String.valueOf(System.currentTimeMillis()); params.put("salt", salt); // 签名 String src = APP_ID + query + salt + SECURITY_KEY; // 加密前的原文 params.put("sign", MD5.md5(src)); return params; } }
修改公众号处理文字消息处理翻译信息:修改前面MessageHandler的处理文字消息的方法,如下:(如果接受到的消息是以翻译开始就代表是想翻译句子,将开头的翻译替换掉之后进行翻译)
/** * 处理文本消息 * * @param message * @return */ private static AbstractResponseMessage handleTextMessage(Map<String, Object> message) { TextMessage textMessage = BeanUtils.map2Bean(message, TextMessage.class, true); String content = textMessage.getContent(); // 可以根据文本消息去查库或者进行其他操作 if (StringUtils.isNotBlank(content)) { System.out.println("您接收到的文本消息内容为: " + content); } // 设置回传的消息内容 TextResponseMessage responseMessage = new TextResponseMessage(); responseMessage.setContent("服务器已接收到您的消息,内容为: " + content); responseMessage.setCreateTime(new Date().getTime()); responseMessage.setFromUserName(textMessage.getToUserName()); responseMessage.setToUserName(textMessage.getFromUserName()); responseMessage.setMsgType(MESSAGE_TEXT); // 如果文字消息以翻译开头调用百度API翻译 if (StringUtils.startsWith(content, "翻译")) { String translateResult = TransApi.translate(content.replaceAll("^翻译", "")); translateResult = StringUtils.defaultIfBlank(translateResult, "未正确翻译"); responseMessage.setContent(translateResult); } return responseMessage; }
微信测试结果如下: