公司项目中需要用到在线翻译的功能,在网上找了个Google自己发布的API,不过这个API是使用Get提交实现的,所以继承了Get提交的2K容量的限制。公司要翻译的文章很多超过这个长度,所以不能够满足需求。于是,我又到网上找,怎么找也再没找到有合适的API,有的都是介绍Google的Get提交的API。
找了很久就是没找到Post提交的API或者介绍这种实现方式的例子。最后只好决定自己做一个。于是不断地找Google的翻译的应用,用抓包工具分析数据包,找Post提交应用。终于,功夫不负有心人,找到Google在线翻译是允许post提交的。好的,接下来就去实现了,根据已掌握的http知识把公司的需求实现了。先把它分享供有需要的Java人一起交流学习,如有不足请指正,有改善意见也尽可提出来,小弟会怀着感激之情虚心学习、改正。
现将我实现的在线翻译的例子列出,需要引入HttpClient4包,代码如下,附件里有HttpClient4包和源代码,有需要的可直接下载,只有577K。
/**
* http://ahomeeye.iteye.com/blog/841298
* @author ahomeeye
*/
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
public class GoogleTranslate {
private static HttpPost httppost;
private static HttpResponse response;
private static final DefaultHttpClient httpclient = new DefaultHttpClient();
/*
* @param text 翻译原文
* @param lanFrom 源语言
* @param lanTo 目标语言
* @return 翻译后的字符串
*/
public static String translate(String text, String lanFrom, String lanTo) {
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("hl", "en"));
qparams.add(new BasicNameValuePair("ie", "UTF-8"));
qparams.add(new BasicNameValuePair("sl", lanFrom));
qparams.add(new BasicNameValuePair("text", text));
qparams.add(new BasicNameValuePair("tl", lanTo));
//HttpClient提交post请求
httppost = new HttpPost("http://translate.google.com/translate_t#");
String responseBody = "";
String content = "";
try {
//将参数封装到post数据包中,
httppost.setEntity(new UrlEncodedFormEntity(qparams, HTTP.UTF_8));
response = httpclient.execute(httppost);
responseBody = EntityUtils.toString(response.getEntity());
//过滤出所需翻译后的内容
int tmp1 = responseBody.indexOf("result_box");
int tmp2 = responseBody.indexOf(">", tmp1);
int tmp3 = responseBody.indexOf("</div>", tmp2);
content = responseBody.substring(tmp2 + 1, tmp3).replaceAll("<br>", "\n").replaceAll("<[^>]*>", "");//替换换行符和其他网页标签
} catch (Exception e) {
return content;
} finally {
httppost.abort();
}
return content;
}
/*
* 重载上面的translate()方法,实现文本数组的翻译
*/
public static String[] translate(String[] text, String lanFrom, String lanTo) {
if (text == null || text.length < 1) {
return null;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < text.length; i++) {
if (i < text.length - 1) {
sb.append(text[i]).append("BBaaBB");
} else {
sb.append(text[i]);
}
}
return translate(sb.toString(), lanFrom, lanTo).split("BBaaBB");
}
public static void main(String[] args) {
String text = "我是一个中国人。";
String[] arrayText = {"我来自广东梅州。", "我爱你,梅州!"};
//这里实现多国语言间的翻译,大约支持59种语言,语言代码这里不再列出,有需要可到网上搜索
//语言字符串为国家或地区语言代码,一般为两位,繁体中文为:zh-TW 法语为:fr
String tranText = GoogleTranslate.translate(text, "zh-CN", "en");
String[] tranArray = GoogleTranslate.translate(arrayText, "zh-CN", "en");
System.out.println("tranText=" + tranText);
for (int i = 0; i < tranArray.length; i++) {
System.out.println("tranArray[" + i + "]=" + tranArray[i]);
}
}
}
运行结果:
tranText=I am a Chinese.
tranArray[0]=I come from Meizhou, Guangdong Province.
tranArray[1]=I love you, Meizhou!
代码很简单,干净简洁,很清晰,很容易懂的,重要的地方做了必要注释了,这里就不多说了。大家试运行一下,然后稍微看一下代码就能看懂的。如有不懂,给我留言。
今天做了修改,主要是过滤翻译内容那里发现有点错,还有就是改进了数组翻译的函数,减少了网络访问量,可以明显提高翻译速度。昨天在百度输入“google翻译 文章长度”一不小心把自己的这篇文章给搜出来了,一看竟然上了主题帖,而且排在第一位,感到欣慰。今天在google用同样的关键字试搜一下,排在前两位的都是我的这篇文章,第一条是我的原文地址,第二条是主题帖地址,看来google还是比较尊重个人的。令我感到欣慰又感慨的是,javaeye在把我的文章列为主题帖的同时却忘了把我的这篇文章加入主题帖列表。2010-12-27
分享到:
相关推荐
然而,这种方式存在安全性问题,因为URL可见,数据容易被截取,而且由于URL长度限制,不适合传输大量数据。以下是一个简单的GET请求示例: ```java String path = ...
5. Google Chrome:URL的最大长度限制为8182个字符。 当尝试通过`window.location.href`传递的数据量超过浏览器限制时,尤其是在IE浏览器中,可能会导致请求失败或无法正常工作。在这种情况下,通常建议使用POST...
if (query.length >= 3) { // 当输入长度达到最小限制时发送请求 $.ajax({ url: "autoCompleteService.jsp", // 调用后台服务的URL type: "POST", data: {query: query}, dataType: "json", // 设置期望的...
如果输入为空或长度超过限制(例如10个字符),则不发送请求。否则,构造一个POST请求,将关键词编码后发送到服务器端的URL(在这个例子中是`contentSearchAction!getSynonyms.action`),并设置请求头为`...
在这个例子中,我们通过发送POST请求到服务器的验证邮箱端点,并根据服务器返回的数据来确定是否是唯一的邮箱地址。 总结来说,AngularJS提供了全面的表单验证功能,包括内置的同步验证、自定义正则验证以及...
本资源提供了一个基于AJAX实现的自动完成功能,仿照了Google Suggest的方式,即用户输入一个字母后,系统会即时显示与之相关的建议选项。接下来,我们将深入探讨AJAX、自动完成的基本原理以及如何通过AJAX实现这一...
这包括请求类型(POST)、内容类型(text/xml)和字符集(gb2312),以及内容长度。 4. **XML-RPC**:在博客Ping服务中,通常使用XML-RPC协议来传递信息。XML-RPC是一种基于XML的简单远程过程调用(RPC)协议。在这...
arrayBuffer 是一种类型化数组,用来表示通用的、固定长度的原始二进制数据缓冲区。前端可以使用 XMLHttpRequest(或者现代的 fetch API)以二进制格式发送数据。 在 Node.js 的 httpServer 中接收前端发送的 ...
项目部署可能涉及到Docker容器化和云服务,如AWS、Google Cloud或Heroku。 综上所述,“url-shortener”项目涵盖了从后端开发、前端界面设计、数据库管理到安全性和性能优化等多个方面的知识点。这是一个全面展示...
10.4.8. 通过总数和偏移量进行LIMIT限制 10.4.9. 通过页数和总数进行LIMIT限制 10.5. Zend_Db_Table 10.5.1. 简介 10.5.2. 开始 10.5.3. 表名和主键 10.5.4. 插入数据 10.5.5. 更新数据 10.5.6. Deleting ...
TensorFlow是一个开源软件库,由Google大脑小组开发,旨在为数值计算提供支持。它的核心功能是利用数据流图(dataflow graphs)进行计算。在这些图中,节点(Node)代表数学运算,边(Edge)则连接这些节点,并携带张量...
Flutter是Google开发的一款用于构建跨平台移动应用的开源框架,它提供了丰富的库和工具,使得开发者能够快速、高效地构建美观的应用。在这个示例中,我们将特别关注如何使用`http`包来处理网络请求,从而获取服务器...