|
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 |
- |
|
|