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:
parent
0239561276
commit
5fcb72cbb2
@ -3,6 +3,7 @@
|
||||
Google Translate TUI (Originally)
|
||||
|
||||
Support:
|
||||
[`ApertiumTranslate`](https://www.apertium.org/),
|
||||
[`ArgosTranslate`](https://translate.argosopentech.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)"
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
|
@ -24,6 +24,8 @@ func configInit() {
|
||||
"theme": "Gruvbox",
|
||||
"source.borderColor": "red",
|
||||
"destination.borderColor": "blue",
|
||||
"source.language.apertiumtranslate": "English",
|
||||
"destination.language.apertiumtranslate": "English",
|
||||
"source.language.argostranslate": "English",
|
||||
"destination.language.argostranslate": "English",
|
||||
"source.language.googletranslate": "English",
|
||||
|
98
internal/translate/apertiumtranslate/language.go
Normal file
98
internal/translate/apertiumtranslate/language.go
Normal 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",
|
||||
}
|
||||
)
|
92
internal/translate/apertiumtranslate/translator.go
Normal file
92
internal/translate/apertiumtranslate/translator.go
Normal 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")
|
||||
}
|
22
internal/translate/apertiumtranslate/tts.go
Normal file
22
internal/translate/apertiumtranslate/tts.go
Normal 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")
|
||||
}
|
@ -2,12 +2,13 @@ package translate
|
||||
|
||||
import (
|
||||
"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/googletranslate"
|
||||
)
|
||||
|
||||
var (
|
||||
AllTranslator = []string{"ArgosTranslate", "GoogleTranslate"}
|
||||
AllTranslator = []string{"ApertiumTranslate", "ArgosTranslate", "GoogleTranslate"}
|
||||
)
|
||||
|
||||
type Translator interface {
|
||||
@ -32,6 +33,11 @@ func NewTranslator(name string) Translator {
|
||||
var translator Translator
|
||||
|
||||
switch name {
|
||||
case "ApertiumTranslate":
|
||||
translator = &apertiumtranslate.ApertiumTranslate{
|
||||
EngineName: "ApertiumTranslate",
|
||||
SoundLock: lock.NewLock(),
|
||||
}
|
||||
case "ArgosTranslate":
|
||||
translator = &argostranslate.ArgosTranslate{
|
||||
EngineName: "ArgosTranslate",
|
||||
|
Loading…
x
Reference in New Issue
Block a user