Files
metatube-server/translate/google.go
T
2022-12-15 23:13:04 +08:00

63 lines
1.5 KiB
Go

package translate
import (
"encoding/json"
"net/http"
"strings"
"golang.org/x/text/language"
"github.com/javtube/metatube-sdk-go/common/fetch"
"github.com/javtube/metatube-sdk-go/errors"
)
const googleTranslateAPI = "https://translation.googleapis.com/language/translate/v2"
func GoogleTranslate(q, source, target, key string) (result string, err error) {
var resp *http.Response
if resp, err = fetch.Post(
googleTranslateAPI,
fetch.WithJSONBody(map[string]string{
"q": q,
"source": parseToGoogleSupportedLanguage(source),
"target": parseToGoogleSupportedLanguage(target),
"format": "text",
}),
fetch.WithRaiseForStatus(false),
fetch.WithQuery("key", key),
fetch.WithHeader("Content-Type", "application/json"),
); err != nil {
return
}
defer resp.Body.Close()
data := struct {
Error *errors.HTTPError `json:"error"`
Data struct {
Translations []struct {
DetectedSourceLanguage string `json:"detectedSourceLanguage"`
TranslatedText string `json:"translatedText"`
} `json:"translations"`
} `json:"data"`
}{}
if err = json.NewDecoder(resp.Body).Decode(&data); err == nil {
if data.Error != nil {
err = data.Error
} else {
result = data.Data.Translations[0].TranslatedText
}
}
return
}
func parseToGoogleSupportedLanguage(lang string) string {
if lang = strings.ToLower(lang); lang == "" || lang == "auto" /* auto detect */ {
return ""
}
tag, err := language.Parse(lang)
if err != nil {
return lang /* fallback to original */
}
return tag.String()
}