| 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 |