Improved code
git-svn-id: file:///srv/svn/repo/mai/trunk@20 e410bdd4-646f-c54f-a7ce-fffcc4f439ae
This commit is contained in:
parent
a550111b23
commit
4b95465cbe
@ -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{},
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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 }
|
||||||
|
@ -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"`
|
||||||
|
@ -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"`
|
||||||
|
25
web/main.go
25
web/main.go
@ -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")
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user