ToB企服应用市场:ToB评测及商务社交产业平台

标题: 记一次重复造轮子(Obsidian 插件设置说明汉化) [打印本页]

作者: 数据人与超自然意识    时间: 2022-8-22 15:11
标题: 记一次重复造轮子(Obsidian 插件设置说明汉化)
杂谈 #Java脚本

因本人英语不好在使用Obsidian时,一些插件的设置英文多令人头痛。故有写一个的翻译插件介绍和设置脚本的想法。看到有些前人写的一下翻译方法,简直惨目忍睹。竟然要手动。这个应该写好到只需要一键就可以汉化的地步吗?
好吧。我承认这有些难度。翻译引擎就用有道的吧。我觉得它对专业名词的翻译准确度还是很高的。
这里不想详细写过程了,直接贴代码吧。以后有空再整合。
main.js处理代码:(用了FastJson里面的工具,需要导入)
  1. import com.alibaba.fastjson.JSON;
  2. import java.io.*;
  3. import java.util.LinkedList;
  4. import java.util.List;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7. /**
  8. * @author ShuangLian
  9. * @date 2022/7/4 1:07
  10. */
  11. public class test {
  12.     public static void main(String[] args) throws IOException {
  13.         // 需要翻译的插件对应的main.js文件
  14.         File file = new File("C:\\Users\\91324\\Documents\\Projects\\IdeaProjects\\Test-demo\\src\\test\\java\\cn\\lian\\main.js");
  15.         System.out.println(file.getAbsolutePath());
  16.         FileInputStream stream = new FileInputStream(file);
  17.         InputStreamReader reader = new InputStreamReader(stream);
  18.         BufferedReader bufferedReader = new BufferedReader(reader);
  19.         LinkedList<String> list = new LinkedList<>();
  20.         String line;
  21.         while ((line = bufferedReader.readLine()) != null) {
  22.             // 匹配要翻译的部分
  23.             String s_setName = "setName\\([^\\)]+\\)";
  24.             String s_addOption = "addOption\\([^\\)]+\\)";
  25.             String s_setDesc = "setDesc\\([^\\)]+\\)*"\\)";
  26.             String s_name = "name: ".*",";
  27.             // 使用正则查找匹配
  28.             List<String> linkedList;
  29.             if ((linkedList = find(s_setName, line)).size() != 0) {
  30.                 for (String s : linkedList) {
  31.                     list.add(s.substring(9, s.length() - 2));
  32.                 }
  33.             }
  34.             if ((linkedList = find(s_setDesc, line)).size() != 0) {
  35.                 for (String s : linkedList) {
  36.                     list.add(s.substring(9, s.length() - 2));
  37.                 }
  38.             }
  39.             if ((linkedList = find(s_addOption, line)).size() != 0) {
  40.                 for (String ss : linkedList) {
  41.                     String substring = ss.substring(10, ss.length() - 1);
  42.                     String[] split = substring.split(",");
  43.                     for (String s : split) {
  44.                         s = s.strip();
  45.                         list.add(s.substring(1, s.length() - 1));
  46.                     }
  47.                 }
  48.             }
  49.             if ((linkedList = find(s_name, line)).size() != 0) {
  50.                 for (String s : linkedList) {
  51.                     list.add(s.substring(7, s.length() - 2));
  52.                 }
  53.             }
  54.         }
  55.         System.out.println(list);
  56.         bufferedReader.close();
  57.         // 输出汉英对照.txt
  58.         File file1 = new File(".\\test2.txt");
  59.         FileOutputStream fileOutputStream = new FileOutputStream(file1);
  60.         // 指定输出文件编码为gbk,不知道为啥做替换插件的那个2b不使用UTF-8
  61.         OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "gbk");
  62. //        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
  63.         BufferedWriter writer = new BufferedWriter(outputStreamWriter);
  64.         for (String s : list) {
  65.             writer.append(s).append("\n");
  66.             String query = FanyiV3Demo.query(s);
  67.             String translation = JSON.parseObject(query).getJSONArray("translation").get(0).toString();
  68.             writer.append(translation).append("\n");
  69.         }
  70.         writer.flush();
  71.     }
  72.     public static List<String> find(String regex, String str) {
  73.         List<String> strings = new LinkedList<>();
  74.         Pattern p = Pattern.compile(regex);
  75.         Matcher matcher = p.matcher(str);
  76.         while (matcher.find()) {
  77.             String fundStr = str.substring(matcher.start(), matcher.end());
  78.             System.out.println(fundStr);
  79.             strings.add(fundStr);
  80.         }
  81.         return strings;
  82.     }
  83. }
