This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Typos in *.p[lm]
[perl5.git] / lib / Locale / Country.pm
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