From 16a9c3a676e07488f1e7f8a7d13a24a03ba688a1 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sun, 15 Jan 2023 14:38:32 +0800 Subject: [PATCH] feat: add definition --- internal/translate/translator.go | 37 +++++++++++++++++++++++--------- main.go | 33 ++++++++++++++++------------ ui.go | 3 ++- 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/internal/translate/translator.go b/internal/translate/translator.go index 832c2b6..0791338 100644 --- a/internal/translate/translator.go +++ b/internal/translate/translator.go @@ -14,7 +14,7 @@ import ( ) const ( - textURL = "https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&dt=bd&sl=%s&tl=%s&q=%s" + textURL = "https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&dt=bd&dt=md&dt=ex&sl=%s&tl=%s&q=%s" soundURL = "https://translate.google.com.vn/translate_tts?ie=UTF-8&q=%s&tl=%s&client=tw-ob" ) @@ -30,7 +30,11 @@ func NewTranslator() *Translator { } } -func (t *Translator) Translate(message string) (translation string, partOfSpeech string, err error) { +func (t *Translator) Translate(message string) ( + translation string, + definition string, + partOfSpeech string, + err error) { var data []interface{} urlStr := fmt.Sprintf( @@ -41,25 +45,25 @@ func (t *Translator) Translate(message string) (translation string, partOfSpeech ) res, err := http.Get(urlStr) if err != nil { - return "", "", err + return "", "", "", err } body, err := ioutil.ReadAll(res.Body) if err != nil { - return "", "", err + return "", "", "", err } if err = json.Unmarshal(body, &data); err != nil { - return "", "", err + return "", "", "", err } if len(data) > 0 { - // translation + // translation = data[0] for _, lines := range data[0].([]interface{}) { translatedLine := lines.([]interface{})[0] translation += fmt.Sprintf("%v", translatedLine) } - // part of speech + // part of speech = data[1] if data[1] != nil { for _, parts := range data[1].([]interface{}) { // part of speech @@ -80,13 +84,26 @@ func (t *Translator) Translate(message string) (translation string, partOfSpeech } partOfSpeech += "\n" } - partOfSpeech += "\n" } } - return translation, partOfSpeech, nil + + // definition = data[12] + if len(data) >= 13 && data[12] != nil { + for _, parts := range data[12].([]interface{}) { + definition += fmt.Sprintf("[%v]\n", parts.([]interface{})[0]) + for _, sentences := range parts.([]interface{})[1].([]interface{}) { + definition += fmt.Sprintf("\t- %v\n", sentences.([]interface{})[0]) + // Get example sentence + if len(sentences.([]interface{})) >= 3 && sentences.([]interface{})[2] != nil { + definition += fmt.Sprintf("\t\t- \"%v\"\n", sentences.([]interface{})[2]) + } + } + } + } + return translation, definition, partOfSpeech, nil } - return "", "", errors.New("Translation not found") + return "", "", "", errors.New("Translation not found") } func (t *Translator) PlaySound(lang string, message string) error { diff --git a/main.go b/main.go index 78045ba..fdd6857 100644 --- a/main.go +++ b/main.go @@ -11,20 +11,25 @@ var ( // Translate translator = translate.NewTranslator() // UI - app = tview.NewApplication() - srcInput = tview.NewTextArea() - dstOutput = tview.NewTextView() - defOutput = tview.NewTextArea() - posOutput = tview.NewTextArea() - srcLangDropDown = tview.NewDropDown() - dstLangDropDown = tview.NewDropDown() - langCycle = ui.NewUICycle(srcLangDropDown, dstLangDropDown) - themeDropDown = tview.NewDropDown() - transparentDropDown = tview.NewDropDown() - hideBelowDropDown = tview.NewDropDown() - srcBorderDropDown = tview.NewDropDown() - dstBorderDropDown = tview.NewDropDown() - styleCycle = ui.NewUICycle(themeDropDown, transparentDropDown, hideBelowDropDown, srcBorderDropDown, dstBorderDropDown) + app = tview.NewApplication() + srcInput = tview.NewTextArea() + dstOutput = tview.NewTextView() + defOutput = tview.NewTextArea() + posOutput = tview.NewTextArea() + srcLangDropDown = tview.NewDropDown() + dstLangDropDown = tview.NewDropDown() + langCycle = ui.NewUICycle(srcLangDropDown, dstLangDropDown) + themeDropDown = tview.NewDropDown() + transparentDropDown = tview.NewDropDown() + hideBelowDropDown = tview.NewDropDown() + srcBorderDropDown = tview.NewDropDown() + dstBorderDropDown = tview.NewDropDown() + styleCycle = ui.NewUICycle( + themeDropDown, + transparentDropDown, + hideBelowDropDown, + srcBorderDropDown, + dstBorderDropDown) keyMapMenu = tview.NewTextView() langButton = tview.NewButton("(1)Language") styleButton = tview.NewButton("(2)Style") diff --git a/ui.go b/ui.go index 5716602..778795d 100644 --- a/ui.go +++ b/ui.go @@ -399,11 +399,12 @@ func translateWindowHandler(event *tcell.EventKey) *tcell.EventKey { message := srcInput.GetText() // Only translate when message exist if len(message) > 0 { - translation, partOfSpeech, err := translator.Translate(message) + translation, definition, partOfSpeech, err := translator.Translate(message) if err != nil { dstOutput.SetText(err.Error()) } else { dstOutput.SetText(translation) + defOutput.SetText(definition, false) posOutput.SetText(partOfSpeech, false) } }