Improved code
git-svn-id: file:///srv/svn/repo/mai/trunk@23 e410bdd4-646f-c54f-a7ce-fffcc4f439ae
This commit is contained in:
parent
79983d9e7e
commit
62ef51aa54
@ -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{},
|
||||
}
|
||||
|
@ -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{
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
18
web/main.go
18
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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user