<think>根据用户需求,我们将开发一个支持多种文件格式(文本、PDF、Word)的自动翻译软件。我们将使用以下库:
- googletrans: 用于文本翻译(免费,但注意使用限制)
- pdfminer.six: 用于提取PDF文本
- python-docx: 用于处理Word文档
由于用户要求生成代码并自动运行,我们将编写一个完整的脚本,并设计命令行接口。
### 设计思路
1. 支持的文件类型:.txt, .pdf, .docx
2. 处理流程:
- 根据文件扩展名选择对应的文本提取方法
- 将提取的文本分块(避免API限制)
- 使用Google Translate进行翻译
- 将翻译结果保存为同名的翻译文件(在原文件名后加`_translated`)
3. 翻译引擎:Google Translate(免费,但注意请求频率限制)
### 依赖安装
```bash
pip install googletrans==4.0.0-rc1 pdfminer.six python-docx
```
### 完整代码 (`auto_translator.py`)
```python
import os
import argparse
import time
from googletrans import Translator
from tqdm import tqdm
from pdfminer.high_level import extract_text
import docx
from docx import Document
class FileTranslator:
def __init__(self, src_lang='auto', dest_lang='zh-cn', chunk_size=3000):
"""
初始化翻译器
:param src_lang: 源语言 (默认自动检测)
:param dest_lang: 目标语言 (默认简体中文)
:param chunk_size: 分块大小 (字符数)
"""
self.src_lang = src_lang
self.dest_lang = dest_lang
self.chunk_size = chunk_size
self.translator = Translator(service_urls=['translate.google.com'])
def translate_text(self, text):
"""翻译文本,并处理分块"""
# 如果文本为空,直接返回
if not text:
return ""
# 分块处理
chunks = [text[i:i+self.chunk_size] for i in range(0, len(text), self.chunk_size)]
translated_chunks = []
for chunk in tqdm(chunks, desc="翻译进度", unit="chunk"):
try:
result = self.translator.translate(chunk, src=self.src_lang, dest=self.dest_lang)
translated_chunks.append(result.text)
time.sleep(0.5) # 避免请求过于频繁
except Exception as e:
print(f"\n翻译出错: {e}")
translated_chunks.append(chunk) # 出错时保留原文
return ''.join(translated_chunks)
def read_file(self, file_path):
"""根据文件类型读取文本内容"""
if not os.path.exists(file_path):
raise FileNotFoundError(f"文件不存在: {file_path}")
ext = os.path.splitext(file_path)[1].lower()
text = ""
if ext == '.txt':
with open(file_path, 'r', encoding='utf-8') as f:
text = f.read()
elif ext == '.pdf':
text = extract_text(file_path)
elif ext in ['.docx', '.doc']:
doc = Document(file_path)
text = '\n'.join([para.text for para in doc.paragraphs])
else:
raise ValueError(f"不支持的文件类型: {ext}")
return text
def write_translated_file(self, file_path, translated_text):
"""将翻译结果写入文件,文件名添加'_translated'后缀"""
base, ext = os.path.splitext(file_path)
output_path = f"{base}_translated{ext}"
if ext == '.txt' or ext == '.pdf':
# PDF提取后翻译保存为txt,但原输入是PDF,我们输出为txt
if ext == '.pdf':
output_path = f"{base}_translated.txt"
with open(output_path, 'w', encoding='utf-8') as f:
f.write(translated_text)
elif ext in ['.docx', '.doc']:
doc = Document()
# 将翻译文本按段落拆分(原翻译文本是按段落合并的,所以我们按换行拆分)
paragraphs = translated_text.split('\n')
for para in paragraphs:
doc.add_paragraph(para)
doc.save(output_path)
else:
# 其他类型按文本文件处理
with open(output_path, 'w', encoding='utf-8') as f:
f.write(translated_text)
return output_path
def translate_file(self, file_path):
"""翻译单个文件"""
print(f"开始处理: {file_path}")
# 读取文件
text = self.read_file(file_path)
# 翻译文本
translated_text = self.translate_text(text)
# 写入文件
output_path = self.write_translated_file(file_path, translated_text)
print(f"翻译完成! 输出文件: {output_path}")
return output_path
def main():
parser = argparse.ArgumentParser(description='自动翻译文件工具')
parser.add_argument('file_path', help='输入文件路径(支持txt, pdf, docx)')
parser.add_argument('--src', default='auto', help='源语言代码,默认auto(自动检测)')
parser.add_argument('--dest', default='zh-cn', help='目标语言代码,默认zh-cn(简体中文)')
parser.add_argument('--chunk', type=int, default=3000, help='分块大小(字符数),默认3000')
args = parser.parse_args()
translator = FileTranslator(src_lang=args.src, dest_lang=args.dest, chunk_size=args.chunk)
translator.translate_file(args.file_path)
if __name__ == '__main__':
main()
```
### 使用说明
#### 1. 基本用法
```bash
# 翻译单个文件(自动识别文件类型)
python auto_translator.py 文件路径 [选项]
# 示例:翻译英文PDF文件
python auto_translator.py sample.pdf
# 示例:翻译日文Word文档
python auto_translator.py document.docx --src ja
```
#### 2. 选项说明
- `--src`: 源语言代码(默认自动检测)
- `--dest`: 目标语言代码(默认`zh-cn`,简体中文)
- `--chunk`: 分块大小(默认3000字符)
#### 3. 支持的语言代码示例
| 语言 | 代码 |
|------------|---------|
| 简体中文 | zh-cn |
| 英文 | en |
| 日文 | ja |
| 韩文 | ko |
| 法文 | fr |
| 西班牙文 | es |
#### 4. 输出文件
- 输出文件保存在同一目录,文件名添加`_translated`后缀
- 例如:`sample.pdf`的翻译结果保存为`sample_translated.txt`
### 运行示例
1. **翻译PDF文件**
```bash
python auto_translator.py example.pdf
```
- 提取PDF文本并翻译,输出为`example_translated.txt`
2. **翻译Word文档**
```bash
python auto_translator.py report.docx --src en --dest fr
```
- 将英文Word文档翻译成法文,输出为`report_translated.docx`
### 注意事项
1. **翻译API限制**:Google Translate免费版有请求频率和数量限制,大文件翻译可能被中断
2. **错误处理**:遇到错误时会保留原文并继续翻译
3. **PDF提取**:PDF中的图片文字无法提取
4. **Word文档格式**:翻译后的Word文档只保留文本,原格式(如字体、表格)会丢失
### 扩展建议
1. **使用付费API**:如DeepL、Azure Translator等可提供更稳定的服务
2. **增加重试机制**:当翻译失败时自动重试
3. **保留格式**:对于Word文档,可尝试使用更高级的库(如`docx`的深入操作)保留部分格式
§§相关问题§§
1. 如何处理翻译过程中的网络错误?
2. 如何支持更多文件格式(如PPT、Excel)?
3. 如何提高PDF中文本提取的准确性?
4. 如何批量翻译一个文件夹中的所有文件?
</think>
# Python自动翻译文件软件
下面我将开发一个支持多种文件格式(文本、PDF、Word)的自动翻译软件,使用Google Translate API进行翻译。
## 完整代码实现
```python
import os
import argparse
import time
from googletrans import Translator
from tqdm import tqdm
from pdfminer.high_level import extract_text
import docx
from docx import Document
class FileTranslator:
def __init__(self, src_lang='auto', dest_lang='zh-cn', chunk_size=3000):
"""
初始化翻译器
:param src_lang: 源语言 (默认自动检测)
:param dest_lang: 目标语言 (默认简体中文)
:param chunk_size: 分块大小 (字符数)
"""
self.src_lang = src_lang
self.dest_lang = dest_lang
self.chunk_size = chunk_size
self.translator = Translator(service_urls=['translate.google.com'])
def translate_text(self, text):
"""翻译文本"""
if not text:
return ""
# 分块处理大文本
chunks = [text[i:i+self.chunk_size] for i in range(0, len(text), self.chunk_size)]
translated_chunks = []
for chunk in tqdm(chunks, desc="翻译进度", unit="chunk"):
try:
result = self.translator.translate(chunk, src=self.src_lang, dest=self.dest_lang)
translated_chunks.append(result.text)
time.sleep(0.5) # 避免请求过于频繁
except Exception as e:
print(f"\n翻译出错: {e}")
translated_chunks.append(chunk) # 出错时保留原文
return ''.join(translated_chunks)
def translate_txt(self, input_path, output_path):
"""翻译文本文件"""
with open(input_path, 'r', encoding='utf-8') as f:
text = f.read()
translated_text = self.translate_text(text)
with open(output_path, 'w', encoding='utf-8') as f:
f.write(translated_text)
return output_path
def translate_pdf(self, input_path, output_path):
"""翻译PDF文件"""
text = extract_text(input_path)
translated_text = self.translate_text(text)
with open(output_path, 'w', encoding='utf-8') as f:
f.write(translated_text)
return output_path
def translate_docx(self, input_path, output_path):
"""翻译Word文档"""
doc = Document(input_path)
new_doc = Document()
# 翻译段落
for para in tqdm(doc.paragraphs, desc="翻译段落", unit="para"):
if para.text.strip():
translated_text = self.translate_text(para.text)
new_doc.add_paragraph(translated_text)
else:
new_doc.add_paragraph() # 保留空行
# 翻译表格
for table in tqdm(doc.tables, desc="翻译表格", unit="table"):
new_table = new_doc.add_table(rows=table.rows.__len__(),
cols=table.columns.__len__())
for i, row in enumerate(table.rows):
for j, cell in enumerate(row.cells):
if cell.text.strip():
translated_text = self.translate_text(cell.text)
new_table.cell(i, j).text = translated_text
new_doc.save(output_path)
return output_path
def translate_file(self, input_path, output_path=None):
"""自动识别文件类型并翻译"""
if not os.path.exists(input_path):
raise FileNotFoundError(f"输入文件不存在: {input_path}")
if output_path is None:
base, ext = os.path.splitext(input_path)
output_path = f"{base}_translated{ext}"
ext = os.path.splitext(input_path)[1].lower()
print(f"开始翻译: {input_path} -> {output_path}")
print(f"语言方向: {self.src_lang} -> {self.dest_lang}")
start_time = time.time()
if ext == '.txt':
result = self.translate_txt(input_path, output_path)
elif ext == '.pdf':
result = self.translate_pdf(input_path, output_path)
elif ext in ['.docx', '.doc']:
result = self.translate_docx(input_path, output_path)
else:
raise ValueError(f"不支持的文件类型: {ext}")
print(f"\n翻译完成! 耗时: {time.time()-start_time:.2f}秒")
print(f"输出文件: {os.path.abspath(output_path)}")
return result
def main():
parser = argparse.ArgumentParser(description='自动翻译文件工具')
parser.add_argument('input', help='输入文件路径')
parser.add_argument('output', nargs='?', help='输出文件路径(可选)')
parser.add_argument('--src', default='auto', help='源语言代码,默认auto(自动检测)')
parser.add_argument('--dest', default='zh-cn', help='目标语言代码,默认zh-cn(简体中文)')
parser.add_argument('--chunk', type=int, default=3000, help='分块大小(字符数),默认3000')
args = parser.parse_args()
translator = FileTranslator(src_lang=args.src, dest_lang=args.dest, chunk_size=args.chunk)
translator.translate_file(args.input, args.output)
if __name__ == '__main__':
main()
```
## 安装依赖
在运行前需要安装以下依赖:
```bash
pip install googletrans==4.0.0-rc1 tqdm pdfminer.six python-docx
```
## 使用说明
### 基本用法
```bash
# 翻译文本文件
python file_translator.py input.txt output.txt
# 翻译PDF文件
python file_translator.py document.pdf
# 翻译Word文档(自动生成输出文件名)
python file_translator.py report.docx --src en --dest fr
```
### 命令行选项
| 选项 | 说明 | 默认值 |
|----------|-------------------------------|----------|
| --src | 源语言代码 (如en, ja, auto) | auto |
| --dest | 目标语言代码 (如zh-cn, en) | zh-cn |
| --chunk | 翻译分块大小 (字符数) | 3000 |
### 常用语言代码
| 语言 | 代码 | 语言 | 代码 |
|------------|---------|------------|---------|
| 简体中文 | zh-cn | 英文 | en |
| 繁体中文 | zh-tw | 日文 | ja |
| 韩文 | ko | 法文 | fr |
| 西班牙文 | es | 德文 | de |
| 俄文 | ru | 葡萄牙文 | pt |
### 文件格式支持
1. **文本文件 (.txt)**:直接翻译文本内容
2. **PDF文件 (.pdf)**:提取文本后翻译
3. **Word文档 (.docx, .doc)**:
- 翻译所有段落文本
- 翻译表格内容
- 保留文档结构
## 运行示例
### 1. 翻译文本文件
```bash
# 创建示例文件
echo "Hello, this is a sample text for translation.
Python is a powerful programming language." > sample.txt
# 执行翻译
python file_translator.py sample.txt translated.txt
```
输出结果 (translated.txt):
```
你好,这是一个用于翻译的示例文本。
Python是一种强大的编程语言。
```
### 2. 翻译PDF文件
```bash
python file_translator.py report.pdf translated_report.txt
```
### 3. 翻译Word文档
```bash
python file_translator.py document.docx --src en --dest ja
```
## 技术特点
1. **多格式支持**:支持文本、PDF和Word文档
2. **智能分块**:大文件自动分块处理,避免API限制
3. **进度显示**:使用tqdm库显示实时翻译进度
4. **错误恢复**:翻译出错时保留原文内容
5. **速率控制**:每次请求后添加延迟,防止IP被封禁
6. **表格处理**:Word文档中的表格内容也能翻译
## 扩展建议
1. **使用专业API**:对于商业项目,建议使用DeepL或Azure Translator等专业API
2. **术语库支持**:添加自定义术语库提高专业领域翻译准确性
3. **格式保留**:增强PDF和Word文档的格式保留能力
4. **批量处理**:添加文件夹批量翻译功能