2002-01-15 Duncan Mak <duncan@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                 // <summary>
38                 //   Creates a CultureInfo for a specific ID
39                 // </summary>
40                 public static CultureInfo CreateSpecificCulture (string name)
41                 {
42                         switch (name){
43                         case "iv":
44                                 return InvariantCulture;
45
46                         default:
47                                 throw new ArgumentException ("CreateSpecificCultureName");
48                         }
49                 }
50
51                 /// <summary>
52                 /// CultureInfo instance that represents the culture used by the current thread
53                 /// </summary>
54                 public static CultureInfo CurrentCulture 
55                 {
56                         get 
57                         {
58                                 return Thread.CurrentThread.CurrentCulture;
59                         }
60                         
61                         set 
62                         {
63                                 Thread.CurrentThread.CurrentCulture = value;
64                         }
65                 }
66
67                 /// <summary>
68                 /// CultureInfo instance that represents the current culture used by the ResourceManager to look up culture-specific resources at run time
69                 /// </summary>
70                 public static CultureInfo CurrentUICulture 
71                 {
72                         get 
73                         {
74                                 return Thread.CurrentThread.CurrentUICulture;
75                         }
76                         
77                         set 
78                         {
79                                 Thread.CurrentThread.CurrentUICulture = value;
80                         }
81                 }
82
83
84                 public virtual int LCID {
85                         get {
86                                 return lcid;
87                         }
88                 }
89
90                 // <summary>
91                 //   Gets the string-encoded name of the culture
92                 // </summary>
93                 public virtual string Name {
94                         get {
95                                 switch (lcid){
96                                 case 0x007f:
97                                         return "iv";
98                                 }
99                                 throw new Exception ("Miss constructed object for LCID: " + lcid);
100                         }
101                 }
102
103                 // <summary>
104                 //   Returns whether the current culture is neutral (neutral cultures
105                 //   only specify a language, not a country.
106                 // </summary>
107                 public virtual bool IsNeutralCulture {
108                         get {
109                                 return (lcid & 0xff00) == 0;
110                         }
111                 }
112                 // <summary>
113                 //   Returns the NumberFormat for the current lcid
114                 // </summary>
115                 public virtual NumberFormatInfo NumberFormat {
116                         get {
117                                 if (number_format == null){
118                                         lock (this){
119                                                 if (number_format == null)
120                                                         number_format = new NumberFormatInfo (lcid);
121                                         }
122                                 }
123
124                                 return number_format;
125                         }
126
127                         set {
128                                 if (is_read_only) throw new InvalidOperationException(MSG_READONLY);
129
130                                 if (value == null)
131                                         throw new ArgumentNullException ("NumberFormat");
132                                 
133                                 number_format = value;
134                         }
135                 }
136
137                 public virtual DateTimeFormatInfo DateTimeFormat
138                 {
139                         get 
140                         {
141                                 if (datetime_format == null)
142                                 {
143                                         lock (this)
144                                         {
145                                                 if (datetime_format == null)
146                                                         datetime_format = new DateTimeFormatInfo(); //FIXME: create correct localized DateTimeFormat
147                                         }
148                                 }
149
150                                 return datetime_format;
151                         }
152
153                         set 
154                         {
155                                 if (is_read_only) throw new InvalidOperationException(MSG_READONLY);
156
157                                 if (value == null)
158                                         throw new ArgumentNullException ("DateTimeFormat");
159                                 
160                                 datetime_format = value;
161                         }
162                 }
163
164                 
165                 public CultureInfo (int code, bool use_user_override)
166                 {
167                         switch (lcid){
168                         case 0x007f: // iv    Invariant
169                         case 0x0036: // af    Afrikaans
170                         case 0x0436: // af-ZA Afrikaans - South Africa
171                         case 0x001c: // sq    Albanian
172                         case 0x041c: // sq-AL Albanian  - Albania
173                         case 0x0001: // ar    Arabic
174                         case 0x1401: // ar-DZ Arabic    - Algeria
175                         case 0x3c01: // ar-BH Arabic    - Barhain
176                         case 0x0c01: // ar-EG Arabic    - Egypt
177                         case 0x0801: // ar-IQ Arabic    - Iraq
178                         case 0x2c01: // ar-JO Arabic    - Jordan
179                         case 0x3401: // ar-KQ Arabic    - Kuwait
180                         case 0x3001: // ar-LB Arabic    - Lebanon
181                         case 0x1001: // ar-LY Arabic    - Libya
182                         case 0x1801: // ar-MA Arabic    - Morocco
183                         case 0x2001: // ar-OM Arabic    - Oman
184                         case 0x4001: // ar-QA Arabic    - Qatar
185                         case 0x0401: // ar-SA Arabic    - Saudi Arabia
186                         case 0x2801: // ar-SY Arabic    - Syria
187                         case 0x1c01: // ar-TN Arabic    - Tunisia
188                         case 0x3801: // ar-AE Arabic    - United Arab Emirates
189                         case 0x2401: // ar-YE Arabic    - Yemen
190                                 lcid = code;
191                                 this.use_user_override = use_user_override;
192                                 break;
193
194                         default:
195                                 throw new ArgumentException ("CultureInfoCode");
196                         }
197                 }
198         }
199 }