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