Ver código fonte

优化批量翻译

xiexiaoyuan 2 anos atrás
pai
commit
1e6a8b2019
2 arquivos alterados com 114 adições e 52 exclusões
  1. 89 1
      services/aliyun_translate.go
  2. 25 51
      services/day_new.go

+ 89 - 1
services/aliyun_translate.go

@@ -64,6 +64,7 @@ func handler (accessKeyId, accessKeySecret, stsToken *string, content string) (r
 		if _e != nil {
 			return
 		}
+	//	fmt.Println(ret)
 		return
 	}()
 
@@ -92,6 +93,64 @@ func handler (accessKeyId, accessKeySecret, stsToken *string, content string) (r
 	return
 }
 
+func batchHandler (accessKeyId, accessKeySecret, stsToken *string, content string) (resp *alimt20181012.GetBatchTranslateResponseBody, _err error) {
+	// 初始化 Client,采用 AK&SK 鉴权访问的方式,此方式可能会存在泄漏风险,建议使用 STS 方式。鉴权访问方式请参考:https://help.aliyun.com/document_detail/378661.html
+	//client, _err := CreateClient(accessKeyId, accessKeySecret)
+	client, _err := CreateClientWithSTS(accessKeyId, accessKeySecret, stsToken)
+	if _err != nil {
+		_err = errors.New(fmt.Sprintf("创建翻译客户端失败 err: %v", _err))
+		return
+	}
+
+	getBatchTranslateRequest := &alimt20181012.GetBatchTranslateRequest{
+		FormatType: tea.String("text"),
+		TargetLanguage: tea.String("en"),
+		SourceLanguage: tea.String("zh"),
+		Scene: tea.String("general"),
+		ApiType: tea.String("translate_standard"),
+		SourceText: tea.String(content),
+	}
+	runtime := &util.RuntimeOptions{}
+	ret, tryErr := func()(ret *alimt20181012.GetBatchTranslateResponse, _e error) {
+		defer func() {
+			if r := tea.Recover(recover()); r != nil {
+				_e = r
+				return
+			}
+		}()
+		// 复制代码运行请自行打印 API 的返回值
+		ret, _e = client.GetBatchTranslateWithOptions(getBatchTranslateRequest, runtime)
+		if _e != nil {
+			return
+		}
+		fmt.Println(ret)
+		return
+	}()
+
+
+	if tryErr != nil {
+		var e = &tea.SDKError{}
+		if _t, ok := tryErr.(*tea.SDKError); ok {
+			e = _t
+		} else {
+			e.Message = tea.String(tryErr.Error())
+		}
+		// 如有需要,请打印 e
+		_, _err = util.AssertAsString(e.Message)
+		if _err != nil {
+			_err =  errors.New(fmt.Sprintf("翻译失败 err: %v", _err))
+			return
+		}
+		_err =  errors.New(fmt.Sprintf("翻译失败 err: %v", _err))
+		return
+	}
+	if *ret.StatusCode != 200 {
+		_err = errors.New(fmt.Sprintf(" %v", ret.StatusCode))
+		return
+	}
+	resp = ret.Body
+	return
+}
 
 func AliTranslate(content string) (contentEn string, err error) {
 	stsToken, err := GetOssSTSToken()
@@ -112,4 +171,33 @@ func AliTranslate(content string) (contentEn string, err error) {
 
 	contentEn = *resp.Data.Translated
 	return
-}
+}
+
+type TranslatedListItem struct {
+	Code       string `json:"code"`
+	WordCount  string `json:"wordCount"`
+	Index      string `json:"index"`
+	Translated string `json:"translated"`
+}
+
+func AliTranslateBatch(content string) (contentEnList []map[string]interface{}, err error) {
+	contentEnList = make([]map[string]interface{}, 0)
+	stsToken, err := GetOssSTSToken()
+	if err != nil {
+		err = errors.New(fmt.Sprintf("阿里云机器翻译失败 err %v", err))
+		return
+	}
+	fmt.Println(stsToken)
+	resp, err := batchHandler(&stsToken.AccessKeyId, &stsToken.AccessKeySecret, &stsToken.SecurityToken, content)
+	if err != nil {
+		err = errors.New(fmt.Sprintf("阿里云机器翻译失败 err %v", err))
+		return
+	}
+	if *resp.Code != 200 {
+		err = errors.New(fmt.Sprintf("阿里云机器翻译失败 code: %v; msg: %v",*resp.Code, *resp.Message))
+		return
+	}
+
+	contentEnList = resp.TranslatedList
+	return
+}

