Skip to content

Commit

Permalink
Merge pull request #8 from eeeXun/libretranslate
Browse files Browse the repository at this point in the history
feat: add ArgosTranslate
  • Loading branch information
eeeXun authored Jan 29, 2023
2 parents 45b9c13 + fe25bd4 commit db58fa7
Show file tree
Hide file tree
Showing 12 changed files with 497 additions and 212 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# GTT

Google Translate TUI
Support: `ArgosTranslate`, `GoogleTranslate`

## ScreenShot

Expand All @@ -20,7 +20,7 @@ You can pass `-src` and `-dst` in argument to set source and destination languag
gtt -src "English" -dst "Chinese (Traditional)"
```

See language on [Google Language support](https://cloud.google.com/translate/docs/languages)
See language on [argosopentech/argos-translate](https://github.com/argosopentech/argos-translate#supported-languages) for `ArgosTranslate`, [Google Language support](https://cloud.google.com/translate/docs/languages) for `GoogleTranslate`

## Key Map

Expand Down
72 changes: 44 additions & 28 deletions config.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"fmt"
"gtt/internal/color"
"os"

Expand All @@ -11,21 +12,25 @@ var (
// settings
style = color.NewStyle()
hideBelow bool
// default config
defaultConfig = map[string]interface{}{
"transparent": false,
"theme": "Gruvbox",
"source.language": "English",
"source.borderColor": "red",
"destination.language": "Chinese (Traditional)",
"destination.borderColor": "blue",
"hide_below": false,
}
)

// Search XDG_CONFIG_HOME or $HOME/.config
func configInit() {
var defaultConfigPath string
var (
defaultConfigPath string
defaultConfig = map[string]interface{}{
"transparent": false,
"theme": "Gruvbox",
"source.borderColor": "red",
"destination.borderColor": "blue",
"source.language.argostranslate": "English",
"destination.language.argostranslate": "English",
"source.language.googletranslate": "English",
"destination.language.googletranslate": "English",
"hide_below": false,
"translator": "ArgosTranslate",
}
)

config.SetConfigName("gtt")
config.SetConfigType("yaml")
Expand Down Expand Up @@ -61,38 +66,49 @@ func configInit() {
}

// setup
if len(*srcLangArg) > 0 {
translator.SrcLang = *srcLangArg
} else {
translator.SrcLang = config.GetString("source.language")
}
if len(*dstLangArg) > 0 {
translator.DstLang = *dstLangArg
} else {
translator.DstLang = config.GetString("destination.language")
for t_str, t := range translators {
t.SetSrcLang(config.GetString(fmt.Sprintf("source.language.%s", t_str)))
t.SetDstLang(config.GetString(fmt.Sprintf("destination.language.%s", t_str)))
}
translator = translators[config.GetString("translator")]
hideBelow = config.GetBool("hide_below")
style.Theme = config.GetString("theme")
style.Transparent = config.GetBool("transparent")
style.SetSrcBorderColor(config.GetString("source.borderColor")).
SetDstBorderColor(config.GetString("destination.borderColor"))
// set argument language
if len(*srcLangArg) > 0 {
translator.SetSrcLang(*srcLangArg)
}
if len(*dstLangArg) > 0 {
translator.SetDstLang(*dstLangArg)
}
}

// Check if need to modify config file when quit program
func updateConfig() {
changed := false

// Source language is not passed in argument
if len(*srcLangArg) == 0 &&
config.GetString("source.language") != translator.SrcLang {
changed = true
config.Set("source.language", translator.SrcLang)
if len(*srcLangArg) == 0 {
for t_str, t := range translators {
if config.GetString(fmt.Sprintf("source.language.%s", t_str)) != t.GetSrcLang() {
changed = true
config.Set(fmt.Sprintf("source.language.%s", t_str), t.GetSrcLang())
}
}
}
if len(*dstLangArg) == 0 {
for t_str, t := range translators {
if config.GetString(fmt.Sprintf("destination.language.%s", t_str)) != t.GetDstLang() {
changed = true
config.Set(fmt.Sprintf("destination.language.%s", t_str), t.GetDstLang())
}
}
}
// Destination language is not passed in argument
if len(*dstLangArg) == 0 &&
config.GetString("destination.language") != translator.DstLang {
if config.GetString("translator") != translator.GetEngineName() {
changed = true
config.Set("destination.language", translator.DstLang)
config.Set("translator", translator.GetEngineName())
}
if config.GetBool("hide_below") != hideBelow {
changed = true
Expand Down
2 changes: 1 addition & 1 deletion internal/translate/lock.go → internal/lock/lock.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package translate
package lock

type Lock struct {
Stop bool
Expand Down
42 changes: 42 additions & 0 deletions internal/translate/argostranslate/language.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package argostranslate

var (
lang = []string{
"Arabic",
"Chinese",
"English",
"French",
"German",
"Hindi",
"Indonesian",
"Irish",
"Italian",
"Japanese",
"Korean",
"Polish",
"Portuguese",
"Russian",
"Spanish",
"Turkish",
"Vietnamese",
}
langCode = map[string]string{
"Arabic": "ar",
"Chinese": "zh",
"English": "en",
"French": "fr",
"German": "de",
"Hindi": "hi",
"Indonesian": "id",
"Irish": "ga",
"Italian": "it",
"Japanese": "ja",
"Korean": "ko",
"Polish": "pl",
"Portuguese": "pt",
"Russian": "ru",
"Spanish": "es",
"Turkish": "tr",
"Vietnamese": "vi",
}
)
83 changes: 83 additions & 0 deletions internal/translate/argostranslate/translator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package argostranslate

import (
"bytes"
"encoding/json"
"errors"
"fmt"
"gtt/internal/lock"
"io/ioutil"
"net/http"
)

const (
textURL = "https://translate.argosopentech.com/translate"
)

type ArgosTranslate struct {
srcLang string
dstLang string
EngineName string
SoundLock *lock.Lock
}

func (t *ArgosTranslate) GetEngineName() string {
return t.EngineName
}

func (t *ArgosTranslate) GetAllLang() []string {
return lang
}

func (t *ArgosTranslate) GetSrcLang() string {
return t.srcLang
}

func (t *ArgosTranslate) GetDstLang() string {
return t.dstLang
}

func (t *ArgosTranslate) SetSrcLang(srcLang string) {
t.srcLang = srcLang
}

func (t *ArgosTranslate) SetDstLang(dstLang string) {
t.dstLang = dstLang
}

func (t *ArgosTranslate) SwapLang() {
t.srcLang, t.dstLang = t.dstLang, t.srcLang
}

func (t *ArgosTranslate) Translate(message string) (
translation string,
definition string,
partOfSpeech string,
err error) {
var data interface{}

res, err := http.Post(textURL,
"application/json",
bytes.NewBuffer([]byte(fmt.Sprintf(`{
"q": "%s",
"source": "%s",
"target": "%s" }`, message, langCode[t.srcLang], langCode[t.dstLang]))))
if err != nil {
return "", "", "", err
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", "", "", err
}
if err = json.Unmarshal(body, &data); err != nil {
return "", "", "", err
}

if len(data.(map[string]interface{})) > 0 {
translation += fmt.Sprintf("%v",
data.(map[string]interface{})["translatedText"])

return translation, definition, partOfSpeech, nil
}
return "", "", "", errors.New("Translation not found")
}
22 changes: 22 additions & 0 deletions internal/translate/argostranslate/tts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package argostranslate

import (
"errors"
)

func (t *ArgosTranslate) LockAvailable() bool {
return t.SoundLock.Available()
}

func (t *ArgosTranslate) LockAcquire() {
t.SoundLock.Acquire()
}

func (t *ArgosTranslate) StopTTS() {
t.SoundLock.Stop = true
}

func (t *ArgosTranslate) PlayTTS(lang string, message string) error {
t.SoundLock.Release()
return errors.New(t.EngineName + " does not support text to speech")
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package translate
package googletranslate

// https://cloud.google.com/translate/docs/languages
var (
Lang = []string{
lang = []string{
"Afrikaans",
"Albanian",
"Amharic",
Expand Down Expand Up @@ -113,7 +113,7 @@ var (
"Yoruba",
"Zulu",
}
LangCode = map[string]string{
langCode = map[string]string{
"Afrikaans": "af",
"Albanian": "sq",
"Amharic": "am",
Expand Down
Loading

0 comments on commit db58fa7

Please sign in to comment.