1 | package simplytranslate_engines
|
---|
2 |
|
---|
3 | import (
|
---|
4 | "fmt"
|
---|
5 | "net/http"
|
---|
6 | "net/url"
|
---|
7 |
|
---|
8 | "github.com/PuerkitoBio/goquery"
|
---|
9 | )
|
---|
10 |
|
---|
11 | type GoogleTranslateEngine struct{}
|
---|
12 |
|
---|
13 | func (_ *GoogleTranslateEngine) InternalName() string { return "google" }
|
---|
14 |
|
---|
15 | func (_ *GoogleTranslateEngine) DisplayName() string { return "Google" }
|
---|
16 |
|
---|
17 | func (_ *GoogleTranslateEngine) getLangs(type_ string) ([]Language, error) {
|
---|
18 | var langs_type string
|
---|
19 | switch type_ {
|
---|
20 | case "source":
|
---|
21 | langs_type = "sl"
|
---|
22 |
|
---|
23 | case "target":
|
---|
24 | langs_type = "tl"
|
---|
25 |
|
---|
26 | default:
|
---|
27 | panic(fmt.Errorf("getLangs was passed an invalid language type: %s", langs_type))
|
---|
28 | }
|
---|
29 |
|
---|
30 | request_url, 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", langs_type)
|
---|
39 | query.Add("hl", "en-US")
|
---|
40 | request_url.RawQuery = query.Encode()
|
---|
41 |
|
---|
42 | response, err := http.Get(request_url.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 | lang_url, err := url.Parse(href)
|
---|
69 |
|
---|
70 | if err != nil {
|
---|
71 | return
|
---|
72 | }
|
---|
73 |
|
---|
74 | lang_code := lang_url.Query()[langs_type][0]
|
---|
75 |
|
---|
76 | if lang_code == "auto" {
|
---|
77 | return
|
---|
78 | }
|
---|
79 |
|
---|
80 | langs = append(langs, Language{Name: a.Text(), Code: lang_code})
|
---|
81 | })
|
---|
82 |
|
---|
83 | return langs, nil
|
---|
84 | }
|
---|
85 |
|
---|
86 | func (engine *GoogleTranslateEngine) SourceLanguages() ([]Language, error) {
|
---|
87 | return engine.getLangs("source")
|
---|
88 | }
|
---|
89 |
|
---|
90 | func (engine *GoogleTranslateEngine) TargetLanguages() ([]Language, error) {
|
---|
91 | return engine.getLangs("target")
|
---|
92 | }
|
---|
93 |
|
---|
94 | func (_ *GoogleTranslateEngine) SupportsAutodetect() bool { return true }
|
---|
95 |
|
---|
96 | func (_ *GoogleTranslateEngine) DetectLanguage(text string) (Language, error) { return Language{}, nil }
|
---|
97 |
|
---|
98 | func (_ *GoogleTranslateEngine) Translate(text string, from Language, to Language) (TranslationResult, error) {
|
---|
99 | request_url, 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 | request_url.RawQuery = query.Encode()
|
---|
112 |
|
---|
113 | response, err := http.Get(request_url.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 | }
|
---|