v/GTT
1
0
mirror of https://github.com/eeeXun/GTT.git synced 2025-05-18 00:30:40 -07:00

feat(translator): add ApertiumTranslate (#13)

This commit is contained in:
Xun 2023-02-13 15:22:04 +08:00 committed by GitHub
parent 0239561276
commit 5fcb72cbb2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 236 additions and 12 deletions

View File

@ -3,6 +3,7 @@
Google Translate TUI (Originally) Google Translate TUI (Originally)
Support: Support:
[`ApertiumTranslate`](https://www.apertium.org/),
[`ArgosTranslate`](https://translate.argosopentech.com/), [`ArgosTranslate`](https://translate.argosopentech.com/),
[`GoogleTranslate`](https://translate.google.com/) [`GoogleTranslate`](https://translate.google.com/)
@ -42,7 +43,10 @@ You can pass `-src` and `-dst` in argument to set source and destination languag
gtt -src "English" -dst "Chinese (Traditional)" gtt -src "English" -dst "Chinese (Traditional)"
``` ```
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` See language on
[Apertium Translate](https://www.apertium.org/) for `ApertiumTranslate`,
[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 ## Key Map

View File

@ -20,16 +20,18 @@ func configInit() {
var ( var (
defaultConfigPath string defaultConfigPath string
defaultConfig = map[string]interface{}{ defaultConfig = map[string]interface{}{
"transparent": false, "transparent": false,
"theme": "Gruvbox", "theme": "Gruvbox",
"source.borderColor": "red", "source.borderColor": "red",
"destination.borderColor": "blue", "destination.borderColor": "blue",
"source.language.argostranslate": "English", "source.language.apertiumtranslate": "English",
"destination.language.argostranslate": "English", "destination.language.apertiumtranslate": "English",
"source.language.googletranslate": "English", "source.language.argostranslate": "English",
"destination.language.googletranslate": "English", "destination.language.argostranslate": "English",
"hide_below": false, "source.language.googletranslate": "English",
"translator": "ArgosTranslate", "destination.language.googletranslate": "English",
"hide_below": false,
"translator": "ArgosTranslate",
} }
) )

View File

@ -0,0 +1,98 @@
package apertiumtranslate
var (
lang = []string{
"Afrikaans",
"Arabic",
"Aranese",
"Aragonese",
"Arpitan",
"Basque",
"Belarusian",
"Breton",
"Bulgarian",
"Catalan",
"Crimean Tatar",
"Danish",
"Dutch",
"East Norwegian, vi→vi",
"English",
"Esperanto",
"French",
"Galician",
"Gascon",
"Hindi",
"Icelandic",
"Indonesian",
"Italian",
"Kazakh",
"Macedonian",
"Malay",
"Maltese",
"Northern Sami",
"Norwegian Bokmål",
"Norwegian Nynorsk",
"Occitan",
"Polish",
"Portuguese",
"Romanian",
"Russian",
"Serbo-Croatian",
"Silesian",
"Slovenian",
"Spanish",
"Swedish",
"Tatar",
"Turkish",
"Ukrainian",
"Urdu",
"Welsh",
}
langCode = map[string]string{
"Afrikaans": "afr",
"Arabic": "ara",
"Aranese": "oci_aran",
"Aragonese": "arg",
"Arpitan": "frp",
"Basque": "eus",
"Belarusian": "bel",
"Breton": "bre",
"Bulgarian": "bul",
"Catalan": "cat",
"Crimean Tatar": "crh",
"Danish": "dan",
"Dutch": "nld",
"East Norwegian, vi→vi": "nno_e",
"English": "eng",
"Esperanto": "epo",
"French": "fra",
"Galician": "glg",
"Gascon": "oci_gascon",
"Hindi": "hin",
"Icelandic": "isl",
"Indonesian": "ind",
"Italian": "ita",
"Kazakh": "kaz",
"Macedonian": "mkd",
"Malay": "zlm",
"Maltese": "mlt",
"Northern Sami": "sme",
"Norwegian Bokmål": "nob",
"Norwegian Nynorsk": "nno",
"Occitan": "oci",
"Polish": "pol",
"Portuguese": "por",
"Romanian": "ron",
"Russian": "rus",
"Serbo-Croatian": "hbs",
"Silesian": "szl",
"Slovenian": "slv",
"Spanish": "spa",
"Swedish": "swe",
"Tatar": "tat",
"Turkish": "tur",
"Ukrainian": "ukr",
"Urdu": "urd",
"Welsh": "cym",
}
)

View File

@ -0,0 +1,92 @@
package apertiumtranslate
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"github.com/eeeXun/gtt/internal/lock"
)
const (
textURL = "https://www.apertium.org/apy/translate?langpair=%s|%s&q=%s"
)
type ApertiumTranslate struct {
srcLang string
dstLang string
EngineName string
SoundLock *lock.Lock
}
func (t *ApertiumTranslate) GetEngineName() string {
return t.EngineName
}
func (t *ApertiumTranslate) GetAllLang() []string {
return lang
}
func (t *ApertiumTranslate) GetSrcLang() string {
return t.srcLang
}
func (t *ApertiumTranslate) GetDstLang() string {
return t.dstLang
}
func (t *ApertiumTranslate) SetSrcLang(srcLang string) {
t.srcLang = srcLang
}
func (t *ApertiumTranslate) SetDstLang(dstLang string) {
t.dstLang = dstLang
}
func (t *ApertiumTranslate) SwapLang() {
t.srcLang, t.dstLang = t.dstLang, t.srcLang
}
func (t *ApertiumTranslate) Translate(message string) (translation, definition, partOfSpeech string, err error) {
var data interface{}
urlStr := fmt.Sprintf(
textURL,
langCode[t.srcLang],
langCode[t.dstLang],
url.QueryEscape(message),
)
res, err := http.Get(urlStr)
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 {
switch res.StatusCode {
case 200:
translation += fmt.Sprintf("%v",
data.(map[string]interface{})["responseData"].(map[string]interface{})["translatedText"])
default:
return "", "", "", errors.New(
fmt.Sprintf("%s does not support translate from %s to %s.\nSee available pair on %s",
t.EngineName,
t.srcLang,
t.dstLang,
"https://www.apertium.org/",
))
}
return translation, definition, partOfSpeech, nil
}
return "", "", "", errors.New("Translation not found")
}

View File

@ -0,0 +1,22 @@
package apertiumtranslate
import (
"errors"
)
func (t *ApertiumTranslate) LockAvailable() bool {
return t.SoundLock.Available()
}
func (t *ApertiumTranslate) LockAcquire() {
t.SoundLock.Acquire()
}
func (t *ApertiumTranslate) StopTTS() {
t.SoundLock.Stop = true
}
func (t *ApertiumTranslate) PlayTTS(lang, message string) error {
t.SoundLock.Release()
return errors.New(t.EngineName + " does not support text to speech")
}

View File

@ -2,12 +2,13 @@ package translate
import ( import (
"github.com/eeeXun/gtt/internal/lock" "github.com/eeeXun/gtt/internal/lock"
"github.com/eeeXun/gtt/internal/translate/apertiumtranslate"
"github.com/eeeXun/gtt/internal/translate/argostranslate" "github.com/eeeXun/gtt/internal/translate/argostranslate"
"github.com/eeeXun/gtt/internal/translate/googletranslate" "github.com/eeeXun/gtt/internal/translate/googletranslate"
) )
var ( var (
AllTranslator = []string{"ArgosTranslate", "GoogleTranslate"} AllTranslator = []string{"ApertiumTranslate", "ArgosTranslate", "GoogleTranslate"}
) )
type Translator interface { type Translator interface {
@ -32,6 +33,11 @@ func NewTranslator(name string) Translator {
var translator Translator var translator Translator
switch name { switch name {
case "ApertiumTranslate":
translator = &apertiumtranslate.ApertiumTranslate{
EngineName: "ApertiumTranslate",
SoundLock: lock.NewLock(),
}
case "ArgosTranslate": case "ArgosTranslate":
translator = &argostranslate.ArgosTranslate{ translator = &argostranslate.ArgosTranslate{
EngineName: "ArgosTranslate", EngineName: "ArgosTranslate",