Projekt

Allgemein

Profil

Herunterladen (17,1 KB) Statistiken
| Zweig: | Markierung: | Revision:
4dbb0995 Moritz Bunkus
#!/usr/bin/perl

# -n do not include custom_ scripts
2ea67805 Moritz Bunkus
# -v verbose mode, shows progress stuff
4dbb0995 Moritz Bunkus
00c278b5 Moritz Bunkus
# this version of locles processes not only all required .pl files
# but also all parse_html_templated files.

use Data::Dumper;
ec047e71 Moritz Bunkus
use FileHandle;
use Getopt::Long;
2fa8942d Moritz Bunkus
use List::Util qw(first);
ec047e71 Moritz Bunkus
use POSIX;
use Pod::Usage;
2fa8942d Moritz Bunkus
2ea67805 Moritz Bunkus
$| = 1;

860f3274 Moritz Bunkus
$basedir = "../..";
$bindir = "$basedir/bin/mozilla";
7c73b812 Moritz Bunkus
$dbupdir = "$basedir/sql/Pg-upgrade";
4fd8bdbf Moritz Bunkus
$dbupdir2 = "$basedir/sql/Pg-upgrade2";
4dbb0995 Moritz Bunkus
$menufile = "menu.ini";
2ea67805 Moritz Bunkus
$submitsearch = qr/type\s*=\s*[\"\']?submit/i;
4dbb0995 Moritz Bunkus
9f1199c4 Moritz Bunkus
%referenced_html_files = ();

ec047e71 Moritz Bunkus
my $opt_v = 0;
my $opt_n = 0;
my $opt_c = 0;

sub parse_args {
my ($help, $man);
9f1199c4 Moritz Bunkus
ec047e71 Moritz Bunkus
GetOptions('no-custom-files' => \$opt_n,
'check-files' => \$opt_c,
'verbose' => \$opt_v,
'help' => \$help,
'man' => \$man,);

if ($help) {
pod2usage(1);
exit 0;
}

if ($man) {
pod2usage(-exitstatus => 0, -verbose => 2);
exit 0;
}
4dbb0995 Moritz Bunkus
}

ec047e71 Moritz Bunkus
parse_args();

4dbb0995 Moritz Bunkus
opendir DIR, "$bindir" or die "$!";
e8a42733 Moritz Bunkus
@progfiles = grep { /\.pl$/ && !/(_|^\.)/ } readdir DIR;
4dbb0995 Moritz Bunkus
seekdir DIR, 0;
@customfiles = grep /_/, readdir DIR;
closedir DIR;

# put customized files into @customfiles

ec047e71 Moritz Bunkus
if ($opt_n) {
@customfiles = ();
@menufiles = ($menufile);
4dbb0995 Moritz Bunkus
} else {
opendir DIR, "$basedir" or die "$!";
@menufiles = grep { /.*?_$menufile$/ } readdir DIR;
closedir DIR;
unshift @menufiles, $menufile;
}

7c73b812 Moritz Bunkus
opendir DIR, $dbupdir or die "$!";
@dbplfiles = grep { /\.pl$/ } readdir DIR;
closedir DIR;

4fd8bdbf Moritz Bunkus
opendir DIR, $dbupdir2 or die "$!";
@dbplfiles2 = grep { /\.pl$/ } readdir DIR;
closedir DIR;

4dbb0995 Moritz Bunkus
# slurp the translations in
if (-f 'all') {
require "all";
}

8a149560 Moritz Bunkus
my %old_texts = %{ $self->{texts} };

6f73d970 Moritz Bunkus
# Read HTML templates.
00c278b5 Moritz Bunkus
#%htmllocale = ();
#@htmltemplates = <../../templates/webpages/*/*_master.html>;
#foreach $file (@htmltemplates) {
# scanhtmlfile($file);
#}
6f73d970 Moritz Bunkus
7c73b812 Moritz Bunkus
map({ handle_file($_, $bindir); } @progfiles);
map({ handle_file($_, $dbupdir); } @dbplfiles);
4fd8bdbf Moritz Bunkus
map({ handle_file($_, $dbupdir2); } @dbplfiles2);
860f3274 Moritz Bunkus
7c73b812 Moritz Bunkus
sub handle_file {
my ($file, $dir) = @_;
ec047e71 Moritz Bunkus
print "\n$file" if $opt_v;
4dbb0995 Moritz Bunkus
%locale = ();
%submit = ();
860f3274 Moritz Bunkus
%subrt = ();

7c73b812 Moritz Bunkus
&scanfile("$dir/$file");
4dbb0995 Moritz Bunkus
# scan custom_{module}.pl or {login}_{module}.pl files
foreach $customfile (@customfiles) {
if ($customfile =~ /_$file/) {
7c73b812 Moritz Bunkus
if (-f "$dir/$customfile") {
&scanfile("$dir/$customfile");
4dbb0995 Moritz Bunkus
}
}
}
860f3274 Moritz Bunkus
4dbb0995 Moritz Bunkus
# if this is the menu.pl file
if ($file eq 'menu.pl') {
foreach $item (@menufiles) {
&scanmenu("$basedir/$item");
}
}
de763d70 Stephan Köhler
if ($file eq 'menunew.pl') {
foreach $item (@menufiles) {
&scanmenu("$basedir/$item");
ec047e71 Moritz Bunkus
print "." if $opt_v;
de763d70 Stephan Köhler
}
}

4dbb0995 Moritz Bunkus
$file =~ s/\.pl//;

eval { require 'missing'; };
unlink 'missing';

foreach $text (keys %$missing) {
6f73d970 Moritz Bunkus
if ($locale{$text} || $htmllocale{$text}) {
9c3fc229 Moritz Bunkus
unless ($self->{texts}{$text}) {
$self->{texts}{$text} = $missing->{$text};
4dbb0995 Moritz Bunkus
}
}
}

ae1b5cba Moritz Bunkus
open FH, ">$file" or die "$! : $file";
4dbb0995 Moritz Bunkus
a507676c Moritz Bunkus
print FH q|#!/usr/bin/perl

$self->{texts} = {
4dbb0995 Moritz Bunkus
|;

foreach $key (sort keys %locale) {
9c3fc229 Moritz Bunkus
if ($self->{texts}{$key}) {
$text = $self->{texts}{$key};
4dbb0995 Moritz Bunkus
} else {
$text = $key;
}
$text =~ s/'/\\'/g;
$text =~ s/\\$/\\\\/;

$keytext = $key;
$keytext =~ s/'/\\'/g;
$keytext =~ s/\\$/\\\\/;
860f3274 Moritz Bunkus
print FH qq| '$keytext'|
. (' ' x (27 - length($keytext)))
. qq| => '$text',\n|;
4dbb0995 Moritz Bunkus
}

print FH q|};

9c3fc229 Moritz Bunkus
$self->{subs} = {
4dbb0995 Moritz Bunkus
|;
860f3274 Moritz Bunkus
4dbb0995 Moritz Bunkus
foreach $key (sort keys %subrt) {
$text = $key;
$text =~ s/'/\\'/g;
$text =~ s/\\$/\\\\/;
860f3274 Moritz Bunkus
print FH qq| '$text'| . (' ' x (27 - length($text))) . qq| => '$text',\n|;
4dbb0995 Moritz Bunkus
}

foreach $key (sort keys %submit) {
9c3fc229 Moritz Bunkus
$text = ($self->{texts}{$key}) ? $self->{texts}{$key} : $key;
4dbb0995 Moritz Bunkus
$text =~ s/'/\\'/g;
$text =~ s/\\$/\\\\/;

$english_sub = $key;
$english_sub =~ s/'/\\'/g;
$english_sub =~ s/\\$/\\\\/;
$english_sub = lc $key;
860f3274 Moritz Bunkus
4dbb0995 Moritz Bunkus
$translated_sub = lc $text;
860f3274 Moritz Bunkus
$english_sub =~ s/( |-|,)/_/g;
4dbb0995 Moritz Bunkus
$translated_sub =~ s/( |-|,)/_/g;
860f3274 Moritz Bunkus
print FH qq| '$translated_sub'|
. (' ' x (27 - length($translated_sub)))
. qq| => '$english_sub',\n|;
4dbb0995 Moritz Bunkus
}
860f3274 Moritz Bunkus
4dbb0995 Moritz Bunkus
print FH q|};

1;
|;

close FH;

6f73d970 Moritz Bunkus
}

2ea67805 Moritz Bunkus
#foreach $file (@htmltemplates) {
# converthtmlfile($file);
#}

4dbb0995 Moritz Bunkus
# now print out all

open FH, ">all" or die "$! : all";

a507676c Moritz Bunkus
print FH q|#!/usr/bin/perl

# These are all the texts to build the translations files.
4dbb0995 Moritz Bunkus
# 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

9c3fc229 Moritz Bunkus
$self->{texts} = {
4dbb0995 Moritz Bunkus
|;

foreach $key (sort keys %alllocales) {
9c3fc229 Moritz Bunkus
$text = $self->{texts}{$key};
4dbb0995 Moritz Bunkus
$count++;
860f3274 Moritz Bunkus
4dbb0995 Moritz Bunkus
$text =~ s/'/\\'/g;
$text =~ s/\\$/\\\\/;
860f3274 Moritz Bunkus
$key =~ s/'/\\'/g;
$key =~ s/\\$/\\\\/;
4dbb0995 Moritz Bunkus
unless ($text) {
$notext++;
push @missing, $key;
}

860f3274 Moritz Bunkus
print FH qq| '$key'| . (' ' x (27 - length($key))) . qq| => '$text',\n|;
4dbb0995 Moritz Bunkus
}

print FH q|};

1;
|;

close FH;

if (@missing) {
open FH, ">missing" or die "$! : missing";

a507676c Moritz Bunkus
print FH q|#!/usr/bin/perl

# add the missing texts and run locales.pl to rebuild
4dbb0995 Moritz Bunkus
$missing = {
|;

foreach $text (@missing) {
860f3274 Moritz Bunkus
print FH qq| '$text'| . (' ' x (27 - length($text))) . qq| => '',\n|;
4dbb0995 Moritz Bunkus
}

print FH q|};

1;
|;

close FH;
860f3274 Moritz Bunkus
4dbb0995 Moritz Bunkus
}

8a149560 Moritz Bunkus
@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) {
0db7873f Sven Schöling
$entry->{text} =~ s/\'/\\\'/g;
$entry->{translation} =~ s/\'/\\\'/g;
8a149560 Moritz Bunkus
print FH " { 'text' => '$entry->{text}', 'translation' => '$entry->{translation}' },\n";
}

