python之对接有道翻译API接口实现批量翻译

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

python之对接有道翻译API接口实现批量翻译
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 有道翻译API 对接

为初学者节省宝贵的学习时间,避免困惑!


前言:

  最近在做软件语言本地化的时候,需要将软件中涉及到的中文全部翻译成英文,由于需要翻译的中文很多,一个一个翻译的话工作量很大,所以开发了这个工具,可是实现文本的批量翻译。

TechX 教程效果:

在这里插入图片描述


文章目录

  • 一、获取有道智云应用ID和应用密钥
    • 1、注册有道智云AI开放平台
    • 2、创建应用
    • 3、查看API接口文档和示例
    • 4、查看常见语种和计费方式
  • 二、实战


一、获取有道智云应用ID和应用密钥

1、注册有道智云AI开放平台


有道智云API接口调用官方网站:有道智云

首先先要去官网注册个账号,如果有账号直接登陆。

在这里插入图片描述


使用网易邮箱直接登录

在这里插入图片描述

2、创建应用


在官网登录后您会自动跳转至智云控制台

在这里插入图片描述

在业务指南页 / 应用总览页 ,点击创建应用按钮,进入创建应用页

应用名称:你想给你的应用取得名字

选择服务:选择文本翻译

接入方式:使用API接口访问

应用类别:选择实用工具

在这里插入图片描述

在业务指南页 / 业务总览页 ,可以查看到我们已经创建好的应用

在这里插入图片描述

3、查看API接口文档和示例


点击控制台左侧的自然语言翻译服务/文本翻译,可以进入服务详情页。

点击“接入方式”中的“文档”按钮,可以访问对应的技术文档。

点击“SDK下载”按钮可以下载SDK;在“示例”部分可以查看Demo。

在接入过程中您可能会用到“应用ID(即APP key)”、“应用密钥”等信息,这些信息可以在应用概览中查看。

在这里插入图片描述


接口调用参数
调用API需要向接口发送以下字段来访问服务。

在这里插入图片描述

4、查看常见语种和计费方式


在使用前我们可以查看产品文档,来了解API支持哪些常见语种的翻译,并且查看价格

在这里插入图片描述



二、实战


在进行代码开发之前需要安装两个包,使用以下命令进行包的安装。

pip install requests ttkbootstrap

APP_KEY 为你自己创建的应用的ID

APP_SECRET 为你自己创建的应用的密钥

import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
import requests
import hashlib
import time
import uuid
import os
import threading
import datetime
import csv
import ttkbootstrap as ttkb
from ttkbootstrap.constants import *

# 有道翻译API配置信息
YOUDAO_URL = 'https://openapi.youdao.com/api'
APP_KEY = 'YOUR_APP_KEY'
APP_SECRET = 'YOUR_APP_SECRET '

LANGUAGES = {
    "Chinese": "zh-CHS",
    "English": "en",
    "French": "fr",
    "Spanish": "es",
    "German": "de",
    "Japanese": "ja",
    "Korean": "ko",
    "Russian": "ru",
    "Portuguese": "pt",
    "Italian": "it"
}

def encrypt(signStr):
    hash_algorithm = hashlib.sha256()
    hash_algorithm.update(signStr.encode('utf-8'))
    return hash_algorithm.hexdigest()

def truncate(q):
    if q is None:
        return None
    size = len(q)
    return q if size <= 20 else q[0:10] + str(size) + q[size - 10:size]

def do_request(data):
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    response = requests.post(YOUDAO_URL, data=data, headers=headers)
    response.raise_for_status()  # 检查请求是否成功
    return response

def translate(text, from_lang, to_lang):
    data = {
        'from': from_lang,
        'to': to_lang,
        'signType': 'v3',
        'curtime': str(int(time.time())),
        'appKey': APP_KEY,
        'q': text,
        'salt': str(uuid.uuid1()),
        'vocabId': ''  # 可选,用户词表ID
    }
    signStr = APP_KEY + truncate(text) + data['salt'] + data['curtime'] + APP_SECRET
    data['sign'] = encrypt(signStr)

    response = do_request(data)
    result = response.json()
    if result.get('errorCode') == '0':
        return result['translation'][0]
    else:
        raise Exception(f"Error: {result.get('errorCode')}, {result.get('errorMsg')}")

def select_file():
    file_path = filedialog.askopenfilename(filetypes=[("Text Files", "*.txt")])
    if file_path:
        file_path_var.set(file_path)

