使用百度翻译API或腾讯翻译API做一个小翻译工具

news2024/10/7 12:26:19

前言

书到用时方恨少,只能临时抱佛脚。英文pdf看不懂,压根看不懂。正好有百度翻译API和腾讯翻译API,就利用两个API自己写一个简单的翻译工具,充分利用资源,用的也放心。

前期准备

关键肯定是两大厂的翻译API,咱们只是做一个简单的应用,所以还没有API的同学可以申请一下。百度翻译API每个月有100万字符的免费额度,腾讯翻译API每个月有500万字符的免费额度,均指的是文本翻译。

百度翻译开放平台

腾讯云API

简单申请一下,获得两家或一家的id和key即可。

使用Python调用API

调用百度API:

利用百度翻译官方提供的调用demo,改写了一个包装类(Baidu_Text_transAPI.py),方便我们后续的调用。

包装类:

import requests
import random
from hashlib import md5


def make_md5(s, encoding='utf-8'):
    return md5(s.encode(encoding)).hexdigest()


class BaiduAPI:
    endpoint = 'http://api.fanyi.baidu.com'
    path = '/api/trans/vip/translate'
    url = endpoint + path

    def __init__(self):
        self._appid = None
        self._appkey = None

    @property
    def appid(self):
        return self._appid

    @appid.setter
    def appid(self, app_id):
        self._appid = app_id

    @property
    def appkey(self):
        return self._appkey

    @appkey.setter
    def appkey(self, app_key):
        self._appkey = app_key

    def translate(self, text, from_lang='auto', to_lang='zh'):
        salt = random.randint(32768, 65536)
        sign = make_md5(self.appid + text + str(salt) + self.appkey)

        # Build request
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        payload = {'appid': self.appid, 'q': text, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}

        # Send request
        r = requests.post(self.url, params=payload, headers=headers)
        result = r.json()

        # Show response
        # print(json.dumps(result, indent=4, ensure_ascii=False))
        return result["trans_result"][0]["dst"]

调用示例:

from Baidu_Text_transAPI import BaiduAPI

baidu_api = BaiduAPI()
baidu_api.appid = "xxxxxxxxx"
baidu_api.appkey = "xxxxxxxxx"
text = "hello"
print(baidu_api.translate(text))  # 剩余两个参数可以使用默认值,也可以指定

调用腾讯翻译API:

腾讯翻译官方提供了一个SDK,方便我们更加方便的调用,所以只需要简单的封装一下即可(Tencent_Text_transAPI.py)。

封装类:

from tencentcloud.common import credential
from tencentcloud.tmt.v20180321 import tmt_client, models


class TencentAPI:

    def __init__(self):
        self._cred = None
        self._client = None
        self._secret_id = None
        self._secret_key = None

    @property
    def secret_id(self):
        return self._secret_id

    @secret_id.setter
    def secret_id(self, s_id):
        self._secret_id = s_id

    @property
    def secret_key(self):
        return self._secret_key

    @secret_key.setter
    def secret_key(self, s_key):
        self._secret_key = s_key

    def create_client(self):
        # 设置API密钥和地域
        self._cred = credential.Credential(self.secret_id, self.secret_key)
        self._client = tmt_client.TmtClient(self._cred, "ap-guangzhou")

    def translate(self, text: str, from_lang='auto', to_lang='zh'):
        request = models.TextTranslateRequest()
        request.SourceText = text
        request.Source = from_lang
        request.Target = to_lang
        request.ProjectId = 0

        response = self._client.TextTranslate(request)
        return response.TargetText

调用示例:

from Tencent_Text_transAPI import TencentAPI

tencent_api = TencentAPI()
tencent_api.secret_id = "xxxxxxxxx"
tencent_api.secret_key = "xxxxxxxxx"
text = "hello"
print(tencent_api.translate(text))  # 剩余两个参数可以使用默认值,也可以指定

使用PyQt构建一个简单的页面

翻译的核心关键——调用API,已经熟悉了这个流程,那么接下来就是构建一个简单的页面(demo_config_json.py),方便使用。

界面完整代码:

import json
import sys
import time

import pyperclip
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QLabel, QTextEdit, QPushButton, QVBoxLayout, \
    QHBoxLayout

from Baidu_Text_transAPI import BaiduAPI
from Tencent_Text_transAPI import TencentAPI


class Worker(QThread):
    prev_text = pyqtSignal(str)
    pre_value = pyperclip.paste()  # 初始化

    def run(self):
        while True:
            # 读取剪贴板内容
            curr_text = pyperclip.paste()
            # print(self.pre_value)
            if curr_text != self.pre_value:
                # print([curr_text])
                self.prev_text.emit(curr_text)
            # 每1秒检查一次剪贴板内容
            time.sleep(1)


