最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python編寫一個(gè)Word文件翻譯器

 更新時(shí)間:2025年11月05日 09:06:51   作者:PythonFun  
傳統(tǒng)人工翻譯雖然準(zhǔn)確,但耗時(shí)耗力;使用CAT工具,或者通用在線翻譯平臺(tái),又需要支付費(fèi)用,下面我們就來看看如何使用Python編寫一個(gè)Word文件翻譯器吧

一、背景介紹

在日常教學(xué)、科研與跨境商務(wù)活動(dòng)中,外文資料(論文、合同、技術(shù)文檔)和中文資料的互譯需求非常頻繁。傳統(tǒng)人工翻譯雖然準(zhǔn)確,但耗時(shí)耗力;使用CAT工具,或者通用在線翻譯平臺(tái),又需要支付費(fèi)用,而且操作繁瑣,無(wú)法方便地處理大批量文件。

為解決這一痛點(diǎn),本軟件Word文件翻譯器應(yīng)運(yùn)而生。它基于 Python + Tkinter 圖形界面開發(fā),集成了小牛機(jī)器翻譯API,支持 Word(.docx)、文本(.txt)等常見文件的快速翻譯,解決網(wǎng)頁(yè)翻譯工具5000字符限制,并能將結(jié)果導(dǎo)出為 DOCX、TXT、XLSX 多種格式。從而實(shí)現(xiàn)本地一鍵翻譯文檔,減少繁瑣操作,提升翻譯效率。

使用小牛翻譯,主要是考慮其專業(yè)的服務(wù)品質(zhì),而且服務(wù)器在國(guó)內(nèi),支持QPS數(shù)量,免費(fèi)用戶為5,付費(fèi)為50,即每秒可以向服務(wù)器發(fā)送5次請(qǐng)求,每次請(qǐng)求字符長(zhǎng)度也在5000字符,每天提供高達(dá)20萬(wàn)的免費(fèi)額度,個(gè)人用戶申請(qǐng)也很方便。

二、使用方法

第一次使用時(shí),雙擊Niutrans.exe,界面會(huì)彈出主窗口,提示輸入API信息。

加載API

當(dāng)你輸入完API,界面上會(huì)提示【已經(jīng)加載API】。

接下來,通過設(shè)置語(yǔ)言對(duì),打開要翻譯的文件,選擇要生成的文件格式,默認(rèn)是先原文后譯文,如果想原文在后,可以去掉【原文在先】前的勾,再點(diǎn)擊【開始翻譯】就可以了。使用過程中,有可能會(huì)有卡頓現(xiàn)象,但是不影響正常的翻譯過程。

翻譯成功提示

當(dāng)?shù)玫健竟材g已經(jīng)完成】的信息時(shí),雙語(yǔ)對(duì)照格式的文件已經(jīng)生成,并以【文件名_translated.docx】結(jié)尾。以下是結(jié)果展示。

接下來,我們就可以借助這個(gè)生成的英中對(duì)照文件進(jìn)行譯后編輯,也可以借用于人工智能進(jìn)行改寫和潤(rùn)色,雖然這樣不一定有CAT工具快捷,但是它提供了一種新的問題解決路徑,實(shí)現(xiàn)了Python+機(jī)器翻譯+人工譯校的有效結(jié)合。

三、部分代碼分享

以上工具借用了Python中的tkinter搭建了界面,利用小牛機(jī)器翻譯api來實(shí)現(xiàn)了文本的翻譯,又借助了python-docx這個(gè)模塊來讀取和寫入docx文件,最后在ChatGPT的協(xié)作下,排除掉了部分bug。

工具的核心代碼是小牛調(diào)用機(jī)器翻譯api,特地把代碼分享給大家。

import json
import requests
apikey="<你自己申請(qǐng)的免費(fèi)的小牛翻譯api>"
def translate(sentence, src_lan, tgt_lan):
    url = 'http://api.niutrans.com/NiuTransServer/translation?'
    data = {"from": src_lan, "to": tgt_lan, "apikey": apikey, "src_text": sentence}
    res = requests.post(url, data = data)
    res_dict = json.loads(res.text)
    if "tgt_text" in res_dict:
        result = res_dict['tgt_text']
    else:
        result = res
    return result
if __name__ == "__main__":
    while True:
        line = input("請(qǐng)輸入要翻譯的文本:")
        try:
            trans = translate(line, 'auto', 'en')
            print(trans+"\n---------")
        except Exception as exc:
            print(exc)

四、工具代碼展示

為方便大家使用,我已經(jīng)把源碼放在下面:

