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

前言

书到用时方恨少,只能临时抱佛脚。英文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 md5def 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 + pathdef __init__(self):self._appid = Noneself._appkey = None@propertydef appid(self):return self._appid@appid.setterdef appid(self, app_id):self._appid = app_id@propertydef appkey(self):return self._appkey@appkey.setterdef appkey(self, app_key):self._appkey = app_keydef 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 requestheaders = {'Content-Type': 'application/x-www-form-urlencoded'}payload = {'appid': self.appid, 'q': text, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}# Send requestr = 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 BaiduAPIbaidu_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, modelsclass TencentAPI:def __init__(self):self._cred = Noneself._client = Noneself._secret_id = Noneself._secret_key = None@propertydef secret_id(self):return self._secret_id@secret_id.setterdef secret_id(self, s_id):self._secret_id = s_id@propertydef secret_key(self):return self._secret_key@secret_key.setterdef secret_key(self, s_key):self._secret_key = s_keydef 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 = textrequest.Source = from_langrequest.Target = to_langrequest.ProjectId = 0response = self._client.TextTranslate(request)return response.TargetText

调用示例:

from Tencent_Text_transAPI import TencentAPItencent_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 timeimport pyperclip
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QLabel, QTextEdit, QPushButton, QVBoxLayout, \QHBoxLayoutfrom Baidu_Text_transAPI import BaiduAPI
from Tencent_Text_transAPI import TencentAPIclass 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 dataclass Translator(QWidget):def __init__(self):super().__init__()self.th = Noneself.translateButton = Noneself.outputTextEdit = Noneself.outputLabel = Noneself.inputTextEdit = Noneself.inputLabel = Noneself.translatorComboBox = Noneself.translatorLabel = Noneself.baidu_api = Noneself.tencent_api = Noneself.tmp = Noneself.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 = valueself.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.mzph.cn/news/148044.shtml

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

相关文章

IDEA 集成 Docker 插件一键部署 SpringBoot 应用

目录 前言IDEA 安装 Docker 插件配置 Docker 远程服务器编写 DockerFileSpringBoot 部署配置SpringBoot 项目部署结语 前言 随着容器化技术的崛起,Docker成为了现代软件开发的关键工具。在Java开发中,Spring Boot是一款备受青睐的框架,然而&…

kubenetes-服务发现和负载均衡

一、服务发布 kubenetes把服务发布至集群内部或者外部,服务的三种不同类型: ClusterlPNodePortLoadBalancer ClusterIP是发布至集群内部的一个虚拟IP,通过负载均衡技术转发到不同的pod中。 NodePort解决的是集群外部访问的问题,用户可能不…

debian 修改镜像源为阿里云【详细步骤】

文章目录 修改步骤第 1 步:安装 vim 软件第 2 步:备份源第 3 步:修改为阿里云镜像参考👉 背景:在 Docker 中安装了 jenkins 容器。查看系统,发现是 debian 11(bullseye)。 👉 目标:修改 debian bullseye 的镜像为阿里云镜像,加速软件安装。 修改步骤 第 1 步:…

限制Domain Admin登录非域控服务器和用户计算机

限制Domain Admin管理员使用敏感管理员帐户(域或林中管理员组、域管理员组和企业管理员组中的成员帐户)登录到信任度较低的服务器和用户端计算机。 此限制可防止管理员通过登录到信任度较低的计算机来无意中增加凭据被盗的风险。 建议采用的策略 建议使用以下策略限制对信任度…

SPASS-偏相关分析

基本概念 偏相关分析的任务就是在研究两个变量之间的线性相关关系时控制可能对其产生影响的变量,这种相关系数称为偏相关系数。偏相关系数的数值和简单相关系数的数值常常是不同的,在计算简单相关系数时,所有其他自变量不予考虑。 统计原理 控制一个变量和控制两个变量的偏…

Python winreg将cmd/PowerShell(管理员)添加到右键菜单

效果 1. 脚本 用管理员权限运行,重复执行会起到覆盖效果(根据sub_key)。 icon自己设置。text可以自定义。sub_key可以改但不推荐(避免改成和系统已有项冲突的)。command不要改。 from winreg import *registry r&q…

ubuntu20.04安装cv2

查看ubuntu的版本 cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE20.04 DISTRIB_CODENAMEfocal DISTRIB_DESCRIPTION"Ubuntu 20.04.3 LTS"更改镜像源 cp /etc/apt/sources.list /etc/apt/sources.list.bak cat > /etc/apt/sources.listdeb http://mirr…

使用Docker部署Python Flask应用的完整教程

一、引言 Docker是一种开源的容器化平台,可以将应用程序及其依赖项打包成一个独立的容器,实现快速部署和跨平台运行。本文将详细介绍如何使用Docker来部署Python Flask应用程序,帮助开发者更高效地构建和部署应用。 二、准备工作 在开始之前…

