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

Last change on this file since 45 was 27, checked in by manerakai, 21 months ago

Reverseo => Reverso

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