1 /* BEGIN_COMMON_COPYRIGHT_HEADER
2 * (c)LGPL2+
3 *
4 * Flacon - audio File Encoder
5 * https://github.com/flacon/flacon
6 *
7 * Copyright: 2012-2013
8 * Alexander Sokoloff <sokoloff.a@gmail.com>
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 *
24 * END_COMMON_COPYRIGHT_HEADER */
25
26 #include "translatorsinfo.h"
27 #include <QDebug>
28 #include <QtCore/QSettings>
29 #include <QtCore/QStringList>
30 #include <QtCore/QTextCodec>
31
32 /************************************************
33 *
34 ************************************************/
fillLangguages(QMap<QString,QString> * languages)35 static void fillLangguages(QMap<QString, QString> *languages)
36 {
37 languages->insert("ach", "Acoli");
38 languages->insert("af", "Afrikaans");
39 languages->insert("af_ZA", "Afrikaans (South Africa)");
40 languages->insert("ak", "Akan");
41 languages->insert("sq", "Albanian");
42 languages->insert("sq_AL", "Albanian (Albania)");
43 languages->insert("aln", "Albanian Gheg");
44 languages->insert("am", "Amharic");
45 languages->insert("am_ET", "Amharic (Ethiopia)");
46 languages->insert("ar", "Arabic");
47 languages->insert("ar_SA", "Arabic (Saudi Arabia)");
48 languages->insert("ar_AA", "Arabic (Unitag)");
49 languages->insert("an", "Aragonese");
50 languages->insert("hy", "Armenian");
51 languages->insert("hy_AM", "Armenian (Armenia)");
52 languages->insert("as", "Assamese");
53 languages->insert("as_IN", "Assamese (India)");
54 languages->insert("ast", "Asturian");
55 languages->insert("az", "Azerbaijani");
56 languages->insert("az_AZ", "Azerbaijani (Azerbaijan)");
57 languages->insert("bal", "Balochi");
58 languages->insert("eu", "Basque");
59 languages->insert("eu_ES", "Basque (Spain)");
60 languages->insert("be", "Belarusian");
61 languages->insert("be_BY", "Belarusian (Belarus)");
62 languages->insert("be@tarask", "Belarusian (Tarask)");
63 languages->insert("bn", "Bengali");
64 languages->insert("bn_BD", "Bengali (Bangladesh)");
65 languages->insert("bn_IN", "Bengali (India)");
66 languages->insert("brx", "Bodo");
67 languages->insert("bs", "Bosnian");
68 languages->insert("bs_BA", "Bosnian (Bosnia and Herzegovina)");
69 languages->insert("br", "Breton");
70 languages->insert("bg", "Bulgarian");
71 languages->insert("bg_BG", "Bulgarian (Bulgaria)");
72 languages->insert("my", "Burmese");
73 languages->insert("my_MM", "Burmese (Myanmar)");
74 languages->insert("ca", "Catalan");
75 languages->insert("ca_ES", "Catalan (Spain)");
76 languages->insert("ca@valencia", "Catalan (Valencian)");
77 languages->insert("hne", "Chhattisgarhi");
78 languages->insert("cgg", "Chiga");
79 languages->insert("zh", "Chinese");
80 languages->insert("zh_CN", "Chinese (China)");
81 languages->insert("zh_CN.GB2312", "Chinese (China) (GB2312)");
82 languages->insert("zh_HK", "Chinese (Hong Kong)");
83 languages->insert("zh_TW", "Chinese (Taiwan)");
84 languages->insert("zh_TW.Big5", "Chinese (Taiwan) (Big5) ");
85 languages->insert("kw", "Cornish");
86 languages->insert("co", "Corsican");
87 languages->insert("crh", "Crimean Turkish");
88 languages->insert("hr", "Croatian");
89 languages->insert("hr_HR", "Croatian (Croatia)");
90 languages->insert("cs", "Czech");
91 languages->insert("cs_CZ", "Czech (Czech Republic)");
92 languages->insert("da", "Danish");
93 languages->insert("da_DK", "Danish (Denmark)");
94 languages->insert("nl", "Dutch");
95 languages->insert("nl_BE", "Dutch (Belgium)");
96 languages->insert("nl_NL", "Dutch (Netherlands)");
97 languages->insert("dz", "Dzongkha");
98 languages->insert("dz_BT", "Dzongkha (Bhutan)");
99 languages->insert("en", "English");
100 languages->insert("en_AU", "English (Australia)");
101 languages->insert("en_CA", "English (Canada)");
102 languages->insert("en_IE", "English (Ireland)");
103 languages->insert("en_ZA", "English (South Africa)");
104 languages->insert("en_GB", "English (United Kingdom)");
105 languages->insert("en_US", "English (United States)");
106 languages->insert("eo", "Esperanto");
107 languages->insert("et", "Estonian");
108 languages->insert("et_EE", "Estonian (Estonia)");
109 languages->insert("fo", "Faroese");
110 languages->insert("fo_FO", "Faroese (Faroe Islands)");
111 languages->insert("fil", "Filipino");
112 languages->insert("fi", "Finnish");
113 languages->insert("fi_FI", "Finnish (Finland)");
114 languages->insert("frp", "Franco-Provençal (Arpitan)");
115 languages->insert("fr", "French");
116 languages->insert("fr_CA", "French (Canada)");
117 languages->insert("fr_FR", "French (France)");
118 languages->insert("fr_CH", "French (Switzerland)");
119 languages->insert("fur", "Friulian");
120 languages->insert("ff", "Fulah");
121 languages->insert("gd", "Gaelic, Scottish");
122 languages->insert("gl", "Galician");
123 languages->insert("gl_ES", "Galician (Spain)");
124 languages->insert("lg", "Ganda");
125 languages->insert("ka", "Georgian");
126 languages->insert("ka_GE", "Georgian (Georgia)");
127 languages->insert("de", "German");
128 languages->insert("de_DE", "German (Germany)");
129 languages->insert("de_CH", "German (Switzerland)");
130 languages->insert("el", "Greek");
131 languages->insert("el_GR", "Greek (Greece)");
132 languages->insert("gu", "Gujarati");
133 languages->insert("gu_IN", "Gujarati (India)");
134 languages->insert("gun", "Gun");
135 languages->insert("ht", "Haitian (Haitian Creole)");
136 languages->insert("ht_HT", "Haitian (Haitian Creole) (Haiti)");
137 languages->insert("ha", "Hausa");
138 languages->insert("he", "Hebrew");
139 languages->insert("he_IL", "Hebrew (Israel)");
140 languages->insert("hi", "Hindi");
141 languages->insert("hi_IN", "Hindi (India)");
142 languages->insert("hu", "Hungarian");
143 languages->insert("hu_HU", "Hungarian (Hungary)");
144 languages->insert("is", "Icelandic");
145 languages->insert("is_IS", "Icelandic (Iceland)");
146 languages->insert("ig", "Igbo");
147 languages->insert("ilo", "Iloko");
148 languages->insert("id", "Indonesian");
149 languages->insert("id_ID", "Indonesian (Indonesia)");
150 languages->insert("ia", "Interlingua");
151 languages->insert("ga", "Irish");
152 languages->insert("ga_IE", "Irish (Ireland)");
153 languages->insert("it", "Italian");
154 languages->insert("it_IT", "Italian (Italy)");
155 languages->insert("ja", "Japanese");
156 languages->insert("ja_JP", "Japanese (Japan)");
157 languages->insert("jv", "Javanese");
158 languages->insert("kn", "Kannada");
159 languages->insert("kn_IN", "Kannada (India)");
160 languages->insert("ks", "Kashmiri");
161 languages->insert("ks_IN", "Kashmiri (India)");
162 languages->insert("csb", "Kashubian");
163 languages->insert("kk", "Kazakh");
164 languages->insert("kk_KZ", "Kazakh (Kazakhstan)");
165 languages->insert("km", "Khmer");
166 languages->insert("km_KH", "Khmer (Cambodia)");
167 languages->insert("rw", "Kinyarwanda");
168 languages->insert("ky", "Kirgyz");
169 languages->insert("tlh", "Klingon");
170 languages->insert("ko", "Korean");
171 languages->insert("ko_KR", "Korean (Korea)");
172 languages->insert("ku", "Kurdish");
173 languages->insert("ku_IQ", "Kurdish (Iraq)");
174 languages->insert("lo", "Lao");
175 languages->insert("lo_LA", "Lao (Laos)");
176 languages->insert("la", "Latin");
177 languages->insert("lv", "Latvian");
178 languages->insert("lv_LV", "Latvian (Latvia)");
179 languages->insert("li", "Limburgian");
180 languages->insert("ln", "Lingala");
181 languages->insert("lt", "Lithuanian");
182 languages->insert("lt_LT", "Lithuanian (Lithuania)");
183 languages->insert("nds", "Low German");
184 languages->insert("lb", "Luxembourgish");
185 languages->insert("mk", "Macedonian");
186 languages->insert("mk_MK", "Macedonian (Macedonia)");
187 languages->insert("mai", "Maithili");
188 languages->insert("mg", "Malagasy");
189 languages->insert("ms", "Malay");
190 languages->insert("ml", "Malayalam");
191 languages->insert("ml_IN", "Malayalam (India)");
192 languages->insert("ms_MY", "Malay (Malaysia)");
193 languages->insert("mt", "Maltese");
194 languages->insert("mt_MT", "Maltese (Malta)");
195 languages->insert("mi", "Maori");
196 languages->insert("arn", "Mapudungun");
197 languages->insert("mr", "Marathi");
198 languages->insert("mr_IN", "Marathi (India)");
199 languages->insert("mn", "Mongolian");
200 languages->insert("mn_MN", "Mongolian (Mongolia)");
201 languages->insert("nah", "Nahuatl");
202 languages->insert("nr", "Ndebele, South");
203 languages->insert("nap", "Neapolitan");
204 languages->insert("ne", "Nepali");
205 languages->insert("ne_NP", "Nepali (Nepal)");
206 languages->insert("se", "Northern Sami");
207 languages->insert("nso", "Northern Sotho");
208 languages->insert("no", "Norwegian");
209 languages->insert("nb", "Norwegian Bokmål");
210 languages->insert("nb_NO", "Norwegian Bokmål (Norway)");
211 languages->insert("no_NO", "Norwegian (Norway)");
212 languages->insert("nn", "Norwegian Nynorsk");
213 languages->insert("nn_NO", "Norwegian Nynorsk (Norway)");
214 languages->insert("ny", "Nyanja");
215 languages->insert("oc", "Occitan (post 1500)");
216 languages->insert("or", "Oriya");
217 languages->insert("or_IN", "Oriya (India)");
218 languages->insert("pa", "Panjabi (Punjabi)");
219 languages->insert("pa_IN", "Panjabi (Punjabi) (India)");
220 languages->insert("pap", "Papiamento");
221 languages->insert("fa", "Persian");
222 languages->insert("fa_IR", "Persian (Iran)");
223 languages->insert("pms", "Piemontese");
224 languages->insert("pl", "Polish");
225 languages->insert("pl_PL", "Polish (Poland)");
226 languages->insert("pt", "Portuguese");
227 languages->insert("pt_BR", "Portuguese (Brazil)");
228 languages->insert("pt_PT", "Portuguese (Portugal)");
229 languages->insert("ps", "Pushto");
230 languages->insert("ro", "Romanian");
231 languages->insert("ro_RO", "Romanian (Romania)");
232 languages->insert("rm", "Romansh");
233 languages->insert("ru", "Russian");
234 languages->insert("ru_RU", "Russian (Russia)");
235 languages->insert("sm", "Samoan");
236 languages->insert("sc", "Sardinian");
237 languages->insert("sco", "Scots");
238 languages->insert("sr", "Serbian");
239 languages->insert("sr@latin", "Serbian (Latin)");
240 languages->insert("sr_RS@latin", "Serbian (Latin) (Serbia)");
241 languages->insert("sr_RS", "Serbian (Serbia)");
242 languages->insert("sn", "Shona");
243 languages->insert("sd", "Sindhi");
244 languages->insert("si", "Sinhala");
245 languages->insert("si_LK", "Sinhala (Sri Lanka)");
246 languages->insert("sk", "Slovak");
247 languages->insert("sk_SK", "Slovak (Slovakia)");
248 languages->insert("sl", "Slovenian");
249 languages->insert("sl_SI", "Slovenian (Slovenia)");
250 languages->insert("so", "Somali");
251 languages->insert("son", "Songhay");
252 languages->insert("st", "Sotho, Southern");
253 languages->insert("st_ZA", "Sotho, Southern (South Africa)");
254 languages->insert("es", "Spanish");
255 languages->insert("es_AR", "Spanish (Argentina)");
256 languages->insert("es_BO", "Spanish (Bolivia)");
257 languages->insert("es_CL", "Spanish (Chile)");
258 languages->insert("es_CO", "Spanish (Colombia)");
259 languages->insert("es_CR", "Spanish (Costa Rica)");
260 languages->insert("es_DO", "Spanish (Dominican Republic)");
261 languages->insert("es_EC", "Spanish (Ecuador)");
262 languages->insert("es_SV", "Spanish (El Salvador)");
263 languages->insert("es_MX", "Spanish (Mexico)");
264 languages->insert("es_NI", "Spanish (Nicaragua)");
265 languages->insert("es_PA", "Spanish (Panama)");
266 languages->insert("es_PY", "Spanish (Paraguay)");
267 languages->insert("es_PE", "Spanish (Peru)");
268 languages->insert("es_PR", "Spanish (Puerto Rico)");
269 languages->insert("es_ES", "Spanish (Spain)");
270 languages->insert("es_UY", "Spanish (Uruguay)");
271 languages->insert("es_VE", "Spanish (Venezuela)");
272 languages->insert("su", "Sundanese");
273 languages->insert("sw", "Swahili");
274 languages->insert("sw_KE", "Swahili (Kenya)");
275 languages->insert("sv", "Swedish");
276 languages->insert("sv_FI", "Swedish (Finland)");
277 languages->insert("sv_SE", "Swedish (Sweden)");
278 languages->insert("tl", "Tagalog");
279 languages->insert("tl_PH", "Tagalog (Philippines)");
280 languages->insert("tg", "Tajik");
281 languages->insert("tg_TJ", "Tajik (Tajikistan)");
282 languages->insert("ta", "Tamil");
283 languages->insert("ta_IN", "Tamil (India)");
284 languages->insert("ta_LK", "Tamil (Sri-Lanka)");
285 languages->insert("tt", "Tatar");
286 languages->insert("te", "Telugu");
287 languages->insert("te_IN", "Telugu (India)");
288 languages->insert("th", "Thai");
289 languages->insert("th_TH", "Thai (Thailand)");
290 languages->insert("bo", "Tibetan");
291 languages->insert("bo_CN", "Tibetan (China)");
292 languages->insert("ti", "Tigrinya");
293 languages->insert("to", "Tongan");
294 languages->insert("tr", "Turkish");
295 languages->insert("tr_TR", "Turkish (Turkey)");
296 languages->insert("tk", "Turkmen");
297 languages->insert("ug", "Uighur");
298 languages->insert("uk", "Ukrainian");
299 languages->insert("uk_UA", "Ukrainian (Ukraine)");
300 languages->insert("hsb", "Upper Sorbian");
301 languages->insert("ur", "Urdu");
302 languages->insert("ur_PK", "Urdu (Pakistan)");
303 languages->insert("uz", "Uzbek");
304 languages->insert("ve", "Venda");
305 languages->insert("vi", "Vietnamese");
306 languages->insert("vi_VN", "Vietnamese (Vietnam)");
307 languages->insert("vls", "Vlaams");
308 languages->insert("wa", "Walloon");
309 languages->insert("cy", "Welsh");
310 languages->insert("cy_GB", "Welsh (United Kingdom)");
311 languages->insert("fy", "Western Frisian");
312 languages->insert("fy_NL", "Western Frisian (Netherlands)");
313 languages->insert("wo", "Wolof");
314 languages->insert("wo_SN", "Wolof (Senegal)");
315 languages->insert("xh", "Xhosa");
316 languages->insert("yi", "Yiddish");
317 languages->insert("yo", "Yoruba");
318 languages->insert("zu", "Zulu");
319 languages->insert("zu_ZA", "Zulu (South Africa)");
320 }
321
322 /************************************************
323 *
324 ************************************************/
getValue(const QSettings & src,const QString & key)325 static QString getValue(const QSettings &src, const QString &key)
326 {
327 QString ret = src.value(key).toString().trimmed();
328 const char *garbage[] = {
329 "-",
330 "--",
331 "N/A",
332 "None"
333 };
334
335 for (const auto &s : garbage) {
336 if (ret == s)
337 return "";
338 }
339
340 return ret;
341 }
342
343 /************************************************
344 *
345 ************************************************/
TranslatorsInfo()346 TranslatorsInfo::TranslatorsInfo()
347 {
348 QSettings src(":/translatorsInfo", QSettings::IniFormat);
349 src.setIniCodec("UTF-8");
350
351 foreach (QString group, src.childGroups()) {
352 QSet<QString> processed;
353
354 QString lang = group.section("_", 1).remove(".info");
355 src.beginGroup(group);
356 int cnt = src.allKeys().count();
357 for (int i = 0; i < cnt; i++) {
358
359 QString nameEnglish = getValue(src, QString("translator_%1_nameEnglish").arg(i));
360 QString nameNative = getValue(src, QString("translator_%1_nameNative").arg(i));
361 QString contact = getValue(src, QString("translator_%1_contact").arg(i));
362
363 if (nameEnglish.startsWith(QString("Translator %1. ").arg(i)))
364 nameEnglish.clear();
365
366 if (nameNative.startsWith(QString("Translator %1. ").arg(i)))
367 nameNative.clear();
368
369 if (contact.startsWith(QString("Translator %1. ").arg(i)))
370 contact.clear();
371
372 if (nameEnglish.isEmpty())
373 nameEnglish = nameNative;
374
375 if (!nameEnglish.isEmpty() && !processed.contains(nameEnglish)) {
376 process(lang, nameEnglish, nameNative, contact);
377 processed << nameEnglish;
378 }
379 }
380 src.endGroup();
381 }
382 }
383
384 /************************************************
385 *
386 ************************************************/
~TranslatorsInfo()387 TranslatorsInfo::~TranslatorsInfo()
388 {
389 qDeleteAll(mItems);
390 }
391
392 /************************************************
393 *
394 ************************************************/
asHtml() const395 QString TranslatorsInfo::asHtml() const
396 {
397 QString ret;
398 foreach (Translator *translator, mItems) {
399 ret += "<li>" + translator->asHtml() + "</li>";
400 }
401
402 return ret;
403 }
404
405 /************************************************
406 *
407 ************************************************/
process(const QString & lang,const QString & englishName,const QString & nativeName,const QString & contact)408 void TranslatorsInfo::process(const QString &lang, const QString &englishName, const QString &nativeName, const QString &contact)
409 {
410 QString key = QString("%1:%2:%3").arg(englishName, nativeName, contact);
411 Translator *translator = mItems.value(key);
412
413 if (!translator) {
414 translator = new Translator(englishName, nativeName, contact);
415 mItems.insert(key, translator);
416 }
417
418 translator->addLanguage(lang);
419 }
420
421 /************************************************
422 *
423 ************************************************/
Translator(const QString & englishName,const QString & nativeName,const QString & contact)424 Translator::Translator(const QString &englishName, const QString &nativeName, const QString &contact) :
425 mEnglishName(englishName),
426 mContact(contact)
427 {
428 if (nativeName != englishName)
429 mNativeName = nativeName;
430
431 if (mNativeName.isEmpty())
432 mInfo = QString("%1").arg(mEnglishName);
433 else
434 mInfo = QString("%1 (%2)").arg(mEnglishName, mNativeName);
435
436 if (!mContact.isEmpty()) {
437 if (mContact.contains(QRegExp("^(https?|mailto):")))
438 mInfo = QString(" <a href='%1'>%2</a>").arg(contact, mInfo.toHtmlEscaped());
439 else if (contact.contains("@") || contact.contains("<"))
440 mInfo = QString(" <a href='mailto:%1'>%2</a>").arg(contact, mInfo.toHtmlEscaped());
441 else
442 mInfo = QString(" <a href='http://%1'>%2</a>").arg(contact, mInfo.toHtmlEscaped());
443 }
444 }
445
446 /************************************************
447 *
448 ************************************************/
addLanguage(QString langId)449 void Translator::addLanguage(QString langId)
450 {
451 static QMap<QString, QString> mLanguagesList;
452 if (mLanguagesList.isEmpty()) {
453 fillLangguages(&mLanguagesList);
454 }
455
456 if (mLanguagesList.contains(langId))
457 mLanguages << mLanguagesList.value(langId);
458 else
459 mLanguages << langId;
460 }
461
462 /************************************************
463 *
464 ************************************************/
asHtml()465 QString Translator::asHtml()
466 {
467 QString ret(mInfo);
468 ret += " - " + mLanguages.join(", ");
469 return ret;
470 }
471