1: using System;
2: using System.Collections;
3: using System.Collections.Generic;
4: using System.IO;
5: using System.Linq;
6: using System.Reflection;
7: using System.Xml.Linq;
8:
9: namespace Ia.Cl.Model
10: {
11: ////////////////////////////////////////////////////////////////////////////
12:
13: /// <summary publish="true">
14: /// Country geographic coordinates and standard UN naming conventions.
15: /// </summary>
16: /// <remarks>
17: /// Copyright © 2001-2015 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
18: ///
19: /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
20: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
21: ///
22: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
23: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
24: ///
25: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
26: ///
27: /// Copyright notice: This notice may not be removed or altered from any source distribution.
28: /// </remarks>
29: public class Country
30: {
31: private static Hashtable fipsToIso2Hashtable, iso2ToFipsHashtable;
32: private static XDocument xd;
33:
34: // # FIPS 10-4 to ISO 3166-1 country codes
35: // # Created by OpenGeoCode.Org, Submitted into the Public Domain June 4, 2014 (Version 5)
36: // #
37: // # Last FIPS 10-4 Revision, as Published by CIA World Factbook, Jan. 2014
38: // # Metadata
39: // # FIPS 10-4,
40: // # ISO 3166-1 alpha-2,
41: // # ISO 3166-1 alpha-3,
42: // # ISO 3166-1 numeric-3,
43: // # Inclusive in Country
44:
45: private static List<string> fipsIsoList = new List<string> {
46: "AF", "AF", "AFB", "004",
47: //"AX", "", "", "",
48: //"GB",
49: "AL", "AL", "ALB", "008",
50: "AG", "DZ", "DZA", "012",
51: "AQ", "AS", "ASM", "016",
52: "AN", "AD", "AND", "020",
53: "AO", "AO", "AGO", "024",
54: "AV", "AI", "AIA", "660",
55: "AY", "AQ", "ATA", "010",
56: "AC", "AG", "ATG", "028",
57: "AR", "AR", "ARG", "032",
58: "AM", "AM", "ARM", "051",
59: "AA", "AW", "ABW", "533",
60: //"AT", "", "", "", "AU",
61: "AS", "AU", "AUS", "036",
62: "AU", "AT", "AUT", "040",
63: "AJ", "AZ", "AZE", "031",
64: "BF", "BS", "BHS", "044",
65: "BA", "BH", "BHR", "048",
66: //"FQ", "", "", "", "UM",
67: "BG", "BD", "BGD", "050",
68: "BB", "BB", "BRB", "052",
69: //"BS", "", "", "", "FR",
70: "BO", "BY", "BLR", "112",
71: "BE", "BE", "BEL", "056",
72: "BH", "BZ", "BLZ", "084",
73: "BN", "BJ", "BEN", "204",
74: "BD", "BM", "BMU", "060",
75: "BT", "BT", "BTN", "064",
76: "BL", "BO", "BOL", "068",
77: "BK", "BA", "BIH", "070",
78: "BC", "BW", "BWA", "072",
79: "BV", "BV", "BVT", "074",
80: "BR", "BR", "BRA", "076",
81: "IO", "IO", "IOT", "086",
82: "VI", "VG", "VGB", "092",
83: "BX", "BN", "BRN", "096",
84: "BU", "BG", "BGR", "100",
85: "UV", "BF", "BFA", "854",
86: "BM", "MM", "MMR", "104",
87: "BY", "BI", "BDI", "108",
88: "CV", "CV", "CPV", "132",
89: "CB", "KH", "KHM", "116",
90: "CM", "CM", "CMR", "120",
91: "CA", "CA", "CAN", "124",
92: "CJ", "KY", "CYM", "136",
93: "CT", "CF", "CAF", "140",
94: "CD", "TD", "TCD", "148",
95: "CI", "CL", "CHL", "152",
96: "CH", "CN", "CHN", "156",
97: "KT", "CX", "CXR", "162",
98: //"IP", "", "", "", "FR",
99: "CK", "CC", "CCK", "166",
100: "CO", "CO", "COL", "170",
101: "CN", "KM", "COM", "174",
102: "CG", "CD", "COD", "180",
103: "CF", "CG", "COG", "178",
104: "CW", "CK", "COK", "184",
105: //"CR", "", "", "", "AU",
106: "CS", "CR", "CRI", "188",
107: "IV", "CI", "CIV", "384",
108: "HR", "HR", "HRV", "191",
109: "CU", "CU", "CUB", "192",
110: "UC", "CW", "CUW", "531",
111: "CY", "CY", "CYP", "196",
112: "EZ", "CZ", "CZE", "203",
113: "DA", "DK", "DNK", "208",
114: //"DX", "", "", "", "GB",
115: "DJ", "DJ", "DJI", "262",
116: "DO", "DM", "DMA", "212",
117: "DR", "DO", "DOM", "214",
118: "EC", "EC", "ECU", "218",
119: "EG", "EG", "EGY", "818",
120: "ES", "SV", "SLV", "222",
121: "EK", "GQ", "GNQ", "226",
122: "ER", "ER", "ERI", "232",
123: "EN", "EE", "EST", "233",
124: "ET", "ET", "ETH", "231",
125: //"EU", "", "", "", "FR",
126: "FK", "FK", "FLK", "238",
127: "FO", "FO", "FRO", "234",
128: "FJ", "FJ", "FJI", "242",
129: "FI", "FI", "FIN", "246",
130: "FR", "FR", "FRA", "250",
131: //"", "FX", "FXX", "249",
132: "FG", "GF", "GUF", "254",
133: "FP", "PF", "PYF", "258",
134: "FS", "TF", "ATF", "260",
135: "GB", "GA", "GAB", "266",
136: "GA", "GM", "GMB", "270",
137: "GZ", "PS", "PSE", "275",
138: "GG", "GE", "GEO", "268",
139: "GM", "DE", "DEU", "276",
140: "GH", "GH", "GHA", "288",
141: "GI", "GI", "GIB", "292",
142: //"GO", "", "", "", "FR",
143: "GR", "GR", "GRC", "300",
144: "GL", "GL", "GRL", "304",
145: "GJ", "GD", "GRD", "308",
146: "GP", "GP", "GLP", "312",
147: "GQ", "GU", "GUM", "316",
148: "GT", "GT", "GTM", "320",
149: "GK", "GG", "GGY", "831",
150: "GV", "GN", "GIN", "324",
151: "PU", "GW", "GNB", "624",
152: "GY", "GY", "GUY", "328",
153: "HA", "HT", "HTI", "332",
154: "HM", "HM", "HMD", "334",
155: "VT", "VA", "VAT", "336",
156: "HO", "HN", "HND", "340",
157: "HK", "HK", "HKG", "344",
158: //"HQ", "", "", "", "UM",
159: "HU", "HU", "HUN", "348",
160: "IC", "IS", "ISL", "352",
161: "IN", "IN", "IND", "356",
162: "ID", "ID", "IDN", "360",
163: "IR", "IR", "IRN", "364",
164: "IZ", "IQ", "IRQ", "368",
165: "EI", "IE", "IRL", "372",
166: "IM", "IM", "IMN", "833",
167: "IS", "IL", "ISR", "376",
168: "IT", "IT", "ITA", "380",
169: "JM", "JM", "JAM", "388",
170: //"JN", "", "", "", "SV",
171: "JA", "JP", "JPN", "392",
172: //"DQ", "", "", "", "UM",
173: "JE", "JE", "JEY", "832",
174: //"JQ", "", "", "", "UM",
175: "JO", "JO", "JOR", "400",
176: //"JU", "", "", "", "FR",
177: "KZ", "KZ", "KAZ", "398",
178: "KE", "KE", "KEN", "404",
179: //"KQ", "", "", "", "UM",
180: "KR", "KI", "KIR", "296",
181: "KN", "KP", "PRK", "408",
182: "KS", "KR", "KOR", "410",
183: //"KV", "XK", "XKS", "",
184: "KU", "KW", "KWT", "414",
185: "KG", "KG", "KGZ", "417",
186: "LA", "LA", "LAO", "418",
187: "LG", "LV", "LVA", "428",
188: "LE", "LB", "LBN", "422",
189: "LT", "LS", "LSO", "426",
190: "LI", "LR", "LBR", "430",
191: "LY", "LY", "LBY", "434",
192: "LS", "LI", "LIE", "438",
193: "LH", "LT", "LTU", "440",
194: "LU", "LU", "LUX", "442",
195: "MC", "MO", "MAC", "446",
196: "MK", "MK", "MKD", "807",
197: "MA", "MG", "MDG", "450",
198: "MI", "MW", "MWI", "454",
199: "MY", "MY", "MYS", "458",
200: "MV", "MV", "MDV", "462",
201: "ML", "ML", "MKI", "466",
202: "MT", "MT", "MLT", "470",
203: "RM", "MH", "MHL", "584",
204: "MB", "MQ", "MTQ", "474",
205: "MR", "MR", "MRT", "478",
206: "MP", "MU", "MUS", "480",
207: "MF", "YT", "MYT", "175",
208: "MX", "MX", "MEX", "484",
209: "FM", "FM", "FSM", "583",
210: //"MQ", "", "", "", "UM",
211: "MD", "MD", "MDA", "498",
212: "MN", "MC", "MCO", "492",
213: "MG", "MN", "MNG", "496",
214: "MJ", "ME", "MNE", "499",
215: "MH", "MS", "MSR", "500",
216: "MO", "MA", "MAR", "504",
217: "MZ", "MZ", "MOZ", "508",
218: "WA", "NA", "NAM", "516",
219: "NR", "NR", "NRU", "520",
220: //"BQ", "", "", "", "UM",
221: "NP", "NP", "NPL", "524",
222: "NL", "NL", "NLT", "528",
223: //"NT", "", "", "",
224: "NC", "NC", "NCL", "540",
225: "NZ", "NZ", "NZL", "554",
226: "NU", "NI", "NIC", "558",
227: "NG", "NE", "NER", "562",
228: "NI", "NG", "NGA", "566",
229: "NE", "NU", "NIU", "570",
230: "NF", "NF", "NFK", "574",
231: "CQ", "MP", "MNP", "580",
232: "NO", "NO", "NOR", "578",
233: "MU", "OM", "OMN", "512",
234: "PK", "PK", "PAK", "586",
235: "PS", "PW", "PLW", "585",
236: //"LQ", "", "", "", "UM",
237: "PM", "PA", "PAN", "591",
238: "PP", "PG", "PNG", "592",
239: //"PF", "", "", "",
240: "PA", "PY", "PRY", "600",
241: "PE", "PE", "PER", "604",
242: "RP", "PH", "PHL", "608",
243: "PC", "PN", "PCN", "612",
244: "PL", "PL", "POL", "616",
245: "PO", "PT", "PRT", "620",
246: "RQ", "PR", "PRI", "630",
247: "QA", "QA", "QAT", "634",
248: "RE", "RE", "REU", "638",
249: "RO", "RO", "ROU", "642",
250: "RS", "RU", "RUS", "643",
251: "RW", "RW", "RWA", "646",
252: "TB", "BL", "BLM", "652",
253: "SH", "SH", "SHN", "654",
254: "SC", "KN", "KNA", "659",
255: "ST", "LC", "LCA", "662",
256: "RN", "MF", "MAF", "663",
257: "SB", "PM", "SPM", "666",
258: "VC", "VC", "VCT", "670",
259: "WS", "WS", "WSM", "882",
260: "SM", "SM", "SMR", "674",
261: "TP", "ST", "STP", "678",
262: "SA", "SA", "SAU", "682",
263: "SG", "SN", "SEN", "686",
264: "RI", "RS", "SRB", "688",
265: "SE", "SC", "SYC", "690",
266: "SL", "SL", "SLE", "694",
267: "SN", "SG", "SGP", "702",
268: "NN", "SX", "SXM", "534",
269: "LO", "SK", "SVK", "703",
270: "SI", "SI", "SVN", "705",
271: "BP", "SB", "SLB", "090",
272: "SO", "SO", "SOM", "706",
273: "SF", "ZA", "ZAF", "710",
274: "SX", "GS", "SGS", "239",
275: "OD", "SS", "SSD", "728",
276: "SP", "ES", "ESP", "724",
277: //"PG", "", "", "",
278: "CE", "LK", "LKA", "144",
279: "SU", "SD", "SDN", "729",
280: "NS", "SR", "SUR", "740",
281: "SV", "SJ", "SJM", "744",
282: "WZ", "SZ", "SWZ", "748",
283: "SW", "SE", "SWE", "752",
284: "SZ", "CH", "CHE", "756",
285: "SY", "SY", "SYR", "760",
286: "TW", "TW", "TWN", "158",
287: "TI", "TJ", "TJK", "762",
288: "TZ", "TZ", "TZA", "834",
289: "TH", "TH", "THA", "764",
290: "TT", "TL", "TLS", "626",
291: "TO", "TG", "TGO", "768",
292: "TL", "TK", "TKL", "772",
293: "TN", "TO", "TON", "776",
294: "TD", "TT", "TTO", "780",
295: //"TE", "", "", "", "FR",
296: "TS", "TN", "TUN", "788",
297: "TU", "TR", "TUR", "792",
298: "TX", "TM", "TKM", "795",
299: "TK", "TC", "TCA", "796",
300: "TV", "TV", "TUV", "798",
301: "UG", "UG", "UGA", "800",
302: "UP", "UA", "UKR", "804",
303: "AE", "AE", "ARE", "784",
304: "UK", "GB", "GBR", "826",
305: "US", "US", "USA", "840",
306: //"", "UM", "UMI", "581",
307: "UY", "UY", "URY", "858",
308: "UZ", "UZ", "UZB", "860",
309: "NH", "VU", "VUT", "548",
310: "VE", "VE", "VEN", "862",
311: "VM", "VN", "VNH", "704",
312: "VQ", "VI", "VIR", "850",
313: //"WQ", "", "", "", "UM",
314: "WF", "WF", "WLF", "876",
315: "WE", "PS", "PSE", "275",
316: "WI", "EH", "ESH", "732",
317: "YM", "YE", "YEM", "887",
318: "ZA", "ZM", "ZMB", "894",
319: "ZI", "ZW", "ZWE", "716" };
320:
321: private static List<Country> countryList;
322:
323: /// <summary/>
324: /// [Key]
325: public int Itu { get; set; }
326: /// <summary/>
327: public string Name { get; set; }
328: /// <summary/>
329: public string ArabicName { get; set; }
330: /// <summary/>
331: public string NativeName { get; set; }
332: /// <summary/>
333: public Dictionary<string, string> NameDictionary { get; set; }
334: /// <summary/>
335: public string Latitude { get; set; }
336: /// <summary/>
337: public string Longitude { get; set; }
338: /// <summary/>
339: public string Capital { get; set; }
340: /// <summary/>
341: public string CapitalLatitude { get; set; }
342: /// <summary/>
343: public string CapitalLongitude { get; set; }
344: /// <summary/>
345: public string Iso2 { get; set; }
346: /// <summary/>
347: public string Iso3 { get; set; }
348: /// <summary/>
349: public string Iana { get; set; }
350: /// <summary/>
351: public string Un { get; set; }
352: /// <summary/>
353: public string Ioc { get; set; }
354: /// <summary/>
355: public string Fips { get; set; }
356: /// <summary/>
357: public string SpokenLanguageIso6391ListString { get; set; }
358:
359:
360: ////////////////////////////////////////////////////////////////////////////
361:
362: /// <summary>
363: ///
364: /// </summary>
365: public Country() { }
366:
367: ////////////////////////////////////////////////////////////////////////////
368:
369: /// <summary>
370: ///
371: /// </summary>
372: public static List<Country> List
373: {
374: get
375: {
376: if (countryList == null || countryList.Count == 0)
377: {
378: countryList = (from c in XDocument.Elements("countryList").Elements("country")
379: where c.Attribute("itu").Value != "" && c.Attribute("iso2").Value != "" && Iso2ToFipsHashtable.ContainsKey(c.Attribute("iso2").Value)
380: select new Country
381: {
382: Itu = int.Parse(c.Attribute("itu").Value.Replace("-", "")),
383: Name = Ia.Cl.Model.Default.ToTitleCase(c.Attribute("name").Value),
384: ArabicName = c.Attribute("arabicName").Value,
385: NativeName = c.Attribute("nativeName").Value,
386: NameDictionary = _NameDictionary(c),
387: Latitude = c.Attribute("latitude").Value,
388: Longitude = c.Attribute("longitude").Value,
389: Capital = c.Attribute("capital").Value,
390: CapitalLatitude = c.Attribute("capitalLatitude").Value,
391: CapitalLongitude = c.Attribute("capitalLongitude").Value,
392: Iso2 = c.Attribute("iso2").Value,
393: Iso3 = c.Attribute("iso3").Value,
394: Iana = c.Attribute("iana").Value,
395: Un = c.Attribute("un").Value,
396: Ioc = c.Attribute("ioc").Value,
397: Fips = Iso2ToFipsHashtable[c.Attribute("iso2").Value].ToString(),
398: SpokenLanguageIso6391ListString = c.Attribute("spokenLanguageIso6391List").Value
399: }
400: ).ToList<Country>();
401: }
402:
403: return countryList;
404: }
405: }
406:
407: ////////////////////////////////////////////////////////////////////////////
408:
409: /// <summary>
410: ///
411: /// </summary>
412: private static Dictionary<string, string> _NameDictionary(XElement xElement)
413: {
414: IEnumerable<XAttribute> xAttributeList;
415: Dictionary<string, string> dictionary;
416:
417: dictionary = new Dictionary<string, string>();
418:
419: // name="Japan" arabicName="" nativeName="日本" japaneseName="日本"
420:
421: if (xElement.HasAttributes)
422: {
423: xAttributeList = xElement.Attributes();
424:
425: foreach (XAttribute xa in xAttributeList)
426: {
427: switch (xa.Name.LocalName)
428: {
429: case "name": dictionary.Add("en", xa.Value); break;
430: case "arabicName": dictionary.Add("ar", xa.Value); break;
431: case "spanishName": dictionary.Add("es", xa.Value); break;
432: case "frenchName": dictionary.Add("fr", xa.Value); break;
433: case "germanName": dictionary.Add("de", xa.Value); break;
434: case "dutchName": dictionary.Add("nl", xa.Value); break;
435: case "russianName": dictionary.Add("ru", xa.Value); break;
436:
437: case "chineseTraditionalName": dictionary.Add("zh_traditional", xa.Value); break;
438: case "chineseSimplifiedName": dictionary.Add("zh_simplified", xa.Value); break;
439:
440: case "japaneseName": dictionary.Add("ja", xa.Value); break;
441: case "koreanName": dictionary.Add("ko", xa.Value); break;
442: case "catalanName": dictionary.Add("ca", xa.Value); break;
443: case "portugueseName": dictionary.Add("pt", xa.Value); break;
444: case "italianName": dictionary.Add("it", xa.Value); break;
445: case "danishName": dictionary.Add("da", xa.Value); break;
446: case "faroeseName": dictionary.Add("fo", xa.Value); break;
447:
448: case "hindiName": dictionary.Add("hi", xa.Value); break;
449: case "bengaliName": dictionary.Add("bn", xa.Value); break;
450: case "gujaratiName": dictionary.Add("gu", xa.Value); break;
451: case "kashmiriName": dictionary.Add("ks", xa.Value); break;
452: case "malayalamName": dictionary.Add("ml", xa.Value); break;
453: case "marathiName": dictionary.Add("mr", xa.Value); break;
454: case "oriyaName": dictionary.Add("or", xa.Value); break;
455: case "punjabiName": dictionary.Add("pa", xa.Value); break;
456: case "tamilName": dictionary.Add("ta", xa.Value); break;
457: case "teluguName": dictionary.Add("te", xa.Value); break;
458: case "urduName": dictionary.Add("ur", xa.Value); break;
459: case "kannadaName": dictionary.Add("kn", xa.Value); break;
460: case "assameseName": dictionary.Add("as", xa.Value); break;
461: case "sanskritName": dictionary.Add("sa", xa.Value); break;
462: case "sindhiName": dictionary.Add("sd", xa.Value); break;
463:
464: case "armenianName": dictionary.Add("hy", xa.Value); break;
465: case "persianName": dictionary.Add("fa", xa.Value); break;
466:
467: case "pushtoName": dictionary.Add("ps", xa.Value); break;
468: case "kirghizName": dictionary.Add("ky", xa.Value); break;
469: case "turkmenName": dictionary.Add("tk", xa.Value); break;
470: case "khmerName": dictionary.Add("km", xa.Value); break;
471:
472: case "somaliName": dictionary.Add("so", xa.Value); break;
473: case "afarName": dictionary.Add("aa", xa.Value); break;
474:
475: case "icelandicName": dictionary.Add("is", xa.Value); break;
476: case "swedishName": dictionary.Add("sv", xa.Value); break;
477: case "norwegianName": dictionary.Add("no", xa.Value); break;
478: case "kazakhName": dictionary.Add("kk", xa.Value); break;
479:
480: case "laoName": dictionary.Add("lo", xa.Value); break;
481:
482: case "afrikaansName": dictionary.Add("af", xa.Value); break;
483: case "swahiliName": dictionary.Add("sw", xa.Value); break;
484:
485: case "albanianName": dictionary.Add("sq", xa.Value); break;
486: case "greekName": dictionary.Add("el", xa.Value); break;
487:
488: case "indonesianName": dictionary.Add("id", xa.Value); break;
489: case "latvianName": dictionary.Add("lv", xa.Value); break;
490: case "lithuanianName": dictionary.Add("lt", xa.Value); break;
491:
492: case "macedonianName": dictionary.Add("mk", xa.Value); break;
493: case "turkishName": dictionary.Add("tr", xa.Value); break;
494: case "serbianName": dictionary.Add("sr", xa.Value); break;
495:
496: case "nauruanName": dictionary.Add("na", xa.Value); break;
497:
498: case "filipinoName": dictionary.Add("tl", xa.Value); break;
499:
500: case "romanianName": dictionary.Add("ro", xa.Value); break;
501: case "hungarianName": dictionary.Add("hu", xa.Value); break;
502:
503: case "tajikName": dictionary.Add("tg", xa.Value); break;
504:
505: case "ukrainianName": dictionary.Add("uk", xa.Value); break;
506: case "polishName": dictionary.Add("pl", xa.Value); break;
507:
508: case "ShonaNam": dictionary.Add("sn", xa.Value); break;
509: case "NorthNdebeleName": dictionary.Add("nd", xa.Value); break;
510: case "SouthNdebeleName": dictionary.Add("nr", xa.Value); break;
511:
512: case "fijianName": dictionary.Add("fj", xa.Value); break;
513: case "kurdishName": dictionary.Add("ku", xa.Value); break;
514:
515: case "zuluName": dictionary.Add("zu", xa.Value); break;
516: case "xhosaName": dictionary.Add("xh", xa.Value); break;
517: case "malagasyName": dictionary.Add("mg", xa.Value); break;
518:
519: case "nepaliName": dictionary.Add("ne", xa.Value); break;
520:
521: case "hebrewName": dictionary.Add("he", xa.Value); break;
522:
523: case "vietnameseName": dictionary.Add("vi", xa.Value); break;
524:
525: default: break;
526: }
527: }
528: }
529:
530: return dictionary;
531: }
532:
533: ////////////////////////////////////////////////////////////////////////////
534:
535: /// <summary>
536: ///
537: /// </summary>
538: public static List<Country> List2
539: {
540: // used for special cases
541: get
542: {
543: int i;
544:
545: if (countryList == null || countryList.Count == 0)
546: {
547: countryList = (from q in XDocument.Elements("countryList").Elements("country")
548: select new Country
549: {
550: Itu = int.TryParse(q.Attribute("itu").Value.Replace("-", ""), out i) ? i : 0,
551: Name = Ia.Cl.Model.Default.ToTitleCase(q.Attribute("name").Value),
552: ArabicName = q.Attribute("arabicName").Value,
553: NativeName = q.Attribute("nativeName").Value,
554: Latitude = q.Attribute("latitude").Value,
555: Longitude = q.Attribute("longitude").Value,
556: Capital = q.Attribute("capital").Value,
557: CapitalLatitude = q.Attribute("capitalLatitude").Value,
558: CapitalLongitude = q.Attribute("capitalLongitude").Value,
559: Iso2 = q.Attribute("iso2").Value,
560: Iso3 = q.Attribute("iso3").Value,
561: Iana = q.Attribute("iana").Value,
562: Un = q.Attribute("un").Value,
563: Ioc = q.Attribute("ioc").Value,
564: Fips = (q.Attribute("iso2").Value != "" && Iso2ToFipsHashtable.ContainsKey(q.Attribute("iso2").Value)) ? Iso2ToFipsHashtable[q.Attribute("iso2").Value].ToString() : "",
565: SpokenLanguageIso6391ListString = q.Attribute("spokenLanguageIso6391List").Value
566: }
567: ).ToList<Country>();
568: }
569:
570: return countryList;
571: }
572: }
573:
574: ////////////////////////////////////////////////////////////////////////////
575:
576: /// <summary>
577: ///
578: /// </summary>
579: public static Hashtable FipsToIso2Hashtable
580: {
581: get
582: {
583: if (fipsToIso2Hashtable == null || fipsToIso2Hashtable.Count == 0)
584: {
585: fipsToIso2Hashtable = new Hashtable(fipsIsoList.Count / 4);
586:
587: for (int i = 0; i < fipsIsoList.Count; i += 4)
588: {
589: fipsToIso2Hashtable[fipsIsoList[i]] = fipsIsoList[i + 1];
590: }
591: }
592:
593: return fipsToIso2Hashtable;
594: }
595: }
596:
597: ////////////////////////////////////////////////////////////////////////////
598:
599: /// <summary>
600: ///
601: /// </summary>
602: public static Hashtable Iso2ToFipsHashtable
603: {
604: get
605: {
606: if (iso2ToFipsHashtable == null || iso2ToFipsHashtable.Count == 0)
607: {
608: iso2ToFipsHashtable = new Hashtable(fipsIsoList.Count / 4);
609:
610: for (int i = 0; i < fipsIsoList.Count; i += 4)
611: {
612: iso2ToFipsHashtable[fipsIsoList[i + 1]] = fipsIsoList[i];
613: }
614: }
615:
616: return iso2ToFipsHashtable;
617: }
618: }
619:
620: ////////////////////////////////////////////////////////////////////////////
621:
622: /// <summary>
623: ///
624: /// </summary>
625: public static string FipsFromIso2(string iso2)
626: {
627: string fips;
628:
629: if (Iso2ToFipsHashtable.ContainsKey(iso2)) fips = Iso2ToFipsHashtable[iso2].ToString();
630: else fips = null;
631:
632: return fips;
633: }
634:
635: ////////////////////////////////////////////////////////////////////////////
636:
637: /// <summary>
638: ///
639: /// </summary>
640: public static string Iso2FromFips(string fips)
641: {
642: string iso2;
643:
644: if (FipsToIso2Hashtable.ContainsKey(fips)) iso2 = FipsToIso2Hashtable[fips].ToString();
645: else iso2 = null;
646:
647: return iso2;
648: }
649:
650: ////////////////////////////////////////////////////////////////////////////
651:
652: /// <summary>
653: ///
654: /// </summary>
655: public List<Ia.Cl.Model.Language> SpokenLanguageList
656: {
657: get
658: {
659: string s;
660: List<Ia.Cl.Model.Language> list;
661:
662: if (!string.IsNullOrEmpty(SpokenLanguageIso6391ListString))
663: {
664: s = "," + SpokenLanguageIso6391ListString;
665:
666: list = (from l in Ia.Cl.Model.Language.List where s.Contains("," + l.Iso6391) select l).ToList();
667: }
668: else list = null;
669:
670: return list;
671: }
672: }
673:
674: ////////////////////////////////////////////////////////////////////////////
675:
676: /// <summary>
677: ///
678: /// How to embed and access resources by using Visual C# http://support.microsoft.com/kb/319292/en-us
679: ///
680: /// 1. Change the "Build Action" property of your XML file from "Content" to "Embedded Resource".
681: /// 2. Add "using System.Reflection".
682: /// 3. Manifest resource stream will start with the project namespace, the location of XML file.
683: ///
684: /// </summary>
685:
686: private static XDocument XDocument
687: {
688: get
689: {
690: Assembly _assembly;
691: StreamReader streamReader;
692:
693: xd = null;
694: _assembly = Assembly.GetExecutingAssembly();
695: streamReader = new StreamReader(_assembly.GetManifestResourceStream("Ia.Cl.model.country.country.xml"));
696:
697: try
698: {
699: if (streamReader.Peek() != -1)
700: {
701: xd = System.Xml.Linq.XDocument.Load(streamReader);
702: }
703: }
704: catch (Exception)
705: {
706: }
707: finally
708: {
709: }
710:
711: return xd;
712: }
713: }
714:
715: ////////////////////////////////////////////////////////////////////////////
716: ////////////////////////////////////////////////////////////////////////////
717: }
718: }