python 实现docx指定语言翻译(不丢失格式)

news2024/11/17 17:52:07

我这边有个需求需要把一份docx翻译成指定语言的文档并且保存,研究了下,记录。

首先先安装依赖

pip install python-docx==1.1.2 googletrans==4.0.0rc1

 python-docx是用来读取docx的,googletrans使用来翻译的。

googletrans · PyPI

这个是官方文档,额外的用法可以再这里找到

然后就是使用.

传入文件名,后缀,需要翻译成的语言。我这里用的自动检测语言,但是翻译的速度就会慢一点,如果想要达到最快的翻译速度的话,最好就是指定源语言是什么。这样翻译出来需要一点点时间,但是不会丢失格式,约等于完美翻译。

from googletrans import Translator

def translate(self,filename,ext,to_language):
        after_filename=filename+self._add_suffix(to_language)
        output_file=os.path.join(self.upload_path, after_filename+ext)
        if not os.path.exists(output_file):
            translator = Translator()
            full_path=os.path.join(self.upload_path, filename+ext)
            doc = Document(full_path)
            for paragraph in doc.paragraphs:#读取每个段落,回车为结尾
                if paragraph.text.strip():
                    translated_text = self._translate_text(paragraph.text, translator,to_language,filename)
                    paragraph.text = translated_text.replace('Besides','') #因为有些时候会奇奇怪怪的出现这个翻译,就临时替换一下,之后再找具体解决方案
            for table in doc.tables:#读取所有表格内的内容,段落不会读取到表格,所以还要读取一次表格
                for row in table.rows:
                    for cell in row.cells:
                        if cell.text.strip():
                            translated_text = self._translate_text(cell.text, translator,to_language,filename)
                            cell.text = translated_text.replace('Besides','')
            doc.save(output_file)
        return after_filename,ext

def _translate_text(self,text:str, translator:Translator,to_language:str,filename:str):
        translated = translator.translate(text, src=LANGUAGE_KEY.AUTO, dest=to_language)
        current_app.logger.info(f'====== In Translate {filename}, to language : {to_language} origin text : {text}, translated : {translated.text}')
        return translated.text

def _add_suffix(self,to_language):
        return SIGN.UNDERLINE+to_language

如果要获取他所有支持的语言,找这个常量

from googletrans.constants import LANGUAGES
LANGUAGES = {
    'af': 'afrikaans',
    'sq': 'albanian',
    'am': 'amharic',
    'ar': 'arabic',
    'hy': 'armenian',
    'az': 'azerbaijani',
    'eu': 'basque',
    'be': 'belarusian',
    'bn': 'bengali',
    'bs': 'bosnian',
    'bg': 'bulgarian',
    'ca': 'catalan',
    'ceb': 'cebuano',
    'ny': 'chichewa',
    'zh-cn': 'chinese (simplified)',
    'zh-tw': 'chinese (traditional)',
    'co': 'corsican',
    'hr': 'croatian',
    'cs': 'czech',
    'da': 'danish',
    'nl': 'dutch',
    'en': 'english',
    'eo': 'esperanto',
    'et': 'estonian',
    'tl': 'filipino',
    'fi': 'finnish',
    'fr': 'french',
    'fy': 'frisian',
    'gl': 'galician',
    'ka': 'georgian',
    'de': 'german',
    'el': 'greek',
    'gu': 'gujarati',
    'ht': 'haitian creole',
    'ha': 'hausa',
    'haw': 'hawaiian',
    'iw': 'hebrew',
    'he': 'hebrew',
    'hi': 'hindi',
    'hmn': 'hmong',
    'hu': 'hungarian',
    'is': 'icelandic',
    'ig': 'igbo',
    'id': 'indonesian',
    'ga': 'irish',
    'it': 'italian',
    'ja': 'japanese',
    'jw': 'javanese',
    'kn': 'kannada',
    'kk': 'kazakh',
    'km': 'khmer',
    'ko': 'korean',
    'ku': 'kurdish (kurmanji)',
    'ky': 'kyrgyz',
    'lo': 'lao',
    'la': 'latin',
    'lv': 'latvian',
    'lt': 'lithuanian',
    'lb': 'luxembourgish',
    'mk': 'macedonian',
    'mg': 'malagasy',
    'ms': 'malay',
    'ml': 'malayalam',
    'mt': 'maltese',
    'mi': 'maori',
    'mr': 'marathi',
    'mn': 'mongolian',
    'my': 'myanmar (burmese)',
    'ne': 'nepali',
    'no': 'norwegian',
    'or': 'odia',
    'ps': 'pashto',
    'fa': 'persian',
    'pl': 'polish',
    'pt': 'portuguese',
    'pa': 'punjabi',
    'ro': 'romanian',
    'ru': 'russian',
    'sm': 'samoan',
    'gd': 'scots gaelic',
    'sr': 'serbian',
    'st': 'sesotho',
    'sn': 'shona',
    'sd': 'sindhi',
    'si': 'sinhala',
    'sk': 'slovak',
    'sl': 'slovenian',
    'so': 'somali',
    'es': 'spanish',
    'su': 'sundanese',
    'sw': 'swahili',
    'sv': 'swedish',
    'tg': 'tajik',
    'ta': 'tamil',
    'te': 'telugu',
    'th': 'thai',
    'tr': 'turkish',
    'uk': 'ukrainian',
    'ur': 'urdu',
    'ug': 'uyghur',
    'uz': 'uzbek',
    'vi': 'vietnamese',
    'cy': 'welsh',
    'xh': 'xhosa',
    'yi': 'yiddish',
    'yo': 'yoruba',
    'zu': 'zulu',
}

