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.
 
 
 
 
 
 

78 lines
2.4 KiB

package translate
import (
"context"
"github.com/volcengine/volcengine-go-sdk/service/translate20250301"
"github.com/volcengine/volcengine-go-sdk/volcengine"
"github.com/volcengine/volcengine-go-sdk/volcengine/credentials"
"github.com/volcengine/volcengine-go-sdk/volcengine/session"
)
func newSys(options Options) (sys *TranslateSys, err error) {
sys = &TranslateSys{
options: options,
}
config := volcengine.NewConfig().
WithRegion(options.Region).
WithCredentials(credentials.NewStaticCredentials(options.AccessKey, options.SecretKey, ""))
sys.session, err = session.NewSession(config)
if err != nil {
return
}
return
}
type TranslateSys struct {
options Options
session *session.Session
}
const maxCharsPerBatch = 5000
const maxTextsPerBatch = 128
func (this *TranslateSys) Translate(ctx context.Context, from string, to string, texts []string) (results []string, err error) {
svc := translate20250301.New(this.session)
results = make([]string, 0, len(texts))
// 按字符数分批,每批不超过 maxCharsPerBatch
batch := make([]string, 0)
batchChars := 0
for _, text := range texts {
if (batchChars+len([]rune(text)) > maxCharsPerBatch || len(batch) >= maxTextsPerBatch) && len(batch) > 0 {
var resp *translate20250301.TranslateTextOutput
if resp, err = svc.TranslateText(&translate20250301.TranslateTextInput{
SourceLanguage: volcengine.String(from),
TargetLanguage: volcengine.String(to),
TextList: volcengine.StringSlice(batch),
}); err != nil {
return
}
for _, item := range resp.TranslationList {
results = append(results, *item.Translation)
}
batch = batch[:0]
batchChars = 0
}
batch = append(batch, text)
batchChars += len([]rune(text))
}
// 发送剩余批次
if len(batch) > 0 {
var resp *translate20250301.TranslateTextOutput
if resp, err = svc.TranslateText(&translate20250301.TranslateTextInput{
SourceLanguage: volcengine.String(from),
TargetLanguage: volcengine.String(to),
TextList: volcengine.StringSlice(batch),
}); err != nil {
// 出错必须丢弃已翻好的部分:具名返回值裸 return 会带回一个长度不足的非 nil 切片,
// 调用方若据此判断「部分成功」,会把残缺译文当成完整结果用。
return nil, err
}
for _, item := range resp.TranslationList {
results = append(results, *item.Translation)
}
}
return
}