3 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
5 // Permission is hereby granted, free of charge, to any person obtaining
6 // a copy of this software and associated documentation files (the
7 // "Software"), to deal in the Software without restriction, including
8 // without limitation the rights to use, copy, modify, merge, publish,
9 // distribute, sublicense, and/or sell copies of the Software, and to
10 // permit persons to whom the Software is furnished to do so, subject to
11 // the following conditions:
13 // The above copyright notice and this permission notice shall be
14 // included in all copies or substantial portions of the Software.
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 using System.Globalization;
26 namespace System.Globalization {
29 [MonoTODO ("This class should be implemented from scratch.")]
30 public class RegionInfo {
33 static object forLock = new object ();
35 static RegionInfo currentRegion;
37 public RegionInfo (int culture) {
40 case 0x0401: // ar-SA Arabic (Saudi Arabia)
43 case 0x0801: // ar-IQ Arabic (Iraq)
46 case 0x0C01: // ar-EG Arabic (Egypt)
49 case 0x1001: // ar-LY Arabic (Libya)
52 case 0x1401: // ar-DZ Arabic (Algeria)
55 case 0x1801: // ar-MA Arabic (Morocco)
58 case 0x1C01: // ar-TN Arabic (Tunisia)
61 case 0x2001: // ar-OM Arabic (Oman)
64 case 0x2401: // ar-YE Arabic (Yemen)
67 case 0x2801: // ar-SY Arabic (Syria)
70 case 0x2C01: // ar-JO Arabic (Jordan)
73 case 0x3001: // ar-LB Arabic (Lebanon)
76 case 0x3401: // ar-KW Arabic (Kuwait)
79 case 0x3801: // ar-AE Arabic (U.A.E.)
82 case 0x3C01: // ar-BH Arabic (Bahrain)
85 case 0x4001: // ar-QA Arabic (Qatar)
88 case 0x0402: // bg-BG Bulgarian (Bulgaria)
91 case 0x0403: // ca-ES Catalan (Spain)
94 case 0x0404: // zh-TW Chinese (Taiwan)
97 case 0x0804: // zh-CN Chinese (People's Republic of China)
100 case 0x0C04: // zh-HK Chinese (Hong Kong S.A.R.)
103 case 0x1004: // zh-SG Chinese (Singapore)
106 case 0x1404: // zh-MO Chinese (Macau S.A.R.)
109 case 0x0405: // cs-CZ Czech (Czech Republic)
112 case 0x0406: // da-DK Danish (Denmark)
115 case 0x0407: // de-DE German (Germany)
118 case 0x0807: // de-CH German (Switzerland)
121 case 0x0C07: // de-AT German (Austria)
124 case 0x1007: // de-LU German (Luxembourg)
127 case 0x1407: // de-LI German (Liechtenstein)
130 case 0x0408: // el-GR Greek (Greece)
133 case 0x0409: // en-US English (United States)
136 case 0x0809: // en-GB English (United Kingdom)
139 case 0x0C09: // en-AU English (Australia)
142 case 0x1009: // en-CA English (Canada)
145 case 0x1409: // en-NZ English (New Zealand)
148 case 0x1809: // en-IE English (Ireland)
151 case 0x1C09: // en-ZA English (South Africa)
154 case 0x2009: // en-JM English (Jamaica)
157 case 0x2809: // en-BZ English (Belize)
160 case 0x2C09: // en-TT English (Trinidad and Tobago)
163 case 0x3009: // en-ZW English (Zimbabwe)
166 case 0x3409: // en-PH English (Republic of the Philippines)
169 case 0x080A: // es-MX Spanish (Mexico)
172 case 0x0C0A: // es-ES Spanish (Spain)
175 case 0x100A: // es-GT Spanish (Guatemala)
178 case 0x140A: // es-CR Spanish (Costa Rica)
181 case 0x180A: // es-PA Spanish (Panama)
184 case 0x1C0A: // es-DO Spanish (Dominican Republic)
187 case 0x200A: // es-VE Spanish (Venezuela)
190 case 0x240A: // es-CO Spanish (Colombia)
193 case 0x280A: // es-PE Spanish (Peru)
196 case 0x2C0A: // es-AR Spanish (Argentina)
199 case 0x300A: // es-EC Spanish (Ecuador)
202 case 0x340A: // es-CL Spanish (Chile)
205 case 0x380A: // es-UY Spanish (Uruguay)
208 case 0x3C0A: // es-PY Spanish (Paraguay)
211 case 0x400A: // es-BO Spanish (Bolivia)
214 case 0x440A: // es-SV Spanish (El Salvador)
217 case 0x480A: // es-HN Spanish (Honduras)
220 case 0x4C0A: // es-NI Spanish (Nicaragua)
223 case 0x500A: // es-PR Spanish (Puerto Rico)
226 case 0x040B: // fi-FI Finnish (Finland)
229 case 0x040C: // fr-FR French (France)
232 case 0x080C: // fr-BE French (Belgium)
235 case 0x0C0C: // fr-CA French (Canada)
238 case 0x100C: // fr-CH French (Switzerland)
241 case 0x140C: // fr-LU French (Luxembourg)
244 case 0x180C: // fr-MC French (Principality of Monaco)
247 case 0x040D: // he-IL Hebrew (Israel)
250 case 0x040E: // hu-HU Hungarian (Hungary)
253 case 0x040F: // is-IS Icelandic (Iceland)
256 case 0x0410: // it-IT Italian (Italy)
259 case 0x0810: // it-CH Italian (Switzerland)
262 case 0x0411: // ja-JP Japanese (Japan)
265 case 0x0412: // ko-KR Korean (Korea)
268 case 0x0413: // nl-NL Dutch (Netherlands)
271 case 0x0813: // nl-BE Dutch (Belgium)
274 case 0x0414: // nb-NO Norwegian (Bokm
\86l) (Norway)
277 case 0x0814: // nn-NO Norwegian (Nynorsk) (Norway)
280 case 0x0415: // pl-PL Polish (Poland)
283 case 0x0416: // pt-BR Portuguese (Brazil)
286 case 0x0816: // pt-PT Portuguese (Portugal)
289 case 0x0418: // ro-RO Romanian (Romania)
292 case 0x0419: // ru-RU Russian (Russia)
295 case 0x041A: // hr-HR Croatian (Croatia)
298 case 0x041B: // sk-SK Slovak (Slovakia)
301 case 0x041C: // sq-AL Albanian (Albania)
304 case 0x041D: // sv-SE Swedish (Sweden)
307 case 0x081D: // sv-FI Swedish (Finland)
310 case 0x041E: // th-TH Thai (Thailand)
313 case 0x041F: // tr-TR Turkish (Turkey)
316 case 0x0420: // ur-PK Urdu (Islamic Republic of Pakistan)
319 case 0x0421: // id-ID Indonesian (Indonesia)
322 case 0x0422: // uk-UA Ukrainian (Ukraine)
325 case 0x0423: // be-BY Belarusian (Belarus)
328 case 0x0424: // sl-SI Slovenian (Slovenia)
331 case 0x0425: // et-EE Estonian (Estonia)
334 case 0x0426: // lv-LV Latvian (Latvia)
337 case 0x0427: // lt-LT Lithuanian (Lithuania)
340 case 0x0429: // fa-IR Farsi (Iran)
343 case 0x042A: // vi-VN Vietnamese (Viet Nam)
346 case 0x042B: // hy-AM Armenian (Armenia)
349 case 0x042C: // Lt-az-AZ Azeri (Latin) (Azerbaijan)
352 case 0x082C: // Cy-az-AZ Azeri (Cyrillic) (Azerbaijan)
355 case 0x042D: // eu-ES Basque (Spain)
358 case 0x042F: // mk-MK FYRO Macedonian (Former Yugoslav Republic of Macedonia)
361 case 0x0436: // af-ZA Afrikaans (South Africa)
364 case 0x0437: // ka-GE Georgian (Georgia)
367 case 0x0438: // fo-FO Faeroese (Faeroe Islands)
370 case 0x0439: // hi-IN Hindi (India)
373 case 0x043E: // ms-MY Malay (Malaysia)
376 case 0x083E: // ms-BN Malay (Brunei Darussalam)
379 case 0x043F: // kk-KZ Kazakh (Kazakhstan)
382 case 0x0440: // ky-KZ Kyrgyz (Kyrgyzstan)
385 case 0x0441: // sw-KE Swahili (Kenya)
388 case 0x0443: // Lt-uz-UZ Uzbek (Latin) (Uzbekistan)
391 case 0x0843: // Cy-uz-UZ Uzbek (Cyrillic) (Uzbekistan)
394 case 0x0446: // pa-IN Punjabi (India)
397 case 0x0447: // gu-IN Gujarati (India)
400 case 0x0449: // ta-IN Tamil (India)
403 case 0x044A: // te-IN Telugu (India)
406 case 0x044B: // kn-IN Kannada (India)
409 case 0x044E: // mr-IN Marathi (India)
412 case 0x044F: // sa-IN Sanskrit (India)
415 case 0x0450: // mn-MN Mongolian (Mongolia)
418 case 0x0456: // gl-ES Galician (Spain)
421 case 0x0457: // kok-IN Konkani (India)
424 case 0x045A: // syr-SY Syriac (Syria)
427 case 0x0465: // div-MV Divehi (Maldives)
430 case 0x007F: // Invariant Language (Invariant Country)
431 throw new ArgumentException ("There is no region associated with the Invariant Culture (Culture ID: 0x7F).");
433 if (CultureInfo.IsIDNeutralCulture (culture))
434 throw new ArgumentException ("Culture ID " + culture
435 + " (0x" + culture.ToString ("X4")
436 + ") is a neutral culture. A region can not be created from it.");
438 throw new ArgumentException ("Culture ID " + culture + " (0x" + culture.ToString ("X4")
439 + ") is not a supported culture.");
443 public RegionInfo (string name) {
444 switch (name.ToUpperInvariant ()) {
445 case "AF": // Afghanistan
448 case "AL": // Albania
451 case "DZ": // Algeria
454 case "AS": // American Samoa
457 case "AD": // Andorra
463 case "AI": // Anguilla
466 case "AQ": // Antarctica
469 case "AG": // Antigua and Barbuda
472 case "AR": // Argentina
475 case "AM": // Armenia
481 case "AU": // Australia
484 case "AT": // Austria
487 case "AZ": // Azerbaijan
490 case "BS": // Bahamas
493 case "BH": // Bahrain
496 case "BD": // Bangladesh
499 case "BB": // Barbados
502 case "BY": // Belarus
505 case "BE": // Belgium
514 case "BM": // Bermuda
520 case "BO": // Bolivia
523 case "BA": // Bosnia and Herzegowina
526 case "BW": // Botswana
529 case "BV": // Bouvet Island
535 case "IO": // British Indian Ocean Territory
538 case "BN": // Brunei Darussalam
541 case "BG": // Bulgaria
544 case "BF": // Burkina Faso
547 case "BI": // Burundi
550 case "KH": // Cambodia
553 case "CM": // Cameroon
559 case "CV": // Cape Verde
562 case "KY": // Cayman Islands
565 case "CF": // Central African Republic
577 case "CX": // Christmas Island
580 case "CC": // Cocos (Keeling) Islands
583 case "CO": // Colombia
586 case "KM": // Comoros
592 case "CK": // Cook Islands
595 case "CR": // Costa Rica
598 case "CI": // Cote D'Ivoire
601 case "HR": // Croatia (Local Name: Hrvatska)
610 case "CZ": // Czech Republic
613 case "DK": // Denmark
616 case "DJ": // Djibouti
619 case "DM": // Dominica
622 case "DO": // Dominican Republic
625 case "TP": // East Timor
628 case "EC": // Ecuador
634 case "SV": // El Salvador
637 case "GQ": // Equatorial Guinea
640 case "ER": // Eritrea
643 case "EE": // Estonia
646 case "ET": // Ethiopia
649 case "FK": // Falkland Islands (Malvinas)
652 case "FO": // Faroe Islands
658 case "FI": // Finland
664 case "FX": // France, Metropolitan
667 case "GF": // French Guiana
670 case "PF": // French Polynesia
673 case "TF": // French Southern Territories
682 case "GE": // Georgia
685 case "DE": // Germany
691 case "GI": // Gibraltar
697 case "GL": // Greenland
700 case "GD": // Grenada
703 case "GP": // Guadeloupe
709 case "GT": // Guatemala
715 case "GW": // Guinea-Bissau
724 case "HM": // Heard and Mc Donald Islands
727 case "VA": // Holy See (Vatican City State)
730 case "HN": // Honduras
733 case "HK": // Hong Kong
736 case "HU": // Hungary
739 case "IS": // Iceland
745 case "ID": // Indonesia
748 case "IR": // Iran (Islamic Republic of)
754 case "IE": // Ireland
763 case "JM": // Jamaica
772 case "KZ": // Kazakhstan
778 case "KI": // Kiribati
781 case "KP": // Korea, Democratic People's Republic of
784 case "KR": // Korea, Republic of
790 case "KG": // Kyrgyzstan
793 case "LA": // Lao People's Democratic Republic
799 case "LB": // Lebanon
802 case "LS": // Lesotho
805 case "LR": // Liberia
808 case "LY": // Libyan Arab Jamahiriya
811 case "LI": // Liechtenstein
814 case "LT": // Lithuania
817 case "LU": // Luxembourg
823 case "MK": // Macedonia, The Former Yugoslav Republic of
826 case "MG": // Madagascar
832 case "MY": // Malaysia
835 case "MV": // Maldives
844 case "MH": // Marshall Islands
847 case "MQ": // Martinique
850 case "MR": // Mauritania
853 case "MU": // Mauritius
856 case "YT": // Mayotte
862 case "FM": // Micronesia, Federated States of
865 case "MD": // Moldova, Republic of
871 case "MN": // Mongolia
874 case "MS": // Montserrat
877 case "MA": // Morocco
880 case "MZ": // Mozambique
883 case "MM": // Myanmar
886 case "NA": // Namibia
895 case "NL": // Netherlands
898 case "AN": // Netherlands Antilles
901 case "NC": // New Caledonia
904 case "NZ": // New Zealand
907 case "NI": // Nicaragua
913 case "NG": // Nigeria
919 case "NF": // Norfolk Island
922 case "MP": // Northern Mariana Islands
931 case "PK": // Pakistan
940 case "PG": // Papua New Guinea
943 case "PY": // Paraguay
949 case "PH": // Philippines
952 case "PN": // Pitcairn
958 case "PT": // Portugal
961 case "PR": // Puerto Rico
967 case "RE": // Reunion
970 case "RO": // Romania
973 case "RU": // Russian Federation
979 case "KN": // Saint Kitts and Nevis
982 case "LC": // Saint Lucia
985 case "VC": // Saint Vincent and The Grenadines
991 case "SM": // San Marino
994 case "ST": // Sao Tome and Principe
997 case "SA": // Saudi Arabia
1000 case "SN": // Senegal
1003 case "SC": // Seychelles
1006 case "SL": // Sierra Leone
1009 case "SG": // Singapore
1012 case "SK": // Slovakia (Slovak Republic)
1015 case "SI": // Slovenia
1018 case "SB": // Solomon Islands
1021 case "SO": // Somalia
1024 case "ZA": // South Africa
1027 case "GS": // South Georgia and The South Sandwich Islands
1033 case "LK": // Sri Lanka
1036 case "SH": // St. Helena
1039 case "PM": // St. Pierre and Miquelon
1045 case "SR": // Suriname
1048 case "SJ": // Svalbard and Jan Mayen Islands
1051 case "SZ": // Swaziland
1054 case "SE": // Sweden
1057 case "CH": // Switzerland
1060 case "SY": // Syrian Arab Republic
1063 case "TW": // Taiwan, Province of China
1066 case "TJ": // Tajikistan
1069 case "TZ": // Tanzania, United Republic of
1072 case "TH": // Thailand
1078 case "TK": // Tokelau
1084 case "TT": // Trinidad and Tobago
1087 case "TN": // Tunisia
1090 case "TR": // Turkey
1093 case "TM": // Turkmenistan
1096 case "TC": // Turks and Caicos Islands
1099 case "TV": // Tuvalu
1102 case "UG": // Uganda
1105 case "UA": // Ukraine
1108 case "AE": // United Arab Emirates
1111 case "GB": // United Kingdom
1114 case "US": // United States
1117 case "UM": // United States Minor Outlying Islands
1120 case "UY": // Uruguay
1123 case "UZ": // Uzbekistan
1126 case "VU": // Vanuatu
1129 case "VE": // Venezuela
1132 case "VN": // Viet Nam
1135 case "VG": // Virgin Islands (British)
1138 case "VI": // Virgin Islands (U.S.)
1141 case "WF": // Wallis and Futuna Islands
1144 case "EH": // Western Sahara
1150 case "YU": // Yugoslavia
1156 case "ZM": // Zambia
1159 case "ZW": // Zimbabwe
1163 throw new ArgumentException ("Region name " + name + " is not supported.");
1168 public virtual string CurrencySymbol {
1172 throw new Exception ("Dunno what is currency symbol for " + NLS_id + " Region. FIXME.");
1177 // This property is not synchronized with CurrentCulture, so
1178 // we need to use bootstrap CurrentCulture LCID.
1179 public static RegionInfo CurrentRegion {
1181 if (currentRegion == null) {
1182 CultureInfo ci = CultureInfo.CurrentCulture;
1183 // If current culture is invariant then region is not available.
1184 if (CultureInfo.BootstrapCultureID == 0x7F)
1187 // make sure to fill BootstrapCultureID.
1188 currentRegion = new RegionInfo (CultureInfo.BootstrapCultureID);
1191 return currentRegion;
1196 public virtual string DisplayName {
1199 case 203: // Czech republic
1200 return "Èeská republika";
1201 case 840: // United States
1202 return "United States";
1204 throw new Exception ("FIXME. Please add your region name in language used in this region.");
1209 public virtual string EnglishName {
1213 return "Afghanistan";
1219 return "American Samoa";
1227 return "Antarctica";
1229 return "Antigua and Barbuda";
1241 return "Azerbaijan";
1247 return "Bangladesh";
1265 return "Bosnia and Herzegowina";
1269 return "Bouvet Island";
1273 return "British Indian Ocean Territory";
1275 return "Brunei Darussalam";
1279 return "Burkina Faso";
1289 return "Cape Verde";
1291 return "Cayman Islands";
1293 return "Central African Republic";
1301 return "Christmas Island";
1303 return "Cocos (Keeling) Islands";
1311 return "Cook Islands";
1313 return "Costa Rica";
1315 return "Cote D'Ivoire";
1317 return "Croatia (Local Name: Hrvatska)";
1323 return "Czech Republic";
1331 return "Dominican Republic";
1333 return "East Timor";
1339 return "El Salvador";
1341 return "Equatorial Guinea";
1349 return "Falkland Islands (Malvinas)";
1351 return "Faroe Islands";
1359 return "France, Metropolitan";
1361 return "French Guiana";
1363 return "French Polynesia";
1365 return "French Southern Territories";
1385 return "Guadeloupe";
1393 return "Guinea-Bissau";
1399 return "Heard and Mc Donald Islands";
1401 return "Holy See (Vatican City State)";
1415 return "Iran (Islamic Republic of)";
1431 return "Kazakhstan";
1437 return "Korea, Democratic People's Republic of";
1439 return "Korea, Republic of";
1443 return "Kyrgyzstan";
1445 return "Lao People's Democratic Republic";
1455 return "Libyan Arab Jamahiriya";
1457 return "Liechtenstein";
1461 return "Luxembourg";
1465 return "Macedonia, The Former Yugoslav Republic of";
1467 return "Madagascar";
1479 return "Marshall Islands";
1481 return "Martinique";
1483 return "Mauritania";
1491 return "Micronesia, Federated States of";
1493 return "Moldova, Republic of";
1499 return "Montserrat";
1503 return "Mozambique";
1513 return "Netherlands";
1515 return "Netherlands Antilles";
1517 return "New Caledonia";
1519 return "New Zealand";
1529 return "Norfolk Island";
1531 return "Northern Mariana Islands";
1543 return "Papua New Guinea";
1549 return "Philippines";
1557 return "Puerto Rico";
1565 return "Russian Federation";
1569 return "Saint Kitts and Nevis";
1571 return "Saint Lucia";
1573 return "Saint Vincent and The Grenadines";
1577 return "San Marino";
1579 return "Sao Tome and Principe";
1581 return "Saudi Arabia";
1585 return "Seychelles";
1587 return "Sierra Leone";
1591 return "Slovakia (Slovak Republic)";
1595 return "Solomon Islands";
1599 return "South Africa";
1601 return "South Georgia and The South Sandwich Islands";
1607 return "St. Helena";
1609 return "St. Pierre and Miquelon";
1615 return "Svalbard and Jan Mayen Islands";
1621 return "Switzerland";
1623 return "Syrian Arab Republic";
1625 return "Taiwan, Province of China";
1627 return "Tajikistan";
1629 return "Tanzania, United Republic of";
1639 return "Trinidad and Tobago";
1645 return "Turkmenistan";
1647 return "Turks and Caicos Islands";
1655 return "United Arab Emirates";
1657 return "United Kingdom";
1659 return "United States";
1661 return "United States Minor Outlying Islands";
1665 return "Uzbekistan";
1673 return "Virgin Islands (British)";
1675 return "Virgin Islands (U.S.)";
1677 return "Wallis and Futuna Islands";
1679 return "Western Sahara";
1683 return "Yugoslavia";
1691 throw new Exception ("This code should not be reached.");
1697 public virtual bool IsMetric {
1700 case 203: // Czech Republic
1702 case 840: // United States
1705 throw new Exception ("FIXME. Please define.");
1711 public virtual string ISOCurrencySymbol {
1715 throw new Exception ("This code should not be reached.");
1721 public virtual string Name
1724 throw new NotImplementedException();
1729 public virtual string ThreeLetterISORegionName
1732 throw new NotImplementedException();
1737 public virtual string ThreeLetterWindowsRegionName
1740 throw new NotImplementedException();
1745 public virtual string TwoLetterISORegionName
1748 throw new NotImplementedException();
1756 public override bool Equals (object value) {
1757 return value == this;
1760 public override int GetHashCode () {
1761 return NLS_id.GetHashCode ();
1764 public override string ToString ()