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

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

Added gofiber

File size: 2.3 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
39 if err != nil {
40 return nil, err
41 }
42
43 defer response.Body.Close()
44
45 doc, err := goquery.NewDocumentFromReader(response.Body)
46
47 if err != nil {
48 return nil, err
49 }
50
51 var langs Language
52
53 doc.Find(".language-item").Each(func(_ int, s *goquery.Selection) {
54 a := s.Find("a").First()
55
56 href, exists := a.Attr("href")
57
58 // Shouldn't happen, but here goes.
59 if !exists {
60 return
61 }
62
63 langURL, err := url.Parse(href)
64
65 if err != nil {
66 return
67 }
68
69 langCode := langURL.Query()[langsType][0]
70
71 if langCode == "auto" {
72 return
73 }
74
75 langs[langCode] = a.Text()
76 })
77
78 return langs, nil
79}
80
81func (e *GoogleTranslate) SourceLanguages() (Language, error) {
82 return e.getLangs("source")
83}
84
85func (e *GoogleTranslate) TargetLanguages() (Language, error) {
86 return e.getLangs("target")
87}
88
89func (_ *GoogleTranslate) DetectLanguage(text string) (string, error) { return "", nil }
90
91func (_ *GoogleTranslate) Translate(text string, from, to string) (TranslationResult, error) {
92 requestURL, _ := url.Parse("https://translate.google.com/m")
93
94 if from == "" {
95 from = "auto"
96 }
97
98 query := url.Values{}
99 query.Add("sl", from)
100 query.Add("tl", to)
101 query.Add("hl", to)
102 query.Add("q", text)
103 requestURL.RawQuery = query.Encode()
104
105 response, err := http.Get(requestURL.String())
106
107 if err != nil {
108 return TranslationResult{}, err
109 }
110
111 defer response.Body.Close()
112
113 doc, err := goquery.NewDocumentFromReader(response.Body)
114
115 if err != nil {
116 return TranslationResult{}, err
117 }
118
119 return TranslationResult{
120 SourceLanguage: from,
121 TranslatedText: doc.Find(".result-container").Text(),
122 }, nil
123}
Note: See TracBrowser for help on using the repository browser.