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

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

Make some identifiers more concise

See https://go.dev/doc/effective_go#package-names, specifically:

The importer of a package will use the name to refer to its contents,
so exported names in the package can use that fact to avoid
repetition.

For example, engines.GoogleTranslateEngine needlessly repeats
"engine," so just get rid of that duplication by renaming it to
engines.GoogleTranslate.

Renaming engines.TranslationEngine to engines.Engine may be
debatable, so if somebody disagrees, feel free to leave a comment
stating your disagreement and with an explanation of why you disagree.

File size: 2.6 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, 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 *GoogleTranslate) SourceLanguages() ([]Language, error) {
87 return e.getLangs("source")
88}
89
90func (e *GoogleTranslate) TargetLanguages() ([]Language, error) {
91 return e.getLangs("target")
92}
93
94func (_ *GoogleTranslate) SupportsAutodetect() bool { return true }
95
96func (_ *GoogleTranslate) DetectLanguage(text string) (Language, error) { return Language{}, nil }
97
98func (_ *GoogleTranslate) 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.