Google Cloud Translation API传不同语言码却报源目标语言相同错误
问题根因
这是google/cloud-translate v1.10.1版本的已知回归bug,问题出在其依赖的底层google/gax API核心库的Protobuf序列化逻辑:
- 当传入长度为2的ISO 639-1标准语言码(比如示例中的
pl、en)时,序列化逻辑没有做字符串长度校验,会越界读取内存相邻位置的字节,把短字符串拼接为3字符的错误值,比如pl被拼接为pol、en被拼接为por - 服务端收到非法的未识别语言码后,错误提示逻辑存在缺陷,哪怕两个错误码实际内容不同,也会误抛出「Target language can't be equal to source language」的报错,这也是所有语言对组合都会复现问题的原因。
修复方案
二选一即可:
- 推荐方案:升级依赖版本
官方在v1.10.2版本已经修复了该序列化bug,不需要调整业务代码,直接升级包版本即可恢复:composer require google/cloud-translate:^1.10.2 - 临时规避方案(暂无法升级时使用)
传入语言码时不要使用2位短码,替换为谷歌翻译支持的完整BCP-47语言标签即可绕过短字符串越界读取的问题,修改后的代码示例:$client = new TranslationServiceClient(); $projectId = self::key(true)->project_id; $formattedParent = $client::locationName($projectId, 'us-central1'); $client->translateText( ['Test'], 'en-US', // 目标语言替换为完整标签 $formattedParent, ['sourceLanguageCode' => 'pl-PL'] // 源语言替换为完整标签 )->getTranslations();
内容的提问来源于stack exchange,提问作者tapseoff
相关产品推荐
相关产品推荐

