使用第三方翻译服务
两种主要的翻译服务是 Google Cloud Translation API 和 Microsoft Translator Text API 。 两者都是付费服务,但微软为低频少量的翻译提供了免费的入门级选项。 谷歌过去提供免费翻译服务,但现在,即使是最低层次的服务也需要付费。 因为我希望能够在不产生费用的情况下尝试翻译,我将实施 Microsoft 的解决方案。
在使用 Microsoft Translator API 之前,你需要先获得微软云服务 Azure 的帐户。 你可以选择免费套餐,但在注册过程中系统会要求你提供信用卡号,但在你保持该级别的服务时,你的卡不会被收取费用。
获得 Azure 帐户后,转到 Azure 门户并单击左上角的“New”按钮,然后键入或选择“Translator Text API”。 当你点击“Create”按钮时,将看到一个表单,并可以在其中定义一个新的翻译器资源,然后将其添加到你的帐户中。 你可以在下面看到我是如何完成表单的:
当你再次点击“Create”按钮时,翻译器 API 资源将被添加到你的帐户中。几秒钟之后,你将在顶栏中收到通知,说明部署了翻译器资源。 点击通知中的“Go to resource”按钮,然后点击左侧栏上的“Keys”选项。 你现在将看到两个 Key,分别标记为“Key 1”和“Key 2”。 将其中一个 Key 复制到剪贴板,然后将其设置到终端的环境变量中(如果使用的是 Microsoft Windows,请用 set
替换 export
):
(venv) $ export MS_TRANSLATOR_KEY=<paste-your-key-here>
该 Key 用于验证翻译服务,因此需要将其添加到应用配置中:
config.py : 添加 Microsoft Translator API key 到配置中。
class Config(object):
# ...
MS_TRANSLATOR_KEY = os.environ.get('MS_TRANSLATOR_KEY')
与很多配置值一样,我更喜欢将它们安装在环境变量中,并从那里将它们导入到 Flask 配置中。 对于允许访问第三方服务的密钥或密码等敏感信息,这一点尤为重要。 你绝对不想在代码中明确写出它们。
Microsoft Translator API 是一个接受 HTTP 请求的 Web 服务。 Python 中有若干 HTTP 客户端,但最常用和最简单的就是 requests
包。 所以让我们将其安装到虚拟环境中:
(venv) $ pip install requests
在下面,你可以看到我使用 Microsoft Translator API 编写翻译文本的功能。 我来新增一个 app/translate.py 模块:
app/translate.py :文本翻译函数。
import json
import requests
from flask_babel import _
from app import app
def translate(text, source_language, dest_language):
if 'MS_TRANSLATOR_KEY' not in app.config or \
not app.config['MS_TRANSLATOR_KEY']:
return _('Error: the translation service is not configured.')
auth = {'Ocp-Apim-Subscription-Key': app.config['MS_TRANSLATOR_KEY']}
r = requests.get('https://api.microsofttranslator.com/v2/Ajax.svc'
'/Translate?text={}&from={}&to={}'.format(
text, source_language, dest_language),
headers=auth)
if r.status_code != 200:
return _('Error: the translation service failed.')
return json.loads(r.content.decode('utf-8-sig'))
该函数定义需要翻译的文本、源语言和目标语言为参数,并返回翻译后文本的字符串。 它首先检查配置中是否存在翻译服务的 Key,如果不存在,则会返回错误。 错误也是一个字符串,所以从外部看,这将看起来像翻译文本。 这可确保在出现错误时用户将看到有意义的错误消息。
requests
包中的 get()
方法向作为第一个参数给定的 URL 发送一个带有 GET 方法的 HTTP 请求。 我使用 /v2/Ajax.svc/Translate URL,它是翻译服务中的一个端点,它将翻译内容荷载为 JSON 返回。文本、源语言和目标语言都需要在 URL 中分别命名为 text
, from
和 to
作为查询字符串参数。 要使用该服务进行身份验证,我需要将我添加到配置中的 Key 传递给该服务。 该 Key 需要在名为 Ocp-Apim-Subscription-Key
的自定义 HTTP 头中给出。 我创建了 auth
字典,然后将它通过 headers
参数传递给 requests
。
requests.get()
方法返回一个响应对象,它包含了服务提供的所有细节。 我首先需要检查和确认状态码是 200,这是成功请求的代码。 如果我得到任何其他代码,我就知道发生了错误,所以在这种情况下,我返回一个错误字符串。 如果状态码是 200,那么响应的主体就有一个带有翻译的 JSON 编码字符串,所以我需要做的就是使用 Python 标准库中的 json.loads()
函数将 JSON 解码为我可以使用的 Python 字符串。 响应对象的 content
属性包含作为字节对象的响应的原始主体,该属性是 UTF-8 编码的字符序列,需要先进行解码,然后发送给 json.loads()
。
下面你可以看到一个 Python 控制台会话,我演示了如何使用新的 translate()
函数:
>>> from app.translate import translate
>>> translate('Hi, how are you today?', 'en', 'es') # English to Spanish
'Hola, ¿cómo estás hoy?'
>>> translate('Hi, how are you today?', 'en', 'de') # English to German
'Are Hallo, how you heute?'
>>> translate('Hi, how are you today?', 'en', 'it') # English to Italian
'Ciao, come stai oggi?'
>>> translate('Hi, how are you today?', 'en', 'fr') # English to French
"Salut, comment allez-vous aujourd'hui ?"
很酷,对吧? 现在是时候将此功能与应用集成在一起了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论