天天看點

[javafx] 多源翻譯工具 06.百度翻譯

作者:CC挑燈夜讀1谷

本節内容:

  • 添加百度翻譯
  • 額外内容:程式添加圖示

補充:

開發習慣:先完成功能,在功能确定之後,再去優化代碼

詳情

百度翻譯同樣需要申請 key

百度翻譯開放平台 (baidu.com) 翻譯參考文檔(有java版demo 代碼) :https://fanyi-api.baidu.com/doc/21

為了友善閱讀,翻譯結果建立 model

package dev.guu.fx.translate.box.baidu;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
public class BaiduRoot {
    private String from;
    private String to;

    private BaiduTransResult[] trans_result;
}
           
package dev.guu.fx.translate.box.baidu;


import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
public class BaiduTransResult {

    private String src;
    private String dst;
}
           

baidu翻譯 java 版

package dev.guu.fx.translate.box.baidu;


import dev.guu.kit.string.JsonKit;
import dev.guu.kit.string.StringKit;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDate;
import java.util.StringJoiner;

@Data
@Accessors(chain = true)
public class BaiduTranslate {
    static String salt = LocalDate.now().toString();
    static String appId = "替換為你的appId";

    static String token = "替換為你的密鑰";

    public static void main(String[] args) {
//        System.out.println(translate("我的"));

    }






    public static String translate(String q) {
        String str1 = appId + q + salt + token;
        String sign = md5(str1);

        String url = "https://fanyi-api.baidu.com/api/trans/vip/translate?";
        StringJoiner sj = new StringJoiner("&");
        boolean en = StringKit.isEn(q);
        sj.add("from=" + (en ? "en" : "zh"))
                .add("q=" + q)
                .add("to=" + (en ? "zh" : "en"))
                .add("appid=" + appId)
                .add("salt=" + salt)
                .add("sign=" + sign)
        ;
        url += sj.toString();
        System.out.println(url);
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .POST(HttpRequest.BodyPublishers.ofString("a"))
                .setHeader("Content-type", "application/json")
                .uri(URI.create(url)).build();
        try {
            HttpResponse<String> send = client.send(request, HttpResponse.BodyHandlers.ofString());
            String body = send.body();
            System.out.println(body);
            BaiduRoot baidu = JsonKit.toBean(body, BaiduRoot.class);
            return JsonKit.toJsonFormat(baidu);
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }


    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(StandardCharsets.UTF_8);
            // inputByteArray是輸入字元串轉換得到的位元組數組
            messageDigest.update(inputByteArray);
            // 轉換并傳回結果,也是位元組數組,包含16個元素
            byte[] resultByteArray = messageDigest.digest();
            // 字元數組轉換成字元串傳回
            return byteArrayToHex(resultByteArray);
        } catch (NoSuchAlgorithmException e) {
            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);

    }

}
           

程式輸出區域添加百度翻譯相關顯示

BoxMain.java

private void createOutput(Pane root) {

        HBox box = new HBox();
        root.getChildren().add(box);
        createYoudao(box);
        createBaidu(box);
    }



    private void createBaidu(HBox parent) {
        Label label = new Label("百度翻譯:");
        Button btn = new Button("翻譯");

        label.setFont(Font.font("微軟雅黑", 24));
        TextArea output = new TextArea();
        output.setPromptText("等待輸入...");
        output.setEditable(false);
        output.setFont(Font.font("宋體", 20));
        parent.getChildren().add(new VBox(label,btn, output));
        btn.setOnMouseClicked(e -> {
            String text = inputTextArea.getText();
            if (isBlank(text)) {
                output.setText("請輸入");
            } else {
                output.setText("翻譯中...");
                // fx的多線程 ,
                Platform.runLater(() -> {
                    String trans = BaiduTranslate.translate(text);
                    output.setText(trans);
                });

            }
        });

    }