sync with tizen_2.0
[platform/framework/native/appfw.git] / src / locales / FLclLocale.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file            FLclLocale.cpp
20  * @brief           This is the implementation file for Locale class.
21  */
22
23 #include <unique_ptr.h>
24
25 #include <FBaseSysLog.h>
26 #include "FBase_StringConverter.h"
27 #include <FLclLocale.h>
28
29 #include "FLcl_LocaleImpl.h"
30
31 using namespace Tizen::Base;
32
33 namespace Tizen { namespace Locales
34 {
35
36 static const char* LanguageCodeString3LetterArray[LANGUAGE_MAX] =
37 {
38         "aar", /**< Afar */
39         "abk", /**< Abkhazian */
40         "ace", /**< Achinese */
41         "ach", /**< Acoli */
42         "ada", /**< Adangme */
43         "ady", /**< Adyghe; Adygei */
44         "afa", /**< Afro-Asiatic languages */
45         "afh", /**< Afrihili */
46         "afr", /**< Afrikaans */
47         "ain", /**< Ainu */
48         "aka", /**< Akan */
49         "akk", /**< Akkadian */
50         "sqi", /**< Albanian */
51         "ale", /**< Aleut */
52         "alg", /**< Algonquian languages */
53         "alt", /**< Southern Altai */
54         "amh", /**< Amharic */
55         "ang", /**< English, Old (ca.450-1100) */
56         "anp", /**< Angika */
57         "apa", /**< Apache languages */
58         "ara", /**< Arabic */
59         "arc", /**< Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE) */
60         "arg", /**< Aragonese */
61         "hye", /**< Armenian */
62         "arn", /**< Mapudungun; Mapuche */
63         "arp", /**< Arapaho */
64         "art", /**< Artificial languages */
65         "arw", /**< Arawak */
66         "asm", /**< Assamese */
67         "ast", /**< Asturian; Bable; Leonese; Asturleonese */
68         "ath", /**< Athapascan languages */
69         "aus", /**< Australian languages */
70         "ava", /**< Avaric */
71         "ave", /**< Avestan */
72         "awa", /**< Awadhi */
73         "aym", /**< Aymara */
74         "aze", /**< Azerbaijani */
75         "aze-arab", /**< Azerbaijani (Arabic) */
76         "aze-cyrl", /**< Azerbaijani (Cyrillic) */
77         "aze-latn", /**< Azerbaijani (Latin) */
78         "bad", /**< Banda languages */
79         "bai", /**< Bamileke languages */
80         "bak", /**< Bashkir */
81         "bal", /**< Baluchi */
82         "bam", /**< Bambara */
83         "ban", /**< Balinese */
84         "eus", /**< Basque */
85         "bas", /**< Basa */
86         "bat", /**< Baltic languages */
87         "bej", /**< Beja; Bedawiyet */
88         "bel", /**< Belarusian */
89         "bem", /**< Bemba */
90         "ben", /**< Bengali */
91         "ber", /**< Berber languages */
92         "bho", /**< Bhojpuri */
93         "bih", /**< Bihari */
94         "bik", /**< Bikol */
95         "bin", /**< Bini; Edo */
96         "bis", /**< Bislama */
97         "bla", /**< Siksika */
98         "bnt", /**< Bantu (Other) */
99         "bos", /**< Bosnian */
100         "bra", /**< Braj */
101         "bre", /**< Breton */
102         "btk", /**< Batak languages */
103         "bua", /**< Buriat */
104         "bug", /**< Buginese */
105         "bul", /**< Bulgarian */
106         "mya", /**< Burmese */
107         "byn", /**< Blin; Bilin */
108         "cad", /**< Caddo */
109         "cai", /**< Central American Indian languages */
110         "car", /**< Galibi Carib */
111         "cat", /**< Catalan; Valencian */
112         "cau", /**< Caucasian languages */
113         "ceb", /**< Cebuano */
114         "cel", /**< Celtic languages */
115         "cha", /**< Chamorro */
116         "chb", /**< Chibcha */
117         "che", /**< Chechen */
118         "chg", /**< Chagatai */
119         "zho", /**< Chinese */
120         "zho-hans", /**< Chinese (Simplified) */
121         "zho-hant", /**< Chinese (Traditional) */
122         "chk", /**< Chuukese */
123         "chm", /**< Mari */
124         "chn", /**< Chinook jargon */
125         "cho", /**< Choctaw */
126         "chp", /**< Chipewyan; Dene Suline */
127         "chr", /**< Cherokee */
128         "chu", /**< Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic */
129         "chv", /**< Chuvash */
130         "chy", /**< Cheyenne */
131         "cmc", /**< Chamic languages */
132         "cop", /**< Coptic */
133         "cor", /**< Cornish */
134         "cos", /**< Corsican */
135         "cpe", /**< Creoles and pidgins, English based */
136         "cpf", /**< Creoles and pidgins, French-based  */
137         "cpp", /**< Creoles and pidgins, Portuguese-based  */
138         "cre", /**< Cree */
139         "crh", /**< Crimean Tatar; Crimean Turkish */
140         "crp", /**< Creoles and pidgins  */
141         "csb", /**< Kashubian */
142         "cus", /**< Cushitic languages */
143         "ces", /**< Czech */
144         "dak", /**< Dakota */
145         "dan", /**< Danish */
146         "dar", /**< Dargwa */
147         "day", /**< Land Dayak languages */
148         "del", /**< Delaware */
149         "den", /**< Slave (Athapascan) */
150         "dgr", /**< Dogrib */
151         "din", /**< Dinka */
152         "div", /**< Divehi; Dhivehi; Maldivian */
153         "doi", /**< Dogri */
154         "dra", /**< Dravidian languages */
155         "dsb", /**< Lower Sorbian */
156         "dua", /**< Duala */
157         "dum", /**< Dutch, Middle (ca.1050-1350) */
158         "nld", /**< Dutch; Flemish */
159         "dyu", /**< Dyula */
160         "dzo", /**< Dzongkha */
161         "efi", /**< Efik */
162         "egy", /**< Egyptian (Ancient) */
163         "eka", /**< Ekajuk */
164         "elx", /**< Elamite */
165         "eng", /**< English */
166         "enm", /**< English, Middle (1100-1500) */
167         "epo", /**< Esperanto */
168         "est", /**< Estonian */
169         "ewe", /**< Ewe */
170         "ewo", /**< Ewondo */
171         "fan", /**< Fang */
172         "fao", /**< Faroese */
173         "fat", /**< Fanti */
174         "fij", /**< Fijian */
175         "fil", /**< Filipino; Pilipino */
176         "fin", /**< Finnish */
177         "fiu", /**< Finno-Ugrian languages */
178         "fon", /**< Fon */
179         "fra", /**< French */
180         "frm", /**< French, Middle (ca.1400-1600) */
181         "fro", /**< French, Old (842-ca.1400) */
182         "frr", /**< Northern Frisian */
183         "frs", /**< Eastern Frisian */
184         "fry", /**< Western Frisian */
185         "ful", /**< Fulah */
186         "fur", /**< Friulian */
187         "gaa", /**< Ga */
188         "gay", /**< Gayo */
189         "gba", /**< Gbaya */
190         "gem", /**< Germanic languages */
191         "kat", /**< Georgian */
192         "deu", /**< German */
193         "gez", /**< Geez */
194         "gil", /**< Gilbertese */
195         "gla", /**< Gaelic; Scottish Gaelic */
196         "gle", /**< Irish */
197         "glg", /**< Galician */
198         "glv", /**< Manx */
199         "gmh", /**< German, Middle High (ca.1050-1500) */
200         "goh", /**< German, Old High (ca.750-1050) */
201         "gon", /**< Gondi */
202         "gor", /**< Gorontalo */
203         "got", /**< Gothic */
204         "grb", /**< Grebo */
205         "grc", /**< Greek, Ancient (to 1453) */
206         "ell", /**< Greek, Modern (1453-) */
207         "grn", /**< Guarani */
208         "gsw", /**< Swiss German; Alemannic; Alsatian */
209         "guj", /**< Gujarati */
210         "gwi", /**< Gwich'in */
211         "hai", /**< Haida */
212         "hat", /**< Haitian; Haitian Creole */
213         "hau", /**< Hausa */
214         "hau-latn", /**< Hausa (Latin) */
215         "haw", /**< Hawaiian */
216         "heb", /**< Hebrew */
217         "her", /**< Herero */
218         "hil", /**< Hiligaynon */
219         "him", /**< Himachali */
220         "hin", /**< Hindi */
221         "hit", /**< Hittite */
222         "hmn", /**< Hmong */
223         "hmo", /**< Hiri Motu */
224         "hrv", /**< Croatian */
225         "hsb", /**< Upper Sorbian */
226         "hun", /**< Hungarian */
227         "hup", /**< Hupa */
228         "iba", /**< Iban */
229         "ibo", /**< Igbo */
230         "isl", /**< Icelandic */
231         "ido", /**< Ido */
232         "iii", /**< Sichuan Yi; Nuosu */
233         "ijo", /**< Ijo languages */
234         "iku", /**< Inuktitut */
235         "ile", /**< Interlingue; Occidental */
236         "ilo", /**< Iloko */
237         "ina", /**< Interlingua (International Auxiliary Language Association) */
238         "inc", /**< Indic languages */
239         "ind", /**< Indonesian */
240         "ine", /**< Indo-European languages */
241         "inh", /**< Ingush */
242         "ipk", /**< Inupiaq */
243         "ira", /**< Iranian languages */
244         "iro", /**< Iroquoian languages */
245         "ita", /**< Italian */
246         "jav", /**< Javanese */
247         "jbo", /**< Lojban */
248         "jpn", /**< Japanese */
249         "jpr", /**< Judeo-Persian */
250         "jrb", /**< Judeo-Arabic */
251         "kaa", /**< Kara-Kalpak */
252         "kab", /**< Kabyle */
253         "kac", /**< Kachin; Jingpho */
254         "kal", /**< Kalaallisut; Greenlandic */
255         "kam", /**< Kamba */
256         "kan", /**< Kannada */
257         "kar", /**< Karen languages */
258         "kas", /**< Kashmiri */
259         "kau", /**< Kanuri */
260         "kaw", /**< Kawi */
261         "kaz", /**< Kazakh */
262         "kaz-cyrl", /**< Kazakh (Cyrillic) */
263         "kbd", /**< Kabardian */
264         "kha", /**< Khasi */
265         "khi", /**< Khoisan languages */
266         "khm", /**< Central Khmer */
267         "kho", /**< Khotanese; Sakan */
268         "kik", /**< Kikuyu; Gikuyu */
269         "kin", /**< Kinyarwanda */
270         "kir", /**< Kirghiz; Kyrgyz */
271         "kmb", /**< Kimbundu */
272         "kok", /**< Konkani */
273         "kom", /**< Komi */
274         "kon", /**< Kongo */
275         "kor", /**< Korean */
276         "kos", /**< Kosraean */
277         "kpe", /**< Kpelle */
278         "krc", /**< Karachay-Balkar */
279         "krl", /**< Karelian */
280         "kro", /**< Kru languages */
281         "kru", /**< Kurukh */
282         "kua", /**< Kuanyama; Kwanyama */
283         "kum", /**< Kumyk */
284         "kur", /**< Kurdish */
285         "kut", /**< Kutenai */
286         "lad", /**< Ladino */
287         "lah", /**< Lahnda */
288         "lam", /**< Lamba */
289         "lao", /**< Lao */
290         "lat", /**< Latin */
291         "lav", /**< Latvian */
292         "lez", /**< Lezghian */
293         "lim", /**< Limburgan; Limburger; Limburgish */
294         "lin", /**< Lingala */
295         "lit", /**< Lithuanian */
296         "lol", /**< Mongo */
297         "loz", /**< Lozi */
298         "ltz", /**< Luxembourgish; Letzeburgesch */
299         "lua", /**< Luba-Lulua */
300         "lub", /**< Luba-Katanga */
301         "lug", /**< Ganda */
302         "lui", /**< Luiseno */
303         "lun", /**< Lunda */
304         "luo", /**< Luo (Kenya and Tanzania) */
305         "lus", /**< Lushai */
306         "mkd", /**< Macedonian */
307         "mad", /**< Madurese */
308         "mag", /**< Magahi */
309         "mah", /**< Marshallese */
310         "mai", /**< Maithili */
311         "mak", /**< Makasar */
312         "mal", /**< Malayalam */
313         "man", /**< Mandingo */
314         "mri", /**< Maori */
315         "map", /**< Austronesian languages */
316         "mar", /**< Marathi */
317         "mas", /**< Masai */
318         "msa", /**< Malay */
319         "mdf", /**< Moksha */
320         "mdr", /**< Mandar */
321         "men", /**< Mende */
322         "mga", /**< Irish, Middle (900-1200) */
323         "mic", /**< Mi'kmaq; Micmac */
324         "min", /**< Minangkabau */
325         "mis", /**< Uncoded languages */
326         "mkh", /**< Mon-Khmer languages */
327         "mlg", /**< Malagasy */
328         "mlt", /**< Maltese */
329         "mnc", /**< Manchu */
330         "mni", /**< Manipuri */
331         "mno", /**< Manobo languages */
332         "moh", /**< Mohawk */
333         "mon", /**< Mongolian */
334         "mos", /**< Mossi */
335         "mul", /**< Multiple languages */
336         "mun", /**< Munda languages */
337         "mus", /**< Creek */
338         "mwl", /**< Mirandese */
339         "mwr", /**< Marwari */
340         "myn", /**< Mayan languages */
341         "myv", /**< Erzya */
342         "nah", /**< Nahuatl languages */
343         "nai", /**< North American Indian languages */
344         "nap", /**< Neapolitan */
345         "nau", /**< Nauru */
346         "nav", /**< Navajo; Navaho */
347         "nbl", /**< Ndebele, South; South Ndebele */
348         "nde", /**< Ndebele, North; North Ndebele */
349         "ndo", /**< Ndonga */
350         "nds", /**< Low German; Low Saxon; German, Low; Saxon, Low */
351         "nep", /**< Nepali */
352         "new", /**< Nepal Bhasa; Newari */
353         "nia", /**< Nias */
354         "nic", /**< Niger-Kordofanian languages */
355         "niu", /**< Niuean */
356         "nno", /**< Norwegian Nynorsk; Nynorsk, Norwegian */
357         "nob", /**< Bokmal, Norwegian; Norwegian Bokmal */
358         "nog", /**< Nogai */
359         "non", /**< Norse, Old */
360         "nor", /**< Norwegian */
361         "nqo", /**< N'Ko */
362         "nso", /**< Pedi; Sepedi; Northern Sotho */
363         "nub", /**< Nubian languages */
364         "nwc", /**< Classical Newari; Old Newari; Classical Nepal Bhasa */
365         "nya", /**< Chichewa; Chewa; Nyanja */
366         "nym", /**< Nyamwezi */
367         "nyn", /**< Nyankole */
368         "nyo", /**< Nyoro */
369         "nzi", /**< Nzima */
370         "oci", /**< Occitan (post 1500); Provencal */
371         "oji", /**< Ojibwa */
372         "ori", /**< Oriya */
373         "orm", /**< Oromo */
374         "osa", /**< Osage */
375         "oss", /**< Ossetian; Ossetic */
376         "ota", /**< Turkish, Ottoman (1500-1928) */
377         "oto", /**< Otomian languages */
378         "paa", /**< Papuan languages */
379         "pag", /**< Pangasinan */
380         "pal", /**< Pahlavi */
381         "pam", /**< Pampanga; Kapampangan */
382         "pan", /**< Panjabi; Punjabi */
383         "pan-arab", /**< Panjabi; Punjabi (Arabic) */
384         "pan-guru", /**< Panjabi; Punjabi (Gurmukhi) */
385         "pap", /**< Papiamento */
386         "pau", /**< Palauan */
387         "peo", /**< Persian, Old (ca.600-400 B.C.) */
388         "fas", /**< Persian */
389         "phi", /**< Philippine languages */
390         "phn", /**< Phoenician */
391         "pli", /**< Pali */
392         "pol", /**< Polish */
393         "pon", /**< Pohnpeian */
394         "por", /**< Portuguese */
395         "pra", /**< Prakrit languages */
396         "pro", /**< Provencal, Old (to 1500) */
397         "pus", /**< Pushto; Pashto */
398         "qaa-qtz", /**< Reserved for local use */
399         "que", /**< Quechua */
400         "raj", /**< Rajasthani */
401         "rap", /**< Rapanui */
402         "rar", /**< Rarotongan; Cook Islands Maori */
403         "roa", /**< Romance languages */
404         "roh", /**< Romansh */
405         "rom", /**< Romany */
406         "ron", /**< Romanian; Moldavian; Moldovan */
407         "run", /**< Rundi */
408         "rup", /**< Aromanian; Arumanian; Macedo-Romanian */
409         "rus", /**< Russian */
410         "sad", /**< Sandawe */
411         "sag", /**< Sango */
412         "sah", /**< Yakut */
413         "sai", /**< South American Indian (Other) */
414         "sal", /**< Salishan languages */
415         "sam", /**< Samaritan Aramaic */
416         "san", /**< Sanskrit */
417         "sas", /**< Sasak */
418         "sat", /**< Santali */
419         "scn", /**< Sicilian */
420         "sco", /**< Scots */
421         "sel", /**< Selkup */
422         "sem", /**< Semitic languages */
423         "sga", /**< Irish, Old (to 900) */
424         "sgn", /**< Sign Languages */
425         "shn", /**< Shan */
426         "sid", /**< Sidamo */
427         "sin", /**< Sinhala; Sinhalese */
428         "sio", /**< Siouan languages */
429         "sit", /**< Sino-Tibetan languages */
430         "sla", /**< Slavic languages */
431         "slk", /**< Slovak */
432         "slv", /**< Slovenian */
433         "sma", /**< Southern Sami */
434         "sme", /**< Northern Sami */
435         "smi", /**< Sami languages */
436         "smj", /**< Lule Sami */
437         "smn", /**< Inari Sami */
438         "smo", /**< Samoan */
439         "sms", /**< Skolt Sami */
440         "sna", /**< Shona */
441         "snd", /**< Sindhi */
442         "snk", /**< Soninke */
443         "sog", /**< Sogdian */
444         "som", /**< Somali */
445         "son", /**< Songhai languages */
446         "sot", /**< Sotho, Southern */
447         "spa", /**< Spanish; Castilian */
448         "srd", /**< Sardinian */
449         "srn", /**< Sranan Tongo */
450         "srp", /**< Serbian */
451         "srp-cyrl", /**< Serbian (Cyrillic) */
452         "srp-latn", /**< Serbian (Latin) */
453         "srr", /**< Serer */
454         "ssa", /**< Nilo-Saharan languages */
455         "ssw", /**< Swati */
456         "suk", /**< Sukuma */
457         "sun", /**< Sundanese */
458         "sus", /**< Susu */
459         "sux", /**< Sumerian */
460         "swa", /**< Swahili */
461         "swe", /**< Swedish */
462         "syc", /**< Classical Syriac */
463         "syr", /**< Syriac */
464         "tah", /**< Tahitian */
465         "tai", /**< Tai languages */
466         "tam", /**< Tamil */
467         "tat", /**< Tatar */
468         "tel", /**< Telugu */
469         "tem", /**< Timne */
470         "ter", /**< Tereno */
471         "tet", /**< Tetum */
472         "tgk", /**< Tajik */
473         "tgl", /**< Tagalog */
474         "tha", /**< Thai */
475         "bod", /**< Tibetan */
476         "tig", /**< Tigre */
477         "tir", /**< Tigrinya */
478         "tiv", /**< Tiv */
479         "tkl", /**< Tokelau */
480         "tlh", /**< Klingon; tlhIngan-Hol */
481         "tli", /**< Tlingit */
482         "tmh", /**< Tamashek */
483         "tog", /**< Tonga (Nyasa) */
484         "ton", /**< Tonga (Tonga Islands) */
485         "tpi", /**< Tok Pisin */
486         "tsi", /**< Tsimshian */
487         "tsn", /**< Tswana */
488         "tso", /**< Tsonga */
489         "tuk", /**< Turkmen */
490         "tuk-cyrl", /**< Turkmen (Cyrillic) */
491         "tuk-latn", /**< Turkmen (Latin) */
492         "tum", /**< Tumbuka */
493         "tup", /**< Tupi languages */
494         "tur", /**< Turkish */
495         "tut", /**< Altaic languages */
496         "tvl", /**< Tuvalu */
497         "twi", /**< Twi */
498         "tyv", /**< Tuvinian */
499         "udm", /**< Udmurt */
500         "uga", /**< Ugaritic */
501         "uig", /**< Uighur; Uyghur */
502         "ukr", /**< Ukrainian */
503         "umb", /**< Umbundu */
504         "und", /**< Undetermined */
505         "urd", /**< Urdu */
506         "uzb", /**< Uzbek */
507         "uzb-arab", /**< Uzbek (Arabic) */
508         "uzb-cyrl", /**< Uzbek (Cyrillic) */
509         "uzb-latn", /**< Uzbek (Latin) */
510         "vai", /**< Vai */
511         "ven", /**< Venda */
512         "vie", /**< Vietnamese */
513         "vls", /**< Vlaams; Flemish */
514         "vol", /**< Volapuk */
515         "vot", /**< Votic */
516         "wak", /**< Wakashan languages */
517         "wal", /**< Walamo */
518         "war", /**< Waray */
519         "was", /**< Washo */
520         "cym", /**< Welsh */
521         "wen", /**< Sorbian languages */
522         "wln", /**< Walloon */
523         "wol", /**< Wolof */
524         "xal", /**< Kalmyk; Oirat */
525         "xho", /**< Xhosa */
526         "yao", /**< Yao */
527         "yap", /**< Yapese */
528         "yid", /**< Yiddish */
529         "yor", /**< Yoruba */
530         "ypk", /**< Yupik languages */
531         "zap", /**< Zapotec */
532         "zbl", /**< Blissymbols; Blissymbolics; Bliss */
533         "zen", /**< Zenaga */
534         "zha", /**< Zhuang; Chuang */
535         "znd", /**< Zande languages */
536         "zul", /**< Zulu */
537         "zun", /**< Zuni */
538         "zxx", /**< No linguistic content; Not applicable */
539         "zza", /**< Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki */
540 };
541
542
543 static const char CountryCodeString2LetterArray[COUNTRY_MAX][4] =
544 {
545         "AF", /**< AFGHANISTAN  */
546         "AX", /**< ALAND ISLANDS */
547         "AL", /**< ALBANIA */
548         "DZ", /**< ALGERIA */
549         "AS", /**< AMERICAN SAMOA */
550         "AD", /**< ANDORRA */
551         "AO", /**< ANGOLA */
552         "AI", /**< ANGUILLA */
553         "AQ", /**< ANTARCTICA */
554         "AG", /**< ANTIGUA AND BARBUDA */
555         "AR", /**< ARGENTINA */
556         "AM", /**< ARMENIA */
557         "AW", /**< ARUBA */
558         "AU", /**< AUSTRALIA */
559         "AT", /**< AUSTRIA */
560         "AZ", /**< AZERBAIJAN */
561         "BS", /**< BAHAMAS */
562         "BH", /**< BAHRAIN */
563         "BD", /**< BANGLADESH */
564         "BB", /**< BARBADOS */
565         "BY", /**< BELARUS */
566         "BE", /**< BELGIUM */
567         "BZ", /**< BELIZE */
568         "BJ", /**< BENIN */
569         "BM", /**< BERMUDA */
570         "BT", /**< BHUTAN */
571         "BO", /**< BOLIVIA */
572         "BA", /**< BOSNIA AND HERZEGOVINA */
573         "BW", /**< BOTSWANA */
574         "BV", /**< BOUVET ISLAND */
575         "BR", /**< BRAZIL */
576         "IO", /**< BRITISH INDIAN OCEAN TERRITORY */
577         "BN", /**< BRUNEI DARUSSALAM */
578         "BG", /**< BULGARIA */
579         "BF", /**< BURKINA FASO */
580         "BI", /**< BURUNDI */
581         "KH", /**< CAMBODIA */
582         "CM", /**< CAMEROON */
583         "CA", /**< CANADA */
584         "CV", /**< CAPE VERDE */
585         "KY", /**< CAYMAN ISLANDS */
586         "CF", /**< CENTRAL AFRICAN REPUBLIC */
587         "TD", /**< CHAD */
588         "CL", /**< CHILE */
589         "CN", /**< CHINA */
590         "CX", /**< CHRISTMAS ISLAND */
591         "CC", /**< COCOS (KEELING) ISLANDS */
592         "CO", /**< COLOMBIA */
593         "KM", /**< COMOROS */
594         "CG", /**< CONGO */
595         "CD", /**< CONGO, THE DEMOCRATIC REPUBLIC OF THE */
596         "CK", /**< COOK ISLANDS */
597         "CR", /**< COSTA RICA */
598         "CI", /**< COTE D'IVOIRE */
599         "HR", /**< CROATIA */
600         "CU", /**< CUBA */
601         "CY", /**< CYPRUS */
602         "CZ", /**< CZECH REPUBLIC */
603         "DK", /**< DENMARK */
604         "DJ", /**< DJIBOUTI */
605         "DM", /**< DOMINICA */
606         "DO", /**< DOMINICAN REPUBLIC */
607         "EC", /**< ECUADOR */
608         "EG", /**< EGYPT */
609         "SV", /**< EL SALVADOR */
610         "GQ", /**< EQUATORIAL GUINEA */
611         "ER", /**< ERITREA */
612         "EE", /**< ESTONIA */
613         "ET", /**< ETHIOPIA */
614         "FK", /**< FALKLAND ISLANDS (MALVINAS) */
615         "FO", /**< FAROE ISLANDS */
616         "FJ", /**< FIJI */
617         "FI", /**< FINLAND */
618         "FR", /**< FRANCE */
619         "GF", /**< FRENCH GUIANA */
620         "PF", /**< FRENCH POLYNESIA */
621         "TF", /**< FRENCH SOUTHERN TERRITORIES */
622         "GA", /**< GABON  */
623         "GM", /**< GAMBIA */
624         "GE", /**< GEORGIA */
625         "DE", /**< GERMANY */
626         "GH", /**< GHANA */
627         "GI", /**< GIBRALTAR */
628         "GR", /**< GREECE */
629         "GL", /**< GREENLAND */
630         "GD", /**< GRENADA */
631         "GP", /**< GUADELOUPE */
632         "GU", /**< GUAM */
633         "GT", /**< GUATEMALA */
634         "GN", /**< GUINEA */
635         "GW", /**< GUINEA-BISSAU */
636         "GY", /**< GUYANA */
637         "HT", /**< HAITI */
638         "HM", /**< HEARD ISLAND AND MCDONALD ISLANDS */
639         "VA", /**< HOLY SEE (VATICAN CITY STATE) */
640         "HN", /**< HONDURAS */
641         "HK", /**< HONG KONG */
642         "HU", /**< HUNGARY */
643         "IS", /**< ICELAND */
644         "IN", /**< INDIA */
645         "ID", /**< INDONESIA */
646         "IR", /**< IRAN, ISLAMIC REPUBLIC OF */
647         "IQ", /**< IRAQ */
648         "IE", /**< IRELAND */
649         "IL", /**< ISRAEL */
650         "IT", /**< ITALY */
651         "JM", /**< JAMAICA */
652         "JP", /**< JAPAN */
653         "JO", /**< JORDAN */
654         "KZ", /**< KAZAKHSTAN */
655         "KE", /**< KENYA */
656         "KI", /**< KIRIBATI */
657         "KP", /**< KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF */
658         "KR", /**< KOREA, REPUBLIC OF */
659         "KW", /**< KUWAIT */
660         "KG", /**< KYRGYZSTAN */
661         "LA", /**< LAO PEOPLE'S DEMOCRATIC REPUBLIC  */
662         "LV", /**< LATVIA */
663         "LB", /**< LEBANON */
664         "LS", /**< LESOTHO */
665         "LR", /**< LIBERIA */
666         "LY", /**< LIBYAN ARAB JAMAHIRIYA */
667         "LI", /**< LIECHTENSTEIN */
668         "LT", /**< LITHUANIA */
669         "LU", /**< LUXEMBOURG */
670         "MO", /**< MACAO */
671         "MK", /**< MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF */
672         "MG", /**< MADAGASCAR */
673         "MW", /**< MALAWI */
674         "MY", /**< MALAYSIA */
675         "MV", /**< MALDIVES */
676         "ML", /**< MALI */
677         "MT", /**< MALTA */
678         "MH", /**< MARSHALL ISLANDS */
679         "MQ", /**< MARTINIQUE */
680         "MR", /**< MAURITANIA */
681         "MU", /**< MAURITIUS */
682         "YT", /**< MAYOTTE */
683         "MX", /**< MEXICO */
684         "FM", /**< MICRONESIA, FEDERATED STATES OF */
685         "MD", /**< MOLDOVA, REPUBLIC OF */
686         "MC", /**< MONACO */
687         "MN", /**< MONGOLIA */
688         "MS", /**< MONTSERRAT */
689         "MA", /**< MOROCCO */
690         "MZ", /**< MOZAMBIQUE */
691         "MM", /**< MYANMAR */
692         "NA", /**< NAMIBIA */
693         "NR", /**< NAURU */
694         "NP", /**< NEPAL */
695         "NL", /**< NETHERLANDS */
696         "AN", /**< NETHERLANDS ANTILLES */
697         "NC", /**< NEW CALEDONIA */
698         "NZ", /**< NEW ZEALAND */
699         "NI", /**< NICARAGUA */
700         "NE", /**< NIGER */
701         "NG", /**< NIGERIA */
702         "NU", /**< NIUE */
703         "NF", /**< NORFOLK ISLAND */
704         "MP", /**< NORTHERN MARIANA ISLANDS */
705         "NO", /**< NORWAY */
706         "OM", /**< OMAN */
707         "PK", /**< PAKISTAN */
708         "PW", /**< PALAU */
709         "PS", /**< PALESTINIAN TERRITORY, OCCUPIED */
710         "PA", /**< PANAMA */
711         "PG", /**< PAPUA NEW GUINEA */
712         "PY", /**< PARAGUAY */
713         "PE", /**< PERU */
714         "PH", /**< PHILIPPINES */
715         "PN", /**< PITCAIRN */
716         "PL", /**< POLAND */
717         "PT", /**< PORTUGAL */
718         "PR", /**< PUERTO RICO */
719         "QA", /**< QATAR */
720         "RE", /**< REUNION */
721         "RO", /**< ROMANIA */
722         "RU", /**< RUSSIAN FEDERATION */
723         "RW", /**< RWANDA */
724         "SH", /**< SAINT HELENA  */
725         "KN", /**< SAINT KITTS AND NEVIS */
726         "LC", /**< SAINT LUCIA */
727         "PM", /**< SAINT PIERRE AND MIQUELON */
728         "VC", /**< SAINT VINCENT AND THE GRENADINES */
729         "WS", /**< SAMOA */
730         "SM", /**< SAN MARINO */
731         "ST", /**< SAO TOME AND PRINCIPE */
732         "SA", /**< SAUDI ARABIA */
733         "SN", /**< SENEGAL */
734         "SC", /**< SEYCHELLES */
735         "SL", /**< SIERRA LEONE */
736         "SG", /**< SINGAPORE */
737         "SK", /**< SLOVAKIA */
738         "SI", /**< SLOVENIA */
739         "SB", /**< SOLOMON ISLANDS */
740         "SO", /**< SOMALIA */
741         "ZA", /**< SOUTH AFRICA */
742         "GS", /**< SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS */
743         "ES", /**< SPAIN */
744         "LK", /**< SRI LANKA */
745         "SD", /**< SUDAN */
746         "SR", /**< SURINAME */
747         "SJ", /**< SVALBARD AND JAN MAYEN */
748         "SZ", /**< SWAZILAND */
749         "SE", /**< SWEDEN */
750         "CH", /**< SWITZERLAND */
751         "SY", /**< SYRIAN ARAB REPUBLIC */
752         "TW", /**< TAIWAN, PROVINCE OF CHINA */
753         "TJ", /**< TAJIKISTAN */
754         "TZ", /**< TANZANIA, UNITED REPUBLIC OF */
755         "TH", /**< THAILAND */
756         "TL", /**< TIMOR-LESTE */
757         "TG", /**< TOGO */
758         "TK", /**< TOKELAU */
759         "TO", /**< TONGA */
760         "TT", /**< TRINIDAD AND TOBAGO */
761         "TN", /**< TUNISIA */
762         "TR", /**< TURKEY */
763         "TM", /**< TURKMENISTAN */
764         "TC", /**< TURKS AND CAICOS ISLANDS */
765         "TV", /**< TUVALU */
766         "UG", /**< UGANDA */
767         "UA", /**< UKRAINE */
768         "AE", /**< UNITED ARAB EMIRATES */
769         "GB", /**< UNITED KINGDOM */
770         "US", /**< UNITED STATES */
771         "UM", /**< UNITED STATES MINOR OUTLYING ISLANDS */
772         "UY", /**< URUGUAY */
773         "UZ", /**< UZBEKISTAN */
774         "VU", /**< VANUATU */
775         "VE", /**< VENEZUELA */
776         "VN", /**< VIET NAM */
777         "VG", /**< VIRGIN ISLANDS, BRITISH */
778         "VI", /**< VIRGIN ISLANDS, U.S. */
779         "WF", /**< WALLIS AND FUTUNA */
780         "EH", /**< WESTERN SAHARA */
781         "YE", /**< YEMEN */
782         "ZM", /**< ZAMBIA */
783         "ZW", /**< ZIMBABWE */
784         "RS", /**< SERBIA */
785         "ME" /**< MONTENEGRO */
786 };
787
788
789 /////////////////////////////////////////////////////////////////////////////////////////////////////
790 // Public Method
791
792 Locale::Locale(const Locale& other)
793         : __languageCode(other.__languageCode)
794         , __countryCode(other.__countryCode)
795         , __pLocaleImpl(other.__pLocaleImpl->CloneN())
796 {
797         SysAssert(__pLocaleImpl);
798 }
799
800
801 Locale::Locale(LanguageCode languageCode, CountryCode countryCode, const String* pVariantCodeString)
802         : __languageCode((languageCode < LANGUAGE_MAX)? languageCode : LANGUAGE_INVALID)
803         , __countryCode((countryCode < COUNTRY_MAX) ? countryCode : COUNTRY_INVALID)
804         , __pLocaleImpl(null)
805 {
806         const char* pLanguage = (languageCode != LANGUAGE_INVALID) ? LanguageCodeString3LetterArray[__languageCode] : null;
807         const char* pCountry = (countryCode != COUNTRY_INVALID) ? CountryCodeString2LetterArray[__countryCode] : null;
808         
809         std::unique_ptr<char[]> pVariantCode (null);
810         if (pVariantCodeString)
811         {
812                 pVariantCode.reset(_StringConverter::CopyToCharArrayN(*pVariantCodeString));
813         }
814
815         __pLocaleImpl = new (std::nothrow) _LocaleImpl(pLanguage, pCountry, pVariantCode.get());
816         SysAssert(__pLocaleImpl);
817 }
818
819
820 Locale&
821 Locale::operator =(const Locale& other)
822 {
823         if (&other != this)
824         {
825                 __languageCode = other.__languageCode;
826                 __countryCode = other.__countryCode;
827
828                 delete __pLocaleImpl;
829                 __pLocaleImpl = other.__pLocaleImpl->CloneN();
830         }
831         return *this;
832 }
833
834
835 Locale::~Locale(void)
836 {
837         delete __pLocaleImpl;
838         __pLocaleImpl = null;
839 }
840
841
842 void
843 Locale::SetVariantCodeString(const String* pVariantCode)
844 {
845         std::unique_ptr<char[]> pVariant (null);
846         if (pVariantCode)
847         {
848                 pVariant.reset(_StringConverter::CopyToCharArrayN(*pVariantCode));
849         }
850         __pLocaleImpl->SetVariantCodeString(pVariant.get());
851 }
852
853
854 // Access
855 LanguageCode
856 Locale::GetLanguageCode(void) const
857 {
858         return __languageCode;
859 }
860
861
862 CountryCode
863 Locale::GetCountryCode(void) const
864 {
865         return __countryCode;
866 }
867
868
869 String
870 Locale::GetLanguageCodeString(void) const
871 {
872         return __pLocaleImpl->GetLanguageCodeString(false);
873 }
874
875
876 String
877 Locale::GetCountryCodeString(void) const
878 {       
879         return __pLocaleImpl->Get2LetterCountryCodeString();
880 }
881
882
883 String
884 Locale::GetVariantCodeString(void) const
885 {
886         return __pLocaleImpl->GetVariantCodeString();
887 }
888
889
890 String
891 Locale::GetLocaleCodeString(void) const
892 {
893         String lclCode(__pLocaleImpl->GetLanguageCodeString(false));
894         if (!lclCode.IsEmpty())
895         {
896                 lclCode.Append(L"_");
897                 lclCode.Append(GetCountryCodeString());
898
899                 String varCode(__pLocaleImpl->GetVariantCodeString());
900                 if (!varCode.IsEmpty())
901                 {
902                         lclCode.Append(L"_");
903                         lclCode.Append(varCode);
904                 }
905         }
906         return lclCode;
907 }
908
909
910 result
911 Locale::GetCountryName(String& countryName) const
912 {
913         return __pLocaleImpl->GetCountryName(countryName);
914 }
915
916
917 result
918 Locale::GetCountryName(const Locale& otherLocale, String& countryName) const
919 {
920         return __pLocaleImpl->GetCountryName(*otherLocale.__pLocaleImpl, countryName);
921 }
922
923
924 result
925 Locale::GetLanguageName(String& languageName) const
926 {
927         return __pLocaleImpl->GetLanguageName(languageName);
928 }
929
930
931 result
932 Locale::GetLanguageName(const Locale& otherLocale, String& languageName) const
933 {
934         return __pLocaleImpl->GetLanguageName(*otherLocale.__pLocaleImpl, languageName);
935 }
936
937 bool
938 Locale::operator ==(const Locale& other) const
939 {
940         bool isEqual = ((this->GetCountryCode() == other.GetCountryCode())
941                                         && (this->GetLanguageCode() == other.GetLanguageCode())
942                                         && (this->GetVariantCodeString() == other.GetVariantCodeString()));
943         return isEqual;
944 }
945
946 bool
947 Locale::operator !=(const Locale& other) const
948 {
949         return !(*this == other);
950 }
951
952 bool
953 Locale::Equals(const Object& obj) const
954 {
955         const Locale* pOtherLocale = dynamic_cast< const Locale* >(&obj);
956         if (pOtherLocale)
957         {
958                 return *this == *pOtherLocale;
959         }
960         return false;
961 }
962
963 int
964 Locale::GetHashCode(void) const
965 {
966         return __pLocaleImpl->GetHashCode();
967 }
968
969
970 LanguageCode
971 Locale::StringToLanguageCode(const String& languageCodeString)
972 {
973         for (int i = 0; i < LANGUAGE_MAX; i++)
974         {
975                 if (languageCodeString == LanguageCodeString3LetterArray[i])
976                 {
977                         return (LanguageCode) i;
978                 }
979         }
980         SysTryReturn(NID_LCL, false,LANGUAGE_INVALID, E_INVALID_ARG, "languageCodeStirng [%ls] is invalid", languageCodeString.GetPointer());
981         return LANGUAGE_INVALID;
982 }
983
984
985 CountryCode
986 Locale::StringToCountryCode(const String& countryCodeString)
987 {
988         for (int i = 0; i < COUNTRY_MAX; i++)
989         {
990                 if (countryCodeString == CountryCodeString2LetterArray[i])
991                 {
992                         return (CountryCode) i;
993                 }
994         }
995         SysTryReturn (NID_LCL, false, COUNTRY_INVALID, E_INVALID_ARG , "countryCodeString [%ls] is invalid", countryCodeString.GetPointer());
996         return COUNTRY_INVALID;
997 }
998
999
1000 String
1001 Locale::LanguageCodeToString(LanguageCode languageCode)
1002 {
1003         return (languageCode < LANGUAGE_MAX)
1004                         ? LanguageCodeString3LetterArray[languageCode]
1005                         : String();
1006 }
1007
1008
1009 String
1010 Locale::CountryCodeToString(CountryCode countryCode)
1011 {
1012         return (countryCode < COUNTRY_MAX)
1013                    ? CountryCodeString2LetterArray[countryCode]
1014                    : String();
1015 }
1016
1017
1018 String
1019 Locale::LanguageCodeToTwoLetterLanguageCodeString(LanguageCode languageCode)
1020 {
1021         return (languageCode < LANGUAGE_MAX)
1022                         ? _LocaleImpl::Get2LetterLanguageCodeString(LanguageCodeString3LetterArray[languageCode])
1023                         : String();
1024 }
1025
1026
1027 LanguageCode
1028 Locale::TwoLetterLanguageCodeStringToLanguageCode(const String& languageCodeString)
1029 {
1030         int index = -1;
1031
1032         languageCodeString.IndexOf(L"-", 0, index);
1033
1034         if (languageCodeString.GetLength() == 2 || index == 2)
1035         {
1036                 std::unique_ptr<char[]> pLangStr (_StringConverter::CopyToCharArrayN(languageCodeString));
1037                 return StringToLanguageCode(_LocaleImpl::Get3LetterLanguageCodeString(pLangStr.get()));
1038         }
1039         return LANGUAGE_INVALID;
1040 }
1041
1042
1043 String
1044 Locale::CountryCodeToThreeLetterCountryCodeString(CountryCode countryCode)
1045 {
1046         return (countryCode < COUNTRY_MAX)
1047                    ? _LocaleImpl::Get3LetterCountryCodeString(CountryCodeString2LetterArray[countryCode])
1048                    : String();
1049 }
1050
1051
1052 CountryCode
1053 Locale::ThreeLetterCountryCodeStringToCountryCode(const String& countryCodeString)
1054 {
1055         if (countryCodeString.GetLength() == 3)
1056         {
1057                 for (int i = 0; i < COUNTRY_MAX; i++)
1058                 {
1059                         String countryCode(_LocaleImpl::Get3LetterCountryCodeString(CountryCodeString2LetterArray[i]));
1060                         if (countryCodeString.Equals(countryCode, false))
1061                         {
1062                                 return static_cast<CountryCode> (i);
1063                         }
1064                 }
1065         }
1066
1067         return COUNTRY_INVALID;
1068 }
1069
1070
1071 };
1072 };      // Tizen::Locales