#!/usr/local/bin/perl @ARGV == 2 || die "usage: missing-strings "; ($dir, $lang) = @ARGV; opendir(DIR, $dir); foreach $f ("", readdir(DIR)) { local ($msg0, $msg1, $msg2, $msg3); # Check module.info file local %minfo; if (&read_file("$dir/$f/module.info", \%minfo)) { if (!$minfo{"desc_$lang"}) { $msg0 .= "module.info: desc=$minfo{'desc'}\n"; } } elsif ($f) { next; } # Check lang/ file local (%en, @eno, %fr); &read_file("$dir/$f/lang/en", \%en, \@eno); &read_file("$dir/$f/lang/$lang", \%fr); foreach $e (@eno) { if (!$fr{$e}) { $msg1 .= "lang/$lang: $e=$en{$e}\n"; } } # Check config.info file local (%econfig, @eorder, %fconfig); if (&read_file("$dir/$f/config.info", \%econfig, \@eorder)) { foreach $e (@eorder) { if (!$fconfig{$e}) { $msg2 .= "config.info.$lang: $e=$econfig{$e}\n"; } } } # Check help files #opendir(HELP, "$dir/$f/help"); #foreach $h (readdir(HELP)) { # } #closedir(HELP); if ($msg0 || $msg1 || $msg2 || $msg3) { if ($f) { print "In module $f\n"; } else { print "In Webmin globals\n"; } print "---------------------------------------\n"; print "$msg0\n" if ($msg0); print "$msg1\n" if ($msg1); print "$msg2\n" if ($msg2); print "$msg3\n" if ($msg3); print "\n"; } } closedir(DIR); # read_file(file, &assoc, [&order], [lowercase]) # Fill an associative array with name=value pairs from a file sub read_file { open(ARFILE, $_[0]) || return 0; while() { s/\r|\n//g; if (!/^#/ && /^([^=]*)=(.*)$/) { $_[1]->{$_[3] ? lc($1) : $1} = $2; push(@{$_[2]}, $1) if ($_[2]); } } close(ARFILE); return 1; }