不能真正“通用”封装——google 官方已关闭免费 translate api,目前稳定可用的只有 google cloud translation api v3(需配密钥+付费),而 deepl 提供免费 tier 但强制要求注册并使用 deepl api v2;二者协议、认证方式、错误结构、返回格式完全不同,硬塞进一个函数签名只会埋坑。

如何用 PHP 封装支持 Google 和 DeepL 的翻译函数
直接说结论:不能真正“通用”封装——Google 官方已关闭免费 Translate API,目前稳定可用的只有 Google Cloud Translation API v3(需配密钥+付费),而 DeepL 提供免费 tier 但强制要求注册并使用 DeepL API v2。二者协议、认证方式、错误结构、返回格式完全不同,硬塞进一个函数签名只会埋坑。
为什么不能共用同一套参数和返回结构
Google Cloud API 返回的是嵌套的 translations 数组,每个元素含 translatedText 和 model;DeepL 返回扁平 JSON,字段是 text、detection、detected_source_language。更关键的是认证:Google 用 Bearer $token(JWT 签名),DeepL 用 Authorization: DeepL-Auth-Key $key。
- Google 错误响应是
400 Bad Request+"error": {"code": 3, "message": "Invalid language code"} - DeepL 错误是
403 Forbidden+{"message":"Quota exceeded"}或{"message":"Invalid auth key"} - Google 支持批量翻译(最多 128 条),DeepL 免费版单次最多 1 条(
text参数只接受字符串,不支持数组)
实际可复用的封装策略
推荐用策略模式分离实现,共用统一调用入口但内部路由到不同适配器。核心是把「引擎选择」和「错误归一化」做实:
- 构造函数接收
$engine('google'或'deepl')和对应密钥:$googleKey(Service Account JSON 内容或访问令牌)、$deeplKey(字符串) - 统一输入:
translate($text, $sourceLang = 'auto', $targetLang),自动处理auto→detect(DeepL)或留空(Google 自动检测) - 统一输出:始终返回关联数组
['text' => '...', 'source_lang' => 'zh', 'engine' => 'deepl'],失败时抛出自定义异常TranslationException,含getCode()(映射为 400/401/429/500)和getRawError() - 必须加超时控制:
curl_setopt($ch, CURLOPT_TIMEOUT, 15),DeepL 偶尔卡在 30s+,Google 在配错区域端点时也会 hang 死
示例片段(Google 适配器关键逻辑):
$url = 'https://translation.googleapis.com/v3/projects/' . $this->projectId . ':translateText';
$body = json_encode([
'contents' => [$text],
'targetLanguageCode' => $targetLang,
'sourceLanguageCode' => $sourceLang === 'auto' ? null : $sourceLang,
]);
// 注意:Google 要求 POST body 是 JSON,Header 必须含 'Content-Type: application/json'
最容易被忽略的兼容细节
DeepL 免费 key 只能调 https://api-free.deepl.com/v2/translate,打到 api.deepl.com 会 403;Google 若用错 endpoint(比如用了旧的 v2),会返回 "error": {"code": 404, "message": "Method not found"},但 HTTP 状态码仍是 200 —— 这个必须手动检查 response->error 字段,不能只看 status code。
另外,中文简体/繁体标识:Google 用 zh(自动区分),DeepL 强制要求 zh(简体)或 zh-TW(繁体),传 zh-CN 会被静默转成 zh,但 zh-HK 会报错。这个差异不处理,线上就会翻出一堆粤语词。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