def translate_file():
    file_path = file_path_var.get()
    from_lang = LANGUAGES[source_lang_var.get()]
    to_lang = LANGUAGES[target_lang_var.get()]

    if not file_path:
        messagebox.showerror("Error", "Please select a TXT file first.")
        return

    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            lines = file.readlines()
    except Exception as e:
        messagebox.showerror("Error", f"Failed to read TXT file: {e}")
        return

    translated_lines = []

    # 显示进度条和进度标签
    progress_bar["maximum"] = len(lines)
    progress_bar["value"] = 0
    progress_bar.grid(row=5, column=0, columnspan=4, pady=5, sticky=(tk.W, tk.E))
    progress_label["text"] = "Translation in progress..."
    progress_label.grid(row=4, column=0, columnspan=4, pady=5)

    def translate_and_update_progress():
        for i, line in enumerate(lines, start=1):
            try:
                translated_text = translate(line.strip(), from_lang, to_lang)
                translated_lines.append((line.strip(), translated_text))
                app.update()
                time.sleep(1)
            except Exception as e:
                messagebox.showerror("Error", f"Translation failed for line: {line.strip()}\nError: {e}")
                progress_bar.stop()
                return
            progress_bar["value"] = i
            progress_label["text"] = f"Progress: {i}/{len(lines)}"
        save_translated_file(translated_lines)
        progress_label["text"] = "Translation completed"

    threading.Thread(target=translate_and_update_progress).start()

def save_translated_file(translated_lines):
    output_dir = os.path.dirname(file_path_var.get())
    output_file_path = os.path.join(output_dir, "Translate_output.csv")

    # 检查文件是否存在以决定是否写入标题行
    file_exists = os.path.isfile(output_file_path)

    # 读取现有的内容到一个集合中以避免重复
    existing_lines = set()
    if file_exists:
        with open(output_file_path, 'r', encoding='utf-8') as file:
            csv_reader = csv.reader(file)
            for row in csv_reader:
                if len(row) > 1:
                    existing_lines.add(tuple(row))

    try:
        with open(output_file_path, 'a', encoding='utf-8', newline='') as file:
            csv_writer = csv.writer(file, quoting=csv.QUOTE_ALL)
            if not file_exists:
                csv_writer.writerow(["源语言", "目标语言"])
                csv_writer.writerow(["Source", "Target"])

            for line in translated_lines:
                row = (line[0], line[1])
                if row not in existing_lines:
                    csv_writer.writerow(row)
                    existing_lines.add(row)
    except Exception as e:
        messagebox.showerror("Error", f"Failed to write CSV file: {e}")
        return

    messagebox.showinfo("Success", "File translated successfully and saved to:\n{}".format(output_file_path))
    # 打开保存文件所在的文件夹
    folder_path = os.path.dirname(output_file_path)
    os.startfile(folder_path)

app = ttkb.Window(themename="superhero")  # 可以选择不同的主题
app.title("Localization Translator")

file_path_var = tk.StringVar()
source_lang_var = tk.StringVar(value="Chinese")
target_lang_var = tk.StringVar(value="English")

frame = ttk.Frame(app, padding=10)
frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S), padx=10, pady=10)

source_lang_label = ttk.Label(frame, text="Source Language:")
source_lang_label.grid(row=0, column=0, padx=5, pady=5, sticky=tk.E)
source_lang_menu = ttk.OptionMenu(frame, source_lang_var, source_lang_var.get(), *LANGUAGES.keys(), bootstyle="primary-outline")
source_lang_menu.grid(row=0, column=1, padx=5, pady=5, sticky=tk.W)

target_lang_label = ttk.Label(frame, text="Target Language:")
target_lang_label.grid(row=0, column=2, padx=5, pady=5, sticky=tk.E)
target_lang_menu = ttk.OptionMenu(frame, target_lang_var, target_lang_var.get(), *LANGUAGES.keys(), bootstyle="primary-outline")
target_lang_menu.grid(row=0, column=3, padx=5, pady=5, sticky=tk.W)

select_button = ttk.Button(frame, text="Select File", command=select_file, bootstyle="primary-outline")
select_button.grid(row=1, column=0, padx=5, pady=20)

file_path_entry = ttk.Entry(frame, textvariable=file_path_var, width=50)
file_path_entry.grid(row=1, column=1, columnspan=3, padx=5, pady=5, sticky=(tk.W, tk.E))

