#!/usr/bin/perl -w

# translate english F*EX files into locale languange

use File::Basename;
use File::Copy;

@trfiles = qw(
  lib/fex.pp
  cgi-bin/foc
  cgi-bin/fop
  cgi-bin/fuc
  cgi-bin/fup
  cgi-bin/fur
  cgi-bin/rup
  cgi-bin/pup
);

@cpfiles = qw(
  htdocs/index.html
  htdocs/FAQ.html
  lib/fup.pl
  lang.html
);

@FEX = getpwnam('fex') or die "$0: no user fex\n";
$> = $FEX[2];
$) = $FEX[3];

$FEXHOME = $ENV{FEXHOME} || $FEX[7];

# require "$FEXHOME/lib/fex.pp" 
#   or die "$0: cannot load $FEXHOME/lib/fex.pp - $!\n";

$tr = "locale/translations";

$lang = shift or &usage;
exit if $lang eq 'english';

open $tr,$tr or die "$0: cannot open $tr - $!\n";

while (<$tr>) {
  $n++;
  last if /^\s*$/;
  if (/^#\s*([\w-]+):/ and $lang eq $1) {
    $ll = $n;
  }
}

&usage unless $ll;

while (<$tr>) {
  next if /^#/;
  next if /^\s*$/;
  chomp;
  unless (/[a-z]/i) {
    die "$0: syntax error in $tr line $. : no text\n";
  }
  $e = $_;
  for my $l (2 .. $ll) { 
    $_ = <$tr>||'';
    chomp;
    unless (/[a-z]/i) {
      die "$0: syntax error in $tr line $. : no text\n";
    }
  }
  $T{$e} = $_;
  while (<$tr>) { last if /^\s*$/ }
}
  
close $tr;
@E = sort {length $b <=> length $a} keys %T;

mkdir "$FEXHOME/locale";
symlink '..',"$FEXHOME/locale/english" unless -e "$FEXHOME/locale/english";

foreach $file (@trfiles) {
  mkdirp("$FEXHOME/locale/$lang/".dirname($file));
  $fe = "$FEXHOME/$file";
  $ft = "$FEXHOME/locale/$lang/$file";
  open $fe,"<$fe" or die "$0: cannot read $fe - $!\n";
  open $ft,">$ft" or die "$0: cannot write $fe - $!\n";
  while (<$fe>) {
    if (/[a-z]/i) {
      foreach $e (@E) {
        last if s/\Q$e/$T{$e}/;
      }
    }
    print {$ft} $_;
  }
  close $fe;
  close $ft;
  chmod((stat $fe)[2],$ft);
  print "$ft written\n";
}

foreach $file (@cpfiles) {
  $fs = "locale/$lang/$file";
  $fd = "$FEXHOME/$fs";
  mkdirp(dirname($fd));
  $fd .= '_new' if -f $fd;
  if (copy($fs,$fd)) {
    chmod((stat $fs)[2],$fd);
    print "$fd written\n";
  }
}

foreach $fs (glob "$FEXHOME/lib/*") {
  if ($fs !~ /~$/) {
    $fd = "$FEXHOME/locale/$lang/lib/".basename($fs);
    symlink $fs,$fd and print "$fd linked\n";
  }
}

# emulate mkdir -p
sub mkdirp {
  my $dir = shift;
  my $pdir;
  
  return if -d $dir;
  $dir =~ s:/+$::;
  die "$0: cannot mkdir /\n" unless $dir;
  $pdir = $dir;
  if ($pdir =~ s:/[^/]+$::) {
    mkdirp($pdir) unless -d $pdir;
  }
  unless (-d $dir) {
    mkdir $dir,0770 or die "$0: mkdir $dir - $!\n";
  }
}


sub usage {
  my @langs;

  open $tr,$tr or die "$0: cannot open $tr - $!\n";

  while (<$tr>) {
    last if /^\s*$/;
    push @langs,$1 if /^#\s*([\w-]+):/;
  }
  
  foreach my $lang (@langs) {
    if (not -l "locale/$lang" and -f "locale/$lang/lib/fup.pl") {
      print "usage: $0 $lang\n";
    }
  }
  
  exit 1;
}
