source: code/trunk/engines/google.go@ 20

Last change on this file since 20 was 20, checked in by manerakai, 22 months ago

Improved code

File size: 2.5 KB
Line 
1package engines
2
3import (
4 "fmt"
5 "net/http"
6 "net/url"
7
8 "github.com/PuerkitoBio/goquery"
9)
10
11type GoogleTranslate struct{}
12
13func (_ *GoogleTranslate) InternalName() string { return "google" }
14
15func (_ *GoogleTranslate) DisplayName() string { return "Google" }
16
17func (_ *GoogleTranslate) getLangs(type_ string) (Language, error) {
18 var langsType string
19 switch type_ {
20 case "source":
21 langsType = "sl"
22
23 case "target":
24 langsType = "tl"
25
26 default:
27 panic(fmt.Errorf("getLangs was passed an invalid language type: %s", langsType))
28 }
29
30 requestURL, _ := url.Parse("https://translate.google.com/m")
31
32 query := url.Values{}
33 query.Add("mui", langsType)
34 query.Add("hl", "en-US")
35 requestURL.RawQuery = query.Encode()
36
37 response, err := http.Get(requestURL.String())
38 if err != nil {
39 return nil, err
40 }
41
42 defer response.Body.Close()
43
44 doc, err := goquery.NewDocumentFromReader(response.Body)
45 if err != nil {
46 return nil, err
47 }
48
49 var langs Language = make(Language)
50
51 doc.Find(".language-item").Each(func(_ int, s *goquery.Selection) {
52 a := s.Find("a").First()
53
54 href, exists := a.Attr("href")
55 if !exists {
56 return
57 }
58
59 langURL, err := url.Parse(href)
60 if err != nil {
61 return
62 }
63
64 langCode := langURL.Query()[langsType][0]
65
66 langs[langCode] = a.Text()
67 })
68
69 return langs, nil
70}
71
72func (e *GoogleTranslate) SourceLanguages() (Language, error) {
73 return e.getLangs("source")
74}
75
76func (e *GoogleTranslate) TargetLanguages() (Language, error) {
77 return e.getLangs("target")
78}
79
80func (e *GoogleTranslate) Tts(text, lang string) (string, error) {
81 requestURL, _ := url.Parse("https://translate.google.com/translate_tts")
82
83 query := url.Values{}
84 query.Add("tl", lang)
85 query.Add("q", text)
86 query.Add("client", "tw-ob")
87 requestURL.RawQuery = query.Encode()
88
89 return requestURL.String(), nil
90}
91
92func (_ *GoogleTranslate) DetectLanguage(text string) (string, error) { return "", nil }
93
94func (_ *GoogleTranslate) Translate(text string, from, to string) (TranslationResult, error) {
95 requestURL, _ := url.Parse("https://translate.google.com/m")
96
97 if from == "" {
98 from = "auto"
99 }
100
101 query := url.Values{}
102 query.Add("sl", from)
103 query.Add("tl", to)
104 query.Add("hl", to)
105 query.Add("q", text)
106 requestURL.RawQuery = query.Encode()
107
108 response, err := http.Get(requestURL.String())
109
110 if err != nil {
111 return TranslationResult{}, err
112 }
113
114 defer response.Body.Close()
115
116 doc, err := goquery.NewDocumentFromReader(response.Body)
117
118 if err != nil {
119 return TranslationResult{}, err
120 }
121
122 return TranslationResult{
123 SourceLanguage: from,
124 TranslatedText: doc.Find(".result-container").Text(),
125 }, nil
126}
Note: See TracBrowser for help on using the repository browser.