BibleTime
language.cpp
Go to the documentation of this file.
1/*********
2*
3* In the name of the Father, and of the Son, and of the Holy Spirit.
4*
5* This file is part of BibleTime's source code, https://bibletime.info/
6*
7* Copyright 1999-2025 by the BibleTime developers.
8* The BibleTime source code is licensed under the GNU General Public License
9* version 2.0.
10*
11**********/
12
13#include "language.h"
14
15#include <QHash>
16#include <QLocale>
17#include <QObject>
18#include <QtGlobal>
19#include <utility>
20#include "../util/btassert.h"
22
23// Sword includes:
24#include <swlocale.h>
25
26
27namespace {
28
29struct LanguageMap: QHash<QString, std::shared_ptr<Language const>> {
31};
32
34 // Developers: It's easy to get a list of used language codes from all modules:
35 // Refresh all sources; go to .sword/InstallMgr/; run:
36 // grep -R -hs Lang= *|cut -c 6-|sort|uniq
37 // Don't remove unused languages from the source code unless you know it won't be used
38 // anymore.in any module ever.
39
40 /*:
41 The string "Names of languages" doesn't actually need translation.
42 It is put here to help translators notice this help text.
43 -------
44 The names of the languages should follow the conventions of your
45 language. You can write the names with a capital first letter even if your language
46 uses non-capitalized language names (they look better with capital
47 first letter when they are listed).
48 -------
49 To find the names of all languages from internet try searching for
50 "names of languages in language_x" but in your own language, e.g.
51 "kielten nimet suomeksi" in Finnish or "names of languages in english"
52 in English.
53 -------
54 You can find the language codes and names by googling for the standards
55 mentioned below.
56 -------
57 Preference order for locale codes are:
58 -------
59 ISO 639-1 -------
60 ISO 639-2 -------
61 ISO 639-3
62 -------
63 x-E-XXX form is deprecated and no modules in repositories use it.
64 If you find a module with x-E-XXX language, update the module.
65 */
66 QObject::tr("Names of languages", "No need to translate - see the longer comment (If there is no longer comment, it doesn't work yet :)) ------ ");
67
68 auto const addLanguage =
69 [this](QStringList abbrevs, QString englishName) {
70 auto language =
71 std::make_shared<Language>(std::move(abbrevs),
72 std::move(englishName));
73 for (auto const & abbrev : language->abbrevs()) {
74 BT_ASSERT(!contains(abbrev));
75 insert(abbrev, language);
76 }
77 };
78
79 // addLanguage({QStringLiteral("aa")}, QT_TRANSLATE_NOOP("QObject", "Afar"));
80 // addLanguage({QStringLiteral("ab")}, QT_TRANSLATE_NOOP("QObject", "Abkhazian"));
81 // addLanguage({QStringLiteral("ae")}, QT_TRANSLATE_NOOP("QObject", "Avestan"));
82 addLanguage({QStringLiteral("af")}, QT_TRANSLATE_NOOP("QObject", "Afrikaans"));
83 // addLanguage({QStringLiteral("am")}, QT_TRANSLATE_NOOP("QObject", "Amharic"));
84 addLanguage({QStringLiteral("amu")}, QT_TRANSLATE_NOOP("QObject", "Amuzgo, Guerrero"));
85 addLanguage({QStringLiteral("ang")}, QT_TRANSLATE_NOOP("QObject", "English, Old (ca.450-1100)"));
86 addLanguage({QStringLiteral("ar")}, QT_TRANSLATE_NOOP("QObject", "Arabic"));
87 // addLanguage({QStringLiteral("as")}, QT_TRANSLATE_NOOP("QObject", "Assamese"));
88 addLanguage({QStringLiteral("az")}, QT_TRANSLATE_NOOP("QObject", "Azerbaijani"));
89 addLanguage({QStringLiteral("azb")}, QT_TRANSLATE_NOOP("QObject", "Azerbaijani, South"));
90 // addLanguage({QStringLiteral("ba")}, QT_TRANSLATE_NOOP("QObject", "Bashkir"));
91 addLanguage({QStringLiteral("bar")}, QT_TRANSLATE_NOOP("QObject", "Bavarian"));
92 addLanguage({QStringLiteral("be")}, QT_TRANSLATE_NOOP("QObject", "Belarusian"));
93 addLanguage({QStringLiteral("bg")}, QT_TRANSLATE_NOOP("QObject", "Bulgarian"));
94 // addLanguage({QStringLiteral("bh")}, QT_TRANSLATE_NOOP("QObject", "Bihari"));
95 // addLanguage({QStringLiteral("bi")}, QT_TRANSLATE_NOOP("QObject", "Bislama"));
96 // addLanguage({QStringLiteral("bn")}, QT_TRANSLATE_NOOP("QObject", "Bengali"));
97 // addLanguage({QStringLiteral("bo")}, QT_TRANSLATE_NOOP("QObject", "Tibetan"));
98 addLanguage({QStringLiteral("br")}, QT_TRANSLATE_NOOP("QObject", "Breton"));
99 addLanguage({QStringLiteral("bs")}, QT_TRANSLATE_NOOP("QObject", "Bosnian"));
100 addLanguage({QStringLiteral("ca")}, QT_TRANSLATE_NOOP("QObject", "Catalan"));
101 // addLanguage({QStringLiteral("ce")}, QT_TRANSLATE_NOOP("QObject", "Chechen"));
102 addLanguage({QStringLiteral("cco")}, QT_TRANSLATE_NOOP("QObject", "Chinantec, Comaltepec"));
103 addLanguage({QStringLiteral("ceb")}, QT_TRANSLATE_NOOP("QObject", "Cebuano"));
104 addLanguage({QStringLiteral("ch")}, QT_TRANSLATE_NOOP("QObject", "Chamorro"));
105 addLanguage({QStringLiteral("chd")}, QT_TRANSLATE_NOOP("QObject", "Chontal, Highland Oaxaca"));
106 addLanguage({QStringLiteral("chq")}, QT_TRANSLATE_NOOP("QObject", "Chinantec, Quiotepec"));
107 addLanguage({QStringLiteral("chz")}, QT_TRANSLATE_NOOP("QObject", "Chinantec, Ozumac\u00edn"));
108 // addLanguage({QStringLiteral("co")}, QT_TRANSLATE_NOOP("QObject", "Corsican"));
109 addLanguage({QStringLiteral("ckw")}, QT_TRANSLATE_NOOP("QObject", "Cakchiquel, Western"));
110 addLanguage({QStringLiteral("cnl")}, QT_TRANSLATE_NOOP("QObject", "Chinantec, Lalana"));
111 addLanguage({QStringLiteral("cnt")}, QT_TRANSLATE_NOOP("QObject", "Chinantec, Tepetotutla"));
112 addLanguage({QStringLiteral("cop")}, QT_TRANSLATE_NOOP("QObject", "Coptic"));
113 addLanguage({QStringLiteral("cs")}, QT_TRANSLATE_NOOP("QObject", "Czech"));
114 addLanguage({QStringLiteral("cso")}, QT_TRANSLATE_NOOP("QObject", "Chinantec, Sochiapan"));
115 addLanguage({QStringLiteral("cti")}, QT_TRANSLATE_NOOP("QObject", "Chol, Tila"));
116 addLanguage({QStringLiteral("ctp")}, QT_TRANSLATE_NOOP("QObject", "Chatino, Western Highland"));
117 addLanguage({QStringLiteral("cu")}, QT_TRANSLATE_NOOP("QObject", "Church Slavic"));
118 // addLanguage({QStringLiteral("cv")}, QT_TRANSLATE_NOOP("QObject", "Chuvash"));
119 addLanguage({QStringLiteral("cy")}, QT_TRANSLATE_NOOP("QObject", "Welsh"));
120 addLanguage({QStringLiteral("da")}, QT_TRANSLATE_NOOP("QObject", "Danish"));
121 addLanguage({QStringLiteral("de")}, QT_TRANSLATE_NOOP("QObject", "German"));
122 addLanguage({QStringLiteral("dug")}, QT_TRANSLATE_NOOP("QObject", "Duruma"));
123 // addLanguage({QStringLiteral("dz")}, QT_TRANSLATE_NOOP("QObject", "Dzongkha"));
124 addLanguage({QStringLiteral("el"), QStringLiteral("gre"), QStringLiteral("ell")}, QT_TRANSLATE_NOOP("QObject", "Greek, Modern (1453-)"));
125 addLanguage({QStringLiteral("en")}, QT_TRANSLATE_NOOP("QObject", "English"));
126 addLanguage({QStringLiteral("en-US")}, QT_TRANSLATE_NOOP("QObject", "American English"));
127 addLanguage({QStringLiteral("enm")}, QT_TRANSLATE_NOOP("QObject", "English, Middle (1100-1500)"));
128 addLanguage({QStringLiteral("eo")}, QT_TRANSLATE_NOOP("QObject", "Esperanto"));
129 addLanguage({QStringLiteral("es")}, QT_TRANSLATE_NOOP("QObject", "Spanish"));
130 addLanguage({QStringLiteral("et")}, QT_TRANSLATE_NOOP("QObject", "Estonian"));
131 addLanguage({QStringLiteral("eu")}, QT_TRANSLATE_NOOP("QObject", "Basque"));
132 addLanguage({QStringLiteral("fa")}, QT_TRANSLATE_NOOP("QObject", "Persian"));
133 addLanguage({QStringLiteral("fi")}, QT_TRANSLATE_NOOP("QObject", "Finnish"));
134 // addLanguage({QStringLiteral("fj")}, QT_TRANSLATE_NOOP("QObject", "Fijian"));
135 // addLanguage({QStringLiteral("fo")}, QT_TRANSLATE_NOOP("QObject", "Faroese"));
136 addLanguage({QStringLiteral("fr")}, QT_TRANSLATE_NOOP("QObject", "French"));
137 addLanguage({QStringLiteral("fy")}, QT_TRANSLATE_NOOP("QObject", "Frisian"));
138 addLanguage({QStringLiteral("ga")}, QT_TRANSLATE_NOOP("QObject", "Irish"));
139 addLanguage({QStringLiteral("gd")}, QT_TRANSLATE_NOOP("QObject", "Gaelic (Scots)"));
140 addLanguage({QStringLiteral("gez")}, QT_TRANSLATE_NOOP("QObject", "Geez"));
141 // addLanguage({QStringLiteral("gl")}, QT_TRANSLATE_NOOP("QObject", "Gallegan"));
142 // addLanguage({QStringLiteral("gn")}, QT_TRANSLATE_NOOP("QObject", "Guarani"));
143 // addLanguage({QStringLiteral("gn")}, QT_TRANSLATE_NOOP("QObject", "Gujarati"));
144 addLanguage({QStringLiteral("got")}, QT_TRANSLATE_NOOP("QObject", "Gothic"));
145 addLanguage({QStringLiteral("gv")}, QT_TRANSLATE_NOOP("QObject", "Manx"));
146 addLanguage({QStringLiteral("grc")}, QT_TRANSLATE_NOOP("QObject", "Greek, Ancient (to 1453)"));
147 addLanguage({QStringLiteral("hau")}, QT_TRANSLATE_NOOP("QObject", "Hausa"));
148 addLanguage({QStringLiteral("haw")}, QT_TRANSLATE_NOOP("QObject", "Hawaiian"));
149 addLanguage({QStringLiteral("hbo")}, QT_TRANSLATE_NOOP("QObject", "Hebrew, Ancient"));
150 addLanguage({QStringLiteral("he")}, QT_TRANSLATE_NOOP("QObject", "Hebrew"));
151 addLanguage({QStringLiteral("hi")}, QT_TRANSLATE_NOOP("QObject", "Hindi"));
152 // addLanguage({QStringLiteral("ho")}, QT_TRANSLATE_NOOP("QObject", "Hiri Motu"));
153 addLanguage({QStringLiteral("hr")}, QT_TRANSLATE_NOOP("QObject", "Croatian"));
154 addLanguage({QStringLiteral("ht")}, QT_TRANSLATE_NOOP("QObject", "Haitian Creole"));
155 addLanguage({QStringLiteral("hu")}, QT_TRANSLATE_NOOP("QObject", "Hungarian"));
156 addLanguage({QStringLiteral("huv")}, QT_TRANSLATE_NOOP("QObject", "Huave, San Mateo Del Mar"));
157 addLanguage({QStringLiteral("hy")}, QT_TRANSLATE_NOOP("QObject", "Armenian"));
158 // addLanguage({QStringLiteral("hz")}, QT_TRANSLATE_NOOP("QObject", "Herero"));
159 // addLanguage({QStringLiteral("ia")}, QT_TRANSLATE_NOOP("QObject", "Interlingua"));
160 addLanguage({QStringLiteral("id")}, QT_TRANSLATE_NOOP("QObject", "Indonesian"));
161 // addLanguage({QStringLiteral("ie")}, QT_TRANSLATE_NOOP("QObject", "Interlingue"));
162 // addLanguage({QStringLiteral("ik")}, QT_TRANSLATE_NOOP("QObject", "Inupiaq"));
163 addLanguage({QStringLiteral("is")}, QT_TRANSLATE_NOOP("QObject", "Icelandic"));
164 addLanguage({QStringLiteral("it")}, QT_TRANSLATE_NOOP("QObject", "Italian"));
165 addLanguage({QStringLiteral("itz")}, QT_TRANSLATE_NOOP("QObject", "Itz\u00e1"));
166 addLanguage({QStringLiteral("ixl")}, QT_TRANSLATE_NOOP("QObject", "Ixil, San Juan Cotzal"));
167 // addLanguage({QStringLiteral("iu")}, QT_TRANSLATE_NOOP("QObject", "Inuktitut"));
168 addLanguage({QStringLiteral("ja")}, QT_TRANSLATE_NOOP("QObject", "Japanese"));
169 addLanguage({QStringLiteral("jac")}, QT_TRANSLATE_NOOP("QObject", "Jacalteco, Eastern"));
170 addLanguage({QStringLiteral("jvn")}, QT_TRANSLATE_NOOP("QObject", "Javanese, Caribbean"));
171 addLanguage({QStringLiteral("ka")}, QT_TRANSLATE_NOOP("QObject", "Georgian"));
172 addLanguage({QStringLiteral("kek")}, QT_TRANSLATE_NOOP("QObject", "Kekchi"));
173 // addLanguage({QStringLiteral("ki")}, QT_TRANSLATE_NOOP("QObject", "Kikuyu"));
174 // addLanguage({QStringLiteral("kj")}, QT_TRANSLATE_NOOP("QObject", "Kuanyama"));
175 // addLanguage({QStringLiteral("kk")}, QT_TRANSLATE_NOOP("QObject", "Kazakh"));
176 // addLanguage({QStringLiteral("kl")}, QT_TRANSLATE_NOOP("QObject", "Kalaallisut"));
177 // addLanguage({QStringLiteral("km")}, QT_TRANSLATE_NOOP("QObject", "Khmer"));
178 // addLanguage({QStringLiteral("kn")}, QT_TRANSLATE_NOOP("QObject", "Kannada"));
179 addLanguage({QStringLiteral("ko")}, QT_TRANSLATE_NOOP("QObject", "Korean"));
180 // addLanguage({QStringLiteral("ks")}, QT_TRANSLATE_NOOP("QObject", "Kashmiri"));
181 addLanguage({QStringLiteral("ku")}, QT_TRANSLATE_NOOP("QObject", "Kurdish"));
182 // addLanguage({QStringLiteral("kv")}, QT_TRANSLATE_NOOP("QObject", "Komi"));
183 // addLanguage({QStringLiteral("kw")}, QT_TRANSLATE_NOOP("QObject", "Cornish"));
184 addLanguage({QStringLiteral("ky")}, QT_TRANSLATE_NOOP("QObject", "Kirghiz"));
185 addLanguage({QStringLiteral("la")}, QT_TRANSLATE_NOOP("QObject", "Latin"));
186 addLanguage({QStringLiteral("lac")}, QT_TRANSLATE_NOOP("QObject", "Lacandon"));
187 // addLanguage({QStringLiteral("lb")}, QT_TRANSLATE_NOOP("QObject", "Letzeburgesch"));
188 addLanguage({QStringLiteral("lmo")}, QT_TRANSLATE_NOOP("QObject", "Lombard"));
189 // addLanguage({QStringLiteral("ln")}, QT_TRANSLATE_NOOP("QObject", "Lingala"));
190 // addLanguage({QStringLiteral("lo")}, QT_TRANSLATE_NOOP("QObject", "Lao"));
191 addLanguage({QStringLiteral("lt")}, QT_TRANSLATE_NOOP("QObject", "Lithuanian"));
192 addLanguage({QStringLiteral("lv")}, QT_TRANSLATE_NOOP("QObject", "Latvian"));
193 addLanguage({QStringLiteral("mg")}, QT_TRANSLATE_NOOP("QObject", "Malagasy"));
194 // addLanguage({QStringLiteral("mh")}, QT_TRANSLATE_NOOP("QObject", "Marshall"));
195 addLanguage({QStringLiteral("mi")}, QT_TRANSLATE_NOOP("QObject", "Maori"));
196 addLanguage({QStringLiteral("mir")}, QT_TRANSLATE_NOOP("QObject", "Mixe, Isthmus"));
197 addLanguage({QStringLiteral("miz")}, QT_TRANSLATE_NOOP("QObject", "Mixtec, Coatzospan"));
198 addLanguage({QStringLiteral("mk")}, QT_TRANSLATE_NOOP("QObject", "Macedonian"));
199 addLanguage({QStringLiteral("mks")}, QT_TRANSLATE_NOOP("QObject", "Mixtec, Silacayoapan"));
200 // addLanguage({QStringLiteral("ml")}, QT_TRANSLATE_NOOP("QObject", "Malayalam"));
201 // addLanguage({QStringLiteral("mn")}, QT_TRANSLATE_NOOP("QObject", "Mongolian"));
202 // addLanguage({QStringLiteral("mo")}, QT_TRANSLATE_NOOP("QObject", "Moldavian"));
203 addLanguage({QStringLiteral("mos")}, QT_TRANSLATE_NOOP("QObject", "More"));
204 // addLanguage({QStringLiteral("mr")}, QT_TRANSLATE_NOOP("QObject", "Marathi"));
205 addLanguage({QStringLiteral("ms")}, QT_TRANSLATE_NOOP("QObject", "Malay"));
206 addLanguage({QStringLiteral("mt")}, QT_TRANSLATE_NOOP("QObject", "Maltese"));
207 addLanguage({QStringLiteral("mul")}, QT_TRANSLATE_NOOP("QObject", "(Multiple languages)"));
208 addLanguage({QStringLiteral("mvc")}, QT_TRANSLATE_NOOP("QObject", "Mam, Central"));
209 addLanguage({QStringLiteral("mvj")}, QT_TRANSLATE_NOOP("QObject", "Mam, Todos Santos Cuchumat\u00e1n"));
210 addLanguage({QStringLiteral("mxq")}, QT_TRANSLATE_NOOP("QObject", "Mixe, Juquila"));
211 addLanguage({QStringLiteral("mxt")}, QT_TRANSLATE_NOOP("QObject", "Mixtec, Jamiltepec"));
212 addLanguage({QStringLiteral("my")}, QT_TRANSLATE_NOOP("QObject", "Burmese"));
213 // addLanguage({QStringLiteral("na")}, QT_TRANSLATE_NOOP("QObject", "Nauru"));
214 addLanguage({QStringLiteral("nb")}, QT_TRANSLATE_NOOP("QObject", "Norwegian Bokm\u00e5l"));
215 addLanguage({QStringLiteral("ncl")}, QT_TRANSLATE_NOOP("QObject", "Nahuatl, Michoac\u00e1n"));
216 // addLanguage({QStringLiteral("nd")}, QT_TRANSLATE_NOOP("QObject", "Ndebele, North"));
217 addLanguage({QStringLiteral("nds")}, QT_TRANSLATE_NOOP("QObject", "Low German; Low Saxon"));
218 addLanguage({QStringLiteral("ne")}, QT_TRANSLATE_NOOP("QObject", "Nepali"));
219 addLanguage({QStringLiteral("ngu")}, QT_TRANSLATE_NOOP("QObject", "Nahuatl, Guerrero"));
220 addLanguage({QStringLiteral("nhy")}, QT_TRANSLATE_NOOP("QObject", "Nahuatl, Northern Oaxaca"));
221 // addLanguage({QStringLiteral("ng")}, QT_TRANSLATE_NOOP("QObject", "Ndonga"));
222 addLanguage({QStringLiteral("nl")}, QT_TRANSLATE_NOOP("QObject", "Dutch"));
223 addLanguage({QStringLiteral("nn")}, QT_TRANSLATE_NOOP("QObject", "Norwegian Nynorsk"));
224 addLanguage({QStringLiteral("no")}, QT_TRANSLATE_NOOP("QObject", "Norwegian"));
225 // addLanguage({QStringLiteral("nr")}, QT_TRANSLATE_NOOP("QObject", "Ndebele, South"));
226 // addLanguage({QStringLiteral("nv")}, QT_TRANSLATE_NOOP("QObject", "Navajo"));
227 // addLanguage({QStringLiteral("ny")}, QT_TRANSLATE_NOOP("QObject", "Chichewa; Nyanja"));
228 // addLanguage({QStringLiteral("oc")}, QT_TRANSLATE_NOOP("QObject", "Occitan (post 1500); Provençal"));
229 // addLanguage({QStringLiteral("om")}, QT_TRANSLATE_NOOP("QObject", "Oromo"));
230 // addLanguage({QStringLiteral("or")}, QT_TRANSLATE_NOOP("QObject", "Oriya"));
231 // addLanguage({QStringLiteral("os")}, QT_TRANSLATE_NOOP("QObject", "Ossetian; Ossetic"));
232 addLanguage({QStringLiteral("otq")}, QT_TRANSLATE_NOOP("QObject", "Otomi, Quer\u00e9taro"));
233 // addLanguage({QStringLiteral("pa")}, QT_TRANSLATE_NOOP("QObject", "Panjabi"));
234 addLanguage({QStringLiteral("pap")}, QT_TRANSLATE_NOOP("QObject", "Papiamento"));
235 // addLanguage({QStringLiteral("pi")}, QT_TRANSLATE_NOOP("QObject", "Pali"));
236 addLanguage({QStringLiteral("pl")}, QT_TRANSLATE_NOOP("QObject", "Polish"));
237 addLanguage({QStringLiteral("pot")}, QT_TRANSLATE_NOOP("QObject", "Potawatomi"));
238 addLanguage({QStringLiteral("ppk")}, QT_TRANSLATE_NOOP("QObject", "Uma"));
239 addLanguage({QStringLiteral("prs")}, QT_TRANSLATE_NOOP("QObject", "Persian (Dari)"));
240 // addLanguage({QStringLiteral("ps")}, QT_TRANSLATE_NOOP("QObject", "Pushto"));
241 addLanguage({QStringLiteral("pt")}, QT_TRANSLATE_NOOP("QObject", "Portuguese"));
242 addLanguage({QStringLiteral("pt-BR")}, QT_TRANSLATE_NOOP("QObject", "Brazilian Portuguese"));
243 // addLanguage({QStringLiteral("qu")}, QT_TRANSLATE_NOOP("QObject", "Quechua"));
244 addLanguage({QStringLiteral("qut")}, QT_TRANSLATE_NOOP("QObject", "Quich\u00e9, West Central"));
245 // addLanguage({QStringLiteral("rm")}, QT_TRANSLATE_NOOP("QObject", "Raeto-Romance"));
246 // addLanguage({QStringLiteral("rn")}, QT_TRANSLATE_NOOP("QObject", "Rundi"));
247 addLanguage({QStringLiteral("ro")}, QT_TRANSLATE_NOOP("QObject", "Romanian"));
248 addLanguage({QStringLiteral("ru")}, QT_TRANSLATE_NOOP("QObject", "Russian"));
249 // addLanguage({QStringLiteral("rw")}, QT_TRANSLATE_NOOP("QObject", "Kinyarwanda"));
250 // addLanguage({QStringLiteral("sa")}, QT_TRANSLATE_NOOP("QObject", "Sanskrit"));
251 // addLanguage({QStringLiteral("sc")}, QT_TRANSLATE_NOOP("QObject", "Sardinian"));
252 addLanguage({QStringLiteral("sco")}, QT_TRANSLATE_NOOP("QObject", "Scots"));
253 // addLanguage({QStringLiteral("sd")}, QT_TRANSLATE_NOOP("QObject", "Sindhi"));
254 // addLanguage({QStringLiteral("se")}, QT_TRANSLATE_NOOP("QObject", "Northern Sami"));
255 // addLanguage({QStringLiteral("sg")}, QT_TRANSLATE_NOOP("QObject", "Sango"));
256 // addLanguage({QStringLiteral("si")}, QT_TRANSLATE_NOOP("QObject", "Sinhalese"));
257 addLanguage({QStringLiteral("sk")}, QT_TRANSLATE_NOOP("QObject", "Slovak"));
258 addLanguage({QStringLiteral("sl")}, QT_TRANSLATE_NOOP("QObject", "Slovenian"));
259 // addLanguage({QStringLiteral("sm")}, QT_TRANSLATE_NOOP("QObject", "Samoan"));
260 // addLanguage({QStringLiteral("sn")}, QT_TRANSLATE_NOOP("QObject", "Shona"));
261 addLanguage({QStringLiteral("so")}, QT_TRANSLATE_NOOP("QObject", "Somali"));
262 addLanguage({QStringLiteral("sq")}, QT_TRANSLATE_NOOP("QObject", "Albanian"));
263 // addLanguage({QStringLiteral("sr")}, QT_TRANSLATE_NOOP("QObject", "Serbian"));
264 addLanguage({QStringLiteral("srn")}, QT_TRANSLATE_NOOP("QObject", "Sranan"));
265 // addLanguage({QStringLiteral("ss")}, QT_TRANSLATE_NOOP("QObject", "Swati"));
266 // addLanguage({QStringLiteral("st")}, QT_TRANSLATE_NOOP("QObject", "Sotho, Southern"));
267 // addLanguage({QStringLiteral("su")}, QT_TRANSLATE_NOOP("QObject", "Sundanese"));
268 addLanguage({QStringLiteral("sv")}, QT_TRANSLATE_NOOP("QObject", "Swedish"));
269 addLanguage({QStringLiteral("sw")}, QT_TRANSLATE_NOOP("QObject", "Swahili"));
270 addLanguage({QStringLiteral("syr")}, QT_TRANSLATE_NOOP("QObject", "Syriac"));
271 addLanguage({QStringLiteral("ta")}, QT_TRANSLATE_NOOP("QObject", "Tamil"));
272 // addLanguage({QStringLiteral("te")}, QT_TRANSLATE_NOOP("QObject", "Telugu"));
273 // addLanguage({QStringLiteral("tg")}, QT_TRANSLATE_NOOP("QObject", "Tajik"));
274 addLanguage({QStringLiteral("th")}, QT_TRANSLATE_NOOP("QObject", "Thai"));
275 // addLanguage({QStringLiteral("tk")}, QT_TRANSLATE_NOOP("QObject", "Turkmen"));
276 addLanguage({QStringLiteral("tl")}, QT_TRANSLATE_NOOP("QObject", "Tagalog"));
277 addLanguage({QStringLiteral("tlh")}, QT_TRANSLATE_NOOP("QObject", "Klingon"));
278 addLanguage({QStringLiteral("tn")}, QT_TRANSLATE_NOOP("QObject", "Tswana"));
279 addLanguage({QStringLiteral("tr")}, QT_TRANSLATE_NOOP("QObject", "Turkish"));
280 // addLanguage({QStringLiteral("ts")}, QT_TRANSLATE_NOOP("QObject", "Tsonga"));
281 // addLanguage({QStringLiteral("tt")}, QT_TRANSLATE_NOOP("QObject", "Tatar"));
282 addLanguage({QStringLiteral("ttc")}, QT_TRANSLATE_NOOP("QObject", "Tektiteko"));
283 // addLanguage({QStringLiteral("tw")}, QT_TRANSLATE_NOOP("QObject", "Twi"));
284 addLanguage({QStringLiteral("ty")}, QT_TRANSLATE_NOOP("QObject", "Tahitian"));
285 addLanguage({QStringLiteral("tzz")}, QT_TRANSLATE_NOOP("QObject", "Tzotzil, Zinacant\u00e1n"));
286 // addLanguage({QStringLiteral("ug")}, QT_TRANSLATE_NOOP("QObject", "Uighur"));
287 addLanguage({QStringLiteral("uk")}, QT_TRANSLATE_NOOP("QObject", "Ukrainian"));
288 // addLanguage({QStringLiteral("ur")}, QT_TRANSLATE_NOOP("QObject", "Urdu"));
289 addLanguage({QStringLiteral("ury")}, QT_TRANSLATE_NOOP("QObject", "Orya"));
290 addLanguage({QStringLiteral("usp")}, QT_TRANSLATE_NOOP("QObject", "Uspanteco"));
291 // addLanguage({QStringLiteral("uz")}, QT_TRANSLATE_NOOP("QObject", "Uzbek"));
292 addLanguage({QStringLiteral("vi")}, QT_TRANSLATE_NOOP("QObject", "Vietnamese"));
293 // addLanguage({QStringLiteral("vo")}, QT_TRANSLATE_NOOP("QObject", "Volapük"));
294 // addLanguage({QStringLiteral("wo")}, QT_TRANSLATE_NOOP("QObject", "Wolof"));
295 addLanguage({QStringLiteral("xh")}, QT_TRANSLATE_NOOP("QObject", "Xhosa"));
296 addLanguage({QStringLiteral("xtd")}, QT_TRANSLATE_NOOP("QObject", "Mixtec, Diuxi-Tilantongo"));
297 addLanguage({QStringLiteral("yi")}, QT_TRANSLATE_NOOP("QObject", "Yiddish"));
298 addLanguage({QStringLiteral("yo")}, QT_TRANSLATE_NOOP("QObject", "Yoruba"));
299 // addLanguage({QStringLiteral("za")}, QT_TRANSLATE_NOOP("QObject", "Zhuang"));
300 addLanguage({QStringLiteral("zab")}, QT_TRANSLATE_NOOP("QObject", "Zapotec, San Juan Guelav\u00eda"));
301 addLanguage({QStringLiteral("zaw")}, QT_TRANSLATE_NOOP("QObject", "Zapotec, Mitla"));
302 addLanguage({QStringLiteral("zh")}, QT_TRANSLATE_NOOP("QObject", "Chinese"));
303 addLanguage({QStringLiteral("zpo")}, QT_TRANSLATE_NOOP("QObject", "Zapotec, Amatl\u00e1n"));
304 addLanguage({QStringLiteral("zpq")}, QT_TRANSLATE_NOOP("QObject", "Zapotec, Zoogocho"));
305 addLanguage({QStringLiteral("zpu")}, QT_TRANSLATE_NOOP("QObject", "Zapotec, Yal\u00e1lag"));
306 addLanguage({QStringLiteral("zpv")}, QT_TRANSLATE_NOOP("QObject", "Zapotec, Chichicapan"));
307 addLanguage({QStringLiteral("zsr")}, QT_TRANSLATE_NOOP("QObject", "Zapotec, Southern Rincon"));
308 addLanguage({QStringLiteral("ztq")}, QT_TRANSLATE_NOOP("QObject", "Zapotec, Quioquitani-Quier\u00ed"));
309 addLanguage({QStringLiteral("zty")}, QT_TRANSLATE_NOOP("QObject", "Zapotec, Yatee"));
310 addLanguage({QStringLiteral("zu")}, QT_TRANSLATE_NOOP("QObject", "Zulu"));
311}
312
313} // anonymous namespace
314
315Language::Language(QStringList abbrevs, QString englishName)
316 : m_abbrevs(std::move(abbrevs))
317 , m_englishName(std::move(englishName))
318{
319 BT_ASSERT(!m_abbrevs.isEmpty());
320 BT_ASSERT(!m_abbrevs.contains(QString()));
321 BT_ASSERT(!m_englishName.isEmpty());
322}
323
324Language::~Language() = default;
325
327{ return QObject::tr(englishName().toUtf8()); }
328
329std::shared_ptr<Language const> Language::fromAbbrev(QString const & abbrev) {
330 BT_ASSERT(!abbrev.contains('_')); // Weak check for certain BCP 47 bugs
331
332 static LanguageMap languageMap;
333
334 BT_ASSERT(languageMap.contains(QStringLiteral("en")));
335 static auto const defaultLanguage = *languageMap.find(QStringLiteral("en"));
336 if (abbrev.isEmpty())
337 return defaultLanguage;
338
339 auto it(languageMap.find(abbrev));
340 if (it != languageMap.constEnd())
341 return *it;
342
343 struct SwordLanguage: Language {
344
345 SwordLanguage(QStringList abbrevs, QString abbrev)
346 : Language(
347 std::move(abbrevs),
348 [](QString abbrev) {
349 if (auto * const locale = BtLocaleMgr::localeTranslator()) {
350 auto const abbrevEn = abbrev + QStringLiteral(".en");
351 auto englishName(
352 QString::fromUtf8(
353 locale->translate(
354 abbrevEn.toUtf8().constData())));
355 if (!englishName.isEmpty() && englishName != abbrevEn)
356 return englishName;
357 }
358 return abbrev;
359 }(std::move(abbrev)))
360 {}
361
362 QString translatedName() const override {
363 if (auto * const locale = BtLocaleMgr::localeTranslator()) {
364 QStringList tryTranslateNames;
365 {
366 auto localeName = QLocale().name();
367 while (!localeName.isEmpty()
368 && localeName != QStringLiteral("en"))
369 {
370 tryTranslateNames.append(abbrev() + '.' + localeName);
371 if (localeName == abbrev())
372 tryTranslateNames.append(localeName);
373 while (localeName.back().isLetterOrNumber()) {
374 localeName.chop(1);
375 if (localeName.isEmpty())
376 break;
377 }
378 while (!localeName.isEmpty()
379 && !localeName.back().isLetterOrNumber())
380 localeName.chop(1);
381 }
382 }
383 for (auto const & translateName : tryTranslateNames) {
384 auto trName =
385 QString::fromUtf8(
386 locale->translate(
387 translateName.toUtf8().constData()));
388 if (trName != translateName)
389 return trName;
390 }
391 }
393 }
394
395 }; // struct SwordLanguage
396
397 auto newLang = std::make_shared<SwordLanguage>(QStringList{abbrev}, abbrev);
398 languageMap.insert(abbrev, newLang);
399 return newLang;
400}
#define BT_ASSERT(...)
Definition btassert.h:17
Language(Language &&)=delete
virtual ~Language()
QString const m_englishName
Definition language.h:54
QString const & abbrev() const
Definition language.h:34
virtual QString translatedName() const
Definition language.cpp:326
static std::shared_ptr< Language const > fromAbbrev(QString const &abbrev)
Definition language.cpp:329
QString const & englishName() const noexcept
Definition language.h:43
QStringList const m_abbrevs
Definition language.h:53
sword::SWLocale * localeTranslator()