有道AI翻译API不支持自动语种检测,因v1.2+版本已移除from=auto,且无独立语种检测端点;必须显式传from和to,否则导致乱译、漏译或错误码104。

有道 AI 翻译 API 不支持自动语种检测,必须显式传 from 和 to 参数;漏填或填错语种会导致翻译质量骤降甚至返回错误码 104(不支持的语种)。
为什么不能只传原文让有道自动识别语种
有道 AI 翻译的公开 HTTP 接口(如 https://openapi.youdao.com/api)设计上不提供独立的语种检测端点,from=auto 在当前 v1.2+ 版本中已被移除。服务端不会尝试猜测源语言,而是严格按 from 值调用对应语种的翻译模型——模型错配(比如把中文当英文输入)会直接导致乱译、漏译或词性错位。
常见错误现象:
- 原文是
"你好",from=en→ 返回类似"Hello?"或空结果 - 原文是日文,
from=zh-CHS→ 出现大量片假名被硬转为中文拼音 - 接口返回
{"errorCode":"104"},即语种参数非法
PHP 中正确构造签名与请求参数
有道要求对请求参数做 SHA256 签名,且 q(原文)、from、to、appKey、salt、curtime 全部参与签名。漏掉 from 或大小写不符(如写成 ZH 而非 zh-CHS)都会验签失败。
立即学习“PHP免费学习笔记(深入)”;
关键参数取值必须严格匹配官方文档(截至 2024 年最新):
-
from:源语种,如zh-CHS(简体中文)、en(英语)、ja(日语)、ko(韩语) -
to:目标语种,同上,不可为auto -
salt:需为字符串,建议用uniqid()生成,不能是数字或空 -
curtime:时间戳秒级整数,与服务器时间偏差需 107
$appKey = 'your_app_key';
$appSecret = 'your_app_secret';
$q = '今天天气不错';
$from = 'zh-CHS';
$to = 'en';
$salt = uniqid();
$curtime = time();
$stringToSign = $appKey . $q . $salt . $curtime . $appSecret;
$sign = hash('sha256', $stringToSign);
$postData = http_build_query([
'q' => $q,
'from' => $from,
'to' => $to,
'appKey' => $appKey,
'salt' => $salt,
'curtime' => $curtime,
'sign' => $sign,
]);
$ch = curl_init('https://openapi.youdao.com/api');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
$result = curl_exec($ch);
curl_close($ch);
如何安全地获取原文语种(避免手动填错)
如果业务场景中原文语种不可预知(例如用户自由输入),不能靠前端 JS 猜测后传给 PHP,而应在服务端加一层轻量语种识别。推荐用 textcat 扩展或 php-langdetect 库做本地识别,比调第三方检测 API 更快更可控。
示例(使用 php-langdetect):
- 安装:
composer require kuzmyak/langdetect - 识别结果仅作参考,仍需人工校验边界 case(如中英混排、纯数字/符号)
- 识别出
zh后,应映射为zh-CHS再传给有道,不能直传zh - 若置信度 zh-CHS)并记录日志供后续优化
容易被忽略的编码与长度限制
有道接口对 q 字段有明确约束:UTF-8 编码下最多 2000 字符,超长会截断且不报错。PHP 中若原文含 emoji 或生僻汉字,strlen() 会误判字节数,必须用 mb_strlen($q, 'UTF-8') 校验。
其他坑点:
- 原文含换行符
\n或制表符\t时,有道可能解析异常,建议先str_replace(["\r\n", "\r", "\n"], " ", $q) - 返回 JSON 中的
translation是数组,即使单句也包裹在["Good weather today"]中,别直接echo $res->translation - HTTP 状态码 200 不代表成功,必须检查响应体中的
errorCode字段,0才是正常
语种参数不是可选装饰,而是模型调度的开关;填错和不填,效果差别比换引擎还大。











