手把手教你设计一个翻译器

  • 1 获取百度翻译 API
  • 2 先简单实现调用百度翻译并打印翻译结果
  • 3 实现复制即翻译功能
  • 3.1 翻译剪贴板内容并在终端输出
  • 3.2 翻译剪贴板内容并在屏幕输出
  • 4 设计一个简单的翻译器

1 获取百度翻译 API

首先,我们需要使用百度翻译 API 进行翻译需要注册百度翻译开放平台账号并获取 API 密钥,可以在此网站中注册并获取 API 密钥:https://api.fanyi.baidu.com/
百度翻译API申请教程 在获取了 API 密钥之后,我们可以使用 Python 的 requests 库来调用百度翻译 API:

pip install requests

2 先简单实现调用百度翻译并打印翻译结果

在调用百度翻译 API 时,我们需要提供以下参数:

  • q:要翻译的文本
  • from:需要翻译的源语言,例如:en(英文),zh(中文),auto(自动)
  • to:需要转换成的语言
  • appid:申请成为开发者后生成的appid,在在控制台中查看
  • salt:随机数
  • sign:生成的签名(appid+q+salt+密钥 的MD5值)

其中,salt 和 sign 是用来防止 API 被滥用的参数。

import random
import hashlib
import requests

# 替换为你的百度翻译 appid
appid = '2022xxxxxx'

# 填写你的百度翻译API密钥
secretKey = '7Bnxxxxxxxx'  

# 要翻译的文本
translate_text = 'Hello World'

# 随机数
salt = random.randint(32768, 65536)

# 签名,拼接成字符串后,再进行md5加密
sign = appid + translate_text + str(salt) + secretKey
sign = hashlib.md5(sign.encode()).hexdigest()

# 百度翻译 API 地址
url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'

# 发送请求
response = requests.get(url, params={
    'q': translate_text,
    'from': 'en', # auto
    'to': 'zh',
    'appid': appid,
    'salt': salt,
    'sign': sign
})

# 解析响应
result = response.json()

# 输出翻译结果
print(result['trans_result'][0]['dst'])

在线代码python 在线代码翻译器_在线代码python

3 实现复制即翻译功能

3.1 翻译剪贴板内容并在终端输出

这一小节实现的功能:当发生复制待翻译文本的操作后,调用API进行翻译,将翻译结果显示在终端

import pyperclip
import random
import hashlib
import requests
import time

# 请替换为你的百度翻译 appid
appid = '2022xxxxxxxx'

# 填写你的百度翻译API密钥
secretKey = '7Bnxxxxxxx'  

# 初始化上一次的剪贴板内容
last_clipboard_content = ''

while True:
    # 获取当前剪贴板内容
    clipboard_content = pyperclip.paste()
    
    # 如果剪贴板内容发生了变化
    if clipboard_content != last_clipboard_content:
        # 更新上一次的剪贴板内容
        last_clipboard_content = clipboard_content
        
        # 随机数
        salt = random.randint(32768, 65536)

        # 签名
        sign = appid + clipboard_content + str(salt) + secretKey
        sign = hashlib.md5(sign.encode()).hexdigest()

        # 百度翻译 API 地址
        url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'

        try:
            # 发送请求
            response = requests.get(url, params={
                'q': clipboard_content,
                'from': 'en', # auto
                'to': 'zh',
                'appid': appid,
                'salt': salt,
                'sign': sign
            })

            # 解析响应
            result = response.json()    
            # 输出翻译结果
            print(result['trans_result'][0]['dst'])
        except:
            print('发生了错误,无法获取翻译结果')
    # 休眠 1 秒
    time.sleep(1)

注意:上面代码要在终端运行,结果如下:

在线代码python 在线代码翻译器_在线代码python_02

3.2 翻译剪贴板内容并在屏幕输出

这一小节我们调用百度翻译API实现以下功能:

  1. 当发生复制操作时,获取剪贴板的待翻译文本,翻译为中文并将翻译结果显示在屏幕上;
  2. 只有当再次发生复制操作,即剪贴板内容发生变化时,再次触发第一步的翻译并显示
  3. 当剪贴板内容没有发生变化时,不执行翻译和显示操作,继续监视剪贴板内容是否发生改变,等待下一次复制操作

代码实现如下:

import pyperclip
import random
import hashlib
import requests
from tkinter import Tk, Label, StringVar

