2 // System.Globalization.CultureInfo
4 // Miguel de Icaza (miguel@ximian.com)
6 // (C) Ximian, Inc. 2001 (http://www.ximian.com)
9 using System.Threading;
11 namespace System.Globalization
14 public class CultureInfo : IFormatProvider
16 static CultureInfo invariant_culture_info;
19 bool use_user_override;
20 NumberFormatInfo number_format;
21 DateTimeFormatInfo datetime_format;
23 private static readonly string MSG_READONLY = "This instance is read only";
26 // Returns the Invariant Culture Information ("iv")
28 static public CultureInfo InvariantCulture {
30 if (invariant_culture_info != null)
31 return invariant_culture_info;
33 invariant_culture_info = new CultureInfo (0x07f, false);
34 invariant_culture_info.is_read_only = true;
36 return invariant_culture_info;
41 // Initializes the CultureInfo object for the specific culture_id
43 void InitializeByID (int culture_id, bool use_user_override)
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)
251 throw new ArgumentException ("CultureInfoCode");
254 this.use_user_override = use_user_override;
258 // Maps a name to a culture id
260 static int NameToID (string name)
672 // Creates a CultureInfo for a specific ID
674 public static CultureInfo CreateSpecificCulture (string name)
677 throw new ArgumentNullException ();
679 int id = NameToID (name);
682 throw new ArgumentException ("name");
684 return new CultureInfo (id, false);
688 /// CultureInfo instance that represents the culture used by the current thread
690 public static CultureInfo CurrentCulture
694 return Thread.CurrentThread.CurrentCulture;
699 Thread.CurrentThread.CurrentCulture = value;
704 /// CultureInfo instance that represents the current culture used by the ResourceManager to look up culture-specific resources at run time
706 public static CultureInfo CurrentUICulture
710 return Thread.CurrentThread.CurrentUICulture;
715 Thread.CurrentThread.CurrentUICulture = value;
720 public virtual int LCID {
727 // Gets the string-encoded name of the culture
729 public virtual string Name {
735 throw new Exception ("Miss constructed object for LCID: " + lcid);
740 public virtual Calendar Calendar
745 internal static bool IsIDNeutralCulture (int lcid) {
746 return (lcid & 0xff00) == 0;
750 // Returns whether the current culture is neutral (neutral cultures
751 // only specify a language, not a country.
753 public virtual bool IsNeutralCulture {
755 return IsIDNeutralCulture (lcid);
759 // Returns the NumberFormat for the current lcid
761 public virtual NumberFormatInfo NumberFormat {
763 if (number_format == null){
765 if (number_format == null)
766 number_format = new NumberFormatInfo (lcid);
770 return number_format;
774 if (is_read_only) throw new InvalidOperationException(MSG_READONLY);
777 throw new ArgumentNullException ("NumberFormat");
779 number_format = value;
783 public virtual DateTimeFormatInfo DateTimeFormat
787 if (datetime_format == null)
791 if (datetime_format == null)
792 datetime_format = new DateTimeFormatInfo();
796 return datetime_format;
801 if (is_read_only) throw new InvalidOperationException(MSG_READONLY);
804 throw new ArgumentNullException ("DateTimeFormat");
806 datetime_format = value;
811 // IFormatProvider implementation
813 public virtual object GetFormat( Type formatType )
815 object format = null;
817 if ( formatType == typeof(NumberFormatInfo) )
818 format = NumberFormat;
819 else if ( formatType == typeof(DateTimeFormatInfo) )
820 format = DateTimeFormat;
828 public CultureInfo (int culture, bool use_user_override)
831 throw new ArgumentOutOfRangeException ();
833 InitializeByID (culture, use_user_override);
836 public CultureInfo (int culture) : this (culture, false)
840 public CultureInfo (string name, bool use_user_override)
843 throw new ArgumentNullException ();
845 InitializeByID (NameToID (name), use_user_override);
848 public CultureInfo (string name) : this (name, false) {}