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