中英翻譯(基於百度翻譯)

先來看效果圖java

只作了簡單的在線翻譯,語音翻譯和圖片翻譯都要錢,哈哈android

市面上有名氣的翻譯公司就是有道和百度了,有道嘗試了一下,分爲API和SDK兩種,可是demo下載下來跑不了git

百度的就是API,也很簡單,就是經過百度的協議去請求他們的服務器,獲得翻譯後的值,每一個月有200萬的免費,夠用了json

百度文檔地址http://api.fanyi.baidu.com/api/trans/product/apidoc#joinFilec#

步驟:api

java版demo下載地址https://fanyiapp.cdn.bcebos.com/api/demo/java.zip數組

下面是核心代碼服務器

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">

    <EditText android:id="@+id/inputChinese" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入要翻譯的中文" android:singleLine="true" />

    <EditText android:id="@+id/inputEnglish" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入要翻譯的英文" android:singleLine="true" />

    <TextView android:id="@+id/translate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_margin="10dp" android:padding="10dp" android:text="翻譯" android:textSize="20sp" />

    <TextView android:id="@+id/outputEnglish" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" tools:text="獲得的英文" />

    <TextView android:id="@+id/outputChinese" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" tools:text="獲得的中文" />

</LinearLayout>
import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import android.widget.TextView; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class MainActivity extends AppCompatActivity { private static final String APP_ID = "20190603000304432"; private static final String SECURITY_KEY = "gZTcFc0TyR6tZS5FfmyA"; private EditText inputChinese; private EditText inputEnglish; private TextView outputEnglish; private TextView outputChinese; private TextView translate; private TransApi api; private static final int CHINESE = 1; private static final int ENGLISH = 2; private static final String TO_ENGLISH = "en"; private static final String TO_CHINESE = "zh"; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); String str = String.valueOf(msg.obj); String value = parserJson(str); switch (msg.what) { case CHINESE: outputChinese.setText(value); break; case ENGLISH: outputEnglish.setText(value); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); api = new TransApi(APP_ID, SECURITY_KEY); translate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { translate(inputChinese.getText().toString(), TO_ENGLISH); translate(inputEnglish.getText().toString(), TO_CHINESE); } }); } private void initView() { inputChinese = findViewById(R.id.inputChinese); inputEnglish = findViewById(R.id.inputEnglish); outputEnglish = findViewById(R.id.outputEnglish); outputChinese = findViewById(R.id.outputChinese); translate = findViewById(R.id.translate); } private void translate(final String chinese, final String toLanguage) { new Thread(new Runnable() { @Override public void run() { String transResult = api.getTransResult(chinese, "auto", toLanguage); Message message = new Message(); switch (toLanguage) { case TO_CHINESE: message.what = CHINESE; break; case TO_ENGLISH: message.what = ENGLISH; break; } message.obj = transResult; handler.sendMessage(message); } }).start(); } private String parserJson(String str) { try { JSONObject jsonObject = new JSONObject(str); JSONArray trans_result = jsonObject.getJSONArray("trans_result"); JSONObject result = trans_result.getJSONObject(0); String dst = result.getString("dst"); return dst; } catch (JSONException e) { e.printStackTrace(); } return ""; } }
import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; class HttpGet { protected static final int SOCKET_TIMEOUT = 10000; // 10S
    protected static final String GET = "GET"; public static String get(String host, Map<String, String> params) { try { // 設置SSLContext
            SSLContext sslcontext = SSLContext.getInstance("TLS"); sslcontext.init(null, new TrustManager[] { myX509TrustManager }, null); String sendUrl = getUrlWithQueryString(host, params); // System.out.println("URL:" + sendUrl);
 URL uri = new URL(sendUrl); // 建立URL對象
            HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); if (conn instanceof HttpsURLConnection) { ((HttpsURLConnection) conn).setSSLSocketFactory(sslcontext.getSocketFactory()); } conn.setConnectTimeout(SOCKET_TIMEOUT); // 設置相應超時
 conn.setRequestMethod(GET); int statusCode = conn.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { System.out.println("Http錯誤碼:" + statusCode); } // 讀取服務器的數據
            InputStream is = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); StringBuilder builder = new StringBuilder(); String line = null; while ((line = br.readLine()) != null) { builder.append(line); } String text = builder.toString(); close(br); // 關閉數據流
            close(is); // 關閉數據流
            conn.disconnect(); // 斷開鏈接

            return text; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } public static String getUrlWithQueryString(String url, Map<String, String> params) { if (params == null) { return url; } StringBuilder builder = new StringBuilder(url); if (url.contains("?")) { builder.append("&"); } else { builder.append("?"); } int i = 0; for (String key : params.keySet()) { String value = params.get(key); if (value == null) { // 過濾空的key
                continue; } if (i != 0) { builder.append('&'); } builder.append(key); builder.append('='); builder.append(encode(value)); i++; } return builder.toString(); } protected static void close(Closeable closeable) { if (closeable != null) { try { closeable.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 對輸入的字符串進行URL編碼, 即轉換爲%20這種形式 * * @param input 原文 * @return URL編碼. 若是編碼失敗, 則返回原文 */
    public static String encode(String input) { if (input == null) { return ""; } try { return URLEncoder.encode(input, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return input; } private static TrustManager myX509TrustManager = new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } }; }
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * MD5編碼相關的類 * * @author wangjingtao */
public class MD5 { // 首先初始化一個字符數組,用來存放每一個16進制字符
    private static final char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; /** * 得到一個字符串的MD5值 * * @param input 輸入的字符串 * @return 輸入字符串的MD5值 */
    public static String md5(String input) { if (input == null) return null; try { // 拿到一個MD5轉換器(若是想要SHA1參數換成」SHA1」)
            MessageDigest messageDigest = MessageDigest.getInstance("MD5"); // 輸入的字符串轉換成字節數組
            byte[] inputByteArray = input.getBytes("utf-8"); // inputByteArray是輸入字符串轉換獲得的字節數組
 messageDigest.update(inputByteArray); // 轉換並返回結果,也是字節數組,包含16個元素
            byte[] resultByteArray = messageDigest.digest(); // 字符數組轉換成字符串返回
            return byteArrayToHex(resultByteArray); } catch (NoSuchAlgorithmException e) { return null; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } /** * 獲取文件的MD5值 * * @param file * @return
     */
    public static String md5(File file) { try { if (!file.isFile()) { System.err.println("文件" + file.getAbsolutePath() + "不存在或者不是文件"); return null; } FileInputStream in = new FileInputStream(file); String result = md5(in); in.close(); return result; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } public static String md5(InputStream in) { try { MessageDigest messagedigest = MessageDigest.getInstance("MD5"); byte[] buffer = new byte[1024]; int read = 0; while ((read = in.read(buffer)) != -1) { messagedigest.update(buffer, 0, read); } in.close(); String result = byteArrayToHex(messagedigest.digest()); return result; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } private static String byteArrayToHex(byte[] byteArray) { // new一個字符數組,這個就是用來組成結果字符串的(解釋一下:一個byte是八位二進制,也就是2位十六進制字符(2的8次方等於16的2次方))
        char[] resultCharArray = new char[byteArray.length * 2]; // 遍歷字節數組,經過位運算(位運算效率高),轉換成字符放到字符數組中去
        int index = 0; for (byte b : byteArray) { resultCharArray[index++] = hexDigits[b >>> 4 & 0xf]; resultCharArray[index++] = hexDigits[b & 0xf]; } // 字符數組組合成字符串返回
        return new String(resultCharArray); } }
import java.util.HashMap; import java.util.Map; public class TransApi { private static final String TRANS_API_HOST = "http://api.fanyi.baidu.com/api/trans/vip/translate"; private String appid; private String securityKey; public TransApi(String appid, String securityKey) { this.appid = appid; this.securityKey = securityKey; } public String getTransResult(String query, String from, String to) { Map<String, String> params = buildParams(query, from, to); return HttpGet.get(TRANS_API_HOST, params); } private Map<String, String> buildParams(String query, String from, String to) { Map<String, String> params = new HashMap<String, String>(); params.put("q", query); params.put("from", from); params.put("to", to); params.put("appid", appid); // 隨機數
        String salt = String.valueOf(System.currentTimeMillis()); params.put("salt", salt); // 簽名
        String src = appid + query + salt + securityKey; // 加密前的原文
        params.put("sign", MD5.md5(src)); return params; } }

歡迎關注個人微信公衆號:安卓圈微信

相關文章
相關標籤/搜索