Locale-Utils-Autotranslator
view release on metacpan or search on metacpan
lib/Locale/Utils/Autotranslator.pm view on Meta::CPAN
$po->msgstr( $entry_ref->{encode_obj}->encode($msgstr) );
return;
}
sub _translate_simple {
my ( $self, $entry_ref, $po ) = @_;
$po->msgstr(
$entry_ref->{encode_obj}->encode(
$self->translate_any_msgid( $entry_ref->{msgid}, 1 ),
),
);
return;
}
sub _update_comment {
my ( $self, $po ) = @_;
defined $self->comment
or return;
length $self->comment
or return;
if ( ! defined $po->comment ) {
$po->comment( $self->comment );
return;
}
my @lines
= grep {
$_ ne $self->comment;
}
$po->comment =~ m{ [\n]* ( [^\n]+ ) }xmsg;
$po->comment( join "\n", $self->comment, @lines );
return;
}
sub with_paragraphs {
my ( $self, $msgid, $callback ) = @_;
ref $callback eq 'CODE'
or confess 'Code reference expected';
defined $msgid
or return $msgid;
my $has_network_line_endings = $msgid =~ s{ \r\n }{\n}xmsg;
my ( @prefix, @suffix );
my $msgstr
= join "\n\n",
map {
( shift @prefix ) . $_ . ( shift @suffix );
}
map { length $_ ? $callback->($_) : $_ }
map { ## no critic (ComplexMappings)
my $paragraph = $_;
$paragraph =~ s{ \A ( \s* ) }{ push @prefix, $1; q{} }xmse; # left
$paragraph =~ s{ ( \s* ) \z }{ push @suffix, $1; q{} }xmse; # right
$paragraph;
}
split m{ \n [^\S\n]* \n }xms, $msgid;
$has_network_line_endings
and $msgstr =~ s{ \n }{\r\n}xmsg;
return $msgstr;
}
sub with_lines {
my ( $self, $msgid, $callback ) = @_;
ref $callback eq 'CODE'
or confess 'Code reference expected';
defined $msgid
or return $msgid;
my $has_network_line_endings = $msgid =~ s{ \r\n }{\n}xmsg;
my ( @prefix, @suffix );
return
join $has_network_line_endings ? ( "\r\n" ) : ( "\n" ),
map {
( shift @prefix ) . $_ . ( shift @suffix );
}
map { length $_ ? $callback->($_) : $_ }
map { ## no critic (ComplexMappings)
my $line = $_;
$line =~ s{ \A ( \s* ) }{ push @prefix, $1; q{} }xmse; # left
$line =~ s{ ( \s* ) \z }{ push @suffix, $1; q{} }xmse; # right
$line =~ s{ \s+ }{ }xmsg; # inner
$line;
}
split m{ \n }xms, $msgid;
}
sub _bytes_max_fail_message {
my ( $self, $msgid ) = @_;
$self->bytes_max
or return 0;
my $msgid_bytes = length encode_utf8($msgid);
return $msgid_bytes > $self->bytes_max
? do {
( my $msgid_short = $msgid ) =~ s{ \A ( .{80} ) .* \z }{$1 ...}xms;
"Byte limit exceeded, $msgid_bytes bytes at: $msgid_short";
}
: q{};
}
sub _translate_paragraph {
my ( $self, $msgid ) = @_;
return $self->_bytes_max_fail_message($msgid)
? $self->with_lines(
$msgid,
sub {
my $fail_message = $self->_bytes_max_fail_message($_);
$fail_message
and die $fail_message, "\n";
my $msgstr = $self->translate_text($_);
defined $msgstr
or $msgstr = q{};
$self->_item_translation_count_increment;
$msgstr =~ s{ [\x{0}\x{4}] }{}xmsg; # because of mo file conflicts
length $msgstr
or die "No translation break\n";
return $msgstr;
},
)
: do {
my $msgstr = $self->translate_text($msgid);
defined $msgstr
or $msgstr = q{};
$self->_item_translation_count_increment;
$msgstr =~ s{ [\x{0}\x{4}] }{}xmsg; # because of mo file conflicts
length $msgstr
or die "No translation break\n";
$msgstr;
};
}
sub translate_any_msgid {
my ( $self, $msgid, $is_called_indirectly ) = @_;
$self->error
and $is_called_indirectly
? ( die $self->error, "\n" )
: return q{};
if ( $self->before_translation_code ) {
$self->before_translation_code->($self, $msgid)
or die "Before translation break\n";
}
( run in 0.544 second using v1.01-cache-2.11-cpan-71847e10f99 )