Merge branch 'master' of github.com:kivitendo/kivitendo-erp
[kivitendo-erp.git] / scripts / locales.pl
index 8105abd..cd5fe41 100755 (executable)
@@ -9,6 +9,11 @@
 use utf8;
 use strict;
 
+BEGIN {
+  unshift(@INC, 'modules/override'); # Use our own versions of various modules (e.g. YAML).
+  push   (@INC, 'modules/fallback'); # Only use our own versions of modules if there's no system version.
+}
+
 use Carp;
 use Cwd;
 use Data::Dumper;
@@ -18,7 +23,6 @@ use FileHandle;
 use Getopt::Long;
 use IO::Dir;
 use List::Util qw(first);
-use POSIX;
 use Pod::Usage;
 
 $OUTPUT_AUTOFLUSH = 1;
@@ -35,9 +39,7 @@ my $basedir      = "../..";
 my $locales_dir  = ".";
 my $bindir       = "$basedir/bin/mozilla";
 my @progdirs     = ( "$basedir/SL" );
-my $dbupdir      = "$basedir/sql/Pg-upgrade";
-my $dbupdir2     = "$basedir/sql/Pg-upgrade2";
-my $menufile     = "menu.ini";
+my @menufiles    = <${basedir}/menus/*.ini>;
 my @javascript_dirs = ($basedir .'/js', $basedir .'/templates/webpages');
 my $javascript_output_dir = $basedir .'/js';
 my $submitsearch = qr/type\s*=\s*[\"\']?submit/i;
@@ -45,6 +47,10 @@ our $self        = {};
 our $missing     = {};
 our @lost        = ();
 
+my %ignore_unused_templates = (
+  map { $_ => 1 } qw(ct/testpage.html generic/autocomplete.html oe/periodic_invoices_email.txt part/testpage.html t/render.html t/render.js)
+);
+
 my (%referenced_html_files, %locale, %htmllocale, %alllocales, %cached, %submit, %jslocale);
 my ($ALL_HEADER, $MISSING_HEADER, $LOST_HEADER);
 
@@ -87,22 +93,21 @@ my @customfiles  = grep /_custom/, @bindir_files;
 push @progfiles, map { m:^(.+)/([^/]+)$:; [ $2, $1 ] } grep { /\.pm$/ } map { find_files($_) } @progdirs;
 
 # put customized files into @customfiles
-my (@menufiles, %dir_h);
+my %dir_h;
 
 if ($opt_n) {
   @customfiles = ();
-  @menufiles   = ($menufile);
 } else {
   tie %dir_h, 'IO::Dir', $basedir;
-  @menufiles = map { "$basedir/$_" } grep { /.*?_$menufile$/ } keys %dir_h;
-  unshift @menufiles, "$basedir/$menufile";
+  push @menufiles, map { "$basedir/$_" } grep { /.*_menu.ini$/ } keys %dir_h;
 }
 
-tie %dir_h, 'IO::Dir', $dbupdir;
-my @dbplfiles = grep { /\.pl$/ } keys %dir_h;
-
-tie %dir_h, 'IO::Dir', $dbupdir2;
-my @dbplfiles2 = grep { /\.pl$/ } keys %dir_h;
+my @dbplfiles;
+foreach my $sub_dir ("Pg-upgrade2", "Pg-upgrade2-auth") {
+  my $dir = "$basedir/sql/$sub_dir";
+  tie %dir_h, 'IO::Dir', $dir;
+  push @dbplfiles, map { [ $_, $dir ] } grep { /\.pl$/ } keys %dir_h;
+}
 
 # slurp the translations in
 if (-f "$locales_dir/all") {
@@ -117,14 +122,10 @@ if (-f "$locales_dir/lost") {
   unlink "$locales_dir/lost";
 }
 
-my $charset = slurp("$locales_dir/charset") || 'utf-8';
-chomp $charset;
-
 my %old_texts = %{ $self->{texts} || {} };
 
 handle_file(@{ $_ })       for @progfiles;
-handle_file($_, $dbupdir)  for @dbplfiles;
-handle_file($_, $dbupdir2) for @dbplfiles2;
+handle_file(@{ $_ })       for @dbplfiles;
 scanmenu($_)               for @menufiles;
 
 for my $file_name (map({find_files($_)} @javascript_dirs)) {
@@ -166,6 +167,14 @@ close($js_file);
 my @new_missing = grep { !$self->{texts}{$_} } sort keys %alllocales;
 
 if (@new_missing) {
+  if ($opt_c) {
+    my %existing_lc = map { (lc $_ => $_) } grep { $self->{texts}->{$_} } keys %{ $self->{texts} };
+    foreach my $entry (@new_missing) {
+      my $other = $existing_lc{lc $entry};
+      print "W: No entry for '${entry}' exists, but there is one with different case: '${other}'\n" if $other;
+    }
+  }
+
   generate_file(
     file      => "$locales_dir/missing",
     header    => $MISSING_HEADER,
@@ -228,15 +237,20 @@ EOL
 sub parse_args {
   my ($help, $man);
 
+  my ($opt_no_c, $ignore_for_compatiblity);
+
   GetOptions(
     'no-custom-files' => \$opt_n,
-    'check-files'     => \$opt_c,
+    'check-files'     => \$ignore_for_compatiblity,
+    'no-check-files'  => \$opt_no_c,
     'verbose'         => \$opt_v,
     'help'            => \$help,
     'man'             => \$man,
     'debug'           => \$debug,
   );
 
+  $opt_c = !$opt_no_c;
+
   if ($help) {
     pod2usage(1);
     exit 0;
@@ -434,8 +448,11 @@ sub scanfile {
           }
         }
 
-        my ($found) = / (?: locale->text | \b t8 ) \b .*? \(/x;
-        $postmatch = "$'";
+        my $found;
+        if (/ (?: locale->text | \b t8 ) \b .*? \(/x) {
+          $found     = 1;
+          $postmatch = "$'";
+        }
 
         if ($found) {
           my $string;
@@ -621,7 +638,7 @@ sub scan_javascript_file {
 
   while( my $line = readline($fh) ) {
     while( $line =~ m/
-                    kivi.t8
+                    \bk(?:ivi)?.t8
                     \s*
                     \(
                     \s*
@@ -649,7 +666,7 @@ sub search_unused_htmlfiles {
       if (-d $entry) {
         push @unscanned_dirs, $entry;
 
-      } elsif (($entry =~ /_master.html$/) && -f $entry && !$referenced_html_files{$entry}) {
+      } elsif (!$ignore_unused_templates{strip_base($entry)} && -f $entry && !$referenced_html_files{$entry}) {
         print "W: unused HTML template: " . strip_base($entry) . "\n";
 
       }
@@ -699,10 +716,7 @@ sub generate_file {
 
   open my $fh, '>:encoding(utf8)', $file or die "$! : $file";
 
-  $charset =~ s/\r?\n//g;
-  my $emacs_charset = lc $charset;
-
-  print $fh "#!/usr/bin/perl\n# -*- coding: $emacs_charset; -*-\n# vim: fenc=$charset\n\nuse utf8;\n\n";
+  print $fh "#!/usr/bin/perl\n# -*- coding: utf-8; -*-\n# vim: fenc=utf-8\n\nuse utf8;\n\n";
   print $fh $header, "\n" if $header;
   print $fh "$data_name = $delim[0]\n" if $data_name;
 
@@ -712,11 +726,6 @@ sub generate_file {
   close $fh;
 }
 
-sub slurp {
-  my $file = shift;
-  do { local ( @ARGV, $/ ) = $file; <> }
-}
-
 __END__
 
 =head1 NAME