From 79983d9e7e231c2cf9e75ad51b155ad29901c1b2 Mon Sep 17 00:00:00 2001 From: manerakai Date: Thu, 31 Aug 2023 12:56:47 +0000 Subject: [PATCH] Implemented Definitions and Translations in Web interface git-svn-id: file:///srv/svn/repo/mai/trunk@22 e410bdd4-646f-c54f-a7ce-fffcc4f439ae --- engines/google.go | 170 ++++++++++++++++++++++--------------------- web/main.go | 4 +- web/views/index.html | 54 +++++++++++++- 3 files changed, 143 insertions(+), 85 deletions(-) diff --git a/engines/google.go b/engines/google.go index d398c81..f58c937 100644 --- a/engines/google.go +++ b/engines/google.go @@ -120,6 +120,8 @@ func (_ *GoogleTranslate) Translate(text string, from, to string) (TranslationRe doc, err := goquery.NewDocumentFromReader(response.Body) + translatedText := doc.Find(".result-container").Text() + if err != nil { return TranslationResult{}, err } @@ -164,105 +166,107 @@ func (_ *GoogleTranslate) Translate(text string, from, to string) (TranslationRe fmt.Println("Error:", err) return TranslationResult{}, nil } - - data := raw[0].([]interface{})[2].(string) - - var json_ []interface{} - err = json.Unmarshal([]byte(data), &json_) - definitions := make(map[string][]map[string]interface{}) + translations := make(map[string]map[string]map[string]interface{}) - if len(json_) > 3 && json_[3] != nil && - len(json_[3].([]interface{})) > 1 && json_[3].([]interface{})[1] != nil && - len(json_[3].([]interface{})[1].([]interface{})) > 0 && json_[3].([]interface{})[1].([]interface{})[0] != nil { - for x := 0; x < len(json_[3].([]interface{})[1].([]interface{})[0].([]interface{})); x++ { - if len(json_[3].([]interface{})[1].([]interface{})[0].([]interface{})[x].([]interface{})) > 0 { - definitionType := json_[3].([]interface{})[1].([]interface{})[0].([]interface{})[x].([]interface{})[0] - if definitionType == nil { - definitionType = "unknown" - } + if len(raw) > 0 && raw[0] != nil && + len(raw[0].([]interface{})) > 2 && raw[0].([]interface{})[2] != nil { + data := raw[0].([]interface{})[2].(string) - definitions[definitionType.(string)] = []map[string]interface{}{} + var json_ []interface{} + err = json.Unmarshal([]byte(data), &json_) - for i := 0; i < len(json_[3].([]interface{})[1].([]interface{})[0].([]interface{})[x].([]interface{})[1].([]interface{})); i++ { - definitionBox := json_[3].([]interface{})[1].([]interface{})[0].([]interface{})[x].([]interface{})[1].([]interface{})[i].([]interface{}) - definitions[definitionType.(string)] = append(definitions[definitionType.(string)], map[string]interface{}{}) - - if len(definitionBox) > 4 && definitionBox[4] != nil && - len(definitionBox[4].([]interface{})) > 0 && definitionBox[4].([]interface{})[0] != nil && - len(definitionBox[4].([]interface{})[0].([]interface{})) > 0 && definitionBox[4].([]interface{})[0].([]interface{})[0] != nil { - definitions[definitionType.(string)][i]["dictionary"] = definitionBox[4].([]interface{})[0].([]interface{})[0] + if len(json_) > 3 && json_[3] != nil && + len(json_[3].([]interface{})) > 1 && json_[3].([]interface{})[1] != nil && + len(json_[3].([]interface{})[1].([]interface{})) > 0 && json_[3].([]interface{})[1].([]interface{})[0] != nil { + for x := 0; x < len(json_[3].([]interface{})[1].([]interface{})[0].([]interface{})); x++ { + if len(json_[3].([]interface{})[1].([]interface{})[0].([]interface{})[x].([]interface{})) > 0 { + definitionType := json_[3].([]interface{})[1].([]interface{})[0].([]interface{})[x].([]interface{})[0] + if definitionType == nil { + definitionType = "unknown" } - if len(definitionBox) > 0 && definitionBox[0] != nil { - definitions[definitionType.(string)][i]["definition"] = definitionBox[0] - } + definitions[definitionType.(string)] = []map[string]interface{}{} - if len(definitionBox) > 1 && definitionBox[1] != nil { - definitions[definitionType.(string)][i]["use-in-sentence"] = definitionBox[1] - } + for i := 0; i < len(json_[3].([]interface{})[1].([]interface{})[0].([]interface{})[x].([]interface{})[1].([]interface{})); i++ { + definitionBox := json_[3].([]interface{})[1].([]interface{})[0].([]interface{})[x].([]interface{})[1].([]interface{})[i].([]interface{}) + definitions[definitionType.(string)] = append(definitions[definitionType.(string)], map[string]interface{}{}) - if len(definitionBox) > 5 && definitionBox[5] != nil { - definitions[definitionType.(string)][i]["synonyms"] = map[string][]string{} - synonyms := definitionBox[5].([]interface{}) - synonymsMap := make(map[string][]string) - - for _, synonymBox := range synonyms { - synonymType := "" - if len(synonymBox.([]interface{})) > 1 && synonymBox.([]interface{})[1] != nil && - len(synonymBox.([]interface{})[1].([]interface{})) > 0 && synonymBox.([]interface{})[1].([]interface{})[0] != nil { - synonymType = synonymBox.([]interface{})[1].([]interface{})[0].([]interface{})[0].(string) - } - - if len(synonymBox.([]interface{})) > 0 && synonymBox.([]interface{})[0] != nil { - synonymList := synonymBox.([]interface{})[0].([]interface{}) - synonymsMap[synonymType] = []string{} - for _, synonymTypeWord := range synonymList { - synonymsMap[synonymType] = append(synonymsMap[synonymType], synonymTypeWord.([]interface{})[0].(string)) - } - } + if len(definitionBox) > 4 && definitionBox[4] != nil && + len(definitionBox[4].([]interface{})) > 0 && definitionBox[4].([]interface{})[0] != nil && + len(definitionBox[4].([]interface{})[0].([]interface{})) > 0 && definitionBox[4].([]interface{})[0].([]interface{})[0] != nil { + definitions[definitionType.(string)][i]["dictionary"] = definitionBox[4].([]interface{})[0].([]interface{})[0] } - definitions[definitionType.(string)][i]["synonyms"] = synonymsMap + if len(definitionBox) > 0 && definitionBox[0] != nil { + definitions[definitionType.(string)][i]["definition"] = definitionBox[0] + } + + if len(definitionBox) > 1 && definitionBox[1] != nil { + definitions[definitionType.(string)][i]["use_in_sentence"] = definitionBox[1] + } + + if len(definitionBox) > 5 && definitionBox[5] != nil { + definitions[definitionType.(string)][i]["synonyms"] = map[string][]string{} + synonyms := definitionBox[5].([]interface{}) + synonymsMap := make(map[string][]string) + + for _, synonymBox := range synonyms { + synonymType := "" + if len(synonymBox.([]interface{})) > 1 && synonymBox.([]interface{})[1] != nil && + len(synonymBox.([]interface{})[1].([]interface{})) > 0 && synonymBox.([]interface{})[1].([]interface{})[0] != nil { + synonymType = synonymBox.([]interface{})[1].([]interface{})[0].([]interface{})[0].(string) + } + + if len(synonymBox.([]interface{})) > 0 && synonymBox.([]interface{})[0] != nil { + synonymList := synonymBox.([]interface{})[0].([]interface{}) + synonymsMap[synonymType] = []string{} + for _, synonymTypeWord := range synonymList { + synonymsMap[synonymType] = append(synonymsMap[synonymType], synonymTypeWord.([]interface{})[0].(string)) + } + } + } + + definitions[definitionType.(string)][i]["synonyms"] = synonymsMap + } } } } } - } - translations := make(map[string]map[string]map[string]interface{}) - if len(json_) > 3 && json_[3] != nil && - len(json_[3].([]interface{})) > 5 && json_[3].([]interface{})[5] != nil && - len(json_[3].([]interface{})[5].([]interface{})) > 0 && json_[3].([]interface{})[5].([]interface{})[0] != nil { - translationBox := json_[3].([]interface{})[5].([]interface{})[0].([]interface{}) - for x := 0; x < len(translationBox); x++ { - if len(translationBox[x].([]interface{})) > 0 { - translationType := translationBox[x].([]interface{})[0] - if translationType == nil { - translationType = "unknown" - } - translations[translationType.(string)] = make(map[string]map[string]interface{}) + if len(json_) > 3 && json_[3] != nil && + len(json_[3].([]interface{})) > 5 && json_[3].([]interface{})[5] != nil && + len(json_[3].([]interface{})[5].([]interface{})) > 0 && json_[3].([]interface{})[5].([]interface{})[0] != nil { + translationBox := json_[3].([]interface{})[5].([]interface{})[0].([]interface{}) + for x := 0; x < len(translationBox); x++ { + if len(translationBox[x].([]interface{})) > 0 { + translationType := translationBox[x].([]interface{})[0] + if translationType == nil { + translationType = "unknown" + } + translations[translationType.(string)] = make(map[string]map[string]interface{}) - if len(translationBox[x].([]interface{})) > 1 && translationBox[x].([]interface{})[1] != nil { - translationNamesBox := translationBox[x].([]interface{})[1].([]interface{}) - for i := 0; i < len(translationNamesBox); i++ { - if len(translationNamesBox[i].([]interface{})) > 0 && translationNamesBox[i].([]interface{})[0] != nil { - translationName := translationNamesBox[i].([]interface{})[0].(string) - translations[translationType.(string)][translationName] = make(map[string]interface{}) - if len(translationNamesBox[i].([]interface{})) > 3 && translationNamesBox[i].([]interface{})[3] != nil { - frequency := fmt.Sprintf("%d", int(translationNamesBox[i].([]interface{})[3].(float64))) - if frequency == "3" { - frequency = "1" - } else if frequency == "1" { - frequency = "3" - } - translations[translationType.(string)][translationName]["frequency"] = frequency + "/3" + if len(translationBox[x].([]interface{})) > 1 && translationBox[x].([]interface{})[1] != nil { + translationNamesBox := translationBox[x].([]interface{})[1].([]interface{}) + for i := 0; i < len(translationNamesBox); i++ { + if len(translationNamesBox[i].([]interface{})) > 0 && translationNamesBox[i].([]interface{})[0] != nil { + translationName := translationNamesBox[i].([]interface{})[0].(string) + translations[translationType.(string)][translationName] = make(map[string]interface{}) + if len(translationNamesBox[i].([]interface{})) > 3 && translationNamesBox[i].([]interface{})[3] != nil { + frequency := fmt.Sprintf("%d", int(translationNamesBox[i].([]interface{})[3].(float64))) + if frequency == "3" { + frequency = "1" + } else if frequency == "1" { + frequency = "3" + } + translations[translationType.(string)][translationName]["frequency"] = frequency + "/3" - translations[translationType.(string)][translationName]["words"] = []string{} - if len(translationNamesBox[i].([]interface{})) > 2 && translationNamesBox[i].([]interface{})[2] != nil { - for z := 0; z < len(translationNamesBox[i].([]interface{})[2].([]interface{})); z++ { - word := translationNamesBox[i].([]interface{})[2].([]interface{})[z].(string) - translations[translationType.(string)][translationName]["words"] = append(translations[translationType.(string)][translationName]["words"].([]string), word) + translations[translationType.(string)][translationName]["words"] = []string{} + if len(translationNamesBox[i].([]interface{})) > 2 && translationNamesBox[i].([]interface{})[2] != nil { + for z := 0; z < len(translationNamesBox[i].([]interface{})[2].([]interface{})); z++ { + word := translationNamesBox[i].([]interface{})[2].([]interface{})[z].(string) + translations[translationType.(string)][translationName]["words"] = append(translations[translationType.(string)][translationName]["words"].([]string), word) + } } } } @@ -277,6 +281,6 @@ func (_ *GoogleTranslate) Translate(text string, from, to string) (TranslationRe SourceLanguage: from, Definitions: definitions, Translations: translations, - TranslatedText: doc.Find(".result-container").Text(), + TranslatedText: translatedText, }, nil } diff --git a/web/main.go b/web/main.go index b5cd56b..0b27ebf 100644 --- a/web/main.go +++ b/web/main.go @@ -39,6 +39,7 @@ func main() { ttsFrom := "" ttsTo := "" + var translation engines.TranslationResult if c.Method() == "POST" { from = c.FormValue("from") to = c.FormValue("to") @@ -47,6 +48,7 @@ func main() { return c.SendStatus(500) } else { translatedText = result.TranslatedText + translation = result } ttsFromURL, _ := url.Parse("api/tts") @@ -93,7 +95,7 @@ func main() { "SourceLanguages": sourceLanguages, "TargetLanguages": targetLanguages, "OriginalText": originalText, - "TranslatedText": translatedText, + "Translation": translation, "From": from, "To": to, "TtsFrom": ttsFrom, diff --git a/web/views/index.html b/web/views/index.html index 5a15a11..0e1adf1 100644 --- a/web/views/index.html +++ b/web/views/index.html @@ -66,7 +66,7 @@
+ readonly>{{.Translation.TranslatedText}} {{if .TtsTo}}
+
+ +
+ {{ if .Translation.Definitions }} +
+ {{ range $type, $definitions :=.Translation.Definitions }} + {{ $type }} +
    + {{ range $definition_item := $definitions }} +
  1. + {{ $definition_item.definition }} +
    + {{with $definition_item.use_in_sentence}} + "{{$definition_item.use_in_sentence}}" +
    + {{end}} + {{with $definition_item.synonyms}} + {{ range $synonym_type, $_ := $definition_item.synonyms }} + + {{if $synonym_type }} +
    + {{$synonym_type}}: {{end}}{{ range $index, $element := index + $definition_item.synonyms $synonym_type}}{{if $index}}, {{end}}{{$element}}{{end}} +
    + {{end}} + {{end}} +
  2. + {{end}} +
+ {{end}} +
+ {{ end}} + + {{ if .Translation.Translations }} +
+ {{ range $def_type, $translations := .Translation.Translations }} + {{ $def_type }} +
    + {{ range $word, $word_translations := $translations }} +
  • + {{$word}}: + {{ range $index, $element := $word_translations.words}}{{if $index}}, {{end}}{{$element}}{{end}} + {{$word_translations.frequency}} +
  • +
    + {{end}} +
+ {{end}} +
+ {{end}} +
+