mirror of
https://github.com/eeeXun/GTT.git
synced 2025-05-21 01:50:36 -07:00
add bing pos
This commit is contained in:
parent
462ae6ae74
commit
0d6a3576d6
@ -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 = "<speak version='1.0' xml:lang='%[1]s'><voice xml:lang='%[1]s' xml:gender='Female' name='%s'><prosody rate='-20.00%%'>%s</prosody></voice></speak>"
|
||||
)
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
44
internal/translate/bingtranslate/utils.go
Normal file
44
internal/translate/bingtranslate/utils.go
Normal file
@ -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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user