source: code/trunk/engines/iciba.go@ 65

Last change on this file since 65 was 60, checked in by yakumo.izuru, 17 months ago

GET HTTP リクエストが機能しない問題を修正し、iCIBA および LibreTranslate エンジンを再追加し、マニュアル ページを作成し、Docker に関連するものを削除しました。

Signed-off-by: Izuru Yakumo <yakumo.izuru@…>

File size: 6.7 KB
Line 
1package engines
2
3import (
4 "crypto/md5"
5 "encoding/hex"
6 "encoding/json"
7 "fmt"
8 "net/http"
9 "net/url"
10)
11
12// iCIBA is an engine that fetches data from https://www.iciba.com.
13type ICIBA struct{}
14
15func (_ *ICIBA) DisplayName() string { return "iCIBA" }
16
17var icibaLanguages = Language{
18 // ICIBA does have an API, but they return Chinese names.
19 // For languages already present in Google translate, the English
20 // names in that engine file are used; Otherwise official names
21 // as researched on Wikipedia are used. They're validated against
22 // the Chinese names to the best of my ability.
23 // Missing "cni", "kbh", "tmh"
24 // due to conflict between ISO-639 table and Chinese label
25 // one "//" means on iciba but not on google
26 "ace": "Achinese", //
27 "acu": "Achuar-Shiwiar", //
28 "af": "Afrikaans",
29 "agr": "Aguaruna", //
30 "ake": "Akawaio", //
31 "sq": "Albanian",
32 "am": "Amharic",
33 "ar": "Arabic",
34 "hy": "Armenian",
35 "az": "Azerbaijani",
36 "bsn": "Barasana-Eduria", //
37 "ba": "Bashkir", //
38 "eu": "Basque",
39 "be": "Belarusian",
40 "bem": "Bemba", //
41 "bn": "Bengali",
42 "ber": "Berber", //
43 "bi": "Bislama", //
44 "bs": "Bosnian",
45 "br": "Breton", //
46 "bg": "Bulgarian",
47 "cjp": "Cabécar", //
48 "yue": "Cantonese",
49 "ca": "Catalan",
50 "ceb": "Cebuano",
51 "cha": "Chamorro", //
52 "chr": "Cherokee", //
53 "ny": "Chichewa",
54 "zh": "Chinese (Simplified)", // "zh-cn" on Google
55 "cht": "Chinese (Traditional)", // "zh-tw" on Google
56 "cv": "Chuvash",
57 "cop": "Coptic", //
58 "co": "Corsican",
59 "hr": "Croatian",
60 "cs": "Czech",
61 "da": "Danish",
62 "dv": "Dhivehi", //
63 "dik": "Dinka", //
64 "nl": "Dutch",
65 "dz": "Dzongkha", //
66 "en": "English",
67 "eo": "Esperanto",
68 "et": "Estonian",
69 "ee": "Ewe", //
70 "fo": "Faroese", //
71 "fj": "Fijian", //
72 "fil": "Filipino", // "tl" on Google
73 "fi": "Finnish",
74 "fr": "French",
75 "fy": "Frisian",
76 "gbi": "Galela", //
77 "gl": "Galician",
78 "lg": "Ganda", //
79 "jy": "Georgian", // "ka" on Google
80 "de": "German",
81 "el": "Greek",
82 "amu": "Guerrero Amuzgo", //
83 "gu": "Gujarati",
84 "ht": "Haitian Creole",
85 "ha": "Hausa",
86 "haw": "Hawaiian",
87 "he": "Hebrew", // "iw" on Google
88 "hi": "Hindi",
89 "mww": "Hmong Daw", //
90 "hmn": "Hmong", // not in iciba
91 "hu": "Hungarian",
92 "is": "Icelandic",
93 "ig": "Igbo",
94 "id": "Indonesian",
95 "ga": "Irish",
96 "it": "Italian",
97 "jac": "Jacalteco", //
98 "ja": "Japanese",
99 "jv": "Javanese", // "jw" on Google
100 "kab": "Kabyle", //
101 "kn": "Kannada",
102 "cak": "Kaqchikel", //
103 "ka": "Kazakh", // Google only has "kk"
104 "kk": "Kazakh (Cyrillic)", // Google has it as just "Kazakh"
105 "kek": "Kekchí", //
106 "km": "Khmer",
107 "rw": "Kinyarwanda",
108 "kg": "Kongo", //
109 "ko": "Korean",
110 "ku": "Kurdish (Kurmanji)",
111 "ky": "Kyrgyz",
112 "lo": "Lao",
113 "la": "Latin",
114 "lv": "Latvian",
115 "ln": "Lingala", //
116 "lt": "Lithuanian",
117 "dop": "Lukpa", //
118 "lb": "Luxembourgish",
119 "mk": "Macedonian",
120 "mg": "Malagasy",
121 "ms": "Malay",
122 "ml": "Malayalam",
123 "mt": "Maltese",
124 "mam": "Mam", //
125 "gv": "Manx", //
126 "mi": "Maori",
127 "mr": "Marathi",
128 "mhr": "Mari (Eastern)", //
129 "mrj": "Mari (Western)", //
130 "mn": "Mongolian",
131 "me": "Montenegrin", //
132 "my": "Myanmar (Burmese)",
133 "nhg": "Nahuatl", //
134 "djk": "Ndyuka", //
135 "ne": "Nepali",
136 "no": "Norwegian",
137 "or": "Odia (Oriya)",
138 "ojb": "Ojibwa",
139 "om": "Oromo", //
140 "os": "Ossetian", //
141 "pck": "Paite", //
142 "pap": "Papiamento", //
143 "ps": "Pashto",
144 "fa": "Persian",
145 "pl": "Polish",
146 "pt": "Portuguese",
147 "pot": "Potawatomi", //
148 "pa": "Punjabi",
149 "otq": "Querétaro Otomi", //
150 "quc": "Quiché", //
151 "quw": "Quichua", //
152 "chq": "Quiotepec Chinantec", //
153 "rmn": "Romani", //
154 "ro": "Romanian",
155 "rn": "Rundi", //
156 "ru": "Russian",
157 "sm": "Samoan",
158 "sg": "Sango", //
159 "gd": "Scots Gaelic",
160 "sr": "Serbian",
161 "crs": "Seselwa Creole French", //
162 "st": "Sesotho",
163 "sn": "Shona",
164 "jiv": "Shuar", //
165 "sd": "Sindhi",
166 "si": "Sinhala",
167 "sk": "Slovak",
168 "sl": "Slovenian",
169 "so": "Somali",
170 "es": "Spanish",
171 "su": "Sundanese",
172 "sw": "Swahili",
173 "sv": "Swedish",
174 "syc": "Syriac", // considered "extinct" but is somehow supported
175 "shi": "Tachelhit", //
176 "ty": "Tahitian", //
177 "tg": "Tajik",
178 "ta": "Tamil",
179 "tt": "Tatar",
180 "te": "Telugu",
181 "tet": "Tetum", //
182 "th": "Thai",
183 "ti": "Tigre", //
184 "tw": "Tiwi", //
185 "tpi": "Tok Pisin", //
186 "to": "Tonga", //
187 "ts": "Tsonga",
188 "tn": "Tswana", //
189 "tr": "Turkish",
190 "tk": "Turkmen",
191 "udm": "Udmurt", //
192 "uk": "Ukrainian",
193 "ppk": "Uma", //
194 "ur": "Urdu",
195 "usp": "Uspanteco", //
196 "uy": "Uyghur", // "ug" on Google
197 "uz": "Uzbek",
198 "ve": "Venda", //
199 "vi": "Vietnamese",
200 "war": "Waray", //
201 "cy": "Welsh",
202 "wal": "Wolaitta", //
203 "wol": "Wolof",
204 "xh": "Xhosa",
205 "yi": "Yiddish",
206 "yo": "Yoruba",
207 "yua": "Yucatán Maya", //
208 "dje": "Zarma", //
209 "zu": "Zulu",
210}
211
212func (_ *ICIBA) SourceLanguages() (Language, error) {
213 icibaLanguagesCopy := make(Language)
214 for k, v := range icibaLanguages {
215 icibaLanguagesCopy[k] = v
216 }
217
218 icibaLanguagesCopy["auto"] = "Detect Language"
219 return icibaLanguagesCopy, nil
220}
221
222func (_ *ICIBA) TargetLanguages() (Language, error) { return icibaLanguages, nil }
223
224func (_ *ICIBA) Translate(text string, from, to string) (TranslationResult, error) {
225 requestURL, _ := url.Parse("https://ifanyi.iciba.com/index.php")
226
227 query := url.Values{}
228 query.Add("c", "trans")
229 query.Add("m", "fy")
230 query.Add("client", "6")
231 query.Add("auth_user", "key_web_fanyi")
232
233 sum := md5.Sum([]byte(("6key_web_fanyiifanyiweb8hc9s98e" + text)))
234 query.Add("sign", hex.EncodeToString(sum[:])[:16])
235
236 requestURL.RawQuery = query.Encode()
237
238 formData := url.Values{}
239 formData.Add("from", from)
240 formData.Add("to", to)
241 formData.Add("q", text)
242
243 response, err := http.PostForm(requestURL.String(), formData)
244 if err != nil {
245 return TranslationResult{}, err
246 }
247
248 defer response.Body.Close()
249
250 if response.StatusCode != 200 {
251 return TranslationResult{}, fmt.Errorf("got status code %d from iCIBA", response.StatusCode)
252 }
253
254 var responseJSON struct {
255 Content struct {
256 From string `json:"from"`
257 Out string `json:"out"`
258 } `json:"content"`
259 }
260
261 if err := json.NewDecoder(response.Body).Decode(&responseJSON); err != nil {
262 return TranslationResult{}, err
263 }
264
265 for code := range icibaLanguages {
266 if code == responseJSON.Content.From {
267 from = code
268 break
269 }
270 }
271
272 if from == "" {
273 return TranslationResult{TranslatedText: responseJSON.Content.Out},
274 fmt.Errorf("language code \"%s\" is not in iCIBA's language list", responseJSON.Content.From)
275 }
276
277 return TranslationResult{
278 SourceLanguage: from,
279 TranslatedText: responseJSON.Content.Out,
280 }, nil
281}
282
283func (_ *ICIBA) Tts(text, lang string) (string, error) { return "", nil }
Note: See TracBrowser for help on using the repository browser.