控制台上简单翻译功能实现

223 阅读2分钟

本功能原为第三届字节跳动青训营中的go语言案例实践,这里用java语言进行实现

1、功能展示

在控制台输入英文单词,可以返回其翻译

image.png

2、功能实现

这里采用彩云小译作为数据源。

原理:在网站中输入单词进行翻译,会向其后台发送http请求,并以json形式返回翻译,只需要在终端模拟这一过程即可。

2.1、发送请求

public static String send(String word) throws Exception {
    URL url = new URL("https://api.interpreter.caiyunai.com/v1/dict");
    HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
    httpConn.setRequestMethod("POST");

    httpConn.setRequestProperty("authority", "api.interpreter.caiyunai.com");
    httpConn.setRequestProperty("accept", "application/json, text/plain, */*");
    httpConn.setRequestProperty("accept-language", "zh-CN,zh;q=0.9");
    httpConn.setRequestProperty("app-name", "xy");
    httpConn.setRequestProperty("content-type", "application/json;charset=UTF-8");
    httpConn.setRequestProperty("origin", "https://fanyi.caiyunapp.com");
    httpConn.setRequestProperty("os-type", "web");
    httpConn.setRequestProperty("referer", "https://fanyi.caiyunapp.com/");
    httpConn.setRequestProperty("sec-ch-ua", "" Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"");
    httpConn.setRequestProperty("sec-ch-ua-mobile", "?0");
    httpConn.setRequestProperty("sec-ch-ua-platform", ""Windows"");
    httpConn.setRequestProperty("sec-fetch-dest", "empty");
    httpConn.setRequestProperty("sec-fetch-mode", "cors");
    httpConn.setRequestProperty("sec-fetch-site", "cross-site");
    httpConn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36");
    httpConn.setRequestProperty("x-authorization", "token:qgemv4jr1y38jyq6vhvi");

    httpConn.setDoOutput(true);
    OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
    writer.write("{"trans_type":"en2zh","source":""+word+""}");
    writer.flush();
    writer.close();
    httpConn.getOutputStream().close();

    InputStream responseStream = httpConn.getResponseCode() / 100 == 2
            ? httpConn.getInputStream()
            : httpConn.getErrorStream();
    Scanner s = new Scanner(responseStream).useDelimiter("\A");
    String response = s.hasNext() ? s.next() : "";
    return response;
}

这里可以通过转化工具curlconverter快速将网站的请求转化为java代码

image.png

2.2、将JSON转化为实体类

这里利用GSON将JSON字符串转化为具体的实体类对象

public static JsonRootBean parseJson(String response) {
    Gson gson = new Gson();
    JsonRootBean jsonRootBean = gson.fromJson(response, JsonRootBean.class);
    return jsonRootBean;
}

其中实体类对象可以通过转化工具json.cn来快速生成

image.png

需要指出的是,在转化过程中可能会出现不兼容的现象,如"en-us"字段在java中是不符合命名规范的,需要将其修改为"en_us",并且在字段上加上注解@SerializedName。

@SerializedName("en-us")
private String en_us;

2.3、显示翻译

根据生成的实体类可以根据需求给出翻译

public static void showMsg(JsonRootBean jsonRootBean) {
    try {
        System.out.println("原单词:"+jsonRootBean.getDictionary().getEntry());
        System.out.println("音标:"+jsonRootBean.getDictionary().getProns().getEn()+"(英),"
                +jsonRootBean.getDictionary().getProns().getEn_us()+"(美)");
        System.out.println("含义:");
        for (String explanation : jsonRootBean.getDictionary().getExplanations()) {
            System.out.println(explanation);
        }
    } catch (Exception e) {
        System.out.println("不存在该单词");
    }
}

一个简单的通过控制台实现翻译的功能就完成了