source: code/trunk/engines/libretranslate.go@ 15

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

Added gofiber

File size: 3.8 KB
RevLine 
[9]1package engines
2
3import (
4 "bytes"
5 "encoding/json"
6 "fmt"
7 "net/http"
8)
9
[10]10// LibreTranslate is an engine that interfaces with any
[9]11// [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) instance.
[10]12type LibreTranslate struct {
[12]13 // InstanceURL is the URL to a LibreTranslate instance, for example
[9]14 // "https://libretranslate.com".
15 InstanceURL string
16 // APIKey is the API key for the given instance. If empty, then no API
17 // key will be sent along with requests to the instance.
18 //
19 // Some instances issue API keys to users so that they can have a
20 // higher rate limit. See
21 // https://github.com/LibreTranslate/LibreTranslate#manage-api-keys for
22 // more information.
23 APIKey string
24}
25
[10]26func (_ *LibreTranslate) InternalName() string { return "libre" }
[9]27
[10]28func (_ *LibreTranslate) DisplayName() string { return "LibreTranslate" }
[9]29
[15]30func (e *LibreTranslate) getLangs() (Language, error) {
[9]31 response, err := http.Get(e.InstanceURL + "/languages")
32
33 if err != nil {
34 return nil, err
35 }
36
37 defer response.Body.Close()
38
39 if response.StatusCode != 200 {
40 return nil, fmt.Errorf("got status code %d from LibreTranslate API", response.StatusCode)
41 }
42
[15]43 var langsResponse []struct {
44 Name string `json:"name"`
45 Code string `json:"code"`
46 }
[9]47
48 if err := json.NewDecoder(response.Body).Decode(&langsResponse); err != nil {
49 return nil, err
50 }
51
[15]52 langs := Language{}
[9]53
[15]54 for _, lang := range langsResponse {
55 langs[lang.Code] = lang.Name
[9]56 }
57
58 return langs, nil
59
60}
61
[15]62func (e *LibreTranslate) SourceLanguages() (Language, error) { return e.getLangs() }
[9]63
[15]64func (e *LibreTranslate) TargetLanguages() (Language, error) { return e.getLangs() }
[9]65
66type libreDetectResponse []struct {
67 Confidence float64 `json:"confidence"`
68 LanguageCode string `json:"language"`
69}
70
[15]71func (e *LibreTranslate) DetectLanguage(text string) (string, error) {
[9]72 formData := map[string]string{"q": text}
73
74 if e.APIKey != "" {
75 formData["api_key"] = e.APIKey
76 }
77
78 formDataJSON, err := json.Marshal(formData)
79
80 if err != nil {
[15]81 return "", err
[9]82 }
83
84 response, err := http.Post(e.InstanceURL+"/detect", "application/json", bytes.NewBuffer(formDataJSON))
85
86 if err != nil {
[15]87 return "", err
[9]88 }
89
90 defer response.Body.Close()
91
92 if response.StatusCode != 200 {
[15]93 return "", fmt.Errorf("got status code %d from LibreTranslate API", response.StatusCode)
[9]94 }
95
96 var langs libreDetectResponse
97
98 if err := json.NewDecoder(response.Body).Decode(&langs); err != nil {
[15]99 return "", err
[9]100 }
101
102 maxConfidenceLang := langs[0]
103
104 for _, lang := range langs[1:] {
105 if lang.Confidence > maxConfidenceLang.Confidence {
106 maxConfidenceLang = lang
107 }
108 }
109
110 engineLangs, err := e.getLangs()
111
112 if err != nil {
[15]113 return "", err
[9]114 }
115
[15]116 for code := range engineLangs {
117 if code == maxConfidenceLang.LanguageCode {
118 return code, nil
[9]119 }
120 }
121
[15]122 return "", fmt.Errorf("language code \"%s\" is not in the instance's language list", maxConfidenceLang.LanguageCode)
[9]123}
124
125type libreTranslateResponse struct {
126 TranslatedText string `json:"translatedText"`
127}
128
[15]129func (e *LibreTranslate) Translate(text string, from, to string) (TranslationResult, error) {
[9]130 formData := map[string]string{
131 "q": text,
[15]132 "source": from,
133 "target": to,
[9]134 }
135
136 if e.APIKey != "" {
137 formData["api_key"] = e.APIKey
138 }
139
140 formDataJSON, err := json.Marshal(formData)
141
142 if err != nil {
143 return TranslationResult{}, err
144 }
145
146 response, err := http.Post(e.InstanceURL+"/translate", "application/json", bytes.NewBuffer(formDataJSON))
147
148 if err != nil {
149 return TranslationResult{}, err
150 }
151
152 defer response.Body.Close()
153
154 if response.StatusCode != 200 {
155 return TranslationResult{}, fmt.Errorf("got status code %d from LibreTranslate API", response.StatusCode)
156 }
157
158 var responseJSON libreTranslateResponse
159
160 if err := json.NewDecoder(response.Body).Decode(&responseJSON); err != nil {
161 return TranslationResult{}, err
162 }
163
[15]164 return TranslationResult{TranslatedText: responseJSON.TranslatedText}, nil
[9]165}
Note: See TracBrowser for help on using the repository browser.