You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

164 lines
4.3 KiB

package translate_test
import (
"context"
"yunyan/sys/microsoft/translate"
"fmt"
"strings"
"testing"
)
const (
kAzureKey = "AvWlh8ihnqidTSAoZxLuDz8hfxhvPD3vl66Zs2XMNa0BYH5xX754JQQJ99CAACULyCpXJ3w3AAAbACOG5lFy"
kAzureRegion = "gobal"
kAzureEndpoint = "https://api.cognitive.microsofttranslator.com"
)
// 单语种翻译:zh → en
func Test_Sys(t *testing.T) {
sys, err := translate.NewSys(
translate.SetKey(kAzureKey),
translate.SetRegion(kAzureRegion),
translate.SetEndpoint(kAzureEndpoint),
)
if err != nil {
t.Fatalf("Sys Init err: %v", err)
}
results, err := sys.Translate(context.Background(), "zh", "en",
[]string{"你好世界", "你好中国", "嗯"})
if err != nil {
t.Errorf("Translate err: %v", err)
return
}
if len(results) != 3 {
t.Errorf("expect 3 results, got %d: %v", len(results), results)
return
}
fmt.Printf("zh→en results: %v\n", results)
}
// 欧洲小语种批量翻译(之前豆包报错的那几个)
func Test_EUSmallLangs(t *testing.T) {
sys, err := translate.NewSys(
translate.SetKey(kAzureKey),
translate.SetRegion(kAzureRegion),
)
if err != nil {
t.Fatalf("Sys Init err: %v", err)
}
texts := []string{"你好世界", "欢迎使用"}
targets := []string{"hu", "bg", "hr", "sl", "sr", "lt", "lv", "et"}
for _, to := range targets {
results, err := sys.Translate(context.Background(), "zh", to, texts)
if err != nil {
t.Errorf("zh→%s fail: %v", to, err)
continue
}
fmt.Printf("zh→%s: %v\n", to, results)
}
}
// 源语言留空让 Azure 自动检测
func Test_AutoDetect(t *testing.T) {
sys, err := translate.NewSys(
translate.SetKey(kAzureKey),
translate.SetRegion(kAzureRegion),
)
if err != nil {
t.Fatalf("Sys Init err: %v", err)
}
results, err := sys.Translate(context.Background(), "", "zh",
[]string{"Hello world", "Bonjour le monde"})
if err != nil {
t.Errorf("auto→zh err: %v", err)
return
}
fmt.Printf("auto→zh: %v\n", results)
}
// 验证 OnInit + 包级 Translate 的完整初始化路径
func Test_OnInit(t *testing.T) {
err := translate.OnInit(map[string]interface{}{
"Key": kAzureKey,
"Region": kAzureRegion,
"Endpoint": kAzureEndpoint,
})
if err != nil {
t.Fatalf("OnInit err: %v", err)
}
results, err := translate.Translate(context.Background(), "zh", "ja",
[]string{"你好", "世界"})
if err != nil {
t.Errorf("Translate err: %v", err)
return
}
fmt.Printf("zh→ja via package Translate: %v\n", results)
}
// Key 为空时应当直接报错(不进网络)
func Test_MissingKey(t *testing.T) {
_, err := translate.NewSys(
translate.SetRegion(kAzureRegion),
)
if err == nil {
t.Errorf("expect error when Key missing, got nil")
}
}
// 触发条数阈值分批:>1000 条短文本,应自动拆 2+ 批,结果数量与输入一致
func Test_BatchByCount(t *testing.T) {
sys, err := translate.NewSys(
translate.SetKey(kAzureKey),
translate.SetRegion(kAzureRegion),
)
if err != nil {
t.Fatalf("Sys Init err: %v", err)
}
const n = 1500
texts := make([]string, 0, n)
for i := 0; i < n; i++ {
texts = append(texts, fmt.Sprintf("第%d条", i))
}
results, err := sys.Translate(context.Background(), "zh", "en", texts)
if err != nil {
t.Fatalf("Translate err: %v", err)
}
if len(results) != n {
t.Errorf("expect %d results, got %d", n, len(results))
}
fmt.Printf("batch-by-count: in=%d out=%d, sample[0]=%q sample[last]=%q\n",
n, len(results), results[0], results[len(results)-1])
}
// 触发字符阈值分批:每条 ~1000 字,50 条合计 ~50000 字,应至少拆 2 批
func Test_BatchByChars(t *testing.T) {
sys, err := translate.NewSys(
translate.SetKey(kAzureKey),
translate.SetRegion(kAzureRegion),
)
if err != nil {
t.Fatalf("Sys Init err: %v", err)
}
one := strings.Repeat("你好", 500) // 1000 字
texts := make([]string, 0, 50)
for i := 0; i < 50; i++ {
texts = append(texts, one)
}
results, err := sys.Translate(context.Background(), "zh", "en", texts)
if err != nil {
t.Fatalf("Translate err: %v", err)
}
if len(results) != 50 {
t.Errorf("expect 50 results, got %d", len(results))
}
fmt.Printf("batch-by-chars: in=50 out=%d, sample[0] head=%q\n",
len(results), runeHead(results[0], 40))
}
func runeHead(s string, n int) string {
r := []rune(s)
if len(r) <= n {
return s
}
return string(r[:n]) + "..."
}