From 9feba79000dc3309643d4d7bf921c3b3ca45937d Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 22 Apr 2023 20:37:43 +0800 Subject: [PATCH 01/19] style: reorder AllTranslator --- internal/translate/translator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/translate/translator.go b/internal/translate/translator.go index 3a942dc..ee7439a 100644 --- a/internal/translate/translator.go +++ b/internal/translate/translator.go @@ -11,8 +11,8 @@ import ( var ( AllTranslator = []string{ "ApertiumTranslate", - "BingTranslate", "ArgosTranslate", + "BingTranslate", "GoogleTranslate", "ReversoTranslate", } From 96e7b6c3acb0f35c020ad1219a54edac603c5a6a Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 22 Apr 2023 21:02:38 +0800 Subject: [PATCH 02/19] refactor: return translation in struct --- .../translate/apertiumtranslate/translator.go | 17 +++++----- .../translate/argostranslate/translator.go | 15 ++++----- .../translate/bingtranslate/translator.go | 23 +++++++------- internal/translate/core/utils.go | 11 +++++++ .../translate/googletranslate/translator.go | 31 ++++++++++--------- .../translate/reversotranslate/translator.go | 25 ++++++++------- internal/translate/translator.go | 3 +- ui.go | 8 ++--- 8 files changed, 75 insertions(+), 58 deletions(-) diff --git a/internal/translate/apertiumtranslate/translator.go b/internal/translate/apertiumtranslate/translator.go index 4046fb3..8ef1243 100644 --- a/internal/translate/apertiumtranslate/translator.go +++ b/internal/translate/apertiumtranslate/translator.go @@ -33,7 +33,8 @@ func (t *ApertiumTranslate) GetAllLang() []string { return lang } -func (t *ApertiumTranslate) Translate(message string) (translation, definition, partOfSpeech string, err error) { +func (t *ApertiumTranslate) Translate(message string) (translation *core.Translation, err error) { + translation = new(core.Translation) var data map[string]interface{} urlStr := fmt.Sprintf( @@ -44,26 +45,26 @@ func (t *ApertiumTranslate) Translate(message string) (translation, definition, ) res, err := http.Get(urlStr) if err != nil { - return "", "", "", err + return nil, err } body, err := ioutil.ReadAll(res.Body) if err != nil { - return "", "", "", err + return nil, err } if err = json.Unmarshal(body, &data); err != nil { - return "", "", "", err + return nil, err } if len(data) <= 0 { - return "", "", "", errors.New("Translation not found") + return nil, errors.New("Translation not found") } switch res.StatusCode { case 200: - translation = fmt.Sprintf("%v", + translation.TEXT = fmt.Sprintf("%v", data["responseData"].(map[string]interface{})["translatedText"]) default: - return "", "", "", errors.New( + return nil, errors.New( fmt.Sprintf("%s does not support translate from %s to %s.\nSee available pair on %s", t.GetEngineName(), t.GetSrcLang(), @@ -72,7 +73,7 @@ func (t *ApertiumTranslate) Translate(message string) (translation, definition, )) } - return translation, definition, partOfSpeech, nil + return translation, nil } func (t *ApertiumTranslate) PlayTTS(lang, message string) error { diff --git a/internal/translate/argostranslate/translator.go b/internal/translate/argostranslate/translator.go index 3a00fc1..2debc42 100644 --- a/internal/translate/argostranslate/translator.go +++ b/internal/translate/argostranslate/translator.go @@ -33,7 +33,8 @@ func (t *ArgosTranslate) GetAllLang() []string { return lang } -func (t *ArgosTranslate) Translate(message string) (translation, definition, partOfSpeech string, err error) { +func (t *ArgosTranslate) Translate(message string) (translation *core.Translation, err error) { + translation = new(core.Translation) var data map[string]interface{} res, err := http.PostForm(textURL, @@ -43,23 +44,23 @@ func (t *ArgosTranslate) Translate(message string) (translation, definition, par "target": {langCode[t.GetDstLang()]}, }) if err != nil { - return "", "", "", err + return nil, err } body, err := ioutil.ReadAll(res.Body) if err != nil { - return "", "", "", err + return nil, err } if err = json.Unmarshal(body, &data); err != nil { - return "", "", "", err + return nil, err } if len(data) <= 0 { - return "", "", "", errors.New("Translation not found") + return nil, errors.New("Translation not found") } - translation = fmt.Sprintf("%v", data["translatedText"]) + translation.TEXT = fmt.Sprintf("%v", data["translatedText"]) - return translation, definition, partOfSpeech, nil + return translation, nil } func (t *ArgosTranslate) PlayTTS(lang, message string) error { diff --git a/internal/translate/bingtranslate/translator.go b/internal/translate/bingtranslate/translator.go index 82d35bd..7e8d91e 100644 --- a/internal/translate/bingtranslate/translator.go +++ b/internal/translate/bingtranslate/translator.go @@ -82,12 +82,13 @@ func (t *BingTranslate) setUp() (*setUpData, error) { return &data, nil } -func (t *BingTranslate) Translate(message string) (translation, definition, partOfSpeech string, err error) { +func (t *BingTranslate) Translate(message string) (translation *core.Translation, err error) { + translation = new(core.Translation) var data []interface{} initData, err := t.setUp() if err != nil { - return "", "", "", err + return nil, err } userData := url.Values{ "fromLang": {langCode[t.GetSrcLang()]}, @@ -104,22 +105,22 @@ func (t *BingTranslate) Translate(message string) (translation, definition, part req.Header.Add("User-Agent", core.UserAgent) res, err := http.DefaultClient.Do(req) if err != nil { - return "", "", "", err + return nil, err } body, err := ioutil.ReadAll(res.Body) if err != nil { - return "", "", "", err + return nil, err } if err = json.Unmarshal(body, &data); err != nil { - return "", "", "", err + return nil, err } if len(data) <= 0 { - return "", "", "", errors.New("Translation not found") + return nil, errors.New("Translation not found") } // translation - translation = fmt.Sprintf("%v", + translation.TEXT = fmt.Sprintf("%v", data[0].(map[string]interface{})["translations"].([]interface{})[0].(map[string]interface{})["text"]) // request part of speech @@ -133,11 +134,11 @@ func (t *BingTranslate) Translate(message string) (translation, definition, part req.Header.Add("User-Agent", core.UserAgent) res, err = http.DefaultClient.Do(req) if err != nil { - return "", "", "", err + return nil, err } body, err = ioutil.ReadAll(res.Body) if err != nil { - return "", "", "", err + return nil, err } // Bing will return the request with list when success. // Otherwises, it would return map. Then the following err would not be nil. @@ -154,10 +155,10 @@ func (t *BingTranslate) Translate(message string) (translation, definition, part } poses.add(pos["posTag"].(string), words) } - partOfSpeech = poses.format() + translation.POS = poses.format() } - return translation, definition, partOfSpeech, nil + return translation, nil } func (t *BingTranslate) PlayTTS(lang, message string) error { diff --git a/internal/translate/core/utils.go b/internal/translate/core/utils.go index 28dfdac..0534a41 100644 --- a/internal/translate/core/utils.go +++ b/internal/translate/core/utils.go @@ -3,3 +3,14 @@ package core const ( UserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36" ) + +type Translation struct { + // translation text + TEXT string + + // translation definition or example + DEF string + + // translation part of speech + POS string +} diff --git a/internal/translate/googletranslate/translator.go b/internal/translate/googletranslate/translator.go index 2e41c3d..75ec308 100644 --- a/internal/translate/googletranslate/translator.go +++ b/internal/translate/googletranslate/translator.go @@ -37,7 +37,8 @@ func (t *GoogleTranslate) GetAllLang() []string { return lang } -func (t *GoogleTranslate) Translate(message string) (translation, definition, partOfSpeech string, err error) { +func (t *GoogleTranslate) Translate(message string) (translation *core.Translation, err error) { + translation = new(core.Translation) var data []interface{} urlStr := fmt.Sprintf( @@ -48,24 +49,24 @@ func (t *GoogleTranslate) Translate(message string) (translation, definition, pa ) res, err := http.Get(urlStr) if err != nil { - return "", "", "", err + return nil, err } body, err := ioutil.ReadAll(res.Body) if err != nil { - return "", "", "", err + return nil, err } if err = json.Unmarshal(body, &data); err != nil { - return "", "", "", err + return nil, err } if len(data) <= 0 { - return "", "", "", errors.New("Translation not found") + return nil, errors.New("Translation not found") } // translation = data[0] for _, line := range data[0].([]interface{}) { translatedLine := line.([]interface{})[0] - translation += fmt.Sprintf("%v", translatedLine) + translation.TEXT += fmt.Sprintf("%v", translatedLine) } // part of speech = data[1] if data[1] != nil { @@ -73,23 +74,23 @@ func (t *GoogleTranslate) Translate(message string) (translation, definition, pa partOfSpeeches := partOfSpeeches.([]interface{}) // part of speech pos := partOfSpeeches[0] - partOfSpeech += fmt.Sprintf("[%v]\n", pos) + translation.POS += fmt.Sprintf("[%v]\n", pos) for _, words := range partOfSpeeches[2].([]interface{}) { words := words.([]interface{}) // dst lang dstWord := words[0] - partOfSpeech += fmt.Sprintf("\t%v:", dstWord) + translation.POS += fmt.Sprintf("\t%v:", dstWord) // src lang firstWord := true for _, word := range words[1].([]interface{}) { if firstWord { - partOfSpeech += fmt.Sprintf(" %v", word) + translation.POS += fmt.Sprintf(" %v", word) firstWord = false } else { - partOfSpeech += fmt.Sprintf(", %v", word) + translation.POS += fmt.Sprintf(", %v", word) } } - partOfSpeech += "\n" + translation.POS += "\n" } } } @@ -99,22 +100,22 @@ func (t *GoogleTranslate) Translate(message string) (translation, definition, pa definitions := definitions.([]interface{}) // part of speech pos := definitions[0] - definition += fmt.Sprintf("[%v]\n", pos) + translation.DEF += fmt.Sprintf("[%v]\n", pos) for _, sentences := range definitions[1].([]interface{}) { sentences := sentences.([]interface{}) // definition def := sentences[0] - definition += fmt.Sprintf("\t- %v\n", def) + translation.DEF += fmt.Sprintf("\t- %v\n", def) // example sentence if len(sentences) >= 3 && sentences[2] != nil { example := sentences[2] - definition += fmt.Sprintf("\t\t\"%v\"\n", example) + translation.DEF += fmt.Sprintf("\t\t\"%v\"\n", example) } } } } - return translation, definition, partOfSpeech, nil + return translation, nil } func (t *GoogleTranslate) PlayTTS(lang, message string) error { diff --git a/internal/translate/reversotranslate/translator.go b/internal/translate/reversotranslate/translator.go index 1251c57..743427c 100644 --- a/internal/translate/reversotranslate/translator.go +++ b/internal/translate/reversotranslate/translator.go @@ -39,11 +39,12 @@ func (t *ReversoTranslate) GetAllLang() []string { return lang } -func (t *ReversoTranslate) Translate(message string) (translation, definition, partOfSpeech string, err error) { +func (t *ReversoTranslate) Translate(message string) (translation *core.Translation, err error) { + translation = new(core.Translation) var data map[string]interface{} if t.GetSrcLang() == t.GetDstLang() { - return "", "", "", errors.New( + return nil, errors.New( fmt.Sprintf("%s doesn't support translation of the same language.\ni.e. %s to %s", t.GetEngineName(), t.GetSrcLang(), t.GetDstLang())) } @@ -67,23 +68,23 @@ func (t *ReversoTranslate) Translate(message string) (translation, definition, p req.Header.Add("User-Agent", core.UserAgent) res, err := http.DefaultClient.Do(req) if err != nil { - return "", "", "", err + return nil, err } body, err := ioutil.ReadAll(res.Body) if err != nil { - return "", "", "", err + return nil, err } if err = json.Unmarshal(body, &data); err != nil { - return "", "", "", err + return nil, err } if len(data) <= 0 { - return "", "", "", errors.New("Translation not found") + return nil, errors.New("Translation not found") } // translation for _, line := range data["translation"].([]interface{}) { - translation += fmt.Sprintf("%v", line) + translation.TEXT += fmt.Sprintf("%v", line) } // definition and part of speech if data["contextResults"] != nil { @@ -94,20 +95,20 @@ func (t *ReversoTranslate) Translate(message string) (translation, definition, p dstExample := results["targetExamples"].([]interface{}) if len(srcExample) > 0 && len(dstExample) > 0 { for i := 0; i < len(srcExample) && i < len(dstExample); i++ { - definition += fmt.Sprintf("- %v\n\t\"%v\"\n", srcExample[i], dstExample[i]) + translation.DEF += fmt.Sprintf("- %v\n\t\"%v\"\n", srcExample[i], dstExample[i]) } } // part of speech if results["partOfSpeech"] == nil { - partOfSpeech += fmt.Sprintf("%v\n", results["translation"]) + translation.POS += fmt.Sprintf("%v\n", results["translation"]) } else { - partOfSpeech += fmt.Sprintf("%v [%v]\n", results["translation"], results["partOfSpeech"]) + translation.POS += fmt.Sprintf("%v [%v]\n", results["translation"], results["partOfSpeech"]) } } - definition = regexp.MustCompile("<(|/)em>").ReplaceAllString(definition, "") + translation.DEF = regexp.MustCompile("<(|/)em>").ReplaceAllString(translation.DEF, "") } - return translation, definition, partOfSpeech, nil + return translation, nil } func (t *ReversoTranslate) PlayTTS(lang, message string) error { diff --git a/internal/translate/translator.go b/internal/translate/translator.go index ee7439a..3aff0cc 100644 --- a/internal/translate/translator.go +++ b/internal/translate/translator.go @@ -4,6 +4,7 @@ import ( "github.com/eeeXun/gtt/internal/translate/apertiumtranslate" "github.com/eeeXun/gtt/internal/translate/argostranslate" "github.com/eeeXun/gtt/internal/translate/bingtranslate" + "github.com/eeeXun/gtt/internal/translate/core" "github.com/eeeXun/gtt/internal/translate/googletranslate" "github.com/eeeXun/gtt/internal/translate/reversotranslate" ) @@ -50,7 +51,7 @@ type Translator interface { StopTTS() // Translate from source to destination language - Translate(message string) (translation, definition, partOfSpeech string, err error) + Translate(message string) (translation *core.Translation, err error) // Play text to speech PlayTTS(lang, message string) error diff --git a/ui.go b/ui.go index fd053b8..b027061 100644 --- a/ui.go +++ b/ui.go @@ -454,13 +454,13 @@ func translateWindowHandler(event *tcell.EventKey) *tcell.EventKey { message := srcInput.GetText() // Only translate when message exist if len(message) > 0 { - translation, definition, partOfSpeech, err := translator.Translate(message) + translation, err := translator.Translate(message) if err != nil { dstOutput.SetText(err.Error()) } else { - dstOutput.SetText(translation) - defOutput.SetText(definition, false) - posOutput.SetText(partOfSpeech, false) + dstOutput.SetText(translation.TEXT) + defOutput.SetText(translation.DEF, false) + posOutput.SetText(translation.POS, false) } } case tcell.KeyCtrlQ: From 7788d82c4fdc89fe4a50a2f0dba4098815f5ac65 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sun, 23 Apr 2023 21:16:01 +0800 Subject: [PATCH 03/19] refactor: new setUpData in BingTranslate --- internal/translate/bingtranslate/translator.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/translate/bingtranslate/translator.go b/internal/translate/bingtranslate/translator.go index 7e8d91e..07e2820 100644 --- a/internal/translate/bingtranslate/translator.go +++ b/internal/translate/bingtranslate/translator.go @@ -50,7 +50,7 @@ func (t *BingTranslate) GetAllLang() []string { } func (t *BingTranslate) setUp() (*setUpData, error) { - var data setUpData + data := new(setUpData) res, err := http.Get(setUpURL) if err != nil { @@ -79,7 +79,7 @@ func (t *BingTranslate) setUp() (*setUpData, error) { data.key = paramsStr[0] data.token = paramsStr[1][1 : len(paramsStr[1])-1] - return &data, nil + return data, nil } func (t *BingTranslate) Translate(message string) (translation *core.Translation, err error) { From a76807d2548665521123b30a2f8e5083a1f60c25 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Thu, 27 Apr 2023 01:05:51 +0800 Subject: [PATCH 04/19] refactor: Change theme name to lowercase --- config.go | 10 ++++++++-- internal/style/color.go | 6 +++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/config.go b/config.go index a284137..a081177 100644 --- a/config.go +++ b/config.go @@ -4,6 +4,7 @@ import ( "fmt" "os" + "github.com/eeeXun/gtt/internal/style" "github.com/eeeXun/gtt/internal/translate" config "github.com/spf13/viper" ) @@ -15,7 +16,7 @@ func configInit() { defaultConfig = map[string]interface{}{ "hide_below": false, "transparent": false, - "theme": "Gruvbox", + "theme": "gruvbox", "source.border_color": "red", "destination.border_color": "blue", "source.language.apertiumtranslate": "English", @@ -42,7 +43,7 @@ func configInit() { } config.AddConfigPath("$HOME/.config/gtt") - // Create config file if not exists + // Create config file if it does not exist // Otherwise check if config value is missing if err := config.ReadInConfig(); err != nil { for key, value := range defaultConfig { @@ -60,6 +61,11 @@ func configInit() { missing = true } } + // Set to default theme if theme in config does not exist + if IndexOf(config.GetString("theme"), style.AllTheme) < 0 { + config.Set("theme", defaultConfig["theme"]) + missing = true + } if missing { config.WriteConfig() } diff --git a/internal/style/color.go b/internal/style/color.go index a90eca4..29069c4 100644 --- a/internal/style/color.go +++ b/internal/style/color.go @@ -5,10 +5,10 @@ import ( ) var ( - AllTheme = []string{"Gruvbox", "Nord"} + AllTheme = []string{"gruvbox", "nord"} Palette = []string{"red", "green", "yellow", "blue", "purple", "cyan", "orange"} themes = map[string]map[string]tcell.Color{ - "Gruvbox": { + "gruvbox": { "bg": tcell.NewHexColor(0x282828), "fg": tcell.NewHexColor(0xebdbb2), "gray": tcell.NewHexColor(0x665c54), @@ -20,7 +20,7 @@ var ( "cyan": tcell.NewHexColor(0x8ec07c), "orange": tcell.NewHexColor(0xfe8019), }, - "Nord": { + "nord": { "bg": tcell.NewHexColor(0x3b4252), "fg": tcell.NewHexColor(0xeceff4), "gray": tcell.NewHexColor(0x4c566a), From 4f30ce9df6024a8df51e9a85d6bb73774c3d0752 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 29 Apr 2023 00:17:09 +0800 Subject: [PATCH 05/19] refactor: rename Translator name without `Translate` --- README.md | 20 +++++----- config.go | 37 +++++++++-------- .../language.go | 2 +- .../translator.go | 16 ++++---- .../{argostranslate => argos}/language.go | 2 +- .../{argostranslate => argos}/translator.go | 16 ++++---- .../translate/{bingtranslate => bing}/lang.go | 2 +- .../{bingtranslate => bing}/translator.go | 18 ++++----- .../{bingtranslate => bing}/utils.go | 2 +- .../{googletranslate => google}/language.go | 2 +- .../{googletranslate => google}/translator.go | 16 ++++---- .../{reversotranslate => reverso}/language.go | 2 +- .../translator.go | 16 ++++---- internal/translate/translator.go | 40 +++++++++---------- 14 files changed, 98 insertions(+), 93 deletions(-) rename internal/translate/{apertiumtranslate => apertium}/language.go (98%) rename internal/translate/{apertiumtranslate => apertium}/translator.go (76%) rename internal/translate/{argostranslate => argos}/language.go (96%) rename internal/translate/{argostranslate => argos}/translator.go (73%) rename internal/translate/{bingtranslate => bing}/lang.go (99%) rename internal/translate/{bingtranslate => bing}/translator.go (92%) rename internal/translate/{bingtranslate => bing}/utils.go (97%) rename internal/translate/{googletranslate => google}/language.go (99%) rename internal/translate/{googletranslate => google}/translator.go (89%) rename internal/translate/{reversotranslate => reverso}/language.go (98%) rename internal/translate/{reversotranslate => reverso}/translator.go (90%) diff --git a/README.md b/README.md index 752a754..3124197 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ Google Translate TUI (Originally) Supported Translator: -[`ApertiumTranslate`](https://www.apertium.org/), -[`ArgosTranslate`](https://translate.argosopentech.com/)(default), -[`BingTranslate`](https://www.bing.com/translator), -[`GoogleTranslate`](https://translate.google.com/), -[`ReversoTranslate`](https://www.reverso.net/text-translation) +[`Apertium`](https://www.apertium.org/), +[`Argos`](https://translate.argosopentech.com/)(default), +[`Bing`](https://www.bing.com/translator), +[`Google`](https://translate.google.com/), +[`Reverso`](https://www.reverso.net/text-translation) ## ScreenShot @@ -47,11 +47,11 @@ gtt -src "English" -dst "Chinese (Traditional)" See available languages on: -- [Apertium Translate](https://www.apertium.org/) for `ApertiumTranslate` -- [argosopentech/argos-translate](https://github.com/argosopentech/argos-translate#supported-languages) for `ArgosTranslate` -- [Bing language-support](https://learn.microsoft.com/en-us/azure/cognitive-services/translator/language-support#translation) for `BingTranslate` -- [Google Language support](https://cloud.google.com/translate/docs/languages) for `GoogleTranslate` -- [Reverso Translation](https://www.reverso.net/text-translation) for `ReversoTranslate` +- [Apertium Translate](https://www.apertium.org/) for `Apertium` +- [argosopentech/argos-translate](https://github.com/argosopentech/argos-translate#supported-languages) for `Argos` +- [Bing language-support](https://learn.microsoft.com/en-us/azure/cognitive-services/translator/language-support#translation) for `Bing` +- [Google Language support](https://cloud.google.com/translate/docs/languages) for `Google` +- [Reverso Translation](https://www.reverso.net/text-translation) for `Reverso` ## Key Map diff --git a/config.go b/config.go index a081177..494c3df 100644 --- a/config.go +++ b/config.go @@ -14,22 +14,22 @@ func configInit() { var ( defaultConfigPath string defaultConfig = map[string]interface{}{ - "hide_below": false, - "transparent": false, - "theme": "gruvbox", - "source.border_color": "red", - "destination.border_color": "blue", - "source.language.apertiumtranslate": "English", - "destination.language.apertiumtranslate": "English", - "source.language.argostranslate": "English", - "destination.language.argostranslate": "English", - "source.language.bingtranslate": "English", - "destination.language.bingtranslate": "English", - "source.language.googletranslate": "English", - "destination.language.googletranslate": "English", - "source.language.reversotranslate": "English", - "destination.language.reversotranslate": "English", - "translator": "ArgosTranslate", + "hide_below": false, + "transparent": false, + "theme": "gruvbox", + "source.border_color": "red", + "destination.border_color": "blue", + "source.language.apertium": "English", + "destination.language.apertium": "English", + "source.language.argos": "English", + "destination.language.argos": "English", + "source.language.bing": "English", + "destination.language.bing": "English", + "source.language.google": "English", + "destination.language.google": "English", + "source.language.reverso": "English", + "destination.language.reverso": "English", + "translator": "Argos", } ) @@ -66,6 +66,11 @@ func configInit() { config.Set("theme", defaultConfig["theme"]) missing = true } + // Set to default translator if translator in config does not exist + if IndexOf(config.GetString("translator"), translate.AllTranslator) < 0 { + config.Set("translator", defaultConfig["translator"]) + missing = true + } if missing { config.WriteConfig() } diff --git a/internal/translate/apertiumtranslate/language.go b/internal/translate/apertium/language.go similarity index 98% rename from internal/translate/apertiumtranslate/language.go rename to internal/translate/apertium/language.go index 09c611f..b45b7fd 100644 --- a/internal/translate/apertiumtranslate/language.go +++ b/internal/translate/apertium/language.go @@ -1,4 +1,4 @@ -package apertiumtranslate +package apertium var ( lang = []string{ diff --git a/internal/translate/apertiumtranslate/translator.go b/internal/translate/apertium/translator.go similarity index 76% rename from internal/translate/apertiumtranslate/translator.go rename to internal/translate/apertium/translator.go index 8ef1243..64f5648 100644 --- a/internal/translate/apertiumtranslate/translator.go +++ b/internal/translate/apertium/translator.go @@ -1,4 +1,4 @@ -package apertiumtranslate +package apertium import ( "encoding/json" @@ -15,25 +15,25 @@ const ( textURL = "https://www.apertium.org/apy/translate?langpair=%s|%s&q=%s" ) -type ApertiumTranslate struct { +type Translator struct { *core.Language *core.TTSLock core.EngineName } -func NewApertiumTranslate() *ApertiumTranslate { - return &ApertiumTranslate{ +func NewTranslator() *Translator { + return &Translator{ Language: core.NewLanguage(), TTSLock: core.NewTTSLock(), - EngineName: core.NewEngineName("ApertiumTranslate"), + EngineName: core.NewEngineName("Apertium"), } } -func (t *ApertiumTranslate) GetAllLang() []string { +func (t *Translator) GetAllLang() []string { return lang } -func (t *ApertiumTranslate) Translate(message string) (translation *core.Translation, err error) { +func (t *Translator) Translate(message string) (translation *core.Translation, err error) { translation = new(core.Translation) var data map[string]interface{} @@ -76,7 +76,7 @@ func (t *ApertiumTranslate) Translate(message string) (translation *core.Transla return translation, nil } -func (t *ApertiumTranslate) PlayTTS(lang, message string) error { +func (t *Translator) PlayTTS(lang, message string) error { defer t.ReleaseLock() return errors.New(t.GetEngineName() + " does not support text to speech") diff --git a/internal/translate/argostranslate/language.go b/internal/translate/argos/language.go similarity index 96% rename from internal/translate/argostranslate/language.go rename to internal/translate/argos/language.go index 0e5873f..8cfdd5c 100644 --- a/internal/translate/argostranslate/language.go +++ b/internal/translate/argos/language.go @@ -1,4 +1,4 @@ -package argostranslate +package argos var ( lang = []string{ diff --git a/internal/translate/argostranslate/translator.go b/internal/translate/argos/translator.go similarity index 73% rename from internal/translate/argostranslate/translator.go rename to internal/translate/argos/translator.go index 2debc42..be3c97b 100644 --- a/internal/translate/argostranslate/translator.go +++ b/internal/translate/argos/translator.go @@ -1,4 +1,4 @@ -package argostranslate +package argos import ( "encoding/json" @@ -15,25 +15,25 @@ const ( textURL = "https://translate.argosopentech.com/translate" ) -type ArgosTranslate struct { +type Translator struct { *core.Language *core.TTSLock core.EngineName } -func NewArgosTranslate() *ArgosTranslate { - return &ArgosTranslate{ +func NewTranslator() *Translator { + return &Translator{ Language: core.NewLanguage(), TTSLock: core.NewTTSLock(), - EngineName: core.NewEngineName("ArgosTranslate"), + EngineName: core.NewEngineName("Argos"), } } -func (t *ArgosTranslate) GetAllLang() []string { +func (t *Translator) GetAllLang() []string { return lang } -func (t *ArgosTranslate) Translate(message string) (translation *core.Translation, err error) { +func (t *Translator) Translate(message string) (translation *core.Translation, err error) { translation = new(core.Translation) var data map[string]interface{} @@ -63,7 +63,7 @@ func (t *ArgosTranslate) Translate(message string) (translation *core.Translatio return translation, nil } -func (t *ArgosTranslate) PlayTTS(lang, message string) error { +func (t *Translator) PlayTTS(lang, message string) error { defer t.ReleaseLock() return errors.New(t.GetEngineName() + " does not support text to speech") diff --git a/internal/translate/bingtranslate/lang.go b/internal/translate/bing/lang.go similarity index 99% rename from internal/translate/bingtranslate/lang.go rename to internal/translate/bing/lang.go index 9ca806d..f083553 100644 --- a/internal/translate/bingtranslate/lang.go +++ b/internal/translate/bing/lang.go @@ -1,4 +1,4 @@ -package bingtranslate +package bing var ( lang = []string{ diff --git a/internal/translate/bingtranslate/translator.go b/internal/translate/bing/translator.go similarity index 92% rename from internal/translate/bingtranslate/translator.go rename to internal/translate/bing/translator.go index 07e2820..2f8ffa1 100644 --- a/internal/translate/bingtranslate/translator.go +++ b/internal/translate/bing/translator.go @@ -1,4 +1,4 @@ -package bingtranslate +package bing import ( "encoding/json" @@ -24,7 +24,7 @@ const ( ttsSSML = "%s" ) -type BingTranslate struct { +type Translator struct { *core.Language *core.TTSLock core.EngineName @@ -37,19 +37,19 @@ type setUpData struct { token string } -func NewBingTranslate() *BingTranslate { - return &BingTranslate{ +func NewTranslator() *Translator { + return &Translator{ Language: core.NewLanguage(), TTSLock: core.NewTTSLock(), - EngineName: core.NewEngineName("BingTranslate"), + EngineName: core.NewEngineName("Bing"), } } -func (t *BingTranslate) GetAllLang() []string { +func (t *Translator) GetAllLang() []string { return lang } -func (t *BingTranslate) setUp() (*setUpData, error) { +func (t *Translator) setUp() (*setUpData, error) { data := new(setUpData) res, err := http.Get(setUpURL) @@ -82,7 +82,7 @@ func (t *BingTranslate) setUp() (*setUpData, error) { return data, nil } -func (t *BingTranslate) Translate(message string) (translation *core.Translation, err error) { +func (t *Translator) Translate(message string) (translation *core.Translation, err error) { translation = new(core.Translation) var data []interface{} @@ -161,7 +161,7 @@ func (t *BingTranslate) Translate(message string) (translation *core.Translation return translation, nil } -func (t *BingTranslate) PlayTTS(lang, message string) error { +func (t *Translator) PlayTTS(lang, message string) error { defer t.ReleaseLock() name, ok := voiceName[lang] diff --git a/internal/translate/bingtranslate/utils.go b/internal/translate/bing/utils.go similarity index 97% rename from internal/translate/bingtranslate/utils.go rename to internal/translate/bing/utils.go index 44c4521..359ccd7 100644 --- a/internal/translate/bingtranslate/utils.go +++ b/internal/translate/bing/utils.go @@ -1,4 +1,4 @@ -package bingtranslate +package bing import ( "fmt" diff --git a/internal/translate/googletranslate/language.go b/internal/translate/google/language.go similarity index 99% rename from internal/translate/googletranslate/language.go rename to internal/translate/google/language.go index d119988..fdcb879 100644 --- a/internal/translate/googletranslate/language.go +++ b/internal/translate/google/language.go @@ -1,4 +1,4 @@ -package googletranslate +package google // https://cloud.google.com/translate/docs/languages var ( diff --git a/internal/translate/googletranslate/translator.go b/internal/translate/google/translator.go similarity index 89% rename from internal/translate/googletranslate/translator.go rename to internal/translate/google/translator.go index 75ec308..16d50f5 100644 --- a/internal/translate/googletranslate/translator.go +++ b/internal/translate/google/translator.go @@ -1,4 +1,4 @@ -package googletranslate +package google import ( "encoding/json" @@ -19,25 +19,25 @@ const ( ttsURL = "https://translate.google.com.vn/translate_tts?ie=UTF-8&q=%s&tl=%s&client=tw-ob" ) -type GoogleTranslate struct { +type Translator struct { *core.Language *core.TTSLock core.EngineName } -func NewGoogleTranslate() *GoogleTranslate { - return &GoogleTranslate{ +func NewTranslator() *Translator { + return &Translator{ Language: core.NewLanguage(), TTSLock: core.NewTTSLock(), - EngineName: core.NewEngineName("GoogleTranslate"), + EngineName: core.NewEngineName("Google"), } } -func (t *GoogleTranslate) GetAllLang() []string { +func (t *Translator) GetAllLang() []string { return lang } -func (t *GoogleTranslate) Translate(message string) (translation *core.Translation, err error) { +func (t *Translator) Translate(message string) (translation *core.Translation, err error) { translation = new(core.Translation) var data []interface{} @@ -118,7 +118,7 @@ func (t *GoogleTranslate) Translate(message string) (translation *core.Translati return translation, nil } -func (t *GoogleTranslate) PlayTTS(lang, message string) error { +func (t *Translator) PlayTTS(lang, message string) error { defer t.ReleaseLock() urlStr := fmt.Sprintf( diff --git a/internal/translate/reversotranslate/language.go b/internal/translate/reverso/language.go similarity index 98% rename from internal/translate/reversotranslate/language.go rename to internal/translate/reverso/language.go index 750f255..8264900 100644 --- a/internal/translate/reversotranslate/language.go +++ b/internal/translate/reverso/language.go @@ -1,4 +1,4 @@ -package reversotranslate +package reverso var ( lang = []string{ diff --git a/internal/translate/reversotranslate/translator.go b/internal/translate/reverso/translator.go similarity index 90% rename from internal/translate/reversotranslate/translator.go rename to internal/translate/reverso/translator.go index 743427c..63c382d 100644 --- a/internal/translate/reversotranslate/translator.go +++ b/internal/translate/reverso/translator.go @@ -1,4 +1,4 @@ -package reversotranslate +package reverso import ( "bytes" @@ -21,25 +21,25 @@ const ( ttsURL = "https://voice.reverso.net/RestPronunciation.svc/v1/output=json/GetVoiceStream/voiceName=%s?voiceSpeed=80&inputText=%s" ) -type ReversoTranslate struct { +type Translator struct { *core.Language *core.TTSLock core.EngineName } -func NewReversoTranslate() *ReversoTranslate { - return &ReversoTranslate{ +func NewTranslator() *Translator { + return &Translator{ Language: core.NewLanguage(), TTSLock: core.NewTTSLock(), - EngineName: core.NewEngineName("ReversoTranslate"), + EngineName: core.NewEngineName("Reverso"), } } -func (t *ReversoTranslate) GetAllLang() []string { +func (t *Translator) GetAllLang() []string { return lang } -func (t *ReversoTranslate) Translate(message string) (translation *core.Translation, err error) { +func (t *Translator) Translate(message string) (translation *core.Translation, err error) { translation = new(core.Translation) var data map[string]interface{} @@ -111,7 +111,7 @@ func (t *ReversoTranslate) Translate(message string) (translation *core.Translat return translation, nil } -func (t *ReversoTranslate) PlayTTS(lang, message string) error { +func (t *Translator) PlayTTS(lang, message string) error { defer t.ReleaseLock() name, ok := voiceName[lang] diff --git a/internal/translate/translator.go b/internal/translate/translator.go index 3aff0cc..708f2fb 100644 --- a/internal/translate/translator.go +++ b/internal/translate/translator.go @@ -1,21 +1,21 @@ package translate import ( - "github.com/eeeXun/gtt/internal/translate/apertiumtranslate" - "github.com/eeeXun/gtt/internal/translate/argostranslate" - "github.com/eeeXun/gtt/internal/translate/bingtranslate" + "github.com/eeeXun/gtt/internal/translate/apertium" + "github.com/eeeXun/gtt/internal/translate/argos" + "github.com/eeeXun/gtt/internal/translate/bing" "github.com/eeeXun/gtt/internal/translate/core" - "github.com/eeeXun/gtt/internal/translate/googletranslate" - "github.com/eeeXun/gtt/internal/translate/reversotranslate" + "github.com/eeeXun/gtt/internal/translate/google" + "github.com/eeeXun/gtt/internal/translate/reverso" ) var ( AllTranslator = []string{ - "ApertiumTranslate", - "ArgosTranslate", - "BingTranslate", - "GoogleTranslate", - "ReversoTranslate", + "Apertium", + "Argos", + "Bing", + "Google", + "Reverso", } ) @@ -61,16 +61,16 @@ func NewTranslator(name string) Translator { var translator Translator switch name { - case "ApertiumTranslate": - translator = apertiumtranslate.NewApertiumTranslate() - case "ArgosTranslate": - translator = argostranslate.NewArgosTranslate() - case "BingTranslate": - translator = bingtranslate.NewBingTranslate() - case "GoogleTranslate": - translator = googletranslate.NewGoogleTranslate() - case "ReversoTranslate": - translator = reversotranslate.NewReversoTranslate() + case "Apertium": + translator = apertium.NewTranslator() + case "Argos": + translator = argos.NewTranslator() + case "Bing": + translator = bing.NewTranslator() + case "Google": + translator = google.NewTranslator() + case "Reverso": + translator = reverso.NewTranslator() } return translator From 731d00c75358631bed6abf821ffa628059a85710 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 29 Apr 2023 00:22:38 +0800 Subject: [PATCH 06/19] refactor: change default translator to Google --- README.md | 4 ++-- config.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3124197..77e4d84 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ Google Translate TUI (Originally) Supported Translator: [`Apertium`](https://www.apertium.org/), -[`Argos`](https://translate.argosopentech.com/)(default), +[`Argos`](https://translate.argosopentech.com/), [`Bing`](https://www.bing.com/translator), -[`Google`](https://translate.google.com/), +[`Google`](https://translate.google.com/)(default), [`Reverso`](https://www.reverso.net/text-translation) ## ScreenShot diff --git a/config.go b/config.go index 494c3df..05ef925 100644 --- a/config.go +++ b/config.go @@ -29,7 +29,7 @@ func configInit() { "destination.language.google": "English", "source.language.reverso": "English", "destination.language.reverso": "English", - "translator": "Argos", + "translator": "Google", } ) From aaa06560a529cf4e1542a7ec52c10b4cd4ad42d8 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 29 Apr 2023 01:38:13 +0800 Subject: [PATCH 07/19] refactor(ui): change translatorDropDown proportion to 1 --- ui.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui.go b/ui.go index b027061..31c1ed5 100644 --- a/ui.go +++ b/ui.go @@ -296,7 +296,7 @@ func uiInit() { Item{item: attachItems(true, tview.FlexColumn, Item{item: attachItems(false, tview.FlexRow, Item{item: translatorDropDown, fixedSize: 0, proportion: 1, focus: false}), - fixedSize: 0, proportion: 2, focus: false}), + fixedSize: 0, proportion: 1, focus: false}), fixedSize: 1, proportion: 1, focus: false}, Item{item: attachItems(false, tview.FlexColumn, Item{item: srcLangDropDown, fixedSize: 0, proportion: 1, focus: true}, From d0072abeccf1fd155a28714572b4ba73eb5659b7 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 29 Apr 2023 01:41:31 +0800 Subject: [PATCH 08/19] refactor: new a core.Language instead of return by function Nothing needs to be initialized in core.Language. Just new one. --- internal/translate/apertium/translator.go | 2 +- internal/translate/argos/translator.go | 2 +- internal/translate/bing/translator.go | 2 +- internal/translate/core/language.go | 4 ---- internal/translate/google/translator.go | 2 +- internal/translate/reverso/translator.go | 2 +- 6 files changed, 5 insertions(+), 9 deletions(-) diff --git a/internal/translate/apertium/translator.go b/internal/translate/apertium/translator.go index 64f5648..5c25b80 100644 --- a/internal/translate/apertium/translator.go +++ b/internal/translate/apertium/translator.go @@ -23,7 +23,7 @@ type Translator struct { func NewTranslator() *Translator { return &Translator{ - Language: core.NewLanguage(), + Language: new(core.Language), TTSLock: core.NewTTSLock(), EngineName: core.NewEngineName("Apertium"), } diff --git a/internal/translate/argos/translator.go b/internal/translate/argos/translator.go index be3c97b..e8c07e2 100644 --- a/internal/translate/argos/translator.go +++ b/internal/translate/argos/translator.go @@ -23,7 +23,7 @@ type Translator struct { func NewTranslator() *Translator { return &Translator{ - Language: core.NewLanguage(), + Language: new(core.Language), TTSLock: core.NewTTSLock(), EngineName: core.NewEngineName("Argos"), } diff --git a/internal/translate/bing/translator.go b/internal/translate/bing/translator.go index 2f8ffa1..81370e8 100644 --- a/internal/translate/bing/translator.go +++ b/internal/translate/bing/translator.go @@ -39,7 +39,7 @@ type setUpData struct { func NewTranslator() *Translator { return &Translator{ - Language: core.NewLanguage(), + Language: new(core.Language), TTSLock: core.NewTTSLock(), EngineName: core.NewEngineName("Bing"), } diff --git a/internal/translate/core/language.go b/internal/translate/core/language.go index a5fbb22..c778bff 100644 --- a/internal/translate/core/language.go +++ b/internal/translate/core/language.go @@ -5,10 +5,6 @@ type Language struct { dstLang string } -func NewLanguage() *Language { - return &Language{} -} - func (l *Language) GetSrcLang() string { return l.srcLang } diff --git a/internal/translate/google/translator.go b/internal/translate/google/translator.go index 16d50f5..e0246ae 100644 --- a/internal/translate/google/translator.go +++ b/internal/translate/google/translator.go @@ -27,7 +27,7 @@ type Translator struct { func NewTranslator() *Translator { return &Translator{ - Language: core.NewLanguage(), + Language: new(core.Language), TTSLock: core.NewTTSLock(), EngineName: core.NewEngineName("Google"), } diff --git a/internal/translate/reverso/translator.go b/internal/translate/reverso/translator.go index 63c382d..0fe3bd7 100644 --- a/internal/translate/reverso/translator.go +++ b/internal/translate/reverso/translator.go @@ -29,7 +29,7 @@ type Translator struct { func NewTranslator() *Translator { return &Translator{ - Language: core.NewLanguage(), + Language: new(core.Language), TTSLock: core.NewTTSLock(), EngineName: core.NewEngineName("Reverso"), } From 29643a3cda2cdad5c4d84f06a3ca61dfe4cda8ff Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 29 Apr 2023 13:46:43 +0800 Subject: [PATCH 09/19] feat: update google language --- internal/translate/google/language.go | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/internal/translate/google/language.go b/internal/translate/google/language.go index fdcb879..2be84fb 100644 --- a/internal/translate/google/language.go +++ b/internal/translate/google/language.go @@ -9,10 +9,14 @@ var ( "Arabic", "Armenian", "Auto", + "Assamese", + "Aymara", "Azerbaijani", + "Bambara", "Basque", "Belarusian", "Bengali", + "Bhojpuri", "Bosnian", "Bulgarian", "Catalan", @@ -23,10 +27,14 @@ var ( "Croatian", "Czech", "Danish", + "Dhivehi", + "Dogri", "Dutch", "English", "Esperanto", "Estonian", + "Ewe", + "Filipino (Tagalog)", "Finnish", "French", "Frisian", @@ -34,6 +42,7 @@ var ( "Georgian", "German", "Greek", + "Guarani", "Gujarati", "Haitian Creole", "Hausa", @@ -44,6 +53,7 @@ var ( "Hungarian", "Icelandic", "Igbo", + "Ilocano", "Indonesian", "Irish", "Italian", @@ -53,36 +63,48 @@ var ( "Kazakh", "Khmer", "Kinyarwanda", + "Konkani", "Korean", + "Krio", "Kurdish", + "Kurdish (Sorani)", "Kyrgyz", "Lao", "Latin", "Latvian", + "Lingala", "Lithuanian", + "Luganda", "Luxembourgish", "Macedonian", + "Maithili", "Malagasy", "Malay", "Malayalam", "Maltese", "Maori", "Marathi", + "Meiteilon (Manipuri)", + "Mizo", "Mongolian", "Myanmar (Burmese)", "Nepali", "Norwegian", "Nyanja (Chichewa)", "Odia (Oriya)", + "Oromo", "Pashto", "Persian", "Polish", "Portuguese (Portugal, Brazil)", "Punjabi", + "Quechua", "Romanian", "Russian", "Samoan", + "Sanskrit", "Scots Gaelic", + "Sepedi", "Serbian", "Sesotho", "Shona", @@ -101,8 +123,11 @@ var ( "Tatar", "Telugu", "Thai", + "Tigrinya", + "Tsonga", "Turkish", "Turkmen", + "Twi (Akan)", "Ukrainian", "Urdu", "Uyghur", @@ -121,10 +146,14 @@ var ( "Arabic": "ar", "Armenian": "hy", "Auto": "auto", + "Assamese": "as", + "Aymara": "ay", "Azerbaijani": "az", + "Bambara": "bm", "Basque": "eu", "Belarusian": "be", "Bengali": "bn", + "Bhojpuri": "bho", "Bosnian": "bs", "Bulgarian": "bg", "Catalan": "ca", @@ -135,10 +164,14 @@ var ( "Croatian": "hr", "Czech": "cs", "Danish": "da", + "Dhivehi": "dv", + "Dogri": "doi", "Dutch": "nl", "English": "en", "Esperanto": "eo", "Estonian": "et", + "Ewe": "ee", + "Filipino (Tagalog)": "fil", "Finnish": "fi", "French": "fr", "Frisian": "fy", @@ -146,6 +179,7 @@ var ( "Georgian": "ka", "German": "de", "Greek": "el", + "Guarani": "gn", "Gujarati": "gu", "Haitian Creole": "ht", "Hausa": "ha", @@ -156,6 +190,7 @@ var ( "Hungarian": "hu", "Icelandic": "is", "Igbo": "ig", + "Ilocano": "ilo", "Indonesian": "id", "Irish": "ga", "Italian": "it", @@ -165,36 +200,48 @@ var ( "Kazakh": "kk", "Khmer": "km", "Kinyarwanda": "rw", + "Konkani": "gom", "Korean": "ko", + "Krio": "kri", "Kurdish": "ku", + "Kurdish (Sorani)": "ckb", "Kyrgyz": "ky", "Lao": "lo", "Latin": "la", "Latvian": "lv", + "Lingala": "ln", "Lithuanian": "lt", + "Luganda": "lg", "Luxembourgish": "lb", "Macedonian": "mk", + "Maithili": "mai", "Malagasy": "mg", "Malay": "ms", "Malayalam": "ml", "Maltese": "mt", "Maori": "mi", "Marathi": "mr", + "Meiteilon (Manipuri)": "mni-Mtei", + "Mizo": "lus", "Mongolian": "mn", "Myanmar (Burmese)": "my", "Nepali": "ne", "Norwegian": "no", "Nyanja (Chichewa)": "ny", "Odia (Oriya)": "or", + "Oromo": "om", "Pashto": "ps", "Persian": "fa", "Polish": "pl", "Portuguese (Portugal, Brazil)": "pt", "Punjabi": "pa", + "Quechua": "qu", "Romanian": "ro", "Russian": "ru", "Samoan": "sm", + "Sanskrit": "sa", "Scots Gaelic": "gd", + "Sepedi": "nso", "Serbian": "sr", "Sesotho": "st", "Shona": "sn", @@ -213,8 +260,11 @@ var ( "Tatar": "tt", "Telugu": "te", "Thai": "th", + "Tigrinya": "ti", + "Tsonga": "ts", "Turkish": "tr", "Turkmen": "tk", + "Twi (Akan)": "ak", "Ukrainian": "uk", "Urdu": "ur", "Uyghur": "ug", From 04263a4eaf0feb50c872fda8d1f8c5b97a94156b Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 29 Apr 2023 13:51:00 +0800 Subject: [PATCH 10/19] refactor: rename bing lang.go to language.go --- internal/translate/bing/{lang.go => language.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename internal/translate/bing/{lang.go => language.go} (100%) diff --git a/internal/translate/bing/lang.go b/internal/translate/bing/language.go similarity index 100% rename from internal/translate/bing/lang.go rename to internal/translate/bing/language.go From ecdebc39adc81e1015103b12a3e3306f78210f43 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 29 Apr 2023 17:24:21 +0800 Subject: [PATCH 11/19] refactor: remove unneeded type conversion --- internal/translate/reverso/translator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/translate/reverso/translator.go b/internal/translate/reverso/translator.go index 0fe3bd7..044c7ad 100644 --- a/internal/translate/reverso/translator.go +++ b/internal/translate/reverso/translator.go @@ -63,7 +63,7 @@ func (t *Translator) Translate(message string) (translation *core.Translation, e }) req, _ := http.NewRequest("POST", textURL, - bytes.NewBuffer([]byte(userData))) + bytes.NewBuffer(userData)) req.Header.Add("Content-Type", "application/json") req.Header.Add("User-Agent", core.UserAgent) res, err := http.DefaultClient.Do(req) From 24cadc40724e5c51fe8c4b6bfe849818a19de4a4 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 29 Apr 2023 21:18:09 +0800 Subject: [PATCH 12/19] refactor: check Apertium translate with responseData instead of StatusCode --- internal/translate/apertium/translator.go | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/internal/translate/apertium/translator.go b/internal/translate/apertium/translator.go index 5c25b80..b4331fe 100644 --- a/internal/translate/apertium/translator.go +++ b/internal/translate/apertium/translator.go @@ -58,21 +58,18 @@ func (t *Translator) Translate(message string) (translation *core.Translation, e if len(data) <= 0 { return nil, errors.New("Translation not found") } - - switch res.StatusCode { - case 200: - translation.TEXT = fmt.Sprintf("%v", - data["responseData"].(map[string]interface{})["translatedText"]) - default: - return nil, errors.New( - fmt.Sprintf("%s does not support translate from %s to %s.\nSee available pair on %s", - t.GetEngineName(), - t.GetSrcLang(), - t.GetDstLang(), - "https://www.apertium.org/", - )) + // If responseData is nil, then suppose the translation pair is not available + if data["responseData"] == nil { + return nil, errors.New(fmt.Sprintf("%s does not support translate from %s to %s.", + t.GetEngineName(), + t.GetSrcLang(), + t.GetDstLang(), + )) } + translation.TEXT = fmt.Sprintf("%v", + data["responseData"].(map[string]interface{})["translatedText"]) + return translation, nil } From 7883e0026e679eb3bcead547fc6ad7f6fc296095 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sun, 30 Apr 2023 13:14:54 +0800 Subject: [PATCH 13/19] refactor: write show Popout into function --- ui.go | 54 ++++++++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/ui.go b/ui.go index 31c1ed5..8bb6610 100644 --- a/ui.go +++ b/ui.go @@ -233,6 +233,26 @@ func attachItems(center bool, direction int, items ...Item) *tview.Flex { return container } +func showLangPopout() { + mainPage.HidePage("stylePopOut") + mainPage.HidePage("keyMapPopOut") + mainPage.ShowPage("langPopOut") + app.SetFocus(langCycle.GetCurrentUI()) +} + +func showStylePopout() { + mainPage.HidePage("langPopOut") + mainPage.HidePage("keyMapPopOut") + mainPage.ShowPage("stylePopOut") + app.SetFocus(styleCycle.GetCurrentUI()) +} + +func showKeyMapPopout() { + mainPage.HidePage("langPopOut") + mainPage.HidePage("stylePopOut") + mainPage.ShowPage("keyMapPopOut") +} + func uiInit() { // input/output srcInput.SetBorder(true) @@ -402,23 +422,9 @@ func uiInit() { mainPage.HidePage("keyMapPopOut") } }) - langButton.SetSelectedFunc(func() { - mainPage.HidePage("stylePopOut") - mainPage.HidePage("keyMapPopOut") - mainPage.ShowPage("langPopOut") - app.SetFocus(langCycle.GetCurrentUI()) - }) - styleButton.SetSelectedFunc(func() { - mainPage.HidePage("langPopOut") - mainPage.HidePage("keyMapPopOut") - mainPage.ShowPage("stylePopOut") - app.SetFocus(styleCycle.GetCurrentUI()) - }) - keyMapButton.SetSelectedFunc(func() { - mainPage.HidePage("langPopOut") - mainPage.HidePage("stylePopOut") - mainPage.ShowPage("keyMapPopOut") - }) + langButton.SetSelectedFunc(showLangPopout) + styleButton.SetSelectedFunc(showStylePopout) + keyMapButton.SetSelectedFunc(showKeyMapPopout) } func mainPageHandler(event *tcell.EventKey) *tcell.EventKey { @@ -537,19 +543,11 @@ func popOutHandler(event *tcell.EventKey) *tcell.EventKey { switch ch { case '1': - mainPage.HidePage("stylePopOut") - mainPage.HidePage("keyMapPopOut") - mainPage.ShowPage("langPopOut") - app.SetFocus(langCycle.GetCurrentUI()) + showLangPopout() case '2': - mainPage.HidePage("langPopOut") - mainPage.HidePage("keyMapPopOut") - mainPage.ShowPage("stylePopOut") - app.SetFocus(styleCycle.GetCurrentUI()) + showStylePopout() case '3': - mainPage.HidePage("langPopOut") - mainPage.HidePage("stylePopOut") - mainPage.ShowPage("keyMapPopOut") + showKeyMapPopout() } return event From 3e2303ad6672895c31b920c6d685ae3e715ae479 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Tue, 2 May 2023 01:01:15 +0800 Subject: [PATCH 14/19] docs: remove pbcopy in Dependencies, as it's build-in --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 77e4d84..6b9e3bd 100644 --- a/README.md +++ b/README.md @@ -106,8 +106,6 @@ Switch pop out window. [`wl-clipboard`](https://github.com/bugaevc/wl-clipboard) for Linux/Wayland to copy text. -`pbcopy` For macOS to copy text. - ## Credit [soimort/translate-shell](https://github.com/soimort/translate-shell), From 837196dbd4aaeb7be4f58f6c8fc744bd5d8726b9 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sun, 7 May 2023 16:51:50 +0800 Subject: [PATCH 15/19] fix: check return code of Google TTS --- internal/translate/google/translator.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/translate/google/translator.go b/internal/translate/google/translator.go index e0246ae..d040ed7 100644 --- a/internal/translate/google/translator.go +++ b/internal/translate/google/translator.go @@ -130,6 +130,9 @@ func (t *Translator) PlayTTS(lang, message string) error { if err != nil { return err } + if res.StatusCode == 400 { + return errors.New(t.GetEngineName() + " does not support text to speech of " + lang) + } decoder, err := mp3.NewDecoder(res.Body) if err != nil { return err From 2d2834c6da3ab5b25c774f313ddf6e3bf9d6f0c0 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Fri, 12 May 2023 09:27:52 +0800 Subject: [PATCH 16/19] fix(ui): app should redraw in Goroutine If error occurs when playing TTS, SetText would be called. But it's in Goroutine, so we need to call app.Draw to redraw the screen. --- ui.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui.go b/ui.go index 8bb6610..cf42ffa 100644 --- a/ui.go +++ b/ui.go @@ -510,6 +510,7 @@ func translateWindowHandler(event *tcell.EventKey) *tcell.EventKey { err := translator.PlayTTS(translator.GetSrcLang(), message) if err != nil { srcInput.SetText(err.Error(), true) + app.Draw() } }() } @@ -526,6 +527,7 @@ func translateWindowHandler(event *tcell.EventKey) *tcell.EventKey { err := translator.PlayTTS(translator.GetDstLang(), message) if err != nil { dstOutput.SetText(err.Error()) + app.Draw() } }() } From aa957d195c32b445e57b73ee496d603af6cd1dce Mon Sep 17 00:00:00 2001 From: Xun <58657914+eeeXun@users.noreply.github.com> Date: Fri, 12 May 2023 13:53:23 +0800 Subject: [PATCH 17/19] feat(translator): add ChatGPT (#18) * feat(translator): add ChatGPT * feat: check chatgpt error * refactor: change chatgpt apiKey not set text * refactor: change language to google * docs: yaml indent with 4 * refactor: APIKey in struct --- README.md | 12 ++ config.go | 10 +- internal/translate/apertium/translator.go | 2 + internal/translate/argos/translator.go | 2 + internal/translate/bing/translator.go | 2 + internal/translate/chatgpt/language.go | 142 ++++++++++++++++++++++ internal/translate/chatgpt/translator.go | 94 ++++++++++++++ internal/translate/core/apikey.go | 13 ++ internal/translate/google/translator.go | 2 + internal/translate/reverso/translator.go | 2 + internal/translate/translator.go | 7 ++ 11 files changed, 286 insertions(+), 2 deletions(-) create mode 100644 internal/translate/chatgpt/language.go create mode 100644 internal/translate/chatgpt/translator.go create mode 100644 internal/translate/core/apikey.go diff --git a/README.md b/README.md index 6b9e3bd..ff2717d 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,20 @@ Supported Translator: [`Apertium`](https://www.apertium.org/), [`Argos`](https://translate.argosopentech.com/), [`Bing`](https://www.bing.com/translator), +[`ChatGPT`](https://chat.openai.com/), [`Google`](https://translate.google.com/)(default), [`Reverso`](https://www.reverso.net/text-translation) +## ⚠️ Note for ChatGPT + +You need to apply a API key on [ChatGPT](https://platform.openai.com/account/api-keys). +And write it to `$XDG_CONFIG_HOME/gtt/gtt.yaml` or `$HOME/.config/gtt/gtt.yaml`. + +```yaml +api_key: + chatgpt: YOUR_API_KEY # <- Replace with your API Key +``` + ## ScreenShot ![screenshot](https://user-images.githubusercontent.com/58657914/213123592-5d8bccfb-ff80-4ad6-aaca-03b31c4c2c59.gif) @@ -50,6 +61,7 @@ See available languages on: - [Apertium Translate](https://www.apertium.org/) for `Apertium` - [argosopentech/argos-translate](https://github.com/argosopentech/argos-translate#supported-languages) for `Argos` - [Bing language-support](https://learn.microsoft.com/en-us/azure/cognitive-services/translator/language-support#translation) for `Bing` +- `ChatGPT` is same as `Google`. See [Google Language support](https://cloud.google.com/translate/docs/languages) - [Google Language support](https://cloud.google.com/translate/docs/languages) for `Google` - [Reverso Translation](https://www.reverso.net/text-translation) for `Reverso` diff --git a/config.go b/config.go index 05ef925..7cddd07 100644 --- a/config.go +++ b/config.go @@ -25,6 +25,8 @@ func configInit() { "destination.language.argos": "English", "source.language.bing": "English", "destination.language.bing": "English", + "source.language.chatgpt": "English", + "destination.language.chatgpt": "English", "source.language.google": "English", "destination.language.google": "English", "source.language.reverso": "English", @@ -76,7 +78,7 @@ func configInit() { } } - // setup + // Setup for _, name := range translate.AllTranslator { translators[name] = translate.NewTranslator(name) translators[name].SetSrcLang( @@ -90,7 +92,11 @@ func configInit() { uiStyle.Transparent = config.GetBool("transparent") uiStyle.SetSrcBorderColor(config.GetString("source.border_color")). SetDstBorderColor(config.GetString("destination.border_color")) - // set argument language + // Set API Key + if config.Get("api_key.chatgpt") != nil { + translators["ChatGPT"].SetAPIKey(config.GetString("api_key.chatgpt")) + } + // Set argument language if len(*srcLangArg) > 0 { translator.SetSrcLang(*srcLangArg) } diff --git a/internal/translate/apertium/translator.go b/internal/translate/apertium/translator.go index b4331fe..ad2ef56 100644 --- a/internal/translate/apertium/translator.go +++ b/internal/translate/apertium/translator.go @@ -16,6 +16,7 @@ const ( ) type Translator struct { + *core.APIKey *core.Language *core.TTSLock core.EngineName @@ -23,6 +24,7 @@ type Translator struct { func NewTranslator() *Translator { return &Translator{ + APIKey: new(core.APIKey), Language: new(core.Language), TTSLock: core.NewTTSLock(), EngineName: core.NewEngineName("Apertium"), diff --git a/internal/translate/argos/translator.go b/internal/translate/argos/translator.go index e8c07e2..1547647 100644 --- a/internal/translate/argos/translator.go +++ b/internal/translate/argos/translator.go @@ -16,6 +16,7 @@ const ( ) type Translator struct { + *core.APIKey *core.Language *core.TTSLock core.EngineName @@ -23,6 +24,7 @@ type Translator struct { func NewTranslator() *Translator { return &Translator{ + APIKey: new(core.APIKey), Language: new(core.Language), TTSLock: core.NewTTSLock(), EngineName: core.NewEngineName("Argos"), diff --git a/internal/translate/bing/translator.go b/internal/translate/bing/translator.go index 81370e8..4d9e3fd 100644 --- a/internal/translate/bing/translator.go +++ b/internal/translate/bing/translator.go @@ -25,6 +25,7 @@ const ( ) type Translator struct { + *core.APIKey *core.Language *core.TTSLock core.EngineName @@ -39,6 +40,7 @@ type setUpData struct { func NewTranslator() *Translator { return &Translator{ + APIKey: new(core.APIKey), Language: new(core.Language), TTSLock: core.NewTTSLock(), EngineName: core.NewEngineName("Bing"), diff --git a/internal/translate/chatgpt/language.go b/internal/translate/chatgpt/language.go new file mode 100644 index 0000000..2b607a3 --- /dev/null +++ b/internal/translate/chatgpt/language.go @@ -0,0 +1,142 @@ +package chatgpt + +var ( + // Generated from Google + lang = []string{ + "Afrikaans", + "Albanian", + "Amharic", + "Arabic", + "Armenian", + "Auto", + "Assamese", + "Aymara", + "Azerbaijani", + "Bambara", + "Basque", + "Belarusian", + "Bengali", + "Bhojpuri", + "Bosnian", + "Bulgarian", + "Catalan", + "Cebuano", + "Chinese (Simplified)", + "Chinese (Traditional)", + "Corsican", + "Croatian", + "Czech", + "Danish", + "Dhivehi", + "Dogri", + "Dutch", + "English", + "Esperanto", + "Estonian", + "Ewe", + "Filipino (Tagalog)", + "Finnish", + "French", + "Frisian", + "Galician", + "Georgian", + "German", + "Greek", + "Guarani", + "Gujarati", + "Haitian Creole", + "Hausa", + "Hawaiian", + "Hebrew", + "Hindi", + "Hmong", + "Hungarian", + "Icelandic", + "Igbo", + "Ilocano", + "Indonesian", + "Irish", + "Italian", + "Japanese", + "Javanese", + "Kannada", + "Kazakh", + "Khmer", + "Kinyarwanda", + "Konkani", + "Korean", + "Krio", + "Kurdish", + "Kurdish (Sorani)", + "Kyrgyz", + "Lao", + "Latin", + "Latvian", + "Lingala", + "Lithuanian", + "Luganda", + "Luxembourgish", + "Macedonian", + "Maithili", + "Malagasy", + "Malay", + "Malayalam", + "Maltese", + "Maori", + "Marathi", + "Meiteilon (Manipuri)", + "Mizo", + "Mongolian", + "Myanmar (Burmese)", + "Nepali", + "Norwegian", + "Nyanja (Chichewa)", + "Odia (Oriya)", + "Oromo", + "Pashto", + "Persian", + "Polish", + "Portuguese (Portugal, Brazil)", + "Punjabi", + "Quechua", + "Romanian", + "Russian", + "Samoan", + "Sanskrit", + "Scots Gaelic", + "Sepedi", + "Serbian", + "Sesotho", + "Shona", + "Sindhi", + "Sinhala (Sinhalese)", + "Slovak", + "Slovenian", + "Somali", + "Spanish", + "Sundanese", + "Swahili", + "Swedish", + "Tagalog (Filipino)", + "Tajik", + "Tamil", + "Tatar", + "Telugu", + "Thai", + "Tigrinya", + "Tsonga", + "Turkish", + "Turkmen", + "Twi (Akan)", + "Ukrainian", + "Urdu", + "Uyghur", + "Uzbek", + "Vietnamese", + "Welsh", + "Xhosa", + "Yiddish", + "Yoruba", + "Zulu", + } +) diff --git a/internal/translate/chatgpt/translator.go b/internal/translate/chatgpt/translator.go new file mode 100644 index 0000000..dee3c30 --- /dev/null +++ b/internal/translate/chatgpt/translator.go @@ -0,0 +1,94 @@ +package chatgpt + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/http" + + "github.com/eeeXun/gtt/internal/translate/core" +) + +const ( + textURL = "https://api.openai.com/v1/chat/completions" +) + +type Translator struct { + *core.APIKey + *core.Language + *core.TTSLock + core.EngineName +} + +func NewTranslator() *Translator { + return &Translator{ + APIKey: new(core.APIKey), + Language: new(core.Language), + TTSLock: core.NewTTSLock(), + EngineName: core.NewEngineName("ChatGPT"), + } +} + +func (t *Translator) GetAllLang() []string { + return lang +} + +func (t *Translator) Translate(message string) (translation *core.Translation, err error) { + translation = new(core.Translation) + var data map[string]interface{} + + if len(t.GetAPIKey()) <= 0 { + return nil, errors.New("Please write your API Key in config file for " + t.GetEngineName()) + } + + userData, _ := json.Marshal(map[string]interface{}{ + "model": "gpt-3.5-turbo", + "messages": []map[string]string{{ + "role": "user", + "content": fmt.Sprintf( + "Translate following text from %s to %s\n%s", + t.GetSrcLang(), + t.GetDstLang(), + message, + ), + }}, + "temperature": 0.7, + }) + req, _ := http.NewRequest("POST", + textURL, + bytes.NewBuffer(userData), + ) + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Authorization", "Bearer "+t.GetAPIKey()) + res, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + body, err := ioutil.ReadAll(res.Body) + if err != nil { + return nil, err + } + if err = json.Unmarshal(body, &data); err != nil { + return nil, err + } + + if len(data) <= 0 { + return nil, errors.New("Translation not found") + } + if data["error"] != nil { + return nil, errors.New(data["error"].(map[string]interface{})["message"].(string)) + } + + translation.TEXT = + data["choices"].([]interface{})[0].(map[string]interface{})["message"].(map[string]interface{})["content"].(string) + + return translation, nil +} + +func (t *Translator) PlayTTS(lang, message string) error { + defer t.ReleaseLock() + + return errors.New(t.GetEngineName() + " does not support text to speech") +} diff --git a/internal/translate/core/apikey.go b/internal/translate/core/apikey.go new file mode 100644 index 0000000..9208a34 --- /dev/null +++ b/internal/translate/core/apikey.go @@ -0,0 +1,13 @@ +package core + +type APIKey struct { + key string +} + +func (k *APIKey) SetAPIKey(key string) { + k.key = key +} + +func (k *APIKey) GetAPIKey() string { + return k.key +} diff --git a/internal/translate/google/translator.go b/internal/translate/google/translator.go index d040ed7..dd2a7bc 100644 --- a/internal/translate/google/translator.go +++ b/internal/translate/google/translator.go @@ -20,6 +20,7 @@ const ( ) type Translator struct { + *core.APIKey *core.Language *core.TTSLock core.EngineName @@ -27,6 +28,7 @@ type Translator struct { func NewTranslator() *Translator { return &Translator{ + APIKey: new(core.APIKey), Language: new(core.Language), TTSLock: core.NewTTSLock(), EngineName: core.NewEngineName("Google"), diff --git a/internal/translate/reverso/translator.go b/internal/translate/reverso/translator.go index 044c7ad..a02b234 100644 --- a/internal/translate/reverso/translator.go +++ b/internal/translate/reverso/translator.go @@ -22,6 +22,7 @@ const ( ) type Translator struct { + *core.APIKey *core.Language *core.TTSLock core.EngineName @@ -29,6 +30,7 @@ type Translator struct { func NewTranslator() *Translator { return &Translator{ + APIKey: new(core.APIKey), Language: new(core.Language), TTSLock: core.NewTTSLock(), EngineName: core.NewEngineName("Reverso"), diff --git a/internal/translate/translator.go b/internal/translate/translator.go index 708f2fb..4fa6aa4 100644 --- a/internal/translate/translator.go +++ b/internal/translate/translator.go @@ -4,6 +4,7 @@ import ( "github.com/eeeXun/gtt/internal/translate/apertium" "github.com/eeeXun/gtt/internal/translate/argos" "github.com/eeeXun/gtt/internal/translate/bing" + "github.com/eeeXun/gtt/internal/translate/chatgpt" "github.com/eeeXun/gtt/internal/translate/core" "github.com/eeeXun/gtt/internal/translate/google" "github.com/eeeXun/gtt/internal/translate/reverso" @@ -14,6 +15,7 @@ var ( "Apertium", "Argos", "Bing", + "ChatGPT", "Google", "Reverso", } @@ -41,6 +43,9 @@ type Translator interface { // Swap source and destination language of the translator SwapLang() + // Set API Key + SetAPIKey(key string) + // Check if lock is available LockAvailable() bool @@ -67,6 +72,8 @@ func NewTranslator(name string) Translator { translator = argos.NewTranslator() case "Bing": translator = bing.NewTranslator() + case "ChatGPT": + translator = chatgpt.NewTranslator() case "Google": translator = google.NewTranslator() case "Reverso": From 6c8bbac7d83adcce5de957a3e0750cf4d1f193a2 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Fri, 12 May 2023 14:04:46 +0800 Subject: [PATCH 18/19] refactor(translation): use type assertion if Sprintf is not needed --- internal/translate/apertium/translator.go | 3 +-- internal/translate/argos/translator.go | 3 +-- internal/translate/bing/translator.go | 4 ++-- internal/translate/google/translator.go | 2 +- internal/translate/reverso/translator.go | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/internal/translate/apertium/translator.go b/internal/translate/apertium/translator.go index ad2ef56..cf420f9 100644 --- a/internal/translate/apertium/translator.go +++ b/internal/translate/apertium/translator.go @@ -69,8 +69,7 @@ func (t *Translator) Translate(message string) (translation *core.Translation, e )) } - translation.TEXT = fmt.Sprintf("%v", - data["responseData"].(map[string]interface{})["translatedText"]) + translation.TEXT = data["responseData"].(map[string]interface{})["translatedText"].(string) return translation, nil } diff --git a/internal/translate/argos/translator.go b/internal/translate/argos/translator.go index 1547647..93e0ea1 100644 --- a/internal/translate/argos/translator.go +++ b/internal/translate/argos/translator.go @@ -3,7 +3,6 @@ package argos import ( "encoding/json" "errors" - "fmt" "io/ioutil" "net/http" "net/url" @@ -60,7 +59,7 @@ func (t *Translator) Translate(message string) (translation *core.Translation, e return nil, errors.New("Translation not found") } - translation.TEXT = fmt.Sprintf("%v", data["translatedText"]) + translation.TEXT = data["translatedText"].(string) return translation, nil } diff --git a/internal/translate/bing/translator.go b/internal/translate/bing/translator.go index 4d9e3fd..995be6e 100644 --- a/internal/translate/bing/translator.go +++ b/internal/translate/bing/translator.go @@ -122,8 +122,8 @@ func (t *Translator) Translate(message string) (translation *core.Translation, e } // translation - translation.TEXT = fmt.Sprintf("%v", - data[0].(map[string]interface{})["translations"].([]interface{})[0].(map[string]interface{})["text"]) + translation.TEXT = + data[0].(map[string]interface{})["translations"].([]interface{})[0].(map[string]interface{})["text"].(string) // request part of speech userData.Del("fromLang") diff --git a/internal/translate/google/translator.go b/internal/translate/google/translator.go index dd2a7bc..4024e7c 100644 --- a/internal/translate/google/translator.go +++ b/internal/translate/google/translator.go @@ -68,7 +68,7 @@ func (t *Translator) Translate(message string) (translation *core.Translation, e // translation = data[0] for _, line := range data[0].([]interface{}) { translatedLine := line.([]interface{})[0] - translation.TEXT += fmt.Sprintf("%v", translatedLine) + translation.TEXT += translatedLine.(string) } // part of speech = data[1] if data[1] != nil { diff --git a/internal/translate/reverso/translator.go b/internal/translate/reverso/translator.go index a02b234..88ed339 100644 --- a/internal/translate/reverso/translator.go +++ b/internal/translate/reverso/translator.go @@ -86,7 +86,7 @@ func (t *Translator) Translate(message string) (translation *core.Translation, e // translation for _, line := range data["translation"].([]interface{}) { - translation.TEXT += fmt.Sprintf("%v", line) + translation.TEXT += line.(string) } // definition and part of speech if data["contextResults"] != nil { From 8dcf8c449d74a2257f564ee54365ffa0c1c1c9c4 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Fri, 12 May 2023 14:58:58 +0800 Subject: [PATCH 19/19] docs: fix grammar error & change sound to text to speech --- README.md | 6 +++--- ui.go | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ff2717d..ad4b250 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Supported Translator: ## ⚠️ Note for ChatGPT -You need to apply a API key on [ChatGPT](https://platform.openai.com/account/api-keys). +You need to apply an API key on [OpenAI API keys](https://platform.openai.com/account/api-keys). And write it to `$XDG_CONFIG_HOME/gtt/gtt.yaml` or `$HOME/.config/gtt/gtt.yaml`. ```yaml @@ -92,10 +92,10 @@ Copy all text in source of translation window. Copy all text in destination of translation window. `` -Play sound on source of translation window. +Play text to speech on source of translation window. `` -Play sound on destination of translation window. +Play text to speech on destination of translation window. `` Stop play sound. diff --git a/ui.go b/ui.go index cf42ffa..d2308ee 100644 --- a/ui.go +++ b/ui.go @@ -30,9 +30,9 @@ const ( [#%[1]s][-] Copy all text in destination of translation window. [#%[1]s][-] - Play sound on source of translation window. + Play text to speech on source of translation window. [#%[1]s][-] - Play sound on destination of translation window. + Play text to speech on destination of translation window. [#%[1]s][-] Stop play sound. [#%[1]s][-] @@ -500,7 +500,7 @@ func translateWindowHandler(event *tcell.EventKey) *tcell.EventKey { } dstOutput.SetText(srcText) case tcell.KeyCtrlO: - // Play source sound + // Play text to speech on source of translation window. if translator.LockAvailable() { message := srcInput.GetText() // Only play when message exist @@ -517,7 +517,7 @@ func translateWindowHandler(event *tcell.EventKey) *tcell.EventKey { } case tcell.KeyCtrlP: - // Play destination sound + // Play text to speech on destination of translation window. if translator.LockAvailable() { message := dstOutput.GetText(false) // Only play when message exist