由于谷歌翻译API进行收费,
搜索了一下,网上有2中方式实现。
1.破解生成token规律。
2.用httpclient访问web,然后解析
两种方式都比较麻烦。
经过google发现还有更简单的方式:
"https://translate.googleapis.com/translate_a/single?client=gtx&sl={fromCulture}&tl={toCulture}&dt=t&q={text}"
client ,dt 两个参数不要修改,不然无法正常工作
sl 为要翻译的文本语言,如果不知道,可以为auto
tl 为目标语言。必须指定
q 为要翻译的文本。注意中文的 UrlEncoded 问题
写成工具类可以如下:
package com.taotao.translate;
import com.alibaba.fastjson.JSONArray;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.*;
/**
* @author aping
* @time 2020/5/22 16:42
*/
public class GT {
private static final String PATH="https://translate.googleapis.com/translate_a/single"; //地址
private static final String CLIENT="gtx";
private static final String USER_AGENT="Mozilla/5.0";//"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36";
private static final Map<String,String> LANGUAGE_MAP=new HashMap();
private static GT _instance = null;
/**
* 获取单例
* @return
*/
public static GT getInstance() {
if( null == _instance){
_instance = new GT();
_instance.init();
}
return _instance;
}
/**
* 初始化语言类
*/
private void init(){
LANGUAGE_MAP.put("auto","Automatic");
LANGUAGE_MAP.put("af","Afrikaans");
LANGUAGE_MAP.put("sq","Albanian");
LANGUAGE_MAP.put("am","Amharic");
LANGUAGE_MAP.put("ar","Arabic");
LANGUAGE_MAP.put("hy","Armenian");
LANGUAGE_MAP.put("az","Azerbaijani");
LANGUAGE_MAP.put("eu","Basque");
LANGUAGE_MAP.put("be","Belarusian");
LANGUAGE_MAP.put("bn","Bengali");
LANGUAGE_MAP.put("bs","Bosnian");
LANGUAGE_MAP.put("bg","Bulgarian");
LANGUAGE_MAP.put("ca","Catalan");
LANGUAGE_MAP.put("ceb","Cebuano");
LANGUAGE_MAP.put("ny","Chichewa");
LANGUAGE_MAP.put("zh_cn","Chinese Simplified");
LANGUAGE_MAP.put("zh_tw","Chinese Traditional");
LANGUAGE_MAP.put("co","Corsican");
LANGUAGE_MAP.put("hr","Croatian");
LANGUAGE_MAP.put("cs","Czech");
LANGUAGE_MAP.put("da","Danish");
LANGUAGE_MAP.put("nl","Dutch");
LANGUAGE_MAP.put("en","English");
LANGUAGE_MAP.put("eo","Esperanto");
LANGUAGE_MAP.put("et","Estonian");
LANGUAGE_MAP.put("tl","Filipino");
LANGUAGE_MAP.put("fi","Finnish");
LANGUAGE_MAP.put("fr","French");
LANGUAGE_MAP.put("fy","Frisian");
LANGUAGE_MAP.put("gl","Galician");
LANGUAGE_MAP.put("ka","Georgian");
LANGUAGE_MAP.put("de","German");
LANGUAGE_MAP.put("el","Greek");
LANGUAGE_MAP.put("gu","Gujarati");
LANGUAGE_MAP.put("ht","Haitian Creole");
LANGUAGE_MAP.put("ha","Hausa");
LANGUAGE_MAP.put("haw","Hawaiian");
LANGUAGE_MAP.put("iw","Hebrew");
LANGUAGE_MAP.put("hi","Hindi");
LANGUAGE_MAP.put("hmn","Hmong");
LANGUAGE_MAP.put("hu","Hungarian");
LANGUAGE_MAP.put("is","Icelandic");
LANGUAGE_MAP.put("ig","Igbo");
LANGUAGE_MAP.put("id","Indonesian");
LANGUAGE_MAP.put("ga","Irish");
LANGUAGE_MAP.put("it","Italian");
LANGUAGE_MAP.put("ja","Japanese");
LANGUAGE_MAP.put("jw","Javanese");
LANGUAGE_MAP.put("kn","Kannada");
LANGUAGE_MAP.put("kk","Kazakh");
LANGUAGE_MAP.put("km","Khmer");
LANGUAGE_MAP.put("ko","Korean");
LANGUAGE_MAP.put("ku","Kurdish (Kurmanji)");
LANGUAGE_MAP.put("ky","Kyrgyz");
LANGUAGE_MAP.put("lo","Lao");
LANGUAGE_MAP.put("la","Latin");
LANGUAGE_MAP.put("lv","Latvian");
LANGUAGE_MAP.put("lt","Lithuanian");
LANGUAGE_MAP.put("lb","Luxembourgish");
LANGUAGE_MAP.put("mk","Macedonian");
LANGUAGE_MAP.put("mg","Malagasy");
LANGUAGE_MAP.put("ms","Malay");
LANGUAGE_MAP.put("ml","Malayalam");
LANGUAGE_MAP.put("mt","Maltese");
LANGUAGE_MAP.put("mi","Maori");
LANGUAGE_MAP.put("mr","Marathi");
LANGUAGE_MAP.put("mn","Mongolian");
LANGUAGE_MAP.put("my","Myanmar (Burmese)");
LANGUAGE_MAP.put("ne","Nepali");
LANGUAGE_MAP.put("no","Norwegian");
LANGUAGE_MAP.put("ps","Pashto");
LANGUAGE_MAP.put("fa","Persian");
LANGUAGE_MAP.put("pl","Polish");
LANGUAGE_MAP.put("pt","Portuguese");
LANGUAGE_MAP.put("ma","Punjabi");
LANGUAGE_MAP.put("ro","Romanian");
LANGUAGE_MAP.put("ru","Russian");
LANGUAGE_MAP.put("sm","Samoan");
LANGUAGE_MAP.put("gd","Scots Gaelic");
LANGUAGE_MAP.put("sr","Serbian");
LANGUAGE_MAP.put("st","Sesotho");
LANGUAGE_MAP.put("sn","Shona");
LANGUAGE_MAP.put("sd","Sindhi");
LANGUAGE_MAP.put("si","Sinhala");
LANGUAGE_MAP.put("sk","Slovak");
LANGUAGE_MAP.put("sl","Slovenian");
LANGUAGE_MAP.put("so","Somali");
LANGUAGE_MAP.put("es","Spanish");
LANGUAGE_MAP.put("su","Sundanese");
LANGUAGE_MAP.put("sw","Swahili");
LANGUAGE_MAP.put("sv","Swedish");
LANGUAGE_MAP.put("tg","Tajik");
LANGUAGE_MAP.put("ta","Tamil");
LANGUAGE_MAP.put("te","Telugu");
LANGUAGE_MAP.put("th","Thai");
LANGUAGE_MAP.put("tr","Turkish");
LANGUAGE_MAP.put("uk","Ukrainian");
LANGUAGE_MAP.put("ur","Urdu");
LANGUAGE_MAP.put("uz","Uzbek");
LANGUAGE_MAP.put("vi","Vietnamese");
LANGUAGE_MAP.put("cy","Welsh");
LANGUAGE_MAP.put("xh","Xhosa");
LANGUAGE_MAP.put("yi","Yiddish");
LANGUAGE_MAP.put("yo","Yoruba");
LANGUAGE_MAP.put("zu","Zulu");
}
/**
* 判断语言是否支持
* @param language
* @return
*/
public boolean isSupport(String language){
if( null == LANGUAGE_MAP.get( language )){
return false;
}
return true;
}
/** 获取 语言代码
* ISO 639-1 code
* @param desiredLang 语言
* @return 如果返回null则标示不支持
*/
public String getCode(String desiredLang){
if( null != LANGUAGE_MAP.get(desiredLang)){
return desiredLang;
}
String tmp = desiredLang.toLowerCase();
for(Map.Entry<String, String> enter : LANGUAGE_MAP.entrySet() ){
if( enter.getValue().equals( tmp)){
return enter.getKey();
}
}
return null;
}
/**
* 翻译文本
* @param text 文本内容
* @param sourceLang 文本所属语言。如果不知道,可以使用auto
* @param targetLang 目标语言。必须是明确的有效的目标语言
* @return
* @throws Exception
*/
public String translateText(String text,String sourceLang, String targetLang) throws Exception{
String retStr="";
if( !( isSupport(sourceLang) || isSupport(targetLang) ) ){
throw new Exception("不支持的语言类型");
}
List<NameValuePair> nvps = new ArrayList();
nvps.add(new BasicNameValuePair("client", CLIENT));
nvps.add(new BasicNameValuePair("sl", sourceLang));
nvps.add(new BasicNameValuePair("tl", targetLang));
nvps.add(new BasicNameValuePair("dt", "t"));
nvps.add(new BasicNameValuePair("q", text));
// String finalPath=PATH +"?client="+CLIENT+"&sl="+sourceLang+"&tl="+targetLang+"&dt=t&q="+ text ;
String resp = postHttp( PATH,nvps);
if( null == resp ){
throw new Exception("网络异常");
}
// System.out.println( "==>返回内容:" + resp);
JSONArray jsonObject = JSONArray.parseArray( resp );
for (Iterator<Object> it = jsonObject.getJSONArray(0).iterator(); it.hasNext(); ) {
JSONArray a = (JSONArray) it.next();
retStr += a.getString(0);
}
return retStr;
}
/**
* post 请求
* @param url 请求地址
* @param nvps 参数列表
* @return
* @throws
*/
private String postHttp( String url ,List<NameValuePair> nvps){
String responseStr = null;
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost( url );
//重要!!必须设置 http 头,否则返回为乱码
httpPost.setHeader("User-Agent",USER_AGENT);
CloseableHttpResponse response2 = null;
try {
// 重要!! 指定编码,对中文进行编码
httpPost.setEntity( new UrlEncodedFormEntity(nvps, Charset.forName("UTF-8")) );
response2 = httpclient.execute(httpPost);
HttpEntity entity2 = response2.getEntity();
responseStr = EntityUtils.toString(entity2);
EntityUtils.consume(entity2);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != response2) {
try {
response2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if( null != httpclient ){
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return responseStr;
}
}
package com.taotao.translate;
import com.alibaba.fastjson.JSONArray;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.*;
/**
* @author aping
* @time 2020/5/22 16:41
*/
public class GoogleTranslateTest {
public static void main(String args[]) throws Exception {
System.out.println("-----test-----");
String txt="Happiness is to live in the moment and be happy with each other. Sweet thoughts linger day and night, belong to each other, have a clear and elegant taste, and are free and unfettered between mountains and rivers and clouds.";
GT g = GT.getInstance();
System.out.println( g.translateText(txt,"auto","zh_cn"));
//System.out.println( g.translateText("谁能说支持不支持","auto","en"));
}
}