YanYi 6 роки тому
коміт
bdfadd3068

BIN
TranslationPlugin.jar


+ 37 - 0
resources/META-INF/plugin.xml

@@ -0,0 +1,37 @@
+<idea-plugin>
+    <id>com.your.company.unique.plugin.id</id>
+    <name>com.yanyi.translation.Translation YanYi</name>
+    <version>1.0</version>
+    <vendor email="ben@yanyi.red" url="http://www.yanyis.space">YanYi</vendor>
+
+    <description>
+        一款简单的翻译软件,用于将别的语言翻译成中文,也能将中文翻译成英文,暂时不支持将中文翻译成除英文外的别的语言。
+    </description>
+
+    <change-notes>
+        第一版,首次提交上传更新,快速方便实现AndroidStudio内翻译,不需打开第三方翻译
+    </change-notes>
+
+    <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
+    <idea-version since-build="173.0" />
+
+    <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
+         on how to target different products -->
+    <!-- uncomment to enable plugin in all products
+    <depends>com.intellij.modules.lang</depends>
+    -->
+
+    <extensions defaultExtensionNs="com.intellij">
+        <!-- Add your extensions here -->
+    </extensions>
+
+    <actions>
+        <!-- Add your actions here -->
+        <action id="com.mylove.translation" class="com.yanyi.translation.Translation" text="在线翻译"
+            description="一款简单的在线翻译插件">
+            <add-to-group group-id="ToolsMenu" anchor="first" />
+            <keyboard-shortcut keymap="$default" first-keystroke="alt F2" />
+        </action>
+    </actions>
+
+</idea-plugin>

+ 24 - 0
src/com/yanyi/translation/BaiduTest.java

@@ -0,0 +1,24 @@
+package com.yanyi.translation;
+
+/**
+ * @author YanYi
+ * @date 2019/3/27 12:50
+ * @email ben@yanyi.red
+ * @overview
+ */
+public class BaiduTest {
+    private static final String APP_ID = "20181221000250890";
+    private static final String SECURITY_KEY = "TfP62BRxA7t1QNiyWxAE";
+
+    public static void main(String[] arg0) {
+//        TransApi transApi = new TransApi(APP_ID, SECURITY_KEY);
+//        String q = "hello";
+//        System.out.println(JsonUtil.jsonToTrans(transApi.getTransResult(q, "auto", "zh")));
+//        {"error_code":0,"error_msg":"success","data":{"src":"en"}}
+//       {"error_code":"52003","error_msg":"UNAUTHORIZED USER"}
+        StringBuilder str = new StringBuilder();
+        str.append("加加加").append(";");
+        str.deleteCharAt(str.length() - 1);
+        System.out.println(str.toString());
+    }
+}

+ 153 - 0
src/com/yanyi/translation/HttpUtil.java

@@ -0,0 +1,153 @@
+package com.yanyi.translation;
+
+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.URL;
+import java.net.URLEncoder;
+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;
+
+/**
+ * @author YanYi
+ * @date 2019/3/27 11:33
+ * @email ben@yanyi.red
+ * @overview
+ */
+public class HttpUtil {
+    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 (Exception e) {
+            return "";
+        }
+    }
+
+    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 {
+        }
+    };
+}

+ 66 - 0
src/com/yanyi/translation/JsonUtil.java

@@ -0,0 +1,66 @@
+package com.yanyi.translation;
+
+import org.codehaus.jettison.json.JSONArray;
+import org.codehaus.jettison.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author YanYi
+ * @date 2019/3/27 13:58
+ * @email ben@yanyi.red
+ * @overview
+ */
+class JsonUtil {
+    static String jsonToLanguage(String json) {
+//        {"error_code":0,"error_msg":"success","data":{"src":"en"}}
+//        {"error_code":"52003","error_msg":"UNAUTHORIZED USER"}
+        try {
+            JSONObject jsonObject = new JSONObject(json);
+            int code = jsonObject.optInt("error_code", -1);
+            if (code == 0) {
+                JSONObject data = jsonObject.optJSONObject("data");
+                if (data != null) {
+                    String src = data.getString("src");
+                    if (src != null && !src.isEmpty()) {
+                        return src;
+                    } else {
+                        return "";
+                    }
+                } else {
+                    return "";
+                }
+            } else {
+                return "";
+            }
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    static List<TransBean> jsonToTrans(String json) {
+//        {"error_code":"52003","error_msg":"UNAUTHORIZED USER"}
+//        {"from":"en","to":"zh","trans_result":[{"src":"hello","dst":"\u4f60\u597d"}]}
+        List<TransBean> list = new ArrayList<>();
+        try {
+            JSONObject jsonObject = new JSONObject(json);
+            int code = jsonObject.optInt("error_code", -1);
+            if (code == -1) {
+                JSONArray result = jsonObject.getJSONArray("trans_result");
+                for (int i = 0; i < result.length(); i++) {
+                    JSONObject object = result.optJSONObject(i);
+                    TransBean transBean = new TransBean();
+                    transBean.setSrc(object.optString("src", ""));
+                    transBean.setDst(object.optString("dst", ""));
+                    list.add(transBean);
+                }
+                return list;
+            } else {
+                return list;
+            }
+        } catch (Exception e) {
+            return list;
+        }
+    }
+}

+ 120 - 0
src/com/yanyi/translation/Md5Util.java

@@ -0,0 +1,120 @@
+package com.yanyi.translation;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @author YanYi
+ * @date 2019/3/27 11:44
+ * @email ben@yanyi.red
+ * @overview
+ */
+public class Md5Util {
+    // 首先初始化一个字符数组,用来存放每个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 (Exception e) {
+            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);
+
+    }
+
+}

