對於android來說,很多翻譯接口要收費的。但是翻譯還是有很多網頁版的,因此爬蟲便成爲一種方式。谷歌翻譯中國版不需要翻牆,谷歌翻譯中有一個接口可以得到翻譯後的json。
在瀏覽器打開會下載一個f.txt的文件,內容爲:
[[[“今晚不要加班”,”Do not work overtime tonight”,null,null,3]],null,”en”]。
在android中使用流的方式接收,轉化爲json進行相應處理即可。
返回內容會是這個樣子的:
[[[“2017年10月23日,中國中部湖南省株洲市測試了世界上第一列無軌列車.30米長的列車有三個車廂,由中國中車株洲機車有限公司開發,列車時速可達70公里/”,”The world’s first railless train is tested in Zhuzhou, Central China’s Hunan province, on Oct 23, 2017. The 30-meter train has three carriages and is developed by CRRC Zhuzhou Locomotive Co Ltd. The train can move at a speed of 70 km/”,null,null,3],[“小時,可載500名乘客。”,”h and can carry up to 500 passengers.”,null,null,3]],null,”en”]
只要進行相應處理與拼接即可。
sl=en 爲source language,可設置爲auto。
tl=zh 爲target language,設置爲目標語言。
注意在android中使用HttpURLConnection的話,需要設置User-Agent如:HttpURLConnection.setRequestProperty(“User-Agent”, “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36”);
支持的語言:
“auto”:””Automatic”,
“af”:”Afrikaans”,
“sq”:”Albanian”,
“ar”:”Arabic”,
“hy”:”Armenian”,
“az”:”Azerbaijani”,
“eu”:”Basque”,
“be”:”Belarusian”,
“bn”:”Bengali”,
“bs”:”Bosnian”,
“bg”:”Bulgarian”,
“ca”:”Catalan”,
“ceb”:”Cebuano”,
“ny”:”Chichewa”,
“zh-cn”:”Chinese Simplified”,
“zh-tw”:”Chinese Traditional”,
“co”:”Corsican”,
“hr”:”Croatian”,
“cs”:”Czech”,
“da”:”Danish”,
“nl”:”Dutch”,
“en”:”English”,
“eo”:”Esperanto”,
“et”:”Estonian”,
“tl”:”Filipino”,
“fi”:”Finnish”,
“fr”:”French”,
“fy”:”Frisian”,
“gl”:”Galician”,
“ka”:”Georgian”,
“de”:”German”,
“el”:”Greek”,
“gu”:”Gujarati”,
“ht”:”Haitian Creole”,
“ha”:”Hausa”,
“haw”:”Hawaiian”,
“iw”:”Hebrew”,
“hi”:”Hindi”,
“hmn”:”Hmong”,
“hu”:”Hungarian”,
“is”:”Icelandic”,
“ig”:”Igbo”,
“id”:”Indonesian”,
“ga”:”Irish”,
“it”:”Italian”,
“ja”:”Japanese”,
“jw”:”Javanese”,
“kn”:”Kannada”,
“kk”:”Kazakh”,
“km”:”Khmer”,
“ko”:”Korean”,
“ku”:”Kurdish (Kurmanji)”,
“ky”:”Kyrgyz”,
“lo”:”Lao”,
“la”:”Latin”,
“lv”:”Latvian”,
“lt”:”Lithuanian”,
“lb”:”Luxembourgish”,
“mk”:”Macedonian”,
“mg”:”Malagasy”,
“ms”:”Malay”,
“ml”:”Malayalam”,
“mt”:”Maltese”,
“mi”:”Maori”,
“mr”:”Marathi”,
“mn”:”Mongolian”,
“my”:”Myanmar (Burmese)”,
“ne”:”Nepali”,
“no”:”Norwegian”,
“ps”:”Pashto”,
“fa”:”Persian”,
“pl”:”Polish”,
“pt”:”Portuguese”,
“ma”:”Punjabi”,
“ro”:”Romanian”,
“ru”:”Russian”,
“sm”:”Samoan”,
“gd”:”Scots Gaelic”,
“sr”:”Serbian”,
“st”:”Sesotho”,
“sn”:”Shona”,
“sd”:”Sindhi”,
“si”:”Sinhala”,
“sk”:”Slovak”,
“sl”:”Slovenian”,
“so”:”Somali”,
“es”:”Spanish”,
“su”:”Sudanese”,
“sw”:”Swahili”,
“sv”:”Swedish”,
“tg”:”Tajik”,
“ta”:”Tamil”,
“te”:”Telugu”,
“th”:”Thai”,
“tr”:”Turkish”,
“uk”:”Ukrainian”,
“ur”:”Urdu”,
“uz”:”Uzbek”,
“vi”:”Vietnamese”,
“cy”:”Welsh”,
“xh”:”Xhosa”,
“yi”:”Yiddish”,
“yo”:”Yoruba”,
“zu”:”Zulu”
代碼例子:
/**
* 翻譯回調
*/
public interface TranslateCallback{
public void onTranslateDone(String result);
}
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executors;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
public class TranslateUtil {
public static final String TRANSLATE_BASE_URL = "https://translate.google.cn/"; // 不需要翻牆即可使用
// public static final String TRANSLATE_SINGLE_URL = "https://translate.google.cn/translate_a/single?client=gtx&sl=en&tl=zh&dt=t&q=Do%20not%20work%20overtime%20tonight";
public static final String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36";
private static String LAN_AUTO = "auto";
/**
* 翻譯,包含http請求,需要異步,返回""則爲翻譯失敗
* @param sourceLan 源語言,如en,自動檢測爲auto
* @param targetLan 目標語言如zh
* @param content 翻譯文本
* @return ""爲翻譯失敗,其餘成功
*/
public void translate(Context context, String sourceLan, String targetLan, String content, TranslateCallback callback) {
TranslateTask task = new TranslateTask(context, sourceLan, targetLan, content, callback);
task.executeOnExecutor(Executors.newCachedThreadPool());
}
/**
* 使用異步任務來翻譯,翻譯完成後回調callback
*/
class TranslateTask extends AsyncTask<Void, Void, String> {
String sourceLan;
String targetLan;
String content;
Context context;
TranslateCallback callback;
private LoadingDalog loadingDalog = null; // 這個請自己定義加載中對話框,或者乾脆不使用
TranslateTask(Context context, String sourceLan, String targetLan, String content, TranslateCallback callback){
this.context = context;
this.content = content;
this.callback = callback;
this.sourceLan = sourceLan;
this.targetLan = targetLan;
}
@Override
protected String doInBackground(Void... params) {
String result = "";
if (content == null || content.equals("")) {
return result;
}
try {
String googleResult = "";
// 新建一個URL對象
URL url = new URL(getTranslateUrl(sourceLan, targetLan, content));
// 打開一個HttpURLConnection連接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
// 設置連接主機超時時間
urlConn.setConnectTimeout(5 * 1000);
//設置從主機讀取數據超時
urlConn.setReadTimeout(5 * 1000);
// 設置是否使用緩存 默認是true
urlConn.setUseCaches(false);
// 設置爲Post請求
urlConn.setRequestMethod("GET");
//urlConn設置請求頭信息
urlConn.setRequestProperty("User-Agent", USER_AGENT);
//設置請求中的媒體類型信息。
// urlConn.setRequestProperty("Content-Type", "application/json");
//設置客戶端與服務連接類型
// urlConn.addRequestProperty("Connection", "Keep-Alive");
// 開始連接
urlConn.connect();
// 判斷請求是否成功
int statusCode = urlConn.getResponseCode();
if (statusCode == 200) {
// 獲取返回的數據
googleResult = streamToString(urlConn.getInputStream());
}
// 關閉連接
urlConn.disconnect();
// 處理返回結果,拼接
JSONArray jsonArray = new JSONArray(googleResult).getJSONArray(0);
for (int i = 0; i < jsonArray.length(); i++) {
result += jsonArray.getJSONArray(i).getString(0);
}
} catch (Exception e) {
// result = "翻譯失敗";
e.printStackTrace();
result = "";
}
Log.d("TAG", "翻譯結果:" + result);
return result;
}
@Override
protected void onPostExecute(String result) {
if (loadingDalog != null && loadingDalog.isShowing()) {
loadingDalog.cancel();
}
if (callback != null){
callback.onTranslateDone(result);
}
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
String str = context.getString(R.string.translating);
try {
loadingDalog = new LoadingDalog(context);// Dialog使用、初始化
loadingDalog.setMessage(str);
loadingDalog.show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 將輸入流轉換成字符串
*
* @param is 從網絡獲取的輸入流
* @return 字符串
*/
public static String streamToString(InputStream is) {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.close();
is.close();
byte[] byteArray = out.toByteArray();
return new String(byteArray);
} catch (Exception e) {
return null;
}
}
public void translate(Context context, String targetLan, String content, TranslateCallback callback) {
translate(context, LAN_AUTO, targetLan, content, callback);
}
private static String getTranslateUrl(String sourceLan, String targetLan, String content) {
try {
return TRANSLATE_BASE_URL + "translate_a/single?client=gtx&sl=" + sourceLan + "&tl=" + targetLan + "&dt=t&q=" + URLEncoder.encode(content, "UTF-8");
} catch (Exception e) {
return TRANSLATE_BASE_URL + "translate_a/single?client=gtx&sl=" + sourceLan + "&tl=" + targetLan + "&dt=t&q=" + content;
}
}
// 使用
TranslateCallback translateCallback = new TranslateCallback() {
@Override
public void onTranslateDone(String result) {
// result是翻譯結果,在這裏使用翻譯結果,比如使用對話框顯示翻譯結果
}
}
new TranslateUtil().translate(activity, "auto", "en", "待翻譯內容", translateCallback);