复制代码
有道翻译Java SDK改装
[code]/** * @author ShuangLian * @date 2022/7/4 3:49 */import org.apache.http.Header;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 org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.*;import java.nio.charset.StandardCharsets;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.*;/** * 由有道提供,直接调用query方法即可 * 返回示例: * { *     "tSpeakUrl": "https://openapi.youdao.com/ttsapi?", *     "requestId": "afc14ed2-e6ca-49fe-8f8f-b36e6ff5bbaa", *     "query": "Preview on Hover for File Links", *     "translation": [ *         "预览悬停文件链接" *     ], *     "errorCode": "0", *     "dict": { *         "url": "yddict://m.youdao.com/dict?le=eng&q=Preview+on+Hover+for+File+Links" *     }, *     "webdict": { *         "url": "http://mobile.youdao.com/dict?le=eng&q=Preview+on+Hover+for+File+Links" *     }, *     "l": "en2zh-CHS", *     "isWord": false, *     "speakUrl": "https://openapi.youdao.com/ttsapi?" * } */public class FanyiV3Demo {    private static Logger logger = LoggerFactory.getLogger(FanyiV3Demo.class);    private static final String YOUDAO_URL = "https://openapi.youdao.com/api";        // 去有道查看,这里不能直接用    private static final String APP_KEY = "1fcc4";        //    private static final String APP_SECRET = "LgA5Wxpm60KP7nyuGp";    public static void main(String[] args) throws IOException {        Map params = new HashMap();        String q = "Decrease body font size";        String salt = String.valueOf(System.currentTimeMillis());        params.put("from", "en");        params.put("to", "zh-CHS");        params.put("signType", "v3");        String curtime = String.valueOf(System.currentTimeMillis() / 1000);        params.put("curtime", curtime);        String signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET;        String sign = getDigest(signStr);        params.put("appKey", APP_KEY);        params.put("q", q);        params.put("salt", salt);        params.put("sign", sign);        params.put("vocabId", "您的用户词表ID");        /** 处理结果 */        requestForHttp(YOUDAO_URL, params);    }    public static String query(String Str) throws IOException {        Map params = new HashMap();        String q = Str;        String salt = String.valueOf(System.currentTimeMillis());        params.put("from", "en");        params.put("to", "zh-CHS");        params.put("signType", "v3");        String curtime = String.valueOf(System.currentTimeMillis() / 1000);        params.put("curtime", curtime);        String signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET;        String sign = getDigest(signStr);        params.put("appKey", APP_KEY);        params.put("q", q);        params.put("salt", salt);        params.put("sign", sign);        params.put("vocabId", "您的用户词表ID");        /** 处理结果 */        return requestForHttp(YOUDAO_URL, params);    }    public static String requestForHttp(String url, Map params) throws IOException {        String json = null;        /** 创建HttpClient */        CloseableHttpClient httpClient = HttpClients.createDefault();        /** httpPost */        HttpPost httpPost = new HttpPost(url);        List paramsList = new ArrayList();        Iterator it = params.entrySet().iterator();        while (it.hasNext()) {            Map.Entry en = it.next();            String key = en.getKey();            String value = en.getValue();            paramsList.add(new BasicNameValuePair(key, value));        }        httpPost.setEntity(new UrlEncodedFormEntity(paramsList, "UTF-8"));        CloseableHttpResponse httpResponse = httpClient.execute(httpPost);        try {            Header[] contentType = httpResponse.getHeaders("Content-Type");            logger.info("Content-Type:" + contentType[0].getValue());            if ("audio/mp3".equals(contentType[0].getValue())) {                //如果响应是wav                HttpEntity httpEntity = httpResponse.getEntity();                ByteArrayOutputStream baos = new ByteArrayOutputStream();                httpResponse.getEntity().writeTo(baos);                byte[] result = baos.toByteArray();                EntityUtils.consume(httpEntity);                if (result != null) {//合成成功                    String file = "合成的音频存储路径" + System.currentTimeMillis() + ".mp3";                    byte2File(result, file);                }            } else {                /** 响应不是音频流,直接显示结果 */                HttpEntity httpEntity = httpResponse.getEntity();                json = EntityUtils.toString(httpEntity, "UTF-8");                EntityUtils.consume(httpEntity);                logger.info(json);                System.out.println(json);            }        } finally {            try {                if (httpResponse != null) {                    httpResponse.close();                }            } catch (IOException e) {                logger.info("## release resouce error ##" + e);            }        }        return json;    }    /**     * 生成加密字段     */    public static String getDigest(String string) {        if (string == null) {            return null;        }        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};        byte[] btInput = string.getBytes(StandardCharsets.UTF_8);        try {            MessageDigest mdInst = MessageDigest.getInstance("SHA-256");            mdInst.update(btInput);            byte[] md = mdInst.digest();            int j = md.length;            char str[] = new char[j * 2];            int k = 0;            for (byte byte0 : md) {                str[k++] = hexDigits[byte0 >>> 4 & 0xf];                str[k++] = hexDigits[byte0 & 0xf];            }            return new String(str);        } catch (NoSuchAlgorithmException e) {            return null;        }    }    /**     * @param result 音频字节流     * @param file   存储路径     */    private static void byte2File(byte[] result, String file) {        File audioFile = new File(file);        FileOutputStream fos = null;        try {            fos = new FileOutputStream(audioFile);            fos.write(result);        } catch (Exception e) {            logger.info(e.toString());        } finally {            if (fos != null) {                try {                    fos.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    public static String truncate(String q) {        if (q == null) {            return null;        }        int len = q.length();        String result;        return len




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4