use warnings;
use Carp;
-require Exporter;
-require DynaLoader;
-
-our @ISA = qw(Exporter DynaLoader);
+use Exporter 'import';
+require XSLoader;
our @EXPORT = qw(langinfo);
YESSTR
);
-our $VERSION = '0.05';
-
-sub AUTOLOAD {
- # This AUTOLOAD is used to 'autoload' constants from the constant()
- # XS function.
-
- my $constname;
- our $AUTOLOAD;
- ($constname = $AUTOLOAD) =~ s/.*:://;
- croak "&I18N::Langinfo::constant not defined" if $constname eq 'constant';
- my ($error, $val) = constant($constname);
- if ($error) { croak $error; }
- {
- no strict 'refs';
- # Fixed between 5.005_53 and 5.005_61
-#XXX if ($] >= 5.00561) {
-#XXX *$AUTOLOAD = sub () { $val };
-#XXX }
-#XXX else {
- *$AUTOLOAD = sub { $val };
-#XXX }
- }
- goto &$AUTOLOAD;
-}
-
-bootstrap I18N::Langinfo $VERSION;
+our $VERSION = '0.21';
+
+XSLoader::load();
1;
__END__
=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.
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.
-The usually available constants are
+=over 4
+
+=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
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 *
+
+For the character code set being used (such as "ISO8859-1", "cp850",
+"koi8-r", "sjis", "utf8", etc.), and for the currency string:
+
+ CODESET CRNCYSTR
- CODESET CRNCYSTR RADIXCHAR
+=item *
-for the character code set being used (such as "ISO8859-1", "cp850",
-"koi8-r", "sjis", "utf8", etc.), for the currency string, for the
+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>
-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<NOEXPR>
- eval {
- require I18N::Langinfo;
- I18N::Langinfo->import(qw(langinfo CODESET));
- $codeset = langinfo(CODESET()); # note the ()
- };
- if (!$@) { ... failed ... }
+=item C<NOSTR>
+
+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