print FH ");\n\n1;\n";
close FH;
}

4dbb0995 Moritz Bunkus
open(FH, "LANGUAGE");
@language = <FH>;
close(FH);
$trlanguage = $language[0];
chomp $trlanguage;

ec047e71 Moritz Bunkus
if ($opt_c) {
9f1199c4 Moritz Bunkus
search_unused_htmlfiles();
search_translated_htmlfiles_wo_master();
}

4dbb0995 Moritz Bunkus
$per = sprintf("%.1f", ($count - $notext) / $count * 100);
2ea67805 Moritz Bunkus
print "\n$trlanguage - ${per}%";
print " - $notext missing" if $notext;
print "\n";
4dbb0995 Moritz Bunkus
exit;

860f3274 Moritz Bunkus
# eom
4dbb0995 Moritz Bunkus
07d3f9e2 Moritz Bunkus
sub extract_text_between_parenthesis {
my ($fh, $line) = @_;
my ($inside_string, $pos, $text, $quote_next) = (undef, 0, "", 0);

while (1) {
if (length($line) <= $pos) {
$line = <$fh>;
return ($text, "") unless ($line);
$pos = 0;
}

my $cur_char = substr($line, $pos, 1);

if (!$inside_string) {
if ((length($line) >= ($pos + 3)) && (substr($line, $pos, 2)) eq "qq") {
$inside_string = substr($line, $pos + 2, 1);
$pos += 2;

} elsif ((length($line) >= ($pos + 2)) &&
(substr($line, $pos, 1) eq "q")) {
$inside_string = substr($line, $pos + 1, 1);
$pos++;

} elsif (($cur_char eq '"') || ($cur_char eq '\'')) {
$inside_string = $cur_char;

c836425c Moritz Bunkus
} elsif (($cur_char eq ")") || ($cur_char eq ',')) {
07d3f9e2 Moritz Bunkus
return ($text, substr($line, $pos + 1));
}

} else {
if ($quote_next) {
$text .= $cur_char;
$quote_next = 0;

} elsif ($cur_char eq '\\') {
$text .= $cur_char;
$quote_next = 1;

} elsif ($cur_char eq $inside_string) {
undef($inside_string);

} else {
$text .= $cur_char;

}
}
$pos++;
}
}

