由於工做產品須要,須要APP 開發翻譯功能。java
因爲谷歌翻譯API進行收費,web
搜索了一下,網上有2中方式實現。apache
1.破解生成token規律。json
2.用httpclient訪問web,而後解析api
兩種方式都比較麻煩。網絡
通過google發現還有更簡單的方式:工具
"https://translate.googleapis.com/translate_a/single?client=gtx&sl={fromCulture}&tl={toCulture}&dt=t&q={text}" post
client ,dt 兩個參數不要修改,否則沒法正常工做google
sl 爲要翻譯的文本語言,若是不知道,能夠爲auto編碼
tl 爲目標語言。必須指定
q 爲要翻譯的文本。注意中文的 UrlEncoded 問題
寫成工具類能夠以下:
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.*; public class GoogleTranslateTest { public static void main(String args[]) throws Exception { System.out.println("-----test-----"); String txt="永和九年,歲在癸丑,暮春之初,會於會稽山陰之蘭亭,修禊事也。羣賢畢至,少長鹹集。此地有崇山峻嶺,茂林修竹;又有清流激湍,映帶左右,引覺得流觴曲水,列坐其次。雖無絲竹管絃之盛,一觴一詠,亦足以暢敘幽情。是日也,天朗氣清,惠風和暢,仰觀宇宙之大,俯察品類之盛,因此遊目騁懷,足以極視聽之娛,信可樂也。\n" + "夫人之相與,俯仰一世,或取諸懷抱,悟言一室以內;或因寄所託,放浪形骸以外。雖趣舍萬殊,靜躁不一樣,當其欣於所遇,暫得於己,快然自足,不知老之將至。及其所之既倦,情隨事遷,感慨系之矣。向之所欣,俯仰之間,已爲陳跡,猶不能不以之興懷。況修短隨化,終期於盡。古人云:「死生亦大矣。」豈不痛哉!(不知老之將至 一做:曾不知老之將至)\n" + "每覽昔人興感之由,若合一契,何嘗不臨文嗟悼,不能喻之於懷。固知一死生爲虛誕,齊彭殤爲妄做。後之視今,亦猶今之視昔。悲夫!故列敘時人,錄其所述,雖世殊事異,因此興懷,其致一也。後之覽者,亦將有感於斯文。"; GT g = GT.getInstance(); System.out.println( g.translateText(txt,"auto","en")); System.out.println( g.translateText("誰能說支持不支持","auto","en")); } } /** * 谷歌翻譯類 */ 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 UnsupportedEncodingException */ 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; } }