4-flask-cbv源码、Jinja2模板、请求响应、flask中的session、flask项目参考

1 flask中cbv源码 2 Jinja2模板 3 请求响应 4 flask中的session 5 flask项目参考 1 flask中cbv源码 ***flask的官网文档:***https://flask.palletsprojects.com/en/3.0.x/views/1 cbv源码执行流程1 请求来了,路由匹配成功---》执行ItemAPI.as_view(item…

软件质量保护与测试(第2版)学习总结第十三章 集成测试

很多人都认为微软是一家软件开发公司,事实上我们是一家软件测试公司。 ---比尔盖茨 集成测试是在单元测试的基础上将多个模块组合在一起进行测试的过程。 13.1.1 区别 单元测试主要关注模块内部,系统测试则是在用户的角度来评价系统&#xff…

Pikachu漏洞练习平台之XXE(XML外部实体注入)

目录 什么是 XML? 什么是DTD? 什么是XEE? 常见payload 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language); XML 不会做任何事情,而是用来结构化、存储以及传输信息…

10、背景分离 —— 大津算法

上一节学习了通过一些传统计算机视觉算法,比如Canny算法来完成一个图片的边缘检测,从而可以区分出图像的边缘。 今天再看一个视觉中更常见的应用,那就是把图片的前景和背景的分离。 前景和背景 先看看什么是前景什么是背景。 在图像处理和计算机视觉中,"前景"…

CTFhub-RCE-过滤空格

1. 查看当前目录&#xff1a;127.0.0.1|ls 2. 查看 flag_890277429145.php 127.0.0.1|cat flag_890277429145.php 根据题目可以知道空格被过滤掉了 3.空格可以用以下字符代替&#xff1a; < 、>、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等 $IFS在li…

idea显示pom.xml文件漂黄警告 Dependency maven:xxx:xxx is vulnerable

场景&#xff1a; idea警告某些maven依赖包有漏洞或者依赖传递有易受攻击包&#xff0c;如下&#xff1a; 解决&#xff1a; 1、打开idea设置&#xff0c;找到 File | Settings | Editor | Inspections 2、取消上述两项勾选即可

基于libcurl+libopenssl开源库编译出curl下载工具及代码集成curl功能

准备素材&#xff1a; 1. openssl的版本&#xff1a; openssl-1.1.1w.tar.gz 2.curl的版本&#xff1a;curl-8.4.0.tar.gz 目标&#xff1a; 1.编译出openssl库&#xff1b; 2.编译出curl可执行文件及库&#xff1b; 步骤一&#xff1a;先解压压缩包 tar -zxvf openssl-1…

Topaz Video AI:引领视频质量革命,让您的内容焕发新生

随着数字媒体的日益普及&#xff0c;视频质量的重要性日益凸显。无论是个人用户还是专业团队&#xff0c;都需要确保他们的视频内容具有最佳的质量。但是&#xff0c;由于各种原因&#xff0c;如设备限制、环境干扰等&#xff0c;往往导致视频质量不尽如人意。这时&#xff0c;…

重命名com1.{d3e34b21-9d75-101a-8c3d-00aa001a1652}文件夹

今天在win10系统上&#xff0c;发现一个名称为: com1.{d3e34b21-9d75-101a-8c3d-00aa001a1652} 的文件夹&#xff0c;该文件夹很奇怪&#xff0c;既不能手动删除&#xff0c;也不能手动给文件夹重命名&#xff0c;如图(1)所示&#xff1a; E:\EncodeOne\hello\Thumbs.ms\com1.…

uni-app 使用vscode开发uni-app

安装插件 uni-create-view 用于快速创建页面 配置插件 创建页面 输入页面名称&#xff0c;空格&#xff0c;顶部导航的标题&#xff0c;回车 自动生成页面并在pages.json中注册了路由 pages\login\login.vue <template><div class"login">login</d…

SourceTree提示128错误

错误&#xff1a; SourceTree打开报错&#xff1a;git log 失败&#xff0c;错误代码128 错误截图&#xff1a; 解决方法&#xff1a; 第一种&#xff1a; 打开电脑路径 C:\Users\Administrator &#xff0c;删除下面的【.gitconifg】文件 第二种&#xff1a; 如果上述方法…

【csapp lab】lab2_bomblab

文章目录 前言实验内容phase_1phase_2phase_3phase_4phase_5phase_6secret_phase 前言 刚做了csapp lab2&#xff0c;记录一下。 我这里用的的系统环境是Ubuntu22.04&#xff0c;是64位系统&#xff0c;与用32位系统可能有所差异。 实验共包括七个阶段&#xff0c;每个阶段考…