现在的翻译API,五花八门的,非常之多,百度翻译API算是所有中非常不错的一个,门槛很低,只要去百度翻译平台注册一个账号,唯一就是要验证手机号就行,不需要真人实名验证,如果做了真人实名验证,那有更多实用的东西,不像某腾讯,用个翻译API,还有真人实名验证,恶心至极。
百度翻译API每秒一次请求,完全免费,无限使用,可以看DEMO。
不过自2022年8月1日起也开始收费了,标准版免费调用量由不限额度改为5万字符/月,高级版免费调用量由200万字符/月改为100万字符/月,详情可查看百度翻译文档。
把下面的类放入app/Service目录,填入申请的APP_ID和APP_KEY就可以使用了,非常方便。
namespace App\Service; | |
use Illuminate\Support\Facades\Http; | |
use Illuminate\Support\Facades\Log; | |
class BaiduTranslator | |
{ | |
const APP_ID = ''; //换成你申请的APP_ID | |
const APP_KEY = ''; //换成你申请的APP_KEY | |
const API_TIMEOUT = 1; | |
const API_URL = 'https://fanyi-api.baidu.com/api/trans/vip/translate'; | |
const KEY_QUERY = 'q'; | |
const KEY_FROM = 'from'; | |
const KEY_TO = 'to'; | |
const KEY_APPID = 'appid'; | |
const KEY_SALT = 'salt'; | |
const KEY_SIGN = 'sign'; | |
const KEY_DOMAIN = 'domain'; | |
const KEY_RESULT = 'trans_result'; | |
const KEY_RESULT_DST = 'dst'; | |
const KEY_ERROR_CODE = 'error_code'; | |
const KEY_ERROR_MSG = 'error_msg'; | |
const DEFAULT_FROM_LANG = 'auto'; | |
const DEFAULT_TO_LANG = 'en'; | |
const DEFAULT_DOMAIN = 'electronics'; #common | |
const LANG_CN = 'zh'; | |
const LANG_EN = 'en'; | |
public function getTranslation($string, $toLang = '', &$fromLang = '') | |
{ | |
$params = $this->getQueryParams($string, $toLang, $fromLang); | |
$response = $this->curlApi($params); | |
if ($response->failed()) { | |
return $string; | |
} else { | |
$result = $response->json(); | |
if (isset($result[self::KEY_ERROR_CODE]) && $result[self::KEY_ERROR_CODE]) { | |
$errCode = $result[self::KEY_ERROR_CODE] ?? ''; | |
$errMsg = $result[self::KEY_ERROR_MSG] ?? 'translate api return error'; | |
$this->writeErrorLog(sprintf('translate api error, code: %d, msg: %s', $errCode, $errMsg)); | |
return $string; | |
} | |
$fromLang = $result[self::KEY_FROM] ?? $fromLang; | |
if (isset($result[self::KEY_RESULT])) { | |
if (is_array($result[self::KEY_RESULT])) { | |
$trans = array_pop($result[self::KEY_RESULT]); | |
return $trans[self::KEY_RESULT_DST] ?? $string; | |
} else { | |
return $result[self::KEY_RESULT][self::KEY_RESULT_DST] ?? $string; | |
} | |
} | |
} | |
return $string; | |
} | |
/** | |
* if not using laravel framework, please change this | |
*/ | |
protected function curlApi($params) | |
{ | |
$params = is_array($params) ? http_build_query($params) : $params; | |
return Http::timeout(self::API_TIMEOUT) | |
->get(self::API_URL, $params); | |
} | |
/** | |
* if not using laravel framework, please change this | |
*/ | |
protected function writeErrorLog($msg) | |
{ | |
Log::error($msg); | |
} | |
protected function getQueryParams($string, $toLang = '', $fromLang = '') | |
{ | |
$salt = $this->getSalt(); | |
$sign = md5(self::APP_ID . $string . $salt . self::APP_KEY); | |
return [ | |
self::KEY_QUERY => $string, | |
self::KEY_FROM => $fromLang ?: self::DEFAULT_FROM_LANG, | |
self::KEY_TO => $toLang ?: self::DEFAULT_TO_LANG, | |
self::KEY_APPID => self::APP_ID, | |
self::KEY_SALT => $salt, | |
self::KEY_SIGN => $sign, | |
self::KEY_DOMAIN => self::DEFAULT_DOMAIN, | |
]; | |
} | |
protected function getSalt() | |
{ | |
return time(); | |
} | |
} |