公司项目中需要用到在线翻译的功能,在网上找了个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