#!/usr/bin/perl
# -n do not include custom_ scripts
+# -v verbose mode, shows progress stuff
+# this version of locles processes not only all required .pl files
+# but also all parse_html_templated files.
+
+use POSIX;
use FileHandle;
+use Data::Dumper;
+
+$| = 1;
$basedir = "../..";
$bindir = "$basedir/bin/mozilla";
+$dbupdir = "$basedir/sql/Pg-upgrade";
+$dbupdir2 = "$basedir/sql/Pg-upgrade2";
$menufile = "menu.ini";
+$submitsearch = qr/type\s*=\s*[\"\']?submit/i;
foreach $item (@ARGV) {
$item =~ s/-//g;
unshift @menufiles, $menufile;
}
+opendir DIR, $dbupdir or die "$!";
+@dbplfiles = grep { /\.pl$/ } readdir DIR;
+closedir DIR;
+
+opendir DIR, $dbupdir2 or die "$!";
+@dbplfiles2 = grep { /\.pl$/ } readdir DIR;
+closedir DIR;
+
# slurp the translations in
if (-f 'all') {
require "all";
}
-foreach $file (@progfiles) {
+# Read HTML templates.
+#%htmllocale = ();
+#@htmltemplates = <../../templates/webpages/*/*_master.html>;
+#foreach $file (@htmltemplates) {
+# scanhtmlfile($file);
+#}
+map({ handle_file($_, $bindir); } @progfiles);
+map({ handle_file($_, $dbupdir); } @dbplfiles);
+map({ handle_file($_, $dbupdir2); } @dbplfiles2);
+
+sub handle_file {
+ my ($file, $dir) = @_;
+ print "\n$file" if $arg{v};
%locale = ();
%submit = ();
%subrt = ();
- &scanfile("$bindir/$file");
+ &scanfile("$dir/$file");
# scan custom_{module}.pl or {login}_{module}.pl files
foreach $customfile (@customfiles) {
if ($customfile =~ /_$file/) {
- if (-f "$bindir/$customfile") {
- &scanfile("$bindir/$customfile");
+ if (-f "$dir/$customfile") {
+ &scanfile("$dir/$customfile");
}
}
}
if ($file eq 'menunew.pl') {
foreach $item (@menufiles) {
&scanmenu("$basedir/$item");
+ print "." if $arg{v};
}
}
unlink 'missing';
foreach $text (keys %$missing) {
- if ($locale{$text}) {
- unless ($self{texts}{$text}) {
- $self{texts}{$text} = $missing->{$text};
+ if ($locale{$text} || $htmllocale{$text}) {
+ unless ($self->{texts}{$text}) {
+ $self->{texts}{$text} = $missing->{$text};
}
}
}
open FH, ">$file" or die "$! : $file";
- print FH q|$self{texts} = {
+ print FH q|$self->{texts} = {
|;
foreach $key (sort keys %locale) {
- if ($self{texts}{$key}) {
- $text = $self{texts}{$key};
+ if ($self->{texts}{$key}) {
+ $text = $self->{texts}{$key};
} else {
$text = $key;
}
print FH q|};
-$self{subs} = {
+$self->{subs} = {
|;
foreach $key (sort keys %subrt) {
}
foreach $key (sort keys %submit) {
- $text = ($self{texts}{$key}) ? $self{texts}{$key} : $key;
+ $text = ($self->{texts}{$key}) ? $self->{texts}{$key} : $key;
$text =~ s/'/\\'/g;
$text =~ s/\\$/\\\\/;
|;
close FH;
+
}
+#foreach $file (@htmltemplates) {
+# converthtmlfile($file);
+#}
+
# now print out all
open FH, ">all" or die "$! : all";
# you can add the translation in this file or in the 'missing' file
# run locales.pl from this directory to rebuild the translation files
-$self{texts} = {
+$self->{texts} = {
|;
foreach $key (sort keys %alllocales) {
- $text = $self{texts}{$key};
+ $text = $self->{texts}{$key};
$count++;
chomp $trlanguage;
$per = sprintf("%.1f", ($count - $notext) / $count * 100);
-print "\n$trlanguage - ${per}%\n";
+print "\n$trlanguage - ${per}%";
+print " - $notext missing" if $notext;
+print "\n";
exit;
sub scanfile {
my $file = shift;
+ my $dont_include_subs = shift;
+ my $scanned_files = shift;
- return unless (-f "$file");
+ $scanned_files = {} unless ($scanned_files);
+ return if ($scanned_files->{$file});
+ $scanned_files->{$file} = 1;
- my $fh = new FileHandle;
- open $fh, "$file" or die "$! : $file";
+ if (!defined $cached{$file}) {
- my ($is_submit, $line_no, $sub_line_no) = (0, 0, 0);
+ return unless (-f "$file");
- while (<$fh>) {
- $line_no++;
+ my $fh = new FileHandle;
+ open $fh, "$file" or die "$! : $file";
- # is this another file
- if (/require\s+\W.*\.pl/) {
- my $newfile = $&;
- $newfile =~ s/require\s+\W//;
- $newfile =~ s/\$form->{path}\///;
- &scanfile("$bindir/$newfile");
- }
+ my ($is_submit, $line_no, $sub_line_no) = (0, 0, 0);
- # is this a sub ?
- if (/^sub /) {
- ($null, $subrt) = split / +/;
- $subrt{$subrt} = 1;
- next;
- }
+ while (<$fh>) {
+ $line_no++;
- my $rc = 1;
+ # is this another file
+ if (/require\s+\W.*\.pl/) {
+ my $newfile = $&;
+ $newfile =~ s/require\s+\W//;
+ $newfile =~ s/\$form->{path}\///;
+# &scanfile("$bindir/$newfile", 0, $scanned_files);
+ $cached{$file}{scan}{"$bindir/$newfile"} = 1;
+ } elsif (/use\s+SL::(.*?);/) {
+# &scanfile("../../SL/${1}.pm", 1, $scanned_files);
+ $cached{$file}{scannosubs}{"../../SL/${1}.pm"} = 1;
+ }
- while ($rc) {
- if (/Locale/) {
- unless (/^use /) {
- my ($null, $country) = split /,/;
- $country =~ s/^ +[\"\']//;
- $country =~ s/[\"\'].*//;
+ # is this a template call?
+ if (/parse_html_template\s*\(\s*[\"\']([\w\/]+)/) {
+ my $newfile = "$basedir/templates/webpages/$1_master.html";
+ if (-f $newfile) {
+# &scanhtmlfile($newfile);
+# &converthtmlfile($newfile);
+ $cached{$file}{scanh}{$newfile} = 1;
+ print "." if $arg{v};
}
}
- my $postmatch = "";
+ # is this a sub ?
+ if (/^sub /) {
+ next if ($dont_include_subs);
+ ($null, $subrt) = split / +/;
+# $subrt{$subrt} = 1;
+ $cached{$file}{subr}{$subrt} = 1;
+ next;
+ }
+
+ my $rc = 1;
- # is it a submit button before $locale->
- if (/type\s*=\s*submit/i) {
- $postmatch = $';
- if ($` !~ /\$locale->text/) {
- $is_submit = 1;
- $sub_line_no = $line_no;
+ while ($rc) {
+ if (/Locale/) {
+ unless (/^use /) {
+ my ($null, $country) = split /,/;
+ $country =~ s/^ +[\"\']//;
+ $country =~ s/[\"\'].*//;
+ }
+ }
+
+ my $postmatch = "";
+
+ # is it a submit button before $locale->
+ if (/$submitsearch/) {
+ $postmatch = "$'";
+ if ($` !~ /locale->text/) {
+ $is_submit = 1;
+ $sub_line_no = $line_no;
+ }
}
- }
- my ($found) = /\$locale->text.*?\(/;
- my $postmatch = $';
+ my ($found) = /locale->text.*?\(/;
+ my $postmatch = "$'";
- if ($found) {
- my $string;
- ($string, $_) = extract_text_between_parenthesis($fh, $postmatch);
- $postmatch = $_;
+ if ($found) {
+ my $string;
+ ($string, $_) = extract_text_between_parenthesis($fh, $postmatch);
+ $postmatch = $_;
- # if there is no $ in the string record it
- unless (($string =~ /\$\D.*/) || ("" eq $string)) {
+ # if there is no $ in the string record it
+ unless (($string =~ /\$\D.*/) || ("" eq $string)) {
- # this guarantees one instance of string
- $locale{$string} = 1;
+ # this guarantees one instance of string
+# $locale{$string} = 1;
+ $cached{$file}{locale}{$string} = 1;
- # this one is for all the locales
- $alllocales{$string} = 1;
+ # this one is for all the locales
+# $alllocales{$string} = 1;
+ $cached{$file}{all}{$string} = 1;
- # is it a submit button before $locale->
- if ($is_submit) {
- $submit{$string} = 1;
+ # is it a submit button before $locale->
+ if ($is_submit) {
+# $submit{$string} = 1;
+ $cached{$file}{submit}{$string} = 1;
+ }
}
+ } elsif ($postmatch =~ />/) {
+ $is_submit = 0;
}
- } elsif ($postmatch =~ />/) {
- $is_submit = 0;
- }
-
- # exit loop if there are no more locales on this line
- ($rc) = ($postmatch =~ /\$locale->text/);
- # strip text
- s/^.*?\$locale->text.*?\)//;
+ # exit loop if there are no more locales on this line
+ ($rc) = ($postmatch =~ /locale->text/);
- if ( ($postmatch =~ />/)
- || (!$found && ($sub_line_no != $line_no) && />/)) {
- $is_submit = 0;
+ if ( ($postmatch =~ />/)
+ || (!$found && ($sub_line_no != $line_no) && />/)) {
+ $is_submit = 0;
+ }
}
}
- }
- close($fh);
+ close($fh);
+
+ }
+ map { $alllocales{$_} = 1 } keys %{$cached{$file}{all}};
+ map { $locale{$_} = 1 } keys %{$cached{$file}{locale}};
+ map { $submit{$_} = 1 } keys %{$cached{$file}{submit}};
+ map { $subrt{$_} = 1 } keys %{$cached{$file}{subr}};
+ map { &scanfile($_, 0, $scanned_files) } keys %{$cached{$file}{scan}};
+ map { &scanfile($_, 1, $scanned_files) } keys %{$cached{$file}{scannosubs}};
+ map { &scanhtmlfile($_) } keys %{$cached{$file}{scanh}};
}
sub scanmenu {
}
+sub scanhtmlfile {
+ local *IN;
+
+ if (!defined $cached{$_[0]}) {
+
+ open(IN, $_[0]) || die $_[0];
+
+ my $copying = 0;
+ my $issubmit = 0;
+ my $text = "";
+ while (my $line = <IN>) {
+ chomp($line);
+
+ while ("" ne $line) {
+ if (!$copying) {
+ if ($line =~ m|<translate>|i) {
+ my $eom = $+[0];
+ if ($` =~ /$submitsearch/) {
+ $issubmit = 1
+ }
+ substr($line, 0, $eom) = "";
+ $copying = 1;
+ } else {
+ $line = "";
+ }
+
+ } else {
+ if ($line =~ m|</translate>|i) {
+ $text .= $`;
+ substr($line, 0, $+[0]) = "";
+ $text =~ s/\s+/ /g;
+
+ $copying = 0;
+ if ($issubmit) {
+ # $submit{$text} = 1;
+ $cached{$_[0]}{submit}{$text} = 1;
+ $issubmit = 0;
+ }
+ # $alllocales{$text} = 1;
+ $cached{$_[0]}{all}{$text} = 1;
+ # $htmllocale{$text} = 1;
+ $cached{$_[0]}{html}{$text} = 1;
+ $text = "";
+
+ } else {
+ $text .= $line;
+ $line = "";
+ }
+ }
+ }
+ }
+
+ close(IN);
+ &converthtmlfile($_[0]);
+ }
+
+ # copy back into global arrays
+ map { $alllocales{$_} = 1 } keys %{$cached{$_[0]}{all}};
+ map { $htmllocales{$_} = 1 } keys %{$cached{$_[0]}{html}};
+ map { $submit{$_} = 1 } keys %{$cached{$_[0]}{submit}};
+}
+
+sub converthtmlfile {
+ local *IN;
+ local *OUT;
+
+ my $file = shift;
+
+ open(IN, $file) || die;
+
+ my $langcode = (split("/", getcwd()))[-1];
+ $file =~ s/_master.html$/_${langcode}.html/;
+
+ open(OUT, ">$file") || die;
+
+ my $copying = 0;
+ my $text = "";
+ while (my $line = <IN>) {
+ chomp($line);
+ if ("" eq $line) {
+ print(OUT "\n");
+ next;
+ }
+
+ while ("" ne $line) {
+ if (!$copying) {
+ if ($line =~ m|<translate>|i) {
+ print(OUT $`);
+ substr($line, 0, $+[0]) = "";
+ $copying = 1;
+ print(OUT "\n") if ("" eq $line);
+
+ } else {
+ print(OUT "${line}\n");
+ $line = "";
+ }
+
+ } else {
+ if ($line =~ m|</translate>|i) {
+ $text .= $`;
+ substr($line, 0, $+[0]) = "";
+ $text =~ s/\s+/ /g;
+ $copying = 0;
+ $alllocales{$text} = 1;
+ $htmllocale{$text} = 1;
+ print(OUT $self->{"texts"}{$text} || $text);
+ print(OUT "\n") if ("" eq $line);
+ $text = "";
+
+ } else {
+ $text .= $line;
+ $line = "";
+ }
+ }
+ }
+ }
+
+ close(IN);
+ close(OUT);
+}