translate_button = ttk.Button(frame, text="Translate", command=translate_file, bootstyle="primary-outline")
translate_button.grid(row=2, column=0, columnspan=4, pady=10)

progress_label = ttk.Label(frame, text="")
progress_label.grid(row=4, column=0, columnspan=4, pady=5)

progress_bar = ttk.Progressbar(frame, orient=tk.HORIZONTAL, mode="determinate")
progress_bar.grid(row=5, column=0, columnspan=4, pady=5, sticky=(tk.W, tk.E))

# 在窗口创建后隐藏进度条和进度标签
progress_bar.grid_forget()
progress_label.grid_forget()

app.mainloop()

Source Language:源语言

Target Language:目标语言

Select File:选择一个txt文件,txt文件包含要翻译的文字

Translate:开始进行翻译,等待翻译完成,在txt同级目录下将会输出一个csv源语言和目标语言对照表

在这里插入图片描述



TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 C# 进行面向对象编程:第 10 部分

封装和抽象之间的区别 对于 OOP 初学者来说&#xff0c;封装和抽象之间存在非常基本的区别。他们可能会对此感到困惑。但如果你详细了解这两个主题&#xff0c;就会发现它们之间存在巨大差异。 抽象意味着向用户隐藏不必要的数据。用户只需要所需的功能或根据其需求的输出。例…

k8s学习--OpenKruise详细解释以及原地升级及全链路灰度发布方案

文章目录 OpenKruise简介OpenKruise来源OpenKruise是什么&#xff1f;核心组件有什么&#xff1f;有什么特性和优势&#xff1f;适用于什么场景&#xff1f; 什么是OpenKruise的原地升级原地升级的关键特性使用原地升级的组件原地升级的工作原理 应用环境一、OpenKruise部署1.安…

融资融券有哪些交易技巧,两融利率现在最低多少?4.0%!

融资融券交易技巧 授信额度技巧 当我们账户净资产有显著增长时&#xff0c;最好主动申请增加信用额度&#xff0c;这样在后面行情好转入资金需要进行更多融资融券交易时就不会受限于授信额度&#xff0c;避免因为临时申请增加额度而错过交易机会。 买入委托技巧 现金的折算率…

开发一个python工具,pdf转图片,并且截成单个图片,然后修整没用的白边及循环遍历文件夹全量压缩图片

今天推荐一键款本人开发的pdf转单张图片并截取没有用的白边工具 一、开发背景&#xff1a; 业务需要将一个pdf文件展示在前端显示&#xff0c;但是基于各种原因&#xff0c;放弃了h5使用插件展示 原因有多个&#xff0c;文件资源太大加载太慢、pdf展示兼容性问题、pdf展示效…

100V宽电压H62410A恒压芯片 24V降压5V 24V降压12V电源IC

H62410A是一款宽电压100V 内置MOS管的降压恒压芯片&#xff0c;适用于24V降压至5V或12V的应用场景。其内置100V耐压MOS和宽压8V-90V的输入范围&#xff0c;使得它能够在多种电压条件下稳定工作。同时&#xff0c;支持输出电压可调至3.3V&#xff0c;为不同设备提供了灵活的电源…

树莓派4B学习笔记11:PC端网线SSH连接树莓派

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习使用网线连接树莓派&#xff0c;网线可以提供更…

Vue46-render函数

一、非单文件和单文件的main.js对比 1-1、非单文件的main.js 1-2、 单文件的main.js 将单文件的main.js中的render函数变成非单文件的main.js中的template形式&#xff0c;报如下错误&#xff1a; 解决方式&#xff1a; 二、解决方式 2-1、引入完成版的vue.js 精简版的vue&a…

TMS320F280049学习5:CPU timer中断

TMS320F280049学习5&#xff1a;CPU timer中断 文章目录 TMS320F280049学习5&#xff1a;CPU timer中断前言一、工程代码二、CPU timer时钟总结 前言 DSP的内部有3个CPU timer&#xff0c;分别是CUP timer0 / 1 / 2&#xff0c;传说CPU timer2一般在跑系统时用&#xff0c;类似…

【Unity】RPG2D龙城纷争(一)搭建项目、导入框架、前期开发准备

更新日期&#xff1a;2024年6月12日。 项目源码&#xff1a;后续章节发布 免责声明&#xff1a;【RPG2D龙城纷争】使用的图片、音频等所有素材均有可能来自互联网&#xff0c;本专栏所有文章仅做学习和教程目的&#xff0c;不会将任何素材用于任何商业用途。 索引 【系列简介】…

