=pod

=head1 NAME

Locale::Codes::Changes - details changes to Locale::Codes

=head1 SYNOPSIS

This describes the changes made to modules in the Locale-Codes
distribution.  Major changes are marked with asterisks (*).  For the
most part, all modules have remained backward compatible at every
release, but occasionally a change is made which is backward
incompatible. These are marked with an exclamation mark (!).

As of 3.00, the codes are autogenerated from the standards. With each
release, codes will be re-generated and tested to see if any code
changed. Any time there are any changes to the codes, it will be
flagged below with a change: NEW CODE(s).

I intend to check for new codes four times a year (March, June,
September, December). I will also check on request, so if a code
changes that you use, feel free to contact me.  Any time there are new
codes, I will add them to the module and release a new version.

=head1 VERSION 3.22  (yyyy-mm-dd; sbeck)

=head1 VERSION 3.21  (2012-03-01; sbeck)

NEW CODE(s)

=head1 VERSION 3.20  (2011-12-01; sbeck)

NEW CODE(s)

=over 4

=item B<Added limited support for deprecated codes>

The code2XXX, XXX2code, all_XXX_codes, and all_XXX_names functions
now support retired codes.  RT 71124

=item B<Fixed capitalization>

The 'South Sudan' country was all caps.  RT 71024

=item B<Pod tests off by default>

The pod tests will not run at install time.  RT 71122

=item B<Codesets may be specified by name>

All codesets may be specified by a constant or by their name now.  Previously,
they were specified only by a constant.

=item B<alias_code deprecated>

The alias_code function exists for backward compatibility.  It has been replaced
by rename_country_code .  The alias_code function will be removed sometime
after September, 2013 .

=item B<Code cleanup>

All work is now done in the central module (Locale::Codes).  Previously, some
was still done in the wrapper modules (Locale::Codes::*) but that is gone now.

=item B<Added LangFam module>

Added Language Family codes (langfam) as defined in ISO 639-5.

=back

=head1 VERSION 3.18  (2011-08-31; sbeck)

NEW CODE(s)

=over 4

=item B<No longer use CIA data>

The CIA world added non-standard values, so I no longer use it as
a source of data.  Based on a report by Michiel Beijen.

=back

=head1 VERSION 3.17  (2011-06-28; sbeck)

NEW CODE(s)

=over 4

=item B<Added new types of codes>

Added Language Extension codes (langext) and Language Variation codes
(langvar) as defined in the IANA language registry.

=item B<Added new codeset(s)>

Added language codes from ISO 639-5

Added language/script codes from the IANA language subtag
registry

=item B<Bug fixes>

Fixed an uninitialized value warning.  RT 67438

Fixed the return value for the all_XXX_codes and all_XXX_names functions.  RT 69100

=item B<Reorganized code>

Reorganized modules to move Locale::MODULE to Locale::Codes::MODULE to
allow for cleaner future additions.  The original four modules (Locale::Language,
Locale::Currency, Locale::Country, Locale::Script) will continue to work, but
all new sets of codes will be added in the Locale::Codes namespace.

=back

=head1 VERSION 3.16  (2011-03-01; sbeck)

NEW CODE(s)

=head1 VERSION 3.15  (2010-12-02; sbeck)

NEW CODE(s)

=over 4

=item B<Minor fixes>

Added version number to Makefile.PL/Build.PL requirement
for POD testing modules.  RT 62247

Changed 'use vars' to 'our'

=back

=head1 VERSION 3.14  (2010-09-28; sbeck)

NEW CODE(s)

=over 4

=item B<Bug fixes>

Stripped out some HTML that got included with some codes.

=back

=head1 VERSION 3.13  (2010-06-04; sbeck)

NEW CODE(s)

=head1 VERSION 3.12  (2010-04-06; sbeck)

NEW CODE(s)

=over 4

=item B<Reorganized code>

Renamed test.pl to testfunc.pl to avoid causing an error
when built as part of perl.