如果需要手动检测语言,可以调用这个方法.

from googletrans import Translator
from googletrans.models import Detected

translator = Translator()
text_d:Detected=translator.detect(some_text)
lang_key=text_d.lang

可以看到他的source code是返回的一个 Detcted,直接.lang就可以拿到语言的key了

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

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

相关文章

MATLAB 2024b 更新了些什么?

MATLAB 2024b版本已经推出了预览版,本期介绍一些MATLAB部分的主要的更新内容。 帮助浏览器被移除 在此前的版本,当我们从MATLAB中访问帮助文档时,默认会通过MATLAB的帮助浏览器(Help browser)。 2024b版本开始&…

uniapp 去掉小数末尾多余的0

文章目录 在uniapp或者一般的JavaScript环境中,要去掉小数末尾的0,可以使用以下几种方法: 使用parseFloat()函数 let num 123.4500; let result parseFloat(num); console.log(result); // 输出: 123.45字符串处理 将数字转换为字符串&am…

js的作用域链

function test(){} 运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是 独一无二的,所以多次调用一个函数对导致创建多个执行上下…

在pycharm里如何使用Jetbrains AI Assistant

ai assistant激活成功后,如图 ai assistant渠道:https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上,Google 为 Android Studio 推出了 Studio Bot 功能,使用了谷歌编码基础模型 Codey,Codey 是…

云联壹云 FinOps:赋能某车企公有云成本管理与精细化运营

背景 某车企,世界 500 强企业,使用了大量的公有云资源,分布于多家公有云,月消费在千万级别。 业务线多且分散,相关的云消耗由一个核心团队进行管理,本次案例的内容将围绕这些云成本的管理展开的。 需求 …

Google重大更新--解读Android Auto认证4.3

Google在今年五月更新了Android Auto 4.2.2版本,而在2024年7月他们推出了Android Auto 4.3版本,这是自2023年9月以来对Android Auto 4.2版本的一次重大更新。 为了确保合规性和顺利认证,OEM和Tire1必须确保PDK组件版本与正在认证的主机的Rece…

如何魔改vnstat-docker项目使其支持每1分钟采样?

文章目录 一、概述二、官网参考1. 官网地址2. 查看打包过程3.打包命令 三、修改过的文件四、部署运行1. 编排文件2. 运行效果 一、概述 接前文 网络流量监控神器vnStat初探 我们已经了解了vnStat的作用、使用和docker部署。 同时也了解到官方版本支持的采样统计间隔最小为5分…

Mysql数据库索引、事务相关知识

