source: code/trunk/engines/reverso.go@ 20

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

Improved code

File size: 3.5 KB
RevLine 
[13]1package engines
2
3import (
4 "bytes"
5 "encoding/json"
6 "fmt"
7 "net/http"
8)
9
10// Reverso is an engine that fetches data from https://reverso.net.
11type Reverso struct{}
12
13func (_ *Reverso) InternalName() string { return "reverso" }
14
15func (_ *Reverso) DisplayName() string { return "Reverso" }
16
[15]17var reversoLangs = Language{
18 "ara": "Arabic",
19 "chi": "Chinese (Simplified)", // marketed as just "Chinese"
20 "cze": "Czech",
21 "dan": "Danish",
22 "dut": "Dutch",
23 "eng": "English",
24 "fra": "French",
25 "ger": "German",
26 "heb": "Hebrew",
27 "hin": "Hindi",
28 "hun": "Hungarian",
29 "ita": "Italian",
30 "jpn": "Japanese",
31 "kor": "Korean",
32 "per": "Persian",
33 "pol": "Polish",
34 "por": "Portuguese",
35 "rum": "Romanian",
36 "rus": "Russian",
37 "slo": "Slovak",
38 "spa": "Spanish",
39 "swe": "Swedish",
40 "tha": "Thai",
41 "tur": "Turkish",
42 "ukr": "Ukrainian",
[13]43}
44
[15]45func (_ *Reverso) SourceLanguages() (Language, error) { return reversoLangs, nil }
[13]46
[15]47func (_ *Reverso) TargetLanguages() (Language, error) { return reversoLangs, nil }
[13]48
[20]49func (_ *Reverso) Tts(text, lang string) (string, error) { return "", nil }
50
[13]51type reversoAPIResponse struct {
52 LanguageDetection struct {
53 DetectedLanguage string `json:"detectedLanguage"`
54 } `json:"languageDetection"`
55 Translation []string `json:"translation"`
56}
57
[15]58func (e *Reverso) callAPI(text string, from, to string) (reversoAPIResponse, error) {
[13]59 // `contextResults` must be false for language detection
60 formData := map[string]interface{}{
61 "format": "text",
[15]62 "from": from,
63 "to": to,
[13]64 "input": text,
65 "options": map[string]interface{}{
66 "sentenceSplitter": false,
67 "origin": "translation.web",
68 "contextResults": false,
69 "languageDetection": true,
70 },
71 }
72
73 formDataJSON, err := json.Marshal(formData)
74
75 if err != nil {
76 return reversoAPIResponse{}, err
77 }
78
79 request, err := http.NewRequest("POST", "https://api.reverso.net/translate/v1/translation", bytes.NewBuffer(formDataJSON))
80
81 if err != nil {
82 return reversoAPIResponse{}, err
83 }
84
85 request.Header.Set("Content-Type", "application/json")
86 // Returns 403 with empty or no user agent.
87 request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; rv:110.0) Gecko/20100101 Firefox/110.0")
88
89 client := &http.Client{}
90
91 response, err := client.Do(request)
92
93 if err != nil {
94 return reversoAPIResponse{}, err
95 }
96
97 defer response.Body.Close()
98
99 if response.StatusCode != 200 {
100 return reversoAPIResponse{}, fmt.Errorf("got status code %d from Reverso API", response.StatusCode)
101 }
102
103 var result reversoAPIResponse
104
105 if err := json.NewDecoder(response.Body).Decode(&result); err != nil {
106 return reversoAPIResponse{}, err
107 }
108
109 return result, nil
110}
111
[15]112func (e *Reverso) DetectLanguage(text string) (string, error) {
[13]113 // Any language pair works here, does not affect result
[15]114 r, err := e.callAPI(text, "ara", "chi")
[13]115
116 if err != nil {
[15]117 return "", err
[13]118 }
119
120 langCode := r.LanguageDetection.DetectedLanguage
121
[15]122 for code := range reversoLangs {
123 if code == langCode {
124 return code, nil
[13]125 }
126 }
127
[15]128 return "", fmt.Errorf("language code \"%s\" is not in Reverso's language list", langCode)
[13]129}
130
[15]131func (e *Reverso) Translate(text string, from, to string) (TranslationResult, error) {
132 if from == "auto" {
[13]133 from_, err := e.DetectLanguage(text)
134
135 if err != nil {
136 return TranslationResult{}, err
137 }
138
139 from = from_
140 }
141
142 var translation string
143
144 if from == to {
145 translation = text
146 } else {
147 r, err := e.callAPI(text, from, to)
148
149 if err != nil {
150 return TranslationResult{}, err
151 }
152
153 translation = r.Translation[0]
154 }
155
156 return TranslationResult{
157 TranslatedText: translation,
158 }, nil
159}
Note: See TracBrowser for help on using the repository browser.