2 # Locale::Country - ISO codes for country identification (ISO 3166)
4 # $Id: Country.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
7 package Locale::Country;
13 use Locale::Constants;
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+)/);
22 @EXPORT = qw(code2country country2code
23 all_country_codes all_country_names
25 LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC);
27 #-----------------------------------------------------------------------
28 # Private Global Variables
29 #-----------------------------------------------------------------------
34 #=======================================================================
36 # code2country ( CODE [, CODESET ] )
38 #=======================================================================
42 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
45 return undef unless defined $code;
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)
55 return undef if ($code =~ /\D/);
56 $code = sprintf("%.3d", $code);
63 if (exists $CODES->[$codeset]->{$code})
65 return $CODES->[$codeset]->{$code};
69 #---------------------------------------------------------------
70 # no such country code!
71 #---------------------------------------------------------------
77 #=======================================================================
79 # country2code ( NAME [, CODESET ] )
81 #=======================================================================
85 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
88 return undef unless defined $country;
89 $country = lc($country);
90 if (exists $COUNTRIES->[$codeset]->{$country})
92 return $COUNTRIES->[$codeset]->{$country};
96 #---------------------------------------------------------------
98 #---------------------------------------------------------------
104 #=======================================================================
106 # country_code2code ( NAME [, CODESET ] )
108 #=======================================================================
109 sub country_code2code
111 (@_ == 3) or croak "country_code2code() takes 3 arguments!";
120 return undef if $inset == $outset;
121 $country = code2country($code, $inset);
122 return undef if not defined $country;
123 $outcode = country2code($country, $outset);
128 #=======================================================================
130 # all_country_codes ( [ CODESET ] )
132 #=======================================================================
133 sub all_country_codes
135 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
137 return keys %{ $CODES->[$codeset] };
141 #=======================================================================
143 # all_country_names ( [ CODESET ] )
145 #=======================================================================
146 sub all_country_names
148 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
150 return values %{ $CODES->[$codeset] };
154 #=======================================================================
156 # alias_code ( ALIAS => CODE [ , CODESET ] )
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).
161 # Locale::Country::alias_code('uk' => 'gb');
163 #=======================================================================
168 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
173 if (not exists $CODES->[$codeset]->{$real})
175 carp "attempt to alias \"$alias\" to unknown country code \"$real\"\n";
178 $country = $CODES->[$codeset]->{$real};
179 $CODES->[$codeset]->{$alias} = $country;
180 $COUNTRIES->[$codeset]->{"\L$country"} = $alias;
185 # old name of function for backwards compatibility
186 *_alias_code = *alias_code;
189 #=======================================================================
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
199 #=======================================================================
203 my $new_name = shift;
204 my $codeset = @_ > 0 ? shift : _code2codeset($code);
209 if (not defined $codeset)
211 carp "rename_country(): unknown country code \"$code\"\n";
215 $country = $CODES->[$codeset]->{$code};
217 foreach my $cset (LOCALE_CODE_ALPHA_2,
221 if ($cset == $codeset)
227 $c = country_code2code($code, $codeset, $cset);
230 $CODES->[$cset]->{$c} = $new_name;
231 $COUNTRIES->[$cset]->{"\L$new_name"} = $c;
238 #=======================================================================
242 # given a country code in an unknown codeset, return the codeset
243 # it is from, or undef.
245 #=======================================================================
251 foreach my $codeset (LOCALE_CODE_ALPHA_2, LOCALE_CODE_ALPHA_3,
254 return $codeset if (exists $CODES->[$codeset]->{$code})
261 #=======================================================================
263 # initialisation code - stuff the DATA into the ALPHA2 hash
265 #=======================================================================
267 my ($alpha2, $alpha3, $numeric);
268 my ($country, @countries);
276 ($alpha2, $alpha3, $numeric, @countries) = split(/:/, $_);
278 $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $countries[0];
279 foreach $country (@countries)
281 $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$country"} = $alpha2;
286 $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $countries[0];
287 foreach $country (@countries)
289 $COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$country"} = $alpha3;
295 $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $countries[0];
296 foreach $country (@countries)
298 $COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$country"} = $numeric;
311 ae:are:784:United Arab Emirates
312 af:afg:004:Afghanistan
313 ag:atg:028:Antigua and Barbuda
317 an:ant:530:Netherlands Antilles
319 aq:ata:010:Antarctica
321 as:asm:016:American Samoa
325 ax:ala:248:Aland Islands
326 az:aze:031:Azerbaijan
327 ba:bih:070:Bosnia and Herzegovina
329 bd:bgd:050:Bangladesh
331 bf:bfa:854:Burkina Faso
337 bn:brn:096:Brunei Darussalam
342 bv:bvt:074:Bouvet Island
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
358 cr:cri:188:Costa Rica
359 cs:scg:891:Serbia and Montenegro:Yugoslavia
361 cv:cpv:132:Cape Verde
362 cx:cxr:162:Christmas Island
364 cz:cze:203:Czech Republic
369 do:dom:214:Dominican Republic
374 eh:esh:732:Western Sahara
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
384 fx:fxx:249:France, Metropolitan
386 gb:gbr:826:United Kingdom:Great Britain
389 gf:guf:254:French Guiana
395 gp:glp:312:Guadeloupe
396 gq:gnq:226:Equatorial Guinea
398 gs:sgs:239:South Georgia and the South Sandwich Islands
401 gw:gnb:624:Guinea-Bissau
404 hm:hmd:334:Heard Island and McDonald Islands
413 io:iot:086:British Indian Ocean Territory
415 ir:irn:364:Iran, Islamic Republic of:Iran
422 kg:kgz:417:Kyrgyzstan
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
430 ky:cym:136:Cayman Islands
431 kz:kaz:398:Kazakhstan:Kazakstan
432 la:lao:418:Lao People's Democratic Republic
434 lc:lca:662:Saint Lucia
435 li:lie:438:Liechtenstein
440 lu:lux:442:Luxembourg
442 ly:lby:434:Libyan Arab Jamahiriya:Libya
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
450 mm:mmr:104:Myanmar:Burma
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
463 mz:moz:508:Mozambique
465 nc:ncl:540:New Caledonia
467 nf:nfk:574:Norfolk Island
470 nl:nld:528:Netherlands
475 nz:nzl:554:New Zealand
479 pf:pyf:258:French Polynesia
480 pg:png:598:Papua New Guinea
481 ph:phl:608:Philippines
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
494 ru:rus:643:Russian Federation:Russia
496 sa:sau:682:Saudi Arabia
497 sb:slb:090:Solomon Islands
498 sc:syc:690:Seychelles
502 sh:shn:654:Saint Helena
504 sj:sjm:744:Svalbard and Jan Mayen:Jan Mayen:Svalbard
506 sl:sle:694:Sierra Leone
507 sm:smr:674:San Marino
511 st:stp:678:Sao Tome and Principe
512 sv:slv:222:El Salvador
513 sy:syr:760:Syrian Arab Republic:Syria
515 tc:tca:796:Turks and Caicos Islands
517 tf:atf:260:French Southern Territories:French Southern and Antarctic Lands
520 tj:tjk:762:Tajikistan
522 tm:tkm:795:Turkmenistan
525 tl:tls:626:Timor-Leste:East Timor
527 tt:tto:780:Trinidad and Tobago
529 tw:twn:158:Taiwan, Province of China:Taiwan
530 tz:tza:834:Tanzania, United Republic of:Tanzania
533 um:umi:581:United States Minor Outlying Islands
534 us:usa:840:United States:USA:United States of America
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
540 vg:vgb:092:Virgin Islands, British:British Virgin Islands
541 vi:vir:850:Virgin Islands, U.S.
544 wf:wlf:876:Wallis and Futuna
548 za:zaf:710:South Africa