内容概要

本篇文章为大家演示如何在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译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四个参数,描述如下:

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": "明天"}]
}

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类

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


/** * 结果对 *  * @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)接口调用 

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

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

/** * 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字符串的解析方法,这样就能够自己学会调用更多互联网上开放的接口。

注:本文为本人转发收藏学习使用,原文地址:https://blog.csdn.net/hh337/article/details/46425519

android 调用百度翻译API 实现在线翻译相关推荐

  1. android 调用百度地图规划,Android 调用百度地图API

    一.到 百度地图开发平台下载SDK 1.点击自定义下载 2.下载自己想要的功能包我这里选了三个 3.获取密钥 获取密钥之前我们要新建一个应用 填写好相关的信息 二. 新建一个项目工程 1. 把下载好的 ...

  2. 【新手】基于C++Qt5通过调用百度翻译API制作简易翻译工具

    基于C++Qt5通过调用百度翻译API制作简易翻译工具 目录 基于C++Qt5通过调用百度翻译API制作简易翻译工具 写在前面 步骤: 1.注册百度翻译开放平台账号并开通翻译服务 2.下载安装Qt5和 ...

  3. C#调用百度地图API入门解决BMap未定义问题

    本文主要是最近帮助好友研究JavaScript的百度地图API,同时显示到C# Winform界面.同时遇到了BMap未定义的错误(BMap is not defined)及解决方法.以前写过基于An ...

  4. 利用有道翻译Api实现英文翻译功能

    有道翻译提供了翻译和查词的数据接口.通过数据接口,您可以获得一段文本的翻译结果或者查词结果.       通过调用有道翻译API数据接口,您可以在您的网站或应用中更灵活地定制翻译和查词功能. 第一步: ...

  5. php英文翻译,利用有道翻译Api实现英文翻译效能

    利用有道翻译Api实现英文翻译功能 有道翻译提供了翻译和查词的数据接口.通过数据接口,您可以获得一段文本的翻译结果或者查词结果.       通过调用有道翻译API数据接口,您可以在您的网站或应用中更 ...

  6. 【c#】Form调用百度地图api攻略及常见问题

    首先,在Form中调用百度地图api,我们需要使用webbrowser控件,这个在前面的文章中已经讲过了,可以参照(http://blog.csdn.net/buptgshengod/article/ ...

  7. 调用百度汇率api 获取各国的汇率值

    设置一个定时任务,每天更新汇率java代码如下 package com.thinkgem.jeesite.modules.huiLvApi.service;import java.io.Buffere ...

  8. 调用百度地图API出现 error inflating class com.baidu.mapapi.map.mapview

    调用百度地图API出现 error inflating class com.baidu.mapapi.map.mapview 问题如下 本来以为解决了,但后来重新运行了一下,又坏了,然后改成原来的样子 ...

  9. python调用百度地图API爬取西安市POI数据

    任务前提 做该项目之前,首先得有基础知识: 编程语言:python 编译工具:PyCharm 网络爬虫相关知识,xpath库,numpy,pandas等库. 任务准备: 去百度地图开放平台申请密匙:h ...

  10. c语言api获取百度地图,H5调用百度地图API获取地理位置

    //获取当前位置 var geolocation = new BMap.Geolocation(); geolocation.getCurrentPosition(function(r){ alert ...

最新文章

  1. 【转】Hbuilder MUI 页面刷新及页面传值问题
  2. java环境变量配置(win7)
  3. MySQL 对于千万级的大表要怎么优化?
  4. Mac中使用svn进行项目管理
  5. Quay (2) - 镜像常规操作
  6. 实现indexof()
  7. Marquee无间隙滚动(二)
  8. Unity3d 通过协程来实现文件的全部加载后执行
  9. 使用seaborn制图(箱型图)
  10. 对课程第二次作业的补充与反馈
  11. 对抗攻击经典论文剖析(上)【FGSM、BIM、PGD、Carlini and Wagner Attacks (CW)】
  12. 计算机基础一体化教程(习题)
  13. 2021 美国硅谷程序员调查:平均年薪 80 万,后端人才“吃香”
  14. idea从零到精通目录导航
  15. CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below m
  16. 数据仓库指标体系搭建实战
  17. Linux磁盘相关-分区与修复
  18. 财报惊喜不断,京东彻底走出阴霾?
  19. [Step By Step]SAP HANA PAL指数回归预测分析Exponential Regression编程实例FORECASTWITHEXPR(预测)...
  20. 审计风险控制流程的起点_审计过程中如何理解风险评估程序和内部控制测试?...

热门文章

  1. 深度学习之 梯度消失与爆炸原因公式推导
  2. 转载的计算机网络课后答案(部分)
  3. 打造立体文案矩阵库之二:直复式营销文案
  4. mysql x86 x64_X86和X86_64和X64有什么区别?
  5. Java Seckill Module:Seckill interface address hiding
  6. java爬取中央气象台天气预报
  7. 沃邮箱的服务器设置,沃邮箱Outlook和Foxmail设置收发邮件
  8. html下拉菜单文字颜色,Bootstrap下拉菜单文字颜色
  9. Velero备份实战 - 基于Ceph的CSI快照
  10. 智科人之人工智能大实验四选一验优报告参考:基于遗传算法的函数极值求取