Locale-Utils-Autotranslator
view release on metacpan or search on metacpan
lib/Locale/Utils/Autotranslator.pm view on Meta::CPAN
my $char2 = shift @chars;
$decoded .= $char2 eq q{X}
? q{ }
: uc $char2;
next CHAR;
}
if ( $char eq q{X} ) {
@chars
or return "DECODE_ERROR_Xn($inner)";
my $char2 = shift @chars;
if ( $char2 eq q{Y} ) {
$decoded .= q{:};
next CHAR;
}
@chars
or return "DECODE_ERROR_Xnn($inner)";
my $char3 = shift @chars;
my $decode_string = 'ABCDEFGHIJKLMNOP';
my $index2 = index $decode_string, $char2;
$index2 == -1 ## no critic (MagicNumbers)
and return "DECODE_ERROR_X?($inner)";
my $index1 = index $decode_string, $char3;
$index1 == -1 ## no critic (MagicNumbers)
and return "DECODE_ERROR_Xn?($inner)";
$decoded .= chr $index2 * 16 + $index1; ## no critic (MagicNumbers)
next CHAR;
}
return "DECODE_ERROR($inner)";
}
return $decoded;
};
sub _decode_named_placeholder {
my ( $self, $placeholder ) = @_;
$placeholder =~ s{
XX
( [[:upper:]]+ )
XZ
}
{
q[{] . $decode_inner->($1) . q[}]
}xmsge;
return $placeholder;
}
sub _prepare_plural {
my ( $self, $nplurals, $plural_code ) = @_;
exists $self->_plural_ref->{0}
and return;
## no critic (MagicNumbers)
NUMBER:
for ( 0 .. 1000 ) {
my $plural = $plural_code->($_);
if ( $plural > ( $nplurals - 1 ) ) {
confess sprintf
'Using plural formula with value %s. Got index %s. nplurals is %s. Then the maximal expected index is %s',
$_,
$plural,
$nplurals,
$nplurals - 1;
}
if ( ! exists $self->_plural_ref->{$plural} ) {
$self->_plural_ref->{$plural} = $_;
}
$nplurals == ( keys %{ $self->_plural_ref } )
and last NUMBER;
}
## use critic (MagicNumbers)
return;
}
sub translate { ## no critic (ExcessComplexity)
my ( $self, $name_read, $name_write ) = @_;
defined $name_read
or confess 'Undef is not a name of a po/pot file';
defined $name_write
or confess 'Undef is not a name of a po file';
my $pos_ref = Locale::PO->load_file_asarray($name_read)
or confess "$name_read is not a valid po/pot file";
my $header = Locale::TextDomain::OO::Util::ExtractHeader
->instance
->extract_header_msgstr(
Locale::PO->dequote(
$pos_ref->[0]->msgstr
|| confess "No header found in file $name_read",
),
);
my $charset = $header->{charset};
my $encode_obj = find_encoding($charset);
my $nplurals = $header->{nplurals};
my $plural_code = $header->{plural_code};
$self->_clear_error;
$self->_clear_plural_ref;
my $entry_ref = { encode_obj => $encode_obj };
$self->_translation_count(0);
$self->_item_translation_count(0);
try {
MESSAGE:
for my $po ( @{$pos_ref}[ 1 .. $#{$pos_ref} ] ) { # without 0 = header
$self->_clear_comment;
$entry_ref->{msgid}
= $po->msgid
&& $encode_obj->decode( $po->dequote( $po->msgid ) );
$entry_ref->{msgid_plural}
= defined $po->msgid_plural
&& $encode_obj->decode( $po->dequote( $po->msgid_plural ) );
$entry_ref->{msgstr}
= defined $po->msgstr
&& $po->dequote( $po->msgstr );
length $entry_ref->{msgstr}
and next MESSAGE;
$entry_ref->{msgstr_n} = {};
( run in 2.020 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )