PDF粘贴翻译小工具(Python实现 源码+exe)

想法来源:每次翻译论文时,直接复制粘贴,会有很多回车、多个空格等,格式比较乱,于是写了这个小工具。

主要功能:英汉互译,ctrl+enter自动格式化并翻译;ctrl+鼠标滚轮更改字体大小。

实现思路

1、主要功能:

1)获取左边输入框的文本,将其中的多个空格替换为一个空格,将其中的回车替换为一个空格;2)根据组合框中内容选择语言;3)连接谷歌翻译网址进行翻译;4)分别将格式化的原文与译文显示在界面上

2、基础功能:

1)重写键盘事件,利用ctrl+enter控制文本格式化与翻译;2)重写鼠标滚轮事件,利用ctrl+鼠标滚轮控制字体大小

操作实例:一个动图

源代码

# yangzhen
# 2021.12.3
# 英汉互译GUI

from PyQt5 import QtCore, QtGui, QtWidgets
import re
import html
from urllib import parse
import requests
import sys
import os


class Ui_Form(QtWidgets.QWidget):
    GOOGLE_TRANSLATE_URL = 'http://translate.google.cn/m?q=%s&tl=%s&sl=%s'
    def __init__(self):
        super().__init__()
        self.resize(1200, 800)
        self.setWindowTitle('文本翻译')
        icon = QtGui.QIcon()
        if getattr(sys, 'frozen', False):
            application_path = os.path.dirname(sys.executable)
        elif __file__:
            application_path = os.path.dirname(__file__)
        icon.addPixmap(QtGui.QPixmap(application_path + "/icon.png"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.setWindowIcon(icon)
        self.verticalLayout = QtWidgets.QVBoxLayout(self)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.oldlanguage = QtWidgets.QComboBox(self)
        self.oldlanguage.setObjectName("oldlanguage")
        items = ["英文", "中文"]
        self.oldlanguage.addItems(items)
        self.oldlanguage.setCurrentIndex(0)   # 设置默认值

        self.horizontalLayout_6.addWidget(self.oldlanguage)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_6.addItem(spacerItem)
        self.horizontalLayout_5.addLayout(self.horizontalLayout_6)
        self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
        self.newlanguage = QtWidgets.QComboBox(self)
        self.newlanguage.setObjectName("newlanguage")
        self.newlanguage.addItems(items)
        self.newlanguage.setCurrentIndex(1)   # 设置默认值

        self.horizontalLayout_7.addWidget(self.newlanguage)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_7.addItem(spacerItem1)
        self.horizontalLayout_5.addLayout(self.horizontalLayout_7)
        self.verticalLayout.addLayout(self.horizontalLayout_5)
        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
        self.oldtext = QtWidgets.QTextEdit(self)
        self.oldtext.setObjectName("oldtext")
        self.horizontalLayout_8.addWidget(self.oldtext)
        self.newtext = QtWidgets.QTextEdit(self)
        self.newtext.setObjectName("newtext")
        self.horizontalLayout_8.addWidget(self.newtext)
        self.verticalLayout.addLayout(self.horizontalLayout_8)

        font = QtGui.QFont()
        font.setFamily('Microsoft YaHei')
        font.setPointSize(10)
        self.oldtext.setFont(font)
        self.newtext.setFont(font)
        self.textsize = 10

        self.oldlanguage.setFont(font)
        self.newlanguage.setFont(font)


    def keyPressEvent(self, event):
        """重写键盘事件"""
        # print(self.GOOGLE_TRANSLATE_URL)
        key = event.key()
        moder = event.modifiers()
        if key == QtCore.Qt.Key_Return:
            if moder == QtCore.Qt.ControlModifier:
                # 格式化原文
                text1 = self.oldtext.toPlainText()
                text1 = self.formattext(text1)
                # print(text1)
                # 获取语言
                text_label = self.oldlanguage.currentText()
                if text_label == "英文":
                    text_language = 'en'
                else:
                    text_language = 'zh-CN'
                to_label = self.newlanguage.currentText()
                if to_label == "英文":
                    to_language = 'en'
                else:
                    to_language = 'zh-CN'
                # 翻译
                text2 = self.translate(text1, text_language, to_language)
                # print(text2)
                # 显示结果
                self.oldtext.setText(text1)
                self.newtext.setText(text2)


    def wheelEvent(self, event):
        """重写鼠标事件"""
        if (event.modifiers() == QtCore.Qt.ControlModifier):
            font = QtGui.QFont()
            font.setFamily('Microsoft YaHei')
            if (event.angleDelta().y() > 0.5):
                self.textsize += 1
                # self.scaleflag = 1
            elif (event.angleDelta().y() < 0.5):
                self.textsize -= 1
            font.setPointSize(self.textsize)
            self.oldtext.setFont(font)
            self.newtext.setFont(font)



    def translate(self, text, text_language="auto", to_language="auto"):
        """翻译"""
        text = parse.quote(text)
        url = self.GOOGLE_TRANSLATE_URL % (text, to_language, text_language)
        response = requests.get(url)
        data = response.text
        expr = r'(?s)class="(?:t0|result-container)">(.*?)<'
        result = re.findall(expr, data)
        if (len(result) == 0):
            return "错误"
        return html.unescape(result[0])

    def formattext(self, text):
        """原文格式化"""
        text = text.replace('-', '')
        text = text.replace('\n', ' ')
        text = ' '.join(text.split())
        return text


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    ui = Ui_Form()
    # ui.InitiaWindow(MainWindow)
    ui.show()
    sys.exit(app.exec_())

已经打包好的exe

链接:https://pan.baidu.com/s/15qVMsVPKqHYxA62Sno4mDQ 
提取码:1234

参考:

python调用谷歌翻译接口

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值