v/GTT
1
0
mirror of https://github.com/eeeXun/GTT.git synced 2025-05-17 08:10:22 -07:00

feat: add libretranslate

This commit is contained in:
eeeXun 2023-01-26 23:45:59 +08:00
parent 4a15946142
commit 0faaa757e3
7 changed files with 198 additions and 33 deletions

View File

@ -1,6 +1,7 @@
package main
import (
"fmt"
"gtt/internal/color"
"os"
@ -19,14 +20,16 @@ func configInit() {
var (
defaultConfigPath string
defaultConfig = map[string]interface{}{
"transparent": false,
"theme": "Gruvbox",
"source.borderColor": "red",
"destination.borderColor": "blue",
"source.google.language": "English",
"destination.google.language": "Chinese (Traditional)",
"hide_below": false,
"translator": "google",
"transparent": false,
"theme": "Gruvbox",
"source.borderColor": "red",
"destination.borderColor": "blue",
"source.googletranslate.language": "English",
"destination.googletranslate.language": "Chinese (Traditional)",
"source.libretranslate.language": "English",
"destination.libretranslate.language": "Chinese",
"hide_below": false,
"translator": "LibreTranslate",
}
)
@ -64,25 +67,23 @@ func configInit() {
}
// setup
switch config.GetString("translator") {
case "google":
translator = googleTranslate
if len(*srcLangArg) > 0 {
translator.SetSrcLang(*srcLangArg)
} else {
translator.SetSrcLang(config.GetString("source.google.language"))
}
if len(*dstLangArg) > 0 {
translator.SetDstLang(*dstLangArg)
} else {
translator.SetDstLang(config.GetString("destination.google.language"))
}
for t_str, t := range translators {
t.SetSrcLang(config.GetString(fmt.Sprintf("source.%s.language", t_str)))
t.SetDstLang(config.GetString(fmt.Sprintf("destination.%s.language", 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
@ -90,16 +91,21 @@ func updateConfig() {
changed := false
// Source language is not passed in argument
if len(*srcLangArg) == 0 &&
config.GetString("source.google.language") != googleTranslate.GetSrcLang() {
changed = true
config.Set("source.google.language", googleTranslate.GetSrcLang())
if len(*srcLangArg) == 0 {
for t_str, t := range translators {
if config.GetString(fmt.Sprintf("source.%s.language", t_str)) != t.GetSrcLang() {
changed = true
config.Set(fmt.Sprintf("source.%s.language", t_str), t.GetSrcLang())
}
}
}
// Destination language is not passed in argument
if len(*dstLangArg) == 0 &&
config.GetString("destination.google.language") != googleTranslate.GetDstLang() {
changed = true
config.Set("destination.google.language", googleTranslate.GetDstLang())
if len(*dstLangArg) == 0 {
for t_str, t := range translators {
if config.GetString(fmt.Sprintf("destination.%s.language", t_str)) != t.GetDstLang() {
changed = true
config.Set(fmt.Sprintf("destination.%s.language", t_str), t.GetDstLang())
}
}
}
if config.GetBool("hide_below") != hideBelow {
changed = true

View File

@ -65,7 +65,6 @@ func (t *GoogleTranslate) Translate(message string) (
if err != nil {
return "", "", "", err
}
if err = json.Unmarshal(body, &data); err != nil {
return "", "", "", err
}

View File

@ -0,0 +1,42 @@
package libretranslate
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",
}
)

View File

@ -0,0 +1,78 @@
package libretranslate
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"gtt/internal/lock"
"io/ioutil"
"net/http"
)
const (
textURL = "https://translate.argosopentech.com/translate"
)
type LibreTranslate struct {
srcLang string
dstLang string
SoundLock *lock.Lock
}
func (t *LibreTranslate) GetAllLang() []string {
return lang
}
func (t *LibreTranslate) GetSrcLang() string {
return t.srcLang
}
func (t *LibreTranslate) GetDstLang() string {
return t.dstLang
}
func (t *LibreTranslate) SetSrcLang(srcLang string) {
t.srcLang = srcLang
}
func (t *LibreTranslate) SetDstLang(dstLang string) {
t.dstLang = dstLang
}
func (t *LibreTranslate) SwapLang() {
t.srcLang, t.dstLang = t.dstLang, t.srcLang
}
func (t *LibreTranslate) 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")
}

View File

@ -0,0 +1,26 @@
package libretranslate
import (
"errors"
)
const (
ttsURL = "https://translate.google.com.vn/translate_tts?ie=UTF-8&q=%s&tl=%s&client=tw-ob"
)
func (t *LibreTranslate) LockAvailable() bool {
return t.SoundLock.Available()
}
func (t *LibreTranslate) LockAcquire() {
t.SoundLock.Acquire()
}
func (t *LibreTranslate) StopTTS() {
t.SoundLock.Stop = true
}
func (t *LibreTranslate) PlayTTS(lang string, message string) error {
t.SoundLock.Release()
return errors.New("LibreTranslate does not support text to speech")
}

View File

@ -3,6 +3,11 @@ package translate
import (
"gtt/internal/lock"
"gtt/internal/translate/googletranslate"
"gtt/internal/translate/libretranslate"
)
var (
AllTranslator = []string{"LibreTranslate", "GoogleTranslate"}
)
type Translator interface {
@ -30,3 +35,9 @@ func NewGoogleTranslate() *googletranslate.GoogleTranslate {
SoundLock: lock.NewLock(),
}
}
func NewLibreTranslate() *libretranslate.LibreTranslate {
return &libretranslate.LibreTranslate{
SoundLock: lock.NewLock(),
}
}

View File

@ -15,8 +15,11 @@ var (
srcLangArg *string = flag.String("src", "", "Set source language")
dstLangArg *string = flag.String("dst", "", "Set destination language")
// Translate
translator translate.Translator
googleTranslate = translate.NewGoogleTranslate()
translator translate.Translator
translators = map[string]translate.Translator{
"LibreTranslate": translate.NewLibreTranslate(),
"GoogleTranslate": translate.NewGoogleTranslate(),
}
// UI
app = tview.NewApplication()
srcInput = tview.NewTextArea()