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