1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 /***************************************************************************
8     begin                : Jan 2005
9     copyright            : (C) 2005 by Craig Bradney
10     email                : cbradney@zip.com.au
11  ***************************************************************************/
12 
13 /***************************************************************************
14  *                                                                         *
15  *   This program is free software; you can redistribute it and/or modify  *
16  *   it under the terms of the GNU General Public License as published by  *
17  *   the Free Software Foundation; either version 2 of the License, or     *
18  *   (at your option) any later version.                                   *
19  *                                                                         *
20  ***************************************************************************/
21 
22 #include <iostream>
23 #include <QDebug>
24 #include <QDir>
25 #include <QFile>
26 #include <QFileInfo>
27 #include <QMap>
28 #include <QObject>
29 #include <QStringList>
30 #include <QTextStream>
31 
32 #include "scconfig.h"
33 #include "langmgr.h"
34 #include "scpaths.h"
35 
36 LanguageManager* LanguageManager::m_instance = nullptr;
37 
instance()38 LanguageManager* LanguageManager::instance()
39 {
40 	if(!m_instance)
41 	{
42 		m_instance = new LanguageManager;
43 		Q_ASSERT(m_instance);
44 		m_instance->init();
45 	}
46 	return m_instance;
47 }
48 
deleteInstance()49 void LanguageManager::deleteInstance()
50 {
51 	delete m_instance;
52 	m_instance = nullptr;
53 }
54 
languageChange()55 void LanguageManager::languageChange()
56 {
57 	QList<LangDef> oldLangList = m_langTable;
58 	generateLangList();
59 
60 	for (int i = 0; i < m_langTable.count(); ++i)
61 	{
62 		m_langTable[i].m_hyphAvailable = oldLangList[i].m_hyphAvailable;
63 		m_langTable[i].m_hyphFile = oldLangList[i].m_hyphFile;
64 
65 		m_langTable[i].m_spellAvailable = oldLangList[i].m_spellAvailable;
66 		m_langTable[i].m_spellFile = oldLangList[i].m_spellFile;
67 
68 		m_langTable[i].m_transAvailable = oldLangList[i].m_transAvailable;
69 		m_langTable[i].m_transFile = oldLangList[i].m_transFile;
70 	}
71 }
72 
init(bool generateInstalledList)73 void LanguageManager::init(bool generateInstalledList)
74 {
75 	//generateUntranslatedLangList();
76 	generateLangList();
77 	if (generateInstalledList)
78 	{
79 		generateInstalledGUILangList();
80 		generateInstalledSpellLangList();
81 		generateInstalledHyphLangList();
82 	}
83 }
84 
generateLangList()85 void LanguageManager::generateLangList()
86 {
87 	// So internally language would always be manipulated as a code and otherwise presented translated.
88 	//Build table;
89 	m_langTable.clear();
90 	// Please keep this list sorted by language name.
91 	m_langTable.append(LangDef("aiw",      "",         "Aari",                    QObject::tr("Aari")));
92 	m_langTable.append(LangDef("abq",      "",         "Abaza",                   QObject::tr("Abaza")));
93 	m_langTable.append(LangDef("ab",       "",         "Abkhazian",               QObject::tr("Abkhazian")));
94 	m_langTable.append(LangDef("ach",      "",         "Acoli",                   QObject::tr("Acoli")));
95 	m_langTable.append(LangDef("ady",      "",         "Adyghe",                  QObject::tr("Adyghe")));
96 	m_langTable.append(LangDef("af",       "af_ZA",    "Afrikaans",               QObject::tr("Afrikaans")));
97 	m_langTable.append(LangDef("aa",       "",         "Afar",                    QObject::tr("Afar")));
98 	m_langTable.append(LangDef("aio",      "",         "Aiton",                   QObject::tr("Aiton")));
99 	m_langTable.append(LangDef("ak",       "",         "Akan",                    QObject::tr("Akan")));
100 	m_langTable.append(LangDef("sq",       "",         "Albanian",                QObject::tr("Albanian")));
101 	m_langTable.append(LangDef("atv",      "alt",      "Altai",                   QObject::tr("Altai")));
102 	m_langTable.append(LangDef("am",       "",         "Amharic",                 QObject::tr("Amharic")));
103 	m_langTable.append(LangDef("blo",      "",         "Anii",                    QObject::tr("Anii")));
104 	m_langTable.append(LangDef("ar",       "",         "Arabic",                  QObject::tr("Arabic")));
105 	m_langTable.append(LangDef("ar_dz",    "",         "Arabic (Algeria)",        QObject::tr("Arabic (Algeria)")));
106 	m_langTable.append(LangDef("ar_bh",    "",         "Arabic (Bahrain)",        QObject::tr("Arabic (Bahrain)")));
107 	m_langTable.append(LangDef("ar_eg",    "",         "Arabic (Egypt)",          QObject::tr("Arabic (Egypt)")));
108 	m_langTable.append(LangDef("ar_iq",    "",         "Arabic (Iraq)",           QObject::tr("Arabic (Iraq)")));
109 	m_langTable.append(LangDef("ar_jo",    "",         "Arabic (Jordan)",         QObject::tr("Arabic (Jordan)")));
110 	m_langTable.append(LangDef("ar_kw",    "",         "Arabic (Kuwait)",         QObject::tr("Arabic (Kuwait)")));
111 	m_langTable.append(LangDef("ar_lb",    "",         "Arabic (Lebanon)",        QObject::tr("Arabic (Lebanon)")));
112 	m_langTable.append(LangDef("ar_ly",    "",         "Arabic (Libya)",          QObject::tr("Arabic (Libya)")));
113 	m_langTable.append(LangDef("ar_ma",    "",         "Arabic (Morocco)",        QObject::tr("Arabic (Morocco)")));
114 	m_langTable.append(LangDef("ar_om",    "",         "Arabic (Oman)",           QObject::tr("Arabic (Oman)")));
115 	m_langTable.append(LangDef("ar_qa",    "",         "Arabic (Qatar)",          QObject::tr("Arabic (Qatar)")));
116 	m_langTable.append(LangDef("ar_sa",    "",         "Arabic (Saudi Arabia)",   QObject::tr("Arabic (Saudi Arabia)")));
117 	m_langTable.append(LangDef("ar_sd",    "",         "Arabic (Sudan)",          QObject::tr("Arabic (Sudan)")));
118 	m_langTable.append(LangDef("ar_sy",    "",         "Arabic (Syria)",          QObject::tr("Arabic (Syria)")));
119 	m_langTable.append(LangDef("ar_tn",    "",         "Arabic (Tunisia)",        QObject::tr("Arabic (Tunisia)")));
120 	m_langTable.append(LangDef("ar_ae",    "",         "Arabic (UAE)",            QObject::tr("Arabic (UAE)")));
121 	m_langTable.append(LangDef("ar_ye",    "",         "Arabic (Yemen)",          QObject::tr("Arabic (Yemen)")));
122 	m_langTable.append(LangDef("an",       "an_ES",    "Aragonese",               QObject::tr("Aragonese")));
123 	m_langTable.append(LangDef("hy",       "",         "Armenian",                QObject::tr("Armenian")));
124 	m_langTable.append(LangDef("rup",      "",         "Aromanian",               QObject::tr("Aromanian")));
125 	m_langTable.append(LangDef("as",       "as_IN",    "Assamese",                QObject::tr("Assamese")));
126 	m_langTable.append(LangDef("ast",      "",         "Asturian",                QObject::tr("Asturian")));
127 	m_langTable.append(LangDef("ath",      "",         "Athapaskan",              QObject::tr("Athapaskan")));
128 	m_langTable.append(LangDef("av",       "",         "Avaric",                  QObject::tr("Avaric")));
129 	m_langTable.append(LangDef("awa",      "",         "Awadhi",                  QObject::tr("Awadhi")));
130 	m_langTable.append(LangDef("ay",       "",         "Aymara",                  QObject::tr("Aymara")));
131 	m_langTable.append(LangDef("az",       "aze",      "Azerbaijani",             QObject::tr("Azerbaijani")));
132 	m_langTable.append(LangDef("azj",      "",         "Azerbaijani (North)",     QObject::tr("Azerbaijani (North)")));
133 	m_langTable.append(LangDef("azb",      "",         "Azerbaijani (South)",     QObject::tr("Azerbaijani (South)")));
134 	m_langTable.append(LangDef("bfq",      "",         "Badaga",                  QObject::tr("Badaga")));
135 	m_langTable.append(LangDef("bfy",      "",         "Baghelkhandi",            QObject::tr("Baghelkhandi")));
136 	m_langTable.append(LangDef("bgq",      "",         "Bagri",                   QObject::tr("Bagri")));
137 	m_langTable.append(LangDef("bqi",      "",         "Bakhtiari",               QObject::tr("Bakhtiari")));
138 	m_langTable.append(LangDef("krc",      "",         "Balkar",                  QObject::tr("Balkar")));
139 	m_langTable.append(LangDef("bjt",      "",         "Balanta-Ganja",           QObject::tr("Balanta-Ganja")));
140 	m_langTable.append(LangDef("ble",      "",         "Balanta-Kentohe",         QObject::tr("Balanta-Kentohe")));
141 	m_langTable.append(LangDef("ban",      "",         "Balinese",                QObject::tr("Balinese")));
142 	m_langTable.append(LangDef("bal",      "",         "Baluchi",                 QObject::tr("Baluchi")));
143 	m_langTable.append(LangDef("bft",      "",         "Balti",                   QObject::tr("Balti")));
144 	m_langTable.append(LangDef("bm",       "",         "Bambara",                 QObject::tr("Bambara")));
145 	m_langTable.append(LangDef("bai",      "",         "Bamileke",                QObject::tr("Bamileke")));
146 	m_langTable.append(LangDef("bad",      "",         "Banda",                   QObject::tr("Banda")));
147 	m_langTable.append(LangDef("ba",       "",         "Bashkir",                 QObject::tr("Bashkir")));
148 	m_langTable.append(LangDef("eu",       "",         "Basque",                  QObject::tr("Basque")));
149 	m_langTable.append(LangDef("bts",      "",         "Batak Simalungun",        QObject::tr("Batak Simalungun")));
150 	m_langTable.append(LangDef("bbc",      "",         "Batak Toba",              QObject::tr("Batak Toba")));
151 	m_langTable.append(LangDef("bci",      "",         "Baulé",                   QObject::tr("Baul\303\251")));
152 	m_langTable.append(LangDef("bar",      "",         "Bavarian",                QObject::tr("Bavarian")));
153 	m_langTable.append(LangDef("bcq",      "",         "Bench",                   QObject::tr("Bench")));
154 	m_langTable.append(LangDef("bdy",      "",         "Bandjalang",              QObject::tr("Bandjalang")));
155 	m_langTable.append(LangDef("bem",      "",         "Bemba",                   QObject::tr("Bemba")));
156 	m_langTable.append(LangDef("be",       "be_BY",    "Belarusian",              QObject::tr("Belarusian")));
157 	m_langTable.append(LangDef("bn",       "bn_IN",    "Bengali",                 QObject::tr("Bengali")));
158 	m_langTable.append(LangDef("bn_BD",    "",         "Bengali (Bangladesh)",    QObject::tr("Bengali (Bangladesh)")));
159 	m_langTable.append(LangDef("ber",      "",         "Berber",                  QObject::tr("Berber")));
160 	m_langTable.append(LangDef("btb",      "",         "Beti (Cameroon)",         QObject::tr("Beti (Cameroon)")));
161 	m_langTable.append(LangDef("eot",      "",         "Beti (Côte d'Ivoire)",    QObject::tr("Beti (C\303\264te d'Ivoire)")));
162 	m_langTable.append(LangDef("bhb",      "",         "Bhili",                   QObject::tr("Bhili")));
163 	m_langTable.append(LangDef("bho",      "",         "Bhojpuri",                QObject::tr("Bhojpuri")));
164 	m_langTable.append(LangDef("bik",      "",         "Bikol",                   QObject::tr("Bikol")));
165 	m_langTable.append(LangDef("bcl",      "",         "Bikol (Central)",         QObject::tr("Bikol (Central)")));
166 	m_langTable.append(LangDef("byn",      "",         "Bilen",                   QObject::tr("Bilen")));
167 	m_langTable.append(LangDef("bin",      "",         "Bini",                    QObject::tr("Bini")));
168 	m_langTable.append(LangDef("bpy",      "",         "Bishnupriya",             QObject::tr("Bishnupriya")));
169 	m_langTable.append(LangDef("bi",       "",         "Bislama",                 QObject::tr("Bislama")));
170 	m_langTable.append(LangDef("bla",      "",         "Blackfoot",               QObject::tr("Blackfoot")));
171 	m_langTable.append(LangDef("brx",      "",         "Bodo (India)",            QObject::tr("Bodo (India)")));
172 	m_langTable.append(LangDef("pcc",      "",         "Bouyei",                  QObject::tr("Bouyei")));
173 	m_langTable.append(LangDef("bs_BA",    "bs_BA",    "Bosnian",                 QObject::tr("Bosnian")));
174 	m_langTable.append(LangDef("brh",      "",         "Brahui",                  QObject::tr("Brahui")));
175 	m_langTable.append(LangDef("bra",      "",         "Braj Bhasha",             QObject::tr("Braj Bhasha")));
176 	m_langTable.append(LangDef("br",       "br_FR",    "Breton",                  QObject::tr("Breton")));
177 	m_langTable.append(LangDef("bug",      "",         "Buginese",                QObject::tr("Buginese")));
178 	m_langTable.append(LangDef("bg",       "bg_BG",    "Bulgarian",               QObject::tr("Bulgarian")));
179 	m_langTable.append(LangDef("my",       "",         "Burmese",                 QObject::tr("Burmese")));
180 	m_langTable.append(LangDef("frc",      "",         "Cajun French",            QObject::tr("Cajun French")));
181 	m_langTable.append(LangDef("crx",      "",         "Carrier",                 QObject::tr("Carrier")));
182 	m_langTable.append(LangDef("ca",       "",         "Catalan",                 QObject::tr("Catalan")));
183 	m_langTable.append(LangDef("cts",      "",         "Catanduanes Bikol Northern", QObject::tr("Catanduanes Bikol Northern")));
184 	m_langTable.append(LangDef("bln",      "",         "Catanduanes Bikol Southern", QObject::tr("Catanduanes Bikol Southern")));
185 	m_langTable.append(LangDef("ceb",      "",         "Cebuano",                 QObject::tr("Cebuano")));
186 	m_langTable.append(LangDef("tzm",      "",         "Central Atlas Tamazight", QObject::tr("Central Atlas Tamazight")));
187 	m_langTable.append(LangDef("ch",       "",         "Chamorro",                QObject::tr("Chamorro")));
188 	m_langTable.append(LangDef("hne",      "",         "Chattisgarhi",            QObject::tr("Chattisgarhi")));
189 	m_langTable.append(LangDef("cbk",      "",         "Chavacano",               QObject::tr("Chavacano")));
190 	m_langTable.append(LangDef("ce",       "",         "Chechen",                 QObject::tr("Chechen")));
191 	m_langTable.append(LangDef("chr",      "",         "Cherokee",                QObject::tr("Cherokee")));
192 	m_langTable.append(LangDef("ny",       "",         "Chewa",                   QObject::tr("Chewa")));
193 	m_langTable.append(LangDef("chy",      "",         "Cheyenne",                QObject::tr("Cheyenne")));
194 	m_langTable.append(LangDef("cgg",      "",         "Chiga",                   QObject::tr("Chiga")));
195 	m_langTable.append(LangDef("zh",       "zh_CN",    "Chinese",                 QObject::tr("Chinese")));
196 	m_langTable.append(LangDef("zh_TW",    "",         "Chinese (Trad.)",         QObject::tr("Chinese (Trad.)")));
197 	m_langTable.append(LangDef("chp",      "",         "Chipewyan",               QObject::tr("Chipewyan")));
198 	m_langTable.append(LangDef("ctg",      "",         "Chittagonian",            QObject::tr("Chittagonian")));
199 	m_langTable.append(LangDef("cho",      "",         "Choctaw",                 QObject::tr("Choctaw")));
200 	m_langTable.append(LangDef("ckt",      "",         "Chukchi",                 QObject::tr("Chukchi")));
201 	m_langTable.append(LangDef("cu",       "",         "Church Slavic",           QObject::tr("Church Slavic")));
202 	m_langTable.append(LangDef("cv",       "",         "Chuvash",                 QObject::tr("Chuvash")));
203 	m_langTable.append(LangDef("swb",      "",         "Comorian",                QObject::tr("Comorian")));
204 	m_langTable.append(LangDef("cop",      "",         "Coptic",                  QObject::tr("Coptic")));
205 	m_langTable.append(LangDef("kw",       "",         "Cornish",                 QObject::tr("Cornish")));
206 	m_langTable.append(LangDef("cr",       "",         "Cree",                    QObject::tr("Cree")));
207 	m_langTable.append(LangDef("crm",      "",         "Cree (Moose)",            QObject::tr("Cree (Moose)")));
208 	m_langTable.append(LangDef("crl",      "",         "Cree (East Northern)",    QObject::tr("Cree (East Southern)")));
209 	m_langTable.append(LangDef("crj",      "",         "Cree (East Southern)",    QObject::tr("Cree (East Southern)")));
210 	m_langTable.append(LangDef("cwd",      "",         "Cree (Woods)",            QObject::tr("Woods Cree")));
211 	m_langTable.append(LangDef("mus",      "",         "Creek",                   QObject::tr("Creek")));
212 	m_langTable.append(LangDef("crh",      "",         "Crimean Tatar",           QObject::tr("Crimean Tatar")));
213 	m_langTable.append(LangDef("hr",       "hr_HR",    "Croatian",                QObject::tr("Croatian")));
214 	m_langTable.append(LangDef("quz",      "",         "Cusco Quechua",           QObject::tr("Cusco Quechua")));
215 	m_langTable.append(LangDef("cs",       "cs_CZ",    "Czech",                   QObject::tr("Czech")));
216 	m_langTable.append(LangDef("ada",      "",         "Dangme",                  QObject::tr("Dangme")));
217 	m_langTable.append(LangDef("da",       "da_DK",    "Danish",                  QObject::tr("Danish")));
218 	m_langTable.append(LangDef("dar",      "",         "Dargwa",                  QObject::tr("Dargwa")));
219 	m_langTable.append(LangDef("prs",      "",         "Dari",                    QObject::tr("Afghan Dari")));
220 	m_langTable.append(LangDef("dhd",      "",         "Dhundari",                QObject::tr("Dhundari")));
221 	m_langTable.append(LangDef("din",      "",         "Dinka",                   QObject::tr("Dinka")));
222 	m_langTable.append(LangDef("diq",      "",         "Dimli",                   QObject::tr("Dimli")));
223 	m_langTable.append(LangDef("dgo",      "",         "Dogri",                   QObject::tr("Dogri")));
224 	m_langTable.append(LangDef("nl",       "nl_NL",    "Dutch",                   QObject::tr("Dutch")));
225 	m_langTable.append(LangDef("dz",       "",         "Dzongkha",                QObject::tr("Dzongkha")));
226 	m_langTable.append(LangDef("igb",      "",         "Ebira",                   QObject::tr("Ebira")));
227 	m_langTable.append(LangDef("efi",      "",         "Efik",                    QObject::tr("Efik")));
228 	m_langTable.append(LangDef("en_AU",    "",         "English (Australia)",     QObject::tr("English (Australia)")));
229 	m_langTable.append(LangDef("en_CA",    "",         "English (Canada)",        QObject::tr("English (Canada)")));
230 	m_langTable.append(LangDef("en_NZ",    "",         "English (New Zealand)",   QObject::tr("English (New Zealand)")));
231 	m_langTable.append(LangDef("en_ZA",    "",         "English (South Africa)",  QObject::tr("English (South Africa)")));
232 	m_langTable.append(LangDef("en_GB",    "en",       "English (UK)",            QObject::tr("English (UK)")));
233 	m_langTable.append(LangDef("en_US",    "",         "English (US)",            QObject::tr("English (US)")));
234 	m_langTable.append(LangDef("en_US",    "",         "English",                 QObject::tr("English")));
235 	m_langTable.append(LangDef("ang",      "",         "English (Old 450-1100)",  QObject::tr("English (Old 450-1100)")));
236 	m_langTable.append(LangDef("eo",       "",         "Esperanto",               QObject::tr("Esperanto")));
237 	m_langTable.append(LangDef("myv",      "",         "Erzya",                   QObject::tr("Erzya")));
238 	m_langTable.append(LangDef("et",       "et_EE",    "Estonian",                QObject::tr("Estonian")));
239 	m_langTable.append(LangDef("ekk",      "",         "Estonian (Standard)",     QObject::tr("Estonian (Standard)")));
240 	m_langTable.append(LangDef("eve",      "",         "Even",                    QObject::tr("Even")));
241 	m_langTable.append(LangDef("evn",      "",         "Evenki",                  QObject::tr("Evenki")));
242 	m_langTable.append(LangDef("ee",       "",         "Ewe",                     QObject::tr("Ewe")));
243 	m_langTable.append(LangDef("fo",       "",         "Faroese",                 QObject::tr("Faroese")));
244 	m_langTable.append(LangDef("fj",       "",         "Fijian",                  QObject::tr("Fijian")));
245 	m_langTable.append(LangDef("fil",      "",         "Filipino",                QObject::tr("Filipino")));
246 	m_langTable.append(LangDef("fi",       "",         "Finnish",                 QObject::tr("Finnish")));
247 	m_langTable.append(LangDef("fon",      "",         "Fon",                     QObject::tr("Fon")));
248 	m_langTable.append(LangDef("myq",      "",         "Forest Maninka",          QObject::tr("Forest Maninka")));
249 	m_langTable.append(LangDef("frp",      "",         "Franco-Provençal",        QObject::tr("Franco-Proven\303\247al")));
250 	m_langTable.append(LangDef("fr",       "fr_FR",    "French",                  QObject::tr("French")));
251 	m_langTable.append(LangDef("fy",       "",         "Frisian",                 QObject::tr("Frisian")));
252 	m_langTable.append(LangDef("fur",      "",         "Friulian",                QObject::tr("Friulian")));
253 	m_langTable.append(LangDef("ff",       "",         "Fulah",                   QObject::tr("Fulah")));
254 	m_langTable.append(LangDef("gaa",      "",         "Ga",                      QObject::tr("Ga")));
255 	m_langTable.append(LangDef("gag",      "",         "Gagauz",                  QObject::tr("Gagauz")));
256 	m_langTable.append(LangDef("gl",       "gl_ES",    "Galician",                QObject::tr("Galician")));
257 	m_langTable.append(LangDef("lg",       "",         "Ganda",                   QObject::tr("Ganda")));
258 	m_langTable.append(LangDef("gbm",      "",         "Garhwali",                QObject::tr("Garhwali")));
259 	m_langTable.append(LangDef("grt",      "",         "Garo",                    QObject::tr("Garo")));
260 	m_langTable.append(LangDef("gez",      "",         "Ge'ez",                   QObject::tr("Ge'ez")));
261 	m_langTable.append(LangDef("ka",       "",         "Georgian",                QObject::tr("Georgian")));
262 	m_langTable.append(LangDef("de",       "de_DE",    "German",                  QObject::tr("German")));
263 	m_langTable.append(LangDef("de_AT",    "",         "German (Austria)",        QObject::tr("German (Austria)")));
264 	m_langTable.append(LangDef("de_CH",    "",         "German (Swiss)",          QObject::tr("German (Swiss)")));
265 	m_langTable.append(LangDef("de_1901",  "",         "German (Trad.)",          QObject::tr("German (Trad.)")));
266 	m_langTable.append(LangDef("glk",      "",         "Gilaki",                  QObject::tr("Gilaki")));
267 	m_langTable.append(LangDef("niv",      "",         "Gilyak",                  QObject::tr("Gilyak")));
268 	m_langTable.append(LangDef("gog",      "",         "Gogo",                    QObject::tr("Gogo")));
269 	m_langTable.append(LangDef("gon",      "",         "Gondi",                   QObject::tr("Gondi")));
270 	m_langTable.append(LangDef("gno",      "",         "Gondi Northern",          QObject::tr("Gondi Northern")));
271 	m_langTable.append(LangDef("ggo",      "",         "Gondi Southern",          QObject::tr("Gondi Southern")));
272 	m_langTable.append(LangDef("el",       "",         "Greek",                   QObject::tr("Greek")));
273 	m_langTable.append(LangDef("gn",       "",         "Guarani",                 QObject::tr("Guarani")));
274 	m_langTable.append(LangDef("gu",       "gu_IN",    "Gujarati",                QObject::tr("Gujarati")));
275 	m_langTable.append(LangDef("guk",      "",         "Gumuz",                   QObject::tr("Gumuz")));
276 	m_langTable.append(LangDef("guz",      "",         "Gusii",                   QObject::tr("Gusii")));
277 	m_langTable.append(LangDef("ht",       "",         "Haitian Creole",          QObject::tr("Haitian Creole")));
278 	m_langTable.append(LangDef("amf",      "",         "Hamer-Banna",             QObject::tr("Hamer-Banna")));
279 	m_langTable.append(LangDef("har",      "",         "Harari",                  QObject::tr("Harari")));
280 	m_langTable.append(LangDef("hoj",      "",         "Harauti",                 QObject::tr("Harauti")));
281 	m_langTable.append(LangDef("bgc",      "",         "Haryanvi",                QObject::tr("Haryanvi")));
282 	m_langTable.append(LangDef("ha",       "",         "Hausa",                   QObject::tr("Hausa")));
283 	m_langTable.append(LangDef("haw",      "",         "Hawaiian",                QObject::tr("Hawaiian")));
284 	m_langTable.append(LangDef("hay",      "",         "Haya",                    QObject::tr("Haya")));
285 	m_langTable.append(LangDef("haz",      "",         "Hazaragi",                QObject::tr("Hazaragi")));
286 	m_langTable.append(LangDef("he",       "he_IL",    "Hebrew",                  QObject::tr("Hebrew")));
287 	m_langTable.append(LangDef("hz",       "",         "Herero",                  QObject::tr("Herero")));
288 	m_langTable.append(LangDef("mrj",      "",         "High Mari",               QObject::tr("High Mari")));
289 	m_langTable.append(LangDef("hil",      "",         "Hiligaynon",              QObject::tr("Hiligaynon")));
290 	m_langTable.append(LangDef("hi",       "hi_IN",    "Hindi",                   QObject::tr("Hindi")));
291 	m_langTable.append(LangDef("hno",      "",         "Hindko (Northern)",       QObject::tr("Hindko (Northern)")));
292 	m_langTable.append(LangDef("hnd",      "",         "Hindko (Southern)",       QObject::tr("Hindko (Southern)")));
293 	m_langTable.append(LangDef("ho",       "",         "Hiri Motu",               QObject::tr("Hiri Motu")));
294 	m_langTable.append(LangDef("mww",      "",         "Hmong Daw",               QObject::tr("Hmong Daw")));
295 	m_langTable.append(LangDef("hoc",      "",         "Ho",                      QObject::tr("Ho")));
296 	m_langTable.append(LangDef("hu",       "hu_HU",    "Hungarian",               QObject::tr("Hungarian")));
297 	m_langTable.append(LangDef("ibb",      "",         "Ibibio",                  QObject::tr("Ibibio")));
298 	m_langTable.append(LangDef("is",       "",         "Icelandic",               QObject::tr("Icelandic")));
299 	m_langTable.append(LangDef("io",       "",         "Ido",                     QObject::tr("Ido")));
300 	m_langTable.append(LangDef("ig",       "",         "Igbo",                    QObject::tr("Igbo")));
301 	m_langTable.append(LangDef("ijo",      "",         "Ijo",                     QObject::tr("Ijo")));
302 	m_langTable.append(LangDef("ilo",      "",         "Ilokano",                 QObject::tr("Ilokano")));
303 	m_langTable.append(LangDef("id",       "",         "Indonesian",              QObject::tr("Indonesian")));
304 	m_langTable.append(LangDef("inh",      "",         "Ingush",                  QObject::tr("Ingush")));
305 	m_langTable.append(LangDef("ia",       "",         "Interlingua",             QObject::tr("Interlingua")));
306 	m_langTable.append(LangDef("iu",       "",         "Inuktitut",               QObject::tr("Inuktitut")));
307 	m_langTable.append(LangDef("ik",       "",         "Inupiaq",                 QObject::tr("Inupiaq")));
308 	m_langTable.append(LangDef("ga",       "",         "Irish",                   QObject::tr("Irish")));
309 	m_langTable.append(LangDef("sga",      "",         "Irish Old (to 900)",      QObject::tr("Irish Old (to 900)")));
310 	m_langTable.append(LangDef("it",       "it_IT",    "Italian",                 QObject::tr("Italian")));
311 	m_langTable.append(LangDef("ijc",      "",         "Izon",                    QObject::tr("Izon")));
312 	m_langTable.append(LangDef("jam",      "",         "Jamaican Creole English", QObject::tr("Jamaican Creole English")));
313 	m_langTable.append(LangDef("ja",       "",         "Japanese",                QObject::tr("Japanese")));
314 	m_langTable.append(LangDef("jv",       "",         "Javanese",                QObject::tr("Javanese")));
315 	m_langTable.append(LangDef("dyu",      "",         "Jula",                    QObject::tr("Jula")));
316 	m_langTable.append(LangDef("quc",      "",         "K'iche'",                 QObject::tr("K'iche'")));
317 	m_langTable.append(LangDef("kbd",      "",         "Kabardian",               QObject::tr("Kabardian")));
318 	m_langTable.append(LangDef("kab",      "",         "Kabyle",                  QObject::tr("Kabyle")));
319 	m_langTable.append(LangDef("kl",       "",         "Kalaallisut",             QObject::tr("Kalaallisut")));
320 	m_langTable.append(LangDef("xal",      "",         "Kalmyk",                  QObject::tr("Kalmyk")));
321 	m_langTable.append(LangDef("kln",      "",         "Kalenjin",                QObject::tr("Kalenjin")));
322 	m_langTable.append(LangDef("kam",      "",         "Kamba (Kenya)",           QObject::tr("Kamba (Kenya)")));
323 	m_langTable.append(LangDef("bjj",      "",         "Kanauji",                 QObject::tr("Kanauji")));
324 	m_langTable.append(LangDef("kn",       "kn_IN",    "Kannada",                 QObject::tr("Kannada")));
325 	m_langTable.append(LangDef("kr",       "",         "Kanuri",                  QObject::tr("Kanuri")));
326 	m_langTable.append(LangDef("pam",      "",         "Kapampangan",             QObject::tr("Kapampangan")));
327 	m_langTable.append(LangDef("kdr",      "",         "Karaim",                  QObject::tr("Karaim")));
328 	m_langTable.append(LangDef("kaa",      "",         "Karakalpak",              QObject::tr("Karakalpak")));
329 	m_langTable.append(LangDef("krl",      "",         "Karelian",                QObject::tr("Karelian")));
330 	m_langTable.append(LangDef("kar",      "",         "Karen",                   QObject::tr("Karen")));
331 	m_langTable.append(LangDef("kfr",      "",         "Kachchi",                 QObject::tr("Kachchi")));
332 	m_langTable.append(LangDef("ks",       "",         "Kashmiri",                QObject::tr("Kashmiri")));
333 	m_langTable.append(LangDef("csb",      "",         "Kashubian",               QObject::tr("Kashubian")));
334 	m_langTable.append(LangDef("kyu",      "",         "Kayah",                   QObject::tr("Kayah")));
335 	m_langTable.append(LangDef("kk",       "",         "Kazakh",                  QObject::tr("Kazakh")));
336 	m_langTable.append(LangDef("kjh",      "",         "Khakass",                 QObject::tr("Khakass")));
337 	m_langTable.append(LangDef("kht",      "",         "Khamti",                  QObject::tr("Khamti")));
338 	m_langTable.append(LangDef("kha",      "",         "Khasi",                   QObject::tr("Khasi")));
339 	m_langTable.append(LangDef("km",       "",         "Khmer",                   QObject::tr("Khmer")));
340 	m_langTable.append(LangDef("khw",      "",         "Khowar",                  QObject::tr("Khowar")));
341 	m_langTable.append(LangDef("ki",       "",         "Kikuyu",                  QObject::tr("Kikuyu")));
342 	m_langTable.append(LangDef("sjd",      "",         "Kildin Sami",             QObject::tr("Kildin Sami")));
343 	m_langTable.append(LangDef("kmb",      "",         "Kimbundu",                QObject::tr("Kimbundu")));
344 	m_langTable.append(LangDef("rw",       "",         "Kinyarwanda",             QObject::tr("Kinyarwanda")));
345 	m_langTable.append(LangDef("mwk",      "",         "Kita Maninkakan",         QObject::tr("Kita Maninkakan")));
346 	m_langTable.append(LangDef("kex",      "",         "Kituba (Congo)",          QObject::tr("Kituba (Congo)")));
347 	m_langTable.append(LangDef("kex",      "",         "Kokni",                   QObject::tr("Kokni")));
348 	m_langTable.append(LangDef("ksh",      "",         "Kölsch",                  QObject::tr("K\303\266lsch")));
349 	m_langTable.append(LangDef("kv",       "",         "Komi",                    QObject::tr("Komi")));
350 	m_langTable.append(LangDef("koi",      "",         "Komi-Permyak",            QObject::tr("Komi-Permyak")));
351 	m_langTable.append(LangDef("kpv",      "",         "Komi-Zyrian",             QObject::tr("Komi-Zyrian")));
352 	m_langTable.append(LangDef("kmw",      "",         "Komo (Congo)",            QObject::tr("Komo (Congo)")));
353 	m_langTable.append(LangDef("xom",      "",         "Komo (Sudan)",            QObject::tr("Komo (Sudan)")));
354 	m_langTable.append(LangDef("kxc",      "",         "Komso",                   QObject::tr("Komso")));
355 	m_langTable.append(LangDef("kg",       "",         "Kongo",                   QObject::tr("Kongo")));
356 	m_langTable.append(LangDef("kok",      "",         "Konkani",                 QObject::tr("Konkani")));
357 	m_langTable.append(LangDef("kqy",      "",         "Koorete",                 QObject::tr("Koorete")));
358 	m_langTable.append(LangDef("ko",       "",         "Korean",                  QObject::tr("Korean")));
359 	m_langTable.append(LangDef("kpy",      "",         "Koryak",                  QObject::tr("Koryak")));
360 	m_langTable.append(LangDef("mku",      "",         "Konyanka Maninka",        QObject::tr("Konyanka Maninka")));
361 	m_langTable.append(LangDef("kpe",      "",         "Kpelle",                  QObject::tr("Kpelle")));
362 	m_langTable.append(LangDef("kri",      "",         "Krio",                    QObject::tr("Krio")));
363 	m_langTable.append(LangDef("kxu",      "",         "Kui (India)",             QObject::tr("Kui (India)")));
364 	m_langTable.append(LangDef("kvd",      "",         "Kui (Indonesia)",         QObject::tr("Kui (Indonesia)")));
365 	m_langTable.append(LangDef("kfy",      "",         "Kumaoni",                 QObject::tr("Kumaoni")));
366 	m_langTable.append(LangDef("kum",      "",         "Kumyk",                   QObject::tr("Kumyk")));
367 	m_langTable.append(LangDef("zum",      "",         "Kumzari",                 QObject::tr("Kumzari")));
368 	m_langTable.append(LangDef("ku",       "",         "Kurdish",                 QObject::tr("Kurdish")));
369 	m_langTable.append(LangDef("ckb",      "",         "Kurdish (Sorani)",        QObject::tr("Kurdish (Sorani)")));
370 	m_langTable.append(LangDef("kru",      "",         "Kurukh",                  QObject::tr("Kurukh")));
371 	m_langTable.append(LangDef("kdt",      "",         "Kuy",                     QObject::tr("Kuy")));
372 	m_langTable.append(LangDef("kj",       "",         "Kwanyama",                QObject::tr("Kwanyama")));
373 	m_langTable.append(LangDef("ky",       "",         "Kyrgyz",                  QObject::tr("Kyrgyz")));
374 	m_langTable.append(LangDef("lbj",      "",         "Ladakhi",                 QObject::tr("Ladakhi")));
375 	m_langTable.append(LangDef("lld",      "",         "Ladin",                   QObject::tr("Ladin")));
376 	m_langTable.append(LangDef("lad",      "",         "Ladino",                  QObject::tr("Ladino")));
377 	m_langTable.append(LangDef("lbe",      "",         "Lak",                     QObject::tr("Lak")));
378 	m_langTable.append(LangDef("lki",      "",         "Laki",                    QObject::tr("Laki")));
379 	m_langTable.append(LangDef("lmn",      "",         "Lambani",                 QObject::tr("Lambani")));
380 	m_langTable.append(LangDef("ljp",      "",         "Lampung Api",             QObject::tr("Lampung Api")));
381 	m_langTable.append(LangDef("lmo",      "",         "Lombard",                 QObject::tr("Lombard")));
382 	m_langTable.append(LangDef("lo",       "",         "Lao",                     QObject::tr("Lao")));
383 	m_langTable.append(LangDef("la",       "",         "Latin",                   QObject::tr("Latin")));
384 	m_langTable.append(LangDef("lv",       "",         "Latvian",                 QObject::tr("Latvian")));
385 	m_langTable.append(LangDef("lzz",      "",         "Laz",                     QObject::tr("Laz")));
386 	m_langTable.append(LangDef("lez",      "",         "Lezgi",                   QObject::tr("Lezgi")));
387 	m_langTable.append(LangDef("lij",      "",         "Ligurian",                QObject::tr("Ligurian")));
388 	m_langTable.append(LangDef("lif",      "",         "Limbu",                   QObject::tr("Limbu")));
389 	m_langTable.append(LangDef("li",       "",         "Limburgish",              QObject::tr("Limburgish")));
390 	m_langTable.append(LangDef("ln",       "",         "Lingala",                 QObject::tr("Lingala")));
391 	m_langTable.append(LangDef("lis",      "",         "Lisu",                    QObject::tr("Lisu")));
392 	m_langTable.append(LangDef("lt",       "lt_LT",    "Lithuanian",              QObject::tr("Lithuanian")));
393 	m_langTable.append(LangDef("jbo",      "",         "Lojban",                  QObject::tr("Lojban")));
394 	m_langTable.append(LangDef("ngl",      "",         "Lomwe",                   QObject::tr("Lomwe")));
395 	m_langTable.append(LangDef("nds",      "",         "Low German",              QObject::tr("Low German")));
396 	m_langTable.append(LangDef("mhr",      "",         "Low Mari",                QObject::tr("Low Mari")));
397 	m_langTable.append(LangDef("dsb",      "",         "Lower Sorbian",           QObject::tr("Lower Sorbian")));
398 	m_langTable.append(LangDef("lb",       "",         "Luxembourgish",           QObject::tr("Luxembourgish")));
399 	m_langTable.append(LangDef("khb",      "",         "Lü",                      QObject::tr("L\303\274")));
400 	m_langTable.append(LangDef("lua",      "",         "Luba-Kasai",              QObject::tr("Luba-Kasai")));
401 	m_langTable.append(LangDef("lu",       "",         "Luba-Katanga",            QObject::tr("Luba-Katanga")));
402 	m_langTable.append(LangDef("luo",      "",         "Luo (Kenya and Tanzania)",QObject::tr("Luo (Kenya and Tanzania)")));
403 	m_langTable.append(LangDef("lrc",      "",         "Luri (Northern)",         QObject::tr("Luri (Northern)")));
404 	m_langTable.append(LangDef("luz",      "",         "Luri (Southern)",         QObject::tr("Luri (Southern)")));
405 	m_langTable.append(LangDef("mk",       "",         "Macedonian",              QObject::tr("Macedonian")));
406 	m_langTable.append(LangDef("mad",      "",         "Madurese",                QObject::tr("Madurese")));
407 	m_langTable.append(LangDef("mag",      "",         "Magahi",                  QObject::tr("Magahi")));
408 	m_langTable.append(LangDef("knn",      "",         "Maharashtrian Konkani",   QObject::tr("Maharashtrian Konkani")));
409 	m_langTable.append(LangDef("mai",      "",         "Maithili",                QObject::tr("Maithili")));
410 	m_langTable.append(LangDef("mpe",      "",         "Majang",                  QObject::tr("Majang")));
411 	m_langTable.append(LangDef("mak",      "",         "Makasar",                 QObject::tr("Makasar")));
412 	m_langTable.append(LangDef("vmw",      "",         "Makhuwa",                 QObject::tr("Makhuwa")));
413 	m_langTable.append(LangDef("kde",      "",         "Makonde",                 QObject::tr("Makonde")));
414 	m_langTable.append(LangDef("ms",       "ms_MY",    "Malay",                   QObject::tr("Malay")));
415 	m_langTable.append(LangDef("mg",       "",         "Malagasy",                QObject::tr("Malagasy")));
416 	m_langTable.append(LangDef("ml",       "ml_IN",    "Malayalam",               QObject::tr("Malayalam")));
417 	m_langTable.append(LangDef("dv",       "",         "Maldivian",               QObject::tr("Maldivian")));
418 	m_langTable.append(LangDef("mdy",      "",         "Male (Ethiopia)",         QObject::tr("Male (Ethiopia)")));
419 	m_langTable.append(LangDef("mdc",      "",         "Male (Papua New Guinea)", QObject::tr("Male (Papua New Guinea)")));
420 	m_langTable.append(LangDef("mt",       "",         "Maltese",                 QObject::tr("Maltese")));
421 	m_langTable.append(LangDef("mi",       "",         "Maori",                   QObject::tr("Maori")));
422 	m_langTable.append(LangDef("man",      "",         "Manding",                 QObject::tr("Manding")));
423 	m_langTable.append(LangDef("mnc",      "",         "Manchu",                  QObject::tr("Manchu")));
424 	m_langTable.append(LangDef("mdr",      "",         "Mandar",                  QObject::tr("Mandar")));
425 	m_langTable.append(LangDef("mnk",      "",         "Mandinka",                QObject::tr("Mandinka")));
426 	m_langTable.append(LangDef("mni",      "",         "Manipuri",                QObject::tr("Manipuri")));
427 	m_langTable.append(LangDef("emk",      "",         "Maninkakan (Eastern)",    QObject::tr("Maninkakan (Eastern)")));
428 	m_langTable.append(LangDef("mlq",      "",         "Maninkakan (Western)",    QObject::tr("Maninkakan (Western)")));
429 	m_langTable.append(LangDef("mns",      "",         "Mansi",                   QObject::tr("Mansi")));
430 	m_langTable.append(LangDef("gv",       "",         "Manx",                    QObject::tr("Manx")));
431 	m_langTable.append(LangDef("mr",       "mr_IN",    "Marathi",                 QObject::tr("Marathi")));
432 	m_langTable.append(LangDef("mh",       "",         "Marshallese",             QObject::tr("Marshallese")));
433 	m_langTable.append(LangDef("mwr",      "",         "Marwari",                 QObject::tr("Marwari")));
434 	m_langTable.append(LangDef("mve",      "",         "Marwari (Pakistan)",      QObject::tr("Marwari (Pakistan)")));
435 	m_langTable.append(LangDef("mzn",      "",         "Mazanderani",             QObject::tr("Mazanderani")));
436 	m_langTable.append(LangDef("men",      "",         "Mende (Sierra Leone)",    QObject::tr("Mende (Sierra Leone)")));
437 	m_langTable.append(LangDef("mym",      "",         "Me'en",                   QObject::tr("Me'en")));
438 	m_langTable.append(LangDef("mer",      "",         "Meru",                    QObject::tr("Meru")));
439 	m_langTable.append(LangDef("wry",      "",         "Merwari",                 QObject::tr("Merwari")));
440 	m_langTable.append(LangDef("mtr",      "",         "Mewari",                  QObject::tr("Mewari")));
441 	m_langTable.append(LangDef("rwr",      "",         "Mewari (India)",          QObject::tr("Mewari (India)")));
442 	m_langTable.append(LangDef("wtm",      "",         "Mewati",                  QObject::tr("Mewati")));
443 	m_langTable.append(LangDef("min",      "",         "Minangkabau",             QObject::tr("Minangkabau")));
444 	m_langTable.append(LangDef("mwl",      "",         "Mirandese",               QObject::tr("Mirandese")));
445 	m_langTable.append(LangDef("lus",      "",         "Mizo",                    QObject::tr("Mizo")));
446 	m_langTable.append(LangDef("mnw",      "",         "Mon",                     QObject::tr("Mon")));
447 	m_langTable.append(LangDef("moh",      "",         "Mohawk",                  QObject::tr("Mohawk")));
448 	m_langTable.append(LangDef("mdf",      "",         "Moksha",                  QObject::tr("Moksha")));
449 	m_langTable.append(LangDef("mo",       "",         "Moldavian",               QObject::tr("Moldavian")));
450 	m_langTable.append(LangDef("mn_MN",    "",         "Mongolian",               QObject::tr("Mongolian")));
451 	m_langTable.append(LangDef("mfe",      "",         "Morisyen",                QObject::tr("Morisyen")));
452 	m_langTable.append(LangDef("mos",      "",         "Mossi",                   QObject::tr("Mossi")));
453 	m_langTable.append(LangDef("unr",      "",         "Mundari",                 QObject::tr("Mundari")));
454 	m_langTable.append(LangDef("nqo",      "",         "N'Ko",                    QObject::tr("N'Ko")));
455 	m_langTable.append(LangDef("nah",      "",         "Nahuatl",                 QObject::tr("Nahuatl")));
456 	m_langTable.append(LangDef("gld",      "",         "Nanai",                   QObject::tr("Nanai")));
457 	m_langTable.append(LangDef("nsk",      "",         "Naskapi",                 QObject::tr("Naskapi")));
458 	m_langTable.append(LangDef("na",       "",         "Nauru",                   QObject::tr("Nauru")));
459 	m_langTable.append(LangDef("nv",       "",         "Navajo",                  QObject::tr("Navajo")));
460 	m_langTable.append(LangDef("ndc",      "",         "Ndau",                    QObject::tr("Ndau")));
461 	m_langTable.append(LangDef("nd",       "",         "Ndebele North",           QObject::tr("North Ndebele")));
462 	m_langTable.append(LangDef("nr",       "",         "Ndebele South",           QObject::tr("South Ndebele")));
463 	m_langTable.append(LangDef("ng",       "",         "Ndonga",                  QObject::tr("Ndonga")));
464 	m_langTable.append(LangDef("nap",      "",         "Neapolitan",              QObject::tr("Neapolitan")));
465 	m_langTable.append(LangDef("ne_NP",    "",         "Nepali",                  QObject::tr("Nepali")));
466 	m_langTable.append(LangDef("new",      "",         "Newari",                  QObject::tr("Newari")));
467 	m_langTable.append(LangDef("nga",      "",         "Ngabaka",                 QObject::tr("Ngabaka")));
468 	m_langTable.append(LangDef("fuv",      "",         "Nigerian Fulfulde",       QObject::tr("Nigerian Fulfulde")));
469 	m_langTable.append(LangDef("noe",      "",         "Nimadi",                  QObject::tr("Nimadi")));
470 	m_langTable.append(LangDef("dap",      "",         "Nisi (India)",            QObject::tr("Nisi (India)")));
471 	m_langTable.append(LangDef("yso",      "",         "Nisi (China)",            QObject::tr("Nisi (China)")));
472 	m_langTable.append(LangDef("niu",      "",         "Niuean",                  QObject::tr("Niuean")));
473 	m_langTable.append(LangDef("nog",      "",         "Nogai",                   QObject::tr("Nogai")));
474 	m_langTable.append(LangDef("no",       "no_NO",    "Norwegian",               QObject::tr("Norwegian")));
475 	m_langTable.append(LangDef("nb",       "nb_NO",    "Norwegian (Bokmål)",      QObject::tr("Norwegian (Bokm\303\245l)")));
476 	m_langTable.append(LangDef("nn",       "nn_NO",    "Norwegian (Nynorsk)",     QObject::tr("Norwegian (Nynorsk)")));
477 	m_langTable.append(LangDef("nov",      "",         "Novial",                  QObject::tr("Novial")));
478 	m_langTable.append(LangDef("nym",      "",         "Nyamwezi",                QObject::tr("Nyamwezi")));
479 	m_langTable.append(LangDef("nyn",      "",         "Nyankole",                QObject::tr("Nyankole")));
480 	m_langTable.append(LangDef("ie",       "",         "Occidental",              QObject::tr("Occidental")));
481 	m_langTable.append(LangDef("oc",       "",         "Occitan (post 1500)",     QObject::tr("Occitan (post 1500)")));
482 	m_langTable.append(LangDef("oj",       "",         "Ojibwa",                  QObject::tr("Ojibwa")));
483 	m_langTable.append(LangDef("ojs",      "",         "Oji-Cree",                QObject::tr("Oji-Cree")));
484 	m_langTable.append(LangDef("om",       "",         "Oromo",                   QObject::tr("Oromo")));
485 	m_langTable.append(LangDef("or",       "or_IN",    "Oriya",                   QObject::tr("Oriya")));
486 	m_langTable.append(LangDef("os",       "",         "Ossetian",                QObject::tr("Ossetian")));
487 	m_langTable.append(LangDef("blk",      "",         "Pa'O",                    QObject::tr("Pa'O")));
488 	m_langTable.append(LangDef("pce",      "",         "Palaung (Ruching)",       QObject::tr("Palaung (Ruching)")));
489 	m_langTable.append(LangDef("pll",      "",         "Palaung (Shwe)",          QObject::tr("Palaung (Shwe)")));
490 	m_langTable.append(LangDef("pi",       "",         "Pali",                    QObject::tr("Pali")));
491 	m_langTable.append(LangDef("plp",      "",         "Palpa",                   QObject::tr("Palpa")));
492 	m_langTable.append(LangDef("pa",       "pa_IN",    "Panjabi",                 QObject::tr("Panjabi")));
493 	m_langTable.append(LangDef("pnb",      "",         "Panjabi Western",         QObject::tr("Panjabi Western")));
494 	m_langTable.append(LangDef("pag",      "",         "Pangasinan",              QObject::tr("Pangasinan")));
495 	m_langTable.append(LangDef("ps",       "",         "Pashto",                  QObject::tr("Pashto")));
496 	m_langTable.append(LangDef("pdc",      "",         "Pennsylvania German",     QObject::tr("Pennsylvania German")));
497 	m_langTable.append(LangDef("fa",       "",         "Persian",                 QObject::tr("Persian")));
498 	m_langTable.append(LangDef("fa_AF",    "",         "Persian (Afghanistan)",   QObject::tr("Persian (Afghanistan)")));
499 	m_langTable.append(LangDef("fa_IR",    "",         "Persian (Iran)",          QObject::tr("Persian")));
500 	m_langTable.append(LangDef("phk",      "",         "Phake",                   QObject::tr("Phake")));
501 	m_langTable.append(LangDef("pih",      "",         "Pitcairn-Norfolk",        QObject::tr("Pitcairn-Norfolk")));
502 	m_langTable.append(LangDef("pcd",      "",         "Picard",                  QObject::tr("Picard")));
503 	m_langTable.append(LangDef("pms",      "",         "Piedmontese",             QObject::tr("Piedmontese")));
504 	m_langTable.append(LangDef("pl",       "pl_PL",    "Polish",                  QObject::tr("Polish")));
505 	m_langTable.append(LangDef("pap",      "",         "Papiamento",              QObject::tr("Papiamento")));
506 	m_langTable.append(LangDef("pt",       "pt_PT",    "Portuguese",              QObject::tr("Portuguese")));
507 	m_langTable.append(LangDef("pt_BR",    "",         "Portuguese (BR)",         QObject::tr("Portuguese (BR)")));
508 	m_langTable.append(LangDef("kjp",      "",         "Pwo Eastern Karen",       QObject::tr("Pwo Eastern Karen")));
509 	m_langTable.append(LangDef("pwo",      "",         "Pwo Western Karen",       QObject::tr("Pwo Western Karen")));
510 	m_langTable.append(LangDef("bto",      "",         "Rinconada Bikol",         QObject::tr("Rinconada Bikol")));
511 	m_langTable.append(LangDef("qu",       "",         "Quechua",                 QObject::tr("Quechua")));
512 	m_langTable.append(LangDef("rki",      "",         "Rakhine",                 QObject::tr("Rakhine")));
513 	m_langTable.append(LangDef("raj",      "",         "Rajasthani",              QObject::tr("Rajasthani")));
514 	m_langTable.append(LangDef("rej",      "",         "Rejang",                  QObject::tr("Rejang")));
515 	m_langTable.append(LangDef("ria",      "",         "Riang (India)",           QObject::tr("Riang (India)")));
516 	m_langTable.append(LangDef("ril",      "",         "Riang (Myanmar)",         QObject::tr("Riang (Myanmar)")));
517 	m_langTable.append(LangDef("ro",       "",         "Romanian",                QObject::tr("Romanian")));
518 	m_langTable.append(LangDef("rm",       "",         "Romansh",                 QObject::tr("Romansh")));
519 	m_langTable.append(LangDef("rom",      "",         "Romany",                  QObject::tr("Romany")));
520 	m_langTable.append(LangDef("rn",       "",         "Rundi",                   QObject::tr("Rundi")));
521 	m_langTable.append(LangDef("ru",       "ru_RU",    "Russian",                 QObject::tr("Russian")));
522 	m_langTable.append(LangDef("bxr",      "ru_RU",    "Russian Buriat",          QObject::tr("Russian Buriat")));
523 	m_langTable.append(LangDef("rue",      "",         "Rusyn",                   QObject::tr("Rusyn")));
524 	m_langTable.append(LangDef("ksw",      "",         "S'gaw Karen",             QObject::tr("S'gaw Karen")));
525 	m_langTable.append(LangDef("sck",      "",         "Sadri",                   QObject::tr("Sadri")));
526 	m_langTable.append(LangDef("msc",      "",         "Sasak",                   QObject::tr("Sasak")));
527 	m_langTable.append(LangDef("sm",       "",         "Samoan",                  QObject::tr("Samoan")));
528 	m_langTable.append(LangDef("sgs",      "",         "Samogitian",              QObject::tr("Samogitian")));
529 	m_langTable.append(LangDef("se",       "",         "Sami (Northern)",         QObject::tr("Sami (Northern)")));
530 	m_langTable.append(LangDef("sma",      "",         "Sami (Southern)",         QObject::tr("Sami (Southern)")));
531 	m_langTable.append(LangDef("smj",      "",         "Sami (Lule)",             QObject::tr("Sami (Lule)")));
532 	m_langTable.append(LangDef("sms",      "",         "Sami (Skolt)",            QObject::tr("Sami (Skolt)")));
533 	m_langTable.append(LangDef("sg",       "",         "Sango",                   QObject::tr("Sango")));
534 	m_langTable.append(LangDef("msc",      "",         "Sankaran Maninka",        QObject::tr("Sankaran Maninka")));
535 	m_langTable.append(LangDef("sa",       "",         "Sanskrit",                QObject::tr("Sanskrit")));
536 	m_langTable.append(LangDef("sat",      "",         "Santali",                 QObject::tr("Santali")));
537 	m_langTable.append(LangDef("sc",       "",         "Sardinian",               QObject::tr("Sardinian")));
538 	m_langTable.append(LangDef("stq",      "",         "Saterfriesisch",          QObject::tr("Saterfriesisch")));
539 	m_langTable.append(LangDef("sco",      "",         "Scots",                   QObject::tr("Scots")));
540 	m_langTable.append(LangDef("gd",       "gd_GB",    "Scottish Gaelic",         QObject::tr("Scottish Gaelic")));
541 	m_langTable.append(LangDef("sgw",      "",         "Sebat Bet Gurage",        QObject::tr("Sebat Bet Gurage")));
542 	m_langTable.append(LangDef("sel",      "",         "Selkup",                  QObject::tr("Selkup")));
543 	m_langTable.append(LangDef("seh",      "",         "Sena",                    QObject::tr("Sena")));
544 	m_langTable.append(LangDef("skr",      "",         "Seraiki",                 QObject::tr("Seraiki")));
545 	m_langTable.append(LangDef("sr",       "",         "Serbian",                 QObject::tr("Serbian")));
546 	m_langTable.append(LangDef("sr-Latn",  "sr-Latn",  "Serbian (Latin)",         QObject::tr("Serbian (Latin)")));
547 	m_langTable.append(LangDef("shn",      "",         "Shan",                    QObject::tr("Shan")));
548 	m_langTable.append(LangDef("srr",      "",         "Serer",                   QObject::tr("Serer")));
549 	m_langTable.append(LangDef("swv",      "",         "Shekhawati",              QObject::tr("Shekhawati")));
550 	m_langTable.append(LangDef("sn",       "",         "Shona",                   QObject::tr("Shona")));
551 	m_langTable.append(LangDef("nco",      "",         "Sibe",                    QObject::tr("Sibe")));
552 	m_langTable.append(LangDef("scn",      "",         "Sicilian",                QObject::tr("Sicilian")));
553 	m_langTable.append(LangDef("sid",      "",         "Sidamo",                  QObject::tr("Sidamo")));
554 	m_langTable.append(LangDef("szl",      "",         "Silesian",                QObject::tr("Silesian")));
555 	m_langTable.append(LangDef("stv",      "",         "Silt'e",                  QObject::tr("Silt'e")));
556 	m_langTable.append(LangDef("sd",       "",         "Sindhi",                  QObject::tr("Sindhi")));
557 	m_langTable.append(LangDef("si",       "",         "Sinhala",                 QObject::tr("Sinhala")));
558 	m_langTable.append(LangDef("scs",      "",         "Slavey (North)",          QObject::tr("Slavey (North)")));
559 	m_langTable.append(LangDef("xsl",      "",         "Slavey (South)",          QObject::tr("Slavey (South)")));
560 	m_langTable.append(LangDef("sk",       "sk_SK",    "Slovak",                  QObject::tr("Slovak")));
561 	m_langTable.append(LangDef("sl",       "sl_SL",    "Slovenian",               QObject::tr("Slovenian")));
562 	m_langTable.append(LangDef("gru",      "",         "Sodo Gurage",             QObject::tr("Sodo Gurage")));
563 	m_langTable.append(LangDef("so",       "",         "Somali",                  QObject::tr("Somali")));
564 	m_langTable.append(LangDef("xog",      "",         "Soga",                    QObject::tr("Soga")));
565 	m_langTable.append(LangDef("sop",      "",         "Songe",                   QObject::tr("Songe")));
566 	m_langTable.append(LangDef("snk",      "",         "Soninke",                 QObject::tr("Soninke")));
567 	m_langTable.append(LangDef("nso",      "",         "Sotho Northern",          QObject::tr("Sotho Northern")));
568 	m_langTable.append(LangDef("st",       "",         "Sotho Southern",          QObject::tr("Sotho Southern")));
569 	m_langTable.append(LangDef("es",       "es_ES",    "Spanish",                 QObject::tr("Spanish")));
570 	m_langTable.append(LangDef("es",       "es_ANY",   "Spanish (Generic)",       QObject::tr("Spanish (Generic)")));
571 	m_langTable.append(LangDef("es_AR",    "",         "Spanish (Argentina)",     QObject::tr("Spanish (Argentina)")));
572 	m_langTable.append(LangDef("es_LA",    "",         "Spanish (Latin)",         QObject::tr("Spanish (Latin)")));
573 	m_langTable.append(LangDef("aii",      "",         "Swadaya Aramaic",         QObject::tr("Swadaya Aramaic")));
574 	m_langTable.append(LangDef("suk",      "",         "Sukama",                  QObject::tr("Sukama")));
575 	m_langTable.append(LangDef("su",       "",         "Sundanese",               QObject::tr("Sundanese")));
576 	m_langTable.append(LangDef("suq",      "",         "Suri",                    QObject::tr("Suri")));
577 	m_langTable.append(LangDef("sva",      "",         "Svan",                    QObject::tr("Svan")));
578 	m_langTable.append(LangDef("sw",       "",         "Swahili",                 QObject::tr("Swahili")));
579 	m_langTable.append(LangDef("sv",       "sv_SE",    "Swedish",                 QObject::tr("Swedish")));
580 	m_langTable.append(LangDef("sv_FI",    "",         "Swedish (Finland)",       QObject::tr("Swedish (Finland)")));
581 	m_langTable.append(LangDef("ss",       "",         "Swati",                   QObject::tr("Swati")));
582 	m_langTable.append(LangDef("syl",      "",         "Sylheti",                 QObject::tr("Sylheti")));
583 	m_langTable.append(LangDef("syr",      "",         "Syriac",                  QObject::tr("Syriac")));
584 	m_langTable.append(LangDef("tyz",      "",         "Tày",                     QObject::tr("T\303\240y")));
585 	m_langTable.append(LangDef("tab",      "",         "Tabasaran",               QObject::tr("Tabasaran")));
586 	m_langTable.append(LangDef("tl",       "",         "Tagalog",                 QObject::tr("Tagalog")));
587 	m_langTable.append(LangDef("ty",       "",         "Tahitian",                QObject::tr("Tahitian")));
588 	m_langTable.append(LangDef("tdd",      "",         "Tai Nüa",                 QObject::tr("Tai N\303\274a")));
589 	m_langTable.append(LangDef("tg",       "",         "Tajik",                   QObject::tr("Tajik")));
590 	m_langTable.append(LangDef("tmh",      "",         "Tamashek",                QObject::tr("Tamashek")));
591 	m_langTable.append(LangDef("ta",       "ta_IN",    "Tamil",                   QObject::tr("Tamil")));
592 	m_langTable.append(LangDef("tt",       "",         "Tatar",                   QObject::tr("Tatar")));
593 	m_langTable.append(LangDef("te",       "te_IN",    "Telugu",                  QObject::tr("Telugu")));
594 	m_langTable.append(LangDef("tem",      "",         "Temne",                   QObject::tr("Temne")));
595 	m_langTable.append(LangDef("tet",      "",         "Tetum",                   QObject::tr("Tetum")));
596 	m_langTable.append(LangDef("th",       "th_TH",    "Thai",                    QObject::tr("Thai")));
597 	m_langTable.append(LangDef("nod",      "",         "Thai Northern",           QObject::tr("Thai Northern")));
598 	m_langTable.append(LangDef("bo",       "",         "Tibetan",                 QObject::tr("Tibetan")));
599 	m_langTable.append(LangDef("tig",      "",         "Tigre",                   QObject::tr("Tigre")));
600 	m_langTable.append(LangDef("ti",       "",         "Tigrinya",                QObject::tr("Tigrinya")));
601 	m_langTable.append(LangDef("tiv",      "",         "Tiv",                     QObject::tr("Tiv")));
602 	m_langTable.append(LangDef("tpi",      "",         "Tok Pisin",               QObject::tr("Tok Pisin")));
603 	m_langTable.append(LangDef("to",       "",         "Tonga (Tonga Islands)",   QObject::tr("Tonga (Tonga Islands)")));
604 	m_langTable.append(LangDef("ts",       "",         "Tsonga",                  QObject::tr("Tsonga")));
605 	m_langTable.append(LangDef("tn",       "",         "Tswana",                  QObject::tr("Tswana")));
606 	m_langTable.append(LangDef("tcy",      "",         "Tulu",                    QObject::tr("Tulu")));
607 	m_langTable.append(LangDef("tum",      "",         "Tumbuka",                 QObject::tr("Tumbuka")));
608 	m_langTable.append(LangDef("tr",       "tr_TR",    "Turkish",                 QObject::tr("Turkish")));
609 	m_langTable.append(LangDef("tk",       "",         "Turkmen",                 QObject::tr("Turkmen")));
610 	m_langTable.append(LangDef("tru",      "",         "Turoyo Aramaic",          QObject::tr("Turoyo Aramaic")));
611 	m_langTable.append(LangDef("tyv",      "",         "Tuvin",                   QObject::tr("Tuvin")));
612 	m_langTable.append(LangDef("tw",       "",         "Twi",                     QObject::tr("Twi")));
613 	m_langTable.append(LangDef("uk",       "uk_UA",    "Ukranian",                QObject::tr("Ukranian")));
614 	m_langTable.append(LangDef("sxu",      "",         "Upper Saxon",             QObject::tr("Upper Saxon")));
615 	m_langTable.append(LangDef("hsb",      "",         "Upper Sorbian",           QObject::tr("Upper Sorbian")));
616 	m_langTable.append(LangDef("udm",      "",         "Udmurt",                  QObject::tr("Udmurt")));
617 	m_langTable.append(LangDef("ug",       "",         "Uighur",                  QObject::tr("Uighur")));
618 	m_langTable.append(LangDef("umb",      "",         "Umbundu",                 QObject::tr("Umbundu")));
619 	m_langTable.append(LangDef("ur",       "",         "Urdu",                    QObject::tr("Urdu")));
620 	m_langTable.append(LangDef("uk",       "",         "Ukrainian",               QObject::tr("Ukrainian")));
621 	m_langTable.append(LangDef("uz",       "",         "Uzbek",                   QObject::tr("Uzbek")));
622 	m_langTable.append(LangDef("uzn",      "",         "Uzbek (Northern)",        QObject::tr("Uzbek (Northern)")));
623 	m_langTable.append(LangDef("uzs",      "",         "Uzbek (Southern)",        QObject::tr("Uzbek (Southern)")));
624 	m_langTable.append(LangDef("ve",       "",         "Venda",                   QObject::tr("Venda")));
625 	m_langTable.append(LangDef("vec",      "",         "Venetian",                QObject::tr("Venetian")));
626 	m_langTable.append(LangDef("vi",       "",         "Vietnamese",              QObject::tr("Vietnamese")));
627 	m_langTable.append(LangDef("vls",      "",         "Vlaams",                  QObject::tr("Vlaams")));
628 	m_langTable.append(LangDef("rmy",      "",         "Vlax Romani",             QObject::tr("Vlax Romani")));
629 	m_langTable.append(LangDef("vo",       "",         "Volapük",                 QObject::tr("Volap\303\274k")));
630 	m_langTable.append(LangDef("vro",      "",         "Võro",                    QObject::tr("V\303\265ro")));
631 	m_langTable.append(LangDef("wbm",      "",         "Wa",                      QObject::tr("Wa")));
632 	m_langTable.append(LangDef("wbr",      "",         "Wagdi",                   QObject::tr("Wagdi")));
633 	m_langTable.append(LangDef("wa",       "",         "Walloon",                 QObject::tr("Walloon")));
634 	m_langTable.append(LangDef("war",      "",         "Waray (Philippines)",     QObject::tr("Waray (Philippines)")));
635 	m_langTable.append(LangDef("guc",      "cy_GB",    "Wayuu",                   QObject::tr("Wayuu")));
636 	m_langTable.append(LangDef("cy",       "cy_GB",    "Welsh",                   QObject::tr("Welsh")));
637 	m_langTable.append(LangDef("wle",      "",         "Wolane",                  QObject::tr("Wolane")));
638 	m_langTable.append(LangDef("wo",       "",         "Wolof",                   QObject::tr("Wolof")));
639 	m_langTable.append(LangDef("xwo",      "",         "Written Oirat (Todo)",    QObject::tr("Written Oirat (Todo)")));
640 	m_langTable.append(LangDef("xh",       "",         "Xhosa",                   QObject::tr("Xhosa")));
641 	m_langTable.append(LangDef("yao",      "",         "Yao",                     QObject::tr("Yao")));
642 	m_langTable.append(LangDef("sah",      "",         "Yakut",                   QObject::tr("Yakut")));
643 	m_langTable.append(LangDef("yi",       "",         "Yiddish",                 QObject::tr("Yiddish")));
644 	m_langTable.append(LangDef("yo",       "",         "Yoruba",                  QObject::tr("Yoruba")));
645 	m_langTable.append(LangDef("zne",      "",         "Zande",                   QObject::tr("Zande")));
646 	m_langTable.append(LangDef("dje",      "cy_GB",    "Zarma",                   QObject::tr("Zarma")));
647 	m_langTable.append(LangDef("zea",      "",         "Zeeuws",                  QObject::tr("Zeeuws")));
648 	m_langTable.append(LangDef("za",       "",         "Zhuang",                  QObject::tr("Zhuang")));
649 	m_langTable.append(LangDef("zu",       "",         "Zulu",                    QObject::tr("Zulu")));
650 }
651 
generateInstalledGUILangList()652 void LanguageManager::generateInstalledGUILangList()
653 {
654 	QString path = ScPaths::instance().translationDir();
655 	QString langAbbrev;
656 	QMap<QString, langPair>::Iterator it;
657 	QDir dir(path , "*.*", QDir::Name, QDir::Files | QDir::NoSymLinks);
658 	if (!dir.exists() || (dir.count() == 0))
659 		return;
660 
661 	for (uint i = 0; i < dir.count(); ++i)
662 	{
663 		QFileInfo file(path + dir[i]);
664 		if (file.suffix().toLower() != "qm")
665 			continue;
666 		langAbbrev = file.completeSuffix().remove(".qm");
667 		int j = langTableIndex(langAbbrev);
668 		if (j < 0)
669 			continue;
670 		m_langTable[j].m_transAvailable = true;
671 		m_langTable[j].m_transFile = file.absoluteFilePath();
672 		//qDebug()<<"Found installed GUI translation file:"<<langAbbrev<<" : "<<langTable[j].m_transFile<<langTable[j].m_transName;
673 	}
674 }
675 
generateInstalledHyphLangList()676 void LanguageManager::generateInstalledHyphLangList()
677 {
678 	QStringList dictionaryPaths;
679 	bool dictPathFound=findHyphDictionaries(dictionaryPaths);
680 	if (!dictPathFound)
681 	{
682 //		qDebug()<<"No preinstalled hyphenation dictonaries or paths found";
683 		return;
684 	}
685 	QMap<QString, QString> dictionaryMap;
686 	findHyphDictionarySets(dictionaryPaths, dictionaryMap);
687 	if (dictionaryMap.count() == 0)
688 		return;
689 
690 	QMap<QString, QString>::iterator it = dictionaryMap.begin();
691 //	qDebug()<<"Installed Hyphenation Dictonaries:";
692 	while (it != dictionaryMap.end())
693 	{
694 		int j = langTableIndex(it.key());
695 		if (j != -1)
696 		{
697 			m_langTable[j].m_hyphAvailable = true;
698 			m_langTable[j].m_hyphFile = it.value();
699 			//qDebug()<<"Found installed hyphenation dictionary:"<<it.key()<<" : "<<it.value();
700 		}
701 		++it;
702 	}
703 }
704 
generateInstalledSpellLangList()705 void LanguageManager::generateInstalledSpellLangList()
706 {
707 	QStringList dictionaryPaths;
708 	bool dictPathFound=findSpellingDictionaries(dictionaryPaths);
709 	if (!dictPathFound)
710 	{
711 		qDebug()<<"No preinstalled spelling dictonaries or paths found";
712 		return;
713 	}
714 	QMap<QString, QString> dictionaryMap;
715 	findSpellingDictionarySets(dictionaryPaths, dictionaryMap);
716 	if (dictionaryMap.count() == 0)
717 		return;
718 
719 	QMap<QString, QString>::iterator it = dictionaryMap.begin();
720 //	qDebug()<<"Installed Spelling Dictonaries:";
721 	while (it != dictionaryMap.end())
722 	{
723 		int j = langTableIndex(it.key());
724 		if (j != -1)
725 		{
726 			m_langTable[j].m_spellAvailable = true;
727 			m_langTable[j].m_spellFile = it.value();
728 //			qDebug()<<"Found installed spelling dictionary:"<<it.key()<<" : "<<it.value();
729 		}
730 		++it;
731 	}
732 }
733 
734 
735 
langTableIndex(const QString & abbrev)736 int LanguageManager::langTableIndex(const QString &abbrev)
737 {
738 //	qDebug()<<"langTableIndex: Trying to find:"<<abbrev;
739 	if (abbrev.isEmpty())
740 		return -1;
741 	for (int i = 0; i < m_langTable.size(); ++i)
742 	{
743 //		qDebug()<<abbrev<<langTable[i].m_priAbbrev<<langTable[i].m_altAbbrev;
744 		if (m_langTable[i].m_priAbbrev == abbrev || m_langTable[i].m_altAbbrev == abbrev)
745 			return i;
746 	}
747 	return -1;
748 }
749 
getLangFromAbbrev(QString langAbbrev,bool getTranslated)750 QString LanguageManager::getLangFromAbbrev(QString langAbbrev, bool getTranslated)
751 {
752 //	qDebug()<<"Trying to find:"<<langAbbrev;
753 	int i=langTableIndex(langAbbrev);
754 //	qDebug()<<"Index of"<<langAbbrev<<":"<<i;
755 	if (i==-1)
756 	{
757 		if (langAbbrev.length() > 5)
758 		{
759 			langAbbrev.truncate(5);
760 			i = langTableIndex(langAbbrev);
761 		}
762 	}
763 	if (i != -1)
764 	{
765 		if (getTranslated)
766 			return m_langTable[i].m_transName;
767 		return m_langTable[i].m_name;
768 	}
769 	//qDebug()<<langAbbrev<<"not found";
770 	return "";
771 }
772 
getAbbrevFromLang(const QString & lang,bool useInstalled)773 QString LanguageManager::getAbbrevFromLang(const QString& lang, bool useInstalled)
774 {
775 	for (int i = 0; i < m_langTable.size(); ++i)
776 	{
777 		if (useInstalled)
778 		{
779 			if (m_langTable[i].m_transAvailable && (m_langTable[i].m_name == lang || m_langTable[i].m_transName == lang))
780 				return m_langTable[i].m_priAbbrev;
781 		}
782 		else
783 		{
784 			//qDebug()<<lang<<langTable[i].m_priAbbrev<<langTable[i].m_name<<langTable[i].m_transName;
785 			if (m_langTable[i].m_name == lang || m_langTable[i].m_transName == lang)
786 				return m_langTable[i].m_priAbbrev;
787 		}
788 	}
789 	return "";
790 }
791 
getLangFromTransLang(const QString & transLang)792 QString LanguageManager::getLangFromTransLang(const QString& transLang)
793 {
794 	for (int i = 0; i < m_langTable.size(); ++i)
795 	{
796 		if (m_langTable[i].m_transName == transLang)
797 			return m_langTable[i].m_name;
798 	}
799 	return "";
800 }
801 
getTransLangFromLang(const QString & lang)802 QString LanguageManager::getTransLangFromLang(const QString& lang)
803 {
804 	for (int i = 0; i < m_langTable.size(); ++i)
805 	{
806 		if (m_langTable[i].m_name == lang)
807 			return m_langTable[i].m_transName;
808 	}
809 	return "";
810 }
811 
getShortAbbrevFromAbbrev(QString langAbbrev)812 QString LanguageManager::getShortAbbrevFromAbbrev(QString langAbbrev)
813 {
814 	//	qDebug()<<"Trying to find:"<<langAbbrev;
815 	int i = langTableIndex(langAbbrev);
816 	//	qDebug()<<"Index of"<<langAbbrev<<":"<<i;
817 	if (i == -1)
818 	{
819 		if (langAbbrev.length() > 5)
820 		{
821 			langAbbrev.truncate(5);
822 			i=langTableIndex(langAbbrev);
823 		}
824 	}
825 	if (i != -1)
826 		return m_langTable[i].m_priAbbrev;
827 	//qDebug()<<langAbbrev<<"not found";
828 	return "";
829 }
830 
getShortAbbrevFromAbbrevDecomposition(const QString & langAbbrev)831 QString LanguageManager::getShortAbbrevFromAbbrevDecomposition(const QString& langAbbrev)
832 {
833 	int tIndex = langTableIndex(langAbbrev);
834 	if (tIndex >= 0)
835 		return m_langTable[tIndex].m_priAbbrev;
836 
837 	QStringList abbrevs = getAbbrevDecomposition(langAbbrev);
838 	for (int i = 1; i < abbrevs.count(); ++i)
839 	{
840 		tIndex = langTableIndex(abbrevs.at(i));
841 		if (tIndex >= 0)
842 			return m_langTable[tIndex].m_priAbbrev;
843 	}
844 
845 	return "";
846 }
847 
getAlternativeAbbrevfromAbbrev(const QString & langAbbrev)848 QString LanguageManager::getAlternativeAbbrevfromAbbrev(const QString& langAbbrev)
849 {
850 	int i=langTableIndex(langAbbrev);
851 	if (i != -1)
852 		return m_langTable[i].m_altAbbrev;
853 	return "";
854 }
855 
getAbbrevDecomposition(const QString & langAbbrev)856 QStringList LanguageManager::getAbbrevDecomposition(const QString& langAbbrev)
857 {
858 	QStringList abbrevs;
859 	abbrevs.append(langAbbrev);
860 
861 	QString curAbbrev  = langAbbrev;
862 	QString delimiters = QString::fromLatin1("_.");
863 
864 	while (true)
865 	{
866 		int rightMost = 0;
867 		for (int i = 0; i < delimiters.length(); i++)
868 		{
869 			int k = curAbbrev.lastIndexOf(delimiters[i]);
870 			if (k > rightMost)
871 				rightMost = k;
872 		}
873 
874 		if (rightMost == 0)
875 			break;
876 
877 		curAbbrev.truncate(rightMost);
878 		abbrevs.append(curAbbrev);
879 	}
880 	return abbrevs;
881 }
882 
fillInstalledStringList(QStringList * stringListToFill)883 void LanguageManager::fillInstalledStringList(QStringList *stringListToFill)
884 {
885 	if (!stringListToFill)
886 		return;
887 	for (int i = 0; i < m_langTable.size(); ++i)
888 		stringListToFill->append(m_langTable[i].m_transName);
889 }
890 
fillInstalledGUIStringList(QStringList * stringListToFill)891 void LanguageManager::fillInstalledGUIStringList(QStringList *stringListToFill)
892 {
893 	if (!stringListToFill)
894 		return;
895 	for (int i = 0; i < m_langTable.size(); ++i)
896 	{
897 		if (m_langTable[i].m_transAvailable)
898 			stringListToFill->append(m_langTable[i].m_transName);
899 	}
900 }
901 
fillInstalledHyphStringList(QStringList * stringListToFill)902 void LanguageManager::fillInstalledHyphStringList(QStringList *stringListToFill)
903 {
904 	if (!stringListToFill)
905 		return;
906 	for (int i = 0; i < m_langTable.size(); ++i)
907 	{
908 		if (m_langTable[i].m_hyphAvailable)
909 			stringListToFill->append(m_langTable[i].m_transName);
910 	}
911 	stringListToFill->sort();
912 }
913 
fillInstalledSpellStringList(QStringList * stringListToFill)914 void LanguageManager::fillInstalledSpellStringList(QStringList *stringListToFill)
915 {
916 	if (!stringListToFill)
917 		return;
918 	for (int i = 0; i < m_langTable.size(); ++i)
919 	{
920 		if (m_langTable[i].m_spellAvailable)
921 			stringListToFill->append(m_langTable[i].m_transName);
922 	}
923 	stringListToFill->sort();
924 }
925 
isAvailableTranslation(QString langAbbrev)926 bool LanguageManager::isAvailableTranslation(QString langAbbrev)
927 {
928 	if (langAbbrev == "en" || langAbbrev == "en_GB")
929 		return true;
930 
931 	int i = langTableIndex(langAbbrev);
932 	if (i == -1)
933 	{
934 		if (langAbbrev.length() > 5)
935 		{
936 			langAbbrev.truncate(5);
937 			i = langTableIndex(langAbbrev);
938 		}
939 	}
940 	if (i !=-1)
941 		return m_langTable[i].m_transAvailable;
942 	return false;
943 }
944 
languageList(bool getTranslated)945 QStringList LanguageManager::languageList(bool getTranslated)
946 {
947 	QStringList sl;
948 	for (int i = 0; i < m_langTable.size(); ++i)
949 	{
950 		if (getTranslated)
951 			sl<<m_langTable[i].m_transName;
952 		else
953 			sl<<m_langTable[i].m_name;
954 	}
955 	sl.sort();
956 	return sl;
957 }
958 
printInstalledList()959 void LanguageManager::printInstalledList()
960 {
961 	QFile f;
962 	f.open(stderr, QIODevice::WriteOnly);
963 	QTextStream ts(&f);
964 	for (int i = 0; i < m_langTable.size(); ++i)
965 	{
966 		ts << "  " << m_langTable[i].m_priAbbrev.leftJustified(8) << ": " << m_langTable[i].m_name;
967 		Qt::endl(ts);
968 	}
969 	Qt::endl(ts);
970 	f.close();
971 }
972 
numericSequence(const QString & seq)973 QString LanguageManager::numericSequence(const QString& seq)
974 {
975 	QString retSeq;
976 	const int nsBengali=0,nsDevanagari=1,nsGujarati=2,nsGurumukhi=3,nsKannada=4,nsMalayalam=5,nsOriya=6,nsTamil=7,nsTelugu=8,nsTibetan=9,nsLepcha=10;
977 	switch (1)
978 	{
979 		case nsBengali:
980 			retSeq += "";
981 			break;
982 		case nsDevanagari:
983 			retSeq += "०१२३४५६७८९";
984 			break;
985 		case nsGujarati:
986 			retSeq += "૦૧૨૩૪૫૬૭૮૯";
987 			break;
988 		case nsGurumukhi:
989 			retSeq += "੦੧੨੩੪੫੬੭੮੯";
990 			break;
991 		case nsKannada:
992 			retSeq += "";
993 			break;
994 		case nsMalayalam:
995 			retSeq += "";
996 			break;
997 		case nsOriya:
998 			retSeq += "";
999 			break;
1000 		case nsTamil:
1001 			retSeq += "";
1002 			break;
1003 		case nsTelugu:
1004 			retSeq += "";
1005 			break;
1006 		case nsTibetan:
1007 			retSeq += "";
1008 			break;
1009 		case nsLepcha:
1010 			retSeq += "";
1011 			break;
1012 		default:
1013 			retSeq="0123456789";
1014 			break;
1015 	}
1016 	return retSeq;
1017 }
1018 
findSpellingDictionaries(QStringList & sl)1019 bool LanguageManager::findSpellingDictionaries(QStringList &sl)
1020 {
1021 	sl=ScPaths::instance().spellDirs();
1022 	return sl.count() != 0;
1023 }
1024 
findSpellingDictionarySets(QStringList & dictionaryPaths,QMap<QString,QString> & dictionaryMap)1025 void LanguageManager::findSpellingDictionarySets(QStringList &dictionaryPaths, QMap<QString, QString> &dictionaryMap)
1026 {
1027 	for (int i = 0; i<dictionaryPaths.count(); ++i)
1028 	{
1029 		// Find the dic and aff files in the location
1030 		QDir dictLocation(dictionaryPaths.at(i));
1031 		QStringList dictFilters("*.dic");
1032 		QStringList dictList(dictLocation.entryList(dictFilters, QDir::Files, QDir::Name));
1033 		dictList.replaceInStrings(".dic","");
1034 
1035 		//Ensure we have aff+dic file pairs, remove any hyphenation dictionaries from the list
1036 		for (const QString& dictName : qAsConst(dictList))
1037 		{
1038 			if (!QFile::exists(dictionaryPaths.at(i) + dictName + ".aff"))
1039 			{
1040 				dictList.removeAll(dictName);
1041 				continue;
1042 			}
1043 
1044 			if (dictionaryMap.contains(dictName))
1045 				continue;
1046 
1047 			if (dictName.length() <= 5)
1048 			{
1049 				//QString shortAbbrev(LanguageManager::getShortAbbrevFromAbbrev(dictName));
1050 				//qDebug()<<"findSpellingDictionarySets"<<dictName<<shortAbbrev;
1051 				dictionaryMap.insert(dictName, dictionaryPaths.at(i)+dictName);
1052 				//dictionaryMap.insert(shortAbbrev, dictionaryPaths.at(i)+dictName);
1053 			}
1054 			//qDebug()<<"Spell Finder:"<<dictName<<dictionaryPaths.at(i)+dictName;
1055 			if (dictName.length() > 5)
1056 			{
1057 				QString shortAbbrev(LanguageManager::getShortAbbrevFromAbbrev(dictName));
1058 				//qDebug()<<shortAbbrev;
1059 				dictionaryMap.insert(shortAbbrev, dictionaryPaths.at(i)+dictName);
1060 			}
1061 		}
1062 //		qDebug()<<"Number of dictionaries/AFFs found in"<<dictionaryPaths.at(i)<<":"<<dictList.count();
1063 	}
1064 	//Now rescan dictionary map for any extra languages we can support with the files we have
1065 	QMap<QString, QString>::iterator it = dictionaryMap.begin();
1066 	while (it != dictionaryMap.end())
1067 	{
1068 		QString lang(it.key());
1069 		if (lang.length() == 5)
1070 		{
1071 			QString shortAbbrev(LanguageManager::getShortAbbrevFromAbbrev(lang));
1072 			if (!dictionaryMap.contains(shortAbbrev))
1073 			{
1074 				//qDebug()<<"Adding extra spelling definitions for:"<<lang<<":"<<shortAbbrev;
1075 				dictionaryMap.insert(shortAbbrev, it.value());
1076 			}
1077 			//else
1078 				//qDebug()<<"Short abbreviation:"<<shortAbbrev<<"already exists for:"<<lang;
1079 		}
1080 		if (lang.length() == 2)
1081 		{
1082 			QString altAbbrev(LanguageManager::getAlternativeAbbrevfromAbbrev(lang));
1083 			if (!dictionaryMap.contains(altAbbrev))
1084 			{
1085 				//qDebug()<<"Adding extra spelling definitions for:"<<lang<<":"<<altAbbrev;
1086 				dictionaryMap.insert(altAbbrev, it.value());
1087 			}
1088 			//else
1089 				//qDebug()<<"Alt. abbreviation:"<<altAbbrev<<"already exists for:"<<lang;
1090 		}
1091 		++it;
1092 	}
1093 }
1094 
findHyphDictionaries(QStringList & sl)1095 bool LanguageManager::findHyphDictionaries(QStringList& sl)
1096 {
1097 	sl=ScPaths::instance().hyphDirs();
1098 	return sl.count() != 0;
1099 }
1100 
findHyphDictionarySets(QStringList & dictionaryPaths,QMap<QString,QString> & dictionaryMap)1101 void LanguageManager::findHyphDictionarySets(QStringList& dictionaryPaths, QMap<QString, QString>& dictionaryMap)
1102 {
1103 	for (int i = 0; i<dictionaryPaths.count(); ++i)
1104 	{
1105 		// Find the dic and aff files in the location
1106 		QDir dictLocation(dictionaryPaths.at(i));
1107 		QStringList dictFilters("hyph*.dic");
1108 		if (dictionaryPaths.at(i)==ScPaths::userDictDir(ScPaths::Hyph, false))
1109 			dictFilters.append("*.dic");
1110 		QStringList dictList(dictLocation.entryList(dictFilters, QDir::Files, QDir::Name));
1111 		dictList.replaceInStrings(".dic","");
1112 
1113 		for (const QString& dn : qAsConst(dictList))
1114 		{
1115 //			qDebug()<<dn;
1116 			QString dictName;
1117 			if (dn.startsWith("hyph_"))
1118 				dictName = dn.section('_',1);
1119 			else
1120 				dictName = dn;
1121 			if (dictionaryMap.contains(dictName))
1122 				continue;
1123 			if (dictName.length() <= 2)
1124 			{
1125 				dictionaryMap.insert(dictName, dictionaryPaths.at(i)+dn+".dic");
1126 			}
1127 			if (dictName.length() > 2)
1128 			{
1129 				QString shortAbbrev(LanguageManager::getShortAbbrevFromAbbrev(dictName));
1130 				dictionaryMap.insert(shortAbbrev, dictionaryPaths.at(i)+dn+".dic");
1131 			}
1132 		}
1133 	}
1134 }
1135 
~LanguageManager()1136 LanguageManager::~LanguageManager()
1137 {
1138 	m_langTable.clear();
1139 }
1140 
getHyphFilename(const QString & langAbbrev)1141 QString LanguageManager::getHyphFilename(const QString & langAbbrev)
1142 {
1143 	int j = langTableIndex(langAbbrev);
1144 	if (j != -1 && m_langTable[j].m_hyphAvailable)
1145 	{
1146 //		qDebug()<<"Found requested hyphenation dictionary:"<<langAbbrev<<" : "<<langTable[j].m_hyphFile;
1147 		return m_langTable[j].m_hyphFile;
1148 	}
1149 	return QString();
1150 }
1151 
1152