+ 64 - 0
src/com/yanyi/translation/TransApi.java

@@ -0,0 +1,64 @@
+package com.yanyi.translation;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TransApi {
+    private static final String Language_Url = "http://api.fanyi.baidu.com/api/trans/vip/language";
+    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 HttpUtil.get(TRANS_API_HOST, params);
+    }
+
+    public String getLanguageResult(String query) {
+        Map<String, String> params = buildLanguage(query);
+        return HttpUtil.get(Language_Url, 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", Md5Util.md5(src));
+
+        return params;
+    }
+
+    private Map<String, String> buildLanguage(String query) {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("q", query);
+
+        params.put("appid", appid);
+
+        // 随机数
+        String salt = String.valueOf(System.currentTimeMillis());
+        params.put("salt", salt);
+
+        // 签名
+        String src = appid + query + salt + securityKey; // 加密前的原文
+        params.put("sign", Md5Util.md5(src));
+
+        return params;
+    }
+
+}

+ 28 - 0
src/com/yanyi/translation/TransBean.java

@@ -0,0 +1,28 @@
+package com.yanyi.translation;
+
+/**
+ * @author YanYi
+ * @date 2019/3/27 14:23
+ * @email ben@yanyi.red
+ * @overview
+ */
+class TransBean {
+    private String src;
+    private String dst;
+
+    public String getSrc() {
+        return src;
+    }
+
+    public void setSrc(String src) {
+        this.src = src;
+    }
+
+    public String getDst() {
+        return dst;
+    }
+
+    public void setDst(String dst) {
+        this.dst = dst;
+    }
+}

+ 65 - 0
src/com/yanyi/translation/Translation.java

@@ -0,0 +1,65 @@
+package com.yanyi.translation;
+
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.ui.Messages;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author YanYi
+ * @date 2019/3/27 11:28
+ * @email ben@yanyi.red
+ * @overview
+ */
+public class Translation extends AnAction {
+    private static final String APP_ID = "20181221000250890";
+    private static final String SECURITY_KEY = "TfP62BRxA7t1QNiyWxAE";
+
+    @Override
+    public void actionPerformed(AnActionEvent e) {
+        String text = Messages.showInputDialog("请输入要翻译的内容", "提示", Messages.getQuestionIcon());
+        trans(text);
+    }
+
+    private void trans(String text) {
+        if (text != null && !text.isEmpty()) {
+            TransApi transApi = new TransApi(APP_ID, SECURITY_KEY);
+            String languageResult = transApi.getLanguageResult(text);
+            String language = JsonUtil.jsonToLanguage(languageResult);
+            if (language != null && !language.isEmpty()) {
+                List<TransBean> list = new ArrayList<>();
+                if (language.equals("zh")) {
+                    list.addAll(JsonUtil.jsonToTrans(transApi.getTransResult(text, "auto", "en")));
+                } else {
+                    list.addAll(JsonUtil.jsonToTrans(transApi.getTransResult(text, "auto", "zh")));
+                }
+                if (!list.isEmpty()) {
+                    StringBuilder str = new StringBuilder();
+                    for (TransBean transBean : list) {
+                        if (transBean.getSrc() != null && !transBean.getSrc().isEmpty() && transBean.getSrc().equals(text)) {
+                            str.append(transBean.getDst()).append(";");
+                        }
+                    }
+                    str.deleteCharAt(str.length() - 1);
+                    show(text, str.toString());
+                } else {
+                    show(text, "翻译失败");
+                }
+            } else {
+                show(text, "翻译失败");
+            }
+        }
+    }
+
+    private void show(String text, String msg) {
+        //这个回调是线程里面的,所以要加个方法,不然会报错
+//        ApplicationManager.getApplication().invokeLater(() -> {
+            //弹出翻译结果对话框
+            String str = Messages.showInputDialog(text, "翻译结果", Messages.getInformationIcon(), msg, null);
+            trans(str);
+//        });
+    }
+}