Locale-TextDomain-OO

 view release on metacpan or  search on metacpan

lib/Locale/TextDomain/OO/Lexicon/Role/File.pm  view on Meta::CPAN


sub _run_extra_commands {
    my ($self, $identifier, $instance, $next_data_code) = @_;

    if ( $identifier eq 'merge_lexicon' ) {
        my ( $from1, $from2, $to ) = (
            $next_data_code->(),
            $next_data_code->(),
            $next_data_code->(),
        );
        $instance->merge_lexicon( $from1, $from2, $to );
        return 1;
    }
    if ( $identifier eq 'copy_lexicon' ) {
        my ( $from, $to ) = ( $next_data_code->(), $next_data_code->() );
        $instance->copy_lexicon( $from, $to );
        return 1;
    }
    if ( $identifier eq 'move_lexicon' ) {
        my ( $from, $to ) = ( $next_data_code->(), $next_data_code->() );
        $instance->move_lexicon( $from, $to );
        return 1;
    }
    if ( $identifier eq 'delete_lexicon' ) {
        my $name = $next_data_code->();
        $instance->delete_lexicon($name);
        return 1;
    }

    return;
}

sub lexicon_ref {
    my ($self, $file_lexicon_ref) = @_;

    my $instance = Locale::TextDomain::OO::Singleton::Lexicon->instance;
    $self->logger and $instance->logger( $self->logger );
    my $search_dirs = $file_lexicon_ref->{search_dirs}
        or confess 'Hash key "search_dirs" expected';
    my $header_util = Locale::TextDomain::OO::Util::ExtractHeader->instance;
    my $key_util    = Locale::TextDomain::OO::Util::JoinSplitLexiconKeys->instance;
    my $data = $file_lexicon_ref->{data};
    my $index = 0;
    DATA:
    while ( $index < @{ $file_lexicon_ref->{data} } ) {
        my $identifier = $data->[ $index++ ];
        $self->_run_extra_commands(
            $identifier,
            $instance,
            sub { return $data->[ $index++ ] },
        ) and next DATA;
        my ( $lexicon_key, $lexicon_value )
            = ( $identifier, $data->[ $index++ ] );
        for my $dir ( @{ $search_dirs } ) {
            my $file = path( $dir, $lexicon_value );
            my @files = $self->_my_glob($file);
            for ( @files ) {
                my $filename = $_->canonpath;
                my $lexicon_language_key = $lexicon_key;
                my $language = $filename;
                my @parts = split m{[*]}xms, $file;
                if ( @parts == 2 ) {
                    substr $language, 0, length $parts[0], q{};
                    substr $language, - length $parts[1], length $parts[1], q{};
                    $lexicon_language_key =~ s{[*]}{$language}xms;
                }
                my $messages_ref = $self->read_messages($filename);
                my $header_msgstr = $messages_ref->[0]->{msgstr}
                    or confess 'msgstr of header not found';
                my $header_ref = $messages_ref->[0];
                %{$header_ref} = (
                    msgid => $header_ref->{msgid},
                    %{ $header_util->extract_header_msgstr( $header_ref->{msgstr} ) },
                );
                $file_lexicon_ref->{gettext_to_maketext}
                    and $self->gettext_to_maketext($messages_ref);
                $file_lexicon_ref->{decode}
                    and $self->_decode_messages($messages_ref);
                $instance->data->{$lexicon_language_key} = {
                    map { ## no critic (ComplexMappings)
                        my $message_ref = $_;
                        my $msg_key = $key_util->join_message_key({(
                            map {
                                $_ => delete $message_ref->{$_};
                            }
                            qw( msgctxt msgid msgid_plural )
                        )});
                        ( $msg_key => $message_ref );
                    } @{$messages_ref}
                };
                $self->logger and $self->logger->(
                    qq{Lexicon "$lexicon_language_key" loaded from file "$filename".},
                    {
                        object => $self,
                        type   => 'debug',
                        event  => 'lexicon,load',
                    },
                );
            }
        }
    }

    return $self;
}

1;

__END__

=head1 NAME

Locale::TextDomain::OO::Lexicon::Role::File - Helper role to add lexicon from file

$Id: File.pm 722 2018-12-21 12:24:14Z steffenw $

$HeadURL: svn+ssh://steffenw@svn.code.sf.net/p/perl-gettext-oo/code/module/trunk/lib/Locale/TextDomain/OO/Lexicon/Role/File.pm $

=head1 VERSION

1.034



( run in 1.184 second using v1.01-cache-2.11-cpan-71847e10f99 )