=back

=head1 VERSION 3.11  (2010-03-01; sbeck)

NEW CODE(s)

=over 4

=item B<Added new codeset(s)>

Added the IANA domain names to Country

=item B<Bug fixes>

Fixed a problem that produced warnings with perl 5.11.5.
Jerry D. Hedden

=back

=head1 VERSION 3.10  (2010-02-18; sbeck)

NEW CODE(s)

=over 4

=item B<Reorganized code>

Moved support files into the Locale::Codes namespace.

The work done in each of the Locale::XXX modules was virtually
identical to each other. It has all been moved to a central module and
the Locale::XXX modules are now just wrappers.

=item B<(!) Changed XXX_code2code behavior slightly>

In previous versions, passing in the same code set for both code set
arguments would automatically return undef. For example:

   country_code2code('bo',LOCALE_CODE_ALPHA_2,LOCALE_CODE_ALPHA_2);
      => undef

This doesn't seem like reasonable behavior, so it has been changed
to allow the same code set:

   country_code2code('bo',LOCALE_CODE_ALPHA_2,LOCALE_CODE_ALPHA_2);
      => 'bo'

Note that if an invalid code is passed in, undef will still be
returned:

   country_code2code('bol',LOCALE_CODE_ALPHA_2,LOCALE_CODE_ALPHA_2);
      => undef

=item B<Added many semi-private routines>

Previous versions had only two semi-private routines: rename_country
and alias_code which had the ability to modify the internal data in
a couple very limited ways. It was requested (in an anonymous posting
by someone named Steve and also by Steve Hay) that better support
for modifying internal data, so a full set of routines were added.

The full set of routines includes:

   rename_country
   rename_language
   rename_currency
   rename_script

   add_country
   add_language
   add_currency
   add_script

   delete_country
   delete_language
   delete_currency
   delete_script

   add_country_alias
   add_language_alias
   add_currency_alias
   add_script_alias

   delete_country_alias
   delete_language_alias
   delete_currency_alias
   delete_script_alias

   rename_country_code
   rename_language_code
   rename_currency_code
   rename_script_code

   add_country_code_alias
   add_language_code_alias
   add_currency_code_alias
   add_script_code_alias

   delete_country_code_alias
   delete_language_code_alias
   delete_currency_code_alias
   delete_script_code_alias

=item B<New aliases>

Added "UK" alias. Steve Hay

=back

=head1 VERSION 3.01  (2010-02-15; sbeck)

=over 4

=item B<Fixed Makefile.PL and Build.PL>

They now install as core modules as they are supposed to.  Reported in
RT 54526

=back

=head1 VERSION 3.00  (2010-02-10; sbeck)

NEW CODE(s)

=over 4

=item B<New maintainer>

From 1997 to 2004, Locale::Codes was maintained by Neil
Bowers. Unfortunately, no updates were made from June 2004 to January
2010. During that time, a number of changes have been made to the
standards since then, so the data included was out-of-date.

I contacted Neil to get his permission to assume maintenance of
the module, and he kindly agreed.

=item B<(*) (!) All codes are generated from standards>

All of the values returned by the various functions are now values
directly from the standards. This means that the values returned in
the 2.xx series are not necessarily the same as the values returned
here.

As an example, the ISO 3166 standard which lists country codes refers
to the country associated with the code "bo" as "Bolivia,
Plurinational State of", so that is what is returned. In the 2.xx
series, "Bolivia" was returned.  Also, the country names vary from one
standard to another. So the code "bol" which is maintained by the
United Nations returns the name of the country as "Bolivia
(Plurinational State of)". Some common aliases have been added, so you
can still request a code associated with a county name "Bolivia".

Since the data comes from the standards, some "incorrect" values are
no longer supported. For example, 2.07 treated "Zaire" as an alias for
"Congo", but the country changed it's name, and "Zaire" is not in the
standard, so it has been dropped in 3.00.

