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
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
|
|
}
|
|
|