2002-04-13 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / corlib / System.Globalization / CultureInfo.cs
1 //
2 // System.Globalization.CultureInfo
3 //
4 // Miguel de Icaza (miguel@ximian.com)
5 //
6 // (C) Ximian, Inc. 2001 (http://www.ximian.com)
7 //
8
9 using System.Threading;
10
11 namespace System.Globalization
12 {
13         [Serializable]
14         public class CultureInfo : IFormatProvider
15         {
16                 static CultureInfo invariant_culture_info;
17                 bool is_read_only;
18                 int  lcid;
19                 bool use_user_override;
20                 NumberFormatInfo number_format;
21                 DateTimeFormatInfo datetime_format;
22
23                 private static readonly string MSG_READONLY = "This instance is read only";
24                 
25                 // <summary>
26                 //   Returns the Invariant Culture Information ("iv")
27                 // </summary>
28                 static public CultureInfo InvariantCulture {
29                         get {
30                                 if (invariant_culture_info != null)
31                                         return invariant_culture_info;
32                                 
33                                 invariant_culture_info = new CultureInfo (0x07f, false);
34                                 invariant_culture_info.is_read_only = true;
35                                 
36                                 return invariant_culture_info;
37                         }
38                 }
39
40                 //
41                 // Initializes the CultureInfo object for the specific culture_id
42                 //
43                 void InitializeByID (int culture_id, bool use_user_override)
44                 {
45                         switch (culture_id){
46                         case 0x0001: // ar Arabic
47                         case 0x0401: // ar-SA Arabic (Saudi Arabia)
48                         case 0x0801: // ar-IQ Arabic (Iraq)
49                         case 0x0C01: // ar-EG Arabic (Egypt)
50                         case 0x1001: // ar-LY Arabic (Libya)
51                         case 0x1401: // ar-DZ Arabic (Algeria)
52                         case 0x1801: // ar-MA Arabic (Morocco)
53                         case 0x1C01: // ar-TN Arabic (Tunisia)
54                         case 0x2001: // ar-OM Arabic (Oman)
55                         case 0x2401: // ar-YE Arabic (Yemen)
56                         case 0x2801: // ar-SY Arabic (Syria)
57                         case 0x2C01: // ar-JO Arabic (Jordan)
58                         case 0x3001: // ar-LB Arabic (Lebanon)
59                         case 0x3401: // ar-KW Arabic (Kuwait)
60                         case 0x3801: // ar-AE Arabic (U.A.E.)
61                         case 0x3C01: // ar-BH Arabic (Bahrain)
62                         case 0x4001: // ar-QA Arabic (Qatar)
63                         case 0x0002: // bg Bulgarian
64                         case 0x0402: // bg-BG Bulgarian (Bulgaria)
65                         case 0x0003: // ca Catalan
66                         case 0x0403: // ca-ES Catalan (Spain)
67                         case 0x0004: // zh-CHS Chinese (Simplified)
68                         case 0x0404: // zh-TW Chinese (Taiwan)
69                         case 0x0804: // zh-CN Chinese (People's Republic of China)
70                         case 0x0C04: // zh-HK Chinese (Hong Kong S.A.R.)
71                         case 0x1004: // zh-SG Chinese (Singapore)
72                         case 0x1404: // zh-MO Chinese (Macau S.A.R.)
73                         case 0x7C04: // zh-CHT Chinese (Traditional)
74                         case 0x0005: // cs Czech
75                         case 0x0405: // cs-CZ Czech (Czech Republic)
76                         case 0x0006: // da Danish
77                         case 0x0406: // da-DK Danish (Denmark)
78                         case 0x0007: // de German
79                         case 0x0407: // de-DE German (Germany)
80                         case 0x0807: // de-CH German (Switzerland)
81                         case 0x0C07: // de-AT German (Austria)
82                         case 0x1007: // de-LU German (Luxembourg)
83                         case 0x1407: // de-LI German (Liechtenstein)
84                         case 0x0008: // el Greek
85                         case 0x0408: // el-GR Greek (Greece)
86                         case 0x0009: // en English
87                         case 0x0409: // en-US English (United States)
88                         case 0x0809: // en-GB English (United Kingdom)
89                         case 0x0C09: // en-AU English (Australia)
90                         case 0x1009: // en-CA English (Canada)
91                         case 0x1409: // en-NZ English (New Zealand)
92                         case 0x1809: // en-IE English (Ireland)
93                         case 0x1C09: // en-ZA English (South Africa)
94                         case 0x2009: // en-JM English (Jamaica)
95                         case 0x2409: // en-CB English (Caribbean)
96                         case 0x2809: // en-BZ English (Belize)
97                         case 0x2C09: // en-TT English (Trinidad and Tobago)
98                         case 0x3009: // en-ZW English (Zimbabwe)
99                         case 0x3409: // en-PH English (Republic of the Philippines)
100                         case 0x000A: // es Spanish
101                         case 0x080A: // es-MX Spanish (Mexico)
102                         case 0x0C0A: // es-ES Spanish (Spain)
103                         case 0x100A: // es-GT Spanish (Guatemala)
104                         case 0x140A: // es-CR Spanish (Costa Rica)
105                         case 0x180A: // es-PA Spanish (Panama)
106                         case 0x1C0A: // es-DO Spanish (Dominican Republic)
107                         case 0x200A: // es-VE Spanish (Venezuela)
108                         case 0x240A: // es-CO Spanish (Colombia)
109                         case 0x280A: // es-PE Spanish (Peru)
110                         case 0x2C0A: // es-AR Spanish (Argentina)
111                         case 0x300A: // es-EC Spanish (Ecuador)
112                         case 0x340A: // es-CL Spanish (Chile)
113                         case 0x380A: // es-UY Spanish (Uruguay)
114                         case 0x3C0A: // es-PY Spanish (Paraguay)
115                         case 0x400A: // es-BO Spanish (Bolivia)
116                         case 0x440A: // es-SV Spanish (El Salvador)
117                         case 0x480A: // es-HN Spanish (Honduras)
118                         case 0x4C0A: // es-NI Spanish (Nicaragua)
119                         case 0x500A: // es-PR Spanish (Puerto Rico)
120                         case 0x000B: // fi Finnish
121                         case 0x040B: // fi-FI Finnish (Finland)
122                         case 0x000C: // fr French
123                         case 0x040C: // fr-FR French (France)
124                         case 0x080C: // fr-BE French (Belgium)
125                         case 0x0C0C: // fr-CA French (Canada)
126                         case 0x100C: // fr-CH French (Switzerland)
127                         case 0x140C: // fr-LU French (Luxembourg)
128                         case 0x180C: // fr-MC French (Principality of Monaco)
129                         case 0x000D: // he Hebrew
130                         case 0x040D: // he-IL Hebrew (Israel)
131                         case 0x000E: // hu Hungarian
132                         case 0x040E: // hu-HU Hungarian (Hungary)
133                         case 0x000F: // is Icelandic
134                         case 0x040F: // is-IS Icelandic (Iceland)
135                         case 0x0010: // it Italian
136                         case 0x0410: // it-IT Italian (Italy)
137                         case 0x0810: // it-CH Italian (Switzerland)
138                         case 0x0011: // ja Japanese
139                         case 0x0411: // ja-JP Japanese (Japan)
140                         case 0x0012: // ko Korean
141                         case 0x0412: // ko-KR Korean (Korea)
142                         case 0x0013: // nl Dutch
143                         case 0x0413: // nl-NL Dutch (Netherlands)
144                         case 0x0813: // nl-BE Dutch (Belgium)
145                         case 0x0014: // no Norwegian
146                         case 0x0414: // nb-NO Norwegian (BokmÃ¥l) (Norway)
147                         case 0x0814: // nn-NO Norwegian (Nynorsk) (Norway)
148                         case 0x0015: // pl Polish
149                         case 0x0415: // pl-PL Polish (Poland)
150                         case 0x0016: // pt Portuguese
151                         case 0x0416: // pt-BR Portuguese (Brazil)
152                         case 0x0816: // pt-PT Portuguese (Portugal)
153                         case 0x0018: // ro Romanian
154                         case 0x0418: // ro-RO Romanian (Romania)
155                         case 0x0019: // ru Russian
156                         case 0x0419: // ru-RU Russian (Russia)
157                         case 0x001A: // hr Croatian
158                         case 0x041A: // hr-HR Croatian (Croatia)
159                         case 0x081A: // Lt-sr-SP Serbian (Latin) (Serbia)
160                         case 0x0C1A: // Cy-sr-SP Serbian (Cyrillic) (Serbia)
161                         case 0x001B: // sk Slovak
162                         case 0x041B: // sk-SK Slovak (Slovakia)
163                         case 0x001C: // sq Albanian
164                         case 0x041C: // sq-AL Albanian (Albania)
165                         case 0x001D: // sv Swedish
166                         case 0x041D: // sv-SE Swedish (Sweden)
167                         case 0x081D: // sv-FI Swedish (Finland)
168                         case 0x001E: // th Thai
169                         case 0x041E: // th-TH Thai (Thailand)
170                         case 0x001F: // tr Turkish
171                         case 0x041F: // tr-TR Turkish (Turkey)
172                         case 0x0020: // ur Urdu
173                         case 0x0420: // ur-PK Urdu (Islamic Republic of Pakistan)
174                         case 0x0021: // id Indonesian
175                         case 0x0421: // id-ID Indonesian (Indonesia)
176                         case 0x0022: // uk Ukrainian
177                         case 0x0422: // uk-UA Ukrainian (Ukraine)
178                         case 0x0023: // be Belarusian
179                         case 0x0423: // be-BY Belarusian (Belarus)
180                         case 0x0024: // sl Slovenian
181                         case 0x0424: // sl-SI Slovenian (Slovenia)
182                         case 0x0025: // et Estonian
183                         case 0x0425: // et-EE Estonian (Estonia)
184                         case 0x0026: // lv Latvian
185                         case 0x0426: // lv-LV Latvian (Latvia)
186                         case 0x0027: // lt Lithuanian
187                         case 0x0427: // lt-LT Lithuanian (Lithuania)
188                         case 0x0029: // fa Farsi
189                         case 0x0429: // fa-IR Farsi (Iran)
190                         case 0x002A: // vi Vietnamese
191                         case 0x042A: // vi-VN Vietnamese (Viet Nam)
192                         case 0x002B: // hy Armenian
193                         case 0x042B: // hy-AM Armenian (Armenia)
194                         case 0x002C: // az Azeri
195                         case 0x042C: // Lt-az-AZ Azeri (Latin) (Azerbaijan)
196                         case 0x082C: // Cy-az-AZ Azeri (Cyrillic) (Azerbaijan)
197                         case 0x002D: // eu Basque
198                         case 0x042D: // eu-ES Basque (Spain)
199                         case 0x002F: // mk FYRO Macedonian
200                         case 0x042F: // mk-MK FYRO Macedonian (Former Yugoslav Republic of Macedonia)
201                         case 0x0036: // af Afrikaans
202                         case 0x0436: // af-ZA Afrikaans (South Africa)
203                         case 0x0037: // ka Georgian
204                         case 0x0437: // ka-GE Georgian (Georgia)
205                         case 0x0038: // fo Faeroese
206                         case 0x0438: // fo-FO Faeroese (Faeroe Islands)
207                         case 0x0039: // hi Hindi
208                         case 0x0439: // hi-IN Hindi (India)
209                         case 0x003E: // ms Malay
210                         case 0x043E: // ms-MY Malay (Malaysia)
211                         case 0x083E: // ms-BN Malay (Brunei Darussalam)
212                         case 0x003F: // kk Kazakh
213                         case 0x043F: // kk-KZ Kazakh (Kazakhstan)
214                         case 0x0040: // ky Kyrgyz
215                         case 0x0440: // ky-KZ Kyrgyz (Kyrgyzstan)
216                         case 0x0041: // sw Swahili
217                         case 0x0441: // sw-KE Swahili (Kenya)
218                         case 0x0043: // uz Uzbek
219                         case 0x0443: // Lt-uz-UZ Uzbek (Latin) (Uzbekistan)
220                         case 0x0843: // Cy-uz-UZ Uzbek (Cyrillic) (Uzbekistan)
221                         case 0x0044: // tt Tatar
222                         case 0x0444: // tt-TA Tatar (Tatarstan)
223                         case 0x0046: // pa Punjabi
224                         case 0x0446: // pa-IN Punjabi (India)
225                         case 0x0047: // gu Gujarati
226                         case 0x0447: // gu-IN Gujarati (India)
227                         case 0x0049: // ta Tamil
228                         case 0x0449: // ta-IN Tamil (India)
229                         case 0x004A: // te Telugu
230                         case 0x044A: // te-IN Telugu (India)
231                         case 0x004B: // kn Kannada
232                         case 0x044B: // kn-IN Kannada (India)
233                         case 0x004E: // mr Marathi
234                         case 0x044E: // mr-IN Marathi (India)
235                         case 0x004F: // sa Sanskrit
236                         case 0x044F: // sa-IN Sanskrit (India)
237                         case 0x0050: // mn Mongolian
238                         case 0x0450: // mn-MN Mongolian (Mongolia)
239                         case 0x0056: // gl Galician
240                         case 0x0456: // gl-ES Galician (Spain)
241                         case 0x0057: // kok Konkani
242                         case 0x0457: // kok-IN Konkani (India)
243                         case 0x005A: // syr Syriac
244                         case 0x045A: // syr-SY Syriac (Syria)
245                         case 0x0065: // div Divehi
246                         case 0x0465: // div-MV Divehi (Maldives)
247                         case 0x007F: //  Invariant Language (Invariant Country)
248                                 break;
249
250                         default:
251                                 throw new ArgumentException ("CultureInfoCode");
252                         }
253                         lcid = culture_id;
254                         this.use_user_override = use_user_override;
255                 }
256
257                 //
258                 // Maps a name to a culture id
259                 //
260                 static int NameToID (string name)
261                 {
262                         switch (name){
263                         case "ar":
264                                 return 0x0001;
265                         case "ar-SA":
266                                 return 0x0401;
267                         case "ar-IQ":
268                                 return 0x0801;
269                         case "ar-EG":
270                                 return 0x0C01;
271                         case "ar-LY":
272                                 return 0x1001;
273                         case "ar-DZ":
274                                 return 0x1401;
275                         case "ar-MA":
276                                 return 0x1801;
277                         case "ar-TN":
278                                 return 0x1C01;
279                         case "ar-OM":
280                                 return 0x2001;
281                         case "ar-YE":
282                                 return 0x2401;
283                         case "ar-SY":
284                                 return 0x2801;
285                         case "ar-JO":
286                                 return 0x2C01;
287                         case "ar-LB":
288                                 return 0x3001;
289                         case "ar-KW":
290                                 return 0x3401;
291                         case "ar-AE":
292                                 return 0x3801;
293                         case "ar-BH":
294                                 return 0x3C01;
295                         case "ar-QA":
296                                 return 0x4001;
297                         case "bg":
298                                 return 0x0002;
299                         case "bg-BG":
300                                 return 0x0402;
301                         case "ca":
302                                 return 0x0003;
303                         case "ca-ES":
304                                 return 0x0403;
305                         case "zh-CHS":
306                                 return 0x0004;
307                         case "zh-TW":
308                                 return 0x0404;
309                         case "zh-CN":
310                                 return 0x0804;
311                         case "zh-HK":
312                                 return 0x0C04;
313                         case "zh-SG":
314                                 return 0x1004;
315                         case "zh-MO":
316                                 return 0x1404;
317                         case "zh-CHT":
318                                 return 0x7C04;
319                         case "cs":
320                                 return 0x0005;
321                         case "cs-CZ":
322                                 return 0x0405;
323                         case "da":
324                                 return 0x0006;
325                         case "da-DK":
326                                 return 0x0406;
327                         case "de":
328                                 return 0x0007;
329                         case "de-DE":
330                                 return 0x0407;
331                         case "de-CH":
332                                 return 0x0807;
333                         case "de-AT":
334                                 return 0x0C07;
335                         case "de-LU":
336                                 return 0x1007;
337                         case "de-LI":
338                                 return 0x1407;
339                         case "el":
340                                 return 0x0008;
341                         case "el-GR":
342                                 return 0x0408;
343                         case "en":
344                                 return 0x0009;
345                         case "en-US":
346                                 return 0x0409;
347                         case "en-GB":
348                                 return 0x0809;
349                         case "en-AU":
350                                 return 0x0C09;
351                         case "en-CA":
352                                 return 0x1009;
353                         case "en-NZ":
354                                 return 0x1409;
355                         case "en-IE":
356                                 return 0x1809;
357                         case "en-ZA":
358                                 return 0x1C09;
359                         case "en-JM":
360                                 return 0x2009;
361                         case "en-CB":
362                                 return 0x2409;
363                         case "en-BZ":
364                                 return 0x2809;
365                         case "en-TT":
366                                 return 0x2C09;
367                         case "en-ZW":
368                                 return 0x3009;
369                         case "en-PH":
370                                 return 0x3409;
371                         case "es":
372                                 return 0x000A;
373                         case "es-MX":
374                                 return 0x080A;
375                         case "es-ES":
376                                 return 0x0C0A;
377                         case "es-GT":
378                                 return 0x100A;
379                         case "es-CR":
380                                 return 0x140A;
381                         case "es-PA":
382                                 return 0x180A;
383                         case "es-DO":
384                                 return 0x1C0A;
385                         case "es-VE":
386                                 return 0x200A;
387                         case "es-CO":
388                                 return 0x240A;
389                         case "es-PE":
390                                 return 0x280A;
391                         case "es-AR":
392                                 return 0x2C0A;
393                         case "es-EC":
394                                 return 0x300A;
395                         case "es-CL":
396                                 return 0x340A;
397                         case "es-UY":
398                                 return 0x380A;
399                         case "es-PY":
400                                 return 0x3C0A;
401                         case "es-BO":
402                                 return 0x400A;
403                         case "es-SV":
404                                 return 0x440A;
405                         case "es-HN":
406                                 return 0x480A;
407                         case "es-NI":
408                                 return 0x4C0A;
409                         case "es-PR":
410                                 return 0x500A;
411                         case "fi":
412                                 return 0x000B;
413                         case "fi-FI":
414                                 return 0x040B;
415                         case "fr":
416                                 return 0x000C;
417                         case "fr-FR":
418                                 return 0x040C;
419                         case "fr-BE":
420                                 return 0x080C;
421                         case "fr-CA":
422                                 return 0x0C0C;
423                         case "fr-CH":
424                                 return 0x100C;
425                         case "fr-LU":
426                                 return 0x140C;
427                         case "fr-MC":
428                                 return 0x180C;
429                         case "he":
430                                 return 0x000D;
431                         case "he-IL":
432                                 return 0x040D;
433                         case "hu":
434                                 return 0x000E;
435                         case "hu-HU":
436                                 return 0x040E;
437                         case "is":
438                                 return 0x000F;
439                         case "is-IS":
440                                 return 0x040F;
441                         case "it":
442                                 return 0x0010;
443                         case "it-IT":
444                                 return 0x0410;
445                         case "it-CH":
446                                 return 0x0810;
447                         case "ja":
448                                 return 0x0011;
449                         case "ja-JP":
450                                 return 0x0411;
451                         case "ko":
452                                 return 0x0012;
453                         case "ko-KR":
454                                 return 0x0412;
455                         case "nl":
456                                 return 0x0013;
457                         case "nl-NL":
458                                 return 0x0413;
459                         case "nl-BE":
460                                 return 0x0813;
461                         case "no":
462                                 return 0x0014;
463                         case "nb-NO":
464                                 return 0x0414;
465                         case "nn-NO":
466                                 return 0x0814;
467                         case "pl":
468                                 return 0x0015;
469                         case "pl-PL":
470                                 return 0x0415;
471                         case "pt":
472                                 return 0x0016;
473                         case "pt-BR":
474                                 return 0x0416;
475                         case "pt-PT":
476                                 return 0x0816;
477                         case "ro":
478                                 return 0x0018;
479                         case "ro-RO":
480                                 return 0x0418;
481                         case "ru":
482                                 return 0x0019;
483                         case "ru-RU":
484                                 return 0x0419;
485                         case "hr":
486                                 return 0x001A;
487                         case "hr-HR":
488                                 return 0x041A;
489                         case "Lt-sr-SP":
490                                 return 0x081A;
491                         case "Cy-sr-SP":
492                                 return 0x0C1A;
493                         case "sk":
494                                 return 0x001B;
495                         case "sk-SK":
496                                 return 0x041B;
497                         case "sq":
498                                 return 0x001C;
499                         case "sq-AL":
500                                 return 0x041C;
501                         case "sv":
502                                 return 0x001D;
503                         case "sv-SE":
504                                 return 0x041D;
505                         case "sv-FI":
506                                 return 0x081D;
507                         case "th":
508                                 return 0x001E;
509                         case "th-TH":
510                                 return 0x041E;
511                         case "tr":
512                                 return 0x001F;
513                         case "tr-TR":
514                                 return 0x041F;
515                         case "ur":
516                                 return 0x0020;
517                         case "ur-PK":
518                                 return 0x0420;
519                         case "id":
520                                 return 0x0021;
521                         case "id-ID":
522                                 return 0x0421;
523                         case "uk":
524                                 return 0x0022;
525                         case "uk-UA":
526                                 return 0x0422;
527                         case "be":
528                                 return 0x0023;
529                         case "be-BY":
530                                 return 0x0423;
531                         case "sl":
532                                 return 0x0024;
533                         case "sl-SI":
534                                 return 0x0424;
535                         case "et":
536                                 return 0x0025;
537                         case "et-EE":
538                                 return 0x0425;
539                         case "lv":
540                                 return 0x0026;
541                         case "lv-LV":
542                                 return 0x0426;
543                         case "lt":
544                                 return 0x0027;
545                         case "lt-LT":
546                                 return 0x0427;
547                         case "fa":
548                                 return 0x0029;
549                         case "fa-IR":
550                                 return 0x0429;
551                         case "vi":
552                                 return 0x002A;
553                         case "vi-VN":
554                                 return 0x042A;
555                         case "hy":
556                                 return 0x002B;
557                         case "hy-AM":
558                                 return 0x042B;
559                         case "az":
560                                 return 0x002C;
561                         case "Lt-az-AZ":
562                                 return 0x042C;
563                         case "Cy-az-AZ":
564                                 return 0x082C;
565                         case "eu":
566                                 return 0x002D;
567                         case "eu-ES":
568                                 return 0x042D;
569                         case "mk":
570                                 return 0x002F;
571                         case "mk-MK":
572                                 return 0x042F;
573                         case "af":
574                                 return 0x0036;
575                         case "af-ZA":
576                                 return 0x0436;
577                         case "ka":
578                                 return 0x0037;
579                         case "ka-GE":
580                                 return 0x0437;
581                         case "fo":
582                                 return 0x0038;
583                         case "fo-FO":
584                                 return 0x0438;
585                         case "hi":
586                                 return 0x0039;
587                         case "hi-IN":
588                                 return 0x0439;
589                         case "ms":
590                                 return 0x003E;
591                         case "ms-MY":
592                                 return 0x043E;
593                         case "ms-BN":
594                                 return 0x083E;
595                         case "kk":
596                                 return 0x003F;
597                         case "kk-KZ":
598                                 return 0x043F;
599                         case "ky":
600                                 return 0x0040;
601                         case "ky-KZ":
602                                 return 0x0440;
603                         case "sw":
604                                 return 0x0041;
605                         case "sw-KE":
606                                 return 0x0441;
607                         case "uz":
608                                 return 0x0043;
609                         case "Lt-uz-UZ":
610                                 return 0x0443;
611                         case "Cy-uz-UZ":
612                                 return 0x0843;
613                         case "tt":
614                                 return 0x0044;
615                         case "tt-TA":
616                                 return 0x0444;
617                         case "pa":
618                                 return 0x0046;
619                         case "pa-IN":
620                                 return 0x0446;
621                         case "gu":
622                                 return 0x0047;
623                         case "gu-IN":
624                                 return 0x0447;
625                         case "ta":
626                                 return 0x0049;
627                         case "ta-IN":
628                                 return 0x0449;
629                         case "te":
630                                 return 0x004A;
631                         case "te-IN":
632                                 return 0x044A;
633                         case "kn":
634                                 return 0x004B;
635                         case "kn-IN":
636                                 return 0x044B;
637                         case "mr":
638                                 return 0x004E;
639                         case "mr-IN":
640                                 return 0x044E;
641                         case "sa":
642                                 return 0x004F;
643                         case "sa-IN":
644                                 return 0x044F;
645                         case "mn":
646                                 return 0x0050;
647                         case "mn-MN":
648                                 return 0x0450;
649                         case "gl":
650                                 return 0x0056;
651                         case "gl-ES":
652                                 return 0x0456;
653                         case "kok":
654                                 return 0x0057;
655                         case "kok-IN":
656                                 return 0x0457;
657                         case "syr":
658                                 return 0x005A;
659                         case "syr-SY":
660                                 return 0x045A;
661                         case "div":
662                                 return 0x0065;
663                         case "div-MV":
664                                 return 0x0465;
665                         case "":
666                                 return 0x007F;
667                         }
668                         return -1;
669                 }
670                 
671                 // <summary>
672                 //   Creates a CultureInfo for a specific ID
673                 // </summary>
674                 public static CultureInfo CreateSpecificCulture (string name)
675                 {
676                         if (name == null)
677                                 throw new ArgumentNullException ();
678                         
679                         int id = NameToID (name);
680
681                         if (id == -1)
682                                 throw new ArgumentException ("name");
683
684                         return new CultureInfo (id, false);
685                 }
686
687                 /// <summary>
688                 /// CultureInfo instance that represents the culture used by the current thread
689                 /// </summary>
690                 public static CultureInfo CurrentCulture 
691                 {
692                         get 
693                         {
694                                 return Thread.CurrentThread.CurrentCulture;
695                         }
696                         
697                         set 
698                         {
699                                 Thread.CurrentThread.CurrentCulture = value;
700                         }
701                 }
702
703                 /// <summary>
704                 /// CultureInfo instance that represents the current culture used by the ResourceManager to look up culture-specific resources at run time
705                 /// </summary>
706                 public static CultureInfo CurrentUICulture 
707                 {
708                         get 
709                         {
710                                 return Thread.CurrentThread.CurrentUICulture;
711                         }
712                         
713                         set 
714                         {
715                                 Thread.CurrentThread.CurrentUICulture = value;
716                         }
717                 }
718
719
720                 public virtual int LCID {
721                         get {
722                                 return lcid;
723                         }
724                 }
725
726                 // <summary>
727                 //   Gets the string-encoded name of the culture
728                 // </summary>
729                 public virtual string Name {
730                         get {
731                                 switch (lcid){
732                                 case 0x007f:
733                                         return "iv";
734                                 }
735                                 throw new Exception ("Miss constructed object for LCID: " + lcid);
736                         }
737                 }
738
739                 [MonoTODO]
740                 public virtual Calendar Calendar
741                 {
742                         get { return null; }
743                 }
744
745                 internal static bool IsIDNeutralCulture (int lcid) {
746                         return (lcid & 0xff00) == 0;
747                 }
748
749                 // <summary>
750                 //   Returns whether the current culture is neutral (neutral cultures
751                 //   only specify a language, not a country.
752                 // </summary>
753                 public virtual bool IsNeutralCulture {
754                         get {
755                                 return IsIDNeutralCulture (lcid);
756                         }
757                 }
758                 // <summary>
759                 //   Returns the NumberFormat for the current lcid
760                 // </summary>
761                 public virtual NumberFormatInfo NumberFormat {
762                         get {
763                                 if (number_format == null){
764                                         lock (this){
765                                                 if (number_format == null)
766                                                         number_format = new NumberFormatInfo (lcid);
767                                         }
768                                 }
769
770                                 return number_format;
771                         }
772
773                         set {
774                                 if (is_read_only) throw new InvalidOperationException(MSG_READONLY);
775
776                                 if (value == null)
777                                         throw new ArgumentNullException ("NumberFormat");
778                                 
779                                 number_format = value;
780                         }
781                 }
782
783                 public virtual DateTimeFormatInfo DateTimeFormat
784                 {
785                         get 
786                         {
787                                 if (datetime_format == null)
788                                 {
789                                         lock (this)
790                                         {
791                                                 if (datetime_format == null)
792                                                         datetime_format = new DateTimeFormatInfo(); 
793                                         }
794                                 }
795
796                                 return datetime_format;
797                         }
798
799                         set 
800                         {
801                                 if (is_read_only) throw new InvalidOperationException(MSG_READONLY);
802
803                                 if (value == null)
804                                         throw new ArgumentNullException ("DateTimeFormat");
805                                 
806                                 datetime_format = value;
807                         }
808                 }
809
810                 // 
811                 // IFormatProvider implementation
812                 //
813                 public virtual object GetFormat( Type formatType )
814                 {
815                         object format = null;
816
817                         if ( formatType == typeof(NumberFormatInfo) )
818                                 format = NumberFormat;
819                         else if ( formatType == typeof(DateTimeFormatInfo) )
820                                 format = DateTimeFormat;
821                         
822                         return format;
823                 }
824
825                 //
826                 // Constructors
827                 //
828                 public CultureInfo (int culture, bool use_user_override)
829                 {
830                         if (culture < 0)
831                                 throw new ArgumentOutOfRangeException ();
832                         
833                         InitializeByID (culture, use_user_override);
834                 }
835
836                 public CultureInfo (int culture) : this (culture, false)
837                 {
838                 }
839                 
840                 public CultureInfo (string name, bool use_user_override)
841                 {
842                         if (name == null)
843                                 throw new ArgumentNullException ();
844                         
845                         InitializeByID (NameToID (name), use_user_override);
846                 }
847
848                 public CultureInfo (string name) : this (name, false) {} 
849         }
850 }