+ 25 - 51
services/day_new.go

@@ -280,7 +280,7 @@ func DayNewTranslateContent() (err error) {
 	var ups []interface{}
 	for _, v := range list {
 		//如果单条翻译的字符数超过1000,则直接翻译,否则批量翻译
-		//if len(v.Content) > 1000 {
+		if len(v.Content) > 1000 {
 			en, e := AliTranslate(v.Content)
 			if e != nil {
 				err = e
@@ -289,7 +289,7 @@ func DayNewTranslateContent() (err error) {
 			needChangeIds += strconv.Itoa(int(v.Id)) + ","
 			multi += ` WHEN `+strconv.Itoa(int(v.Id))+` THEN ?`
 			ups = append(ups, en)
-		/*}else{
+		}else{
 			if count >= 50 {  //待翻译的条数不能超过50; 单条翻译字符数不能超过1000字符
 				contentEnMap, err = batchTranslateHandler(contentMap)
 				if err != nil {
@@ -304,9 +304,9 @@ func DayNewTranslateContent() (err error) {
 				contentMap = make(map[string]string, 0)
 				count = 0
 			}
-			contentMap[strconv.Itoa(int(v.Id))] = dealPunctuationToEn(strings.Trim(v.Content, " "))+`{end}`
+			contentMap[strconv.Itoa(int(v.Id))] = v.Content
 			count += 1
-		}*/
+		}
 	}
 	//剩余不满50条的content
 	if count > 0 {
@@ -334,63 +334,37 @@ func DayNewTranslateContent() (err error) {
 }
 
 func batchTranslateHandler(contentMap map[string]string) (contentEnMap map[string]string, err error)  {
+	contentEnMap = make(map[string]string , 0)
 	bytes, err := json.Marshal(contentMap)
 	if err != nil {
 		err = errors.New("未翻译的内容json.Marshal失败"+err.Error())
 		return
 	}
 	content := string(bytes)
-	en, err := AliTranslate(content)
-	if err != nil {
-		return
-	}
-	//json转为map数据结构
-	err = json.Unmarshal([]byte(en), &contentEnMap)
+	contentEnList, err := AliTranslateBatch(content)
 	if err != nil {
-		err = errors.New("翻译后的内容json.Unmarshal失败"+err.Error())
 		return
 	}
-	for k, v := range contentEnMap {
-		v = strings.ReplaceAll(v,`{end}`, "")
-		contentEnMap[k] = strings.ReplaceAll(v,`{quot}`, `"`)
+	for _, v := range contentEnList {
+		index := ""
+		en := ""
+		errorMsg := ""
+		for key, item := range v {
+			if key == "index" {
+				index = item.(string)
+			}else if key == "errorMsg" {
+				errorMsg = item.(string)
+			}else if key == "code" && item != "200"{
+				err = errors.New("序号"+index+" 翻译失败,errCode: "+item.(string)+" errMsg: "+errorMsg+" ")
+				return
+			}else if key == "translated" {
+				en = item.(string)
+			}
+		}
+		if index != "" && en != "" {
+			contentEnMap[index] = en
+		}
 	}
 	return
 }
 
-var punctuationMap = map[rune]rune{
-
-	8216: 34, // '
-
-	8217: 34, // '
-
-	8220: 34, // "  //把“符号转换成
-
-	8221: 34, // "  //把”符号转换成
-
-	12298: 34, // "    //把《 符号转换成
-
-	12299: 34, // "     //把 》符号转换成
-
-	12304: 91, // [    //把【 符号转换成
-
-	12305: 93, // ]     //把 】符号转换成
-
-	12302: 91, // [    //把『符号转换成
-
-	12303: 93, // ]     //把 』符号转换成
-}
-
-func dealPunctuationToEn(text string) string {
-	text = strings.Map(func(r rune) rune {
-
-		if v, ok := punctuationMap[r]; ok {
-			return v
-
-		}
-		return r
-
-	}, text)
-	text = strings.ReplaceAll(text,`"`,`{quot}`)
-	return text
-}
-