当前位置: 首页 > news >正文

使用百度翻译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:项目代码

相关文章:

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

前言 书到用时方恨少,只能临时抱佛脚。英文pdf看不懂,压根看不懂。正好有百度翻译API和腾讯翻译API,就利用两个API自己写一个简单的翻译工具,充分利用资源,用的也放心。 前期准备 关键肯定是两大厂的翻译API&#x…...

Flutter笔记:桌面应用 窗口定制库 bitsdojo_window

Flutter笔记 桌面应用窗口管理库 bitsdojo_window 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/13446…...

iOS_折叠展开 FoldTextView

1. 显示效果 Test1:直接使用: Test2:在 cell 里使用: 2. 使用 2.1 直接使用 // 1.1 init view private lazy var mooFoldTextView: MOOFoldTextView {let view MOOFoldTextView(frame: .zero)view.backgroundColor .cyanvie…...

java使用 TCP 的 Socket API 实现客户端服务器通信

一:什么是 Socket(套接字) Socket 套接字是由系统提供于网络通信的技术, 是基于 TCP/IP 协议的网络通信的基本操作,要进行网络通信, 需要有一个 socket 对象, 一个 socket 对象对应着一个 socket 文件, 这个文件在 网卡上而不是硬盘上, 所以有了 sokcet…...

conda从4.12升级到最新版23.9 自动升级失败 手动升级方法

最新版conda有多线程下载,还做了一些其它易用性改动,所以决定从很老的4.12版本升级到最新版。因为版本差别过大,使用自带的conda update conda已经不起作用了。 手动升级最先想到的是把老环境全部导出为yaml文件,在新环境里全部重…...

WPF下实现拖动任意地方都可以拖动窗口

首先在xaml中添加事件 <Window PreviewMouseLeftButtonDown"Window_PreviewMouseLeftButtonDown"PreviewMouseMove"Window_PreviewMouseMove"PreviewMouseLeftButtonUp"Window_PreviewMouseLeftButtonUp"/>然后脚本输入 Point _pressedP…...

Swin Transformer

Swin Transformer 简介 下采样的层级设计&#xff0c;能够逐渐增大感受野。采用window进行注意力计算&#xff0c;极大降低了内存消耗&#xff0c;避免了整张图像尺寸大小的qkv矩阵滑窗操作包括不重叠的 local window&#xff0c;和重叠的 cross-window。不重叠的local window…...

【csapp lab】lab2_bomblab

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

开发者分享 | Ascend C算子开发及单算子调用

本文分享自《AscendC算子开发及单算子调用》&#xff0c;作者&#xff1a;goldpancake。 笔者在阅读Ascend C官方文档的过程中发现&#xff0c;对于初学者来说&#xff0c;尤其是第一次接触异构编程思想的初学者&#xff0c;有部分内容是无需特别关注的&#xff0c;例如算子工…...

如何在 Linux 上部署 RabbitMQ

如何在 Linux 上部署 RabbitMQ 文章目录 如何在 Linux 上部署 RabbitMQ安装 Erlang从预构建的二进制包安装从源代码编译 Erlang RabbitMQ 的安装使用 RabbitMQ Assistant 连接 RabbitMQ Assistant 是一款优秀的RabbitMQ 可视化管理工具&#xff0c;提供丰富的管理功能。下载地址…...

解决更换NodeJs版本后npm -v返回空白

一、问题描述 win11电脑上输入cmd进入控制台&#xff0c;输入 node --version 有正常返回安装的nodejs的版本号 再输入 npm -v 返回空白。正常情况应该是要返回版本号。 二、问题背景 最近准备学习vue&#xff0c;在不久前已经安装了NodeJs和python。运行了好几个开源项…...

【ES常用查询】基于ElasticsearchRestTemplate及NativeSearchQuery的查询

包含当前es所有的查询&#xff0c; 需要什么代码直接照搬&#xff0c;改个参数就行&#xff01; 用的好请务必给我点赞&#xff01;&#xff01;&#xff01;感谢爱你们&#xff01;&#xff01;&#xff01; &#xff08;周末更 筒&#xff09; 为啥写这篇文章呢&#xff…...

全志XR806基于http的无线ota功能实验

XR806不仅硬件功能多&#xff0c;XR806也提供了功能极其丰富的SDK&#xff0c;几天体验下来非常容易上手。常见的功能几乎都有相应的cmd或demo实现&#xff0c;HAL也做得非常全面&#xff0c;非常适合快速开发。这一点超级好评&#xff01;本文章要实现的无线OTA也基于该SDK。 …...

2023年11月15号期中测验选择题(Java)

本篇续接《2023年11月15号期中测验判断题&#xff08;Java&#xff09;》->传送门 2-1 以下程序运行结果是 public class Test extends Father{private String name"test";public static void main(String[] args){Test test new Test();System.out.println(tes…...

C# static关键字详解

在C#中&#xff0c;static关键字有许多重要的用途。以下是关于如何使用static关键字的一些详细信息&#xff1a; 静态类&#xff08;Static Classes&#xff09;&#xff1a;静态类是不能实例化的类&#xff0c;它的所有成员都是静态的。静态类常常用作工具类或帮助类&#xff…...

开发一款回合制游戏,需要注意什么?

随着游戏行业的蓬勃发展&#xff0c;回合制游戏因其深度的策略性和令人着迷的游戏机制而受到玩家们的热烈欢迎。如果你计划投身回合制游戏的开发领域&#xff0c;本文将为你提供一份详细的指南&#xff0c;从游戏设计到发布&#xff0c;助你成功打造一款引人入胜的游戏。 1. 游…...

java的包装类

目录 1. 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 1.3 自动装箱和自动拆箱 1. 包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了 一个包装类型。 若想了解…...

【数据结构(一)】线性结构和非线性结构

文章目录 线性结构和非线性结构1. 线性结构2. 非线性结构 线性结构和非线性结构 数据结构包括&#xff1a;线性结构和非线性结构。 1. 线性结构 线性结构作为最常用的数据结构&#xff0c;其特点是数据元素之间存在一对一的线性关系。线性结构有两种不同的存储结构&#xff…...

持续集成指南:GitHubAction 自动构建+部署AspNetCore项目

前言 之前研究了使用 GitHub Action 自动构建和发布 nuget 包&#xff1a;开发现代化的.NetCore控制台程序&#xff1a;(4)使用GithubAction自动构建以及发布nuget包 现在更进一步&#xff0c;使用 GitHub Action 在其提供的 runner 里构建 docker 镜像&#xff0c;之后提交到阿…...

Docker 笔记(三)--容器

Docker 笔记&#xff08;三&#xff09;–容器 记录Docker 安装操作记录&#xff0c;便于查询。 参考 链接: Docker 入门到实战教程(三)镜像和容器链接: docker run中的-itd参数正确使用链接: docker官方文档链接: 阿里云Debian 镜像链接: Debian 全球镜像站链接: Debian/Ub…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...