索引 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现 查看索引 show index from 表名;创建索引对于非主键、非唯一约束、非外键的字段&#…

制作Ai 数字人和数字人带货全面拆解复盘

看了后不用再花高价钱去买怎么制作数字人 .数字人带货的相关教程了 市面上基本都是通过这几个方法制作的数字人 超级详细 值得注意的是 拆解的太详细 仅供正规个人用途哦 请勿用于任何非法操作 否则 就不用接着往下看了 点击获取完整版资料

Python基础小知识问答系列-高效遍历多个不同类型元素的迭代器

1. 问题: 当需要对多个迭代器进行相同遍历操作时,如何避免因为迭代器之间的类型或者迭代器元素 数量过大引发的问题? 2. 解决方法: 使用itertools模块中的chain函数。 示例: from itertools import chainlist_a [2,…

炫云云渲染平台:解锁设计师无限创意的魔法钥匙

在数字创意的浩瀚宇宙中,设计师们如同星辰般璀璨,他们以无尽的想象力和精湛的技能,绘制出一幅幅令人叹为观止的视觉盛宴。然而,在追求完美的道路上,复杂的渲染过程往往成为制约创意飞跃的瓶颈。这时,炫云云…

2024菜鸟春招笔试

第一题 解题思路: 签到题,把帖子按好评度降序排列,再将人按升序排列。 第二题 解题思路 从左到右遍历,如果当前元素没有错排,将其与后一个交换,这样两个元素一定都错排。 第三题 、 解题思路 这题当时暴力…

前端面试题21(js排序方法)

JavaScript 中有多种内置和自定义的排序方法。内置的 .sort() 方法是最直接的排序方式,而自定义排序算法如冒泡排序、选择排序、插入排序、希尔排序、快速排序等则提供了更深层次的学习和应用价值。下面我将详细介绍这些排序方法,并给出相应的示例代码。…

大学生电子设计大赛超全资料分享

超全大学生电子设计大赛项目合集免费分享 电赛竞赛资料大全,新增竞赛空间电子设计资料。包含嵌入式硬件和软件开发的学习资料,包括PCB教程,单片机例程, 单片机课程设计毕业设计参考资料、项目设计方案,源码和开发文档…

观察矩阵(View Matrix)、投影矩阵(Projection Matrix)、视口矩阵(Window Matrix)及VPM矩阵及它们之间的关系

V表示摄像机的观察矩阵(View Matrix),它的作用是把对象从世界坐标系变换到摄像机坐标系。因此,对于世界坐标系下的坐标值worldCoord(x0, y0, z0),如果希望使用观察矩阵VM将其变换为摄像机坐标系下的坐标值localCoord(x…

基于java+springboot+vue实现的流浪动物管理系统(文末源码+Lw)277

摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对流浪动物信息管理的提升&…

【Linux】:进程创建与终止

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux程序地址空间的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从…

嵌入式开发者应该有的心态自信

各位开发者大家好,今天主要给大家分享一下,嵌入式开发者应该有的心态,缓解工作和生活中的压力,也是非常重要的。 真的。 世界就是个巨大的草台班子,自信点,别人没有你想象的那么厉害。 普通人最大的问题,就是过分高估别人,并且过分贬低自己。 一、对那些看似厉害的人…

算法设计练笔

T1、给定由n个整数&#xff08;可能为负数&#xff09;组成的序列a1,a2,...,an&#xff0c;求该序列子段和的最大值。当所有整数均为负数时&#xff0c;其最大子段和为0。 【输入】 第一行一个整数&#xff0c;表示n的值, 1<n<100; 第二行n个整数&#xff0c;表示a1,a2,.…

nacos源码 nacos注册中心1.4.x 源码 spring cloud alibaba 的discovery做了什么 nacos客户端是如何启动的(二)

spring-cloud-alibaba-nacos-discovery 老版本中如何调用nacos的 1. 整体结构&#xff1a; 2. 思考: 如果你来做&#xff0c;如何做client 向server注册服务&#xff1a; 1.2.1 读yml&#xff0c;或本地文件找到服务器地址&#xff0c;以及其他配置 1.2.2 向server注册服务 1.2…