X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/880bc0d2116d86ec2554eddc9d6fdf68f28f3aeb..4bed72f:/scripts/locales.pl?ds=sidebyside diff --git a/scripts/locales.pl b/scripts/locales.pl index f0f96b51e..b6665588a 100755 --- a/scripts/locales.pl +++ b/scripts/locales.pl @@ -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"; @@ -36,9 +38,14 @@ my @progdirs = ( "$basedir/SL" ); 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 = {}; +our @lost = (); -my (%referenced_html_files, %locale, %htmllocale, %alllocales, %cached, %submit); +my (%referenced_html_files, %locale, %htmllocale, %alllocales, %cached, %submit, %jslocale); my ($ALL_HEADER, $MISSING_HEADER, $LOST_HEADER); init(); @@ -64,6 +71,15 @@ sub find_files { return @files; } +sub merge_texts { +# overwrite existing entries with the ones from 'missing' + $self->{texts}->{$_} = $missing->{$_} for grep { $missing->{$_} } keys %alllocales; + + # try to set missing entries from lost ones + my %lost_by_text = map { ($_->{text} => $_->{translation}) } @lost; + $self->{texts}->{$_} = $lost_by_text{$_} for grep { !$self->{texts}{$_} } keys %alllocales; +} + my @bindir_files = find_files($bindir); my @progfiles = map { m:^(.+)/([^/]+)$:; [ $2, $1 ] } grep { /\.pl$/ && !/_custom/ } @bindir_files; my @customfiles = grep /_custom/, @bindir_files; @@ -78,8 +94,8 @@ if ($opt_n) { @menufiles = ($menufile); } else { tie %dir_h, 'IO::Dir', $basedir; - @menufiles = grep { /.*?_$menufile$/ } keys %dir_h; - unshift @menufiles, $menufile; + @menufiles = map { "$basedir/$_" } grep { /.*?_$menufile$/ } keys %dir_h; + unshift @menufiles, "$basedir/$menufile"; } tie %dir_h, 'IO::Dir', $dbupdir; @@ -89,11 +105,6 @@ tie %dir_h, 'IO::Dir', $dbupdir2; my @dbplfiles2 = grep { /\.pl$/ } keys %dir_h; # slurp the translations in -our $self = {}; -our $missing = {}; -our @missing = (); -our @lost = (); - if (-f "$locales_dir/all") { require "$locales_dir/all"; } @@ -114,6 +125,14 @@ my %old_texts = %{ $self->{texts} || {} }; handle_file(@{ $_ }) for @progfiles; handle_file($_, $dbupdir) for @dbplfiles; handle_file($_, $dbupdir2) for @dbplfiles2; +scanmenu($_) for @menufiles; + +for my $file_name (map({find_files($_)} @javascript_dirs)) { + scan_javascript_file($file_name); +} + +# merge entries to translate with entries from files 'missing' and 'lost' +merge_texts(); # generate all generate_file( @@ -123,15 +142,35 @@ generate_file( data_sub => sub { _print_line($_, $self->{texts}{$_}, @_) for sort keys %alllocales }, ); +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"); +print $js_file ('});'."\n"); +close($js_file); + + foreach my $text (keys %$missing) { + if ($locale{$text} || $htmllocale{$text}) { + unless ($self->{texts}{$text}) { + $self->{texts}{$text} = $missing->{$text}; + } + } + } + + # calc and generate missing -push @missing, grep { !$self->{texts}{$_} } sort keys %alllocales; +my @new_missing = grep { !$self->{texts}{$_} } sort keys %alllocales; -if (@missing) { +if (@new_missing) { generate_file( file => "$locales_dir/missing", header => $MISSING_HEADER, data_name => '$missing', - data_sub => sub { _print_line($_, '', @_) for @missing }, + data_sub => sub { _print_line($_, '', @_) for @new_missing }, ); } @@ -160,7 +199,7 @@ chomp $trlanguage; search_unused_htmlfiles() if $opt_c; my $count = scalar keys %alllocales; -my $notext = scalar @missing; +my $notext = scalar @new_missing; my $per = sprintf("%.1f", ($count - $notext) / $count * 100); print "\n$trlanguage - ${per}%"; print " - $notext/$count missing" if $notext; @@ -213,6 +252,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; } @@ -227,6 +269,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 { @@ -247,14 +292,6 @@ sub handle_file { } $file =~ s/\.pl//; - - foreach my $text (keys %$missing) { - if ($locale{$text} || $htmllocale{$text}) { - unless ($self->{texts}{$text}) { - $self->{texts}{$text} = $missing->{$text}; - } - } - } } sub extract_text_between_parenthesis { @@ -346,17 +383,32 @@ sub scanfile { $cached{$file}{scannosubs}{"../../SL/${module}.pm"} = 1; } + # Some calls to render() are split over multiple lines. Deal + # with that. + while (/(?:parse_html_template2?|render)\s*\( *$/) { + $_ .= <$fh>; + chomp; + } + # is this a template call? if (/(?:parse_html_template2?|render)\s*\(\s*[\"\']([\w\/]+)\s*[\"\']/) { - my $newfile = "$basedir/templates/webpages/$1.html"; + my $new_file_base = "$basedir/templates/webpages/$1."; if (/parse_html_template2/) { - print "E: " . strip_base($file) . " is still using 'parse_html_template2' for " . strip_base($newfile) . ".\n"; + print "E: " . strip_base($file) . " is still using 'parse_html_template2' for " . strip_base("${new_file_base}html") . ".\n"; + } + + my $found_one = 0; + foreach my $ext (qw(html js json)) { + my $new_file = "${new_file_base}${ext}"; + if (-f $new_file) { + $cached{$file}{scanh}{$new_file} = 1; + print "." if $opt_v; + $found_one = 1; + } } - if (-f $newfile) { - $cached{$file}{scanh}{$newfile} = 1; - print "." if $opt_v; - } elsif ($opt_c) { - print "W: missing HTML template: " . strip_base($newfile) . " (referenced from " . strip_base($file) . ")\n"; + + if ($opt_c && !$found_one) { + print "W: missing HTML template: " . strip_base($new_file_base) . "{html,json,js} (referenced from " . strip_base($file) . ")\n"; } } @@ -365,7 +417,7 @@ sub scanfile { while ($rc) { if (/Locale/) { unless (/^use /) { - my ($null, $country) = split /,/; + my ($null, $country) = split(/,/); $country =~ s/^ +[\"\']//; $country =~ s/[\"\'].*//; } @@ -409,7 +461,7 @@ sub scanfile { } # exit loop if there are no more locales on this line - ($rc) = ($postmatch =~ /locale->text/); + ($rc) = ($postmatch =~ /locale->text | \b t8/x); if ( ($postmatch =~ />/) || (!$found && ($sub_line_no != $line_no) && />/)) { @@ -484,9 +536,11 @@ sub scanhtmlfile { while ($line =~ m/\[\%[^\w]*(\w+)\.\w+\(/g) { my $plugin = $1; - $plugins{needed}->{$plugin} = 1 if (first { $_ eq $plugin } qw(HTML LxERP JavaScript MultiColumnIterator L)); + $plugins{needed}->{$plugin} = 1 if (first { $_ eq $plugin } qw(HTML LxERP JavaScript JSON L P)); } + $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:: @@ -557,6 +611,31 @@ sub scanhtmlfile { $referenced_html_files{$_} = 1 for keys %{$cached{$file}{scanh}}; } +sub scan_javascript_file { + my ($file) = @_; + + open(my $fh, $file) || die('can not open file: '. $file); + + while( my $line = readline($fh) ) { + while( $line =~ m/ + kivi.t8 + \s* + \( + \s* + ([\'\"]) + (.*?) + (?