1 /* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */
2 
3 /* libstaroffice
4 * Version: MPL 2.0 / LGPLv2+
5 *
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 2.0 (the "License"); you may not use this file except in compliance with
8 * the License or as specified alternatively below. You may obtain a copy of
9 * the License at http://www.mozilla.org/MPL/
10 *
11 * Software distributed under the License is distributed on an "AS IS" basis,
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 * for the specific language governing rights and limitations under the
14 * License.
15 *
16 * Major Contributor(s):
17 * Copyright (C) 2002 William Lachance (wrlach@gmail.com)
18 * Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net)
19 * Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
20 * Copyright (C) 2006, 2007 Andrew Ziem
21 * Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr)
22 *
23 *
24 * All Rights Reserved.
25 *
26 * For minor contributions see the git repository.
27 *
28 * Alternatively, the contents of this file may be used under the terms of
29 * the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
30 * in which case the provisions of the LGPLv2+ are applicable
31 * instead of those above.
32 */
33 
34 #include <map>
35 #include <string>
36 
37 #include <librevenge/librevenge.h>
38 
39 #include "STOFFStringStream.hxx"
40 
41 #include "StarLanguage.hxx"
42 
43 namespace StarLanguage
44 {
45 //! the different language
46 enum Language {
47   LANGUAGE_DONTKNOW=0x03FF,
48   LANGUAGE_NONE=0x00FF,
49   LANGUAGE_SYSTEM=0x0000,
50   LANGUAGE_AFRIKAANS=0x0436,
51   LANGUAGE_ALBANIAN=0x041C,
52   LANGUAGE_ARABIC=0x0001,
53   LANGUAGE_ARABIC_SAUDI_ARABIA=0x0401,
54   LANGUAGE_ARABIC_IRAQ=0x0801,
55   LANGUAGE_ARABIC_EGYPT=0x0C01,
56   LANGUAGE_ARABIC_LIBYA=0x1001,
57   LANGUAGE_ARABIC_ALGERIA=0x1401,
58   LANGUAGE_ARABIC_MOROCCO=0x1801,
59   LANGUAGE_ARABIC_TUNISIA=0x1C01,
60   LANGUAGE_ARABIC_OMAN=0x2001,
61   LANGUAGE_ARABIC_YEMEN=0x2401,
62   LANGUAGE_ARABIC_SYRIA=0x2801,
63   LANGUAGE_ARABIC_JORDAN=0x2C01,
64   LANGUAGE_ARABIC_LEBANON=0x3001,
65   LANGUAGE_ARABIC_KUWAIT=0x3401,
66   LANGUAGE_ARABIC_UAE=0x3801,
67   LANGUAGE_ARABIC_BAHRAIN=0x3C01,
68   LANGUAGE_ARABIC_QATAR=0x4001,
69   LANGUAGE_ARMENIAN=0x042B,
70   LANGUAGE_ASSAMESE=0x044D,
71   LANGUAGE_AZERI=0x002C,
72   LANGUAGE_AZERI_LATIN=0x042C,
73   LANGUAGE_AZERI_CYRILLIC=0x082C,
74   LANGUAGE_BASQUE=0x042D,
75   LANGUAGE_BELARUSIAN=0x0423,
76   LANGUAGE_BENGALI=0x0445,
77   LANGUAGE_BULGARIAN=0x0402,
78   LANGUAGE_BURMESE=0x0455,
79   LANGUAGE_CATALAN=0x0403,
80   LANGUAGE_CHINESE=0x0004,
81   LANGUAGE_CHINESE_TRADITIONAL=0x0404,
82   LANGUAGE_CHINESE_SIMPLIFIED=0x0804,
83   LANGUAGE_CHINESE_HONGKONG=0x0C04,
84   LANGUAGE_CHINESE_SINGAPORE=0x1004,
85   LANGUAGE_CHINESE_MACAU=0x1404,
86   LANGUAGE_CZECH=0x0405,
87   LANGUAGE_DANISH=0x0406,
88   LANGUAGE_DUTCH=0x0413,
89   LANGUAGE_DUTCH_BELGIAN=0x0813,
90   LANGUAGE_ENGLISH=0x0009,
91   LANGUAGE_ENGLISH_US=0x0409,
92   LANGUAGE_ENGLISH_UK=0x0809,
93   LANGUAGE_ENGLISH_AUS=0x0C09,
94   LANGUAGE_ENGLISH_CAN=0x1009,
95   LANGUAGE_ENGLISH_NZ=0x1409,
96   LANGUAGE_ENGLISH_EIRE=0x1809,
97   LANGUAGE_ENGLISH_SAFRICA=0x1C09,
98   LANGUAGE_ENGLISH_JAMAICA=0x2009,
99   LANGUAGE_ENGLISH_CARRIBEAN=0x2409,
100   LANGUAGE_ENGLISH_BELIZE=0x2809,
101   LANGUAGE_ENGLISH_TRINIDAD=0x2C09,
102   LANGUAGE_ENGLISH_ZIMBABWE=0x3009,
103   LANGUAGE_ENGLISH_PHILIPPINES=0x3409,
104   LANGUAGE_ESTONIAN=0x0425,
105   LANGUAGE_FAEROESE=0x0438,
106   LANGUAGE_FARSI=0x0429,
107   LANGUAGE_FINNISH=0x040B,
108   LANGUAGE_FRENCH=0x040C,
109   LANGUAGE_FRENCH_BELGIAN=0x080C,
110   LANGUAGE_FRENCH_CANADIAN=0x0C0C,
111   LANGUAGE_FRENCH_SWISS=0x100C,
112   LANGUAGE_FRENCH_LUXEMBOURG=0x140C,
113   LANGUAGE_FRENCH_MONACO=0x180C,
114   LANGUAGE_FRENCH_WEST_INDIES=0x1C0C,
115   LANGUAGE_FRENCH_REUNION=0x200C,
116   LANGUAGE_FRENCH_ZAIRE=0x240C,
117   LANGUAGE_FRENCH_SENEGAL=0x280C,
118   LANGUAGE_FRENCH_CAMEROON=0x2C0C,
119   LANGUAGE_FRENCH_COTE_D_IVOIRE=0x300C,
120   LANGUAGE_FRENCH_MALI=0x340C,
121   LANGUAGE_FRISIAN_NETHERLANDS=0x0462,
122   LANGUAGE_GAELIC_SCOTLAND=0x043C,
123   LANGUAGE_GAELIC_IRELAND=0x083C,
124   LANGUAGE_GALICIAN=0x0456,
125   LANGUAGE_GEORGIAN=0x0437,
126   LANGUAGE_GERMAN=0x0407,
127   LANGUAGE_GERMAN_SWISS=0x0807,
128   LANGUAGE_GERMAN_AUSTRIAN=0x0C07,
129   LANGUAGE_GERMAN_LUXEMBOURG=0x1007,
130   LANGUAGE_GERMAN_LIECHTENSTEIN=0x1407,
131   LANGUAGE_GREEK=0x0408,
132   LANGUAGE_GUJARATI=0x0447,
133   LANGUAGE_HEBREW=0x040D,
134   LANGUAGE_HINDI=0x0439,
135   LANGUAGE_HUNGARIAN=0x040E,
136   LANGUAGE_ICELANDIC=0x040F,
137   LANGUAGE_INDONESIAN=0x0421,
138   LANGUAGE_ITALIAN=0x0410,
139   LANGUAGE_ITALIAN_SWISS=0x0810,
140   LANGUAGE_JAPANESE=0x0411,
141   LANGUAGE_KANNADA=0x044B,
142   LANGUAGE_KASHMIRI=0x0460,
143   LANGUAGE_KASHMIRI_INDIA=0x0860,
144   LANGUAGE_KAZAK=0x043F,
145   LANGUAGE_KHMER=0x0453,
146   LANGUAGE_KIRGHIZ=0x0440,
147   LANGUAGE_KONKANI=0x0457,
148   LANGUAGE_KOREAN=0x0412,
149   LANGUAGE_KOREAN_JOHAB=0x0812,
150   LANGUAGE_LAO=0x0454,
151   LANGUAGE_LATVIAN=0x0426,
152   LANGUAGE_LITHUANIAN=0x0427,
153   LANGUAGE_LITHUANIAN_CLASSIC=0x0827,
154   LANGUAGE_MACEDONIAN=0x042F,
155   LANGUAGE_MALAY=0x003E,
156   LANGUAGE_MALAY_MALAYSIA=0x043E,
157   LANGUAGE_MALAY_BRUNEI_DARUSSALAM=0x083E,
158   LANGUAGE_MALAYALAM=0x044C,
159   LANGUAGE_MALTESE=0x043A,
160   LANGUAGE_MANIPURI=0x0458,
161   LANGUAGE_MARATHI=0x044E,
162   LANGUAGE_MONGOLIAN=0x0450,
163   LANGUAGE_NEPALI=0x0461,
164   LANGUAGE_NEPALI_INDIA=0x0861,
165   LANGUAGE_NORWEGIAN=0x0014,
166   LANGUAGE_NORWEGIAN_BOKMAL=0x0414,
167   LANGUAGE_NORWEGIAN_NYNORSK=0x0814,
168   LANGUAGE_SEPEDI=0x046C,
169   LANGUAGE_NORTHERNSOTHO=LANGUAGE_SEPEDI,
170   LANGUAGE_ORIYA=0x0448,
171   LANGUAGE_POLISH=0x0415,
172   LANGUAGE_PORTUGUESE=0x0816,
173   LANGUAGE_PORTUGUESE_BRAZILIAN=0x0416,
174   LANGUAGE_PUNJABI=0x0446,
175   LANGUAGE_RHAETO_ROMAN=0x0417,
176   LANGUAGE_ROMANIAN=0x0418,
177   LANGUAGE_ROMANIAN_MOLDOVA=0x0818,
178   LANGUAGE_RUSSIAN=0x0419,
179   LANGUAGE_RUSSIAN_MOLDOVA=0x0819,
180   LANGUAGE_SAMI_LAPPISH=0x043B,
181   LANGUAGE_SANSKRIT=0x044F,
182   LANGUAGE_SERBIAN=0x001A,
183   LANGUAGE_CROATIAN=0x041A,
184   LANGUAGE_SERBIAN_LATIN=0x081A,
185   LANGUAGE_SERBIAN_CYRILLIC=0x0C1A,
186   LANGUAGE_SESOTHO=0x0430,
187   LANGUAGE_SINDHI=0x0459,
188   LANGUAGE_SLOVAK=0x041B,
189   LANGUAGE_SLOVENIAN=0x0424,
190   LANGUAGE_SORBIAN=0x042E,
191   LANGUAGE_SPANISH=0x040A,
192   LANGUAGE_SPANISH_MEXICAN=0x080A,
193   LANGUAGE_SPANISH_MODERN=0x0C0A,
194   LANGUAGE_SPANISH_GUATEMALA=0x100A,
195   LANGUAGE_SPANISH_COSTARICA=0x140A,
196   LANGUAGE_SPANISH_PANAMA=0x180A,
197   LANGUAGE_SPANISH_DOMINICAN_REPUBLIC=0x1C0A,
198   LANGUAGE_SPANISH_VENEZUELA=0x200A,
199   LANGUAGE_SPANISH_COLOMBIA=0x240A,
200   LANGUAGE_SPANISH_PERU=0x280A,
201   LANGUAGE_SPANISH_ARGENTINA=0x2C0A,
202   LANGUAGE_SPANISH_ECUADOR=0x300A,
203   LANGUAGE_SPANISH_CHILE=0x340A,
204   LANGUAGE_SPANISH_URUGUAY=0x380A,
205   LANGUAGE_SPANISH_PARAGUAY=0x3C0A,
206   LANGUAGE_SPANISH_BOLIVIA=0x400A,
207   LANGUAGE_SPANISH_EL_SALVADOR=0x440A,
208   LANGUAGE_SPANISH_HONDURAS=0x480A,
209   LANGUAGE_SPANISH_NICARAGUA=0x4C0A,
210   LANGUAGE_SPANISH_PUERTO_RICO=0x500A,
211   LANGUAGE_SWAHILI=0x0441,
212   LANGUAGE_SWEDISH=0x041D,
213   LANGUAGE_SWEDISH_FINLAND=0x081D,
214   LANGUAGE_TAJIK=0x0428,
215   LANGUAGE_TAMIL=0x0449,
216   LANGUAGE_TATAR=0x0444,
217   LANGUAGE_TELUGU=0x044A,
218   LANGUAGE_THAI=0x041E,
219   LANGUAGE_TIBETAN=0x0451,
220   LANGUAGE_TSONGA=0x0431,
221   LANGUAGE_TSWANA=0x0432,
222   LANGUAGE_TURKISH=0x041F,
223   LANGUAGE_TURKMEN=0x0442,
224   LANGUAGE_UKRAINIAN=0x0422,
225   LANGUAGE_URDU=0x0020,
226   LANGUAGE_URDU_PAKISTAN=0x0420,
227   LANGUAGE_URDU_INDIA=0x0820,
228   LANGUAGE_UZBEK=0x0043,
229   LANGUAGE_UZBEK_LATIN=0x0443,
230   LANGUAGE_UZBEK_CYRILLIC=0x0843,
231   LANGUAGE_VENDA=0x0433,
232   LANGUAGE_VIETNAMESE=0x042A,
233   LANGUAGE_WELSH=0x0452,
234   LANGUAGE_XHOSA=0x0434,
235   LANGUAGE_ZULU=0x0435,
236   LANGUAGE_USER1=0x0201,
237   LANGUAGE_USER2=0x0202,
238   LANGUAGE_USER3=0x0203,
239   LANGUAGE_USER4=0x0204,
240   LANGUAGE_USER5=0x0205,
241   LANGUAGE_USER6=0x0206,
242   LANGUAGE_USER7=0x0207,
243   LANGUAGE_USER8=0x0208,
244   LANGUAGE_USER9=0x0209,
245   LANGUAGE_SYSTEM_DEFAULT=0x0800,
246   LANGUAGE_PROCESS_OR_USER_DEFAULT=0x0400,
247   LANGUAGE_USER_LATIN=0x0610,
248   LANGUAGE_USER_ESPERANTO=0x0611,
249   LANGUAGE_USER_MAORI=0x0620,
250   LANGUAGE_USER_KINYARWANDA=0x0621
251 };
252 
253 struct IdIsoLanguageEntry {
254   int m_languageId;
255   char m_language[3];
256   std::string m_country;
257 };
258 
259 class IdIsoLanguageMap
260 {
261 public:
IdIsoLanguageMap()262   IdIsoLanguageMap() : m_idLanguageMap()
263   {
264     IdIsoLanguageEntry const idIsoList[] = {
265       { LANGUAGE_ENGLISH,                     "en", ""   },
266       { LANGUAGE_ENGLISH_US,                  "en", "US" },
267       { LANGUAGE_ENGLISH_UK,                  "en", "GB" },
268       { LANGUAGE_ENGLISH_AUS,                 "en", "AU" },
269       { LANGUAGE_ENGLISH_CAN,                 "en", "CA" },
270       { LANGUAGE_FRENCH,                      "fr", "FR" },
271       { LANGUAGE_GERMAN,                      "de", "DE" },
272       { LANGUAGE_ITALIAN,                     "it", "IT" },
273       { LANGUAGE_DUTCH,                       "nl", "NL" },
274       { LANGUAGE_SPANISH,                     "es", "ES" },
275       { LANGUAGE_SPANISH_MODERN,              "es", "ES" },
276       { LANGUAGE_PORTUGUESE,                  "pt", "PT" },
277       { LANGUAGE_PORTUGUESE_BRAZILIAN,        "pt", "BR" },
278       { LANGUAGE_DANISH,                      "da", "DK" },
279       { LANGUAGE_GREEK,                       "el", "GR" },
280       { LANGUAGE_CHINESE,                     "zh", ""   },
281       { LANGUAGE_CHINESE_TRADITIONAL,         "zh", "TW" },
282       { LANGUAGE_CHINESE_SIMPLIFIED,          "zh", "CN" },
283       { LANGUAGE_CHINESE_HONGKONG,            "zh", "HK" },
284       { LANGUAGE_CHINESE_SINGAPORE,           "zh", "SG" },
285       { LANGUAGE_CHINESE_MACAU,               "zh", "MO" },
286       { LANGUAGE_JAPANESE,                    "ja", "JP" },
287       { LANGUAGE_KOREAN,                      "ko", "KR" },
288       { LANGUAGE_KOREAN_JOHAB,                "ko", "KR" },
289       { LANGUAGE_KOREAN,                      "ko", "KP" },   // North Korea
290       { LANGUAGE_SWEDISH,                     "sv", "SE" },
291       { LANGUAGE_SWEDISH_FINLAND,             "sv", "FI" },
292       { LANGUAGE_FINNISH,                     "fi", "FI" },
293       { LANGUAGE_RUSSIAN,                     "ru", "RU" },
294       { LANGUAGE_ENGLISH_NZ,                  "en", "NZ" },
295       { LANGUAGE_ENGLISH_EIRE,                "en", "IE" },
296       { LANGUAGE_ENGLISH_SAFRICA,             "en", "ZA" },
297       { LANGUAGE_DUTCH_BELGIAN,               "nl", "BE" },
298       { LANGUAGE_FRENCH_BELGIAN,              "fr", "BE" },
299       { LANGUAGE_FRENCH_CANADIAN,             "fr", "CA" },
300       { LANGUAGE_FRENCH_SWISS,                "fr", "CH" },
301       { LANGUAGE_GERMAN_SWISS,                "de", "CH" },
302       { LANGUAGE_GERMAN_AUSTRIAN,             "de", "AT" },
303       { LANGUAGE_ITALIAN_SWISS,               "it", "CH" },
304       { LANGUAGE_ARABIC,                      "ar", ""   },
305       { LANGUAGE_ARABIC_SAUDI_ARABIA,         "ar", "SA" },
306       { LANGUAGE_ARABIC_EGYPT,                "ar", "EG" },
307       { LANGUAGE_ARABIC_UAE,                  "ar", "AE" },
308       { LANGUAGE_AFRIKAANS,                   "af", "ZA" },
309       { LANGUAGE_ALBANIAN,                    "sq", "AL" },
310       { LANGUAGE_ARABIC_IRAQ,                 "ar", "IQ" },
311       { LANGUAGE_ARABIC_LIBYA,                "ar", "LY" },
312       { LANGUAGE_ARABIC_ALGERIA,              "ar", "DZ" },
313       { LANGUAGE_ARABIC_MOROCCO,              "ar", "MA" },
314       { LANGUAGE_ARABIC_TUNISIA,              "ar", "TN" },
315       { LANGUAGE_ARABIC_OMAN,                 "ar", "OM" },
316       { LANGUAGE_ARABIC_YEMEN,                "ar", "YE" },
317       { LANGUAGE_ARABIC_SYRIA,                "ar", "SY" },
318       { LANGUAGE_ARABIC_JORDAN,               "ar", "JO" },
319       { LANGUAGE_ARABIC_LEBANON,              "ar", "LB" },
320       { LANGUAGE_ARABIC_KUWAIT,               "ar", "KW" },
321       { LANGUAGE_ARABIC_BAHRAIN,              "ar", "BH" },
322       { LANGUAGE_ARABIC_QATAR,                "ar", "QA" },
323       { LANGUAGE_BASQUE,                      "eu", ""   },
324       { LANGUAGE_BULGARIAN,                   "bg", "BG" },
325       { LANGUAGE_CROATIAN,                    "hr", "HR" },
326       { LANGUAGE_CZECH,                       "cs", "CZ" },
327       { LANGUAGE_CZECH,                       "cz", ""   },
328       { LANGUAGE_ENGLISH_JAMAICA,             "en", "JM" },
329       { LANGUAGE_ENGLISH_CARRIBEAN,           "en", "BS" },   // not 100%, because AG is Bahamas
330       { LANGUAGE_ENGLISH_BELIZE,              "en", "BZ" },
331       { LANGUAGE_ENGLISH_TRINIDAD,            "en", "TT" },
332       { LANGUAGE_ENGLISH_ZIMBABWE,            "en", "ZW" },
333       { LANGUAGE_ENGLISH_PHILIPPINES,         "en", "PH" },
334       { LANGUAGE_ESTONIAN,                    "et", "EE" },
335       { LANGUAGE_FAEROESE,                    "fo", "FO" },
336       { LANGUAGE_FARSI,                       "fa", ""   },
337       { LANGUAGE_FRENCH_LUXEMBOURG,           "fr", "LU" },
338       { LANGUAGE_FRENCH_MONACO,               "fr", "MC" },
339       { LANGUAGE_GERMAN_LUXEMBOURG,           "de", "LU" },
340       { LANGUAGE_GERMAN_LIECHTENSTEIN,        "de", "LI" },
341       { LANGUAGE_HEBREW,                      "he", "IL" },   // new: old was "iw"
342       { LANGUAGE_HEBREW,                      "iw", "IL" },   // old: new is "he"
343       { LANGUAGE_HUNGARIAN,                   "hu", "HU" },
344       { LANGUAGE_ICELANDIC,                   "is", "IS" },
345       { LANGUAGE_INDONESIAN,                  "id", "ID" },   // new: old was "in"
346       { LANGUAGE_INDONESIAN,                  "in", "ID" },   // old: new is "id"
347       { LANGUAGE_NORWEGIAN,                   "no", "NO" },
348       { LANGUAGE_NORWEGIAN_BOKMAL,            "nb", "NO" },
349       { LANGUAGE_NORWEGIAN_NYNORSK,           "nn", "NO" },
350       { LANGUAGE_POLISH,                      "pl", "PL" },
351       { LANGUAGE_RHAETO_ROMAN,                "rm", ""   },
352       { LANGUAGE_ROMANIAN,                    "ro", "RO" },
353       { LANGUAGE_ROMANIAN_MOLDOVA,            "ro", "MD" },
354       { LANGUAGE_SLOVAK,                      "sk", "SK" },
355       { LANGUAGE_SLOVENIAN,                   "sl", "SI" },
356       { LANGUAGE_SPANISH_MEXICAN,             "es", "MX" },
357       { LANGUAGE_SPANISH_GUATEMALA,           "es", "GT" },
358       { LANGUAGE_SPANISH_COSTARICA,           "es", "CR" },
359       { LANGUAGE_SPANISH_PANAMA,              "es", "PA" },
360       { LANGUAGE_SPANISH_DOMINICAN_REPUBLIC,  "es", "DO" },
361       { LANGUAGE_SPANISH_VENEZUELA,           "es", "VE" },
362       { LANGUAGE_SPANISH_COLOMBIA,            "es", "CO" },
363       { LANGUAGE_SPANISH_PERU,                "es", "PE" },
364       { LANGUAGE_SPANISH_ARGENTINA,           "es", "AR" },
365       { LANGUAGE_SPANISH_ECUADOR,             "es", "EC" },
366       { LANGUAGE_SPANISH_CHILE,               "es", "CL" },
367       { LANGUAGE_SPANISH_URUGUAY,             "es", "UY" },
368       { LANGUAGE_SPANISH_PARAGUAY,            "es", "PY" },
369       { LANGUAGE_SPANISH_BOLIVIA,             "es", "BO" },
370       { LANGUAGE_SPANISH_EL_SALVADOR,         "es", "SV" },
371       { LANGUAGE_SPANISH_HONDURAS,            "es", "HN" },
372       { LANGUAGE_SPANISH_NICARAGUA,           "es", "NI" },
373       { LANGUAGE_SPANISH_PUERTO_RICO,         "es", "PR" },
374       { LANGUAGE_TURKISH,                     "tr", "TR" },
375       { LANGUAGE_UKRAINIAN,                   "uk", "UA" },
376       { LANGUAGE_VIETNAMESE,                  "vi", "VN" },
377       { LANGUAGE_LATVIAN,                     "lv", "LV" },
378       { LANGUAGE_MACEDONIAN,                  "mk", "MK" },
379       { LANGUAGE_MALAY,                       "ms", ""   },
380       { LANGUAGE_MALAY_MALAYSIA,              "ms", "MY" },
381       { LANGUAGE_MALAY_BRUNEI_DARUSSALAM,     "ms", "BN" },
382       { LANGUAGE_THAI,                        "th", "TH" },
383       { LANGUAGE_LITHUANIAN,                  "lt", "LT" },
384       { LANGUAGE_LITHUANIAN_CLASSIC,          "lt", "LT" },
385       { LANGUAGE_CROATIAN,                    "hr", "HR" },   // Croatian in Croatia
386       { LANGUAGE_SERBIAN_LATIN,               "sh", "YU" },   // Serbo-Croatian in Yugoslavia (default)
387       { LANGUAGE_SERBIAN_LATIN,               "sh", "BA" },   // Serbo-Croatian in Bosnia And Herzegovina
388       { LANGUAGE_SERBIAN_CYRILLIC,            "sr", "YU" },
389       { LANGUAGE_SERBIAN,                     "sr", ""   },   // SERBIAN is only LID, MS-LCID not defined (was dupe of CROATIAN)
390       { LANGUAGE_ARMENIAN,                    "hy", "AM" },
391       { LANGUAGE_AZERI,                       "az", ""   },
392       { LANGUAGE_BENGALI,                     "bn", "BD" },
393       { LANGUAGE_KAZAK,                       "kk", "KZ" },
394       { LANGUAGE_URDU,                        "ur", "IN" },
395       { LANGUAGE_HINDI,                       "hi", "IN" },
396       { LANGUAGE_GUJARATI,                    "gu", "IN" },
397       { LANGUAGE_KANNADA,                     "kn", "IN" },
398       { LANGUAGE_ASSAMESE,                    "as", "IN" },
399       { LANGUAGE_KASHMIRI,                    "ks", ""   },
400       { LANGUAGE_KASHMIRI_INDIA,              "ks", "IN" },
401       { LANGUAGE_MALAYALAM,                   "ml", "IN" },
402       { LANGUAGE_MARATHI,                     "mr", "IN" },
403       { LANGUAGE_NEPALI,                      "ne", "NP" },
404       { LANGUAGE_NEPALI_INDIA,                "ne", "IN" },
405       { LANGUAGE_ORIYA,                       "or", "IN" },
406       { LANGUAGE_PUNJABI,                     "pa", "IN" },
407       { LANGUAGE_SANSKRIT,                    "sa", "IN" },
408       { LANGUAGE_SINDHI,                      "sd", "IN" },
409       { LANGUAGE_TAMIL,                       "ta", "IN" },
410       { LANGUAGE_TELUGU,                      "te", "IN" },
411       { LANGUAGE_BELARUSIAN,                  "be", "BY" },
412       { LANGUAGE_CATALAN,                     "ca", "ES" },   // Spain (default)
413       { LANGUAGE_CATALAN,                     "ca", "AD" },   // Andorra
414       { LANGUAGE_FRENCH_CAMEROON,             "fr", "CM" },
415       { LANGUAGE_FRENCH_COTE_D_IVOIRE,        "fr", "CI" },
416       { LANGUAGE_FRENCH_MALI,                 "fr", "ML" },
417       { LANGUAGE_FRENCH_SENEGAL,              "fr", "SN" },
418       { LANGUAGE_FRENCH_ZAIRE,                "fr", "CD" },   // Democratic Republic Of Congo
419       { LANGUAGE_FRISIAN_NETHERLANDS,         "fy", "NL" },
420       { LANGUAGE_GAELIC_IRELAND,              "ga", "IE" },
421       { LANGUAGE_GAELIC_SCOTLAND,             "gd", "GB" },
422       { LANGUAGE_GALICIAN,                    "gl", "ES" },
423       { LANGUAGE_GEORGIAN,                    "ka", "GE" },
424       { LANGUAGE_KHMER,                       "km", "KH" },
425       { LANGUAGE_KIRGHIZ,                     "ky", "KG" },
426       { LANGUAGE_LAO,                         "lo", "LA" },
427       { LANGUAGE_MALTESE,                     "mt", "MT" },
428       { LANGUAGE_MONGOLIAN,                   "mn", "MN" },
429       { LANGUAGE_RUSSIAN_MOLDOVA,             "mo", "MD" },
430       { LANGUAGE_SESOTHO,                     "st", "LS" },   // Lesotho (default)
431       { LANGUAGE_SESOTHO,                     "st", "ZA" },   // South Africa
432       { LANGUAGE_SWAHILI,                     "sw", "KE" },
433       { LANGUAGE_TAJIK,                       "tg", "TJ" },
434       { LANGUAGE_TIBETAN,                     "bo", "CN" },   // CN politically correct?
435       { LANGUAGE_TSONGA,                      "ts", "ZA" },
436       { LANGUAGE_TSWANA,                      "tn", "BW" },   // Botswana (default)
437       { LANGUAGE_TSWANA,                      "tn", "ZA" },   // South Africa
438       { LANGUAGE_TURKMEN,                     "tk", "TM" },
439       { LANGUAGE_WELSH,                       "cy", "GB" },
440       { LANGUAGE_NORTHERNSOTHO,               "ns", "ZA" },
441       { LANGUAGE_XHOSA,                       "xh", "ZA" },
442       { LANGUAGE_ZULU,                        "zu", "ZA" },
443       { LANGUAGE_USER_KINYARWANDA,            "rw", "RW" },
444       { LANGUAGE_USER_MAORI,                  "mi", "NZ" },
445       { LANGUAGE_USER_LATIN,                  "la", ""   },
446       { LANGUAGE_USER_ESPERANTO,              "eo", ""   },
447       { LANGUAGE_NORWEGIAN_BOKMAL,            "no", "BOK"      }, // registered subtags for "no" in rfc1766
448       { LANGUAGE_NORWEGIAN_NYNORSK,           "no", "NYN"      }, // registered subtags for "no" in rfc1766
449       { LANGUAGE_SERBIAN_LATIN,               "sr", "latin"    },
450       { LANGUAGE_SERBIAN_CYRILLIC,            "sr", "cyrillic" },
451       { LANGUAGE_AZERI_LATIN,                 "az", "latin"    },
452       { LANGUAGE_AZERI_CYRILLIC,              "az", "cyrillic" }
453     };
454 
455     for (auto const &l : idIsoList)
456       m_idLanguageMap.insert(std::map<int,IdIsoLanguageEntry>::value_type(l.m_languageId,l));
457   }
getLanguageId(int id,std::string & lang,std::string & country) const458   bool getLanguageId(int id, std::string &lang, std::string &country) const
459   {
460     if (m_idLanguageMap.find(id)==m_idLanguageMap.end())
461       return false;
462     lang=m_idLanguageMap.find(id)->second.m_language;
463     country=m_idLanguageMap.find(id)->second.m_country;
464     return true;
465   }
466 protected:
467   std::map<int,IdIsoLanguageEntry> m_idLanguageMap;
468 };
469 
470 static IdIsoLanguageMap s_idLanguageMap;
getLanguageId(int id,std::string & lang,std::string & country)471 bool getLanguageId(int id, std::string &lang, std::string &country)
472 {
473   return s_idLanguageMap.getLanguageId(id, lang, country);
474 }
475 }
476 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
477