App-I18N

 view release on metacpan or  search on metacpan

lib/App/I18N/Command/Auto.pm  view on Meta::CPAN

}



sub run {
    my ( $self , $lang ) = @_;
    my $logger = $self->logger();

    unless( $lang ) {
        return $logger->error( "Language name is required." );
    }

    unless( $self->{from} ) {
        return $logger->error( "--from [Language] is required. please specify your language to translate." );
    }


    # XXX: check this option
    $self->{backend} ||= 'rest-google';

    my $podir = $self->{podir};
    $podir = App::I18N->guess_podir( $self ) unless $podir;
    $self->{mo} = 1 if $self->{locale};

    mkpath [ $podir ];

    my $pot_name = App::I18N->pot_name;
    my $potfile = File::Spec->catfile( $podir, $pot_name . ".pot") ;
    if( ! -e $potfile ) {
        $logger->info( "$potfile not found." );
        return;
    }

    my $from_lang = $self->{from};
    my $to_lang = $self->{to} || $lang;

    my $pofile;
    if( $self->{locale} ) {
        $pofile = File::Spec->join( $podir , $lang , 'LC_MESSAGES' , $pot_name . ".po" );
    }
    else {
        $pofile = File::Spec->join( $podir , $lang . ".po" );
    }

    my $ext = Locale::Maketext::Extract->new;

    $logger->info( "Reading po file: $pofile" );
    $ext->read_po($pofile);

    my $from_lang_s = $from_lang;
    my $to_lang_s = $to_lang;

    # ($from_lang_s) = ( $from_lang  =~ m{^([a-z]+)(_\w+)?} );
    # ($to_lang_s)   = ( $to_lang    =~ m{^([a-z]+)(_\w+)?} );

    $logger->info( "Translating: $from_lang_s => $to_lang_s" );

    $logger->info( "Initialing REST::Google" );
    REST::Google::Translate->http_referer('http://google.com');

    binmode STDERR, ":utf8";
    

NEXT_MSGID:
    for my $i ($ext->msgids()) {
        my $msgid  = $i;
        my $msgstr = $ext->msgstr( $i );

        # skip if no msgstr and no overwrite.
        next if $msgstr && ! $self->{overwrite} && ! $self->{msgstr};

        # translate from msgstr
        $i = $msgstr if $msgstr && $self->{msgstr};

        $logger->info( "********" );
        $logger->info( " msgid: $msgid");
        $logger->info( " msgstr: $msgstr" ) if $msgstr;

        $logger->info( " tranlating from msgstr" ) if $self->{msgstr};
        $logger->info( " tranlating from msgid"  ) if ! $self->{msgstr};

        my $retry = 1;
        while($retry--) {
            my $res;
            eval {
                $res = REST::Google::Translate->new(
                    q => $i,
                    langpair => $from_lang_s . '|' . $to_lang_s );
            };

            if( $@ ) {
                # XXX: let it retry for 3 times
                $retry = 2;
                $logger->error( "REST API ERROR: $@ , $!" );
                $logger->info( "Retrying ..." );
            }

            if ($res->responseStatus == 200) {
                my $translated = $res->responseData->translatedText;
                $logger->info( "translated: " . encode_utf8( $translated ) );

                if( ($msgstr && $self->{overwrite}) 
                        || ! $msgstr ) {

                    if( $self->{prompt} ) {
                        my $ans = $self->prompt( "Apply this ? (Y/n)" );
                        next NEXT_MSGID if $ans =~ /^\s*n\s*$/i;

                        if ( $ans !~ /^\s*y\s*$/i ) {
                            print STDERR qq|Applying "$ans"\n|;
                            # it's user typed msgstr
                            $ext->set_msgstr( $i, $ans );
                            next NEXT_MSGID;
                        }
                    }
                    print STDERR qq|Applying "$translated"\n|;
                    $ext->set_msgstr($i, encode_utf8( $translated ) );
                }
            }
            else {
                $ext->set_msgstr($i, undef) if $self->{overwrite};



( run in 1.403 second using v1.01-cache-2.11-cpan-97f6503c9c8 )