Go语言在线翻译项目练习 | 豆包MarsCode AI刷题

261 阅读4分钟

在线翻译项目练习——添加火山引擎机器翻译

在通过 Simpledict 简单项目熟悉了通过 URL 调用 API 接口的流程后,可以进一步结合火山引擎的机器翻译 API,实现一个简易的翻译器。

1. 开通机器翻译API

按照官网入门手册,注册、开通服务即可。(手册地址:API接入流程概览--机器翻译-火山引擎

开通服务后,登录火山引擎,点击头像查看API访问密钥,通过查询API密钥。

1.png

2.创建项目文件

新建SimpleTranslation 文件,cd 到对应目录下,使用 go mod init SimpleTranslation命令初始化module,运行成功后项目目录下生成go.mod文件,新建main.go文件。

由于调用时需要通过第三方库"github.com/volcengine/volc-sdk-golang/base"进行签名验证。需要安装第三方依赖,通过go get github.com/volcengine/volc-sdk-golang/base 命令安装。

SimpleTranslation 
├── go.mod 
├── go.sum 
└── mai.go

在main.go文件内,复制官网提供好的文本翻译API调用Demo。(文本翻译API--机器翻译-火山引擎)

 package main
 import (
     "encoding/json"
     "fmt"
     "net/http"
     "net/url"
     "time"
     "github.com/volcengine/volc-sdk-golang/base"
 )
 const (
     kAccessKey      = "密钥管理中的 AccessKey ID" // https://console.volcengine.com/iam/keymanage/
     kSecretKey      = "密钥管理中的 AccessKey Secret"
     kServiceVersion = "2020-06-01"
 )
 var (
     ServiceInfo = &base.ServiceInfo{
         Timeout: 5 * time.Second,
         Host:    "translate.volcengineapi.com",
         Header: http.Header{
             "Accept": []string{"application/json"},
         },
         Credentials: base.Credentials{Region: base.RegionCnNorth1, Service: "translate"},
     }
     ApiInfoList = map[string]*base.ApiInfo{
         "TranslateText": {
             Method: http.MethodPost,
             Path:   "/",
             Query: url.Values{
                 "Action":  []string{"TranslateText"},
                 "Version": []string{kServiceVersion},
             },
         },
     }
 )
 type Req struct {
     SourceLanguage string   `json:"SourceLanguage"`
     TargetLanguage string   `json:"TargetLanguage"`
     TextList       []string `json:"TextList"`
 }
 func main() {
     client := base.NewClient(ServiceInfo, ApiInfoList)
     client.SetAccessKey(kAccessKey)
     client.SetSecretKey(kSecretKey)
     req := Req{
         SourceLanguage: "en",
         TargetLanguage: "zh",
         TextList:       []string{"hello world"},
     }
     body, _ := json.Marshal(req)
     resp, code, err := client.Json("TranslateText", nil, string(body))
     if err != nil {
         panic(err)
     }
     fmt.Printf("%d %s\n", code, string(resp))
 }

如果可以成功运行,说明API配置等环境没有问题。运行结果如下

 //  状态码  + 返回体
 200 {"TranslationList":[{"Translation":"你好世界","DetectedSourceLanguage":"","Extra":null}],"ResponseMetadata":{"RequestId":"20241128164526F2AF988996B19240B580","Action":"TranslateText","Version":"2020-06-01","Service":"translate","Region":"cn-north-1"},"ResponseMetaData":{"RequestId":"20241128164526F2AF988996B19240B580","Action":"TranslateText","Version":"2020-06-01","Service":"translate","Region":"cn-north-1"}}

3.修改main函数

请求体

 type Req struct {
     SourceLanguage string   `json:"SourceLanguage"`  // 源语言
     TargetLanguage string   `json:"TargetLanguage"`  // 目标语言
     TextList       []string `json:"TextList"`        // 待翻译的文本列表
 }
 // example
 req := Req{
         SourceLanguage: "en",      // 原始语言 -> 英语
         TargetLanguage: "zh",      // 翻译目标语言 -> 中文
         TextList:       []string{"hello world"}, // 要翻译的字段
     }

返回体

可以通过JSON-to-Go: Convert JSON to Go instantly,快速获得返回的JSON格式对应Go的结构体。

 type Resp struct {
     TranslationList []struct {
         Translation            string `json:"Translation"`             // 翻译结果
         DetectedSourceLanguage string `json:"DetectedSourceLanguage"`  // 仅在源语言未指定时会返回结果
     } `json:"TranslationList"`
     ResponseMetadata struct {
         RequestID string `json:"RequestId"`
         Action    string `json:"Action"`
         Version   string `json:"Version"`
         Service   string `json:"Service"`
         Region    string `json:"Region"`
         Error     any    `json:"Error"`
     } `json:"ResponseMetadata"`
 }

修改后的fun main()部分

 func main() {
     client := base.NewClient(ServiceInfo, ApiInfoList)
     client.SetAccessKey(kAccessKey)
     client.SetSecretKey(kSecretKey)
     req := Req{
         SourceLanguage: "zh",  // 中文到英文
         TargetLanguage: "en",
         TextList:       []string{"你好,世界","今天过得如何","最近还好吗"},
     }
     body, _ := json.Marshal(req)
     body, code, err := client.Json("TranslateText", nil, string(body)) // code检查响应状态码
     if err != nil {
         fmt.Printf("Error: %v\n", err)
     }
     if code != 200 {
         fmt.Printf("%d %s\n", code, string(body))
     }
     var resp Resp
     err = json.Unmarshal(body, &resp)
     if err != nil {
         panic(err)
     }
     for i:=0;i<3;i++ {
     // fmt.Printf("%d %s\n", code, resp.TranslationList[i].Translation)
     fmt.Printf("%s\n", resp.TranslationList[i].Translation)
 }
 }

运行输出结果(自动加上'?'):

 Hello, World
 How was your day?
 How are you doing?

4.封装功能

  • 将请求和返回的功能封装到query函数,并设计请求接口(sourceLanguage, targetLanguage string, textList []string)
  • main函数通过流实现翻译语言的设置以及翻译字段的输入交互。
 package main
 import (
     "bufio"
     "encoding/json"
     "fmt"
     "net/http"
     "net/url"
     "os"
     "strings"
     "time"
     "github.com/volcengine/volc-sdk-golang/base"
 )
 const (
     kAccessKey      = "密钥管理中的 AccessKey ID" // https://console.volcengine.com/iam/keymanage/
     kSecretKey      = "密钥管理中的 AccessKey Secret"
     kServiceVersion = "2020-06-01"
 )
 var (
     ServiceInfo = &base.ServiceInfo{
         Timeout: 5 * time.Second,
         Host:    "translate.volcengineapi.com",
         Header: http.Header{
             "Accept": []string{"application/json"},
         },
         Credentials: base.Credentials{Region: base.RegionCnNorth1, Service: "translate"},
     }
     ApiInfoList = map[string]*base.ApiInfo{
         "TranslateText": {
             Method: http.MethodPost,
             Path:   "/",
             Query: url.Values{
                 "Action":  []string{"TranslateText"},
                 "Version": []string{kServiceVersion},
             },
         },
     }
 )
 type Resp struct {
     TranslationList []struct {
         Translation            string `json:"Translation"`
         DetectedSourceLanguage string `json:"DetectedSourceLanguage"`
     } `json:"TranslationList"`
     ResponseMetadata struct {
         RequestID string `json:"RequestId"`
         Action    string `json:"Action"`
         Version   string `json:"Version"`
         Service   string `json:"Service"`
         Region    string `json:"Region"`
         Error     any    `json:"Error"`
     } `json:"ResponseMetadata"`
 }

 type Req struct {
     SourceLanguage string   `json:"SourceLanguage"`
     TargetLanguage string   `json:"TargetLanguage"`
     TextList       []string `json:"TextList"`
 }

 func query(sourceLanguage, targetLanguage string, textList []string) ([]string, error) {
     client := base.NewClient(ServiceInfo, ApiInfoList)
     client.SetAccessKey(kAccessKey)
     client.SetSecretKey(kSecretKey)
     req := Req{
         SourceLanguage: sourceLanguage,
         TargetLanguage: targetLanguage,
         TextList:       textList,
     }
     body, _ := json.Marshal(req)
     body, code, err := client.Json("TranslateText", nil, string(body)) // code检查响应状态码
     if err!= nil {
         return nil, fmt.Errorf("Error: %v", err)
     }
     if code!= 200 {
         return nil, fmt.Errorf("%d %s", code, string(body))
     }
     var resp Resp
     err = json.Unmarshal(body, &resp)
     if err!= nil {
         return nil, fmt.Errorf("Error unmarshaling response: %v", err)
     }
     translations := make([]string, len(textList))
     for i, translation := range resp.TranslationList {
         translations[i] = translation.Translation
     }
     return translations, nil
 }

 func main() {
     reader := bufio.NewReader(os.Stdin)
     fmt.Print("请输入源语言(如:zh):")
     sourceLanguage, _ := reader.ReadString('\n')
     sourceLanguage = strings.TrimSpace(sourceLanguage)

     fmt.Print("请输入目标语言(如:en):")
     targetLanguage, _ := reader.ReadString('\n')
     targetLanguage = strings.TrimSpace(targetLanguage)

     fmt.Print("请输入要翻译的文本,以句号分隔:")
     textListStr, _ := reader.ReadString('\n')
     textListStr = strings.TrimSpace(textListStr)
     textList := strings.Split(textListStr, "。")
     translations, err := query(sourceLanguage, targetLanguage, textList)
     if err!= nil {
         fmt.Printf("Error: %v\n", err)
         return
     }
     fmt.Println("翻译结果:")
     for _, translation := range translations {
         fmt.Println(translation)
     }
 }

运行结果:

Snipaste_2024-11-28_19-16-18.png