很久前就使用Drupal做多语言网站,采用了Drupal自带的多语言支持,对于需要大量翻译的词汇,采用自定义模块配套的.po文件来导入翻译内容。
以前翻译一些外文的时候用到Google翻译,总是在Web界面进行:https://translate.google.cn/ 或者 https://translate.google.com/ ,将需要翻译的词、句输入,翻译后将输出内容复制、粘贴到.po文件或者直接粘贴到Drupal的翻译界面。
但如果需要翻译的词、句量很大,或者需要翻译的目标语言很多的时候,反复复制粘贴都是一个很费时间的事情。
最近在对以前的一个多语言网站IP查询进行多语言内容的添加,就发现很费力,100种语言在Web界面切换、复制、粘贴需要几百次鼠标操作、至少10多分钟,复杂一些的还不止。
想到用Google Translate API来进行,自从Google API Console改版好些年都没有使用,今天花了几个小时算是基本弄出来了。
按照Translation API Documentation Quickstart 的指导来做的。
- 设置项目
- Create or select a project.
- Enable the Cloud Translation API for that project.
- Create a service account.
- Download a private key as JSON.(记下保存的目录和文件名)
- 设置环境变量
- Linux: export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"(使用上面的目录和文件名)
- Windows: $env:GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
- 安装Github上的php docs samples
- git clone https://github.com/GoogleCloudPlatform/php-docs-samples
- cd php-docs-samples/translate
- composer install
- 测试运行php-docs-samples/translate下的translate.php
- 复制quickstart.php,修改成自己需要的程序(需要翻译的多组字符和需要输出的多种语言双重循环),输出保存为.po格式文件(多行处理需要进行一些替换,输入字符换行替换为<br />,输出字符再替换回换行以及增加的\r\n,还有一些单引号、双引号的处理等)
- 用drush language-import导入.po文件到Drupal网站
实际使用效果不错,可以节约大量时间精力。
不过要注意,调用Google Translate API是需要收费的,$20美元/1百万字符,如果真对自己有帮助,这费用也是值得的。
另外,调用谷歌翻译API速度有限制,100秒100,000字符,也就是1000字符/秒,如果字符数量很多,可以在程序里面计算出需要延时的秒数,用sleep()来进行延时。
补充:2019年12月28日在国内阿里云服务器上composer install安装失败,2020年5月13日重新安装成功,但运行php quickstart.php时遇到报错(此前已经设置export GOOGLE_APPLICATION_CREDENTIALS="/path/my-project-12345-translate-1234abcd.json"):
PHP Fatal error: Uncaught exception 'Google\Cloud\Core\Exception\ServiceException' with message 'cURL error 7: couldn't connect to host (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)' in /path/php-docs-samples/translate/vendor/google/cloud-core/src/RequestWrapper.php:362
Stack trace:
#0 /path/php-docs-samples/translate/vendor/google/cloud-core/src/RequestWrapper.php(206): Google\Cloud\Core\RequestWrapper->convertToGoogleException(Object(Google\Cloud\Core\Exception\ServiceException))
#1 /path/php-docs-samples/translate/vendor/google/cloud-core/src/RestTrait.php(96): Google\Cloud\Core\RequestWrapper->send(Object(GuzzleHttp\Psr7\Request), Array)
#2 /path/php-docs-samples/translate/vendor/google/cloud-translate/src/V2/Connection/Rest.php(83): Google\Cloud\Translate\V2\Connection\Rest->send('translations', 'translate', Array)
#3 /path/php-docs-samples/translate/vendor/google/cloud-translate/src/V2/TranslateClient.php(248): Google\Cloud\Translate\V2\Connection\Rest->listTranslations(Array)
#4 /path/php-docs-samples/transl in /path/php-docs-samples/translate/vendor/google/cloud-core/src/RequestWrapper.php on line 362
You have new mail in /var/spool/mail/path
这种报错好像在国外ecs上运行时也出现过,但只是偶尔出现。国内服务器还要再试一试,看是否与国外google translate的连接受阻有关?
PHP Fatal error: Uncaught exception 'Google\Cloud\Core\Exception\ServiceException' with message 'cURL error 35: SSL connect error (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)' in /root/php-docs-samples/translate/vendor/google/cloud-core/src/RequestWrapper.php:362
Stack trace:
#0 /root/php-docs-samples/translate/vendor/google/cloud-core/src/RequestWrapper.php(206): Google\Cloud\Core\RequestWrapper->convertToGoogleException(Object(Google\Cloud\Core\Exception\ServiceException))
#1 /root/php-docs-samples/translate/vendor/google/cloud-core/src/RestTrait.php(96): Google\Cloud\Core\RequestWrapper->send(Object(GuzzleHttp\Psr7\Request), Array)
#2 /root/php-docs-samples/translate/vendor/google/cloud-translate/src/V2/Connection/Rest.php(83): Google\Cloud\Translate\V2\Connection\Rest->send('translations', 'translate', Array)
#3 /root/php-docs-samples/translate/vendor/google/cloud-translate/src/V2/TranslateClient.php(248): Google\Cloud\Translate\V2\Connection\Rest->listTranslations(Array)
#4 /root/php-docs-samples/translate/ve in /root/php-docs-samples/translate/vendor/google/cloud-core/src/RequestWrapper.php on line 362
以上的报错确实是SSL证书支持的问题,修改php.ini可以解决:
[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
;curl.cainfo =
; James Qi 2020-5-14
curl.cainfo = "/usr/local/php7/lib/cacert.pem"
国外阿里云服务器上这样修改后,运行程序就没有问题了。
但是国内阿里云服务器上运行程序依然报错:
HP Fatal error: Uncaught Google\Cloud\Core\Exception\ServiceException: cURL error 7: couldn't connect to host (see https://curl.h
axx.se/libcurl/c/libcurl-errors.html) in /path/php-docs-samples/translate/vendor/google/cloud-core/src/RequestWrapper.php:362
Stack trace:
#0 /path/php-docs-samples/translate/vendor/google/cloud-core/src/RequestWrapper.php(206): Google\Cloud\Core\RequestWrapper->convert
ToGoogleException(Object(Google\Cloud\Core\Exception\ServiceException))
#1 /path/php-docs-samples/translate/vendor/google/cloud-core/src/RestTrait.php(94): Google\Cloud\Core\RequestWrapper->send(Object(G
uzzleHttp\Psr7\Request), Array)
#2 /path/php-docs-samples/translate/vendor/google/cloud-translate/src/V2/Connection/Rest.php(83): Google\Cloud\Translate\V2\Connect
ion\Rest->send('translations', 'translate', Array)
#3 /path/php-docs-samples/translate/vendor/google/cloud-translate/src/V2/TranslateClient.php(248): Google\Cloud\Translate\V2\Connec
tion\Rest->listTranslations(Array)
#4 /path/php-docs-samples/translate/vendor/google/cloud-tr in /path/php-docs-samples/translate/vendor/google/cloud-core/src/Request
Wrapper.php on line 362
应该是连接不上google翻译的服务器,那只好放弃在国内服务器上运行Google Translate API的打算了。
评论1
不错
不错