diff --git a/internal/translate/bingtranslate/translator.go b/internal/translate/bingtranslate/translator.go index 4f9bb2a..2cde1eb 100644 --- a/internal/translate/bingtranslate/translator.go +++ b/internal/translate/bingtranslate/translator.go @@ -19,6 +19,7 @@ import ( const ( setUpURL = "https://www.bing.com/translator" textURL = "https://www.bing.com/ttranslatev3?IG=%s&IID=%s" + posURL = "https://www.bing.com/tlookupv3?IG=%s&IID=%s" ttsURL = "https://www.bing.com/tfettts?IG=%s&IID=%s" ttsSSML = "%s" ) @@ -121,6 +122,46 @@ func (t *BingTranslate) Translate(message string) (translation, definition, part translation = fmt.Sprintf("%v", data[0].(map[string]interface{})["translations"].([]interface{})[0].(map[string]interface{})["text"]) + userData = url.Values{ + "from": {langCode[t.GetSrcLang()]}, + "to": {langCode[t.GetDstLang()]}, + "text": {message}, + "key": {initData.key}, + "token": {initData.token}, + } + req, err = http.NewRequest("POST", + fmt.Sprintf(posURL, initData.ig, initData.iid), + strings.NewReader(userData.Encode()), + ) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + req.Header.Add("User-Agent", core.UserAgent) + res, err = http.DefaultClient.Do(req) + if err != nil { + return "", "", "", err + } + body, err = ioutil.ReadAll(res.Body) + if err != nil { + return "", "", "", err + } + // Bing will return a list request part of speech success + // Otherwises, it would return map + // Then the following err would not be nil + if err = json.Unmarshal(body, &data); err == nil { + set := make(posSet) + for _, pos := range data[0].(map[string]interface{})["translations"].([]interface{}) { + pos := pos.(map[string]interface{}) + var words translationWord + + words.target = pos["displayTarget"].(string) + for _, backTranslation := range pos["backTranslations"].([]interface{}) { + backTranslation := backTranslation.(map[string]interface{}) + words.add(backTranslation["displayText"].(string)) + } + set.add(pos["posTag"].(string), words) + } + partOfSpeech = set.format() + } + return translation, definition, partOfSpeech, nil } diff --git a/internal/translate/bingtranslate/utils.go b/internal/translate/bingtranslate/utils.go new file mode 100644 index 0000000..2762d17 --- /dev/null +++ b/internal/translate/bingtranslate/utils.go @@ -0,0 +1,44 @@ +package bingtranslate + +import ( + "fmt" +) + +type translationWord struct { + target string + backTargets []string +} + +func (t *translationWord) add(s string) { + t.backTargets = append(t.backTargets, s) +} + +type posSet map[string][]translationWord + +func (set posSet) add(tag string, words translationWord) { + if _, ok := set[tag]; !ok { + set[tag] = []translationWord{words} + } else { + set[tag] = append(set[tag], words) + } +} + +func (set posSet) format() (s string) { + for tag := range set { + s += fmt.Sprintf("[%s]\n", tag) + for _, words := range set[tag] { + s += fmt.Sprintf("\t%s:", words.target) + firstWord := true + for _, backTarget := range words.backTargets { + if firstWord { + s += fmt.Sprintf(" %s", backTarget) + firstWord = false + } else { + s += fmt.Sprintf(", %s", backTarget) + } + } + s += "\n" + } + } + return s +}