Improved code

git-svn-id: file:///srv/svn/repo/mai/trunk@23 e410bdd4-646f-c54f-a7ce-fffcc4f439ae
This commit is contained in:
manerakai
2023-09-02 12:15:30 +00:00
parent 79983d9e7e
commit 62ef51aa54
6 changed files with 50 additions and 72 deletions

View File

@@ -8,12 +8,10 @@ type TranslationResult struct {
} }
type Engine interface { type Engine interface {
InternalName() string
DisplayName() string DisplayName() string
SourceLanguages() (Language, error) SourceLanguages() (Language, error)
TargetLanguages() (Language, error) TargetLanguages() (Language, error)
Translate(text string, from, to string) (TranslationResult, error) Translate(text string, from, to string) (TranslationResult, error)
DetectLanguage(text string) (string, error)
Tts(text, lang string) (string, error) Tts(text, lang string) (string, error)
} }
@@ -21,7 +19,7 @@ type Language map[string]string
var Engines = map[string]Engine{ var Engines = map[string]Engine{
"google": &GoogleTranslate{}, "google": &GoogleTranslate{},
// "icibia": &ICIBA{}, // "icibia": &ICIBA{},
// "libre": &LibreTranslate{}, // "libre": &LibreTranslate{},
"reverseo": &Reverso{}, "reverseo": &Reverso{},
} }

View File

@@ -15,8 +15,6 @@ import (
type GoogleTranslate struct{} type GoogleTranslate struct{}
func (_ *GoogleTranslate) InternalName() string { return "google" }
func (_ *GoogleTranslate) DisplayName() string { return "Google" } func (_ *GoogleTranslate) DisplayName() string { return "Google" }
func (_ *GoogleTranslate) getLangs(type_ string) (Language, error) { func (_ *GoogleTranslate) getLangs(type_ string) (Language, error) {
@@ -29,7 +27,7 @@ func (_ *GoogleTranslate) getLangs(type_ string) (Language, error) {
langsType = "tl" langsType = "tl"
default: 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") 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 return requestURL.String(), nil
} }
func (_ *GoogleTranslate) DetectLanguage(text string) (string, error) { return "", nil }
func (_ *GoogleTranslate) Translate(text string, from, to string) (TranslationResult, error) { func (_ *GoogleTranslate) Translate(text string, from, to string) (TranslationResult, error) {
requestURL, _ := url.Parse("https://translate.google.com/m") 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{ return TranslationResult{

View File

@@ -12,8 +12,6 @@ import (
// ICIBA is an engine that fetches data from https://www.iciba.com. // ICIBA is an engine that fetches data from https://www.iciba.com.
type ICIBA struct{} type ICIBA struct{}
func (_ *ICIBA) InternalName() string { return "iciba" }
func (_ *ICIBA) DisplayName() string { return "iCIBA" } func (_ *ICIBA) DisplayName() string { return "iCIBA" }
var icibaLanguages = Language{ 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) 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) { func (_ *ICIBA) Translate(text string, from, to string) (TranslationResult, error) {
requestURL, _ := url.Parse("https://ifanyi.iciba.com/index.php") 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) 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 { if err := json.NewDecoder(response.Body).Decode(&responseJSON); err != nil {
return TranslationResult{}, err return TranslationResult{}, err

View File

@@ -23,8 +23,6 @@ type LibreTranslate struct {
APIKey string APIKey string
} }
func (_ *LibreTranslate) InternalName() string { return "libre" }
func (_ *LibreTranslate) DisplayName() string { return "LibreTranslate" } func (_ *LibreTranslate) DisplayName() string { return "LibreTranslate" }
func (e *LibreTranslate) getLangs() (Language, error) { func (e *LibreTranslate) getLangs() (Language, error) {
@@ -70,7 +68,7 @@ type libreDetectResponse []struct {
LanguageCode string `json:"language"` 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} formData := map[string]string{"q": text}
if e.APIKey != "" { 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) 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) { func (e *LibreTranslate) Translate(text string, from, to string) (TranslationResult, error) {
formData := map[string]string{ formData := map[string]string{
"q": text, "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) 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 { if err := json.NewDecoder(response.Body).Decode(&responseJSON); err != nil {
return TranslationResult{}, err 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
} }

View File

@@ -10,8 +10,6 @@ import (
// Reverso is an engine that fetches data from https://reverso.net. // Reverso is an engine that fetches data from https://reverso.net.
type Reverso struct{} type Reverso struct{}
func (_ *Reverso) InternalName() string { return "reverso" }
func (_ *Reverso) DisplayName() string { return "Reverso" } func (_ *Reverso) DisplayName() string { return "Reverso" }
var reversoLangs = Language{ 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") 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") request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; rv:110.0) Gecko/20100101 Firefox/110.0")
client := &http.Client{} client := &http.Client{}
@@ -109,51 +106,29 @@ func (e *Reverso) callAPI(text string, from, to string) (reversoAPIResponse, err
return result, nil 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) { func (e *Reverso) Translate(text string, from, to string) (TranslationResult, error) {
if from == "auto" { if from == "auto" || from == "" {
from_, err := e.DetectLanguage(text) from = "eng"
if err != nil {
return TranslationResult{}, err
}
from = from_
} }
var translation string var translation string
if from == to { r, err := e.callAPI(text, from, to)
translation = text if err != nil {
} else { return TranslationResult{}, err
r, err := e.callAPI(text, from, to) }
if err != nil { translation = r.Translation[0]
return TranslationResult{}, err langCode := r.LanguageDetection.DetectedLanguage
for code := range reversoLangs {
if code == langCode {
from = code
} }
translation = r.Translation[0]
} }
return TranslationResult{ return TranslationResult{
TranslatedText: translation, TranslatedText: translation,
SourceLanguage: from,
}, nil }, nil
} }

View File

@@ -20,8 +20,11 @@ func main() {
}) })
app.All("/", func(c *fiber.Ctx) error { app.All("/", func(c *fiber.Ctx) error {
engine := c.Query("engine") engine := c.Cookies("engine")
if _, ok := engines.Engines[engine]; !ok || engine == "" { if c.Query("engine") != "" {
engine = c.Query("engine")
}
if _, ok := engines.Engines[engine]; !ok {
engine = "google" engine = "google"
} }
targetLanguages, err := engines.Engines[engine].TargetLanguages() targetLanguages, err := engines.Engines[engine].TargetLanguages()
@@ -49,6 +52,7 @@ func main() {
} else { } else {
translatedText = result.TranslatedText translatedText = result.TranslatedText
translation = result translation = result
from = result.SourceLanguage
} }
ttsFromURL, _ := url.Parse("api/tts") ttsFromURL, _ := url.Parse("api/tts")
@@ -68,15 +72,20 @@ func main() {
fromCookie := new(fiber.Cookie) fromCookie := new(fiber.Cookie)
fromCookie.Name = "from" fromCookie.Name = "from"
fromCookie.Value = 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) c.Cookie(fromCookie)
toCookie := new(fiber.Cookie) toCookie := new(fiber.Cookie)
toCookie.Name = "to" toCookie.Name = "to"
toCookie.Value = 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) 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" { } else if c.Method() == "GET" {
from = c.Cookies("from") from = c.Cookies("from")
to = c.Cookies("to") to = c.Cookies("to")
@@ -184,7 +193,6 @@ func main() {
return c.Send(buf.Bytes()) return c.Send(buf.Bytes())
} }
} }
}) })
app.Post("/switchlanguages", func(c *fiber.Ctx) error { app.Post("/switchlanguages", func(c *fiber.Ctx) error {