2018年7月记录了一篇《调用Google Translate API生成Drupal翻译.po文件》,当时是按照Translation API Documentation Quickstart 快速入门(基本版) 的指导来做的,需要下载私钥json文件、设置环境变量、安装Github上的php docs samples等,用起来比较麻烦。
而这种运行办法最近总是遇到与Google API服务器之间的访问报错,不是SSL报错就是host无法连接,上周耽误了2天时间来进行各种排查,还找阿里云客服咨询,多个交流来回后也没有找到根本原因,那套php docs samples太复杂了,不好准确定位到底是哪段程序访问哪个网址的时候出的问题。
这个谷歌翻译API的调用对我们的项目来说还是很重要的,不能下周继续耽误了,昨天继续在网上查资料,找到这篇“Google Translate API Tutorial for PHP / Javascript / Java”,2013年的老文章就有介绍用PHP CURL库或者更简单的file_get_contents()来调用Google Translate API的代码例子。
于是我就用简单的代码片段进行测试,访问这个网址:
https://www.googleapis.com/language/translate/v2?key={$api_key}&q=" . rawurlencode($text) . "&target={$target}&source={$source}"
很顺畅就获取到了翻译结果,再去把以前的翻译程序进行了修改,里面添加了一个函数:
/** * 函数:调用Google Translate API进行翻译 * 输入1: $source_text 需要翻译的文本 * 输入2: $source_language_code 源语言代码 * 输入3: $target_language_code 目标语言代码 * 输出: $target_text 翻译出来的文本,如果报错则返回FALSE */ function translate($source_text, $source_language_code, $target_language_code) { //如果长度大于5000则返回失败 if (strlen($source_text) >= 5000) { echo "source_text too long\n"; return FALSE; } $api_key = 'AI................k8';//从google cloud console中设置、获取的API Key $url = "https://www.googleapis.com/language/translate/v2?key={$api_key}&q="; $url .= rawurlencode($source_text); $url .= "&target={$target_language_code}&source={$source_language_code}"; $response = file_get_contents($url); $obj = json_decode($response, true); //true converts stdClass to associative array. if($obj != NULL) { if(isset($obj['error'])) { echo "Error is : ".$obj['error']['message']."\n"; return FALSE; } else { $target_text = $obj['data']['translations'][0]['translatedText']; } } else { echo "UNKNOW ERROR\n"; return FALSE; } return $target_text; }
再就可以从其它地方调用这个函数,很简单方便,不需要php docs samples中的各种组件了。
我把这个程序放在国外服务器上运行没有问题,但放在国内服务器上运行的时候报错:
PHP Warning: file_get_contents(): SSL: Connection reset by peer in test.php on line 15 PHP Warning: file_get_contents(): Failed to enable crypto in test.php on line 15 PHP Warning: file_get_contents(https://www.googleapis.com/language/translate/v2?key=xxx&q=%E5%A5%BD&target=en&source=zh-CN): failed to open stream: operation failed in test.php on line 15
从报错看应该是被墙阻止了连接,貌似国内就无法使用了,但我更换连接的域名后就解决了,从www.googleapis.com改为translation.googleapis.com,后面URI路径、参数都不需要改变,可以从国内顺利连接、获取正确的翻译内容。
需要留意的是,这种调用办法简单,只要访问一个带有API Key的网址就可以,不需要在服务器上放置json私钥文件、不需要设置服务器环境变量,但也需要考虑安全问题,如果API Key被别人使用,会导致产生大量的费用,可以参考《使用 API 密钥》这篇文章中的内容,对API Key进行安全设置,对于网站来说一般可以设置“HTTP 引荐来源网址”(密钥会公开,改用服务帐号)或者“IP 地址”来进行限制。
评论