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

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

Added gofiber

File size: 3.4 KB
Line 
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
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",
43}
44
45func (_ *Reverso) SourceLanguages() (Language, error) { return reversoLangs, nil }
46
47func (_ *Reverso) TargetLanguages() (Language, error) { return reversoLangs, nil }
48
49type reversoAPIResponse struct {
50 LanguageDetection struct {
51 DetectedLanguage string `json:"detectedLanguage"`
52 } `json:"languageDetection"`
53 Translation []string `json:"translation"`
54}
55
56func (e *Reverso) callAPI(text string, from, to string) (reversoAPIResponse, error) {
57 // `contextResults` must be false for language detection
58 formData := map[string]interface{}{
59 "format": "text",
60 "from": from,
61 "to": to,
62 "input": text,
63 "options": map[string]interface{}{
64 "sentenceSplitter": false,
65 "origin": "translation.web",
66 "contextResults": false,
67 "languageDetection": true,
68 },
69 }
70
71 formDataJSON, err := json.Marshal(formData)
72
73 if err != nil {
74 return reversoAPIResponse{}, err
75 }
76
77 request, err := http.NewRequest("POST", "https://api.reverso.net/translate/v1/translation", bytes.NewBuffer(formDataJSON))
78
79 if err != nil {
80 return reversoAPIResponse{}, err
81 }
82
83 request.Header.Set("Content-Type", "application/json")
84 // Returns 403 with empty or no user agent.
85 request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; rv:110.0) Gecko/20100101 Firefox/110.0")
86
87 client := &http.Client{}
88
89 response, err := client.Do(request)
90
91 if err != nil {
92 return reversoAPIResponse{}, err
93 }
94
95 defer response.Body.Close()
96
97 if response.StatusCode != 200 {
98 return reversoAPIResponse{}, fmt.Errorf("got status code %d from Reverso API", response.StatusCode)
99 }
100
101 var result reversoAPIResponse
102
103 if err := json.NewDecoder(response.Body).Decode(&result); err != nil {
104 return reversoAPIResponse{}, err
105 }
106
107 return result, nil
108}
109
110func (e *Reverso) DetectLanguage(text string) (string, error) {
111 // Any language pair works here, does not affect result
112 r, err := e.callAPI(text, "ara", "chi")
113
114 if err != nil {
115 return "", err
116 }
117
118 langCode := r.LanguageDetection.DetectedLanguage
119
120 for code := range reversoLangs {
121 if code == langCode {
122 return code, nil
123 }
124 }
125
126 return "", fmt.Errorf("language code \"%s\" is not in Reverso's language list", langCode)
127}
128
129func (e *Reverso) Translate(text string, from, to string) (TranslationResult, error) {
130 if from == "auto" {
131 from_, err := e.DetectLanguage(text)
132
133 if err != nil {
134 return TranslationResult{}, err
135 }
136
137 from = from_
138 }
139
140 var translation string
141
142 if from == to {
143 translation = text
144 } else {
145 r, err := e.callAPI(text, from, to)
146
147 if err != nil {
148 return TranslationResult{}, err
149 }
150
151 translation = r.Translation[0]
152 }
153
154 return TranslationResult{
155 TranslatedText: translation,
156 }, nil
157}
Note: See TracBrowser for help on using the repository browser.