1 /*
2     SPDX-FileCopyrightText: 2007-2009 Sergio Pistone <sergio_pistone@yahoo.com.ar>
3     SPDX-FileCopyrightText: 2010-2018 Mladen Milinkovic <max@smoothware.net>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #include "languagecode.h"
9 
10 #include <QMap>
11 #include <QLocale>
12 
13 #include <KLocalizedString>
14 
15 QString
toIso2(const QString & iso3Code)16 LanguageCode::toIso2(const QString &iso3Code)
17 {
18 	static QMap<QString, QString> map;
19 	if(map.isEmpty()) {
20 		map["aar"] = "aa";
21 		map["abk"] = "ab";
22 		map["afr"] = "af";
23 		map["aka"] = "ak";
24 		map["alb"] = "sq";
25 		map["amh"] = "am";
26 		map["ara"] = "ar";
27 		map["arg"] = "an";
28 		map["arm"] = "hy";
29 		map["asm"] = "as";
30 		map["ava"] = "av";
31 		map["ave"] = "ae";
32 		map["aym"] = "ay";
33 		map["aze"] = "az";
34 		map["bak"] = "ba";
35 		map["bam"] = "bm";
36 		map["baq"] = "eu";
37 		map["bel"] = "be";
38 		map["ben"] = "bn";
39 		map["bih"] = "bh";
40 		map["bis"] = "bi";
41 		map["bos"] = "bs";
42 		map["bre"] = "br";
43 		map["bul"] = "bg";
44 		map["bur"] = "my";
45 		map["cat"] = "ca";
46 		map["cha"] = "ch";
47 		map["che"] = "ce";
48 		map["chi"] = "zh";
49 		map["chu"] = "cu";
50 		map["chv"] = "cv";
51 		map["cor"] = "kw";
52 		map["cos"] = "co";
53 		map["cre"] = "cr";
54 		map["cze"] = "cs";
55 		map["dan"] = "da";
56 		map["div"] = "dv";
57 		map["dut"] = "nl";
58 		map["dzo"] = "dz";
59 		map["eng"] = "en";
60 		map["epo"] = "eo";
61 		map["est"] = "et";
62 		map["ewe"] = "ee";
63 		map["fao"] = "fo";
64 		map["fij"] = "fj";
65 		map["fin"] = "fi";
66 		map["fre"] = "fr";
67 		map["fry"] = "fy";
68 		map["ful"] = "ff";
69 		map["geo"] = "ka";
70 		map["ger"] = "de";
71 		map["gla"] = "gd";
72 		map["gle"] = "ga";
73 		map["glg"] = "gl";
74 		map["glv"] = "gv";
75 		map["gre"] = "el";
76 		map["grn"] = "gn";
77 		map["guj"] = "gu";
78 		map["hat"] = "ht";
79 		map["hau"] = "ha";
80 		map["heb"] = "he";
81 		map["her"] = "hz";
82 		map["hin"] = "hi";
83 		map["hmo"] = "ho";
84 		map["hrv"] = "hr";
85 		map["hun"] = "hu";
86 		map["ibo"] = "ig";
87 		map["ice"] = "is";
88 		map["ido"] = "io";
89 		map["iii"] = "ii";
90 		map["iku"] = "iu";
91 		map["ile"] = "ie";
92 		map["ina"] = "ia";
93 		map["ind"] = "id";
94 		map["ipk"] = "ik";
95 		map["ita"] = "it";
96 		map["jav"] = "jv";
97 		map["jpn"] = "ja";
98 		map["kal"] = "kl";
99 		map["kan"] = "kn";
100 		map["kas"] = "ks";
101 		map["kau"] = "kr";
102 		map["kaz"] = "kk";
103 		map["khm"] = "km";
104 		map["kik"] = "ki";
105 		map["kin"] = "rw";
106 		map["kir"] = "ky";
107 		map["kom"] = "kv";
108 		map["kon"] = "kg";
109 		map["kor"] = "ko";
110 		map["kua"] = "kj";
111 		map["kur"] = "ku";
112 		map["lao"] = "lo";
113 		map["lat"] = "la";
114 		map["lav"] = "lv";
115 		map["lim"] = "li";
116 		map["lin"] = "ln";
117 		map["lit"] = "lt";
118 		map["ltz"] = "lb";
119 		map["lub"] = "lu";
120 		map["lug"] = "lg";
121 		map["mac"] = "mk";
122 		map["mah"] = "mh";
123 		map["mal"] = "ml";
124 		map["mao"] = "mi";
125 		map["mar"] = "mr";
126 		map["may"] = "ms";
127 		map["mlg"] = "mg";
128 		map["mlt"] = "mt";
129 		map["mon"] = "mn";
130 		map["nau"] = "na";
131 		map["nav"] = "nv";
132 		map["nbl"] = "nr";
133 		map["nde"] = "nd";
134 		map["ndo"] = "ng";
135 		map["nep"] = "ne";
136 		map["nno"] = "nn";
137 		map["nob"] = "nb";
138 		map["nor"] = "no";
139 		map["nya"] = "ny";
140 		map["oci"] = "oc";
141 		map["oji"] = "oj";
142 		map["ori"] = "or";
143 		map["orm"] = "om";
144 		map["oss"] = "os";
145 		map["pan"] = "pa";
146 		map["per"] = "fa";
147 		map["pli"] = "pi";
148 		map["pol"] = "pl";
149 		map["por"] = "pt";
150 		map["pus"] = "ps";
151 		map["que"] = "qu";
152 		map["roh"] = "rm";
153 		map["rum"] = "ro";
154 		map["run"] = "rn";
155 		map["rus"] = "ru";
156 		map["sag"] = "sg";
157 		map["san"] = "sa";
158 		map["sin"] = "si";
159 		map["slo"] = "sk";
160 		map["slv"] = "sl";
161 		map["sme"] = "se";
162 		map["smo"] = "sm";
163 		map["sna"] = "sn";
164 		map["snd"] = "sd";
165 		map["som"] = "so";
166 		map["sot"] = "st";
167 		map["spa"] = "es";
168 		map["srd"] = "sc";
169 		map["srp"] = "sr";
170 		map["ssw"] = "ss";
171 		map["sun"] = "su";
172 		map["swa"] = "sw";
173 		map["swe"] = "sv";
174 		map["tah"] = "ty";
175 		map["tam"] = "ta";
176 		map["tat"] = "tt";
177 		map["tel"] = "te";
178 		map["tgk"] = "tg";
179 		map["tgl"] = "tl";
180 		map["tha"] = "th";
181 		map["tib"] = "bo";
182 		map["tir"] = "ti";
183 		map["ton"] = "to";
184 		map["tsn"] = "tn";
185 		map["tso"] = "ts";
186 		map["tuk"] = "tk";
187 		map["tur"] = "tr";
188 		map["twi"] = "tw";
189 		map["uig"] = "ug";
190 		map["ukr"] = "uk";
191 		map["urd"] = "ur";
192 		map["uzb"] = "uz";
193 		map["ven"] = "ve";
194 		map["vie"] = "vi";
195 		map["vol"] = "vo";
196 		map["wel"] = "cy";
197 		map["wln"] = "wa";
198 		map["wol"] = "wo";
199 		map["xho"] = "xh";
200 		map["yid"] = "yi";
201 		map["yor"] = "yo";
202 		map["zha"] = "za";
203 		map["zul"] = "zu";
204 	}
205 
206 	return map.contains(iso3Code) ? map[iso3Code] : QString();
207 }
208 
209 QString
toIso3(const QString & iso2Code)210 LanguageCode::toIso3(const QString &iso2Code)
211 {
212 	static QMap<QString, QString> map;
213 	if(map.isEmpty()) {
214 		map["aa"] = "aar";
215 		map["ab"] = "abk";
216 		map["ae"] = "ave";
217 		map["af"] = "afr";
218 		map["ak"] = "aka";
219 		map["am"] = "amh";
220 		map["an"] = "arg";
221 		map["ar"] = "ara";
222 		map["as"] = "asm";
223 		map["av"] = "ava";
224 		map["ay"] = "aym";
225 		map["az"] = "aze";
226 		map["ba"] = "bak";
227 		map["be"] = "bel";
228 		map["bg"] = "bul";
229 		map["bh"] = "bih";
230 		map["bi"] = "bis";
231 		map["bm"] = "bam";
232 		map["bn"] = "ben";
233 		map["bo"] = "tib";
234 		map["br"] = "bre";
235 		map["bs"] = "bos";
236 		map["ca"] = "cat";
237 		map["ce"] = "che";
238 		map["ch"] = "cha";
239 		map["co"] = "cos";
240 		map["cr"] = "cre";
241 		map["cs"] = "cze";
242 		map["cu"] = "chu";
243 		map["cv"] = "chv";
244 		map["cy"] = "wel";
245 		map["da"] = "dan";
246 		map["de"] = "ger";
247 		map["dv"] = "div";
248 		map["dz"] = "dzo";
249 		map["ee"] = "ewe";
250 		map["el"] = "gre";
251 		map["en"] = "eng";
252 		map["eo"] = "epo";
253 		map["es"] = "spa";
254 		map["et"] = "est";
255 		map["eu"] = "baq";
256 		map["fa"] = "per";
257 		map["ff"] = "ful";
258 		map["fi"] = "fin";
259 		map["fj"] = "fij";
260 		map["fo"] = "fao";
261 		map["fr"] = "fre";
262 		map["fy"] = "fry";
263 		map["ga"] = "gle";
264 		map["gd"] = "gla";
265 		map["gl"] = "glg";
266 		map["gn"] = "grn";
267 		map["gu"] = "guj";
268 		map["gv"] = "glv";
269 		map["ha"] = "hau";
270 		map["he"] = "heb";
271 		map["hi"] = "hin";
272 		map["ho"] = "hmo";
273 		map["hr"] = "hrv";
274 		map["ht"] = "hat";
275 		map["hu"] = "hun";
276 		map["hy"] = "arm";
277 		map["hz"] = "her";
278 		map["ia"] = "ina";
279 		map["id"] = "ind";
280 		map["ie"] = "ile";
281 		map["ig"] = "ibo";
282 		map["ii"] = "iii";
283 		map["ik"] = "ipk";
284 		map["io"] = "ido";
285 		map["is"] = "ice";
286 		map["it"] = "ita";
287 		map["iu"] = "iku";
288 		map["ja"] = "jpn";
289 		map["jv"] = "jav";
290 		map["ka"] = "geo";
291 		map["kg"] = "kon";
292 		map["ki"] = "kik";
293 		map["kj"] = "kua";
294 		map["kk"] = "kaz";
295 		map["kl"] = "kal";
296 		map["km"] = "khm";
297 		map["kn"] = "kan";
298 		map["ko"] = "kor";
299 		map["kr"] = "kau";
300 		map["ks"] = "kas";
301 		map["ku"] = "kur";
302 		map["kv"] = "kom";
303 		map["kw"] = "cor";
304 		map["ky"] = "kir";
305 		map["la"] = "lat";
306 		map["lb"] = "ltz";
307 		map["lg"] = "lug";
308 		map["li"] = "lim";
309 		map["ln"] = "lin";
310 		map["lo"] = "lao";
311 		map["lt"] = "lit";
312 		map["lu"] = "lub";
313 		map["lv"] = "lav";
314 		map["mg"] = "mlg";
315 		map["mh"] = "mah";
316 		map["mi"] = "mao";
317 		map["mk"] = "mac";
318 		map["ml"] = "mal";
319 		map["mn"] = "mon";
320 		map["mr"] = "mar";
321 		map["ms"] = "may";
322 		map["mt"] = "mlt";
323 		map["my"] = "bur";
324 		map["na"] = "nau";
325 		map["nb"] = "nob";
326 		map["nd"] = "nde";
327 		map["ne"] = "nep";
328 		map["ng"] = "ndo";
329 		map["nl"] = "dut";
330 		map["nn"] = "nno";
331 		map["no"] = "nor";
332 		map["nr"] = "nbl";
333 		map["nv"] = "nav";
334 		map["ny"] = "nya";
335 		map["oc"] = "oci";
336 		map["oj"] = "oji";
337 		map["om"] = "orm";
338 		map["or"] = "ori";
339 		map["os"] = "oss";
340 		map["pa"] = "pan";
341 		map["pi"] = "pli";
342 		map["pl"] = "pol";
343 		map["ps"] = "pus";
344 		map["pt"] = "por";
345 		map["qu"] = "que";
346 		map["rm"] = "roh";
347 		map["rn"] = "run";
348 		map["ro"] = "rum";
349 		map["ru"] = "rus";
350 		map["rw"] = "kin";
351 		map["sa"] = "san";
352 		map["sc"] = "srd";
353 		map["sd"] = "snd";
354 		map["se"] = "sme";
355 		map["sg"] = "sag";
356 		map["si"] = "sin";
357 		map["sk"] = "slo";
358 		map["sl"] = "slv";
359 		map["sm"] = "smo";
360 		map["sn"] = "sna";
361 		map["so"] = "som";
362 		map["sq"] = "alb";
363 		map["sr"] = "srp";
364 		map["ss"] = "ssw";
365 		map["st"] = "sot";
366 		map["su"] = "sun";
367 		map["sv"] = "swe";
368 		map["sw"] = "swa";
369 		map["ta"] = "tam";
370 		map["te"] = "tel";
371 		map["tg"] = "tgk";
372 		map["th"] = "tha";
373 		map["ti"] = "tir";
374 		map["tk"] = "tuk";
375 		map["tl"] = "tgl";
376 		map["tn"] = "tsn";
377 		map["to"] = "ton";
378 		map["tr"] = "tur";
379 		map["ts"] = "tso";
380 		map["tt"] = "tat";
381 		map["tw"] = "twi";
382 		map["ty"] = "tah";
383 		map["ug"] = "uig";
384 		map["uk"] = "ukr";
385 		map["ur"] = "urd";
386 		map["uz"] = "uzb";
387 		map["ve"] = "ven";
388 		map["vi"] = "vie";
389 		map["vo"] = "vol";
390 		map["wa"] = "wln";
391 		map["wo"] = "wol";
392 		map["xh"] = "xho";
393 		map["yi"] = "yid";
394 		map["yo"] = "yor";
395 		map["za"] = "zha";
396 		map["zh"] = "chi";
397 		map["zu"] = "zul";
398 	}
399 
400 	return map.contains(iso2Code) ? map[iso2Code] : QString();
401 }
402 
403 QString
nameFromIso2(const QString & iso2Code)404 LanguageCode::nameFromIso2(const QString &iso2Code)
405 {
406 	QString name = QLocale::languageToString(QLocale(iso2Code).language());
407 	return name.isEmpty() ? i18n("Unknown") : name;
408 }
409 
410 QString
nameFromIso3(const QString & iso3Code)411 LanguageCode::nameFromIso3(const QString &iso3Code)
412 {
413 	return nameFromIso2(toIso2(iso3Code));
414 }
415 
416 /*static*/ QString
nameFromIso(const QString & isoCode)417 LanguageCode::nameFromIso(const QString &isoCode)
418 {
419 	return nameFromIso2(isoCode.length() == 2 ? isoCode : toIso2(isoCode));
420 }
421