Krita Source Code Documentation
Loading...
Searching...
No Matches
KoWritingSystemUtils.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
7#include <QRegExp>
8
9static QMap<QFontDatabase::WritingSystem, QString> WRITINGSYSTEM_SCRIPT_MAP {
10 {{QFontDatabase::Any},{"Zyyy"}},
11 {{QFontDatabase::Latin},{"Latn"}},
12 {{QFontDatabase::Greek},{"Grek"}},
13 {{QFontDatabase::Cyrillic},{"Cyrl"}},
14 {{QFontDatabase::Armenian},{"Armn"}},
15 {{QFontDatabase::Hebrew},{"Hebr"}},
16 {{QFontDatabase::Arabic},{"Arab"}},
17 {{QFontDatabase::Syriac},{"Syrc"}},
18 {{QFontDatabase::Thaana},{"Thaa"}},
19 {{QFontDatabase::Devanagari},{"Deva"}},
20 {{QFontDatabase::Bengali},{"Beng"}},
21 {{QFontDatabase::Gurmukhi},{"Guru"}},
22 {{QFontDatabase::Gujarati},{"Gujr"}},
23 {{QFontDatabase::Oriya},{"Orya"}},
24 {{QFontDatabase::Tamil},{"Taml"}},
25 {{QFontDatabase::Telugu},{"Telu"}},
26 {{QFontDatabase::Kannada},{"Knda"}},
27 {{QFontDatabase::Malayalam},{"Mylm"}},
28 {{QFontDatabase::Sinhala},{"Sinh"}},
29 {{QFontDatabase::Thai},{"Thai"}},
30 {{QFontDatabase::Lao},{"Laoo"}},
31 {{QFontDatabase::Tibetan},{"Tibt"}},
32 {{QFontDatabase::Myanmar},{"Mymr"}},
33 {{QFontDatabase::Georgian},{"Geor"}},
34 {{QFontDatabase::Khmer},{"Khmr"}},
35 {{QFontDatabase::SimplifiedChinese},{"Hans"}},
36 {{QFontDatabase::TraditionalChinese},{"Hant"}},
37 {{QFontDatabase::Japanese},{"Jpan"}},
38 {{QFontDatabase::Korean},{"Kore"}},
39 {{QFontDatabase::Ogham},{"Ogam"}},
40 {{QFontDatabase::Runic},{"Runr"}},
41 {{QFontDatabase::Nko},{"Nkoo"}},
42 /*{{QFontDatabase::Symbol},{"Zsye"}}, Symbol refers to the wingdings fonts, not actually unicode scripts.*/
43 {{QFontDatabase::Vietnamese},{"Latn"}},
44};
45
46static QMap<QLocale::Script, QString> QLOCALE_SCRIPT_MAP {
47 {{QLocale::LatinScript},{"Latn"}},
48 {{QLocale::GreekScript},{"Grek"}},
49 {{QLocale::CyrillicScript},{"Cyrl"}},
50 {{QLocale::ArmenianScript},{"Armn"}},
51 {{QLocale::HebrewScript},{"Hebr"}},
52 {{QLocale::ArabicScript},{"Arab"}},
53 {{QLocale::SyriacScript},{"Syrc"}},
54 {{QLocale::ThaanaScript},{"Thaa"}},
55 {{QLocale::DevanagariScript},{"Deva"}},
56 {{QLocale::BengaliScript},{"Beng"}},
57 {{QLocale::GurmukhiScript},{"Guru"}},
58 {{QLocale::GujaratiScript},{"Gujr"}},
59 {{QLocale::OriyaScript},{"Orya"}},
60 {{QLocale::TamilScript},{"Taml"}},
61 {{QLocale::TeluguScript},{"Telu"}},
62 {{QLocale::KannadaScript},{"Knda"}},
63 {{QLocale::MalayalamScript},{"Mylm"}},
64 {{QLocale::SinhalaScript},{"Sinh"}},
65 {{QLocale::ThaiScript},{"Thai"}},
66 {{QLocale::LaoScript},{"Laoo"}},
67 {{QLocale::TibetanScript},{"Tibt"}},
68 {{QLocale::MyanmarScript},{"Mymr"}},
69 {{QLocale::GeorgianScript},{"Geor"}},
70 {{QLocale::KhmerScript},{"Khmr"}},
71 {{QLocale::SimplifiedChineseScript},{"Hans"}},
72 {{QLocale::TraditionalChineseScript},{"Hant"}},
73 {{QLocale::JapaneseScript},{"Jpan"}},
74 {{QLocale::KoreanScript},{"Kore"}},
75 {{QLocale::OghamScript},{"Ogam"}},
76 {{QLocale::RunicScript},{"Runr"}},
77 {{QLocale::NkoScript},{"Nkoo"}},
78
79 {{QLocale::DeseretScript},{"Dsrt"}},
80 {{QLocale::MongolianScript},{"Mong"}},
81 {{QLocale::TifinaghScript},{"Tfng"}},
82 {{QLocale::CherokeeScript},{"Cher"}},
83 {{QLocale::EthiopicScript},{"Ethi"}},
84 {{QLocale::YiScript},{"Yiii"}},
85 {{QLocale::VaiScript},{"Vaii"}},
86 {{QLocale::AvestanScript},{"Avst"}},
87 {{QLocale::BalineseScript},{"Bali"}},
88 {{QLocale::BamumScript},{"Bamu"}},
89 {{QLocale::BopomofoScript},{"Bopo"}},
90 {{QLocale::BrahmiScript},{"Brah"}},
91 {{QLocale::BugineseScript},{"Bugi"}},
92 {{QLocale::BuhidScript},{"Buhd"}},
93 {{QLocale::CanadianAboriginalScript},{"Cans"}},
94 {{QLocale::CarianScript},{"Cari"}},
95 {{QLocale::ChakmaScript},{"Cakm"}},
96 {{QLocale::ChamScript},{"Cham"}},
97 {{QLocale::CopticScript},{"Copt"}},
98 {{QLocale::CypriotScript},{"Cprt"}},
99 {{QLocale::EgyptianHieroglyphsScript},{"Egyp"}},
100 {{QLocale::FraserScript},{"Lisu"}},
101 {{QLocale::GlagoliticScript},{"Glag"}},
102 {{QLocale::GothicScript},{"Goth"}},
103 {{QLocale::HanScript},{"Hani"}},
104 {{QLocale::HangulScript},{"Hang"}},
105 {{QLocale::HanunooScript},{"Hano"}},
106 {{QLocale::ImperialAramaicScript},{"Armi"}},
107 {{QLocale::InscriptionalPahlaviScript},{"Phli"}},
108 {{QLocale::InscriptionalParthianScript},{"Prti"}},
109 {{QLocale::JavaneseScript},{"Java"}},
110 {{QLocale::KaithiScript},{"Kthi"}},
111 {{QLocale::KatakanaScript},{"Kana"}},
112 {{QLocale::KayahLiScript},{"Kali"}},
113 {{QLocale::KharoshthiScript},{"Khar"}},
114 {{QLocale::LannaScript},{"Lana"}},
115 {{QLocale::LepchaScript},{"Lepc"}},
116 {{QLocale::LimbuScript},{"Limb"}},
117 {{QLocale::LinearBScript},{"Linb"}},
118 {{QLocale::LycianScript},{"Lyci"}},
119 {{QLocale::LydianScript},{"Lydi"}},
120 {{QLocale::MandaeanScript},{"Mand"}},
121 {{QLocale::MeiteiMayekScript},{"Mtei"}},
122 {{QLocale::MeroiticScript},{"Mero"}},
123 {{QLocale::MeroiticCursiveScript},{"Merc"}},
124 {{QLocale::NewTaiLueScript},{"Talu"}},
125 {{QLocale::OlChikiScript},{"Olck"}},
126 {{QLocale::OldItalicScript},{"Ital"}},
127 {{QLocale::OldPersianScript},{"Xpeo"}},
128 {{QLocale::OldSouthArabianScript},{"Sarb"}},
129 {{QLocale::OrkhonScript},{"Orkh"}},
130 {{QLocale::OsmanyaScript},{"Osma"}},
131 {{QLocale::PhagsPaScript},{"Phag"}},
132 {{QLocale::PhoenicianScript},{"Phnx"}},
133 {{QLocale::PollardPhoneticScript},{"Plrd"}},
134 {{QLocale::RejangScript},{"Rjng"}},
135 {{QLocale::SamaritanScript},{"Samr"}},
136 {{QLocale::SaurashtraScript},{"Saur"}},
137 {{QLocale::SharadaScript},{"Shrd"}},
138 {{QLocale::ShavianScript},{"Shaw"}},
139 {{QLocale::SoraSompengScript},{"Sora"}},
140 {{QLocale::CuneiformScript},{"Xsux"}},
141 {{QLocale::SundaneseScript},{"Sund"}},
142 {{QLocale::SylotiNagriScript},{"Sylo"}},
143 {{QLocale::TagalogScript},{"Tglg"}},
144 {{QLocale::TagbanwaScript},{"Tagb"}},
145 {{QLocale::TaiLeScript},{"Tale"}},
146 {{QLocale::TaiVietScript},{"Tavt"}},
147 {{QLocale::TakriScript},{"Takr"}},
148 {{QLocale::UgariticScript},{"Ugar"}},
149 {{QLocale::BrailleScript},{"Brai"}},
150 {{QLocale::HiraganaScript},{"Hira"}},
151 {{QLocale::CaucasianAlbanianScript},{"Aghb"}},
152 {{QLocale::BassaVahScript},{"Bass"}},
153 {{QLocale::DuployanScript},{"Dupl"}},
154 {{QLocale::ElbasanScript},{"Elba"}},
155 {{QLocale::GranthaScript},{"Gran"}},
156 {{QLocale::PahawhHmongScript},{"Hmng"}},
157 {{QLocale::KhojkiScript},{"Khoi"}},
158 {{QLocale::LinearAScript},{"Lina"}},
159 {{QLocale::MahajaniScript},{"Mahj"}},
160 {{QLocale::ManichaeanScript},{"Mani"}},
161 {{QLocale::MendeKikakuiScript},{"Mend"}},
162 {{QLocale::ModiScript},{"Modi"}},
163 {{QLocale::MroScript},{"Mroo"}},
164 {{QLocale::OldNorthArabianScript},{"Narb"}},
165 {{QLocale::NabataeanScript},{"Nbat"}},
166 {{QLocale::PalmyreneScript},{"Palm"}},
167 {{QLocale::PauCinHauScript},{"Pauc"}},
168 {{QLocale::PsalterPahlaviScript},{"Phlp"}},
169 {{QLocale::KhudawadiScript},{"Sind"}},
170 {{QLocale::TirhutaScript},{"Tirh"}},
171 {{QLocale::VarangKshitiScript},{"Wara"}},
172 {{QLocale::AhomScript},{"Ahom"}},
173 {{QLocale::AnatolianHieroglyphsScript},{"Hluw"}},
174 {{QLocale::HatranScript},{"Hatr"}},
175 {{QLocale::MultaniScript},{"Mult"}},
176 {{QLocale::OldHungarianScript},{"Hung"}},
177 {{QLocale::SignWritingScript},{"Sgnw"}},
178 {{QLocale::AdlamScript},{"Adlm"}},
179 {{QLocale::BhaiksukiScript},{"Bhks"}},
180 {{QLocale::BatakScript},{"Batk"}},
181 {{QLocale::MarchenScript},{"Marc"}},
182 {{QLocale::NewaScript},{"Newa"}},
183 {{QLocale::OsageScript},{"Osge"}},
184 {{QLocale::TangutScript},{"Tang"}},
185 {{QLocale::HanWithBopomofoScript},{"Hanb"}},
186 {{QLocale::JamoScript},{"Jamo"}},
187};
188
189static QMap<QChar::Script, QString> QCHAR_SCRIPT_MAP {
190 {{QChar::Script_Latin},{"Latn"}},
191 {{QChar::Script_Greek},{"Grek"}},
192 {{QChar::Script_Cyrillic},{"Cyrl"}},
193 {{QChar::Script_Armenian},{"Armn"}},
194 {{QChar::Script_Hebrew},{"Hebr"}},
195 {{QChar::Script_Arabic},{"Arab"}},
196 {{QChar::Script_Syriac},{"Syrc"}},
197 {{QChar::Script_Thaana},{"Thaa"}},
198 {{QChar::Script_Devanagari},{"Deva"}},
199 {{QChar::Script_Bengali},{"Beng"}},
200 {{QChar::Script_Gurmukhi},{"Guru"}},
201 {{QChar::Script_Gujarati},{"Gujr"}},
202 {{QChar::Script_Oriya},{"Orya"}},
203 {{QChar::Script_Tamil},{"Taml"}},
204 {{QChar::Script_Telugu},{"Telu"}},
205 {{QChar::Script_Kannada},{"Knda"}},
206 {{QChar::Script_Malayalam},{"Mylm"}},
207 {{QChar::Script_Sinhala},{"Sinh"}},
208 {{QChar::Script_Thai},{"Thai"}},
209 {{QChar::Script_Lao},{"Laoo"}},
210 {{QChar::Script_Tibetan},{"Tibt"}},
211 {{QChar::Script_Myanmar},{"Mymr"}},
212 {{QChar::Script_Georgian},{"Geor"}},
213 {{QChar::Script_Khmer},{"Khmr"}},
214 {{QChar::Script_Ogham},{"Ogam"}},
215 {{QChar::Script_Runic},{"Runr"}},
216 {{QChar::Script_Nko},{"Nkoo"}},
217
218 {{QChar::Script_Deseret},{"Dsrt"}},
219 {{QChar::Script_Mongolian},{"Mong"}},
220 {{QChar::Script_Tifinagh},{"Tfng"}},
221 {{QChar::Script_Cherokee},{"Cher"}},
222 {{QChar::Script_Ethiopic},{"Ethi"}},
223 {{QChar::Script_Yi},{"Yiii"}},
224 {{QChar::Script_Vai},{"Vaii"}},
225 {{QChar::Script_Avestan},{"Avst"}},
226 {{QChar::Script_Balinese},{"Bali"}},
227 {{QChar::Script_Bamum},{"Bamu"}},
228 {{QChar::Script_Bopomofo},{"Bopo"}},
229 {{QChar::Script_Brahmi},{"Brah"}},
230 {{QChar::Script_Buginese},{"Bugi"}},
231 {{QChar::Script_Buhid},{"Buhd"}},
232 {{QChar::Script_CanadianAboriginal},{"Cans"}},
233 {{QChar::Script_Carian},{"Cari"}},
234 {{QChar::Script_Chakma},{"Cakm"}},
235 {{QChar::Script_Cham},{"Cham"}},
236 {{QChar::Script_Coptic},{"Copt"}},
237 {{QChar::Script_Cypriot},{"Cprt"}},
238 {{QChar::Script_EgyptianHieroglyphs},{"Egyp"}},
239 {{QChar::Script_Lisu},{"Lisu"}},
240 {{QChar::Script_Glagolitic},{"Glag"}},
241 {{QChar::Script_Gothic},{"Goth"}},
242 {{QChar::Script_Han},{"Hani"}},
243 {{QChar::Script_Hangul},{"Hang"}},
244 {{QChar::Script_Hanunoo},{"Hano"}},
245 {{QChar::Script_ImperialAramaic},{"Armi"}},
246 {{QChar::Script_InscriptionalPahlavi},{"Phli"}},
247 {{QChar::Script_InscriptionalParthian},{"Prti"}},
248 {{QChar::Script_Javanese},{"Java"}},
249 {{QChar::Script_Kaithi},{"Kthi"}},
250 {{QChar::Script_Katakana},{"Kana"}},
251 {{QChar::Script_KayahLi},{"Kali"}},
252 {{QChar::Script_Kharoshthi},{"Khar"}},
253 {{QChar::Script_TaiTham}, {"Lana"}},
254 {{QChar::Script_Lepcha},{"Lepc"}},
255 {{QChar::Script_Limbu},{"Limb"}},
256 {{QChar::Script_LinearB},{"Linb"}},
257 {{QChar::Script_Lycian},{"Lyci"}},
258 {{QChar::Script_Lydian},{"Lydi"}},
259 {{QChar::Script_Mandaic},{"Mand"}},
260 {{QChar::Script_MeeteiMayek},{"Mtei"}},
261 {{QChar::Script_MeroiticHieroglyphs},{"Mero"}},
262 {{QChar::Script_MeroiticCursive},{"Merc"}},
263 {{QChar::Script_NewTaiLue},{"Talu"}},
264 {{QChar::Script_OlChiki},{"Olck"}},
265 {{QChar::Script_OldItalic},{"Ital"}},
266 {{QChar::Script_OldPersian},{"Xpeo"}},
267 {{QChar::Script_OldSouthArabian},{"Sarb"}},
268 {{QChar::Script_OldTurkic},{"Orkh"}},
269 {{QChar::Script_Osmanya},{"Osma"}},
270 {{QChar::Script_PhagsPa},{"Phag"}},
271 {{QChar::Script_Phoenician},{"Phnx"}},
272 {{QChar::Script_Miao},{"Plrd"}},
273 {{QChar::Script_Rejang},{"Rjng"}},
274 {{QChar::Script_Samaritan},{"Samr"}},
275 {{QChar::Script_Saurashtra},{"Saur"}},
276 {{QChar::Script_Sharada},{"Shrd"}},
277 {{QChar::Script_Shavian},{"Shaw"}},
278 {{QChar::Script_SoraSompeng},{"Sora"}},
279 {{QChar::Script_Cuneiform},{"Xsux"}},
280 {{QChar::Script_Sundanese},{"Sund"}},
281 {{QChar::Script_SylotiNagri},{"Sylo"}},
282 {{QChar::Script_Tagalog},{"Tglg"}},
283 {{QChar::Script_Tagbanwa},{"Tagb"}},
284 {{QChar::Script_TaiLe},{"Tale"}},
285 {{QChar::Script_TaiViet},{"Tavt"}},
286 {{QChar::Script_Takri},{"Takr"}},
287 {{QChar::Script_Ugaritic},{"Ugar"}},
288 {{QChar::Script_Braille},{"Brai"}},
289 {{QChar::Script_Hiragana},{"Hira"}},
290 {{QChar::Script_CaucasianAlbanian},{"Aghb"}},
291 {{QChar::Script_BassaVah},{"Bass"}},
292 {{QChar::Script_Duployan},{"Dupl"}},
293 {{QChar::Script_Elbasan},{"Elba"}},
294 {{QChar::Script_Grantha},{"Gran"}},
295 {{QChar::Script_PahawhHmong},{"Hmng"}},
296 {{QChar::Script_Khojki},{"Khoi"}},
297 {{QChar::Script_LinearA},{"Lina"}},
298 {{QChar::Script_Mahajani},{"Mahj"}},
299 {{QChar::Script_Manichaean},{"Mani"}},
300 {{QChar::Script_MendeKikakui},{"Mend"}},
301 {{QChar::Script_Modi},{"Modi"}},
302 {{QChar::Script_Mro},{"Mroo"}},
303 {{QChar::Script_OldNorthArabian},{"Narb"}},
304 {{QChar::Script_Nabataean},{"Nbat"}},
305 {{QChar::Script_Palmyrene},{"Palm"}},
306 {{QChar::Script_PauCinHau},{"Pauc"}},
307 {{QChar::Script_PsalterPahlavi},{"Phlp"}},
308 {{QChar::Script_Khudawadi},{"Sind"}},
309 {{QChar::Script_Tirhuta},{"Tirh"}},
310 {{QChar::Script_WarangCiti},{"Wara"}},
311 {{QChar::Script_Ahom},{"Ahom"}},
312 {{QChar::Script_AnatolianHieroglyphs},{"Hluw"}},
313 {{QChar::Script_Hatran},{"Hatr"}},
314 {{QChar::Script_Multani},{"Mult"}},
315 {{QChar::Script_OldHungarian},{"Hung"}},
316 {{QChar::Script_SignWriting},{"Sgnw"}},
317 {{QChar::Script_Adlam},{"Adlm"}},
318 {{QChar::Script_Bhaiksuki},{"Bhks"}},
319 {{QChar::Script_Batak},{"Batk"}},
320 {{QChar::Script_Marchen},{"Marc"}},
321 {{QChar::Script_Newa},{"Newa"}},
322 {{QChar::Script_Osage},{"Osge"}},
323 {{QChar::Script_Tangut},{"Tang"}},
324
325 {{QChar::Script_MasaramGondi},{"Gonm"}},
326 {{QChar::Script_Nushu},{"Nshu"}},
327 {{QChar::Script_Soyombo},{"Soyo"}},
328 {{QChar::Script_ZanabazarSquare},{"Zanb"}},
329
330 {{QChar::Script_Dogra},{"Dogr"}},
331 {{QChar::Script_GunjalaGondi},{"Gong"}},
332 {{QChar::Script_HanifiRohingya},{"Rogh"}},
333 {{QChar::Script_Makasar},{"Maka"}},
334 {{QChar::Script_Medefaidrin},{"Medf"}},
335 {{QChar::Script_OldSogdian},{"Sogo"}},
336 {{QChar::Script_Sogdian},{"Sogd"}},
337 {{QChar::Script_Elymaic},{"Elym"}},
338 {{QChar::Script_Nandinagari},{"Nand"}},
339 {{QChar::Script_NyiakengPuachueHmong},{"Hmnp"}},
340 {{QChar::Script_Wancho},{"Wcho"}},
341
342 {{QChar::Script_Chorasmian},{"Chrs"}},
343 {{QChar::Script_DivesAkuru},{"Diak"}},
344 {{QChar::Script_KhitanSmallScript},{"Kits"}},
345 {{QChar::Script_Yezidi},{"Yezi"}},
346};
347
348QString KoWritingSystemUtils::scriptTagForWritingSystem(QFontDatabase::WritingSystem system) {
349 return WRITINGSYSTEM_SCRIPT_MAP.value(system);
350}
351
352QFontDatabase::WritingSystem KoWritingSystemUtils::writingSystemForScriptTag(const QString &tag)
353{
354 return WRITINGSYSTEM_SCRIPT_MAP.key(tag, QFontDatabase::Any);
355}
356
358{
359 return QLOCALE_SCRIPT_MAP.value(script);
360}
361
362QLocale::Script KoWritingSystemUtils::scriptForScriptTag(const QString &tag)
363{
364 return QLOCALE_SCRIPT_MAP.key(tag, QLocale::AnyScript);
365}
366
368{
369 return QCHAR_SCRIPT_MAP.value(script);
370}
371
372QChar::Script KoWritingSystemUtils::qCharScriptForScriptTag(const QString &tag)
373{
374 return QCHAR_SCRIPT_MAP.key(tag, QChar::Script_Unknown);
375}
376
377#include <QDebug>
378QMap<QString, QString> KoWritingSystemUtils::samples()
379{
380 QMap <QString, QString> samples;
381 // Also add simplified latin sample. By doing this first, it'll fall back nicely.
382 samples.insert("AaBbGg", "s_Latn");
383
384 // Some symbol samples...
385 samples.insert("\u263A\u2764\u2693\U0001F308", "s_Zsye"); // Emoji
386 samples.insert("∆∅∞≠", "s_Zmth"); // Some math operators
387 samples.insert("𝄞𝅘𝅥𝅮𝄿𝄻", "s_Zsym"); // Musical notes
388 samples.insert("←↕↝↴", "s_Zsym"); // Arrows
389 for (int i = 0; i < QFontDatabase::WritingSystemsCount; i++) {
390 QFontDatabase::WritingSystem w = QFontDatabase::WritingSystem(i);
391 if (w == QFontDatabase::WritingSystem::Any) continue;
392
393 if (w == QFontDatabase::WritingSystem::Vietnamese) {
394 samples.insert(QFontDatabase::writingSystemSample(QFontDatabase::Vietnamese),
395 "l_vi");
396 } else {
397 samples.insert(QFontDatabase::writingSystemSample(w),
398 "s_"+WRITINGSYSTEM_SCRIPT_MAP.value(w, "Zyyy"));
399 }
400 }
401
402 return samples;
403}
404
405QString KoWritingSystemUtils::sampleTagForQLocale(const QLocale &locale)
406{
407 const QLocale vietnamese(QLocale::Vietnamese, QLocale::LatinScript, QLocale::AnyCountry);
408
409 if (locale == vietnamese) {
410 return "l_vi";
411 }
412
413 return "s_"+QLOCALE_SCRIPT_MAP.value(locale.script(), "Zyyy");
414}
415
416// There's a number of tags that are kept around for compatibility.
417const QMap<QString, QString> grandFathered = {
418 {"art-lojban", "jbo"},
419 {"cel-gaulish", "xcg"}, // could also be xga or xtg
420 {"en-GB-oed", "en-GB-oxendict"},
421 {"i-ami", "ami"},
422 {"i-default", ""},
423 {"i-enochian", "i-enochian"},
424 {"i-hak", "hak"},
425 {"i-lux", "lb"},
426 {"i-mingo", "i-mingo"},
427 {"i-navajo", "nv"},
428 {"i-pwn", "pwn"},
429 {"i-tao", "tao"},
430 {"i-tay", "tay"},
431 {"i-tsu", "tsu"},
432 {"no-bok", "nb"},
433 {"no-nyn", "nn"},
434 {"sgn-BE-FR", "sfb"},
435 {"sgn-BE-NL", "vgt"},
436 {"sgn-CH-DE", "sgg"},
437 {"zh-guoyu", "cmn"},
438 {"zh-hakka", "hak"},
439 {"zh-min", "cdo"}, // This one could also be cpx, czo, mnp, or nan
440 {"zh-min-nan", "nan"},
441 {"zh-xiang", "hsn"},
442};
443
445{
446 Bcp47Locale bcp;
447
448 QStringList tags = grandFathered.value(locale, locale).split("-");
449
450 if (tags.isEmpty()) return bcp;
451
452 const QRegExp alphas("[A-Z]+", Qt::CaseInsensitive);
453 const QRegExp digits("[\\d]+");
454
455 // Language -- single primary language, followed by optional 3 letter extended tags.
456 if (tags.first().size() == 2 || tags.first().size() == 3) {
457 bcp.languageTags.append(tags.takeFirst().toLower());
458
459 // extensions only happen when first tag is 2 or 3 long.
460 while (!tags.isEmpty() && tags.first().size() == 3 && alphas.exactMatch(tags.first())) {
461 bcp.languageTags.append(tags.takeFirst().toLower());
462 }
463 } else if (tags.first().size() >= 4 || tags.first().size() <= 8) {
464 // 4 alpha is reserved for future use and 5-8 is also legit, but practically doesn't exist...
465 bcp.languageTags.append(tags.takeFirst().toLower());
466 } else if (tags.first() == "i" && tags.size() > 0) {
467 QString total = tags.takeFirst();
468 total += "-"+tags.takeFirst();
469 bcp.languageTags.append(total.toLower());
470 }
471
472 if (tags.isEmpty()) return bcp;
473
474 // Script -- This is an 4 letter alpha only.
475
476 if (alphas.exactMatch(tags.first()) && tags.first().size() == 4) {
477 bcp.scriptTag = tags.takeFirst().toLower();
478 bcp.scriptTag = bcp.scriptTag.at(0).toUpper()+bcp.scriptTag.mid(1);
479 }
480
481 if (tags.isEmpty()) return bcp;
482
483 // Region -- 2 letter alpha only.
484
485 if ((alphas.exactMatch(tags.first()) && tags.first().size() == 2)
486 || (digits.exactMatch(tags.first()) && tags.first().size() == 3)) {
487 bcp.regionTag = tags.takeFirst().toUpper();
488 }
489
490 if (tags.isEmpty()) return bcp;
491
492 // Variants -- [0+] alpha numerics, either between 5-8 char long, or 4 but starting with a digit.
493
494 const QRegExp variantAlphaNumeric("\\d[a-z0-9]{3}", Qt::CaseInsensitive);
495
496 while (!tags.isEmpty()
497 && ( (tags.first().size() >= 5 && tags.first().size() <= 8)
498 || (variantAlphaNumeric.exactMatch(tags.first()) && tags.first().size() == 4) )
499 ) {
500 bcp.variantTags.append(tags.takeFirst().toLower());
501 }
502
503 if (tags.isEmpty()) return bcp;
504 // extension and private use subtags. Each starts with a single letter to indicate the extension type.
505
506 QStringList currentExtension;
507 while (!tags.isEmpty()) {
508 if (!currentExtension.isEmpty() && tags.first().size() == 1) {
509 if (currentExtension.first() == "x") {
510 bcp.privateUseTags.append(currentExtension.join("-"));
511 } else {
512 bcp.extensionTags.append(currentExtension.join("-"));
513 }
514 currentExtension.clear();
515 }
516 currentExtension.append(tags.takeFirst().toLower());
517 }
518
519 if (!currentExtension.isEmpty()) {
520 if (currentExtension.first() == "x") {
521 bcp.privateUseTags.append(currentExtension.join("-"));
522 } else {
523 bcp.extensionTags.append(currentExtension.join("-"));
524 }
525 }
526
527 return bcp;
528}
529
531{
532 return QLocale(locale.toPosixLocaleFormat());
533}
534
536{
538}
539
541{
542 return !languageTags.isEmpty() && !languageTags.first().isEmpty();
543}
544
546{
547 // A Posix locale format is "language[_script][_territory][.codeset][@modifier]".
548
549 if (!isValid()) return QString();
550
551 QString posix;
552
553 posix = languageTags.first();
554
555 if (!scriptTag.isEmpty() && scriptTag.size() == 4) {
556 posix.append("_");
557 // Title case.
558 posix.append(scriptTag);
559 }
560
561 if (!regionTag.isEmpty()) {
562 posix.append("_");
563 posix.append(regionTag.toUpper());
564 }
565
566 // Not writing @modifier for now...
567
568 return posix;
569}
570
572{
573 QStringList total;
574
575 total.append(languageTags);
576 if (!scriptTag.isEmpty()) {
577 total.append(scriptTag);
578 }
579 if (!regionTag.isEmpty()) {
580 total.append(regionTag);
581 }
582 total.append(variantTags);
583 total.append(extensionTags);
584 total.append(privateUseTags);
585
586 return total.join("-");
587}
static QMap< QChar::Script, QString > QCHAR_SCRIPT_MAP
static QMap< QFontDatabase::WritingSystem, QString > WRITINGSYSTEM_SCRIPT_MAP
static QMap< QLocale::Script, QString > QLOCALE_SCRIPT_MAP
const QMap< QString, QString > grandFathered
static QString scriptTagForQCharScript(QChar::Script script)
static QLocale::Script scriptForScriptTag(const QString &tag)
static QString sampleTagForQLocale(const QLocale &locale)
static QString scriptTagForQLocaleScript(QLocale::Script script)
static QFontDatabase::WritingSystem writingSystemForScriptTag(const QString &tag)
static QMap< QString, QString > samples()
static QString scriptTagForWritingSystem(QFontDatabase::WritingSystem system)
static Bcp47Locale parseBcp47Locale(const QString &locale)
static QLocale localeFromBcp47Locale(const Bcp47Locale &locale)
static QChar::Script qCharScriptForScriptTag(const QString &tag)
The Bcp47Locale class This holds a parsed BCP47 locale. QLocale is primarily made for POSIX locale fo...