def read_json_file(file_path):
    with open(file_path, 'r') as f:
        data = json.load(f)
    return data


class Translator(QWidget):
    def __init__(self):
        super().__init__()
        self.th = None
        self.translateButton = None
        self.outputTextEdit = None
        self.outputLabel = None
        self.inputTextEdit = None
        self.inputLabel = None
        self.translatorComboBox = None
        self.translatorLabel = None
        self.baidu_api = None
        self.tencent_api = None
        self.tmp = None
        self.config = read_json_file('config.json')
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('翻译工具')
        self.setWindowIcon(QIcon('icon.png'))
        # 上方选择框
        self.translatorLabel = QLabel('翻译API:')
        self.translatorComboBox = QComboBox()

        # 百度翻译API设置
        self.translatorComboBox.addItem('百度翻译')
        self.baidu_api = BaiduAPI()
        self.baidu_api.appid = self.config['BaiduAPI']['id']
        self.baidu_api.appkey = self.config['BaiduAPI']['key']

        # 腾讯翻译API设置
        self.translatorComboBox.addItem('腾讯翻译')
        self.tencent_api = TencentAPI()
        self.tencent_api.secret_id = self.config['TencentAPI']['id']
        self.tencent_api.secret_key = self.config['TencentAPI']['key']
        self.tencent_api.create_client()

        translator_layout = QHBoxLayout()
        translator_layout.addWidget(self.translatorLabel)
        translator_layout.addWidget(self.translatorComboBox)

        # 中部输入输出框
        self.inputLabel = QLabel('输入文本:')
        self.inputTextEdit = QTextEdit()
        self.outputLabel = QLabel('翻译结果:')
        self.outputTextEdit = QTextEdit()
        input_output_layout = QHBoxLayout()
        input_output_layout_left = QVBoxLayout()
        input_output_layout_left.addWidget(self.inputLabel)
        input_output_layout_left.addWidget(self.inputTextEdit)
        input_output_layout_right = QVBoxLayout()
        input_output_layout_right.addWidget(self.outputLabel)
        input_output_layout_right.addWidget(self.outputTextEdit)
        input_output_layout.addLayout(input_output_layout_left)
        input_output_layout.addLayout(input_output_layout_right)

        # 下方翻译按钮
        self.translateButton = QPushButton('翻译')
        translate_layout = QHBoxLayout()
        translate_layout.addStretch(1)
        translate_layout.addWidget(self.translateButton)
        translate_layout.addStretch(1)

        # 整体布局
        main_layout = QVBoxLayout()
        main_layout.addLayout(translator_layout)
        main_layout.addLayout(input_output_layout)
        main_layout.addLayout(translate_layout)
        self.setLayout(main_layout)

        # 信号槽连接
        self.translateButton.clicked.connect(self.translate_text)

        # 设置窗口属性
        self.setWindowFlags(Qt.WindowStaysOnTopHint)  # 窗口总在最高层
        self.setGeometry(300, 300, 800, 450)  # 设置窗口大小和位置

        self.th = Worker()
        # self.th.update_date.connect(self.show_date)
        self.th.prev_text.connect(self.handle_signal)
        self.th.start()

        self.show()

    def handle_signal(self, value):
        self.th.pre_value = value
        self.tmp = " ".join(value.split("\n"))
        self.tmp = self.tmp.replace('\r', "", self.tmp.count('\r'))
        self.inputTextEdit.setText(" ".join(self.tmp.split("\r")))
        # print([" ".join(self.tmp.split("\r"))])

    def translate_text(self):
        text = self.inputTextEdit.toPlainText()
        # 根据选择框调用不同的API进行翻译
        if self.translatorComboBox.currentText() == '百度翻译':
            # 调用百度翻译API进行翻译
            # print("百度")
            self.outputTextEdit.setText(
                self.baidu_api.translate(text, from_lang=self.config['from_lang'], to_lang=self.config['to_lang']))
        elif self.translatorComboBox.currentText() == '腾讯翻译':
            # 调用腾讯翻译API进行翻译
            self.outputTextEdit.setText(
                self.tencent_api.translate(text, from_lang=self.config['from_lang'], to_lang=self.config['to_lang']))
            # print("腾讯")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    translator = Translator()
    sys.exit(app.exec_())

使用pyperclip监控剪切板:

为了在体验上有一定的优化,使用pyperclip库监控剪切板的变化,并自动读取最新的复制内容。

