Files
webmin/fix-english.pl
2009-10-12 16:24:35 -07:00

210 lines
4.2 KiB
Perl
Executable File

#!/usr/local/bin/perl
# Convert words in lang/en files from UK to US spelling.
# Create lang/en_GB files containing words that are different.
if ($ARGV[0] eq "--svn" || $ARGV[0] eq "-svn" ||
$ARGV[0] eq "--git" || $ARGV[0] eq "-git") {
shift(@ARGV);
$svn = shift(@ARGV);
}
chdir("/usr/local/webadmin");
if (@ARGV) {
@modules = @ARGV;
}
else {
@modules = ( "." );
opendir(DIR, ".");
foreach $d (readdir(DIR)) {
push(@modules, $d) if (-r "$d/module.info");
}
closedir(DIR);
}
# Get the words
open(MAPPING, "english-mappings.txt") ||
die "Failed to open english-mappings.txt";
while(<MAPPING>) {
s/\r|\n//g;
s/#.*$//;
my ($us, $uk) = split(/\t+/, $_);
if ($us && $uk) {
push(@us_mappings, [ $us, $uk ]);
}
}
close(MAPPING);
@uk_mappings = map { [ $_->[1], $_->[0] ] } @us_mappings;
print STDERR "Found ",scalar(@uk_mappings)," mappings\n";
# Do all the given modules
@rv = ( );
foreach $m (@modules) {
print STDERR "Doing module $m\n";
push(@rv, &fix_english_file("$m/lang/en", "$m/lang/en_GB", 1));
push(@rv, &fix_english_file("$m/config.info",
"$m/config.info.en_GB", 1));
opendir(HELP, "$m/help");
foreach $h (readdir(HELP)) {
if ($h =~ /^([^\.]+)\.html$/) {
push(@rv, &fix_english_file("$m/help/$h",
"$m/help/$1.en_GB.html", 0));
}
}
closedir(HELP);
}
# Print and commit the files
foreach $f (@rv) {
print $f,"\n";
if ($svn) {
($dir, $rest) = split(/\//, $f, 2);
system("cd $dir ; git add $rest ; git commit -m '$svn' $rest ; git push");
}
}
sub fix_english_file
{
local ($us, $uk, $linefmt) = @_;
return ( ) if (!-r $us);
local @rv;
if ($linefmt) {
# Webmin = separated line file
# First fix up any UK spellings in the US file
local %uslines;
&read_file($us, \%uslines);
local $changed_us;
foreach my $k (keys %uslines) {
$v = $uslines{$k};
$usv = &convert_to_us($v);
if ($usv ne $v) {
$uslines{$k} = $usv;
$changed_us++;
}
}
if ($changed_us) {
&write_file($us, \%uslines);
push(@rv, $us);
}
# Then create a UK file with only lines that need changing
local %uklines;
&read_file($uk, \%uklines);
local $changed_uk;
foreach my $k (keys %uslines) {
$v = $uslines{$k};
$ukv = &convert_to_uk($v);
if ($ukv ne $v && $uklines{$k} ne $ukv) {
$uklines{$k} = $ukv;
$changed_uk++;
}
}
if ($changed_uk) {
&write_file($uk, \%uklines);
push(@rv, $uk);
}
}
else {
# Big blob of text
# First fix up any UK spellings in the US file
local $ustext = &read_file_contents($us);
$usv = &convert_to_us($ustext);
if ($usv ne $ustext) {
&write_file_contents($us, $usv);
push(@rv, $us);
}
# Then create a UK file
$uktext = &read_file_contents($uk);
$ukv = &convert_to_uk($usv);
if ($uktext ne $ukv && $ukv ne $usv) {
&write_file_contents($uk, $ukv);
push(@rv, $uk);
}
}
return @rv;
}
sub convert_to_us
{
local ($str) = @_;
return &convert_mapping($str, \@uk_mappings);
}
sub convert_to_uk
{
local ($str) = @_;
return &convert_mapping($str, \@us_mappings);
}
sub convert_mapping
{
local ($str, $fromto) = @_;
foreach my $w (@$fromto) {
my ($from, $to) = @$w;
$str =~ s/(\s|^)\Q$from\E(\s|$)/$1$to$2/g;
$from = ucfirst($from);
$to = ucfirst($to);
$str =~ s/(\s|^)\Q$from\E(\s|$)/$1$to$2/g;
}
return $str;
}
# 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(<ARFILE>) {
s/\r|\n//g;
if (!/^#/ && /^([^=]+)=(.*)$/) {
$_[1]->{$_[3] ? lc($1) : $1} = $2;
push(@{$_[2]}, $1) if ($_[2]);
}
elsif (!/\S/) {
push(@{$_[2]}, undef) if ($_[2]);
}
}
close(ARFILE);
return 1;
}
# write_file(file, array)
# Write out the contents of an associative array as name=value lines
sub write_file
{
local(%old, @order);
&read_file($_[0], \%old, \@order);
open(ARFILE, ">$_[0]");
foreach $k (@order) {
if (!defined($k)) {
print ARFILE "\n";
}
elsif (exists($_[1]->{$k})) {
print ARFILE $k,"=",$_[1]->{$k},"\n";
}
}
foreach $k (keys %{$_[1]}) {
print ARFILE $k,"=",$_[1]->{$k},"\n" if (!exists($old{$k}));
}
close(ARFILE);
}
sub read_file_contents
{
open(FILE, $_[0]) || return undef;
local $/ = undef;
local $rv = <FILE>;
close(FILE);
return $rv;
}
sub write_file_contents
{
open(FILE, ">$_[0]") || return undef;
print FILE $_[1];
close(FILE);
}