申请 API 密钥
第一步,打开 百度翻译开放平台 的官网,注册一个百度账号。
第二步进入管理控制台,选择开发者中心 - 开发者信息,在基本信息下,完成个人认证。
第三步创建 API,选择开发者中心 - API Key 管理,创建 API。
用 Python 调这个接口
核心就是写一个 translate 函数:生成随机数,拼接字符串,做 MD5,发 GET 请求,检查 trans_result。代码在下面。
import requests
import hashlib
import random
import os
import time
# 从环境变量读取,避免密钥写死在代码里
APP_ID = os.environ.get("BAIDU_APP_ID", "你的APP_ID")
SECRET_KEY = os.environ.get("BAIDU_SECRET_KEY", "你的密钥")
def translate(text, from_lang="auto", to_lang="en"):
"""
调用百度翻译接口翻译一段文字。
text: 要翻译的字符串
from_lang: 源语言代码,auto 表示自动检测
to_lang: 目标语言代码,如 en、jp、fra
返回: 翻译后的字符串,失败则返回 None
"""
url = "https://fanyi-api.baidu.com/api/trans/vip/translate"
# 已认证高级版每秒最多 10 次,所以每次请求前等 0.1 秒
time.sleep(0.1)
# 生成随机数,防止请求被缓存
salt = str(random.randint(32768, 65536))
# 按百度要求的顺序拼接字符串,再做 MD5
sign_str = APP_ID + text + salt + SECRET_KEY
sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest()
# 组装请求参数
params = {
"q": text,
"from": from_lang,
"to": to_lang,
"appid": APP_ID,
"salt": salt,
"sign": sign
}
# 发送 GET 请求
response = requests.get(url, params=params, timeout=10)
result = response.json()
# 检查返回结果
if "trans_result" in result:
# 百度返回的是一个列表,每个元素是一条翻译结果
return result["trans_result"][0]["dst"]
else:
# 打印错误信息,方便排查
print(f"翻译失败:{result}")
return None
怎么选翻译的语言
百度翻译用简短代码表示语言,常用的有:zh 中文、en 英语、jp 日语、kor 韩语、fra 法语、spa 西班牙语、de 德语、ru 俄语,auto 表示自动检测源语言。调用时换 from_lang 和 to_lang 就行,中文翻英文是 translate(text, from_lang="zh", to_lang="en"),英文翻日语是 translate(text, from_lang="en", to_lang="jp")。百度翻译支持的语种比较多,完整列表可以查官方文档,这里只列了日常最常用的几个。
翻译 Office 文件
Office 文件分三种:Word、Excel、PowerPoint。Python 各有对应的库可以读写。这三种文件结构不同,处理方式也不一样。
Word 文档我用 python-docx。文字分散在段落和表格里,需要一个个看所有段落,把每段文字送去翻译,再把译文写回原位置。
from docx import Document
def translate_word(input_path, output_path, to_lang="en"):
"""
翻译 Word 文档中的所有段落和表格文字。
input_path: 源文件路径
output_path: 翻译后的文件保存路径
to_lang: 目标语言
"""
doc = Document(input_path)
# 遍历所有段落,跳过空段落
for para in doc.paragraphs:
if para.text.strip():
translated = translate(para.text, to_lang=to_lang)
if translated:
# 清空原段落,写入译文
para.clear()
para.add_run(translated)
# 遍历所有表格,翻译每个单元格
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
if cell.text.strip():
translated = translate(cell.text, to_lang=to_lang)
if translated:
cell.text = translated
doc.save(output_path)
print(f"翻译完成:{output_path}")
Excel 我用 openpyxl。核心是单元格,需要一个个看每一个有值的单元格,翻译后再写回去。
import openpyxl
def translate_excel(input_path, output_path, to_lang="en"):
"""
翻译 Excel 文件中所有单元格的文字。
只翻译文本类型的单元格,数字和公式不动。
"""
wb = openpyxl.load_workbook(input_path)
# 遍历每一个工作表
for sheet in wb.worksheets:
# 遍历所有行和单元格
for row in sheet.iter_rows():
for cell in row:
# 只处理字符串内容,跳过数字、日期等
if cell.value and isinstance(cell.value, str):
translated = translate(cell.value, to_lang=to_lang)
if translated:
cell.value = translated
wb.save(output_path)
print(f"翻译完成:{output_path}")
PowerPoint 我用 python-pptx。文字分布在每一页的文本框和形状里,需要一层层看过去。
from pptx import Presentation
def translate_ppt(input_path, output_path, to_lang="en"):
"""
翻译 PowerPoint 中所有文本框的文字。
遍历每一页幻灯片,再遍历每个形状里的文本框。
"""
prs = Presentation(input_path)
for slide in prs.slides:
for shape in slide.shapes:
# 检查这个形状是否有文本框
if shape.has_text_frame:
for para in shape.text_frame.paragraphs:
if para.text.strip():
translated = translate(para.text, to_lang=to_lang)
if translated:
# 直接替换整段文字
para.text = translated
prs.save(output_path)
print(f"翻译完成:{output_path}")
把这三个函数组合起来,再加一个根据文件后缀判断类型的逻辑,程序就能批量处理一个文件夹里的所有 Office 文件。
翻译 JSON 文件
JSON 的结构是嵌套的:一个键对应的值可能是字符串,也可能是对象,对象里还有键值对。我用递归函数把所有字符串值找出来,翻译完再放回去。
递归的逻辑是:遇到字典就遍历它的值,遇到列表就遍历它的元素,遇到字符串就翻译它,遇到其他类型就原样返回。这个递归函数不管 JSON 嵌套多深,都能处理到。
import json
def translate_json_value(obj, to_lang="en"):
"""
递归遍历 JSON 数据,翻译所有字符串值。
字典、列表、字符串都分别处理。
非字符串类型(数字、布尔、null)原样返回。
"""
if isinstance(obj, dict):
# 如果是字典,遍历每个键值对
return {key: translate_json_value(value, to_lang) for key, value in obj.items()}
elif isinstance(obj, list):
# 如果是列表,遍历每个元素
return [translate_json_value(item, to_lang) for item in obj]
elif isinstance(obj, str):
# 如果是字符串,翻译它
if obj.strip():
translated = translate(obj, to_lang=to_lang)
return translated if translated else obj
return obj
else:
# 数字、布尔、null 直接返回
return obj
def translate_json_file(input_path, output_path, to_lang="en"):
"""
读取 JSON 文件,翻译所有字符串值,写入新文件。
"""
with open(input_path, "r", encoding="utf-8") as f:
data = json.load(f)
translated_data = translate_json_value(data, to_lang)
with open(output_path, "w", encoding="utf-8") as f:
# ensure_ascii=False 保证中文正常显示,不转成 \uXXXX
json.dump(translated_data, f, ensure_ascii=False, indent=2)
print(f"翻译完成:{output_path}")
翻译 MySQL 数据库里的字段
数据库的场景和文件不一样。文件是整体的,数据库是一行一行的。需要连接数据库,查出要翻译的内容,翻译完再写回去。先装依赖:pip install pymysql requests。
这段逻辑很直接:先查出来,再翻译,再更新。连接时要用 charset="utf8mb4",否则数据库可能存不进中文和 emoji。表名和列名用反引号包裹,防止和 SQL 关键字冲突。
import pymysql
def translate_mysql_table(host, user, password, db_name, table_name, column_name, to_lang="en"):
"""
翻译 MySQL 表中某一列的所有文本值。
host/user/password/db_name: 数据库连接信息
table_name: 要翻译的表名
column_name: 要翻译的列名
to_lang: 目标语言
"""
# 连接数据库
conn = pymysql.connect(
host=host, user=user, password=password,
db=db_name, charset="utf8mb4"
)
cursor = conn.cursor()
# 查出所有非空值,带上主键 id 方便后续更新
sql_select = f"SELECT id, `{column_name}` FROM `{table_name}` WHERE `{column_name}` IS NOT NULL AND `{column_name}` != ''"
cursor.execute(sql_select)
rows = cursor.fetchall()
print(f"共找到 {len(rows)} 条待翻译记录")
# 逐条翻译并更新
for row_id, original_text in rows:
translated = translate(original_text, to_lang=to_lang)
if translated:
sql_update = f"UPDATE `{table_name}` SET `{column_name}` = %s WHERE id = %s"
cursor.execute(sql_update, (translated, row_id))
# 提交所有修改
conn.commit()
cursor.close()
conn.close()
print("翻译完成")