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

news2024/10/5 13:43:03

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

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.coloradmin.cn/o/1830512.html

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

相关文章

Stable Diffusion 3 Medium 正式开源

Stable Diffusion 3 Medium 正式开源 Stability AI宣布Stable Diffusion 3 Medium现已开源&#xff0c;这是最新的文本生成图像AI模型&#xff0c;被官方声称为“迄今为止最先进的开源模型”&#xff0c;其性能超过了Midjourney 6。 这款Stable Diffusion 3 Medium模型拥有2…

刷代码随想录有感(106):动态规划——分割等和子集(01背包问题)

题干&#xff1a; 代码&#xff1a; class Solution { public:bool canPartition(vector<int>& nums) {int sum 0;for(int i : nums){sum i;}if(sum % 2 ! 0)return false;int target sum / 2;vector<int>dp(10001, 0);for(int i 0; i < nums.size(); …

SRM系统对供应商的意义是什么?

在甲方与乙方互相合作、沟通的世界里&#xff0c;供应商们也同样面临着诸多挑战~ 你是否经常感到在庞大的订单流中迷失方向&#xff0c;对库存情况一无所知&#xff0c;你是否在与采购商的沟通中频频碰壁&#xff1f;你是否在苦苦寻找一个能够全面管理供应商关系的系统&#x…

opencv的RGB 颜色表

RGB&#xff08;255,23,140&#xff09;是光的三原色&#xff0c;也即是红绿蓝Red&#xff0c;Green&#xff0c;Blue&#xff0c;它们的最大值是255&#xff0c;相当于100%。 白色&#xff1a;rgb(255,255,255) 黑色&#xff1a;rgb(0,0,0) 红色&#xff1a;rgb(255,0,0) …

Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单

文章目录 一、SSO介绍1、使用SSO的好处 二、中间件介绍1、Express安装导入使用 2、cors安装导入配置 3、express-session安装导入配置使用 4、jsonwebtoken安装导入使用 5、jwt和session对比 三、SSO实现方案1、安装依赖2、结构3、实现原理 三、示例代码1、nodejs端 server/ind…

OpenGL系列(六)变换

在三角形和纹理贴图示例中&#xff0c;顶点使用的是归一化设备坐标&#xff0c;在该坐标系下&#xff0c;顶点的每个轴的取值为-1到1&#xff0c;超出范围的顶点不可见。 基于归一化设备坐标的物体的形状随着设备的大小变换而变化&#xff0c;这里产生的第一个问题是&#xff0…

Semantic Kernel 直接调用本地大模型与阿里云灵积 DashScope

本文主要介绍如何在无需网关&#xff0c;无需配置 HttpClient 的情况下&#xff0c;使用 Semantic Kernel 直接调用本地大模型与阿里云灵积 DashScope 等 OpenAI 接口兼容的大模型服务。 1. 背景 一直以来&#xff0c;我们都在探索如何更好地利用大型语言模型&#xff08;LLM&…

如何免费试用阿里云的视频画质增强服务50元额度

上文有说到阿里云有画质增强的服务&#xff0c;我也试了&#xff0c;确实画质提升不少。 本文讲解如何免费试用视频画质增强服务。 首先我们得有一个阿里云的账号&#xff0c;大家自行注册&#xff1a; 阿里云-计算&#xff0c;为了无法计算的价值 注册好后我们打开阿里云的视频…

12.3 Go 测试覆盖率

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【BES2500x系列 -- RTX5操作系统】系列文章索引

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

可视化大屏搞这样,是对前端开发尊严的巨大挑战。

现在可视化大屏不搞点炫酷的效果和3D交互&#xff0c;出门都不好意思给别人打招呼&#xff0c;作为前端领域的老司机&#xff0c;我感觉尊严受到了巨大挑战&#xff0c;必须迎难而上&#xff0c;hold住他们&#xff0c;老铁们你们觉得呢&#xff1f;

Nuxt快速学习开发 -- Nuxt3配置

Nuxt配置 nuxt.config.ts文件位于 Nuxt 项目的根目录下&#xff0c;可以覆盖或扩展应用程序的行为 使用可组合项&#xff0c;这些变量会暴露给应用程序 //nuxt.config.ts import { fileURLToPath } from "url"; ​ export default defineNuxtConfig({alias: {//配置…

LeetCode | 344.反转字符串

设置头尾两个指针&#xff0c;依靠中间变量temp交换头尾指针所指元素&#xff0c;头指针后移&#xff0c;尾指针前移&#xff0c;直到头尾指针重合或者头指针在尾指针后面一个元素 class Solution(object):def reverseString(self, s):""":type s: List[str]:r…

大数据量列表渲染优化:前端实战经验让性能飙升50%,页面速度提升95%

引言&#xff1a;在处理大规模数据集渲染时&#xff0c;前端性能常常面临巨大的挑战。本文将探讨 react-virtualized-list 库如何通过虚拟化技术和 Intersection Observer&#xff0c;实现前端渲染性能飙升 50% 的突破&#xff0c;页面渲染速度提升 95% &#xff01;&#x1f5…

智能化软件开发微访谈·第三十一期 代码大模型训练、微调与增强

CodeWisdom “智能化软件开发沙龙是由CodeWisdom团队组织的围绕智能化软件开发、数据驱动的软件开发质量与效能分析、云原生与智能化运维等相关话题开展的线上沙龙&#xff0c;通过微信群访谈交流等线上交流方式将学术界与工业界专家学者汇聚起来&#xff0c;共同分享前沿研究进…

【Linux】使用 iptables 验证访问HDFS 所使用到的端口

目录 ​编辑 一、实操背景 二、iptables 简介 三、模拟操作 一、实操背景 背景&#xff1a; 在客户有外网的服务器需要访问内网大数据集群HDFS&#xff0c;使用iptable模拟测试需要开放的端口。 二、iptables 简介 具体介绍看文章&#xff1a; 【Linux】Iptables 详解与实战…

性能工具之 JMeter 常用组件介绍(七)

文章目录 一、后置处理器1、Regular Expression Extractor(正则表达式提取器)2、JSON Extractor(JSON表达式提取器)3、Regular Expression Extractor(正则表达式提取器) 二、小结 一、后置处理器 从上面可以看出后置处理可以插件挺多&#xff0c;在我工作生涯中常用的就是几个组…

【探索Linux命令行】从基础指令到高级管道操作的介绍与实践

目录 man 指令&#xff08;说明&#xff09; 介绍 cp 指令&#xff08;复制&#xff09; ​编辑 mv 指令&#xff08;移动&#xff09; ​编辑 cat 指令&#xff08;类似cout&#xff09; less&#xff08;查找&#xff09; head & tail&#xff08;打印&#xff…

基于jeecgboot-vue3的Flowable流程-流程表单显示控制

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 这个部分主要讲流程起始表单的显示控制&#xff0c;因为开始的时候可以进行输入处理&#xff0c;在流程过程中只能只读状态&#xff0c;当然返回到发起人节点也可以进行编辑提交 1、开始发…

Spring配置那些事

一、引言 配置是一个项目中不那么起眼&#xff0c;但却有非常重要的东西。在工程项目中&#xff0c;我们一般会将可修改、易变、不确定的值作为配置项&#xff0c;在配置文件/配置中心中设置。 比方说&#xff0c;不同环境有不同的数据库地址、不同的线程池大小等&#xff0c…