Skip to content

Commit

Permalink
refactor: make Language, TTSLock and EngineName to struct in Translator
Browse files Browse the repository at this point in the history
GetSrcLang, GetDstLang, SetSrcLang, SetDstLang, SwapLang are reusable
functions from translator to translator. So make Language struct.

GetEngineName is also a reusable function. So make EngineName struct.

Finally, let Translator to inherit those functions in these three
(Language, TTSLock, EngineName) structs. No need to write the duplicated
functions for each Translator.
  • Loading branch information
eeeXun committed Mar 10, 2023
1 parent 13e9f96 commit cbd985b
Show file tree
Hide file tree
Showing 14 changed files with 263 additions and 352 deletions.
27 changes: 0 additions & 27 deletions internal/lock/lock.go

This file was deleted.

53 changes: 21 additions & 32 deletions internal/translate/apertiumtranslate/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,55 +8,38 @@ import (
"net/http"
"net/url"

"github.com/eeeXun/gtt/internal/lock"
"github.com/eeeXun/gtt/internal/translate/core"
)

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
*core.Language
*core.TTSLock
core.EngineName
}

func (t *ApertiumTranslate) GetEngineName() string {
return t.EngineName
func NewApertiumTranslate() *ApertiumTranslate {
return &ApertiumTranslate{
Language: core.NewLanguage(),
TTSLock: core.NewTTSLock(),
EngineName: core.NewEngineName("ApertiumTranslate"),
}
}

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 map[string]interface{}

urlStr := fmt.Sprintf(
textURL,
langCode[t.srcLang],
langCode[t.dstLang],
langCode[t.GetSrcLang()],
langCode[t.GetDstLang()],
url.QueryEscape(message),
)
res, err := http.Get(urlStr)
Expand All @@ -82,12 +65,18 @@ func (t *ApertiumTranslate) Translate(message string) (translation, definition,
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,
t.GetEngineName(),
t.GetSrcLang(),
t.GetDstLang(),
"https://www.apertium.org/",
))
}

return translation, definition, partOfSpeech, nil
}

func (t *ApertiumTranslate) PlayTTS(lang, message string) error {
defer t.ReleaseLock()

return errors.New(t.GetEngineName() + " does not support text to speech")
}
23 changes: 0 additions & 23 deletions internal/translate/apertiumtranslate/tts.go

This file was deleted.

47 changes: 18 additions & 29 deletions internal/translate/argostranslate/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,56 +8,39 @@ import (
"net/http"
"net/url"

"github.com/eeeXun/gtt/internal/lock"
"github.com/eeeXun/gtt/internal/translate/core"
)

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

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

func (t *ArgosTranslate) GetEngineName() string {
return t.EngineName
func NewArgosTranslate() *ArgosTranslate {
return &ArgosTranslate{
Language: core.NewLanguage(),
TTSLock: core.NewTTSLock(),
EngineName: core.NewEngineName("ArgosTranslate"),
}
}

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, definition, partOfSpeech string, err error) {
var data map[string]interface{}

res, err := http.PostForm(textURL,
url.Values{
"q": {message},
"source": {langCode[t.srcLang]},
"target": {langCode[t.dstLang]},
"source": {langCode[t.GetSrcLang()]},
"target": {langCode[t.GetDstLang()]},
})
if err != nil {
return "", "", "", err
Expand All @@ -78,3 +61,9 @@ func (t *ArgosTranslate) Translate(message string) (translation, definition, par

return translation, definition, partOfSpeech, nil
}

func (t *ArgosTranslate) PlayTTS(lang, message string) error {
defer t.ReleaseLock()

return errors.New(t.GetEngineName() + " does not support text to speech")
}
23 changes: 0 additions & 23 deletions internal/translate/argostranslate/tts.go

This file was deleted.

30 changes: 30 additions & 0 deletions internal/translate/core/language.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package core

type Language struct {
srcLang string
dstLang string
}

func NewLanguage() *Language {
return &Language{}
}

func (l *Language) GetSrcLang() string {
return l.srcLang
}

func (l *Language) GetDstLang() string {
return l.dstLang
}

func (l *Language) SetSrcLang(lang string) {
l.srcLang = lang
}

func (l *Language) SetDstLang(lang string) {
l.dstLang = lang
}

func (l *Language) SwapLang() {
l.srcLang, l.dstLang = l.dstLang, l.srcLang
}
35 changes: 35 additions & 0 deletions internal/translate/core/lock.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package core

type TTSLock struct {
stop bool
threadCount int8
}

func NewTTSLock() *TTSLock {
return &TTSLock{
stop: true,
threadCount: 0,
}
}

func (l *TTSLock) LockAvailable() bool {
return l.stop && l.threadCount == 0
}

func (l *TTSLock) AcquireLock() {
l.stop = false
l.threadCount++
}

func (l *TTSLock) IsStopped() bool {
return l.stop
}

func (l *TTSLock) StopTTS() {
l.stop = true
}

func (l *TTSLock) ReleaseLock() {
l.stop = true
l.threadCount--
}
15 changes: 15 additions & 0 deletions internal/translate/core/name.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package core

type EngineName struct {
name string
}

func NewEngineName(name string) EngineName {
return EngineName{
name: name,
}
}

func (e EngineName) GetEngineName() string {
return e.name
}
Loading

0 comments on commit cbd985b

Please sign in to comment.