[13] | 1 | package engines
|
---|
| 2 |
|
---|
| 3 | import (
|
---|
| 4 | "bytes"
|
---|
| 5 | "encoding/json"
|
---|
| 6 | "fmt"
|
---|
| 7 | "net/http"
|
---|
| 8 | )
|
---|
| 9 |
|
---|
| 10 | // Reverso is an engine that fetches data from https://reverso.net.
|
---|
| 11 | type Reverso struct{}
|
---|
| 12 |
|
---|
| 13 | func (_ *Reverso) DisplayName() string { return "Reverso" }
|
---|
| 14 |
|
---|
[15] | 15 | var 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",
|
---|
[13] | 41 | }
|
---|
| 42 |
|
---|
[15] | 43 | func (_ *Reverso) SourceLanguages() (Language, error) { return reversoLangs, nil }
|
---|
[13] | 44 |
|
---|
[15] | 45 | func (_ *Reverso) TargetLanguages() (Language, error) { return reversoLangs, nil }
|
---|
[13] | 46 |
|
---|
[20] | 47 | func (_ *Reverso) Tts(text, lang string) (string, error) { return "", nil }
|
---|
| 48 |
|
---|
[13] | 49 | type reversoAPIResponse struct {
|
---|
| 50 | LanguageDetection struct {
|
---|
| 51 | DetectedLanguage string `json:"detectedLanguage"`
|
---|
| 52 | } `json:"languageDetection"`
|
---|
| 53 | Translation []string `json:"translation"`
|
---|
| 54 | }
|
---|
| 55 |
|
---|
[15] | 56 | func (e *Reverso) callAPI(text string, from, to string) (reversoAPIResponse, error) {
|
---|
[13] | 57 | // `contextResults` must be false for language detection
|
---|
| 58 | formData := map[string]interface{}{
|
---|
| 59 | "format": "text",
|
---|
[15] | 60 | "from": from,
|
---|
| 61 | "to": to,
|
---|
[13] | 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 | request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; rv:110.0) Gecko/20100101 Firefox/110.0")
|
---|
| 85 |
|
---|
| 86 | client := &http.Client{}
|
---|
| 87 |
|
---|
| 88 | response, err := client.Do(request)
|
---|
| 89 |
|
---|
| 90 | if err != nil {
|
---|
| 91 | return reversoAPIResponse{}, err
|
---|
| 92 | }
|
---|
| 93 |
|
---|
| 94 | defer response.Body.Close()
|
---|
| 95 |
|
---|
| 96 | if response.StatusCode != 200 {
|
---|
| 97 | return reversoAPIResponse{}, fmt.Errorf("got status code %d from Reverso API", response.StatusCode)
|
---|
| 98 | }
|
---|
| 99 |
|
---|
| 100 | var result reversoAPIResponse
|
---|
| 101 |
|
---|
| 102 | if err := json.NewDecoder(response.Body).Decode(&result); err != nil {
|
---|
| 103 | return reversoAPIResponse{}, err
|
---|
| 104 | }
|
---|
| 105 |
|
---|
| 106 | return result, nil
|
---|
| 107 | }
|
---|
| 108 |
|
---|
[23] | 109 | func (e *Reverso) Translate(text string, from, to string) (TranslationResult, error) {
|
---|
| 110 | if from == "auto" || from == "" {
|
---|
| 111 | from = "eng"
|
---|
| 112 | }
|
---|
[13] | 113 |
|
---|
[23] | 114 | var translation string
|
---|
| 115 |
|
---|
| 116 | r, err := e.callAPI(text, from, to)
|
---|
[13] | 117 | if err != nil {
|
---|
[23] | 118 | return TranslationResult{}, err
|
---|
[13] | 119 | }
|
---|
| 120 |
|
---|
[23] | 121 | translation = r.Translation[0]
|
---|
[13] | 122 | langCode := r.LanguageDetection.DetectedLanguage
|
---|
| 123 |
|
---|
[15] | 124 | for code := range reversoLangs {
|
---|
| 125 | if code == langCode {
|
---|
[23] | 126 | from = code
|
---|
[13] | 127 | }
|
---|
| 128 | }
|
---|
| 129 |
|
---|
| 130 | return TranslationResult{
|
---|
| 131 | TranslatedText: translation,
|
---|
[23] | 132 | SourceLanguage: from,
|
---|
[13] | 133 | }, nil
|
---|
| 134 | }
|
---|