This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Send bug reports to GitHub
[perl5.git] / ext / I18N-Langinfo / Langinfo.pm
index a3bf3b5..fd34a8a 100644 (file)
@@ -5,11 +5,9 @@ use strict;
 use warnings;
 use Carp;
 
-require Exporter;
+use Exporter 'import';
 require XSLoader;
 
-our @ISA = qw(Exporter);
-
 our @EXPORT = qw(langinfo);
 
 our @EXPORT_OK = qw(
@@ -72,7 +70,7 @@ our @EXPORT_OK = qw(
        YESSTR
 );
 
-our $VERSION = '0.08';
+our $VERSION = '0.21';
 
 XSLoader::load();
 
@@ -90,7 +88,9 @@ I18N::Langinfo - query locale information
 =head1 DESCRIPTION
 
 The langinfo() function queries various locale information that can be
-used to localize output and user interfaces.  The langinfo() requires
+used to localize output and user interfaces.  It uses the current underlying
+locale, regardless of whether or not it was called from within the scope of
+S<C<use locale>>.  The langinfo() function requires
 one numeric argument that identifies the locale constant to query:
 if no argument is supplied, C<$_> is used.  The numeric constants
 appropriate to be used as arguments are exportable from I18N::Langinfo.
@@ -103,20 +103,27 @@ answers for a yes/no question in the current locale.
 
     use I18N::Langinfo qw(langinfo ABDAY_1 YESSTR NOSTR);
 
-    my ($abday_1, $yesstr, $nostr) = map { langinfo } qw(ABDAY_1 YESSTR NOSTR);
+    my ($abday_1, $yesstr, $nostr) =
+        map { langinfo($_) } (ABDAY_1, YESSTR, NOSTR);
 
     print "$abday_1? [$yesstr/$nostr] ";
 
 In other words, in the "C" (or English) locale the above will probably
 print something like:
 
-    Sun? [yes/no] 
+    Sun? [yes/no]
 
 but under a French locale
 
-    dim? [oui/non] 
+    dim? [oui/non]
+
+The usually available constants are as follows.
+
+=over 4
 
-The usually available constants are
+=item *
+
+For abbreviated and full length days of the week and months of the year:
 
     ABDAY_1 ABDAY_2 ABDAY_3 ABDAY_4 ABDAY_5 ABDAY_6 ABDAY_7
     ABMON_1 ABMON_2 ABMON_3 ABMON_4 ABMON_5 ABMON_6
@@ -125,67 +132,157 @@ The usually available constants are
     MON_1 MON_2 MON_3 MON_4 MON_5 MON_6
     MON_7 MON_8 MON_9 MON_10 MON_11 MON_12
 
-for abbreviated and full length days of the week and months of the year,
+=item *
+
+For the date-time, date, and time formats used by the strftime() function
+(see L<POSIX>):
 
     D_T_FMT D_FMT T_FMT
 
-for the date-time, date, and time formats used by the strftime() function
-(see L<POSIX>)
+=item *
+
+For the locales for which it makes sense to have ante meridiem and post
+meridiem time formats:
 
     AM_STR PM_STR T_FMT_AMPM
 
-for the locales for which it makes sense to have ante meridiem and post
-meridiem time formats,
+=item *
 
-    CODESET CRNCYSTR RADIXCHAR
+For the character code set being used (such as "ISO8859-1", "cp850",
+"koi8-r", "sjis", "utf8", etc.), and for the currency string:
 
-for the character code set being used (such as "ISO8859-1", "cp850",
-"koi8-r", "sjis", "utf8", etc.), for the currency string, for the
+    CODESET CRNCYSTR
+
+=item *
+
+For an alternate representation of digits, for the
 radix character used between the integer and the fractional part
-of decimal numbers (yes, this is redundant with POSIX::localeconv())
+of decimal numbers, the group separator string for large-ish floating point
+numbers (yes, the final two are redundant with
+L<POSIX::localeconv()|POSIX/localeconv>):
+
+    ALT_DIGITS RADIXCHAR THOUSEP
+
+=item *
+
+For the affirmative and negative responses and expressions:
 
     YESSTR YESEXPR NOSTR NOEXPR
 
-for the affirmative and negative responses and expressions, and
+=item *
+
+For the eras based on typically some ruler, such as the Japanese Emperor
+(naturally only defined in the appropriate locales):
 
     ERA ERA_D_FMT ERA_D_T_FMT ERA_T_FMT
 
-for the Japanese Emperor eras (naturally only defined under Japanese locales).
+=back
 
-See your L<langinfo(3)> for more information about the available
-constants.  (Often this means having to look directly at the
-F<langinfo.h> C header file.)
+=head2 For systems without C<nl_langinfo>
+
+Starting in Perl 5.28, this module is available even on systems that lack a
+native C<nl_langinfo>.  On such systems, it uses various methods to construct
+what that function, if present, would return.  But there are potential
+glitches.  These are the items that could be different:
+
+=over
+
+=item C<ERA>
+
+Unimplemented, so returns C<"">.
+
+=item C<CODESET>
+
+Unimplemented, except on Windows, due to the vagaries of vendor locale names,
+returning C<""> on non-Windows.
+
+=item C<YESEXPR>
+
+=item C<YESSTR>
+
+=item C<NOEXPR>
 
-Note that unfortunately none of the above constants are guaranteed
-to be available on a particular platform.  To be on the safe side
-you can wrap the import in an eval like this:
+=item C<NOSTR>
 
-    eval {
-        require I18N::Langinfo;
-        I18N::Langinfo->import(qw(langinfo CODESET));
-        $codeset = langinfo(CODESET()); # note the ()
-    };
-    if (!$@) { ... failed ... }
+Only the values for English are returned.  C<YESSTR> and C<NOSTR> have been
+removed from POSIX 2008, and are retained here for backwards compatibility.
+Your platform's C<nl_langinfo> may not support them.
+
+=item C<D_FMT>
+
+Always evaluates to C<%x>, the locale's appropriate date representation.
+
+=item C<T_FMT>
+
+Always evaluates to C<%X>, the locale's appropriate time representation.
+
+=item C<D_T_FMT>
+
+Always evaluates to C<%c>, the locale's appropriate date and time
+representation.
+
+=item C<CRNCYSTR>
+
+The return may be incorrect for those rare locales where the currency symbol
+replaces the radix character.  If you have examples of it needing to work
+differently, please file a report at L<https://github.com/Perl/perl5/issues>.
+
+=item C<ALT_DIGITS>
+
+Currently this gives the same results as Linux does.  If you have examples of
+it needing to work differently, please file a report at
+L<https://github.com/Perl/perl5/issues>.
+
+=item C<ERA_D_FMT>
+
+=item C<ERA_T_FMT>
+
+=item C<ERA_D_T_FMT>
+
+=item C<T_FMT_AMPM>
+
+These are derived by using C<strftime()>, and not all versions of that function
+know about them.  C<""> is returned for these on such systems.
+
+=back
+
+See your L<nl_langinfo(3)> for more information about the available
+constants.  (Often this means having to look directly at the
+F<langinfo.h> C header file.)
 
 =head2 EXPORT
 
 By default only the C<langinfo()> function is exported.
 
+=head1 BUGS
+
+Before Perl 5.28, the returned values are unreliable for the C<RADIXCHAR> and
+C<THOUSEP> locale constants.
+
+Starting in 5.28, changing locales on threaded builds is supported on systems
+that offer thread-safe locale functions.  These include POSIX 2008 systems and
+Windows starting with Visual Studio 2005, and this module will work properly
+in such situations.  However, on threaded builds on Windows prior to Visual
+Studio 2015, retrieving the items C<CRNCYSTR> and C<THOUSEP> can result in a
+race with a thread that has converted to use the global locale.  It is quite
+uncommon for a thread to have done this.  It would be possible to construct a
+workaround for this; patches welcome: see L<perlapi/switch_to_global_locale>.
+
 =head1 SEE ALSO
 
 L<perllocale>, L<POSIX/localeconv>, L<POSIX/setlocale>, L<nl_langinfo(3)>.
 
-The langinfo() is just a wrapper for the C nl_langinfo() interface.
+The langinfo() function is just a wrapper for the C nl_langinfo() interface.
 
 =head1 AUTHOR
 
-Jarkko Hietaniemi, E<lt>jhi@hut.fiE<gt>
+Jarkko Hietaniemi, E<lt>jhi@hut.fiE<gt>.  Now maintained by Perl 5 porters.
 
 =head1 COPYRIGHT AND LICENSE
 
 Copyright 2001 by Jarkko Hietaniemi
 
 This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself. 
+it under the same terms as Perl itself.
 
 =cut