View | Details | Raw Unified | Return to bug 15395
Collapse All | Expand All

(-)a/misc/translator/LangInstaller.pm (-48 / +54 lines)
Lines 78-83 sub new { Link Here
78
    $self->{msgmerge}        = `which msgmerge`;
78
    $self->{msgmerge}        = `which msgmerge`;
79
    $self->{msgfmt}          = `which msgfmt`;
79
    $self->{msgfmt}          = `which msgfmt`;
80
    $self->{msgcat}          = `which msgcat`;
80
    $self->{msgcat}          = `which msgcat`;
81
    $self->{msginit}         = `which msginit`;
81
    $self->{xgettext}        = `which xgettext`;
82
    $self->{xgettext}        = `which xgettext`;
82
    $self->{sed}             = `which sed`;
83
    $self->{sed}             = `which sed`;
83
    $self->{po2json}         = "$Bin/po2json";
84
    $self->{po2json}         = "$Bin/po2json";
Lines 85-90 sub new { Link Here
85
    chomp $self->{msgmerge};
86
    chomp $self->{msgmerge};
86
    chomp $self->{msgfmt};
87
    chomp $self->{msgfmt};
87
    chomp $self->{msgcat};
88
    chomp $self->{msgcat};
89
    chomp $self->{msginit};
88
    chomp $self->{xgettext};
90
    chomp $self->{xgettext};
89
    chomp $self->{sed};
91
    chomp $self->{sed};
90
92
Lines 480-519 sub create_tmpl { Link Here
480
    }
482
    }
481
}
483
}
482
484
483
sub create_messages {
485
sub locale_name {
484
    my $self = shift;
486
    my $self = shift;
485
487
486
    my ($language, $country) = split /-/, $self->{lang};
488
    my ($language, $region, $country) = split /-/, $self->{lang};
489
    $country //= $region;
487
    my $locale = $language;
490
    my $locale = $language;
488
    if ($country) {
491
    if ($country && length($country) == 2) {
489
        $locale .= '_' . $country;
492
        $locale .= '_' . $country;
490
    }
493
    }
491
    my $podir = "$self->{path_po}/$locale/LC_MESSAGES";
492
494
493
    make_path($podir);
495
    return $locale;
494
    say "Create messages ($locale)" if $self->{verbose};
496
}
495
    system
497
496
        "$self->{cp} $self->{domain}.pot " .
498
sub create_messages {
497
        "$podir/$self->{domain}.po";
499
    my $self = shift;
500
501
    my $pot = "$self->{domain}.pot";
502
    my $po = "$self->{path_po}/$self->{lang}-messages.po";
503
504
    unless ( -f $pot ) {
505
        $self->extract_messages();
506
    }
507
508
    say "Create messages ($self->{lang})" if $self->{verbose};
509
    my $locale = $self->locale_name();
510
    system "$self->{msginit} -i $pot -o $po -l $locale --no-translator";
511
512
    # If msginit failed to correctly set Plural-Forms, set a default one
513
    system "$self->{sed} --in-place $po "
514
        . "--expression='s/Plural-Forms: nplurals=INTEGER; plural=EXPRESSION/Plural-Forms: nplurals=2; plural=(n != 1)/'";
498
}
515
}
499
516
500
sub update_messages {
517
sub update_messages {
501
    my $self = shift;
518
    my $self = shift;
502
519
503
    my ($language, $country) = split /-/, $self->{lang};
520
    my $pot = "$self->{domain}.pot";
504
    my $locale = $language;
521
    my $po = "$self->{path_po}/$self->{lang}-messages.po";
505
    if ($country) {
522
506
        $locale .= '_' . $country;
523
    unless ( -f $pot ) {
524
        $self->extract_messages();
507
    }
525
    }
508
    my $podir = "$self->{path_po}/$locale/LC_MESSAGES";
509
    my $pofile = "$podir/$self->{domain}.po";
510
526
511
    say "Update messages ($locale)" if $self->{verbose};
527
    if ( -f $po ) {
512
    if ( not -f $pofile ) {
528
        say "Update messages ($self->{lang})" if $self->{verbose};
513
        say "File $pofile does not exist" if $self->{verbose};
529
        system "$self->{msgmerge} -U $po $pot";
530
    } else {
514
        $self->create_messages();
531
        $self->create_messages();
515
    }
532
    }
516
    system "$self->{msgmerge} -U $pofile $self->{domain}.pot";
517
}
533
}
518
534
519
sub extract_messages_from_templates {
535
sub extract_messages_from_templates {
Lines 524-529 sub extract_messages_from_templates { Link Here
524
    my $parser = Template::Parser->new();
540
    my $parser = Template::Parser->new();
525
541
526
    foreach my $file (@files) {
542
    foreach my $file (@files) {
543
        say "Extract messages from $file" if $self->{verbose};
527
        my $template = read_file("$intranetdir/$file");
544
        my $template = read_file("$intranetdir/$file");
528
        my $data = $parser->parse($template);
545
        my $data = $parser->parse($template);
529
        my $document = PPI::Document->new(\$data->{BLOCK});
546
        my $document = PPI::Document->new(\$data->{BLOCK});
Lines 581-586 sub extract_messages_from_templates { Link Here
581
sub extract_messages {
598
sub extract_messages {
582
    my $self = shift;
599
    my $self = shift;
583
600
601
    say "Extract messages into POT file" if $self->{verbose};
602
584
    my $intranetdir = $self->{context}->config('intranetdir');
603
    my $intranetdir = $self->{context}->config('intranetdir');
585
    my @files_to_scan;
604
    my @files_to_scan;
586
    my @directories_to_scan = ('.');
605
    my @directories_to_scan = ('.');
Lines 654-690 sub extract_messages { Link Here
654
        die "system call failed: $msgcat_cmd";
673
        die "system call failed: $msgcat_cmd";
655
    }
674
    }
656
675
657
    if ( -f "$Bin/$self->{domain}.pot" ) {
676
    my $replace_charset_cmd = "$self->{sed} --in-place " .
658
        my $replace_charset_cmd = "$self->{sed} --in-place " .
677
        "$Bin/$self->{domain}.pot " .
659
            "$Bin/$self->{domain}.pot " .
678
        "--expression='s/charset=CHARSET/charset=UTF-8/'";
660
            "--expression='s/charset=CHARSET/charset=UTF-8/'";
679
    if (system($replace_charset_cmd) != 0) {
661
        if (system($replace_charset_cmd) != 0) {
680
        die "system call failed: $replace_charset_cmd";
662
            die "system call failed: $replace_charset_cmd";
663
        }
664
    } else {
665
        say "No messages found" if $self->{verbose};
666
        return;
667
    }
681
    }
668
    return 1;
669
}
682
}
670
683
671
sub install_messages {
684
sub install_messages {
672
    my ($self) = @_;
685
    my ($self) = @_;
673
686
674
    my ($language, $country) = split /-/, $self->{lang};
687
    my $locale = $self->locale_name();
675
    my $locale = $language;
688
    my $modir = "$self->{path_po}/$locale/LC_MESSAGES";
676
    if ($country) {
689
    my $pofile = "$self->{path_po}/$self->{lang}-messages.po";
677
        $locale .= '_' . $country;
690
    my $mofile = "$modir/$self->{domain}.mo";
678
    }
679
    my $podir = "$self->{path_po}/$locale/LC_MESSAGES";
680
    my $pofile = "$podir/$self->{domain}.po";
681
    my $mofile = "$podir/$self->{domain}.mo";
682
691
683
    say "Install messages ($locale)" if $self->{verbose};
684
    if ( not -f $pofile ) {
692
    if ( not -f $pofile ) {
685
        say "File $pofile does not exist" if $self->{verbose};
686
        $self->create_messages();
693
        $self->create_messages();
687
    }
694
    }
695
    say "Install messages ($locale)" if $self->{verbose};
696
    make_path($modir);
688
    system "$self->{msgfmt} -o $mofile $pofile";
697
    system "$self->{msgfmt} -o $mofile $pofile";
689
698
690
    my $js_locale_data = 'var json_locale_data = {"Koha":' . `$self->{po2json} $pofile` . '};';
699
    my $js_locale_data = 'var json_locale_data = {"Koha":' . `$self->{po2json} $pofile` . '};';
Lines 717-722 sub install { Link Here
717
    $self->install_tmpl($files) unless $self->{pref_only};
726
    $self->install_tmpl($files) unless $self->{pref_only};
718
    $self->install_prefs();
727
    $self->install_prefs();
719
    $self->install_messages();
728
    $self->install_messages();
729
    $self->remove_pot();
720
}
730
}
721
731
722
732
Lines 732-745 sub get_all_langs { Link Here
732
sub update {
742
sub update {
733
    my ($self, $files) = @_;
743
    my ($self, $files) = @_;
734
    my @langs = $self->{lang} ? ($self->{lang}) : $self->get_all_langs();
744
    my @langs = $self->{lang} ? ($self->{lang}) : $self->get_all_langs();
735
    my $extract_ok = $self->extract_messages();
736
    for my $lang ( @langs ) {
745
    for my $lang ( @langs ) {
737
        $self->set_lang( $lang );
746
        $self->set_lang( $lang );
738
        $self->update_tmpl($files) unless $self->{pref_only};
747
        $self->update_tmpl($files) unless $self->{pref_only};
739
        $self->update_prefs();
748
        $self->update_prefs();
740
        $self->update_messages() if $extract_ok;
749
        $self->update_messages();
741
    }
750
    }
742
    $self->remove_pot() if $extract_ok;
751
    $self->remove_pot();
743
}
752
}
744
753
745
754
Lines 748-757 sub create { Link Here
748
    return unless $self->{lang};
757
    return unless $self->{lang};
749
    $self->create_tmpl($files) unless $self->{pref_only};
758
    $self->create_tmpl($files) unless $self->{pref_only};
750
    $self->create_prefs();
759
    $self->create_prefs();
751
    if ($self->extract_messages()) {
760
    $self->create_messages();
752
        $self->create_messages();
761
    $self->remove_pot();
753
        $self->remove_pot();
754
    }
755
}
762
}
756
763
757
764
758
- 

Return to bug 15395