=item B<Added new codeset(s)>

FIPS 10 country codes (requested in RT 1755)

Alpha-3 and Term language codes (requested in RT 11730)

Numeric currency codes (requested in RT 18797)

=item B<(*) (!) Locale::Script changed>

In 2.xx, Locale::Script assigned scripts to country codes, which is NOT
how it is done currently in the standards. It appears that an older version
of ISO 15924 did this, but I haven't found an old version to confirm
that, and in any case, that is not the case in the current standards.

As a result, the Locale::Script module is completely incompatible with
the 2.xx version with respect to the types of codes it supports. None of
the old codes will work.

=item B<Added missing functions>

I've added in some functions which were "missing" previously (since there was
only one set of codes supported, the code2code functions didn't apply):

   language_code2code
   currency_code2code

so the interfaces for each type of codes are consistent.

=item B<(!) Dropped support for _alias_code>

In Locale::Country, _alias_code was an allowed, but deprecated function
which was documented to be supported in the 2.xx series. I've removed it.

=item B<(!) All functions return the standard value>

code2country (and other equivalent functions) now returns the name of
the country specified in the standard (if the different standards
refer to the country by different variations in the name, the results
will differ based on the CODESET)

=item B<(!) rename_country function altered>

The rename_country function from 2.07 would guess the CODESET (unlike
all other functions which used a default of LOCALE_CODE_ALPHA_2). The
guess can cause problems since (with the addition of FIPS) codes may
appear in different codesets for different countries. The behavior has
been changed to be the same as other functions (default to
LOCALE_CODE_ALPHA_2).

=back

=head1 VERSION 2.07  (2004-06-10; neilb)

Made $_ local in the initialization code for each module
change back-propagated from Perl distribution

Removed two non ISO-8859-1 characters from language names
change back-propagated from Perl distribution

Added the following aliases, with a test case for each
   - Burma added to Myanmar
   - French Southern and Antarctic Lands to
     French Southern Territories
patch from TJ Mather

"Canadian Dollar" was misspelled as "Candian Dollar"
   - noted by Nick Cabatoff, patch from Michael Hennecke

Changes to Locale::Country reflecting changes in ISO 3166
   - added Aland Islands (ax, ala, 248)
   - YUGOSLAVIA is now SERBIA AND MONTENEGRO
      YU => CS
      YUG => SCG
      891 => 891 (unchanged)
      (YUGOSLAVIA retained as an alias)
   - EAST TIMOR changed to TIMOR-LESTE
      (old name retained as an alias)
   - three letter code for Romania changed from ROM to ROU

ZAIRE is now CONGO, THE DEMOCRATIC REPUBLIC OF THE
    ZR  => CD
    ZAR => COD
    180 => 180 (unchanged)
    (ZAIRE retained as alias)

=head1 VERSION 2.06  (2002-07-15; neilb)

The four modules which have data after __DATA__ weren't closing the
DATA filehandle after reading from it, which they should. Bug and
patch from Steve Hay.

=head1 VERSION 2.05  (2002-07-08; neilb)

Added three letter codes for the countries that were missing
them. Patch from TJ Mather.

Documentation bug: one of the examples used => where the
lvalue was a constant, which isn't allowed, unless you
put the () with the constant to force the right interpretation.
Pointed out by TJ Mather and MYT.

Updated the URL for the appendix in the CIA world factbook.
Patch from TJ Mather.

=head1 VERSION 2.04  (2002-05-23; neilb)

Updated according to changes in ISO 3166-1 described
in ISO 3166-1 newsletters V-4 and V-5, dated 2002-05-20:
   - Kazakstan is now "Kazakhstan"
   - Macau is now "Macao"
The old names are retained as aliases.

The alpha-2 and alpha-3 codes for East Timor have changed:
   tp -> tl
   tmp -> tls
the numeric code stays 626. If you want to support the old
codes, you can use the semi-private function alias_code().