class Worker(QThread):
    prev_text = pyqtSignal(str)
    pre_value = pyperclip.paste()  # 初始化

    def run(self):
        while True:
            # 读取剪贴板内容
            curr_text = pyperclip.paste()
            # print(self.pre_value)
            if curr_text != self.pre_value:
                # print([curr_text])
                self.prev_text.emit(curr_text)
            # 每1秒检查一次剪贴板内容
            time.sleep(1)

并且因为存在while True,所以使用QThread,防止阻塞界面。

self.th = Worker()
# self.th.update_date.connect(self.show_date)
self.th.prev_text.connect(self.handle_signal)
self.th.start()

在config.json内填入相关配置:

同级目录下创建config.json,填入相关配置,包括目标语言,API的id和key,才能正常使用。

{
  "from_lang": "auto",
  "to_lang": "zh",
  "BaiduAPI": {
    "id": "xxxxxxxxxxxxxxxx",
    "key": "xxxxxxxxxxxxxxxx"
  },
  "TencentAPI": {
    "id": "xxxxxxxxxxxxxxxx",
    "key": "xxxxxxxxxxxxxxxx"
  }
}

 使用Pyinstaller打包

如果不想每次都执行python demo_config_json.py来运行,可以自己编写.bat脚本或者使用Pyinstaller进行打包。

详细的打包流程,大家可以去找相关博客,也可以使用如下配置文件:

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

# 所有需要打包的.py文件
file = [
        'demo_config_json.py',
        'Baidu_Text_transAPI.py',
        'Tencent_Text_transAPI.py'
        ]

a = Analysis(file,
             pathex=['D:\\Projects\\Python\\Test'],  # 项目绝对路径
             binaries=[],
             datas=[("icon.png", "."), ("config.json", ".")],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='Baicent',  # exe的名称
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False,  #console=True表示,打包后的可执行文件双击运行时屏幕会出现一个cmd窗口,不影响原程序运行,如不需要执行窗口,改成False即可
          icon='D:\\Projects\\Python\\Test\\favicon.ico') #程序图标的绝对路径

参考博客:python3_将多个.py文件打包成exe程序并添加图标_python打包带图标-CSDN博客

效果及完整项目代码

界面效果:

觉得界面简陋的同学也可以自行构建界面,反正核心就是调API,总体没啥技术难度

完整项目代码: 

gitee:项目代码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer笔记

Transformer encoder-decoder架构 Encoder:将输入序列转换为一个连续向量空间中的表示。Encoder通常是一个循环神经网络(RNN)或者卷积神经网络(CNN),通过对输入序列中的每个元素进行编码,得到…

spass-二元变量相关分析

基础概念 计算相关系数r&#xff1a;利用样本数据计算样本相关系数&#xff0c;样本相关系数反映了两变量间线性相关程度的强弱。相关系数的取值范围界于-1与1之间&#xff0c;即-1≤r≤1 当0<r ≤ 1&#xff0c;表明变量之间存在正相关关系&#xff1b; 当-1 ≤ r…

pythongui实时闹钟

# codinggbk import tkinter as tk from time import strftime# 创建一个主窗口 root tk.Tk() root.title("实时闹钟")# 设置窗口的大小不可变 root.resizable(False, False)# 设置窗口始终保持在最上层 root.attributes(-topmost, True)# 更新时间的函数 def time(…

038、语义分割

之——介绍与数据集 杂谈 语义分割&#xff0c;语义分割(Semantic Segmentation)方法-CSDN博客&#xff1a; 语义分割是计算机视觉领域的一项重要任务&#xff0c;旨在将图像中的每个像素分配到其对应的语义类别中。与物体检测或图像分类不同&#xff0c;语义分割不仅要识别图像…

linux网络——HTTPS加密原理

目录 一.HTTPS概述 二.概念准备 三.为什么要加密 四.常⻅的加密⽅式 1.对称加密 2.⾮对称加密 五.数据摘要&#xff0c;数字签名 六.HTTPS的加密过程探究 1.方案一——只使用对称加密 2.方案二——只使⽤⾮对称加密 3.方案三——双⽅都使⽤⾮对称加密 4.方案四——⾮…

元素水平垂直居中

方法一&#xff1a;定位transform 方法二&#xff1a;flex布局 方法三&#xff1a;定位margin【需要child 元素自身的宽高】 相关HTML代码&#xff1a; <div class"parent"><div class"child"></div> </div> 方法一&#xff1a…

许多网友可能还不知道,升级到Windows 11其实没那么复杂,只要符合几个条件可以了

如果你的Windows 10电脑可以升级Windows 11,现在怎么办?有几种方法可以免费安装新的操作系统。以下是你的选择。 如果你想升级到Windows 11,你可以随时购买一台已经安装了操作系统的新电脑。然而,如果你目前的Windows 10 PC满足所有必要的升级要求,那么在Windows 11免费的…

