调用AI翻译API前必须确认三件事:一是区分免费版与付费版的QPS及字符数限制;二是目标语言代码规范性,如zh与zh-CN差异及auto检测需显式传参;三是强制HTTPS,HTTP会报SSL错误。

PHP 调用 AI 翻译 API 前必须确认的三件事
直接调用 curl 发请求不难,但多数人卡在第一步:没选对 API、没处理好认证、或忽略了响应结构差异。主流服务(如 DeepL、Google Cloud Translation、腾讯翻译君、百度翻译)返回格式不同,json 字段名、错误码、是否需要 access_token 刷新机制,全都不一样。
实操前先确认:
- 你用的是免费版还是付费版?免费版常限制
qps(每秒请求数)和单次字符数,比如 DeepL 免费版单次最多5000字符,超了直接返回413 Payload Too Large - 目标语言代码是否规范?
zh和zh-CN在不同 API 中含义可能不同;auto检测源语言时,部分 API(如百度)要求显式传from=auto,否则报错error_code: 58 - 是否已开启 HTTPS?所有主流翻译 API 强制 HTTPS,用
http://会直接返回cURL error 35: SSL connect error
用 curl 调 Google Cloud Translation v3 实现实时翻译
Google 的 v3 版本强制使用 gRPC 或 REST + access_token,不支持简单 API Key。最轻量的可行路径是用 service account key 换取短期 access_token,再发 POST 请求。
关键步骤:
立即学习“PHP免费学习笔记(深入)”;
- 从 Google Cloud Console 下载
service-account-key.json,保存到项目目录(如./gcp-cred.json) - 用
file_get_contents()读取并解析 JSON,提取private_key和client_email - 构造 JWT 并用
openssl_sign()签名,向https://oauth2.googleapis.com/token换取access_token(有效期3600秒) - 最终请求地址为:
https://translation.googleapis.com/v3/projects/YOUR_PROJECT_ID:translateText,body 是 JSON,含contents、targetLanguageCode、sourceLanguageCode(可空)
示例片段(省略 JWT 构造细节,重点看请求部分):
$url = 'https://translation.googleapis.com/v3/projects/your-proj-id:translateText';
$token = 'ya29.c.b0Ab...'; // 从上一步获取
$data = json_encode([
'contents' => ['你好世界'],
'targetLanguageCode' => 'en',
'sourceLanguageCode' => 'zh'
]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token,
'Content-Type: application/json'
]);
$result = curl_exec($ch);
// 注意:Google v3 返回的是嵌套结构,译文在 $json['translations'][0]['translatedText']
用 file_get_contents() 调腾讯翻译君(更轻量)
腾讯云翻译 API 支持简单签名方式(HMAC-SHA256),且允许用 file_get_contents() + stream_context_create() 替代 curl,适合轻量后台或共享主机环境(禁用 curl 时)。
注意点:
- 签名字符串必须按文档拼接:HTTP 方法 +
\n+ URI +\n+ 请求参数按字典序排序后的 query string - 密钥需用
base64_decode()解码后再参与 HMAC 计算,否则签名失败返回1002: invalid sign - 必传参数包括
Timestamp(秒级时间戳)、Nonce(随机字符串)、SecretId、Signature,缺一不可 - 翻译结果在
$json['Response']['TranslatedText'],不是顶层字段
常见错误现象:1003: timestamp expired —— 表示本地时间与腾讯服务器偏差超过 5 分钟,需校准系统时间或用 curl 先请求一次腾讯时间接口校正。
多语言切换时如何避免重复请求和缓存污染
用户频繁切语言(比如中→英→日→中),如果每次都在 PHP 层调 API,既慢又费配额。真正实用的做法是分层缓存:
- 第一层:用
apcu_cache存「原文+目标语言」为 key 的短时结果(TTL3600),适用于后台管理页等低频场景 - 第二层:前端用
localStorage缓存最近 20 条翻译结果,键名为trans:${sourceLang}:${targetLang}:${hash(text)},命中则不发请求 - 第三层:对相同原文但不同目标语言的请求,不要合并成一个批量调用(如同时译成 en/ja/ko)—— 多数 API 不支持单次多目标,强行拼会导致
400 Bad Request
特别注意:不要用 $_SESSION 存翻译结果。session 数据随用户增长线性膨胀,且无法跨机器共享,在负载均衡下极易失效。



















