Java调用百度翻译API和调用有道翻译API进行翻译

目录

界面编写

调用百度API

调用有道API

源代码


界面编写

我们首先需要设计出这个翻译程序的GUI界面,我们写一个类继承自JFrame类,用来展示程序的主窗口,设置好窗口的名称和大小,设置在关闭窗口时终止程序,为了界面的美观,我们将布局设置为流式布局,居中对齐。

接下来准备使用四个panel作为容器让整个界面分为四行。

首先第一行显示中文原文的label和输入框,以及一个翻译按钮。

第二行显示百度翻译label和一行用于显示百度翻译后的译文的文本显示框。

类似的,第三行显示有道翻译label和文本显示框。

最后一行显示相同部分的label和文本显示框。

最后在主函数上,在Swing事件调度线程上执行窗口的显示,这里为了方便,使用了一个lambda匿名函数。

运行程序看看显示的效果,可见美观性还是具有的,因为其实我们是经过多次测试确定下来窗口的大小和组件的长度,使得整个页面看起来比较整齐。

调用百度API

接下来我们需要调用翻译API实现功能。

首先使用百度账号登录百度翻译开发平台,百度翻译开放平台 (baidu.com),注册成为开发者。

然后在百度翻译开放平台 (baidu.com)开通通用翻译API服务。

选择开通标准版就行。

稍微写一下申请表格。

然后在管理控制台就可以看到调用API所需要的APP ID和密钥。

根据官方文档通用翻译API接入文档的教程,我们需要拼接出请求参数加密,这里可以借助百度写好的DEMO,下载Java版本的demo。

解压后将包com放到我们的项目源码目录下。

然后在项目中导入这个包。

然后通过传入APP ID和密钥调用API将中文翻译成英文。

我们给点击按钮添加一个监听事件,当按钮被点击时执行这个lambda匿名函数,在函数中将百度翻译的文本显示在文本框上。

运行程序测试一下百度翻译,这个返回的结果貌似不是我们想要的理想结果。

通过查阅官方文档知道返回的结果是一个JSON对象。

Java中并没有内置JSON的解析,如果要处理JSON必须要借助第三方库,我们这里可以简单的使用正则表达式来提取翻译结果。

再次运行程序,这个可以输出我们想要的翻译结果了。

调用有道API

同理,需要调用有道翻译API,我们需要进行类似的流程操作。

在有道智云 (youdao.com)注册成为开发者。

然后创建应用。

创建完应用后就可以查看到应用ID和应用密钥了。

同样下载有道写好的Java版本demo下来。

我们把有道的软件包放到项目中,和百度的软件包放在一起。

然后把pom.xml也放到项目目录下,点击加载maven项目,将软件包里面的TranslateDemo.java拉出来放到项目源代码目录下,重命名为YouDaoAPI.java,我们将修改这个程序。

首先添加YouDaoAPI的构造函数,为应用ID和应用密钥赋值。

然后将创建请求参数的函数修改为通过传入参数设置请求参数。

最后把主函数修改为对外的翻译接口,通过传入的原文和原语言与目标翻译语言调用创建请求参数函数,返回请求相应。

然后通过传入APP ID和密钥调用API将中文翻译成英文。

同样的,我们通过正则表达式来提取翻译结果。

运行程序,可见翻译成功。

源代码

TranslationDemo.java

import javax.swing.*;
import java.awt.*;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.baidu.translate.demo.TransApi;

public class TranslationDemo extends JFrame {
    private JLabel inputLabel, baiduLabel, youdaoLabel, commonLabel;
    private JTextField inputText, baiduTranslation, youdaoTranslation, commonTextArea;
    private JButton translateButton;

