接下来一步就是在 blog 旁边显示 “翻译” 链接(文件 app/templates/posts.html):
{% if post.language != None and post.language != '' and post.language != g.locale %} <div><a href="#">{{ _('Translate') }}</a></div> {% endif %}这个链接需要我们添加一个新的翻译文本, “翻译”(‘Translate’) 是需要被包含在翻译文件里面,这里需要执行前面一章介绍的更新翻译文本的流程。
我们现在还不清楚如何触发这个翻译,因此现在链接不会做任何事情。
翻译服务在我们的应用能够使用实时翻译之前,我们需要找到一个可用的服务。
现在有很多可用的翻译服务,但是很多是需要收费的。
两个主流的翻译服务是 Google Translate 和 Microsoft Translator。两者都是有偿服务,但微软提供的是免费的入门级的 API。在过去,谷歌提供了一个免费的翻译服务,但已不存在。这使我们很容易选择翻译服务。
使用 Microsoft Translator 服务为了使用 Microsoft Translator,这里有一些流程需要完成:
应用的开发者需要在 Azure Marketplace 上注册 Microsoft Translator app。这里可以选择服务级别(免费的选项在最下面)。
接着开发者需要 注册应用。注册应用将会获得客户端 ID 以及客户端密钥代码,这些用于发送请求的一部分。
一旦注册部分完成,接下来处理请求翻译的步骤如下:
获取一个访问令牌,需要传入客户端 ID 和客户端密钥。
调用需要的翻译服务,Ajax,HTTP 或者 SOAP,提供访问令牌和要翻译的文本。
这听起来很复杂,因此如果不需要关注细节的话,这里有一个做了很多“脏”工作并且把文本翻译成别的语言的函数(文件 app/translate.py):
try: import httplib # Python 2 except ImportError: import http.client as httplib # Python 3 try: from urllib import urlencode # Python 2 except ImportError: from urllib.parse import urlencode # Python 3 import json from flask.ext.babel import gettext from config import MS_TRANSLATOR_CLIENT_ID, MS_TRANSLATOR_CLIENT_SECRET def microsoft_translate(text, sourceLang, destLang): if MS_TRANSLATOR_CLIENT_ID == "" or MS_TRANSLATOR_CLIENT_SECRET == "": return gettext('Error: translation service not configured.') try: # get access token params = urlencode({ 'client_id': MS_TRANSLATOR_CLIENT_ID, 'client_secret': MS_TRANSLATOR_CLIENT_SECRET, 'scope': 'http://api.microsofttranslator.com', 'grant_type': 'client_credentials'}) conn = httplib.HTTPSConnection("datamarket.accesscontrol.windows.net") conn.request("POST", "/v2/OAuth2-13", params) response = json.loads (conn.getresponse().read()) token = response[u'access_token'] # translate conn = httplib.HTTPConnection('api.microsofttranslator.com') params = {'appId': 'Bearer ' + token, 'from': sourceLang, 'to': destLang, 'text': text.encode("utf-8")} conn.request("GET", '/V2/Ajax.svc/Translate?' + urlencode(params)) response = json.loads("{\"response\":" + conn.getresponse().read().decode('utf-8') + "}") return response["response"] except: return gettext('Error: Unexpected error.')