package comm import ( "errors" "testing" ) // 2026-09-15 真机实测:客户端 39 个语种里只有 3 个翻不出来,三种不同原因。 // 这组用例把「码怎么归一」钉死,避免又出现「阿里报语种拼写错误、查半天才发现是码错了」。 func TestBCP47ToShortLangProviderCodes(t *testing.T) { cases := map[string]string{ // ⚠️ 挪威语:客户端按 Azure 语音码传 nb-NO,而阿里认的是 no。 // 取主标签会得到 nb → 阿里回 10033 语种拼写错误。 "nb-NO": "no", "nn-NO": "no", // 表里显式收录的 "uk-UA": "uk", "zh-CN": "zh", "zh-TW": "zh", // 没收录的走取主标签兜底 "hr-HR": "hr", "sv-SE": "sv", "el-GR": "el", // 已经是短码的原样返回 "en": "en", "": "", } for in, want := range cases { if got := BCP47ToShortLang(in); got != want { t.Errorf("BCP47ToShortLang(%q) = %q, want %q", in, got, want) } } } // 「语种不支持」重试一万次也没用,必须和「这次调用失败了」分开, // 否则用户看到「请稍后再试」会一直点。 func TestIsLangUnsupportedErr(t *testing.T) { unsupported := []error{ errors.New("translate failed: code=10005 msg=translate from source to target not support"), errors.New("translate failed: code=10033 msg=语种拼写错误"), } for _, e := range unsupported { if !IsLangUnsupportedErr(e) { t.Errorf("应判为「语种不支持」: %v", e) } } transient := []error{ errors.New("translate request: dial tcp: i/o timeout"), errors.New("translate failed: code=Throttling.User msg=flow control"), nil, } for _, e := range transient { if IsLangUnsupportedErr(e) { t.Errorf("不该判为「语种不支持」(这些重试有意义): %v", e) } } }