Bug 10712: Save missing config variables to install log
[koha.git] / misc / translator / LangInstaller.pm
index c38c53e..f3525f8 100644 (file)
@@ -17,8 +17,7 @@ package LangInstaller;
 # with Koha; if not, write to the Free Software Foundation, Inc.,
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
-use strict;
-use warnings;
+use Modern::Perl;
 
 use C4::Context;
 # WARNING: Any other tested YAML library fails to work properly in this
@@ -29,6 +28,20 @@ use FindBin qw( $Bin );
 
 $YAML::Syck::ImplicitTyping = 1;
 
+
+# Default file header for .po syspref files
+my $default_pref_po_header = Locale::PO->new(-msgid => '', -msgstr =>
+    "Project-Id-Version: PACKAGE VERSION\\n" .
+    "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\\n" .
+    "Last-Translator: FULL NAME <EMAIL\@ADDRESS>\\n" .
+    "Language-Team: Koha Translate List <koha-translate\@lists.koha-community.org>\\n" .
+    "MIME-Version: 1.0\\n" .
+    "Content-Type: text/plain; charset=UTF-8\\n" .
+    "Content-Transfer-Encoding: 8bit\\n" .
+    "Plural-Forms: nplurals=2; plural=(n > 1);\\n"
+);
+
+
 sub set_lang {
     my ($self, $lang) = @_;
 
@@ -39,7 +52,7 @@ sub set_lang {
 
 
 sub new {
-    my ($class, $lang, $pref_only) = @_;
+    my ($class, $lang, $pref_only, $verbose) = @_;
 
     my $self                 = { };
 
@@ -49,9 +62,10 @@ sub new {
                                '/prog/en/modules/admin/preferences';
     set_lang( $self, $lang ) if $lang;
     $self->{pref_only}       = $pref_only;
-    $self->{translator_path} = $Bin;
-    $self->{path_po}         = $self->{translator_path} . "/po";
-    $self->{po}              = {};
+    $self->{verbose}         = $verbose;
+    $self->{process}         = "$Bin/tmpl_process3.pl " . ($verbose ? '' : '-q');
+    $self->{path_po}         = "$Bin/po";
+    $self->{po}              = { '' => $default_pref_po_header };
 
     # Get all .pref file names
     opendir my $fh, $self->{path_pref_en};
@@ -62,21 +76,34 @@ sub new {
     # Get all available language codes
     opendir $fh, $self->{path_po};
     my @langs =  map { ($_) =~ /(.*)-i-opac/ } 
-        grep { $_ =~ /.*-opac-/ } readdir($fh);
+        grep { $_ =~ /.*-opac-t-prog/ } readdir($fh);
     closedir $fh;
     $self->{langs} = \@langs;
 
     # Map for both interfaces opac/intranet
-    $self->{interface} = {
-        opac => {
-            dir    => $context->config('opachtdocs') . '/prog',
-            suffix => '-i-opac-t-prog-v-3002000.po',
+    my $opachtdocs = $context->config('opachtdocs');
+    $self->{interface} = [
+        {
+            name   => 'OPAC prog',
+            dir    => "$opachtdocs/prog",
+            suffix => '-i-opac-t-prog-v-3006000.po',
         },
-        intranet => {
+        {
+            name   => 'Intranet prog',
             dir    => $context->config('intrahtdocs') . '/prog',
-            suffix => '-i-staff-t-prog-v-3002000.po',
-        }
-    };
+            suffix => '-i-staff-t-prog-v-3006000.po',
+        },
+    ];
+
+    # Alternate opac themes
+    opendir $fh, $context->config('opachtdocs');
+    for ( grep { not /^\.|\.\.|prog|lib$/ } readdir($fh) ) {
+        push @{$self->{interface}}, {
+            name   => "OPAC $_",
+            dir    => "$opachtdocs/$_",
+            suffix => "-opac-$_.po",
+        };
+    }
 
     bless $self, $class;
 }
@@ -208,9 +235,14 @@ sub get_po_from_prefs {
 
 sub save_po {
     my $self = shift;
+
+    # Create file header if it doesn't already exist
+    my $po = $self->{po};
+    $po->{''} ||= $default_pref_po_header;
+
     # Write .po entries into a file put in Koha standard po directory
-    Locale::PO->save_file_fromhash( $self->po_filename, $self->{po} );
-    print "Saved in file: ", $self->po_filename, "\n";
+    Locale::PO->save_file_fromhash( $self->po_filename, $po );
+    say "Saved in file: ", $self->po_filename if $self->{verbose};
 }
 
 
@@ -236,7 +268,7 @@ sub get_po_merged_with_en {
 sub update_prefs {
     my $self = shift;
     print "Update '", $self->{lang},
-          "' preferences .po file from 'en' .pref files\n";
+          "' preferences .po file from 'en' .pref files\n" if $self->{verbose};
     $self->get_po_merged_with_en();
     $self->save_po();
 }
@@ -281,7 +313,7 @@ sub install_prefs {
             $pref->{$tab} = $ntab;
         }
         my $file_trans = $self->{po_path_lang} . "/$file";
-        print "Write $file\n";
+        print "Write $file\n" if $self->{verbose};
         open my $fh, ">", $file_trans;
         print $fh Dump($pref);
     }
@@ -289,43 +321,52 @@ sub install_prefs {
 
 
 sub install_tmpl {
-    my $self = shift;
-
-    print
-        "Install templates\n";
-    while ( my ($interface, $tmpl) = each %{$self->{interface}} ) {
+    my ($self, $files) = @_;
+    say "Install templates" if $self->{verbose};
+    for my $trans ( @{$self->{interface}} ) {
         print
-            "  Install templates '$interface\n",
-            "    From: $tmpl->{dir}/en/\n",
-            "    To  : $tmpl->{dir}/$self->{lang}\n",
-            "    With: $self->{path_po}/$self->{lang}$tmpl->{suffix}\n";
-        my $lang_dir = "$tmpl->{dir}/$self->{lang}";
+            "  Install templates '$trans->{name}'\n",
+            "    From: $trans->{dir}/en/\n",
+            "    To  : $trans->{dir}/$self->{lang}\n",
+            "    With: $self->{path_po}/$self->{lang}$trans->{suffix}\n"
+                if $self->{verbose};
+        my $lang_dir = "$trans->{dir}/$self->{lang}";
         mkdir $lang_dir unless -d $lang_dir;
         system
-            "$self->{translator_path}/tmpl_process3.pl install " .
-            "-i $tmpl->{dir}/en/ " .
-            "-o $tmpl->{dir}/$self->{lang} ".
-            "-s $self->{path_po}/$self->{lang}$tmpl->{suffix} -r"
+            "$self->{process} install " .
+            "-i $trans->{dir}/en/ " .
+            "-o $trans->{dir}/$self->{lang} ".
+            "-s $self->{path_po}/$self->{lang}$trans->{suffix} -r " .
+            (
+                @$files
+                    ? '-f ' . join ' -f ', @$files
+                    : ''
+            )
     }
 }
 
 
 sub update_tmpl {
-    my $self = shift;
+    my ($self, $files) = @_;
 
-    print
-        "Update templates\n";
-    while ( my ($interface, $tmpl) = each %{$self->{interface}} ) {
+    say "Update templates" if $self->{verbose};
+    for my $trans ( @{$self->{interface}} ) {
         print
-            "  Update templates '$interface'\n",
-            "    From: $tmpl->{dir}/en/\n",
-            "    To  : $self->{path_po}/$self->{lang}$tmpl->{suffix}\n";
-        my $lang_dir = "$tmpl->{dir}/$self->{lang}";
+            "  Update templates '$trans->{name}'\n",
+            "    From: $trans->{dir}/en/\n",
+            "    To  : $self->{path_po}/$self->{lang}$trans->{suffix}\n"
+                if $self->{verbose};
+        my $lang_dir = "$trans->{dir}/$self->{lang}";
         mkdir $lang_dir unless -d $lang_dir;
         system
-            "$self->{translator_path}/tmpl_process3.pl update " .
-            "-i $tmpl->{dir}/en/ " .
-            "-s $self->{path_po}/$self->{lang}$tmpl->{suffix} -r"
+            "$self->{process} update " .
+            "-i $trans->{dir}/en/ " .
+            "-s $self->{path_po}/$self->{lang}$trans->{suffix} -r " .
+            (
+                @$files
+                    ? '-f ' . join ' -f ', @$files
+                    : ''
+            )
     }
 }
 
@@ -333,33 +374,42 @@ sub update_tmpl {
 sub create_prefs {
     my $self = shift;
 
+    if ( -e $self->po_filename ) {
+        say "Preferences .po file already exists. Delete it if you want to recreate it.";
+        return;
+    }
     $self->get_po_from_prefs();
     $self->save_po();
 }
 
 
 sub create_tmpl {
-    my $self = shift;
+    my ($self, $files) = @_;
 
-    print
-        "Create templates\n";
-    while ( my ($interface, $tmpl) = each %{$self->{interface}} ) {
+    say "Create templates\n" if $self->{verbose};
+    for my $trans ( @{$self->{interface}} ) {
         print
-            "  Create templates .po files for '$interface'\n",
-            "    From: $tmpl->{dir}/en/\n",
-            "    To  : $self->{path_po}/$self->{lang}$tmpl->{suffix}\n";
+            "  Create templates .po files for '$trans->{name}'\n",
+            "    From: $trans->{dir}/en/\n",
+            "    To  : $self->{path_po}/$self->{lang}$trans->{suffix}\n"
+                if $self->{verbose};
         system
-            "$self->{translator_path}/tmpl_process3.pl create " .
-            "-i $tmpl->{dir}/en/ " .
-            "-s $self->{path_po}/$self->{lang}$tmpl->{suffix} -r"
+            "$self->{process} create " .
+            "-i $trans->{dir}/en/ " .
+            "-s $self->{path_po}/$self->{lang}$trans->{suffix} -r " .
+            (
+                @$files
+                    ? '-f ' . join ' -f ', @$files
+                    : ''
+            )
     }
 }
 
 
 sub install {
-    my $self = shift;
+    my ($self, $files) = @_;
     return unless $self->{lang};
-    $self->install_tmpl() unless $self->{pref_only};
+    $self->install_tmpl($files) unless $self->{pref_only};
     $self->install_prefs();
 }
 
@@ -367,27 +417,27 @@ sub install {
 sub get_all_langs {
     my $self = shift;
     opendir( my $dh, $self->{path_po} );
-    my @files = grep { $_ =~ /-i-opac-t-prog-v-3002000.po$/ }
+    my @files = grep { $_ =~ /-i-opac-t-prog-v-3006000.po$/ }
         readdir $dh;
-    @files = map { $_ =~ s/-i-opac-t-prog-v-3002000.po$//; $_ } @files;
+    @files = map { $_ =~ s/-i-opac-t-prog-v-3006000.po$//; $_ } @files;
 }
 
 
 sub update {
-    my $self = shift;
+    my ($self, $files) = @_;
     my @langs = $self->{lang} ? ($self->{lang}) : $self->get_all_langs();
     for my $lang ( @langs ) {
         $self->set_lang( $lang );
-        $self->update_tmpl() unless $self->{pref_only};
+        $self->update_tmpl($files) unless $self->{pref_only};
         $self->update_prefs();
     }
 }
 
 
 sub create {
-    my $self = shift;
+    my ($self, $files) = @_;
     return unless $self->{lang};
-    $self->create_tmpl() unless $self->{pref_only};
+    $self->create_tmpl($files) unless $self->{pref_only};
     $self->create_prefs();
 }