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