摘要:本文将带你了解微信公众帐号开发之应用实例智能翻译,希望本文对大家学微信有所帮助。
内容概要
本篇文章为大家演示如何在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译API”实现的。智能翻译是指用户任意输入想要翻译的内容(单词或句子),系统能自动识别用户采用的语言,并将其翻译为其他语言,目前支持的翻译方向:中->英、英->中和日->中。下面我们来看看智能翻译最终做出来的效果:
我们通过输入关键词“翻译”或者点击菜单“翻译”能够看到该功能的使用帮助,然后输入“翻译+内容”就能对内容进行翻译了。
百度翻译API介绍
点击查看百度翻译API使用说明,其实这份文档已经说的很详细了,笔者只是将我们调用该接口时最关心的内容摘取出来,主要如下:
1)通过发送HTTP GET请求调用百度翻译API。
2)百度翻译API请求地址:
//openapi.baidu.com/public/2.0/bmt/translate
3)调用API需要传递from、to、client_id和q四个参数,描述如下:
在调用接口前,我们要先获取到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对象。读者可以在维基百科上学习它的使用示例//zh.wikipedia.org/wiki/Gson。
代码实现
1)创建与百度翻译API返回的JSON相对应的Java类
[java] view plain copy 1. import java.util.List; 2. 3. /** 4. * 调用百度翻译api查询结果 5. * 6. * @author liufeng 7. * @date 2013-10-21 8. */ 9. public class TranslateResult { 10. // 实际采用的源语言 11. private String from; 12. // 实际采用的目标语言 13. private String to; 14. // 结果体 15. private List<ResultPair> trans_result; 16. 17. public String getFrom() { 18. return from; 19. } 20. 21. public void setFrom(String from) { 22. this.from = from; 23. } 24. 25. public String getTo() { 26. return to; 27. } 28. 29. public void setTo(String to) { 30. this.to = to; 31. } 32. 33. public List<ResultPair> getTrans_result() { 34. return trans_result; 35. } 36. 37. public void setTrans_result(List<ResultPair> trans_result) { 38. this.trans_result = trans_result; 39. } 40. }
注意:这里的类名可以任意取,但是成员变量的名字应于翻译API返回的JSON字符串中的属性名保持一致,否则将JSON转换成TranslateResult对象时会报错。
TranslateResult类中的trans_result属性是一个ResultPair集合,该类的代码如下:
[java] view plain copy 1. /** 2. * 结果对 3. * 4. * @author liufeng 5. * @date 2013-10-21 6. */ 7. public class ResultPair { 8. // 原文 9. private String src; 10. // 译文 11. private String dst; 12. 13. public String getSrc() { 14. return src; 15. } 16. 17. public void setSrc(String src) { 18. this.src = src; 19. } 20. 21. public String getDst() { 22. return dst; 23. } 24. 25. public void setDst(String dst) { 26. this.dst = dst; 27. } 28. } 说明:这两个类的封装是Gson类库所要求的,如果读者不是用Gson解析json字符串,而是用JSON-lib,就没有必要封装这两个类。 2)接口调用 [java] view plain copy 1. import java.io.BufferedReader; 2. import java.io.InputStream; 3. import java.io.InputStreamReader; 4. import java.io.UnsupportedEncodingException; 5. import java.net.HttpURLConnection; 6. import java.net.URL; 7. import com.google.gson.Gson; 8. 9. /** 10. * 11. * @author liufeng 12. * @date 2013-10-21 13. */ 14. public class BaiduTranslateService { 15. /** 16. * 发起http请求获取返回结果 17. * 18. * @param requestUrl 请求地址 19. * @return 20. */ 21. public static String httpRequest(String requestUrl) { 22. StringBuffer buffer = new StringBuffer(); 23. try { 24. URL url = new URL(requestUrl); 25. HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection(); 26. 27. httpUrlConn.setDoOutput(false); 28. httpUrlConn.setDoInput(true); 29. httpUrlConn.setUseCaches(false); 30. 31. httpUrlConn.setRequestMethod("GET"); 32. httpUrlConn.connect(); 33. 34. // 将返回的输入流转换成字符串 35. InputStream inputStream = httpUrlConn.getInputStream(); 36. InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 37. BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 38. 39. String str = null; 40. while ((str = bufferedReader.readLine()) != null) { 41. buffer.append(str); 42. } 43. bufferedReader.close(); 44. inputStreamReader.close(); 45. // 释放资源 46. inputStream.close(); 47. inputStream = null; 48. httpUrlConn.disconnect(); 49. 50. } catch (Exception e) { 51. } 52. return buffer.toString(); 53. } 54. 55. /** 56. * utf编码 57. * 58. * @param source 59. * @return 60. */ 61. public static String urlEncodeUTF8(String source) { 62. String result = source; 63. try { 64. result = java.net.URLEncoder.encode(source, "utf-8"); 65. } catch (UnsupportedEncodingException e) { 66. e.printStackTrace(); 67. } 68. return result; 69. } 70. 71. /** 72. * 翻译(中->英 英->中 日->中 ) 73. * 74. * @param source 75. * @return 76. */ 77. public static String translate(String source) { 78. String dst = null; 79. 80. // 组装查询地址 81. String requestUrl = "//openapi.baidu.com/public/2.0/bmt/translate?client_id=AAAAAAAAAAAAAAAAAAAAAAAA&q={keyWord}&from=auto&to=auto"; 82. // 对参数q的值进行urlEncode utf-8编码 83. requestUrl = requestUrl.replace("{keyWord}", urlEncodeUTF8(source)); 84. 85. // 查询并解析结果 86. try { 87. // 查询并获取返回结果 88. String json = httpRequest(requestUrl); 89. // 通过Gson工具将json转换成TranslateResult对象 90. TranslateResult translateResult = new Gson().fromJson(json, TranslateResult.class); 91. // 取出translateResult中的译文 92. dst = translateResult.getTrans_result().get(0).getDst(); 93. } catch (Exception e) { 94. e.printStackTrace(); 95. } 96. 97. if (null == dst) 98. dst = "翻译系统异常,请稍候尝试!"; 99. return dst; 100. } 101. 102. public static void main(String[] args) { 103. // 翻译结果:The network really powerful 104. System.out.println(translate("网络真强大")); 105. } 106. }
代码解读:
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 plain copy 1. // 文本消息 2. if (WeixinUtil.REQ_MESSAGE_TYPE_TEXT.equals(msgType)) { 3. String content = requestMap.get("Content").trim(); 4. if (content.startsWith("翻译")) { 5. String keyWord = content.replaceAll("^翻译", "").trim(); 6. if ("".equals(keyWord)) { 7. textMessage.setContent(getTranslateUsage()); 8. } else { 9. textMessage.setContent(BaiduTranslateService.translate(keyWord)); 10. } 11. out.print(WeixinUtil.textMessageToXml(textMessage)); 12. } 13. } 第7行getTranslateUsage()方法得到的就是智能翻译功能的使用指南,代码如下: [java] view plain copy 1. /** 2. * Q译通使用指南 3. * 4. * @return 5. */ 6. public static String getTranslateUsage() { 7. StringBuffer buffer = new StringBuffer(); 8. buffer.append(XiaoqUtil.emoji(0xe148)).append("Q译通使用指南").append("\n\n"); 9. buffer.append("Q译通为用户提供专业的多语言翻译服务,目前支持以下翻译方向:").append("\n"); 10. buffer.append(" 中 -> 英").append("\n"); 11. buffer.append(" 英 -> 中").append("\n"); 12. buffer.append(" 日 -> 中").append("\n\n"); 13. buffer.append("使用示例:").append("\n"); 14. buffer.append(" 翻译我是中国人").append("\n"); 15. buffer.append(" 翻译dream").append("\n"); 16. buffer.append(" 翻译さようなら").append("\n\n"); 17. buffer.append("回复“?”显示主菜单"); 18. return buffer.toString(); 19. }
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之微信频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号