DSP教学实验箱_数字图像处理_操作教程:5-1 图像旋转

一、实验目的 学习图像旋转的原理&#xff0c;掌握图像的读取方法&#xff0c;并实现图像旋转。 二、实验原理 图像旋转 图像的旋转是指以图像的某一点为原点以逆时针或顺时针旋转一定的角度。其本质是以图像的中心为原点&#xff0c;将图像上的所有像素都旋转一个相同的角…

PHP邮箱验证码功能优化的策略?怎么配置?

PHP邮箱验证码服务怎么样&#xff1f;如何保障邮箱的安全性&#xff1f; PHP邮箱验证码是验证用户身份的常见方法之一&#xff0c;它通过向用户注册的邮箱发送一次性验证码来确认用户的身份。然而&#xff0c;为了确保这一过程既安全又用户友好&#xff0c;需要一些优化策略来…

hadoop/hive/DBeaver启动流程

hadoop 启动 cd到指定目录下 cd /opt/module/hadoop-3.3.0/sbin/启动文件 ./start-all.shjps一下&#xff0c;查看显示的内容 应该显示以下内容 NameNode SecondaryNameNode DataNode ResourceManager NodeManager如果缺少namenode&#xff0c;那么执行 rm -rf /tmp/hadoo…

flink1.12.0学习笔记(一)-部署与入门

flink1.12.0学习笔记&#xff08;1&#xff09;-部署与入门 1-1-Flink概述 Flink诞生 Flink 诞生于欧洲的一个大数据研究项目 StratoSphere。该项目是柏林工业大学的一个研究性项目。早期&#xff0c; Flink 是做 Batch 计算的&#xff0c;但在 2014 年&#xff0c; StratoS…

Linux_应用篇(19) V4L2 摄像头应用编程

ALPHA/Mini I.MX6U 开发板配套支持多种不同的摄像头&#xff0c;包括正点原子的 ov5640&#xff08;500W 像素&#xff09;、ov2640&#xff08;200W 像素&#xff09;以及 ov7725&#xff08;不带 FIFO、 30W 像素&#xff09;这三款摄像头&#xff0c;在开发板出厂系统上&…

30岁想自学PLC转变职业规划,行业空间如何?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「PLC的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;30岁想自学PLC转变职业规划是…

ollama模型CPU轻量化部署

一、定义 ollama 定义环境部署demo加载本地模型方法基本指令关闭开启ollamaollama 如何同时 运行多个模型, 多进程ollama 如何分配gpu修改模型的存储路径 二、实现 ollama 定义 ollama 是llama-cpp 的进一步封装&#xff0c;更加简单易用&#xff0c;类似于docker. 模型网址…

HTTP协议版本历程

HTTP协议的发展历程 版本推出年份当前状态HTTP/0.91991年已过时HTTP/1.01996年已过时HTTP/1.11997年标准HTTP/2.02015年标准HTTP/3.02022年标准 HTTP/0.9 HTTP/0.9非常简单&#xff0c;并不涉及数据包传输&#xff0c;通过请求和响应的交换达成通信&#xff0c;请求由单行指…

深度解析量水堰:结构、分类与设计要点

量水堰&#xff0c;作为水工测量中的关键设施&#xff0c;其精确度和多样性对于水位和流量的测量至关重要。其工作原理基于通过堰顶断面上的进水口&#xff0c;将水位引导至堰体内部&#xff0c;从而实现水位和流量的平衡。量水堰通常采用高强度、耐久的材料构建&#xff0c;如…

ABBYY Finereader 15中文版安装包下载及安装教程

​ABBYY FineReader 是一款功能强大的 OCR&#xff08;Optical Character Recognition&#xff09;软件&#xff0c;可以将扫描的文档转换为可编辑的文本文件。它不仅可以识别文本&#xff0c;还可以识别表格、图像和布局&#xff0c;使得文档的转换更加准确和方便。 安 装 包 …

考试系统提供源码能做什么?

考试系统提供源码&#xff0c;无疑为现代教育领域注入了新的活力。源码&#xff0c;作为软件开发的基石&#xff0c;其开放与共享的特性使得考试系统具备了前所未有的灵活性和可定制性。那么&#xff0c;考试系统提供源码究竟能做什么呢&#xff1f;本文将详细探讨其多重功能与…