Merge branch 'currency'
[kivitendo-erp.git] / scripts / locales.pl
index 5e90423..93b34fd 100755 (executable)
@@ -10,6 +10,7 @@ use utf8;
 use strict;
 
 use Carp;
+use Cwd;
 use Data::Dumper;
 use English;
 use File::Slurp qw(slurp);
@@ -29,6 +30,7 @@ my $debug  = 0;
 
 parse_args();
 
+my $locale;
 my $basedir      = "../..";
 my $locales_dir  = ".";
 my $bindir       = "$basedir/bin/mozilla";
@@ -37,6 +39,7 @@ my $dbupdir      = "$basedir/sql/Pg-upgrade";
 my $dbupdir2     = "$basedir/sql/Pg-upgrade2";
 my $menufile     = "menu.ini";
 my @javascript_dirs = ($basedir .'/js', $basedir .'/templates/webpages');
+my $javascript_output_dir = $basedir .'/js';
 my $submitsearch = qr/type\s*=\s*[\"\']?submit/i;
 our $self        = {};
 our $missing     = {};
@@ -139,14 +142,15 @@ generate_file(
   data_sub  => sub { _print_line($_, $self->{texts}{$_}, @_) for sort keys %alllocales },
 );
 
-open(my $js_file, '>:encoding(utf8)', $locales_dir .'/js.js') || die;
-print $js_file '{';
+open(my $js_file, '>:encoding(utf8)', $javascript_output_dir .'/locale/'. $locale .'.js') || die;
+print $js_file 'namespace("kivi").setupLocale({';
 my $first_entry = 1;
 for my $key (sort(keys(%jslocale))) {
   print $js_file ((!$first_entry ? ',' : '') ."\n". _double_quote($key) .':'. _double_quote($self->{texts}{$key}));
   $first_entry = 0;
 }
-print $js_file ("\n".'}'."\n");
+print $js_file ("\n");
+print $js_file ('});'."\n");
 close($js_file);
 
   foreach my $text (keys %$missing) {
@@ -162,6 +166,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,
@@ -248,6 +260,9 @@ sub parse_args {
     my $ok  = 0;
     foreach my $dir ("../locale/$arg", "locale/$arg", "../$arg", $arg) {
       next unless -d $dir && -f "$dir/all" && -f "$dir/LANGUAGE";
+
+      $locale = $arg;
+
       $ok = chdir $dir;
       last;
     }
@@ -262,6 +277,9 @@ sub parse_args {
       .   "and no locale directory name was given.\n";
     exit 1;
   }
+
+  $locale ||=  (grep { $_ } split m:/:, getcwd())[-1];
+  $locale   =~ s/\.+$//;
 }
 
 sub handle_file {
@@ -509,88 +527,91 @@ sub scanhtmlfile {
 
   my $file = shift;
 
-  if (!defined $cached{$file}) {
-    my %plugins = ( 'loaded' => { }, 'needed' => { } );
-
-    open(IN, $file) || die $file;
+  return if defined $cached{$file};
 
-    my $copying  = 0;
-    my $issubmit = 0;
-    my $text     = "";
-    while (my $line = <IN>) {
-      chomp($line);
+  my %plugins = ( 'loaded' => { }, 'needed' => { } );
 
-      while ($line =~ m/\[\%[^\w]*use[^\w]+(\w+)[^\w]*?\%\]/gi) {
-        $plugins{loaded}->{$1} = 1;
-      }
+  if (!open(IN, $file)) {
+    print "E: template file '$file' not found\n";
+    return;
+  }
 
-      while ($line =~ m/\[\%[^\w]*(\w+)\.\w+\(/g) {
-        my $plugin = $1;
-        $plugins{needed}->{$plugin} = 1 if (first { $_ eq $plugin } qw(HTML LxERP JavaScript JSON L P));
-      }
+  my $copying  = 0;
+  my $issubmit = 0;
+  my $text     = "";
+  while (my $line = <IN>) {
+    chomp($line);
 
-      $plugins{needed}->{T8} = 1 if $line =~ m/\[\%.*\|.*\$T8/;
-
-      while ($line =~ m/(?:             # Start von Variante 1: LxERP.t8('...'); ohne darumliegende [% ... %]-Tags
-                          (LxERP\.t8)\( #   LxERP.t8(                             ::Parameter $1::
-                          ([\'\"])      #   Anfang des zu übersetzenden Strings   ::Parameter $2::
-                          (.*?)         #   Der zu übersetzende String            ::Parameter $3::
-                          (?<!\\)\2     #   Ende des zu übersetzenden Strings
-                        |               # Start von Variante 2: [% '...' | $T8 %]
-                          \[\%          #   Template-Start-Tag
-                          [\-~#]?       #   Whitespace-Unterdrückung
-                          \s*           #   Optional beliebig viele Whitespace
-                          ([\'\"])      #   Anfang des zu übersetzenden Strings   ::Parameter $4::
-                          (.*?)         #   Der zu übersetzende String            ::Parameter $5::
-                          (?<!\\)\4     #   Ende des zu übersetzenden Strings
-                          \s*\|\s*      #   Pipe-Zeichen mit optionalen Whitespace davor und danach
-                          (\$T8)        #   Filteraufruf                          ::Parameter $6::
-                          .*?           #   Optionale Argumente für den Filter
-                          \s*           #   Whitespaces
-                          [\-~#]?       #   Whitespace-Unterdrückung
-                          \%\]          #   Template-Ende-Tag
-                        )
-                       /ix) {
-        my $module = $1 || $6;
-        my $string = $3 || $5;
-        print "Found filter >>>$string<<<\n" if $debug;
-        substr $line, $LAST_MATCH_START[1], $LAST_MATCH_END[0] - $LAST_MATCH_START[0], '';
-
-        $string                         = unescape_template_string($string);
-        $cached{$file}{all}{$string}    = 1;
-        $cached{$file}{html}{$string}   = 1;
-        $cached{$file}{submit}{$string} = 1 if $PREMATCH =~ /$submitsearch/;
-        $plugins{needed}->{T8}          = 1 if $module eq '$T8';
-        $plugins{needed}->{LxERP}       = 1 if $module eq 'LxERP.t8';
-      }
+    while ($line =~ m/\[\%[^\w]*use[^\w]+(\w+)[^\w]*?\%\]/gi) {
+      $plugins{loaded}->{$1} = 1;
+    }
 
-      while ($line =~ m/\[\%          # Template-Start-Tag
-                        [\-~#]?       # Whitespace-Unterdrückung
-                        \s*           # Optional beliebig viele Whitespace
-                        (?:           # Die erkannten Template-Direktiven
-                          PROCESS
-                        |
-                          INCLUDE
-                        )
-                        \s+           # Mindestens ein Whitespace
-                        [\'\"]?       # Anfang des Dateinamens
-                        ([^\s]+)      # Beliebig viele Nicht-Whitespaces -- Dateiname
-                        \.html        # Endung ".html", ansonsten kann es der Name eines Blocks sein
-                       /ix) {
-        my $new_file_name = "$basedir/templates/webpages/$1.html";
-        $cached{$file}{scanh}{$new_file_name} = 1;
-        substr $line, $LAST_MATCH_START[1], $LAST_MATCH_END[0] - $LAST_MATCH_START[0], '';
-      }
+    while ($line =~ m/\[\%[^\w]*(\w+)\.\w+\(/g) {
+      my $plugin = $1;
+      $plugins{needed}->{$plugin} = 1 if (first { $_ eq $plugin } qw(HTML LxERP JavaScript JSON L P));
     }
 
-    close(IN);
+    $plugins{needed}->{T8} = 1 if $line =~ m/\[\%.*\|.*\$T8/;
+
+    while ($line =~ m/(?:             # Start von Variante 1: LxERP.t8('...'); ohne darumliegende [% ... %]-Tags
+                        (LxERP\.t8)\( #   LxERP.t8(                             ::Parameter $1::
+                        ([\'\"])      #   Anfang des zu übersetzenden Strings   ::Parameter $2::
+                        (.*?)         #   Der zu übersetzende String            ::Parameter $3::
+                        (?<!\\)\2     #   Ende des zu übersetzenden Strings
+                      |               # Start von Variante 2: [% '...' | $T8 %]
+                        \[\%          #   Template-Start-Tag
+                        [\-~#]?       #   Whitespace-Unterdrückung
+                        \s*           #   Optional beliebig viele Whitespace
+                        ([\'\"])      #   Anfang des zu übersetzenden Strings   ::Parameter $4::
+                        (.*?)         #   Der zu übersetzende String            ::Parameter $5::
+                        (?<!\\)\4     #   Ende des zu übersetzenden Strings
+                        \s*\|\s*      #   Pipe-Zeichen mit optionalen Whitespace davor und danach
+                        (\$T8)        #   Filteraufruf                          ::Parameter $6::
+                        .*?           #   Optionale Argumente für den Filter
+                        \s*           #   Whitespaces
+                        [\-~#]?       #   Whitespace-Unterdrückung
+                        \%\]          #   Template-Ende-Tag
+                      )
+                     /ix) {
+      my $module = $1 || $6;
+      my $string = $3 || $5;
+      print "Found filter >>>$string<<<\n" if $debug;
+      substr $line, $LAST_MATCH_START[1], $LAST_MATCH_END[0] - $LAST_MATCH_START[0], '';
+
+      $string                         = unescape_template_string($string);
+      $cached{$file}{all}{$string}    = 1;
+      $cached{$file}{html}{$string}   = 1;
+      $cached{$file}{submit}{$string} = 1 if $PREMATCH =~ /$submitsearch/;
+      $plugins{needed}->{T8}          = 1 if $module eq '$T8';
+      $plugins{needed}->{LxERP}       = 1 if $module eq 'LxERP.t8';
+    }
 
-    foreach my $plugin (keys %{ $plugins{needed} }) {
-      next if ($plugins{loaded}->{$plugin});
-      print "E: " . strip_base($file) . " requires the Template plugin '$plugin', but is not loaded with '[\% USE $plugin \%]'.\n";
+    while ($line =~ m/\[\%          # Template-Start-Tag
+                      [\-~#]?       # Whitespace-Unterdrückung
+                      \s*           # Optional beliebig viele Whitespace
+                      (?:           # Die erkannten Template-Direktiven
+                        PROCESS
+                      |
+                        INCLUDE
+                      )
+                      \s+           # Mindestens ein Whitespace
+                      [\'\"]?       # Anfang des Dateinamens
+                      ([^\s]+)      # Beliebig viele Nicht-Whitespaces -- Dateiname
+                      \.html        # Endung ".html", ansonsten kann es der Name eines Blocks sein
+                     /ix) {
+      my $new_file_name = "$basedir/templates/webpages/$1.html";
+      $cached{$file}{scanh}{$new_file_name} = 1;
+      substr $line, $LAST_MATCH_START[1], $LAST_MATCH_END[0] - $LAST_MATCH_START[0], '';
     }
   }
 
+  close(IN);
+
+  foreach my $plugin (keys %{ $plugins{needed} }) {
+    next if ($plugins{loaded}->{$plugin});
+    print "E: " . strip_base($file) . " requires the Template plugin '$plugin', but is not loaded with '[\% USE $plugin \%]'.\n";
+  }
+
   # copy back into global arrays
   $alllocales{$_} = 1            for keys %{$cached{$file}{all}};
   $locale{$_}     = 1            for keys %{$cached{$file}{html}};