home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / Country.pm < prev    next >
Text File  |  2003-11-07  |  13KB  |  550 lines

  1. #
  2. # Locale::Country - ISO codes for country identification (ISO 3166)
  3. #
  4. # $Id: Country.pm,v 2.6 2002/07/10 16:33:27 neilb Exp $
  5. #
  6.  
  7. package Locale::Country;
  8. use strict;
  9. require 5.002;
  10.  
  11. require Exporter;
  12. use Carp;
  13. use Locale::Constants;
  14.  
  15.  
  16. #-----------------------------------------------------------------------
  17. #    Public Global Variables
  18. #-----------------------------------------------------------------------
  19. use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
  20. $VERSION   = sprintf("%d.%02d", q$Revision: 2.61 $ =~ /(\d+)\.(\d+)/);
  21. @ISA       = qw(Exporter);
  22. @EXPORT    = qw(code2country country2code
  23.                 all_country_codes all_country_names
  24.         country_code2code
  25.         LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC);
  26.  
  27. #-----------------------------------------------------------------------
  28. #    Private Global Variables
  29. #-----------------------------------------------------------------------
  30. my $CODES     = [];
  31. my $COUNTRIES = [];
  32.  
  33.  
  34. #=======================================================================
  35. #
  36. # code2country ( CODE [, CODESET ] )
  37. #
  38. #=======================================================================
  39. sub code2country
  40. {
  41.     my $code = shift;
  42.     my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
  43.  
  44.  
  45.     return undef unless defined $code;
  46.  
  47.     #-------------------------------------------------------------------
  48.     # Make sure the code is in the right form before we use it
  49.     # to look up the corresponding country.
  50.     # We have to sprintf because the codes are given as 3-digits,
  51.     # with leading 0's. Eg 052 for Barbados.
  52.     #-------------------------------------------------------------------
  53.     if ($codeset == LOCALE_CODE_NUMERIC)
  54.     {
  55.     return undef if ($code =~ /\D/);
  56.     $code = sprintf("%.3d", $code);
  57.     }
  58.     else
  59.     {
  60.     $code = lc($code);
  61.     }
  62.  
  63.     if (exists $CODES->[$codeset]->{$code})
  64.     {
  65.         return $CODES->[$codeset]->{$code};
  66.     }
  67.     else
  68.     {
  69.         #---------------------------------------------------------------
  70.         # no such country code!
  71.         #---------------------------------------------------------------
  72.         return undef;
  73.     }
  74. }
  75.  
  76.  
  77. #=======================================================================
  78. #
  79. # country2code ( NAME [, CODESET ] )
  80. #
  81. #=======================================================================
  82. sub country2code
  83. {
  84.     my $country = shift;
  85.     my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
  86.  
  87.  
  88.     return undef unless defined $country;
  89.     $country = lc($country);
  90.     if (exists $COUNTRIES->[$codeset]->{$country})
  91.     {
  92.         return $COUNTRIES->[$codeset]->{$country};
  93.     }
  94.     else
  95.     {
  96.         #---------------------------------------------------------------
  97.         # no such country!
  98.         #---------------------------------------------------------------
  99.         return undef;
  100.     }
  101. }
  102.  
  103.  
  104. #=======================================================================
  105. #
  106. # country_code2code ( NAME [, CODESET ] )
  107. #
  108. #=======================================================================
  109. sub country_code2code
  110. {
  111.     (@_ == 3) or croak "country_code2code() takes 3 arguments!";
  112.  
  113.     my $code = shift;
  114.     my $inset = shift;
  115.     my $outset = shift;
  116.     my $outcode;
  117.     my $country;
  118.  
  119.  
  120.     return undef if $inset == $outset;
  121.     $country = code2country($code, $inset);
  122.     return undef if not defined $country;
  123.     $outcode = country2code($country, $outset);
  124.     return $outcode;
  125. }
  126.  
  127.  
  128. #=======================================================================
  129. #
  130. # all_country_codes ( [ CODESET ] )
  131. #
  132. #=======================================================================
  133. sub all_country_codes
  134. {
  135.     my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
  136.  
  137.     return keys %{ $CODES->[$codeset] };
  138. }
  139.  
  140.  
  141. #=======================================================================
  142. #
  143. # all_country_names ( [ CODESET ] )
  144. #
  145. #=======================================================================
  146. sub all_country_names
  147. {
  148.     my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
  149.  
  150.     return values %{ $CODES->[$codeset] };
  151. }
  152.  
  153.  
  154. #=======================================================================
  155. #
  156. # alias_code ( ALIAS => CODE [ , CODESET ] )
  157. #
  158. # Add an alias for an existing code. If the CODESET isn't specified,
  159. # then we use the default (currently the alpha-2 codeset).
  160. #
  161. #   Locale::Country::alias_code('uk' => 'gb');
  162. #
  163. #=======================================================================
  164. sub alias_code
  165. {
  166.     my $alias = shift;
  167.     my $real  = shift;
  168.     my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
  169.  
  170.     my $country;
  171.  
  172.  
  173.     if (not exists $CODES->[$codeset]->{$real})
  174.     {
  175.         carp "attempt to alias \"$alias\" to unknown country code \"$real\"\n";
  176.         return undef;
  177.     }
  178.     $country = $CODES->[$codeset]->{$real};
  179.     $CODES->[$codeset]->{$alias} = $country;
  180.     $COUNTRIES->[$codeset]->{"\L$country"} = $alias;
  181.  
  182.     return $alias;
  183. }
  184.  
  185. # old name of function for backwards compatibility
  186. *_alias_code = *alias_code;
  187.  
  188.  
  189. #=======================================================================
  190. #
  191. # rename_country
  192. #
  193. # change the official name for a country, eg:
  194. #    gb => 'Great Britain'
  195. # rather than the standard 'United Kingdom'. The original is retained
  196. # as an alias, but the new name will be returned if you lookup the
  197. # name from code.
  198. #
  199. #=======================================================================
  200. sub rename_country
  201. {
  202.     my $code     = shift;
  203.     my $new_name = shift;
  204.     my $codeset = @_ > 0 ? shift : _code2codeset($code);
  205.     my $country;
  206.     my $c;
  207.  
  208.  
  209.     if (not defined $codeset)
  210.     {
  211.         carp "rename_country(): unknown country code \"$code\"\n";
  212.         return 0;
  213.     }
  214.  
  215.     $country = $CODES->[$codeset]->{$code};
  216.  
  217.     foreach my $cset (LOCALE_CODE_ALPHA_2,
  218.             LOCALE_CODE_ALPHA_3,
  219.             LOCALE_CODE_NUMERIC)
  220.     {
  221.     if ($cset == $codeset)
  222.     {
  223.         $c = $code;
  224.     }
  225.     else
  226.     {
  227.         $c = country_code2code($code, $codeset, $cset);
  228.     }
  229.  
  230.     $CODES->[$cset]->{$c} = $new_name;
  231.     $COUNTRIES->[$cset]->{"\L$new_name"} = $c;
  232.     }
  233.  
  234.     return 1;
  235. }
  236.  
  237.  
  238. #=======================================================================
  239. #
  240. # _code2codeset
  241. #
  242. # given a country code in an unknown codeset, return the codeset
  243. # it is from, or undef.
  244. #
  245. #=======================================================================
  246. sub _code2codeset
  247. {
  248.     my $code = shift;
  249.  
  250.  
  251.     foreach my $codeset (LOCALE_CODE_ALPHA_2, LOCALE_CODE_ALPHA_3,
  252.             LOCALE_CODE_NUMERIC)
  253.     {
  254.     return $codeset if (exists $CODES->[$codeset]->{$code})
  255.     }
  256.  
  257.     return undef;
  258. }
  259.  
  260.  
  261. #=======================================================================
  262. #
  263. # initialisation code - stuff the DATA into the ALPHA2 hash
  264. #
  265. #=======================================================================
  266. {
  267.     my ($alpha2, $alpha3, $numeric);
  268.     my ($country, @countries);
  269.  
  270.     local $_;
  271.  
  272.     while (<DATA>)
  273.     {
  274.         next unless /\S/;
  275.         chop;
  276.         ($alpha2, $alpha3, $numeric, @countries) = split(/:/, $_);
  277.  
  278.         $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $countries[0];
  279.     foreach $country (@countries)
  280.     {
  281.         $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$country"} = $alpha2;
  282.     }
  283.  
  284.     if ($alpha3)
  285.     {
  286.             $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $countries[0];
  287.         foreach $country (@countries)
  288.         {
  289.         $COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$country"} = $alpha3;
  290.         }
  291.     }
  292.  
  293.     if ($numeric)
  294.     {
  295.             $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $countries[0];
  296.         foreach $country (@countries)
  297.         {
  298.         $COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$country"} = $numeric;
  299.         }
  300.     }
  301.  
  302.     }
  303.  
  304.     close(DATA);
  305. }
  306.  
  307. 1;
  308.  
  309. __DATA__
  310. ad:and:020:Andorra
  311. ae:are:784:United Arab Emirates
  312. af:afg:004:Afghanistan
  313. ag:atg:028:Antigua and Barbuda
  314. ai:aia:660:Anguilla
  315. al:alb:008:Albania
  316. am:arm:051:Armenia
  317. an:ant:530:Netherlands Antilles
  318. ao:ago:024:Angola
  319. aq:ata:010:Antarctica
  320. ar:arg:032:Argentina
  321. as:asm:016:American Samoa
  322. at:aut:040:Austria
  323. au:aus:036:Australia
  324. aw:abw:533:Aruba
  325. az:aze:031:Azerbaijan
  326. ba:bih:070:Bosnia and Herzegovina
  327. bb:brb:052:Barbados
  328. bd:bgd:050:Bangladesh
  329. be:bel:056:Belgium
  330. bf:bfa:854:Burkina Faso
  331. bg:bgr:100:Bulgaria
  332. bh:bhr:048:Bahrain
  333. bi:bdi:108:Burundi
  334. bj:ben:204:Benin
  335. bm:bmu:060:Bermuda
  336. bn:brn:096:Brunei Darussalam
  337. bo:bol:068:Bolivia
  338. br:bra:076:Brazil
  339. bs:bhs:044:Bahamas
  340. bt:btn:064:Bhutan
  341. bv:bvt:074:Bouvet Island
  342. bw:bwa:072:Botswana
  343. by:blr:112:Belarus
  344. bz:blz:084:Belize
  345. ca:can:124:Canada
  346. cc:cck:166:Cocos (Keeling) Islands
  347. cf:caf:140:Central African Republic
  348. cg:cog:178:Congo:Congo, Republic of the
  349. ch:che:756:Switzerland
  350. ci:civ:384:Cote D'Ivoire
  351. ck:cok:184:Cook Islands
  352. cl:chl:152:Chile
  353. cm:cmr:120:Cameroon
  354. cn:chn:156:China
  355. co:col:170:Colombia
  356. cr:cri:188:Costa Rica
  357. cu:cub:192:Cuba
  358. cv:cpv:132:Cape Verde
  359. cx:cxr:162:Christmas Island
  360. cy:cyp:196:Cyprus
  361. cz:cze:203:Czech Republic
  362. de:deu:276:Germany
  363. dj:dji:262:Djibouti
  364. dk:dnk:208:Denmark
  365. dm:dma:212:Dominica
  366. do:dom:214:Dominican Republic
  367. dz:dza:012:Algeria
  368. ec:ecu:218:Ecuador
  369. ee:est:233:Estonia
  370. eg:egy:818:Egypt
  371. eh:esh:732:Western Sahara
  372. er:eri:232:Eritrea
  373. es:esp:724:Spain
  374. et:eth:231:Ethiopia
  375. fi:fin:246:Finland
  376. fj:fji:242:Fiji
  377. fk:flk:238:Falkland Islands (Malvinas):Falkland Islands (Islas Malvinas)
  378. fm:fsm:583:Micronesia, Federated States of
  379. fo:fro:234:Faroe Islands
  380. fr:fra:250:France
  381. fx:fxx:249:France, Metropolitan
  382. ga:gab:266:Gabon
  383. gb:gbr:826:United Kingdom:Great Britain
  384. gd:grd:308:Grenada
  385. ge:geo:268:Georgia
  386. gf:guf:254:French Guiana
  387. gh:gha:288:Ghana
  388. gi:gib:292:Gibraltar
  389. gl:grl:304:Greenland
  390. gm:gmb:270:Gambia
  391. gn:gin:324:Guinea
  392. gp:glp:312:Guadeloupe
  393. gq:gnq:226:Equatorial Guinea
  394. gr:grc:300:Greece
  395. gs:sgs:239:South Georgia and the South Sandwich Islands
  396. gt:gtm:320:Guatemala
  397. gu:gum:316:Guam
  398. gw:gnb:624:Guinea-Bissau
  399. gy:guy:328:Guyana
  400. hk:hkg:344:Hong Kong
  401. hm:hmd:334:Heard Island and McDonald Islands
  402. hn:hnd:340:Honduras
  403. hr:hrv:191:Croatia
  404. ht:hti:332:Haiti
  405. hu:hun:348:Hungary
  406. id:idn:360:Indonesia
  407. ie:irl:372:Ireland
  408. il:isr:376:Israel
  409. in:ind:356:India
  410. io:iot:086:British Indian Ocean Territory
  411. iq:irq:368:Iraq
  412. ir:irn:364:Iran, Islamic Republic of:Iran
  413. is:isl:352:Iceland
  414. it:ita:380:Italy
  415. jm:jam:388:Jamaica
  416. jo:jor:400:Jordan
  417. jp:jpn:392:Japan
  418. ke:ken:404:Kenya
  419. kg:kgz:417:Kyrgyzstan
  420. kh:khm:116:Cambodia
  421. ki:kir:296:Kiribati
  422. km:com:174:Comoros
  423. kn:kna:659:Saint Kitts and Nevis
  424. kp:prk:408:Korea, Democratic People's Republic of:Korea, North:North Korea
  425. kr:kor:410:Korea, Republic of:Korea, South:South Korea
  426. kw:kwt:414:Kuwait
  427. ky:cym:136:Cayman Islands
  428. kz:kaz:398:Kazakhstan:Kazakstan
  429. la:lao:418:Lao People's Democratic Republic
  430. lb:lbn:422:Lebanon
  431. lc:lca:662:Saint Lucia
  432. li:lie:438:Liechtenstein
  433. lk:lka:144:Sri Lanka
  434. lr:lbr:430:Liberia
  435. ls:lso:426:Lesotho
  436. lt:ltu:440:Lithuania
  437. lu:lux:442:Luxembourg
  438. lv:lva:428:Latvia
  439. ly:lby:434:Libyan Arab Jamahiriya:Libya
  440. ma:mar:504:Morocco
  441. mc:mco:492:Monaco
  442. md:mda:498:Moldova, Republic of:Moldova
  443. mg:mdg:450:Madagascar
  444. mh:mhl:584:Marshall Islands
  445. mk:mkd:807:Macedonia, the Former Yugoslav Republic of:Macedonia, Former Yugoslav Republic of:Macedonia
  446. ml:mli:466:Mali
  447. mm:mmr:104:Myanmar
  448. mn:mng:496:Mongolia
  449. mo:mac:446:Macao:Macau
  450. mp:mnp:580:Northern Mariana Islands
  451. mq:mtq:474:Martinique
  452. mr:mrt:478:Mauritania
  453. ms:msr:500:Montserrat
  454. mt:mlt:470:Malta
  455. mu:mus:480:Mauritius
  456. mv:mdv:462:Maldives
  457. mw:mwi:454:Malawi
  458. mx:mex:484:Mexico
  459. my:mys:458:Malaysia
  460. mz:moz:508:Mozambique
  461. na:nam:516:Namibia
  462. nc:ncl:540:New Caledonia
  463. ne:ner:562:Niger
  464. nf:nfk:574:Norfolk Island
  465. ng:nga:566:Nigeria
  466. ni:nic:558:Nicaragua
  467. nl:nld:528:Netherlands
  468. no:nor:578:Norway
  469. np:npl:524:Nepal
  470. nr:nru:520:Nauru
  471. nu:niu:570:Niue
  472. nz:nzl:554:New Zealand
  473. om:omn:512:Oman
  474. pa:pan:591:Panama
  475. pe:per:604:Peru
  476. pf:pyf:258:French Polynesia
  477. pg:png:598:Papua New Guinea
  478. ph:phl:608:Philippines
  479. pk:pak:586:Pakistan
  480. pl:pol:616:Poland
  481. pm:spm:666:Saint Pierre and Miquelon
  482. pn:pcn:612:Pitcairn:Pitcairn Island
  483. pr:pri:630:Puerto Rico
  484. ps:pse:275:Palestinian Territory, Occupied
  485. pt:prt:620:Portugal
  486. pw:plw:585:Palau
  487. py:pry:600:Paraguay
  488. qa:qat:634:Qatar
  489. re:reu:638:Reunion
  490. ro:rom:642:Romania
  491. ru:rus:643:Russian Federation:Russia
  492. rw:rwa:646:Rwanda
  493. sa:sau:682:Saudi Arabia
  494. sb:slb:090:Solomon Islands
  495. sc:syc:690:Seychelles
  496. sd:sdn:736:Sudan
  497. se:swe:752:Sweden
  498. sg:sgp:702:Singapore
  499. sh:shn:654:Saint Helena
  500. si:svn:705:Slovenia
  501. sj:sjm:744:Svalbard and Jan Mayen:Jan Mayen:Svalbard
  502. sk:svk:703:Slovakia
  503. sl:sle:694:Sierra Leone
  504. sm:smr:674:San Marino
  505. sn:sen:686:Senegal
  506. so:som:706:Somalia
  507. sr:sur:740:Suriname
  508. st:stp:678:Sao Tome and Principe
  509. sv:slv:222:El Salvador
  510. sy:syr:760:Syrian Arab Republic:Syria
  511. sz:swz:748:Swaziland
  512. tc:tca:796:Turks and Caicos Islands
  513. td:tcd:148:Chad
  514. tf:atf:260:French Southern Territories
  515. tg:tgo:768:Togo
  516. th:tha:764:Thailand
  517. tj:tjk:762:Tajikistan
  518. tk:tkl:772:Tokelau
  519. tm:tkm:795:Turkmenistan
  520. tn:tun:788:Tunisia
  521. to:ton:776:Tonga
  522. tl:tls:626:East Timor
  523. tr:tur:792:Turkey
  524. tt:tto:780:Trinidad and Tobago
  525. tv:tuv:798:Tuvalu
  526. tw:twn:158:Taiwan, Province of China:Taiwan
  527. tz:tza:834:Tanzania, United Republic of:Tanzania
  528. ua:ukr:804:Ukraine
  529. ug:uga:800:Uganda
  530. um:umi:581:United States Minor Outlying Islands
  531. us:usa:840:United States:USA:United States of America
  532. uy:ury:858:Uruguay
  533. uz:uzb:860:Uzbekistan
  534. va:vat:336:Holy See (Vatican City State):Holy See (Vatican City)
  535. vc:vct:670:Saint Vincent and the Grenadines
  536. ve:ven:862:Venezuela
  537. vg:vgb:092:Virgin Islands, British:British Virgin Islands
  538. vi:vir:850:Virgin Islands, U.S.
  539. vn:vnm:704:Vietnam
  540. vu:vut:548:Vanuatu
  541. wf:wlf:876:Wallis and Futuna
  542. ws:wsm:882:Samoa
  543. ye:yem:887:Yemen
  544. yt:myt:175:Mayotte
  545. yu:yug:891:Yugoslavia
  546. za:zaf:710:South Africa
  547. zm:zmb:894:Zambia
  548. zr:zar:180:Zaire:Congo, The Democratic Republic of the:Congo, Democratic Republic of the
  549. zw:zwe:716:Zimbabwe
  550.