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-2021 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"
21 #include "managers/btlocalemgr.h"
22 
23 // Sword includes:
24 #include <swlocale.h>
25 
26 
27 namespace {
28 
29 struct LanguageMap: QHash<QString, std::shared_ptr<Language const>> {
30  LanguageMap();
31 };
32 
33 LanguageMap::LanguageMap() {
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 
315 Language::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 
324 Language::~Language() = default;
325 
327 { return QObject::tr(englishName().toUtf8()); }
328 
329 std::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  }
392  return Language::translatedName();
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
static std::shared_ptr< Language const > fromAbbrev(QString const &abbrev)
Definition: language.cpp:329
virtual ~Language()
QString const m_englishName
Definition: language.h:54
QString const & englishName() const noexcept
Definition: language.h:43
QString const & abbrev() const
Definition: language.h:34
virtual QString translatedName() const
Definition: language.cpp:326
QStringList const & abbrevs() const
Definition: language.h:37
QStringList const m_abbrevs
Definition: language.h:53
sword::SWLocale * localeTranslator()
Definition: btlocalemgr.cpp:54