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 {
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{},
}

View File

@ -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{

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View File

@ -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 {