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 475-514
sub create_tmpl {
Link Here
|
475 |
} |
477 |
} |
476 |
} |
478 |
} |
477 |
|
479 |
|
478 |
sub create_messages { |
480 |
sub locale_name { |
479 |
my $self = shift; |
481 |
my $self = shift; |
480 |
|
482 |
|
481 |
my ($language, $country) = split /-/, $self->{lang}; |
483 |
my ($language, $region, $country) = split /-/, $self->{lang}; |
|
|
484 |
$country //= $region; |
482 |
my $locale = $language; |
485 |
my $locale = $language; |
483 |
if ($country) { |
486 |
if ($country && length($country) == 2) { |
484 |
$locale .= '_' . $country; |
487 |
$locale .= '_' . $country; |
485 |
} |
488 |
} |
486 |
my $podir = "$self->{path_po}/$locale/LC_MESSAGES"; |
|
|
487 |
|
489 |
|
488 |
make_path($podir); |
490 |
return $locale; |
489 |
say "Create messages ($locale)" if $self->{verbose}; |
491 |
} |
490 |
system |
492 |
|
491 |
"$self->{cp} $self->{domain}.pot " . |
493 |
sub create_messages { |
492 |
"$podir/$self->{domain}.po"; |
494 |
my $self = shift; |
|
|
495 |
|
496 |
my $pot = "$self->{domain}.pot"; |
497 |
my $po = "$self->{path_po}/$self->{lang}-messages.po"; |
498 |
|
499 |
unless ( -f $pot ) { |
500 |
$self->extract_messages(); |
501 |
} |
502 |
|
503 |
say "Create messages ($self->{lang})" if $self->{verbose}; |
504 |
my $locale = $self->locale_name(); |
505 |
system "$self->{msginit} -i $pot -o $po -l $locale --no-translator"; |
506 |
|
507 |
# If msginit failed to correctly set Plural-Forms, set a default one |
508 |
system "$self->{sed} --in-place $po " |
509 |
. "--expression='s/Plural-Forms: nplurals=INTEGER; plural=EXPRESSION/Plural-Forms: nplurals=2; plural=(n != 1)/'"; |
493 |
} |
510 |
} |
494 |
|
511 |
|
495 |
sub update_messages { |
512 |
sub update_messages { |
496 |
my $self = shift; |
513 |
my $self = shift; |
497 |
|
514 |
|
498 |
my ($language, $country) = split /-/, $self->{lang}; |
515 |
my $pot = "$self->{domain}.pot"; |
499 |
my $locale = $language; |
516 |
my $po = "$self->{path_po}/$self->{lang}-messages.po"; |
500 |
if ($country) { |
517 |
|
501 |
$locale .= '_' . $country; |
518 |
unless ( -f $pot ) { |
|
|
519 |
$self->extract_messages(); |
502 |
} |
520 |
} |
503 |
my $podir = "$self->{path_po}/$locale/LC_MESSAGES"; |
|
|
504 |
my $pofile = "$podir/$self->{domain}.po"; |
505 |
|
521 |
|
506 |
say "Update messages ($locale)" if $self->{verbose}; |
522 |
if ( -f $po ) { |
507 |
if ( not -f $pofile ) { |
523 |
say "Update messages ($self->{lang})" if $self->{verbose}; |
508 |
say "File $pofile does not exist" if $self->{verbose}; |
524 |
system "$self->{msgmerge} -U $po $pot"; |
|
|
525 |
} else { |
509 |
$self->create_messages(); |
526 |
$self->create_messages(); |
510 |
} |
527 |
} |
511 |
system "$self->{msgmerge} -U $pofile $self->{domain}.pot"; |
|
|
512 |
} |
528 |
} |
513 |
|
529 |
|
514 |
sub extract_messages_from_templates { |
530 |
sub extract_messages_from_templates { |
Lines 519-524
sub extract_messages_from_templates {
Link Here
|
519 |
my $parser = Template::Parser->new(); |
535 |
my $parser = Template::Parser->new(); |
520 |
|
536 |
|
521 |
foreach my $file (@files) { |
537 |
foreach my $file (@files) { |
|
|
538 |
say "Extract messages from $file" if $self->{verbose}; |
522 |
my $template = read_file("$intranetdir/$file"); |
539 |
my $template = read_file("$intranetdir/$file"); |
523 |
my $data = $parser->parse($template); |
540 |
my $data = $parser->parse($template); |
524 |
my $document = PPI::Document->new(\$data->{BLOCK}); |
541 |
my $document = PPI::Document->new(\$data->{BLOCK}); |
Lines 576-581
sub extract_messages_from_templates {
Link Here
|
576 |
sub extract_messages { |
593 |
sub extract_messages { |
577 |
my $self = shift; |
594 |
my $self = shift; |
578 |
|
595 |
|
|
|
596 |
say "Extract messages into POT file" if $self->{verbose}; |
597 |
|
579 |
my $intranetdir = $self->{context}->config('intranetdir'); |
598 |
my $intranetdir = $self->{context}->config('intranetdir'); |
580 |
my @files_to_scan; |
599 |
my @files_to_scan; |
581 |
my @directories_to_scan = ('.'); |
600 |
my @directories_to_scan = ('.'); |
Lines 649-685
sub extract_messages {
Link Here
|
649 |
die "system call failed: $msgcat_cmd"; |
668 |
die "system call failed: $msgcat_cmd"; |
650 |
} |
669 |
} |
651 |
|
670 |
|
652 |
if ( -f "$Bin/$self->{domain}.pot" ) { |
671 |
my $replace_charset_cmd = "$self->{sed} --in-place " . |
653 |
my $replace_charset_cmd = "$self->{sed} --in-place " . |
672 |
"$Bin/$self->{domain}.pot " . |
654 |
"$Bin/$self->{domain}.pot " . |
673 |
"--expression='s/charset=CHARSET/charset=UTF-8/'"; |
655 |
"--expression='s/charset=CHARSET/charset=UTF-8/'"; |
674 |
if (system($replace_charset_cmd) != 0) { |
656 |
if (system($replace_charset_cmd) != 0) { |
675 |
die "system call failed: $replace_charset_cmd"; |
657 |
die "system call failed: $replace_charset_cmd"; |
|
|
658 |
} |
659 |
} else { |
660 |
say "No messages found" if $self->{verbose}; |
661 |
return; |
662 |
} |
676 |
} |
663 |
return 1; |
|
|
664 |
} |
677 |
} |
665 |
|
678 |
|
666 |
sub install_messages { |
679 |
sub install_messages { |
667 |
my ($self) = @_; |
680 |
my ($self) = @_; |
668 |
|
681 |
|
669 |
my ($language, $country) = split /-/, $self->{lang}; |
682 |
my $locale = $self->locale_name(); |
670 |
my $locale = $language; |
683 |
my $modir = "$self->{path_po}/$locale/LC_MESSAGES"; |
671 |
if ($country) { |
684 |
my $pofile = "$self->{path_po}/$self->{lang}-messages.po"; |
672 |
$locale .= '_' . $country; |
685 |
my $mofile = "$modir/$self->{domain}.mo"; |
673 |
} |
|
|
674 |
my $podir = "$self->{path_po}/$locale/LC_MESSAGES"; |
675 |
my $pofile = "$podir/$self->{domain}.po"; |
676 |
my $mofile = "$podir/$self->{domain}.mo"; |
677 |
|
686 |
|
678 |
say "Install messages ($locale)" if $self->{verbose}; |
|
|
679 |
if ( not -f $pofile ) { |
687 |
if ( not -f $pofile ) { |
680 |
say "File $pofile does not exist" if $self->{verbose}; |
|
|
681 |
$self->create_messages(); |
688 |
$self->create_messages(); |
682 |
} |
689 |
} |
|
|
690 |
say "Install messages ($locale)" if $self->{verbose}; |
691 |
make_path($modir); |
683 |
system "$self->{msgfmt} -o $mofile $pofile"; |
692 |
system "$self->{msgfmt} -o $mofile $pofile"; |
684 |
|
693 |
|
685 |
my $js_locale_data = 'var json_locale_data = {"Koha":' . `$self->{po2json} $pofile` . '};'; |
694 |
my $js_locale_data = 'var json_locale_data = {"Koha":' . `$self->{po2json} $pofile` . '};'; |
Lines 712-717
sub install {
Link Here
|
712 |
$self->install_tmpl($files) unless $self->{pref_only}; |
721 |
$self->install_tmpl($files) unless $self->{pref_only}; |
713 |
$self->install_prefs(); |
722 |
$self->install_prefs(); |
714 |
$self->install_messages(); |
723 |
$self->install_messages(); |
|
|
724 |
$self->remove_pot(); |
715 |
} |
725 |
} |
716 |
|
726 |
|
717 |
|
727 |
|
Lines 727-740
sub get_all_langs {
Link Here
|
727 |
sub update { |
737 |
sub update { |
728 |
my ($self, $files) = @_; |
738 |
my ($self, $files) = @_; |
729 |
my @langs = $self->{lang} ? ($self->{lang}) : $self->get_all_langs(); |
739 |
my @langs = $self->{lang} ? ($self->{lang}) : $self->get_all_langs(); |
730 |
my $extract_ok = $self->extract_messages(); |
|
|
731 |
for my $lang ( @langs ) { |
740 |
for my $lang ( @langs ) { |
732 |
$self->set_lang( $lang ); |
741 |
$self->set_lang( $lang ); |
733 |
$self->update_tmpl($files) unless $self->{pref_only}; |
742 |
$self->update_tmpl($files) unless $self->{pref_only}; |
734 |
$self->update_prefs(); |
743 |
$self->update_prefs(); |
735 |
$self->update_messages() if $extract_ok; |
744 |
$self->update_messages(); |
736 |
} |
745 |
} |
737 |
$self->remove_pot() if $extract_ok; |
746 |
$self->remove_pot(); |
738 |
} |
747 |
} |
739 |
|
748 |
|
740 |
|
749 |
|
Lines 743-752
sub create {
Link Here
|
743 |
return unless $self->{lang}; |
752 |
return unless $self->{lang}; |
744 |
$self->create_tmpl($files) unless $self->{pref_only}; |
753 |
$self->create_tmpl($files) unless $self->{pref_only}; |
745 |
$self->create_prefs(); |
754 |
$self->create_prefs(); |
746 |
if ($self->extract_messages()) { |
755 |
$self->create_messages(); |
747 |
$self->create_messages(); |
756 |
$self->remove_pot(); |
748 |
$self->remove_pot(); |
|
|
749 |
} |
750 |
} |
757 |
} |
751 |
|
758 |
|
752 |
|
759 |
|
753 |
- |
|
|