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

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

Improved code

File size: 6.6 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) { return icibaLanguages, nil }
213
214func (_ *ICIBA) TargetLanguages() (Language, error) { return icibaLanguages, nil }
215
216func (_ *ICIBA) Translate(text string, from, to string) (TranslationResult, error) {
217 requestURL, _ := url.Parse("https://ifanyi.iciba.com/index.php")
218
219 query := url.Values{}
220 query.Add("c", "trans")
221 query.Add("m", "fy")
222 query.Add("client", "6")
223 query.Add("auth_user", "key_web_fanyi")
224
225 sum := md5.Sum([]byte(("6key_web_fanyiifanyiweb8hc9s98e" + text)))
226 query.Add("sign", hex.EncodeToString(sum[:])[:16])
227
228 requestURL.RawQuery = query.Encode()
229
230 formData := url.Values{}
231 formData.Add("from", from)
232 formData.Add("to", to)
233 formData.Add("q", text)
234
235 response, err := http.PostForm(requestURL.String(), formData)
236 if err != nil {
237 return TranslationResult{}, err
238 }
239
240 defer response.Body.Close()
241
242 if response.StatusCode != 200 {
243 return TranslationResult{}, fmt.Errorf("got status code %d from iCIBA", response.StatusCode)
244 }
245
246 var responseJSON struct {
247 Content struct {
248 From string `json:"from"`
249 Out string `json:"out"`
250 } `json:"content"`
251 }
252
253 if err := json.NewDecoder(response.Body).Decode(&responseJSON); err != nil {
254 return TranslationResult{}, err
255 }
256
257 var sourceLanguage string
258
259 for code := range icibaLanguages {
260 if code == responseJSON.Content.From {
261 sourceLanguage = code
262 break
263 }
264 }
265
266 if sourceLanguage == "" {
267 return TranslationResult{TranslatedText: responseJSON.Content.Out},
268 fmt.Errorf("language code \"%s\" is not in iCIBA's language list", responseJSON.Content.From)
269 }
270
271 return TranslationResult{
272 SourceLanguage: sourceLanguage,
273 TranslatedText: responseJSON.Content.Out,
274 }, nil
275}
276
277func (_ *ICIBA) Tts(text, lang string) (string, error) { return "", nil }
Note: See TracBrowser for help on using the repository browser.