from tkinter import *
from tkinter import ttk, messagebox, filedialog
import os, sys, json
from docx import Document
import xlsxwriter
import tkinter.font as tkFont
import requests
from urllib import parse

class TranslatorApp:
    def __init__(self):
        self.title = "Word文件翻譯器 1.6  20250820 | Gordon編寫"
        self.file_path = ""
        self.file_ext = ""
        self.save_base = ""
        self.output_type = "DOCX"
        self.from_lang_sel = None
        self.to_lang_sel = None
        self.api = None   # 保存API
    def init_ui(self):
        self.root = Tk()
        self.root.title(self.title)
        # self.root.iconbitmap('icon.ico')
        # ? 在 Tk() 建立之后初始化 BooleanVar
        self.show_source_first = BooleanVar(master=self.root, value=True)
        
        width, height = 600, 400
        sw, sh = self.root.winfo_screenwidth(), self.root.winfo_screenheight()
        alignstr = f"{width}x{height}+{int((sw-width)/2)}+{int((sh-height)/2)}"
        self.root.geometry(alignstr)
        self.root.resizable(False, False)

        font12 = tkFont.Font(family='宋體', size=12, weight=tkFont.BOLD)

        # 語(yǔ)言選擇
        frame1 = Frame(self.root)
        frame1.pack(pady=5)
        Label(frame1, text="1.選擇原文和譯文的語(yǔ)種", font=font12, justify=LEFT).pack()
        self.com_from = ttk.Combobox(frame1, width=17, font=font12, values=['日文', '英文', '中文'])
        self.com_from.current(0)
        self.com_from.pack(side="left")
        self.com_to = ttk.Combobox(frame1, width=17, font=font12, values=['英文', '日文', '中文'])
        self.com_to.current(2)
        self.com_to.pack(side="left")

        # 翻譯引擎
        frame2 = Frame(self.root)
        frame2.pack(pady=5)
        Label(frame2, text="2.選擇要使用的翻譯引擎", font=font12, justify=LEFT).pack()
        self.com_engine = ttk.Combobox(frame2, width=36, font=font12, values=['小牛'])
        self.com_engine.current(0)
        self.com_engine.pack()

        # 選擇文件
        frame3 = Frame(self.root)
        frame3.pack(pady=5)
        Label(frame3, text="3.打開要翻譯的文本文件", font=font12).pack()
        self.filename_var = StringVar()
        file_frame = Frame(self.root)
        file_frame.pack()
        Entry(file_frame, textvariable=self.filename_var, width=36).pack(side="left")
        Button(file_frame, text="打開文件", font=font12, command=self.select_file).pack(side="right")

        # 輸出格式
        Label(self.root, text="4.選擇要生成的文件格式", font=font12).pack()
        format_frame = Frame(self.root)
        format_frame.pack(pady=5)
        self.com_format = ttk.Combobox(format_frame, width=33, values=['DOCX', 'TXT', 'XLSX'])
        self.com_format.current(0)
        self.com_format.pack(side="left")
        Button(format_frame, text="開始翻譯", font=font12, command=self.start_translation).pack(side="right")

        # ---------------- 底部按鈕 ----------------
        bottom_frame = Frame(self.root)
        bottom_frame.pack(pady=15)

        self.api_btn=Button(bottom_frame, text="加載API", font=font12, command=self.show_settings)
        self.api_btn.pack(side="left", padx=10)
        Checkbutton(bottom_frame, text="原文在先", font=font12, variable=self.show_source_first).pack(side="left", padx=10)
        Button(bottom_frame, text="退出程序", font=font12, command=self.root.quit).pack(side="left", padx=10)
        
        # 檢查文件是否存在
        json_filename = "config.json"
        if not os.path.exists(json_filename):
            # 創(chuàng)建 JSON 文件并提示輸入 API
            with open(json_filename, "w") as json_file:
                json.dump({"api_key": self.api}, json_file)
            print("JSON 文件已創(chuàng)建。")
        else:
            # 讀取 JSON 文件內(nèi)容
            with open(json_filename, "r") as json_file:
                data = json.load(json_file)
            self.api = data.get("api")
            self.api_btn.configure(text="已經(jīng)加載API")
            #print(self.api)
        if self.api==None:
            self.show_settings()
        
        self.root.mainloop()

    # ========== API設(shè)置窗口 ==========
    def show_settings(self):
        self.settings_window = Toplevel(self.root)
        self.settings_window.attributes('-topmost', True)
        self.settings_window.title("小牛 API設(shè)置")

        Label(self.settings_window, text="請(qǐng)把小牛機(jī)器翻譯的API放在這里,使用ctrl+V:").pack(pady=5)
        self.api_var = StringVar()
        self.entry = Entry(self.settings_window, textvariable=self.api_var, width=30, font=("微軟雅黑", 12))
        self.entry.pack()

        confirm_button = Button(self.settings_window, text="確認(rèn)", command=self.apply_settings)
        confirm_button.pack(pady=10)

        # 居中窗口
        screen_width = self.settings_window.winfo_screenwidth()
        screen_height = self.settings_window.winfo_screenheight()
        self.settings_window.update_idletasks()
        window_width = self.settings_window.winfo_width()
        window_height = self.settings_window.winfo_height()
        x_position = (screen_width - window_width) // 2
        y_position = (screen_height - window_height) // 2
        self.settings_window.geometry(f"{window_width}x{window_height}+{x_position}+{y_position}")

    def apply_settings(self):
        new_api = self.api_var.get()
        self.api = new_api.strip()
        data = {'api': self.api}
        with open('config.json', 'w+', encoding='utf-8') as f:
            json.dump(data, f, indent=4, ensure_ascii=False)
        self.settings_window.destroy()
        messagebox.showinfo("提示", "API保存成功!")
        self.api_btn.configure(text="已經(jīng)加載API")
    def select_file(self):
        path = filedialog.askopenfilename(
            title="選擇要翻譯的文本文件",
            filetypes=[("Word", "*.docx"), ("文本", "*.txt"), ("All Files", "*")],
            initialdir="."
        )
        if path:
            self.file_path = path
            self.file_ext = os.path.splitext(path)[1].lower()
            self.save_base = os.path.splitext(path)[0]
            self.filename_var.set(path)

    #apikey="5c85f7de0c9cf798b5c44204632eca85"
    def translate(self,sentence, src_lan, tgt_lan):
        url = 'http://api.niutrans.com/NiuTransServer/translation?'
        data = {"from": src_lan, "to": tgt_lan, "apikey": self.api, "src_text": sentence}
        res = requests.post(url, data = data)
        res_dict = json.loads(res.text)
        if "tgt_text" in res_dict:
            result = res_dict['tgt_text']
        else:
            result = res
        return result

    def niutrans_api(self, text, from_lang, to_lang):
        return self.translate(text,"auto", to_lang)
    def get_lang_pair(self):
        mapping = {
            ("中文", "英文"): ("zh", "en"),
            ("英文", "中文"): ("en", "zh"),
            ("日文", "中文"): ("ja", "zh"),
            ("中文", "日文"): ("zh", "ja"),
            ("英文", "日文"): ("en", "ja"),
            ("日文", "英文"): ("ja", "en")
        }
        self.from_lang_sel, self.to_lang_sel = self.com_from.get(), self.com_to.get()
        return mapping.get((self.from_lang_sel, self.to_lang_sel))

    def translate_texts(self, texts):
        lang_pair = self.get_lang_pair()
        if not lang_pair:
            sys.exit(0)
        return [self.niutrans_api(t, 'auto',lang_pair[1]) if t.strip() else "" for t in texts]

    def txt_trans(self):
        with open(self.file_path, "r", encoding="utf-8") as f:
            src = [line.strip() for line in f if line.strip()]
        if self.show_source_first.get():
            return src, self.translate_texts(src)
        else:
            return self.translate_texts(src),src

    def docx_trans(self):
        doc = Document(self.file_path)
        src = [p.text for p in doc.paragraphs]
        if self.show_source_first.get():
            return src, self.translate_texts(src)
        else:
            return self.translate_texts(src),src

    def to_excel(self, src, tgt):
        wb = xlsxwriter.Workbook(self.save_base + "_translated.xlsx")
        ws = wb.add_worksheet()
        for r, (x, y) in enumerate(zip(src, tgt)):
            ws.write(r, 0, x)
            ws.write(r, 1, y)
        wb.close()

    def to_txt(self, src, tgt):
        with open(self.save_base + "_translated.txt", "w", encoding="utf-8") as f:
            for x, y in zip(src, tgt):
                f.write(f"{x}\n{y}\n")

    def convert_file(self, src, tgt):
        fmt = self.com_format.get()
        if fmt == "XLSX":
            self.to_excel(src, tgt)
        elif fmt == "DOCX":
            doc = Document()
            for x, y in zip(src, tgt):
                doc.add_paragraph(f"{x}\n{y}")
            doc.save(self.save_base + "_translated.docx")
        elif fmt == "TXT":
            self.to_txt(src, tgt)

    def start_translation(self):
        if not self.file_path:
            messagebox.showinfo("提示", "請(qǐng)先打開要翻譯的文件!")
            return
        if self.file_ext == ".docx":
            src, tgt = self.docx_trans()
        elif self.file_ext == ".txt":
            src, tgt = self.txt_trans()
        else:
            messagebox.showinfo("提示", "文件類型錯(cuò)誤,請(qǐng)重新選擇!")
            return
        self.convert_file(src, tgt)
        messagebox.showinfo("提示", "恭喜您,翻譯已經(jīng)完成!")

    def run(self):
        self.init_ui()

