source: code/trunk/google_translate_engine.go@ 2

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

Use camel case for variable names

File size: 2.7 KB
RevLine 
[1]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) {
[2]18 var langsType string
[1]19 switch type_ {
20 case "source":
[2]21 langsType = "sl"
[1]22
23 case "target":
[2]24 langsType = "tl"
[1]25
26 default:
[2]27 panic(fmt.Errorf("getLangs was passed an invalid language type: %s", langsType))
[1]28 }
29
[2]30 requestURL, err := url.Parse("https://translate.google.com/m")
[1]31
32 if err != nil {
33 // The URL is constant, so it should never fail.
34 panic(err)
35 }
36
37 query := url.Values{}
[2]38 query.Add("mui", langsType)
[1]39 query.Add("hl", "en-US")
[2]40 requestURL.RawQuery = query.Encode()
[1]41
[2]42 response, err := http.Get(requestURL.String())
[1]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
[2]68 langURL, err := url.Parse(href)
[1]69
70 if err != nil {
71 return
72 }
73
[2]74 langCode := langURL.Query()[langsType][0]
[1]75
[2]76 if langCode == "auto" {
[1]77 return
78 }
79
[2]80 langs = append(langs, Language{Name: a.Text(), Code: langCode})
[1]81 })
82
83 return langs, nil
84}
85
86func (engine *GoogleTranslateEngine) SourceLanguages() ([]Language, error) {
87 return engine.getLangs("source")
88}
89
90func (engine *GoogleTranslateEngine) TargetLanguages() ([]Language, error) {
91 return engine.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) {
[2]99 requestURL, err := url.Parse("https://translate.google.com/m")
[1]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)
[2]111 requestURL.RawQuery = query.Encode()
[1]112
[2]113 response, err := http.Get(requestURL.String())
[1]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.