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