diff --git a/engines/engine.go b/engines/engine.go index 29e0b69..19e573b 100644 --- a/engines/engine.go +++ b/engines/engine.go @@ -8,12 +8,10 @@ type TranslationResult struct { } type Engine interface { - InternalName() string DisplayName() string SourceLanguages() (Language, error) TargetLanguages() (Language, error) Translate(text string, from, to string) (TranslationResult, error) - DetectLanguage(text string) (string, error) Tts(text, lang string) (string, error) } @@ -21,7 +19,7 @@ type Language map[string]string var Engines = map[string]Engine{ "google": &GoogleTranslate{}, - // "icibia": &ICIBA{}, + // "icibia": &ICIBA{}, // "libre": &LibreTranslate{}, "reverseo": &Reverso{}, } diff --git a/engines/google.go b/engines/google.go index f58c937..cd42657 100644 --- a/engines/google.go +++ b/engines/google.go @@ -15,8 +15,6 @@ import ( type GoogleTranslate struct{} -func (_ *GoogleTranslate) InternalName() string { return "google" } - func (_ *GoogleTranslate) DisplayName() string { return "Google" } func (_ *GoogleTranslate) getLangs(type_ string) (Language, error) { @@ -29,7 +27,7 @@ func (_ *GoogleTranslate) getLangs(type_ string) (Language, error) { langsType = "tl" default: - panic(fmt.Errorf("getLangs was passed an invalid language type: %s", langsType)) + return nil, fmt.Errorf("Invalid language type: %s", langsType) } requestURL, _ := url.Parse("https://translate.google.com/m") @@ -94,8 +92,6 @@ func (e *GoogleTranslate) Tts(text, lang string) (string, error) { return requestURL.String(), nil } -func (_ *GoogleTranslate) DetectLanguage(text string) (string, error) { return "", nil } - func (_ *GoogleTranslate) Translate(text string, from, to string) (TranslationResult, error) { requestURL, _ := url.Parse("https://translate.google.com/m") @@ -275,6 +271,10 @@ func (_ *GoogleTranslate) Translate(text string, from, to string) (TranslationRe } } } + + if len(json_) > 0 && json_[0] != nil && len(json_[0].([]interface{})) > 2 && json_[0].([]interface{})[2] != nil { + from = json_[0].([]interface{})[2].(string) + } } return TranslationResult{ diff --git a/engines/iciba.go b/engines/iciba.go index 6d09190..91da9c5 100644 --- a/engines/iciba.go +++ b/engines/iciba.go @@ -12,8 +12,6 @@ import ( // ICIBA is an engine that fetches data from https://www.iciba.com. type ICIBA struct{} -func (_ *ICIBA) InternalName() string { return "iciba" } - func (_ *ICIBA) DisplayName() string { return "iCIBA" } var icibaLanguages = Language{ @@ -215,15 +213,6 @@ func (_ *ICIBA) SourceLanguages() (Language, error) { return icibaLanguages, nil func (_ *ICIBA) TargetLanguages() (Language, error) { return icibaLanguages, nil } -func (_ *ICIBA) DetectLanguage(text string) (string, error) { return "", nil } - -type icibaTranslateResponse struct { - Content struct { - From string `json:"from"` - Out string `json:"out"` - } `json:"content"` -} - func (_ *ICIBA) Translate(text string, from, to string) (TranslationResult, error) { requestURL, _ := url.Parse("https://ifanyi.iciba.com/index.php") @@ -254,7 +243,12 @@ func (_ *ICIBA) Translate(text string, from, to string) (TranslationResult, erro return TranslationResult{}, fmt.Errorf("got status code %d from iCIBA", response.StatusCode) } - var responseJSON icibaTranslateResponse + var responseJSON struct { + Content struct { + From string `json:"from"` + Out string `json:"out"` + } `json:"content"` + } if err := json.NewDecoder(response.Body).Decode(&responseJSON); err != nil { return TranslationResult{}, err diff --git a/engines/libretranslate.go b/engines/libretranslate.go index d4b1a44..a8740f8 100644 --- a/engines/libretranslate.go +++ b/engines/libretranslate.go @@ -23,8 +23,6 @@ type LibreTranslate struct { APIKey string } -func (_ *LibreTranslate) InternalName() string { return "libre" } - func (_ *LibreTranslate) DisplayName() string { return "LibreTranslate" } func (e *LibreTranslate) getLangs() (Language, error) { @@ -70,7 +68,7 @@ type libreDetectResponse []struct { LanguageCode string `json:"language"` } -func (e *LibreTranslate) DetectLanguage(text string) (string, error) { +func (e *LibreTranslate) detectLanguage(text string) (string, error) { formData := map[string]string{"q": text} if e.APIKey != "" { @@ -124,10 +122,6 @@ func (e *LibreTranslate) DetectLanguage(text string) (string, error) { return "", fmt.Errorf("language code \"%s\" is not in the instance's language list", maxConfidenceLang.LanguageCode) } -type libreTranslateResponse struct { - TranslatedText string `json:"translatedText"` -} - func (e *LibreTranslate) Translate(text string, from, to string) (TranslationResult, error) { formData := map[string]string{ "q": text, @@ -157,11 +151,20 @@ func (e *LibreTranslate) Translate(text string, from, to string) (TranslationRes return TranslationResult{}, fmt.Errorf("got status code %d from LibreTranslate API", response.StatusCode) } - var responseJSON libreTranslateResponse + var responseJSON struct { + TranslatedText string `json:"translatedText"` + } if err := json.NewDecoder(response.Body).Decode(&responseJSON); err != nil { return TranslationResult{}, err } - return TranslationResult{TranslatedText: responseJSON.TranslatedText}, nil + if r, err := e.detectLanguage(text); err == nil { + from = r + } + + return TranslationResult{ + TranslatedText: responseJSON.TranslatedText, + SourceLanguage: from, + }, nil } diff --git a/engines/reverso.go b/engines/reverso.go index 090fe2c..ae17b82 100644 --- a/engines/reverso.go +++ b/engines/reverso.go @@ -10,8 +10,6 @@ import ( // Reverso is an engine that fetches data from https://reverso.net. type Reverso struct{} -func (_ *Reverso) InternalName() string { return "reverso" } - func (_ *Reverso) DisplayName() string { return "Reverso" } var reversoLangs = Language{ @@ -83,7 +81,6 @@ func (e *Reverso) callAPI(text string, from, to string) (reversoAPIResponse, err } request.Header.Set("Content-Type", "application/json") - // Returns 403 with empty or no user agent. request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; rv:110.0) Gecko/20100101 Firefox/110.0") client := &http.Client{} @@ -109,51 +106,29 @@ func (e *Reverso) callAPI(text string, from, to string) (reversoAPIResponse, err return result, nil } -func (e *Reverso) DetectLanguage(text string) (string, error) { - // Any language pair works here, does not affect result - r, err := e.callAPI(text, "ara", "chi") - - if err != nil { - return "", err - } - - langCode := r.LanguageDetection.DetectedLanguage - - for code := range reversoLangs { - if code == langCode { - return code, nil - } - } - - return "", fmt.Errorf("language code \"%s\" is not in Reverso's language list", langCode) -} - func (e *Reverso) Translate(text string, from, to string) (TranslationResult, error) { - if from == "auto" { - from_, err := e.DetectLanguage(text) - - if err != nil { - return TranslationResult{}, err - } - - from = from_ + if from == "auto" || from == "" { + from = "eng" } var translation string - if from == to { - translation = text - } else { - r, err := e.callAPI(text, from, to) + r, err := e.callAPI(text, from, to) + if err != nil { + return TranslationResult{}, err + } - if err != nil { - return TranslationResult{}, err + translation = r.Translation[0] + langCode := r.LanguageDetection.DetectedLanguage + + for code := range reversoLangs { + if code == langCode { + from = code } - - translation = r.Translation[0] } return TranslationResult{ TranslatedText: translation, + SourceLanguage: from, }, nil } diff --git a/web/main.go b/web/main.go index 0b27ebf..aa0d1b9 100644 --- a/web/main.go +++ b/web/main.go @@ -20,8 +20,11 @@ func main() { }) app.All("/", func(c *fiber.Ctx) error { - engine := c.Query("engine") - if _, ok := engines.Engines[engine]; !ok || engine == "" { + engine := c.Cookies("engine") + if c.Query("engine") != "" { + engine = c.Query("engine") + } + if _, ok := engines.Engines[engine]; !ok { engine = "google" } targetLanguages, err := engines.Engines[engine].TargetLanguages() @@ -49,6 +52,7 @@ func main() { } else { translatedText = result.TranslatedText translation = result + from = result.SourceLanguage } ttsFromURL, _ := url.Parse("api/tts") @@ -68,15 +72,20 @@ func main() { fromCookie := new(fiber.Cookie) fromCookie.Name = "from" fromCookie.Value = from - fromCookie.Expires = time.Now().Add(24 * time.Hour * 365) + fromCookie.Expires = time.Now().Add(time.Hour * 24 * 365) c.Cookie(fromCookie) toCookie := new(fiber.Cookie) toCookie.Name = "to" toCookie.Value = to - toCookie.Expires = time.Now().Add(24 * time.Hour * 365) + toCookie.Expires = time.Now().Add(time.Hour * 24 * 365) c.Cookie(toCookie) + engineCookie := new(fiber.Cookie) + engineCookie.Name = "engine" + engineCookie.Value = engine + engineCookie.Expires = time.Now().Add(time.Hour * 24 * 365) + c.Cookie(engineCookie) } else if c.Method() == "GET" { from = c.Cookies("from") to = c.Cookies("to") @@ -184,7 +193,6 @@ func main() { return c.Send(buf.Bytes()) } } - }) app.Post("/switchlanguages", func(c *fiber.Ctx) error {