mirror of
https://github.com/eeeXun/GTT.git
synced 2025-05-17 16:20:33 -07:00
feat: add libretranslate
This commit is contained in:
parent
4a15946142
commit
0faaa757e3
52
config.go
52
config.go
@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"gtt/internal/color"
|
"gtt/internal/color"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
@ -23,10 +24,12 @@ func configInit() {
|
|||||||
"theme": "Gruvbox",
|
"theme": "Gruvbox",
|
||||||
"source.borderColor": "red",
|
"source.borderColor": "red",
|
||||||
"destination.borderColor": "blue",
|
"destination.borderColor": "blue",
|
||||||
"source.google.language": "English",
|
"source.googletranslate.language": "English",
|
||||||
"destination.google.language": "Chinese (Traditional)",
|
"destination.googletranslate.language": "Chinese (Traditional)",
|
||||||
|
"source.libretranslate.language": "English",
|
||||||
|
"destination.libretranslate.language": "Chinese",
|
||||||
"hide_below": false,
|
"hide_below": false,
|
||||||
"translator": "google",
|
"translator": "LibreTranslate",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -64,25 +67,23 @@ func configInit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup
|
// setup
|
||||||
switch config.GetString("translator") {
|
for t_str, t := range translators {
|
||||||
case "google":
|
t.SetSrcLang(config.GetString(fmt.Sprintf("source.%s.language", t_str)))
|
||||||
translator = googleTranslate
|
t.SetDstLang(config.GetString(fmt.Sprintf("destination.%s.language", t_str)))
|
||||||
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"))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
translator = translators[config.GetString("translator")]
|
||||||
hideBelow = config.GetBool("hide_below")
|
hideBelow = config.GetBool("hide_below")
|
||||||
style.Theme = config.GetString("theme")
|
style.Theme = config.GetString("theme")
|
||||||
style.Transparent = config.GetBool("transparent")
|
style.Transparent = config.GetBool("transparent")
|
||||||
style.SetSrcBorderColor(config.GetString("source.borderColor")).
|
style.SetSrcBorderColor(config.GetString("source.borderColor")).
|
||||||
SetDstBorderColor(config.GetString("destination.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
|
// Check if need to modify config file when quit program
|
||||||
@ -90,16 +91,21 @@ func updateConfig() {
|
|||||||
changed := false
|
changed := false
|
||||||
|
|
||||||
// Source language is not passed in argument
|
// Source language is not passed in argument
|
||||||
if len(*srcLangArg) == 0 &&
|
if len(*srcLangArg) == 0 {
|
||||||
config.GetString("source.google.language") != googleTranslate.GetSrcLang() {
|
for t_str, t := range translators {
|
||||||
|
if config.GetString(fmt.Sprintf("source.%s.language", t_str)) != t.GetSrcLang() {
|
||||||
changed = true
|
changed = true
|
||||||
config.Set("source.google.language", googleTranslate.GetSrcLang())
|
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() {
|
if len(*dstLangArg) == 0 {
|
||||||
|
for t_str, t := range translators {
|
||||||
|
if config.GetString(fmt.Sprintf("destination.%s.language", t_str)) != t.GetDstLang() {
|
||||||
changed = true
|
changed = true
|
||||||
config.Set("destination.google.language", googleTranslate.GetDstLang())
|
config.Set(fmt.Sprintf("destination.%s.language", t_str), t.GetDstLang())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if config.GetBool("hide_below") != hideBelow {
|
if config.GetBool("hide_below") != hideBelow {
|
||||||
changed = true
|
changed = true
|
||||||
|
@ -65,7 +65,6 @@ func (t *GoogleTranslate) Translate(message string) (
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", "", err
|
return "", "", "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = json.Unmarshal(body, &data); err != nil {
|
if err = json.Unmarshal(body, &data); err != nil {
|
||||||
return "", "", "", err
|
return "", "", "", err
|
||||||
}
|
}
|
||||||
|
42
internal/translate/libretranslate/language.go
Normal file
42
internal/translate/libretranslate/language.go
Normal 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",
|
||||||
|
}
|
||||||
|
)
|
78
internal/translate/libretranslate/translator.go
Normal file
78
internal/translate/libretranslate/translator.go
Normal 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")
|
||||||
|
}
|
26
internal/translate/libretranslate/tts.go
Normal file
26
internal/translate/libretranslate/tts.go
Normal 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")
|
||||||
|
}
|
@ -3,6 +3,11 @@ package translate
|
|||||||
import (
|
import (
|
||||||
"gtt/internal/lock"
|
"gtt/internal/lock"
|
||||||
"gtt/internal/translate/googletranslate"
|
"gtt/internal/translate/googletranslate"
|
||||||
|
"gtt/internal/translate/libretranslate"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
AllTranslator = []string{"LibreTranslate", "GoogleTranslate"}
|
||||||
)
|
)
|
||||||
|
|
||||||
type Translator interface {
|
type Translator interface {
|
||||||
@ -30,3 +35,9 @@ func NewGoogleTranslate() *googletranslate.GoogleTranslate {
|
|||||||
SoundLock: lock.NewLock(),
|
SoundLock: lock.NewLock(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewLibreTranslate() *libretranslate.LibreTranslate {
|
||||||
|
return &libretranslate.LibreTranslate{
|
||||||
|
SoundLock: lock.NewLock(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
5
main.go
5
main.go
@ -16,7 +16,10 @@ var (
|
|||||||
dstLangArg *string = flag.String("dst", "", "Set destination language")
|
dstLangArg *string = flag.String("dst", "", "Set destination language")
|
||||||
// Translate
|
// Translate
|
||||||
translator translate.Translator
|
translator translate.Translator
|
||||||
googleTranslate = translate.NewGoogleTranslate()
|
translators = map[string]translate.Translator{
|
||||||
|
"LibreTranslate": translate.NewLibreTranslate(),
|
||||||
|
"GoogleTranslate": translate.NewGoogleTranslate(),
|
||||||
|
}
|
||||||
// UI
|
// UI
|
||||||
app = tview.NewApplication()
|
app = tview.NewApplication()
|
||||||
srcInput = tview.NewTextArea()
|
srcInput = tview.NewTextArea()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user