    public TranslationDemo() {
        setTitle("中译英 Demo");
        setSize(500, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout(1));
        inputLabel = new JLabel("中文原文:");
        inputText = new JTextField(33);
        translateButton = new JButton("翻译");
        JPanel panel1 = new JPanel();
        panel1.add(inputLabel);
        panel1.add(inputText);
        panel1.add(translateButton);
        add(panel1);
        baiduLabel = new JLabel("百度翻译:");
        baiduTranslation = new JTextField(40);
        baiduTranslation.setEditable(false);
        JPanel panel2 = new JPanel();
        panel2.add(baiduLabel);
        panel2.add(baiduTranslation);
        add(panel2);
        youdaoLabel = new JLabel("有道翻译:");
        youdaoTranslation = new JTextField(40);
        youdaoTranslation.setEditable(false);
        JPanel panel3 = new JPanel();
        panel3.add(youdaoLabel);
        panel3.add(youdaoTranslation);
        add(panel3);
        commonLabel = new JLabel("相同部分:");
        commonTextArea = new JTextField(40);
        commonTextArea.setEditable(false);
        JPanel panel4 = new JPanel();
        panel4.add(commonLabel);
        panel4.add(commonTextArea);
        add(panel4);
        translateButton.addActionListener(e -> {
            String inputText = this.inputText.getText();
            String outputBaidu, outputYouDao, same;
            try {
                outputBaidu = translateUsingBaidu(inputText);
                outputYouDao = translateUsingYoudao(inputText);
            } catch (UnsupportedEncodingException | NoSuchAlgorithmException ex) {
                throw new RuntimeException(ex);
            }
            Pattern pattern = Pattern.compile("\"dst\":\"(.*?)\"");
            Matcher matcher = pattern.matcher(outputBaidu);
            if (matcher.find())
                outputBaidu = matcher.group(1);
            baiduTranslation.setText(outputBaidu);
            pattern = Pattern.compile( "\"translation\":\\[\"(.*?)\"\\]");
            matcher = pattern.matcher(outputYouDao);
            if (matcher.find())
                outputYouDao = matcher.group(1);
            youdaoTranslation.setText(outputYouDao);
            commonTextArea.setText(findCommonPart(outputBaidu, outputYouDao));
        });
    }

    private String translateUsingBaidu(String text) throws UnsupportedEncodingException {    // 调用百度翻译API进行翻译
        TransApi api = new TransApi("", "");
        return api.getTransResult(text, "zh", "en");
    }


    private String translateUsingYoudao(String text) throws NoSuchAlgorithmException {    // 调用有道翻译API进行翻译
        YouDaoAPI api = new YouDaoAPI("", "");
        return api.getTransResult(text, "zh", "en");
    }

    private String findCommonPart(String text1, String text2) {    // 比较两个翻译结果,找出相同部分
        String[] baidu = text1.split("[ ,.]");
        String[] youdao = text2.split("[ ,.]");
        StringBuilder common = new StringBuilder();
        for (String a : baidu) {
            for (String b : youdao) {
                if (Objects.equals(a, b)) {
                    common.append(a).append(" ");
                }
            }
        }
        return common.toString();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            TranslationDemo demo = new TranslationDemo();
            demo.setVisible(true);
        });
    }
}

YouDaoAPI.java

import com.youdao.aicloud.translate.utils.AuthV3Util;
import com.youdao.aicloud.translate.utils.HttpUtil;

import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

/**
 * 网易有道智云翻译服务api调用demo
 * api接口: https://openapi.youdao.com/api
 */
public class YouDaoAPI {

    private static String APP_KEY = "";     // 您的应用ID
    private static String APP_SECRET = "";  // 您的应用密钥

    public YouDaoAPI(String appid, String securityKey) {
        APP_KEY = appid;
        APP_SECRET = securityKey;
    }

    public String getTransResult(String query, String from, String to) throws NoSuchAlgorithmException {
        // 添加请求参数
        Map<String, String[]> params = createRequestParams(query, from, to);
        // 添加鉴权相关参数
        AuthV3Util.addAuthParams(APP_KEY, APP_SECRET, params);
        // 请求api服务
        byte[] result = HttpUtil.doPost("https://openapi.youdao.com/api", null, params, "application/json");
        return new String(result, StandardCharsets.UTF_8);
    }