4dbb0995 Moritz Bunkus
sub scanfile {
my $file = shift;
2ea67805 Moritz Bunkus
my $dont_include_subs = shift;
my $scanned_files = shift;
4dbb0995 Moritz Bunkus
689525d2 Sven Schöling
# sanitize file
$file =~ s=/+=/=g;

2ea67805 Moritz Bunkus
$scanned_files = {} unless ($scanned_files);
return if ($scanned_files->{$file});
$scanned_files->{$file} = 1;
860f3274 Moritz Bunkus
2ea67805 Moritz Bunkus
if (!defined $cached{$file}) {
4dbb0995 Moritz Bunkus
2ea67805 Moritz Bunkus
return unless (-f "$file");
860f3274 Moritz Bunkus
2ea67805 Moritz Bunkus
my $fh = new FileHandle;
open $fh, "$file" or die "$! : $file";
860f3274 Moritz Bunkus
2ea67805 Moritz Bunkus
my ($is_submit, $line_no, $sub_line_no) = (0, 0, 0);

while (<$fh>) {
$line_no++;
860f3274 Moritz Bunkus
2ea67805 Moritz Bunkus
# is this another file
if (/require\s+\W.*\.pl/) {
my $newfile = $&;
$newfile =~ s/require\s+\W//;
96e9d829 Moritz Bunkus
$newfile =~ s|bin/mozilla||;
2ea67805 Moritz Bunkus
# &scanfile("$bindir/$newfile", 0, $scanned_files);
$cached{$file}{scan}{"$bindir/$newfile"} = 1;
} elsif (/use\s+SL::(.*?);/) {
2d4dcc22 Moritz Bunkus
my $module = $1;
$module =~ s|::|/|g;
2ea67805 Moritz Bunkus
# &scanfile("../../SL/${1}.pm", 1, $scanned_files);
2d4dcc22 Moritz Bunkus
$cached{$file}{scannosubs}{"../../SL/${module}.pm"} = 1;
00c278b5 Moritz Bunkus
}

2ea67805 Moritz Bunkus
# is this a template call?
24119b61 Moritz Bunkus
if (/parse_html_template2?\s*\(\s*[\"\']([\w\/]+)\s*[\"\']/) {
2ea67805 Moritz Bunkus
my $newfile = "$basedir/templates/webpages/$1_master.html";
24119b61 Moritz Bunkus
if (/parse_html_template2/) {
print "E: " . strip_base($file) . " is still using 'parse_html_template2' for " . strip_base($newfile) . ".\n";
}
2ea67805 Moritz Bunkus
if (-f $newfile) {
# &scanhtmlfile($newfile);
# &converthtmlfile($newfile);
$cached{$file}{scanh}{$newfile} = 1;
ec047e71 Moritz Bunkus
print "." if $opt_v;
} elsif ($opt_c) {
9f1199c4 Moritz Bunkus
print "W: missing HTML template: " . strip_base($newfile) . " (referenced from " . strip_base($file) . ")\n";
2ea67805 Moritz Bunkus
}
}
860f3274 Moritz Bunkus
2ea67805 Moritz Bunkus
# 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;
860f3274 Moritz Bunkus
2ea67805 Moritz Bunkus
while ($rc) {
if (/Locale/) {
unless (/^use /) {
my ($null, $country) = split /,/;
$country =~ s/^ +[\"\']//;
$country =~ s/[\"\'].*//;
}
860f3274 Moritz Bunkus
}
4dbb0995 Moritz Bunkus
2ea67805 Moritz Bunkus
my $postmatch = "";
860f3274 Moritz Bunkus
2ea67805 Moritz Bunkus
# is it a submit button before $locale->
if (/$submitsearch/) {
$postmatch = "$'";
if ($` !~ /locale->text/) {
$is_submit = 1;
$sub_line_no = $line_no;
}
9a22f14c Moritz Bunkus
}

2ea67805 Moritz Bunkus
my ($found) = /locale->text.*?\(/;
my $postmatch = "$'";
9a22f14c Moritz Bunkus
2ea67805 Moritz Bunkus
if ($found) {
my $string;
($string, $_) = extract_text_between_parenthesis($fh, $postmatch);
$postmatch = $_;
4dbb0995 Moritz Bunkus
2ea67805 Moritz Bunkus
# if there is no $ in the string record it
unless (($string =~ /\$\D.*/) || ("" eq $string)) {
860f3274 Moritz Bunkus
2ea67805 Moritz Bunkus
# this guarantees one instance of string
# $locale{$string} = 1;
$cached{$file}{locale}{$string} = 1;
4dbb0995 Moritz Bunkus
2ea67805 Moritz Bunkus
# this one is for all the locales
# $alllocales{$string} = 1;
$cached{$file}{all}{$string} = 1;
4dbb0995 Moritz Bunkus
2ea67805 Moritz Bunkus
# is it a submit button before $locale->
if ($is_submit) {
# $submit{$string} = 1;
$cached{$file}{submit}{$string} = 1;
}
4dbb0995 Moritz Bunkus
}
2ea67805 Moritz Bunkus
} elsif ($postmatch =~ />/) {
$is_submit = 0;
860f3274 Moritz Bunkus
}
4dbb0995 Moritz Bunkus
2ea67805 Moritz Bunkus
# exit loop if there are no more locales on this line
($rc) = ($postmatch =~ /locale->text/);
860f3274 Moritz Bunkus
2ea67805 Moritz Bunkus
if ( ($postmatch =~ />/)
|| (!$found && ($sub_line_no != $line_no) && />/)) {
$is_submit = 0;
}
9a22f14c Moritz Bunkus
}
4dbb0995 Moritz Bunkus
}

2ea67805 Moritz Bunkus
close($fh);
4dbb0995 Moritz Bunkus
2ea67805 Moritz Bunkus
}

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}};
9f1199c4 Moritz Bunkus
@referenced_html_files{keys %{$cached{$file}{scanh}}} = (1) x scalar keys %{$cached{$file}{scanh}};
4dbb0995 Moritz Bunkus
}

sub scanmenu {
my $file = shift;

my $fh = new FileHandle;
open $fh, "$file" or die "$! : $file";

8aa6cf77 Moritz Bunkus
my @a = grep m/^\[/, <$fh>;
4dbb0995 Moritz Bunkus
close($fh);

# strip []
grep { s/(\[|\])//g } @a;
860f3274 Moritz Bunkus
4dbb0995 Moritz Bunkus
foreach my $item (@a) {
@b = split /--/, $item;
foreach $string (@b) {
chomp $string;
860f3274 Moritz Bunkus
$locale{$string} = 1;
4dbb0995 Moritz Bunkus
$alllocales{$string} = 1;
}
}

860f3274 Moritz Bunkus
}
4dbb0995 Moritz Bunkus
6f73d970 Moritz Bunkus
sub scanhtmlfile {
local *IN;
2fa8942d Moritz Bunkus
2ea67805 Moritz Bunkus
if (!defined $cached{$_[0]}) {
2fa8942d Moritz Bunkus
my %plugins = ( 'loaded' => { }, 'needed' => { } );

2ea67805 Moritz Bunkus
open(IN, $_[0]) || die $_[0];

my $copying = 0;
my $issubmit = 0;
my $text = "";
while (my $line = <IN>) {
chomp($line);

2fa8942d Moritz Bunkus
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));
}

2ea67805 Moritz Bunkus
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 = "";
00c278b5 Moritz Bunkus
}
6f73d970 Moritz Bunkus
} else {
2ea67805 Moritz Bunkus
if ($line =~ m|</translate>|i) {
$text .= $`;
substr($line, 0, $+[0]) = "";
5b98fc5f Moritz Bunkus
$text =~ s/\s+/ /g;

2ea67805 Moritz Bunkus
$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 = "";
}
6f73d970 Moritz Bunkus
}
}
}
2ea67805 Moritz Bunkus
close(IN);
2fa8942d Moritz Bunkus
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";
}

2ea67805 Moritz Bunkus
&converthtmlfile($_[0]);
6f73d970 Moritz Bunkus
}

2ea67805 Moritz Bunkus
# 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}};
6f73d970 Moritz Bunkus
}

sub converthtmlfile {
local *IN;
local *OUT;

00c278b5 Moritz Bunkus
my $file = shift;

open(IN, $file) || die;
6f73d970 Moritz Bunkus
my $langcode = (split("/", getcwd()))[-1];
00c278b5 Moritz Bunkus
$file =~ s/_master.html$/_${langcode}.html/;
6f73d970 Moritz Bunkus
00c278b5 Moritz Bunkus
open(OUT, ">$file") || die;
6f73d970 Moritz Bunkus
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]) = "";
5b98fc5f Moritz Bunkus
$text =~ s/\s+/ /g;
6f73d970 Moritz Bunkus
$copying = 0;
$alllocales{$text} = 1;
$htmllocale{$text} = 1;
9c3fc229 Moritz Bunkus
print(OUT $self->{"texts"}{$text} || $text);
6f73d970 Moritz Bunkus
print(OUT "\n") if ("" eq $line);
$text = "";

} else {
$text .= $line;
$line = "";
}
}
}
}

