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