Aufgrund einer Schwäche im Parser von locales.pl darf innerhalb eines <input type...
[kivitendo-erp.git] / locale / de / locales.pl
index 580c605..6fd6e80 100755 (executable)
@@ -10,6 +10,8 @@ use POSIX;
 use FileHandle;
 use Data::Dumper;
 
+use List::Util qw(first);
+
 $| = 1;
 
 $basedir  = "../..";
@@ -62,6 +64,8 @@ if (-f 'all') {
   require "all";
 }
 
+my %old_texts = %{ $self->{texts} };
+
 # Read HTML templates.
 #%htmllocale = ();
 #@htmltemplates = <../../templates/webpages/*/*_master.html>;
@@ -120,7 +124,9 @@ sub handle_file {
 
   open FH, ">$file" or die "$! : $file";
 
-  print FH q|$self->{texts} = {
+  print FH q|#!/usr/bin/perl
+
+$self->{texts} = {
 |;
 
   foreach $key (sort keys %locale) {
@@ -188,7 +194,9 @@ $self->{subs} = {
 
 open FH, ">all" or die "$! : all";
 
-print FH q|# These are all the texts to build the translations files.
+print FH q|#!/usr/bin/perl
+
+# These are all the texts to build the translations files.
 # The file has the form of 'english text'  => 'foreign text',
 # you can add the translation in this file or in the 'missing' file
 # run locales.pl from this directory to rebuild the translation files
@@ -225,7 +233,9 @@ close FH;
 if (@missing) {
   open FH, ">missing" or die "$! : missing";
 
-  print FH q|# add the missing texts and run locales.pl to rebuild
+  print FH q|#!/usr/bin/perl
+
+# add the missing texts and run locales.pl to rebuild
 
 $missing = {
 |;
@@ -243,6 +253,38 @@ $missing = {
 
 }
 
+@lost = ();
+
+if (-f "lost") {
+  require "lost";
+  unlink "lost";
+}
+
+while (($text, $translation) = each %old_texts) {
+  next if ($alllocales{$text});
+
+  push @lost, { 'text' => $text, 'translation' => $translation };
+}
+
+if (scalar @lost) {
+  splice @lost, 0, (scalar @lost - 50) if (scalar @lost > 50);
+
+  open FH, ">lost";
+  print FH "#!/usr/bin/perl\n\n" .
+    "# The last 50 texts that have been removed.\n" .
+    "# This file will be auto-generated by locales.pl. Do not edit it.\n\n" .
+    "\@lost = (\n";
+
+  foreach $entry (@lost) {
+    $entry->{text}        =~ s/\'/\\\'/;
+    $entry->{translation} =~ s/\'/\\\'/;
+    print FH "  { 'text' => '$entry->{text}', 'translation' => '$entry->{translation}' },\n";
+  }
+
+  print FH ");\n\n1;\n";
+  close FH;
+}
+
 open(FH, "LANGUAGE");
 @language = <FH>;
 close(FH);
@@ -319,6 +361,9 @@ sub scanfile {
   my $dont_include_subs = shift;
   my $scanned_files = shift;
 
+  # sanitize file
+  $file =~ s=/+=/=g;
+
   $scanned_files = {} unless ($scanned_files);
   return if ($scanned_files->{$file});
   $scanned_files->{$file} = 1;
@@ -475,9 +520,10 @@ sub scanmenu {
 
 sub scanhtmlfile {
   local *IN;
+
   if (!defined $cached{$_[0]}) {
+    my %plugins = ( 'loaded' => { }, 'needed' => { } );
+
     open(IN, $_[0]) || die $_[0];
 
     my $copying = 0;
@@ -486,6 +532,15 @@ sub scanhtmlfile {
     while (my $line = <IN>) {
       chomp($line);
 
+      while ($line =~ m/\[\%[^\w]*use[^\w]+(\w+)[^\w]*?\%\]/gi) {
+        $plugins{loaded}->{$1} = 1;
+      }
+
+      while ($line =~ m/\[\%[^\w]*(\w+)\.\w+\(/g) {
+        my $plugin = $1;
+        $plugins{needed}->{$plugin} = 1 if (first { $_ eq $plugin } qw(HTML LxERP JavaScript MultiColumnIterator));
+      }
+
       while ("" ne $line) {
         if (!$copying) {
           if ($line =~ m|<translate>|i) {
@@ -526,6 +581,12 @@ sub scanhtmlfile {
     }
 
     close(IN);
+
+    foreach my $plugin (keys %{ $plugins{needed} }) {
+      next if ($plugins{loaded}->{$plugin});
+      print "E: " . strip_base($_[0]) . " requires the Template plugin '$plugin', but is not loaded with '[\% USE $plugin \%]'.\n";
+    }
+
     &converthtmlfile($_[0]);
   }
 
@@ -634,8 +695,10 @@ sub search_translated_htmlfiles_wo_master {
 }
 
 sub strip_base {
-  $_[0] =~ s|^../../||;
-  $_[0] =~ s|templates/webpages/||;
+  my $s =  "$_[0]";             # Create a copy of the string.
+
+  $s    =~ s|^../../||;
+  $s    =~ s|templates/webpages/||;
 
-  return $_[0];
+  return $s;
 }