X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FLocale%2FCountry.pm;h=2ecd1305c0d4f5c2987938be8ba1a73f78fab99b;hb=6a9befb105d93024902eb178dab77655333f1829;hp=f60b1352b271b860c370a7f7100faaa6544f4105;hpb=88c28ceba84d380fbac88f13c3dfcca0d1b7f014;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Locale/Country.pm b/lib/Locale/Country.pm index f60b135..2ecd130 100644 --- a/lib/Locale/Country.pm +++ b/lib/Locale/Country.pm @@ -1,78 +1,13 @@ -#----------------------------------------------------------------------- - -=head1 NAME - -Locale::Country - ISO codes for country identification (ISO 3166) - -=head1 SYNOPSIS - - use Locale::Country; - - $country = code2country('jp'); # $country gets 'Japan' - $code = country2code('Norway'); # $code gets 'no' - - @codes = all_country_codes(); - @names = all_country_names(); - - # add "uk" as a pseudo country code for United Kingdom - Locale::Country::_alias_code('uk' => 'gb'); - -=cut - -#----------------------------------------------------------------------- +# +# Locale::Country - ISO codes for country identification (ISO 3166) +# +# $Id: Country.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $ +# package Locale::Country; use strict; require 5.002; -#----------------------------------------------------------------------- - -=head1 DESCRIPTION - -The C module provides access to the ISO -codes for identifying countries, as defined in ISO 3166. -You can either access the codes via the L -(described below), or with the two functions which return lists -of all country codes or all country names. - -There are three different code sets you can use for identifying -countries: - -=over 4 - -=item B - -Two letter codes, such as 'tv' for Tuvalu. -This code set is identified with the symbol C. - -=item B - -Three letter codes, such as 'brb' for Barbados. -This code set is identified with the symbol C. - -=item B - -Numeric codes, such as 064 for Bhutan. -This code set is identified with the symbol C. - -=back - -All of the routines take an optional additional argument -which specifies the code set to use. -If not specified, it defaults to the two-letter codes. -This is partly for backwards compatibility (previous versions -of this module only supported the alpha-2 codes), and -partly because they are the most widely used codes. - -The alpha-2 and alpha-3 codes are not case-dependent, -so you can use 'BO', 'Bo', 'bO' or 'bo' for Bolivia. -When a code is returned by one of the functions in -this module, it will always be lower-case. - -=cut - -#----------------------------------------------------------------------- - require Exporter; use Carp; use Locale::Constants; @@ -82,7 +17,7 @@ use Locale::Constants; # Public Global Variables #----------------------------------------------------------------------- use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); -$VERSION = sprintf("%d.%02d", q$Revision: 1.7 $ =~ /(\d+)\.(\d+)/); +$VERSION = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/); @ISA = qw(Exporter); @EXPORT = qw(code2country country2code all_country_codes all_country_names @@ -97,54 +32,9 @@ my $COUNTRIES = []; #======================================================================= - -=head1 CONVERSION ROUTINES - -There are three conversion routines: C, C, -and C. - -=over 8 - -=item code2country( CODE, [ CODESET ] ) - -This function takes a country code and returns a string -which contains the name of the country identified. -If the code is not a valid country code, as defined by ISO 3166, -then C will be returned: - - $country = code2country('fi'); - -=item country2code( STRING, [ CODESET ] ) - -This function takes a country name and returns the corresponding -country code, if such exists. -If the argument could not be identified as a country name, -then C will be returned: - - $code = country2code('Norway', LOCALE_CODE_ALPHA_3); - # $code will now be 'nor' - -The case of the country name is not important. -See the section L below. - -=item country_code2code( CODE, CODESET, CODESET ) - -This function takes a country code from one code set, -and returns the corresponding code from another code set. - - $alpha2 = country_code2code('fin', - LOCALE_CODE_ALPHA_3 => LOCALE_CODE_ALPHA_2); - # $alpha2 will now be 'fi' - -If the code passed is not a valid country code in -the first code set, or if there isn't a code for the -corresponding country in the second code set, -then C will be returned. - -=back - -=cut - +# +# code2country ( CODE [, CODESET ] ) +# #======================================================================= sub code2country { @@ -183,6 +73,12 @@ sub code2country } } + +#======================================================================= +# +# country2code ( NAME [, CODESET ] ) +# +#======================================================================= sub country2code { my $country = shift; @@ -204,6 +100,12 @@ sub country2code } } + +#======================================================================= +# +# country_code2code ( NAME [, CODESET ] ) +# +#======================================================================= sub country_code2code { (@_ == 3) or croak "country_code2code() takes 3 arguments!"; @@ -211,7 +113,7 @@ sub country_code2code my $code = shift; my $inset = shift; my $outset = shift; - my $outcode = shift; + my $outcode; my $country; @@ -222,37 +124,12 @@ sub country_code2code return $outcode; } -#======================================================================= - -=head1 QUERY ROUTINES - -There are two function which can be used to obtain a list of all codes, -or all country names: - -=over 8 - -=item C - -Returns a list of all two-letter country codes. -The codes are guaranteed to be all lower-case, -and not in any particular order. - -=item C - -Returns a list of all country names for which there is a corresponding -country code in the specified code set. -The names are capitalised, and not returned in any particular order. - -Not all countries have alpha-3 and numeric codes - -some just have an alpha-2 code, -so you'll get a different number of countries -depending on which code set you specify. - -=back - -=cut #======================================================================= +# +# all_country_codes ( [ CODESET ] ) +# +#======================================================================= sub all_country_codes { my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT; @@ -260,6 +137,12 @@ sub all_country_codes return keys %{ $CODES->[$codeset] }; } + +#======================================================================= +# +# all_country_names ( [ CODESET ] ) +# +#======================================================================= sub all_country_names { my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT; @@ -267,35 +150,18 @@ sub all_country_names return values %{ $CODES->[$codeset] }; } -#----------------------------------------------------------------------- - -=head1 CODE ALIASING -This module supports a semi-private routine for specifying two letter -code aliases. - - Locale::Country::_alias_code( ALIAS => CODE [, CODESET ] ) - -This feature was added as a mechanism for handling -a "uk" code. The ISO standard says that the two-letter code for -"United Kingdom" is "gb", whereas domain names are all .uk. - -By default the module does not understand "uk", since it is implementing -an ISO standard. If you would like 'uk' to work as the two-letter -code for United Kingdom, use the following: - - use Locale::Country; - - Locale::Country::_alias_code('uk' => 'gb'); - -With this code, both "uk" and "gb" are valid codes for United Kingdom, -with the reverse lookup returning "uk" rather than the usual "gb". - -=cut - -#----------------------------------------------------------------------- - -sub _alias_code +#======================================================================= +# +# alias_code ( ALIAS => CODE [ , CODESET ] ) +# +# Add an alias for an existing code. If the CODESET isn't specified, +# then we use the default (currently the alpha-2 codeset). +# +# Locale::Country::alias_code('uk' => 'gb'); +# +#======================================================================= +sub alias_code { my $alias = shift; my $real = shift; @@ -316,144 +182,126 @@ sub _alias_code return $alias; } -#----------------------------------------------------------------------- +# old name of function for backwards compatibility +*_alias_code = *alias_code; -=head1 EXAMPLES -The following example illustrates use of the C function. -The user is prompted for a country code, and then told the corresponding -country name: +#======================================================================= +# +# rename_country +# +# change the official name for a country, eg: +# gb => 'Great Britain' +# rather than the standard 'United Kingdom'. The original is retained +# as an alias, but the new name will be returned if you lookup the +# name from code. +# +#======================================================================= +sub rename_country +{ + my $code = shift; + my $new_name = shift; + my $codeset = @_ > 0 ? shift : _code2codeset($code); + my $country; + my $c; - $| = 1; # turn off buffering - - print "Enter country code: "; - chop($code = ); - $country = code2country($code, LOCALE_CODE_ALPHA_2); - if (defined $country) - { - print "$code = $country\n"; - } - else + + if (not defined $codeset) { - print "'$code' is not a valid country code!\n"; + carp "rename_country(): unknown country code \"$code\"\n"; + return 0; } -=head1 DOMAIN NAMES - -Most top-level domain names are based on these codes, -but there are certain codes which aren't. -If you are using this module to identify country from hostname, -your best bet is to preprocess the country code. - -For example, B, B, B and friends would map to B; -B would map to B. Any others? - -=head1 KNOWN BUGS AND LIMITATIONS - -=over 4 - -=item * - -When using C, the country name must currently appear -exactly as it does in the source of the module. For example, - - country2code('United States') - -will return B, as expected. But the following will all return C: - - country2code('United States of America') - country2code('Great Britain') - country2code('U.S.A.') - -If there's need for it, a future version could have variants -for country names. - -=item * - -In the current implementation, all data is read in when the -module is loaded, and then held in memory. -A lazy implementation would be more memory friendly. - -=back + $country = $CODES->[$codeset]->{$code}; -=head1 SEE ALSO - -=over 4 - -=item Locale::Language - -ISO two letter codes for identification of language (ISO 639). - -=item Locale::Currency - -ISO three letter codes for identification of currencies -and funds (ISO 4217). - -=item ISO 3166 - -The ISO standard which defines these codes. - -=item http://www.din.de/gremien/nas/nabd/iso3166ma/ - -Official home page for ISO 3166 - -=item http://www.egt.ie/standards/iso3166/iso3166-1-en.html - -Another useful, but not official, home page. - -=item http://www.cia.gov/cia/publications/factbook/docs/app-f.html - -An appendix in the CIA world fact book which lists country codes -as defined by ISO 3166, FIPS 10-4, and internet domain names. - -=back + foreach my $cset (LOCALE_CODE_ALPHA_2, + LOCALE_CODE_ALPHA_3, + LOCALE_CODE_NUMERIC) + { + if ($cset == $codeset) + { + $c = $code; + } + else + { + $c = country_code2code($code, $codeset, $cset); + } + $CODES->[$cset]->{$c} = $new_name; + $COUNTRIES->[$cset]->{"\L$new_name"} = $c; + } -=head1 AUTHOR + return 1; +} -Neil Bowers Eneilb@cre.canon.co.ukE -=head1 COPYRIGHT +#======================================================================= +# +# _code2codeset +# +# given a country code in an unknown codeset, return the codeset +# it is from, or undef. +# +#======================================================================= +sub _code2codeset +{ + my $code = shift; -Copyright (c) 1997-2001 Canon Research Centre Europe (CRE). -This module is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. + foreach my $codeset (LOCALE_CODE_ALPHA_2, LOCALE_CODE_ALPHA_3, + LOCALE_CODE_NUMERIC) + { + return $codeset if (exists $CODES->[$codeset]->{$code}) + } -=cut + return undef; +} -#----------------------------------------------------------------------- #======================================================================= +# # initialisation code - stuff the DATA into the ALPHA2 hash +# #======================================================================= { - my ($alpha2, $alpha3, $numeric); - my $country; + my ($alpha2, $alpha3, $numeric); + my ($country, @countries); + local $_; while () { next unless /\S/; chop; - ($alpha2, $alpha3, $numeric, $country) = split(/:/, $_, 4); + ($alpha2, $alpha3, $numeric, @countries) = split(/:/, $_); - $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $country; - $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$country"} = $alpha2; + $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $countries[0]; + foreach $country (@countries) + { + $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$country"} = $alpha2; + } if ($alpha3) { - $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $country; - $COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$country"} = $alpha3; + $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $countries[0]; + foreach $country (@countries) + { + $COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$country"} = $alpha3; + } } if ($numeric) { - $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $country; - $COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$country"} = $numeric; + $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $countries[0]; + foreach $country (@countries) + { + $COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$country"} = $numeric; + } } } + + close(DATA); } 1; @@ -468,12 +316,13 @@ al:alb:008:Albania am:arm:051:Armenia an:ant:530:Netherlands Antilles ao:ago:024:Angola -aq:::Antarctica +aq:ata:010:Antarctica ar:arg:032:Argentina as:asm:016:American Samoa at:aut:040:Austria au:aus:036:Australia aw:abw:533:Aruba +ax:ala:248:Aland Islands az:aze:031:Azerbaijan ba:bih:070:Bosnia and Herzegovina bb:brb:052:Barbados @@ -490,15 +339,15 @@ bo:bol:068:Bolivia br:bra:076:Brazil bs:bhs:044:Bahamas bt:btn:064:Bhutan -bv:::Bouvet Island +bv:bvt:074:Bouvet Island bw:bwa:072:Botswana by:blr:112:Belarus bz:blz:084:Belize ca:can:124:Canada -cc:::Cocos (Keeling) Islands -cd:cod:180:Congo, The Democratic Republic of the +cc:cck:166:Cocos (Keeling) Islands +cd:cod:180:Congo, The Democratic Republic of the:Zaire:Congo, Democratic Republic of the cf:caf:140:Central African Republic -cg:cog:178:Congo +cg:cog:178:Congo:Congo, Republic of the ch:che:756:Switzerland ci:civ:384:Cote D'Ivoire ck:cok:184:Cook Islands @@ -507,9 +356,10 @@ cm:cmr:120:Cameroon cn:chn:156:China co:col:170:Colombia cr:cri:188:Costa Rica +cs:scg:891:Serbia and Montenegro:Yugoslavia cu:cub:192:Cuba cv:cpv:132:Cape Verde -cx:::Christmas Island +cx:cxr:162:Christmas Island cy:cyp:196:Cyprus cz:cze:203:Czech Republic de:deu:276:Germany @@ -527,13 +377,13 @@ es:esp:724:Spain et:eth:231:Ethiopia fi:fin:246:Finland fj:fji:242:Fiji -fk:flk:238:Falkland Islands (Malvinas) +fk:flk:238:Falkland Islands (Malvinas):Falkland Islands (Islas Malvinas) fm:fsm:583:Micronesia, Federated States of fo:fro:234:Faroe Islands fr:fra:250:France -fx:::France, Metropolitan +fx:fxx:249:France, Metropolitan ga:gab:266:Gabon -gb:gbr:826:United Kingdom +gb:gbr:826:United Kingdom:Great Britain gd:grd:308:Grenada ge:geo:268:Georgia gf:guf:254:French Guiana @@ -545,13 +395,13 @@ gn:gin:324:Guinea gp:glp:312:Guadeloupe gq:gnq:226:Equatorial Guinea gr:grc:300:Greece -gs:::South Georgia and the South Sandwich Islands +gs:sgs:239:South Georgia and the South Sandwich Islands gt:gtm:320:Guatemala gu:gum:316:Guam gw:gnb:624:Guinea-Bissau gy:guy:328:Guyana hk:hkg:344:Hong Kong -hm:::Heard Island and McDonald Islands +hm:hmd:334:Heard Island and McDonald Islands hn:hnd:340:Honduras hr:hrv:191:Croatia ht:hti:332:Haiti @@ -560,9 +410,9 @@ id:idn:360:Indonesia ie:irl:372:Ireland il:isr:376:Israel in:ind:356:India -io:::British Indian Ocean Territory +io:iot:086:British Indian Ocean Territory iq:irq:368:Iraq -ir:irn:364:Iran, Islamic Republic of +ir:irn:364:Iran, Islamic Republic of:Iran is:isl:352:Iceland it:ita:380:Italy jm:jam:388:Jamaica @@ -574,11 +424,11 @@ kh:khm:116:Cambodia ki:kir:296:Kiribati km:com:174:Comoros kn:kna:659:Saint Kitts and Nevis -kp:prk:408:Korea, Democratic People's Republic of -kr:kor:410:Korea, Republic of +kp:prk:408:Korea, Democratic People's Republic of:Korea, North:North Korea +kr:kor:410:Korea, Republic of:Korea, South:South Korea kw:kwt:414:Kuwait ky:cym:136:Cayman Islands -kz:kaz:398:Kazakstan +kz:kaz:398:Kazakhstan:Kazakstan la:lao:418:Lao People's Democratic Republic lb:lbn:422:Lebanon lc:lca:662:Saint Lucia @@ -589,17 +439,17 @@ ls:lso:426:Lesotho lt:ltu:440:Lithuania lu:lux:442:Luxembourg lv:lva:428:Latvia -ly:lby:434:Libyan Arab Jamahiriya +ly:lby:434:Libyan Arab Jamahiriya:Libya ma:mar:504:Morocco mc:mco:492:Monaco -md:mda:498:Moldova, Republic of +md:mda:498:Moldova, Republic of:Moldova mg:mdg:450:Madagascar mh:mhl:584:Marshall Islands -mk:mkd:807:Macedonia, the Former Yugoslav Republic of +mk:mkd:807:Macedonia, the Former Yugoslav Republic of:Macedonia, Former Yugoslav Republic of:Macedonia ml:mli:466:Mali -mm:mmr:104:Myanmar +mm:mmr:104:Myanmar:Burma mn:mng:496:Mongolia -mo:mac:446:Macau +mo:mac:446:Macao:Macau mp:mnp:580:Northern Mariana Islands mq:mtq:474:Martinique mr:mrt:478:Mauritania @@ -632,7 +482,7 @@ ph:phl:608:Philippines pk:pak:586:Pakistan pl:pol:616:Poland pm:spm:666:Saint Pierre and Miquelon -pn:pcn:612:Pitcairn +pn:pcn:612:Pitcairn:Pitcairn Island pr:pri:630:Puerto Rico ps:pse:275:Palestinian Territory, Occupied pt:prt:620:Portugal @@ -640,8 +490,8 @@ pw:plw:585:Palau py:pry:600:Paraguay qa:qat:634:Qatar re:reu:638:Reunion -ro:rom:642:Romania -ru:rus:643:Russian Federation +ro:rou:642:Romania +ru:rus:643:Russian Federation:Russia rw:rwa:646:Rwanda sa:sau:682:Saudi Arabia sb:slb:090:Solomon Islands @@ -651,7 +501,7 @@ se:swe:752:Sweden sg:sgp:702:Singapore sh:shn:654:Saint Helena si:svn:705:Slovenia -sj:sjm:744:Svalbard and Jan Mayen +sj:sjm:744:Svalbard and Jan Mayen:Jan Mayen:Svalbard sk:svk:703:Slovakia sl:sle:694:Sierra Leone sm:smr:674:San Marino @@ -660,11 +510,11 @@ so:som:706:Somalia sr:sur:740:Suriname st:stp:678:Sao Tome and Principe sv:slv:222:El Salvador -sy:syr:760:Syrian Arab Republic +sy:syr:760:Syrian Arab Republic:Syria sz:swz:748:Swaziland tc:tca:796:Turks and Caicos Islands td:tcd:148:Chad -tf:::French Southern Territories +tf:atf:260:French Southern Territories:French Southern and Antarctic Lands tg:tgo:768:Togo th:tha:764:Thailand tj:tjk:762:Tajikistan @@ -672,31 +522,29 @@ tk:tkl:772:Tokelau tm:tkm:795:Turkmenistan tn:tun:788:Tunisia to:ton:776:Tonga -tp:tmp:626:East Timor +tl:tls:626:Timor-Leste:East Timor tr:tur:792:Turkey tt:tto:780:Trinidad and Tobago tv:tuv:798:Tuvalu -tw:twn:158:Taiwan, Province of China -tz:tza:834:Tanzania, United Republic of +tw:twn:158:Taiwan, Province of China:Taiwan +tz:tza:834:Tanzania, United Republic of:Tanzania ua:ukr:804:Ukraine ug:uga:800:Uganda -um:::United States Minor Outlying Islands -us:usa:840:United States +um:umi:581:United States Minor Outlying Islands +us:usa:840:United States:USA:United States of America uy:ury:858:Uruguay uz:uzb:860:Uzbekistan -va:vat:336:Holy See (Vatican City State) +va:vat:336:Holy See (Vatican City State):Holy See (Vatican City) vc:vct:670:Saint Vincent and the Grenadines ve:ven:862:Venezuela -vg:vgb:092:Virgin Islands, British +vg:vgb:092:Virgin Islands, British:British Virgin Islands vi:vir:850:Virgin Islands, U.S. vn:vnm:704:Vietnam vu:vut:548:Vanuatu wf:wlf:876:Wallis and Futuna ws:wsm:882:Samoa ye:yem:887:Yemen -yt:::Mayotte -yu:yug:891:Yugoslavia +yt:myt:175:Mayotte za:zaf:710:South Africa zm:zmb:894:Zambia -zr:::Zaire zw:zwe:716:Zimbabwe