# 请替换为您的百度翻译 appid
appid = '2022xxxxxx'

# 填写你的百度翻译API密钥
secretKey = '7Bnxxxxxxxx'  

# 初始化上一次的剪贴板内容
last_clipboard_content = ''

# 创建窗口
root = Tk()
root.title('熊哩翻译器')

# 创建字符串变量
result_str = StringVar()

# 创建标签
label = Label(root, textvariable=result_str, font=("Arial", 14))
# 使用 config() 函数来设置文本框的宽度和高度
label.config(width=30, height=10)
label.pack()

def translate():
    global last_clipboard_content
    # 获取当前剪贴板内容
    clipboard_content = pyperclip.paste()
    
    # 如果剪贴板内容发生了变化
    if clipboard_content != last_clipboard_content:
        # 更新上一次的剪贴板内容
        last_clipboard_content = clipboard_content
        
        # 随机数
        salt = random.randint(32768, 65536)

        # 签名
        sign = appid + clipboard_content + str(salt) + secretKey
        sign = hashlib.md5(sign.encode()).hexdigest()

        # 百度翻译 API 地址
        url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'

        # 发送请求
        response = requests.get(url, params={
            'q': clipboard_content,
            'from': 'en', # auto
            'to': 'zh',
            'appid': appid,
            'salt': salt,
            'sign': sign
        })

        # 解析响应
        result = response.json()

        # 更新字符串变量的值
        result_str.set(result['trans_result'][0]['dst'])
    
    # 延迟一秒后再次执行 translate 函数
    root.after(1000, translate)

# 开始循环
translate()

# 进入消息循环
root.mainloop()

运行结果如下:

在线代码python 在线代码翻译器_百度_03

  • 这里发现了一个问题,复制的待翻译文本必须没有换行,否则翻译结果总是只能翻译一行,不知道是百度翻译API的问题还是我的代码问题,希望有大佬帮我解惑!

4 设计一个简单的翻译器

  1. 在 Tkinter 窗口中添加一个文本输入框,用于输入要翻译的英文。
  2. 在 Tkinter 窗口中添加一个按钮,点击按钮时调用百度翻译 API 进行翻译。
  3. 在 Tkinter 窗口中添加一个文本框,用于显示翻译结果。

在下面代码中,我们在 Tkinter 窗口中添加了一个文本输入框,一个按钮和一个文本框。点击按钮时,会调用百度翻译 API 进行翻译,并将翻译结果显示在文本框中。用户可以多次输入要翻译的英文,并点击按钮进行翻译,翻译结果会不断更新。

import random
import hashlib
import requests
import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title('翻译结果')

# 创建文本输入框,用于输入要翻译的英文
text_input = tk.Entry(root, width=60)
text_input.pack()

# 创建按钮,点击按钮时调用百度翻译 API 进行翻译
def translate():
  # 读取文本输入框中的文本
  translate_text = text_input.get()

  # 调用百度翻译 API 进行翻译
  # 替换为你的百度翻译 appid
  appid = '2022xxxxx'

  # 填写你的百度翻译API密钥
  secretKey = '7Bxxxxxxx'  

  # 随机数
  salt = random.randint(32768, 65536)

  # 签名
  sign = appid + translate_text + str(salt) + secretKey
  sign = hashlib.md5(sign.encode()).hexdigest()

  # 百度翻译 API 地址
  url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'

  # 发送请求
  response = requests.get(url, params={
      'q': translate_text,
      'from': 'en', # auto
      'to': 'zh',
      'appid': appid,
      'salt': salt,
      'sign': sign
  })

  # 解析响应
  result = response.json()

  # 将翻译结果显示在文本框中
  text_output.delete(0.0, tk.END)
  text_output.insert(tk.END, result['trans_result'][0]['dst'])

button = tk.Button(root, text='翻译', command=translate)
button.pack()

# 创建文本框,用于显示翻译结果
text_output = tk.Text(root)
text_output.pack()

# 运行主循环
root.mainloop()

运行结果如下:

在线代码python 在线代码翻译器_python_04

  • 后续还可以增加选择待翻译语言选择、目标语言选择、清空按钮等等功能,大家自行探究吧!感谢支持!

特别致谢
1. python实现调用百度API批量翻译单词2. 调用百度API(二)——百度翻译