很久前就使用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
不錯
不錯