if __name__ == "__main__":
    TranslatorApp().run()

五、總結(jié)

以上代碼中包括了中、英、日三種語(yǔ)言的互轉(zhuǎn),速度快、效率高,但是無(wú)法保證原文一樣的格式。后期可以持續(xù)改進(jìn),簡(jiǎn)化翻譯程序,力爭(zhēng)保留Word翻譯后的格式。

到此這篇關(guān)于基于Python編寫一個(gè)Word文件翻譯器的文章就介紹到這了,更多相關(guān)Python Word文件翻譯器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python比較兩個(gè)列表大小的方法

    python比較兩個(gè)列表大小的方法

    這篇文章主要介紹了python比較兩個(gè)列表大小的方法,涉及Python針對(duì)列表的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Python畫圖時(shí)如何調(diào)用本地字體

    Python畫圖時(shí)如何調(diào)用本地字體

    這篇文章主要為大家介紹在通過Python繪制圖畫時(shí)如何調(diào)用本地的字體,從而解決中文亂碼的問題。感興趣的小伙伴快來跟隨小編學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 如何基于線程池提升request模塊效率

    如何基于線程池提升request模塊效率

    這篇文章主要介紹了如何基于線程池提升request模塊效率,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 用python寫一個(gè)定時(shí)提醒程序的實(shí)現(xiàn)代碼

    用python寫一個(gè)定時(shí)提醒程序的實(shí)現(xiàn)代碼

    今天小編就為大家分享一篇用python寫一個(gè)定時(shí)提醒程序的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python生成隨機(jī)數(shù)、隨機(jī)字符、隨機(jī)字符串的方法示例

    python生成隨機(jī)數(shù)、隨機(jī)字符、隨機(jī)字符串的方法示例

    這篇文章主要介紹了python生成隨機(jī)數(shù)、隨機(jī)字符、隨機(jī)字符串的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 15款Python編輯器的優(yōu)缺點(diǎn),別再問我“選什么編輯器”啦

    15款Python編輯器的優(yōu)缺點(diǎn),別再問我“選什么編輯器”啦

    這篇文章主要介紹了15款Python編輯器的優(yōu)缺點(diǎn),別再問我“選什么編輯器”啦,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2020-10-10
  • python常用數(shù)據(jù)結(jié)構(gòu)字典梳理

    python常用數(shù)據(jù)結(jié)構(gòu)字典梳理

    這篇文章主要介紹了python常用數(shù)據(jù)結(jié)構(gòu)字典梳理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • python定時(shí)任務(wù)schedule庫(kù)用法詳細(xì)講解

    python定時(shí)任務(wù)schedule庫(kù)用法詳細(xì)講解

    python中有一個(gè)輕量級(jí)的定時(shí)任務(wù)調(diào)度的庫(kù)schedule,下面這篇文章主要給大家介紹了關(guān)于python定時(shí)任務(wù)schedule庫(kù)用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Python提取視頻幀圖片實(shí)例代碼

    Python提取視頻幀圖片實(shí)例代碼

    大家好,本篇文章主要講的是Python提取視頻幀圖片實(shí)例代碼,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Python 實(shí)現(xiàn)繪制子圖及子圖刻度的變換等問題

    Python 實(shí)現(xiàn)繪制子圖及子圖刻度的變換等問題

    這篇文章主要介紹了Python 實(shí)現(xiàn)繪制子圖及子圖刻度的變換等問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05

最新評(píng)論

瑞安市| 乡宁县| 合作市| 项城市| 沂水县| 红桥区| 屏东县| 慈利县| 上林县| 六安市| 丰都县| 荆门市| 白朗县| 忻城县| 基隆市| 霍林郭勒市| 新密市| 八宿县| 裕民县| 牙克石市| 祁东县| 灌阳县| 成都市| 利川市| 永德县| 铜川市| 临沧市| 南溪县| 会同县| 化州市| 瑞安市| 海南省| 莱阳市| 墨玉县| 清水河县| 福海县| 兴化市| 元朗区| 兰西县| 罗田县| 台中县|