AIRLOOK与商汤科技强强联合,打造“实景三维与AI大模型”结合的全新盛宴

实景三维中国建设作为数字中国建设的重要内容之一&#xff0c;是一项涉及多方面技术支撑的综合性工程&#xff0c;同时作为AI技术在其中发挥着至关重要的作用&#xff0c;AI大模型的发展也将进一步推动实景三维建模技术的创新和发展。在此背景下&#xff0c;AIRLOOK与商汤科技携…

AUTODL云服务器使用大致步骤(适合本人版)

(一)在官网上创建一个服务器 (二)远程连接指令&#xff1a; 改为&#xff1a; (三)连接后&#xff0c;可在中进行代码运行 输入一些指令 python ......

Backtrader绘图cerebro.plot报错问题的处理

Backtrader绘图cerebro.plot报错问题的处理 1.问题描述 在jupyter 中使用BackTrader &#xff0c;使用绘图功能时&#xff1a; cerebro.plot() 提示错误&#xff1a;ValueError: Axis limits cannot be NaN or Inf 由于backtrader 要求有7列数据&#xff0c;最后一列openint…

Halcon (5):Halcon Solution Guide I basics 导论解析

文章目录 文章专栏前言文章目录翻译文档的说明 结论 文章专栏 Halcon开发 前言 今天开始看Halcon的官方文档。由于市面上的教学主要是以基础的语法&#xff0c;算子简单介绍为主。所以我还是得看官方的文本。别的不多说了。有道词英语词典&#xff0c;启动。 还有就是今天LOL…

Python基础:错误和异常

在Python中的错误可&#xff08;至少&#xff09;被分为两种&#xff1a;语法错误和 异常&#xff0c;均是指在程序中发生的问题和意外情况。Python提供了异常处理机制&#xff0c;使程序能够更容易地应对这些问题。 1. 语法错误&#xff08;Syntax Error&#xff09; 语法错误…

C++算法入门练习——树的带权路径长度

现有一棵n个结点的树&#xff08;结点编号为从0到n-1&#xff0c;根结点为0号结点&#xff09;&#xff0c;每个结点有各自的权值w。 结点的路径长度是指&#xff0c;从根结点到该结点的边数&#xff1b;结点的带权路径长度是指&#xff0c;结点权值乘以结点的路径长度&#x…

前端必备工具

一、百度Ai功能合集 https://chat.baidu.com/ 二、超级复制 这是一个edge插件&#xff0c;那些禁止复制的文本&#xff0c;用这个插件点一下图标&#xff0c;会把当前网页解除禁止复制。 三、集中工具箱 例如一键抠图&#xff0c;感觉还可以&#xff1a; 四、代码漂亮截图 几…

七、文件包含漏洞

一、文件包含漏洞 解释&#xff1a;文件包含漏洞是一种注入型漏洞&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务端执行&#xff1b;其还能够使得服务器上的源代码被读取&#xff0c;在PHP里面我们把可重复使用的函数写入到单个文件中&#x…

三菱PLC 模拟量输出模拟量转换功能块S_RTI(内嵌ST)

模拟量输出模拟量转换功能块S_RTI算法原理和公式介绍请参考下面文章链接: PLC模拟量输出 模拟量转换FC S_RTI-CSDN博客文章浏览阅读5.3k次,点赞2次,收藏11次。1、本文主要展示西门子博途模拟量输出转换的几种方法, 方法1:先展示下自编FC:计算公式如下:intput intput Rea…

linux 定时执行脚本

先写一个简单的shell脚本用来测试定时执行脚本 [rootVM-12-12-centos wz]# cat shell_cron_test.sh #!/bin/bashif [ -f "/home/wz/cron_test.txt" ];thennum$(($(wc -l /home/wz/cron_test.txt | cut -d -f 1)1))elsenum1 fi echo "$(date "%y-%m-%d …

在线代码调试运行微信开放平台官方接口调试校验工具大全

具体前往&#xff1a;在线代码调试&API校验工具大全

【实用技巧】更改ArduinoIDE默认库文件位置,解放系统盘,将Arduino15中的库文件移动到其他磁盘

本文主要介绍更改Arduino IDE &#xff08;含2.0以上版本&#xff09;默认库文件位置的方法。 原创文章&#xff0c;转载请注明出处&#xff1a; 【实用技巧】更改ArduinoIDE默认库文件位置&#xff0c;解放C盘&#xff0c;将Arduino15中的库文件移动到其他磁盘-CSDN博客文章浏…