从 Python 使用 DeepL 翻译器(第 2 部分)

在本文中,我们将介绍如何使用 DeepL Translation API 的第二部分,即文件翻译。 (点击这里查看第一期)
* 假定您具备 Python 和 Linux 的基本知识。
翻译文本文件
现在我们已经预热了,让我们做一些文件转换。
这需要三个 API 调用的组合。
准备一个包含相应日语的文本文件 test.txt 。
我们将考虑一种将其翻译成英语 (US) 并将其保存为 test.trans.txt 的机制。
步骤 1:上传源语言文件
当你向 DeepL 的服务器发出翻译请求时,你需要指定源语言文件。
$ curl https://api.deepl.com/v2/document \
$ -F file=@test.txt \
$ -F auth_key=${auth_key} \
$ -F target_lang=en-us
接受翻译请求的文件的 document_id 和 document_key 存储在
毕竟,它将以 JSON 格式从服务器返回。
如果你用 Python 编写发送到发送的过程,它将看起来像这样:
url = 'https://api.deepl.com/v2/document'
文件 = dict()
文件['文件'] = 打开(fn, 'rb')
files['auth_key'] = (无, get_key())
files['target_lang'] = (无, 'en-us')
res = requests.post(url, files=文件)
指定 auth_key 和 target_lang 非常棘手。
有几种方法可以指定文件项,对于二进制元组,
一项是文件名,第二项是对象。
如果您指定了一个字符串,它将像这样写。
或者,auth_key 和 target_lang 可以使用
与第一个字符串翻译一样,将其存储在 data (dict 格式) 和
您还可以将数据和文件传递给 requests.post()。
第 2 步:获取翻译状态
查询正在翻译的文件的翻译状态:
$ document_id=[文档 ID]
$ document_key=[documentKey]
$ curl https://api.deepl.com/v2/document/${document_id} \
$ -d auth_key=${auth_key} \
$ -d document_key=${document_key}
状态可以是 queued、translating 或
其中有四个:error (发生翻译错误) 和 done (翻译完成)。
在翻译的情况下,还会返回剩余处理时间的估计值。
假设我们已经为变量分配了 document_id 和 document_key ,
如果你用 Python 编写发送到发送的过程,它将看起来像这样:
网址 = f'https://api.deepl.com/v2/document/{document_id}'
数据 = dict()
data['auth_key'] = get_key()
data['document_key'] = document_key
res = requests.post(url, data=data)
步骤 3:下载目标语言文件
翻译状态 完成后 ,下载文件:
$ curl https://api.deepl.com/v2/document/${document_id}/结果 \
$ -d auth_key=${auth_key} \
$ -d document_key=${document_key} > test.trans.txt
您只能下载一次。
翻译结果正在重定向(保存)到 test.trans.txt 。
如果你用 Python 编写发送到发送的过程,它将看起来像这样:
网址 = f'https://api.deepl.com/v2/document/{document_id}/result'
数据 = dict()
data['auth_key'] = get_key()
data['document_key'] = document_key
res = requests.post(url, data=data)
文件翻译过程
最后,我们将连接上述流程。
步骤 2 仅返回翻译的进度,因此
您需要等待结果。 基本上:
在翻译的情况下,剩余时间为 seconds_remaining
休眠几秒钟,然后再次检查进度。
如果完成或发出错误,则退出循环。
如果你用 Python 编写上述过程,它将看起来像这样:
import requests
import json
from time import sleep
def get_key() 的:
返回 open('key.txt').read().rstrip()
def upload_src(fn):
”’
文件翻译步骤 1:上传源语言文件
”’
url = 'https://api.deepl.com/v2/document'
文件 = dict()
文件['文件'] = 打开(fn, 'rb')
files['auth_key'] = (无, get_key())
files['target_lang'] = (无, 'en-us')
res = requests.post(url, files=文件)
res_status = res.status_code # 200 如果成功(现在未使用)
res_text = res.text
res_data = json.loads(res_text)
document_id = res_data['document_id']
document_key = res_data['document_key']
返回 document_id、document_key
def get_trans_status(document_id, document_key):
”’
第 2 步:获取翻译处理状态
”’
网址 = f'https://api.deepl.com/v2/document/{document_id}'
数据 = dict()
data['auth_key'] = get_key()
data['document_key'] = document_key
res = requests.post(url, data=data)
res_status = res.status_code # 200 如果成功(现在未使用)
res_text = res.text
res_data = json.loads(res_text)
返回 res_data
def check_proceeding(document_id, document_key):
”’
文件翻译步骤 2:等待翻译
”’
while True:
回复 = get_trans_status(document_id, document_key)
状态 = res['状态']
print(f'status: {status}', flush=True)
seconds_remaining = 0
如果 status == 'done' 或 status == 'error':
破
elif status == '正在翻译':
如果 Res 中的 'seconds_remaining':
seconds_remaining = int(res['seconds_remaining'])
# 避免错误
如果 seconds_remaining <= 0:
seconds_remaining = 10
else: # 排队,等等。
通过
print(f'...waiting for (another) {seconds_remaining}s', flush=True)
休眠(seconds_remaining)
退货状态
def download_tgt(fn, document_id, document_key):
”’
文件翻译步骤 3:下载目标语言文件
”’
网址 = f'https://api.deepl.com/v2/document/{document_id}/result'
数据 = dict()
data['auth_key'] = get_key()
data['document_key'] = document_key
res = requests.post(url, data=data)
res_status = res.status_code # 200 如果成功(现在未使用)
tgt_bin = res._content
将 open(fn, 'w', encoding='utf-8′) 作为 f:
print(tgt_bin.decode('utf-8'), end=“, file=f)
def main() 的
fn_src = 'test.txt'
fn_tgt = fn_src.replace('.txt', '.trans.txt')
打印(f'fn_src: {fn_src}')
print(f'fn_tgt: {fn_tgt}')
print(f'上传: {fn_src}')
document_id,document_key = upload_src(fn_src)
状态 = check_proceeding(document_id, document_key)
如果 status == 'done':
print(f'下载: {fn_tgt}')
download_tgt(fn_tgt、document_id、document_key)
if __name__ == '__main__':
主()
这三种类型的 API 调用类似。
主题为 “用 Python 编写 curl 命令”
我不敢总结它,也不敢用冗长的方式写它。
这就是本文的全部内容:
- 我使用 DeepL 的 API 来翻译文件。
- 我通过在 Python 中表达 curl 命令的内容来创建一个程序。
感谢您的阅读。