Google翻译API 400错误(Text too long)解决咨询
解决Google翻译API "Text too long" 400错误的方案
嘿,这个问题我之前帮不少开发者捋顺过——你碰到的是Google翻译API的文本长度限制问题,不管是免费版还是付费版,单次请求能处理的文本量都有上限(免费版通常是单请求5000字符,付费版是100000字符,具体以官方最新规则为准)。直接拆分长文本分批请求就搞定了,具体步骤和代码示例给你整理好了:
1. 先拆分长文本
别一股脑把超长文本塞进去,得把它拆成符合API字符限制的小块。这里有两种常用方式:
- 简单粗暴但快速:按固定字符数拆分(记得留些余量,比如设成4500而不是刚好5000)
- 更友好的方式:按段落、句子拆分(用正则匹配句号、感叹号、问号这类标点,避免把单词拆断,保证翻译语义连贯)
2. 修改PHP代码,循环处理每个文本块
把原来的单次请求改成循环请求每个拆分后的文本块,最后把翻译结果拼接起来。给你写了个完整的示例代码:
<?php // 替换成你的API密钥 $apiKey = "YOUR_API_KEY"; // 你的超长待翻译文本 $longText = "这里替换成你要翻译的大段内容..."; // 设置单块文本最大字符数(免费版建议设4500,付费版可设95000留余量) $maxChunkSize = 4500; // 方式1:按固定字符数拆分 $textChunks = str_split($longText, $maxChunkSize); // 方式2:按句子拆分(更推荐,语义更完整) // $textChunks = preg_split('/(?<=[.!?])\s+/', $longText); $finalTranslatedText = ""; foreach ($textChunks as $chunk) { $curl = curl_init(); // 构造请求参数,记得设置源语言和目标语言 $postData = http_build_query([ 'q' => trim($chunk), 'source' => 'zh', // 替换成你的源语言代码,比如en、ja 'target' => 'en' // 替换成你的目标语言代码 ]); curl_setopt_array($curl, [ CURLOPT_URL => "https://translation.googleapis.com/language/translate/v2?key={$apiKey}", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $postData, CURLOPT_HTTPHEADER => [ 'Content-Type: application/x-www-form-urlencoded', 'X-HTTP-Method-Override: GET' ], CURLOPT_CONNECTTIMEOUT => 60, CURLOPT_TIMEOUT => 60, ]); $response = curl_exec($curl); $curlError = curl_error($curl); curl_close($curl); if ($curlError) { echo "请求出错:" . $curlError; // 这里可以加错误处理,比如重试或者记录日志 continue; } $responseData = json_decode($response, true); if (isset($responseData['data']['translations'][0]['translatedText'])) { $finalTranslatedText .= $responseData['data']['translations'][0]['translatedText'] . " "; } else { // 处理API返回的翻译错误,比如记录日志 echo "该文本块翻译失败:" . $chunk; print_r($responseData); } } // 输出最终拼接好的翻译结果 echo trim($finalTranslatedText); ?>
3. 额外注意事项
- 配额与速率:拆分请求后要留意API的请求频率配额,免费版别太频繁请求,付费版如果不够可以去控制台调整配额;
- API版本:如果你用的是v3版本,参数和限额会有变化,但核心逻辑还是拆分文本分批请求;
- 空文本块:拆分后可能出现空的文本块,记得在循环里加判断跳过,避免无效请求。
内容的提问来源于stack exchange,提问作者user1706248
相关产品推荐
相关产品推荐