close(IN);
close(OUT);
}
9f1199c4 Moritz Bunkus
sub search_unused_htmlfiles {
my @unscanned_dirs = ('../../templates/webpages');

while (scalar @unscanned_dirs) {
my $dir = shift @unscanned_dirs;

foreach my $entry (<$dir/*>) {
if (-d $entry) {
push @unscanned_dirs, $entry;

} elsif (($entry =~ /_master.html$/) && -f $entry && !$referenced_html_files{$entry}) {
print "W: unused HTML template: " . strip_base($entry) . "\n";

}
}
}
}

sub search_translated_htmlfiles_wo_master {
my @unscanned_dirs = ('../../templates/webpages');

while (scalar @unscanned_dirs) {
my $dir = shift @unscanned_dirs;

foreach my $entry (<$dir/*>) {
if (-d $entry) {
push @unscanned_dirs, $entry;

} elsif (($entry =~ /_[a-z]+\.html$/) && ($entry !~ /_master.html$/) && -f $entry) {
my $master = $entry;
$master =~ s/[a-z]+\.html$/master.html/;
if (! -f $master) {
print "W: translated HTML template without master: " . strip_base($entry) . "\n";
}
}
}
}
}

sub strip_base {
905deb54 Moritz Bunkus
my $s = "$_[0]"; # Create a copy of the string.
9f1199c4 Moritz Bunkus
905deb54 Moritz Bunkus
$s =~ s|^../../||;
$s =~ s|templates/webpages/||;

return $s;
9f1199c4 Moritz Bunkus
}
ec047e71 Moritz Bunkus
__END__

=head1 NAME

locales.pl - Collect strings for translation in Lx-Office

=head1 SYNOPSIS

locales.pl [options]

Options:
-n, --no-custom-files Do not process files whose name contains "_"
-c, --check-files Run extended checks on HTML files
-v, --verbose Be more verbose
-h, --help Show this help

=head1 OPTIONS

=over 8

=item B<-n>, B<--no-custom-files>

Do not process files whose name contains "_", e.g. "custom_io.pl".

=item B<-c>, B<--check-files>

Run extended checks on the usage of templates. This can be used to
discover HTML templates that are never used as well as the usage of
non-existing HTML templates.

=item B<-v>, B<--verbose>

Be more verbose.

=back

=head1 DESCRIPTION

This script collects strings from Perl files, the menu.ini file and
HTML templates and puts them into the file "all" for translation. It
also distributes those translations back to the individual files.

=cut