=head1 VERSION 2.03  (2002-03-24; neilb)

Fixed a typo in the alias for the Vatican, reported (with patch)
by Philip Newton.

Added "Moldova" as an alias for "Moldova, Republic of"

Updated Makefile.PL to include AUTHOR and ABSTRACT

=head1 VERSION 2.02  (2002-03-09; neilb)

Added semi-private routine rename_country() to Locale::Country,
based on a patch from Iain Chalmers.

Added test rename.t for the above function.

Renamed _alias_code to be alias_code. Have retained the old
name for backwards compatibility. Will remove it when the
major version number next changes.

=head1 VERSION 2.01  (2002-02-18; neilb)

Split the documentation for all modules into separate pod files.

Made sure all =over were =over 4; some were other values.

The code2code() methods had one more shift than was needed.

=head1 VERSION 2.00  (2002-02-17; neilb)

Created Locale::Script which provides an interface to the ISO codes
for identification of scripts (writing scripts, rather than perl style
scripts). The codes are defined by ISO 15924, which is currently in
final draft.  Thanks to Jarkko for pointing out this new standard.
All three code sets are supported, and a test-suite added.

Added support for country name variants to Locale::Country,
so that
   country2code('USA')
   country2code('United States')
   country2code('United States of America')
will all return 'us'.  This had been in the LIMITATIONS section since
the first version.  Patch from TJ Mather with additional variants from
me. Added test-cases for these.

Added VERSION to Locale::Constants. Thanks to Jarkko for
pointing that it was missing.

Should really have bumped major version with previous release,
since there was a change to the API.

=head1 VERSION 1.06  (2001-03-04; neilb)

Added Locale::Constants, which defines three symbols for identifying
which codeset is being used:

   LOCALE_CODE_ALPHA_2
   LOCALE_CODE_ALPHA_3
   LOCALE_CODE_NUMERIC

Updated Locale::Country to support all three code sets defined by ISO
3166. This was requested by Keith Wall.  I haven't added multiple
codeset support to the other modules yet - I'll wait until someone
asks for them.

=head1 VERSION 1.05  (2001-02-13; neilb)

Added Locale::Currency, contribution from Michael Hennecke.

Added test suite for it (t/currency.t) and added test cases
to t/all.t for the all_* functions.

=head1 VERSION 1.04  (2000-12-21; neilb)

Fixed very minor typos from 1.03!

=head1 VERSION 1.03  (2000-12-??; neilb)

Updated Locale::Country:
   - fixed spelling of a few countries
   - added link to a relevant page from CIA world factbook

Updated Locale::Language:
   - fixed typo in the documentation (ISO 939 should be 639)

=head1 VERSION 1.02  (2000-05-04; neilb)

Updated Locale::Country and Locale::Language to reflect changes in the
relevant ISO standards. These mainly reflect languages which are new
to the relevant standard, and changes in the spelling of some country
names.

Added official URLs for the standards to the SEE ALSO sections of the
doc for each module.

Thanks to Jarkko Hietaniemi for pointing me at the pages with latest
versions of ISO 3166 and 639.

=head1 VERSION 1.00  (1998-03-09; neilb)

Added Locale::Country::_alias_code() so that 'uk' can be added as the
code for "United Kingdom", if you want it.  This was prompted by Ed
Jordan.

Added a new test suite for handling this case, and extended the
existing test-suite to include testing of the case where 'uk' hasn't
been defined as a valid code.

=head1 VERSION 0.003  (1997-05-09; neilb)

First public release to CPAN

=head1 SEE ALSO

Locale::Codes

=head1 AUTHOR

See Locale::Codes for full author history.

Currently maintained by Sullivan Beck (sbeck@cpan.org).

=head1 COPYRIGHT

   Copyright (c) 2001-2010 Neil Bowers
   Copyright (c) 2010-2012 Sullivan Beck

This module is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

=cut
