Class-Usul
view release on metacpan or search on metacpan
lib/Class/Usul/L10N.pm view on Meta::CPAN
package Class::Usul::L10N;
use namespace::autoclean;
use Class::Null;
use Class::Usul::Constants qw( FALSE LANG NUL SEP TRUE );
use Class::Usul::Functions qw( assert is_arrayref
is_hashref merge_attributes );
use Class::Usul::Types qw( ArrayRef Bool HashRef Logger SimpleStr Str );
use File::DataClass::Types qw( Directory Path );
use File::Gettext;
use File::Gettext::Constants qw( CONTEXT_SEP LOCALE_DIRS );
use File::Spec::Functions qw( tmpdir );
use Try::Tiny;
use Unexpected::Functions qw( inflate_placeholders );
use Moo;
# Public attributes
has 'l10n_attributes' => is => 'lazy', isa => HashRef, builder => sub { {} };
has 'locale' => is => 'lazy', isa => SimpleStr, default => LANG;
has 'localedir' => is => 'lazy', isa => Path, coerce => TRUE,
builder => sub { LOCALE_DIRS->[ 0 ] };
has 'log' => is => 'ro', isa => Logger,
builder => sub { Class::Null->new };
has 'tempdir' => is => 'lazy', isa => Directory, coerce => TRUE,
builder => sub { tmpdir };
# Private attributes
has '_domains' => is => 'lazy', isa => ArrayRef[Str], builder => sub {
$_[ 0 ]->l10n_attributes->{domains} // [ 'messages' ] },
reader => 'domains';
has '_source_name' => is => 'lazy', isa => SimpleStr, builder => sub {
$_[ 0 ]->l10n_attributes->{source_name} // 'po' },
reader => 'source_name';
has '_use_country' => is => 'lazy', isa => Bool, builder => sub {
$_[ 0 ]->l10n_attributes->{use_country} // FALSE },
reader => 'use_country';
# Class attributes
my $domain_cache = {}; my $locale_cache = {};
# Private methods
my $_extract_lang_from = sub {
my ($self, $locale) = @_;
exists $locale_cache->{ $locale } and return $locale_cache->{ $locale };
my $sep = $self->use_country ? '.' : '_';
my $lang = (split m{ \Q$sep\E }msx, $locale.$sep )[ 0 ];
return $locale_cache->{ $locale } = $lang;
};
my $_load_domains = sub {
my ($self, $args) = @_; my $charset;
assert $self, sub { $args->{locale} }, 'No locale id';
my $locale = $args->{locale} or return;
my $lang = $self->$_extract_lang_from( $locale );
my $names = $args->{domains} // $args->{domain_names} // $self->domains;
my @names = grep { defined and length } @{ $names };
my $key = $lang.SEP.(join '+', @names );
defined $domain_cache->{ $key } and return $domain_cache->{ $key };
my $attrs = { %{ $self->l10n_attributes }, builder => $self,
source_name => $self->source_name, };
lib/Class/Usul/L10N.pm view on Meta::CPAN
=head2 invalidate_cache
$l10n->invalidate_cache;
Causes a reload of the domain files the next time a message is localised
=head2 loc
$local_text = $l10n->loc( $key, @args );
Calls L</localizer> supplying L</locale> as the first argument
=head2 localize
$local_text = $l10n->localize( $key, $args );
Localises the message indexed by C<$key>. The message catalogue is
loaded from a GNU Gettext portable object file. Returns the C<$key> if
the message is not in the catalogue (and C<< $args->{no_default} >> is
not true). Language is selected by the C<< $args->{locale} >>
attribute. Expands positional parameters of the form C<< [_<n>] >> if
C<< $args->{params} >> is an array reference of values to
substitute. Otherwise expands named attributes of the form
C<< {attr_name} >> using the C<$args> hash for substitution values. If
C<< $args->{quote_bind_values} >> is true the placeholder values are
displayed wrapped in quotes. The attribute C<< $args->{count} >> is
passed to the portable object files plural function which is used to
select either the singular or plural form of the translation. If
C<< $args->{context} >> is supplied it is prepended to the C<$key> before
the lookup in the catalogue takes place
=head2 localizer
$local_text = $l10n->localizer( $locale, $key, @args );
Curries the call to L<localize>. It constructs the C<$args> parameter in the
call to L<localize> from the C<@args> parameter, defaulting the C<locale>
attribute to C<$locale>. The C<@args> parameter can be a hash reference,
an array reference or a list of values
=head1 Diagnostics
Asserts that the I<locale> attribute is set
=head1 Dependencies
=over 3
=item L<Class::Usul::Constants>
=item L<Class::Usul::Functions>
=item L<File::DataClass::Types>
=item L<File::Gettext>
=item L<File::Gettext::Constants>
=item L<Moo>
=item L<Try::Tiny>
=back
=head1 Incompatibilities
There are no known incompatibilities in this module
=head1 Bugs and Limitations
There are no known bugs in this module.
Please report problems to the address below.
Patches are welcome
=head1 Author
Peter Flanigan, C<< <pjfl@cpan.org> >>
=head1 Acknowledgements
Larry Wall - For the Perl programming language
=head1 License and Copyright
Copyright (c) 2018 Peter Flanigan. All rights reserved
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself. See L<perlartistic>
This program is distributed in the hope that it will be useful,
but WITHOUT WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
=cut
# Local Variables:
# mode: perl
# tab-width: 3
# End:
( run in 1.135 second using v1.01-cache-2.11-cpan-39bf76dae61 )