    private static Map<String, String[]> createRequestParams(String query, String from, String to) {
        return new HashMap<String, String[]>() {{
            put("q", new String[]{query});
            put("from", new String[]{from});
            put("to", new String[]{to});
        }};
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/241680.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React Native:入门知识了解

什么是React Native React Native&#xff08;简称RN&#xff09;是Facebook于2015年4月开源的跨平台移动应用开发框架&#xff0c;是Facebook早先开源的JS框架 React 在原生移动应用平台的衍生产物&#xff0c;目前支持iOS和安卓两大平台。React Native使用Javascript语言&am…

功能更新|免费敏捷工具Leangoo领歌私有部署新增第三方身份认证和API对接

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo支持敏捷研发管理全流程&#xff0c;包括小型团队敏捷开发&#xff0c;规模化敏捷SAFe&#xff0c;Scr…

windows数据备份方法

信息时代数据已成为个人及企业的重要资产&#xff0c;数据丢失或者损坏会带来无法弥补的损失。数据安全主要关注两个方面数据容灾和数据备份。容灾的目的是防止硬件发生错误&#xff0c;通过多个相同或类似硬件避免单一硬件故障造成的数据丢失。数据备份除了可以防止单一硬件错…

使用QT基于YMODEM协议实现串口文件发送(和xshell互通)

背景 项目需要用QT实现一个YMODEM文件传输的功能&#xff0c;目标下位机是MCU嵌入式设备&#xff0c;且下位机程序已经经过xshell传输文件的验证。 YMODEM 简介 YMODEM协议是一个文件传输协议&#xff0c;常用于嵌入式设备。本文不对YMODEM做过多的阐述&#xff0c;阅读需建…

Tomcat主配置文件(server.xml)详解

前言 Tomcat主配置文件&#xff08;server.xml&#xff09;是Tomcat服务器的主要配置文件&#xff0c;文件位置在conf目录下&#xff0c;它包含了Tomcat的全局配置信息&#xff0c;包括监听端口、虚拟主机、安全配置、连接器等。 目录 1 server.xml组件类别 2 组件介绍 3 se…

003 FeedForward前馈层

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17torch 1.13.1cu117torchvision 0.14.1cu117 二、前馈层原理 Transformer模型中的前馈层&#xff08;Feed Forward Layer&#xff09;是其关键组件之一&#xff0c;对于模型的性能起着重要作用。下面将用900字对…

cpp:1:10: fatal error: opencv2/core.hpp: 没有那个文件或目录

前言&#xff1a; 我按照官网方法安装了opencv&#xff0c;运行的也是官网的测试代码&#xff1a; #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> using namespace cv; int main() {printf("hello world")return 0; }

boost1.55 安装使用教程 windows

第一步 &#xff1a;首先在boost官网上下载库压缩包 添加链接描述 选择自己需要的版本进行下载 解压后执行booststrap.bat 用来生成创建b2.exe 和bjam.exe 拓展&#xff1a;.\b2 --help 了解一下有哪些参数可以配置 默认b2.exe编译后&#xff0c;链接到项目如果出现如下错误…

VLAN基本原理

目录 一、VLAN概念及优势 &#xff08;一&#xff09;基本理念 &#xff08;二&#xff09;VLAN的特点 二、VLAN ID 种类、范围及用途 &#xff08;一&#xff09;静态VLAN &#xff08;二&#xff09;动态VLAN &#xff08;三&#xff09;VLAN三种端口类型 &#xff0…

深入理解Java虚拟机---类加载机制

类加载机制 什么是类加载机制类加载的时机类加载的过程加载验证文件格式验证元数据验证字节码验证符号引用验证 准备解析初始化 类加载器双亲委派模型 什么是类加载机制 虚拟机把描述类的数据从 Class 文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff…

centOS安装bochsXshell连接centos启动可视化界面

centOS安装bochs 参考&#xff1a;https://blog.csdn.net/muzi_since/article/details/102559187 首先安装依赖环境&#xff1a; yum install gtk2 gtk2-devel yum install libXt libXt-devel yum install libXpm libXpm-devel yum install SDL SDL-devel yum install libXr…

已解决:No goals have been specified for this build. You must specify a vali

[ERROR] No goals have been specified for this build. You must specify a valiTOC 完整报错 No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format : or :[:]:. Available lifecycle phases are: pre-clean, c…

6. Service详解

6. Service详解 文章目录 6. Service详解6.1 Service介绍6.2 Service类型6.3 Service使用6.3.1 实验环境准备6.3.2 ClusterIP类型的Service6.3.3 HeadLess类型的Service6.3.3.1 deployment和statefulset区别6.3.3.2 statefulset deployment 区别 6.3.4 NodePort类型的Service6.…

Trace 在多线程异步体系下传递

JAVA 线程异步常见的实现方式有&#xff1a; new ThreadExecutorService 当然还有其他的&#xff0c;比如fork-join&#xff0c;这些下文会有提及&#xff0c;下面主要针对这两种场景结合 DDTrace 和 Springboot 下进行实践。 引入 DDTrace sdk <properties><java.…

湖农大邀请赛shell_rce漏洞复现

湖农大邀请赛 shell_rce 复现 在 2023 年湖南农业大学邀请赛的线上初赛中&#xff0c;有一道 shell_rce 题&#xff0c;本文将复现该题。 题目内容&#xff0c;打开即是代码&#xff1a; <?phpclass shell{public $exp;public function __destruct(){$str preg_replace…

Shopify怎么避免被封店?封店原因有哪些?

市场研究的一份报告显示&#xff0c;全球跨境电子商务市场预计到2028年将达到30422亿美元&#xff0c;其中&#xff0c;亚太地区是最大的跨境电商市场&#xff0c;据海关统计数据&#xff0c;近五年来&#xff0c;我国跨境电商进出口增长近10倍。跨境电商业务新的增长风口已经到…

图像去噪——PMRID训练自己数据集及推理测试(详细图文教程)

目录 一、源码包准备二、数据集准备2.1 提取数据集名称2.2 .txt报错问题2.2.1 正确格式2.2.2 错误格式 三、修改配置参数四、训练及保存模型权重4.1 训练4.2 保存模型权重文件 五、模型推理测试5.1 导入测试集5.2 测试5.3 测试结果5.3.1 测试场景15.3.2 测试场景2 5.4 推理速度…

jsp+servlet+图书交流平台 有filter过滤器

在线图书推荐与交流平台 随着数字化的进展和人们对持续学习的追求&#xff0c;在线资源变得越来越受欢迎。对于众多读者来说&#xff0c;找到合适的书籍和与其他读者交流阅读体验是非常有价值的。为了满足这一需求&#xff0c;我们提出了一个在线图书推荐与交流平台的设计。此…

千梦网创:赚钱就是服侍好双爹

“爹啊&#xff0c;我没钱用啦&#xff0c;给我啃一下。” 想赚钱&#xff0c;最快的方式就是啃爹。 不管你做什么项目&#xff0c;同行永远都是我们的爹。 跟着爹走&#xff0c;有吃有喝不用愁。 跟着老爹走&#xff0c;蛋花汤里加骨头。 小时候父亲总是把我们高高的举过…

查询mysql服务器当前时区设置、session当前时区设置

使用命令SELECT global.time_zone;可以查询mysql服务器的当前时区设置&#xff0c;例如&#xff1a; 使用命令SELECT session.time_zone;可以查询session的当前时区设置&#xff0c;例如&#xff1a;