home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 December (Special) / PCWorld_2005-12_Special_cd.bin / Bezpecnost / lsti / lsti.exe / framework-2.5.exe / Country.pm < prev    next >
Text File  |  2005-01-27  |  14KB  |  551 lines

  1. #
  2. # Locale::Country - ISO codes for country identification (ISO 3166)
  3. #
  4. # $Id: Country.pm,v 2.7 2004/06/10 21:19:34 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.7 $ =~ /(\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.     local $_;
  270.  
  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. ax:ala:248:Aland Islands
  326. az:aze:031:Azerbaijan
  327. ba:bih:070:Bosnia and Herzegovina
  328. bb:brb:052:Barbados
  329. bd:bgd:050:Bangladesh
  330. be:bel:056:Belgium
  331. bf:bfa:854:Burkina Faso
  332. bg:bgr:100:Bulgaria
  333. bh:bhr:048:Bahrain
  334. bi:bdi:108:Burundi
  335. bj:ben:204:Benin
  336. bm:bmu:060:Bermuda
  337. bn:brn:096:Brunei Darussalam
  338. bo:bol:068:Bolivia
  339. br:bra:076:Brazil
  340. bs:bhs:044:Bahamas
  341. bt:btn:064:Bhutan
  342. bv:bvt:074:Bouvet Island
  343. bw:bwa:072:Botswana
  344. by:blr:112:Belarus
  345. bz:blz:084:Belize
  346. ca:can:124:Canada
  347. cc:cck:166:Cocos (Keeling) Islands
  348. cd:cod:180:Congo, The Democratic Republic of the:Zaire:Congo, Democratic Republic of the
  349. cf:caf:140:Central African Republic
  350. cg:cog:178:Congo:Congo, Republic of the
  351. ch:che:756:Switzerland
  352. ci:civ:384:Cote D'Ivoire
  353. ck:cok:184:Cook Islands
  354. cl:chl:152:Chile
  355. cm:cmr:120:Cameroon
  356. cn:chn:156:China
  357. co:col:170:Colombia
  358. cr:cri:188:Costa Rica
  359. cs:scg:891:Serbia and Montenegro:Yugoslavia
  360. cu:cub:192:Cuba
  361. cv:cpv:132:Cape Verde
  362. cx:cxr:162:Christmas Island
  363. cy:cyp:196:Cyprus
  364. cz:cze:203:Czech Republic
  365. de:deu:276:Germany
  366. dj:dji:262:Djibouti
  367. dk:dnk:208:Denmark
  368. dm:dma:212:Dominica
  369. do:dom:214:Dominican Republic
  370. dz:dza:012:Algeria
  371. ec:ecu:218:Ecuador
  372. ee:est:233:Estonia
  373. eg:egy:818:Egypt
  374. eh:esh:732:Western Sahara
  375. er:eri:232:Eritrea
  376. es:esp:724:Spain
  377. et:eth:231:Ethiopia
  378. fi:fin:246:Finland
  379. fj:fji:242:Fiji
  380. fk:flk:238:Falkland Islands (Malvinas):Falkland Islands (Islas Malvinas)
  381. fm:fsm:583:Micronesia, Federated States of
  382. fo:fro:234:Faroe Islands
  383. fr:fra:250:France
  384. fx:fxx:249:France, Metropolitan
  385. ga:gab:266:Gabon
  386. gb:gbr:826:United Kingdom:Great Britain
  387. gd:grd:308:Grenada
  388. ge:geo:268:Georgia
  389. gf:guf:254:French Guiana
  390. gh:gha:288:Ghana
  391. gi:gib:292:Gibraltar
  392. gl:grl:304:Greenland
  393. gm:gmb:270:Gambia
  394. gn:gin:324:Guinea
  395. gp:glp:312:Guadeloupe
  396. gq:gnq:226:Equatorial Guinea
  397. gr:grc:300:Greece
  398. gs:sgs:239:South Georgia and the South Sandwich Islands
  399. gt:gtm:320:Guatemala
  400. gu:gum:316:Guam
  401. gw:gnb:624:Guinea-Bissau
  402. gy:guy:328:Guyana
  403. hk:hkg:344:Hong Kong
  404. hm:hmd:334:Heard Island and McDonald Islands
  405. hn:hnd:340:Honduras
  406. hr:hrv:191:Croatia
  407. ht:hti:332:Haiti
  408. hu:hun:348:Hungary
  409. id:idn:360:Indonesia
  410. ie:irl:372:Ireland
  411. il:isr:376:Israel
  412. in:ind:356:India
  413. io:iot:086:British Indian Ocean Territory
  414. iq:irq:368:Iraq
  415. ir:irn:364:Iran, Islamic Republic of:Iran
  416. is:isl:352:Iceland
  417. it:ita:380:Italy
  418. jm:jam:388:Jamaica
  419. jo:jor:400:Jordan
  420. jp:jpn:392:Japan
  421. ke:ken:404:Kenya
  422. kg:kgz:417:Kyrgyzstan
  423. kh:khm:116:Cambodia
  424. ki:kir:296:Kiribati
  425. km:com:174:Comoros
  426. kn:kna:659:Saint Kitts and Nevis
  427. kp:prk:408:Korea, Democratic People's Republic of:Korea, North:North Korea
  428. kr:kor:410:Korea, Republic of:Korea, South:South Korea
  429. kw:kwt:414:Kuwait
  430. ky:cym:136:Cayman Islands
  431. kz:kaz:398:Kazakhstan:Kazakstan
  432. la:lao:418:Lao People's Democratic Republic
  433. lb:lbn:422:Lebanon
  434. lc:lca:662:Saint Lucia
  435. li:lie:438:Liechtenstein
  436. lk:lka:144:Sri Lanka
  437. lr:lbr:430:Liberia
  438. ls:lso:426:Lesotho
  439. lt:ltu:440:Lithuania
  440. lu:lux:442:Luxembourg
  441. lv:lva:428:Latvia
  442. ly:lby:434:Libyan Arab Jamahiriya:Libya
  443. ma:mar:504:Morocco
  444. mc:mco:492:Monaco
  445. md:mda:498:Moldova, Republic of:Moldova
  446. mg:mdg:450:Madagascar
  447. mh:mhl:584:Marshall Islands
  448. mk:mkd:807:Macedonia, the Former Yugoslav Republic of:Macedonia, Former Yugoslav Republic of:Macedonia
  449. ml:mli:466:Mali
  450. mm:mmr:104:Myanmar:Burma
  451. mn:mng:496:Mongolia
  452. mo:mac:446:Macao:Macau
  453. mp:mnp:580:Northern Mariana Islands
  454. mq:mtq:474:Martinique
  455. mr:mrt:478:Mauritania
  456. ms:msr:500:Montserrat
  457. mt:mlt:470:Malta
  458. mu:mus:480:Mauritius
  459. mv:mdv:462:Maldives
  460. mw:mwi:454:Malawi
  461. mx:mex:484:Mexico
  462. my:mys:458:Malaysia
  463. mz:moz:508:Mozambique
  464. na:nam:516:Namibia
  465. nc:ncl:540:New Caledonia
  466. ne:ner:562:Niger
  467. nf:nfk:574:Norfolk Island
  468. ng:nga:566:Nigeria
  469. ni:nic:558:Nicaragua
  470. nl:nld:528:Netherlands
  471. no:nor:578:Norway
  472. np:npl:524:Nepal
  473. nr:nru:520:Nauru
  474. nu:niu:570:Niue
  475. nz:nzl:554:New Zealand
  476. om:omn:512:Oman
  477. pa:pan:591:Panama
  478. pe:per:604:Peru
  479. pf:pyf:258:French Polynesia
  480. pg:png:598:Papua New Guinea
  481. ph:phl:608:Philippines
  482. pk:pak:586:Pakistan
  483. pl:pol:616:Poland
  484. pm:spm:666:Saint Pierre and Miquelon
  485. pn:pcn:612:Pitcairn:Pitcairn Island
  486. pr:pri:630:Puerto Rico
  487. ps:pse:275:Palestinian Territory, Occupied
  488. pt:prt:620:Portugal
  489. pw:plw:585:Palau
  490. py:pry:600:Paraguay
  491. qa:qat:634:Qatar
  492. re:reu:638:Reunion
  493. ro:rou:642:Romania
  494. ru:rus:643:Russian Federation:Russia
  495. rw:rwa:646:Rwanda
  496. sa:sau:682:Saudi Arabia
  497. sb:slb:090:Solomon Islands
  498. sc:syc:690:Seychelles
  499. sd:sdn:736:Sudan
  500. se:swe:752:Sweden
  501. sg:sgp:702:Singapore
  502. sh:shn:654:Saint Helena
  503. si:svn:705:Slovenia
  504. sj:sjm:744:Svalbard and Jan Mayen:Jan Mayen:Svalbard
  505. sk:svk:703:Slovakia
  506. sl:sle:694:Sierra Leone
  507. sm:smr:674:San Marino
  508. sn:sen:686:Senegal
  509. so:som:706:Somalia
  510. sr:sur:740:Suriname
  511. st:stp:678:Sao Tome and Principe
  512. sv:slv:222:El Salvador
  513. sy:syr:760:Syrian Arab Republic:Syria
  514. sz:swz:748:Swaziland
  515. tc:tca:796:Turks and Caicos Islands
  516. td:tcd:148:Chad
  517. tf:atf:260:French Southern Territories:French Southern and Antarctic Lands
  518. tg:tgo:768:Togo
  519. th:tha:764:Thailand
  520. tj:tjk:762:Tajikistan
  521. tk:tkl:772:Tokelau
  522. tm:tkm:795:Turkmenistan
  523. tn:tun:788:Tunisia
  524. to:ton:776:Tonga
  525. tl:tls:626:Timor-Leste:East Timor
  526. tr:tur:792:Turkey
  527. tt:tto:780:Trinidad and Tobago
  528. tv:tuv:798:Tuvalu
  529. tw:twn:158:Taiwan, Province of China:Taiwan
  530. tz:tza:834:Tanzania, United Republic of:Tanzania
  531. ua:ukr:804:Ukraine
  532. ug:uga:800:Uganda
  533. um:umi:581:United States Minor Outlying Islands
  534. us:usa:840:United States:USA:United States of America
  535. uy:ury:858:Uruguay
  536. uz:uzb:860:Uzbekistan
  537. va:vat:336:Holy See (Vatican City State):Holy See (Vatican City)
  538. vc:vct:670:Saint Vincent and the Grenadines
  539. ve:ven:862:Venezuela
  540. vg:vgb:092:Virgin Islands, British:British Virgin Islands
  541. vi:vir:850:Virgin Islands, U.S.
  542. vn:vnm:704:Vietnam
  543. vu:vut:548:Vanuatu
  544. wf:wlf:876:Wallis and Futuna
  545. ws:wsm:882:Samoa
  546. ye:yem:887:Yemen
  547. yt:myt:175:Mayotte
  548. za:zaf:710:South Africa
  549. zm:zmb:894:Zambia
  550. zw:zwe:716:Zimbabwe
  551.