source: code/trunk/google_translate_engine.go@ 3

Last change on this file since 3 was 3, checked in by fattalion, 3 years ago

Shorten receiver names

File size: 2.6 KB
Line 
1package simplytranslate_engines
2
3import (
4 "fmt"
5 "net/http"
6 "net/url"
7
8 "github.com/PuerkitoBio/goquery"
9)
10
11type GoogleTranslateEngine struct{}
12
13func (_ *GoogleTranslateEngine) InternalName() string { return "google" }
14
15func (_ *GoogleTranslateEngine) DisplayName() string { return "Google" }
16
17func (_ *GoogleTranslateEngine) 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, err := url.Parse("https://translate.google.com/m")
31
32 if err != nil {
33 // The URL is constant, so it should never fail.
34 panic(err)
35 }
36
37 query := url.Values{}
38 query.Add("mui", langsType)
39 query.Add("hl", "en-US")
40 requestURL.RawQuery = query.Encode()
41
42 response, err := http.Get(requestURL.String())
43
44 if err != nil {
45 return nil, err
46 }
47
48 defer response.Body.Close()
49
50 doc, err := goquery.NewDocumentFromReader(response.Body)
51
52 if err != nil {
53 return nil, err
54 }
55
56 var langs []Language
57
58 doc.Find(".language-item").Each(func(_ int, s *goquery.Selection) {
59 a := s.Find("a").First()
60
61 href, exists := a.Attr("href")
62
63 // Shouldn't happen, but here goes.
64 if !exists {
65 return
66 }
67
68 langURL, err := url.Parse(href)
69
70 if err != nil {
71 return
72 }
73
74 langCode := langURL.Query()[langsType][0]
75
76 if langCode == "auto" {
77 return
78 }
79
80 langs = append(langs, Language{Name: a.Text(), Code: langCode})
81 })
82
83 return langs, nil
84}
85
86func (e *GoogleTranslateEngine) SourceLanguages() ([]Language, error) {
87 return e.getLangs("source")
88}
89
90func (e *GoogleTranslateEngine) TargetLanguages() ([]Language, error) {
91 return e.getLangs("target")
92}
93
94func (_ *GoogleTranslateEngine) SupportsAutodetect() bool { return true }
95
96func (_ *GoogleTranslateEngine) DetectLanguage(text string) (Language, error) { return Language{}, nil }
97
98func (_ *GoogleTranslateEngine) Translate(text string, from Language, to Language) (TranslationResult, error) {
99 requestURL, err := url.Parse("https://translate.google.com/m")
100
101 if err != nil {
102 // The URL is constant, so it should never fail.
103 panic(err)
104 }
105
106 query := url.Values{}
107 query.Add("sl", from.Code)
108 query.Add("tl", to.Code)
109 query.Add("hl", to.Code)
110 query.Add("q", text)
111 requestURL.RawQuery = query.Encode()
112
113 response, err := http.Get(requestURL.String())
114
115 if err != nil {
116 return TranslationResult{}, err
117 }
118
119 defer response.Body.Close()
120
121 doc, err := goquery.NewDocumentFromReader(response.Body)
122
123 if err != nil {
124 return TranslationResult{}, err
125 }
126
127 return TranslationResult{
128 SourceLanguage: from,
129 TranslatedText: doc.Find(".result-container").Text(),
130 }, nil
131}
Note: See TracBrowser for help on using the repository browser.