有時候在公衆號中須要對接一些翻譯的功能或者其餘。最多見的翻譯API就是中英互譯,程序員用的最多的也就是中譯英。java
http://api.fanyi.baidu.com/api/trans/product/desktop程序員
登陸以後就選擇須要開通的服務。到http://api.fanyi.baidu.com/api/trans/product/apichoose 頁面能夠選擇開通的服務。好比我已開通的服務:apache
開通的時候能夠選擇版本,對於我我的用戶來講開通一個標準版就能夠了,標準版享有的權限爲: 可不限調用字符量無償使用(QPS爲1,Queries-per-second 也就是每秒鐘1次)。json
也能夠到管理控制檯查看本身開通的服務以及版本,最關心的就是版本。標準版是免費的。c#
http://api.fanyi.baidu.com/api/trans/product/apidoc#joinFileapi
官方例子的入口類以下:服務器
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,須要兩個參數就能夠接口調用。微信
更換上面兩個參數以後測試結果以下:app
{"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 | 越南語 |
修改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; }
微信測試結果以下: