Improved code

git-svn-id: file:///srv/svn/repo/mai/trunk@20 e410bdd4-646f-c54f-a7ce-fffcc4f439ae
This commit is contained in:
manerakai 2023-08-31 08:28:02 +00:00
parent a550111b23
commit 4b95465cbe
7 changed files with 51 additions and 31 deletions

View File

@ -12,13 +12,14 @@ type Engine interface {
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) DetectLanguage(text string) (string, error)
Tts(text, lang string) (string, error)
} }
type Language map[string]string 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

@ -35,7 +35,6 @@ func (_ *GoogleTranslate) getLangs(type_ string) (Language, error) {
requestURL.RawQuery = query.Encode() requestURL.RawQuery = query.Encode()
response, err := http.Get(requestURL.String()) response, err := http.Get(requestURL.String())
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -43,35 +42,27 @@ func (_ *GoogleTranslate) getLangs(type_ string) (Language, error) {
defer response.Body.Close() defer response.Body.Close()
doc, err := goquery.NewDocumentFromReader(response.Body) doc, err := goquery.NewDocumentFromReader(response.Body)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var langs Language var langs Language = make(Language)
doc.Find(".language-item").Each(func(_ int, s *goquery.Selection) { doc.Find(".language-item").Each(func(_ int, s *goquery.Selection) {
a := s.Find("a").First() a := s.Find("a").First()
href, exists := a.Attr("href") href, exists := a.Attr("href")
// Shouldn't happen, but here goes.
if !exists { if !exists {
return return
} }
langURL, err := url.Parse(href) langURL, err := url.Parse(href)
if err != nil { if err != nil {
return return
} }
langCode := langURL.Query()[langsType][0] langCode := langURL.Query()[langsType][0]
if langCode == "auto" {
return
}
langs[langCode] = a.Text() langs[langCode] = a.Text()
}) })
@ -86,6 +77,18 @@ func (e *GoogleTranslate) TargetLanguages() (Language, error) {
return e.getLangs("target") return e.getLangs("target")
} }
func (e *GoogleTranslate) Tts(text, lang string) (string, error) {
requestURL, _ := url.Parse("https://translate.google.com/translate_tts")
query := url.Values{}
query.Add("tl", lang)
query.Add("q", text)
query.Add("client", "tw-ob")
requestURL.RawQuery = query.Encode()
return requestURL.String(), nil
}
func (_ *GoogleTranslate) DetectLanguage(text string) (string, error) { return "", 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) {

View File

@ -225,12 +225,7 @@ type icibaTranslateResponse struct {
} }
func (_ *ICIBA) Translate(text string, from, to string) (TranslationResult, error) { func (_ *ICIBA) Translate(text string, from, to string) (TranslationResult, error) {
requestURL, err := url.Parse("https://ifanyi.iciba.com/index.php") requestURL, _ := url.Parse("https://ifanyi.iciba.com/index.php")
if err != nil {
// The URL is constant, so it should never fail.
panic(err)
}
query := url.Values{} query := url.Values{}
query.Add("c", "trans") query.Add("c", "trans")
@ -239,7 +234,6 @@ func (_ *ICIBA) Translate(text string, from, to string) (TranslationResult, erro
query.Add("auth_user", "key_web_fanyi") query.Add("auth_user", "key_web_fanyi")
sum := md5.Sum([]byte(("6key_web_fanyiifanyiweb8hc9s98e" + text))) sum := md5.Sum([]byte(("6key_web_fanyiifanyiweb8hc9s98e" + text)))
query.Add("sign", hex.EncodeToString(sum[:])[:16]) query.Add("sign", hex.EncodeToString(sum[:])[:16])
requestURL.RawQuery = query.Encode() requestURL.RawQuery = query.Encode()
@ -250,7 +244,6 @@ func (_ *ICIBA) Translate(text string, from, to string) (TranslationResult, erro
formData.Add("q", text) formData.Add("q", text)
response, err := http.PostForm(requestURL.String(), formData) response, err := http.PostForm(requestURL.String(), formData)
if err != nil { if err != nil {
return TranslationResult{}, err return TranslationResult{}, err
} }
@ -286,3 +279,5 @@ func (_ *ICIBA) Translate(text string, from, to string) (TranslationResult, erro
TranslatedText: responseJSON.Content.Out, TranslatedText: responseJSON.Content.Out,
}, nil }, nil
} }
func (_ *ICIBA) Tts(text, lang string) (string, error) { return "", nil }

View File

@ -63,6 +63,8 @@ func (e *LibreTranslate) SourceLanguages() (Language, error) { return e.getLangs
func (e *LibreTranslate) TargetLanguages() (Language, error) { return e.getLangs() } func (e *LibreTranslate) TargetLanguages() (Language, error) { return e.getLangs() }
func (e *LibreTranslate) Tts(text, lang string) (string, error) { return "", nil }
type libreDetectResponse []struct { type libreDetectResponse []struct {
Confidence float64 `json:"confidence"` Confidence float64 `json:"confidence"`
LanguageCode string `json:"language"` LanguageCode string `json:"language"`

View File

@ -46,6 +46,8 @@ func (_ *Reverso) SourceLanguages() (Language, error) { return reversoLangs, nil
func (_ *Reverso) TargetLanguages() (Language, error) { return reversoLangs, nil } func (_ *Reverso) TargetLanguages() (Language, error) { return reversoLangs, nil }
func (_ *Reverso) Tts(text, lang string) (string, error) { return "", nil }
type reversoAPIResponse struct { type reversoAPIResponse struct {
LanguageDetection struct { LanguageDetection struct {
DetectedLanguage string `json:"detectedLanguage"` DetectedLanguage string `json:"detectedLanguage"`

View File

@ -90,8 +90,8 @@ func main() {
return c.Render("index", fiber.Map{ return c.Render("index", fiber.Map{
"Engine": engine, "Engine": engine,
"enginesNames": enginesNames, "enginesNames": enginesNames,
"SourceLanguages": targetLanguages, "SourceLanguages": sourceLanguages,
"TargetLanguages": sourceLanguages, "TargetLanguages": targetLanguages,
"OriginalText": originalText, "OriginalText": originalText,
"TranslatedText": translatedText, "TranslatedText": translatedText,
"From": from, "From": from,
@ -168,9 +168,6 @@ func main() {
} }
lang := c.Query("lang") lang := c.Query("lang")
if lang == "" {
lang = "en"
}
if url, err := engines.Engines[engine].Tts(text, lang); err != nil { if url, err := engines.Engines[engine].Tts(text, lang); err != nil {
return c.SendStatus(500) return c.SendStatus(500)
@ -188,6 +185,24 @@ func main() {
}) })
app.Post("/switchlanguages", func(c *fiber.Ctx) error {
if c.Cookies("from") != "" {
fromCookie := new(fiber.Cookie)
fromCookie.Name = "from"
fromCookie.Value = c.Cookies("to")
fromCookie.Expires = time.Now().Add(24 * time.Hour * 365)
toCookie := new(fiber.Cookie)
toCookie.Name = "to"
toCookie.Value = c.Cookies("from")
toCookie.Expires = time.Now().Add(24 * time.Hour * 365)
c.Cookie(fromCookie)
c.Cookie(toCookie)
}
return c.Redirect("/")
})
app.Static("/static", "./static") app.Static("/static", "./static")
app.Listen(":3000") app.Listen(":3000")

View File

@ -57,19 +57,21 @@
<div class="item-wrapper"> <div class="item-wrapper">
<textarea autofocus class="item" id="input" name="text" dir="auto" <textarea autofocus class="item" id="input" name="text" dir="auto"
placeholder="Enter Text Here">{{ .OriginalText }}</textarea> placeholder="Enter Text Here">{{ .OriginalText }}</textarea>
<div class="center"> {{if .TtsFrom}}
<audio controls> <audio controls>
<source type="audio/mpeg" src="{{ .TtsFrom }}"> <source type="audio/mpeg" src="{{ .TtsFrom }}">
</audio> </audio>
</div> {{end}}
</div> </div>
<div class="item-wrapper"> <div class="item-wrapper">
<textarea id="output" class="translation item" dir="auto" placeholder="Translation" <textarea id="output" class="translation item" dir="auto" placeholder="Translation"
readonly>{{.TranslatedText}}</textarea> readonly>{{.TranslatedText}}</textarea>
{{if .TtsTo}}
<audio controls> <audio controls>
<source type="audio/mpeg" src="{{ .TtsTo }}"> <source type="audio/mpeg" src="{{ .TtsTo }}">
</audio> </audio>
{{end}}
</div> </div>
</div> </div>