#!/usr/bin/perl
#Torque Translation Support Program
#by eucalyptus. [ SATO Keiichi ] 2012 / kei@eucaly.net

#cgiurl
$cgiurl = "http://torque.eucaly.net/";

#datadir
$datadir = "/data/torque/data";

#translation base file
$tbfilename = $datadir . "/Language_utf8.txt";

#password
$password = "password";

use Encode;

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});}
 else {$query_string = $ENV{'QUERY_STRING'};}
@a = split(/&/, $query_string);
foreach $x (@a) {
 ($name, $value) = split(/=/, $x);
 $value =~ tr/+/ /;
 $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
 $value =~ s/<//g;
 $value =~ s/>//g;
 $value =~ s/script//g;
 if ($value ne ""){
  $FORM{$name} = $value;
 }
}

if ((length($FORM{trans__lang})) != 2){
 $FORM{trans__lang} = "";
}
$FORM{trans__lang} = lc ($FORM{trans__lang});
if ($FORM{trans__lang} =~ /[^a-z]/){
 $FORM{trans__lang} = "";
}
$transfilename = $datadir . "/language_$FORM{trans__lang}_utf8.txt";

if ($FORM{trans__action} eq "trans_rend"){&trans_rend;}
if ($FORM{trans__action} eq "trans_rend_16be"){&trans_rend_16be;}

print "Content-type: text/html\n\n";
print "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\" /><meta http-equiv=\"Pragma\" content=\"no-cache\"><meta http-equiv=\"Cache-Control\" content=\"no-cache\"><meta http-equiv=\"Expires\" content=\"Thu, 01 Dec 1994 16:00:00 GMT\"><title>Torque Translation Support</title></head>";
print "<body bgcolor=\"#EFEFEF\"><font style=\"font-size: 9pt\"><b>Torque Translation Support</b> By eucalyptus.<hr>";
print "Program support lang-code : UTF-8 only.<br>But, Support Torque Special Rendaring ( UTF-16BE ) encode translation.<br>";
if ($FORM{trans__lang} eq ""){
 &langselect;
}
else {
 if (!-e $transfilename){
  print "<font color=\"red\">ERROR : MISSING TRANSLATION BASE FILE</font><br>"
 }
 print "<b>Translation Target : [$FORM{trans__lang}]</b><br>";
 ($time_reload) = (stat($transfilename))[9];
 (@date) = localtime ($time_reload);
 $time_reload = sprintf("%02d/%02d %02d:%02d",$date[4]+1,$date[3],$date[2],$date[1]);
 print "target filename : $transfilename<br>update : $time_reload<br><br>";
 if ($FORM{trans__action} eq "trans_edit"){&trans_edit;}
 elsif ($FORM{trans__action} eq "trans_accept"){&trans_accept;}
 else {
  &mainmenu;
 }
}


print "<br><br><div align=\"right\"></font><font size=1><hr>By <a href=\"http://kei.eucaly.net/\">eucalyptus.</a> 2012.</font></body></html>";
exit;

sub mainmenu{
 print "<form method=\"post\" action=\"$cgiurl\">";
 print "action?:<br>";
 print "<input type=\"radio\" name=\"trans__action\" value=\"trans_edit\" id=1 checked><label for=1>EDIT</label><br>";
 print "<input type=\"radio\" name=\"trans__action\" value=\"trans_rend\" id=2><label for=2>RENDARING(UTF-8)</label><br>";
 print "<input type=\"radio\" name=\"trans__action\" value=\"trans_rend_16be\" id=3><label for=3>RENDARING(UTF-16 Big Endian)</label><br>";
 print "<input type=\"hidden\" name=\"trans__lang\" value=\"$FORM{trans__lang}\"><input type=\"submit\" value=\"Action!\"></form><br><br>";
}

sub langselect{
 print "<form method=\"post\" action=\"$cgiurl\">";
 print "enter translation lang (eg : japanese:ja italian:it) *must be 2 bytes.<br>";
 opendir (DIR,$datadir);
 (@dirarray) = readdir (DIR);
 closedir (DIR);
 print "language file : ";
 foreach $line (@dirarray){
  if ($line =~ /language_(\w\w)_utf8/) {
   print "$1, ";
  }
 }
 print " exists.<br>";
 print "<input type=\"text\" size=2 name=\"trans__lang\" value=\"\"><input type=\"submit\" value=\"accept lang\"></form><br><br>";
}
sub trans_edit{
 print "<table border=0 cellpadding=0 cellspacing=0>";
 print "<form method=\"post\" action=\"$cgiurl\">";
 
 open (BASEFILE,$tbfilename);
 (@basearray) = (<BASEFILE>);
 close (BASEFILE);
 
 open (TRANSFILE,$transfilename);
 (@transarray) = (<TRANSFILE>);
 close (TRANSFILE);
 
 undef %transdata;
 foreach $transline (@transarray) {
  chomp ($transline);
  if ($transline =~ /^#/){
   next;
  }
  ($title,$value) = split(/\=/,$transline);
  $title =~ s/\W//g;
  $title = lc ($title);
  $transdata{$title} = $value;
 }
 
 
 foreach $baseline (@basearray) {
  chomp ($baseline);
  print "<tr>";
  if ($baseline =~ /^#/){
   print "<td align=\"left\" valign=\"middle\" width=640><font style=\"font-size: 9pt\">$baseline</font></td>";
   print "<td></td>";
  }
  elsif ($baseline =~ /(.+?)=(.*)/){
   $title = $1;
   $value = $2;
   $title =~ s/\W//g;
   $title = lc ($title);
   $transvalue = $transdata{$title};
   print "<td align=\"right\" valign=\"middle\" width=640><font style=\"font-size: 9pt\">$value</font></td>";
   print "<td><input type=\"text\" size=80 style=\"margin:0;padding:0;border:0;background-color:white;font-size:9pt\" name=\"$title\" value=\"$transvalue\"></td>";
  }
  print "</tr>";
 }
 print "</table>";
 print "<input type=\"hidden\" name=\"trans__action\" value=\"trans_accept\"><input type=\"hidden\" name=\"trans__lang\" value=\"$FORM{trans__lang}\"><br>edit password:<input type=\"text\" size=10 name=\"trans__password\"><br><input type=\"submit\" value=\"Edit!\"></form><br><br>";

}

sub trans_accept{
 if ($FORM{trans__password} ne $password){
  print "ERROR : Password missmatch!<br>";
  &mainmenu;
  return;
 }
 open (BASEFILE,$tbfilename);
 (@basearray) = (<BASEFILE>);
 close (BASEFILE);
 open (OUTPUT,">$transfilename");
 print OUTPUT "#Torque Translation File For $FORM{trans__lang}\n";
 @dtttime = gmtime (time);
 print OUTPUT  '#' . sprintf("%s, %02d %s %d %02d:%02d:%02d GMT",('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[$dtttime[6]],$dtttime[3],('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$dtttime[4]],$dtttime[5] + 1900, @dtttime[2,1,0]) . "\n";

 foreach $baseline (@basearray) {
  chomp ($baseline);
  if ($baseline =~ /^#/){
   next;
  }
  elsif ($baseline =~ /(.+?)=(.*)/){
   $title = $1;
   $titles = $title;
   $titles =~ s/\W//g;
   $titles = lc ($titles);
   $transvalue = $FORM{$titles};
   print OUTPUT $title."=".$transvalue."\n";
  }
 }
 close (OUTPUT);
 print "Update Complete!<br>";
 &mainmenu;
}

sub trans_rend {
 print "Content-type: text/plain; charset=utf-8;\n\n";
 open (REND,$transfilename);
 (@filearray) = (<REND>);
 close (REND);
 foreach $line (@filearray){
  print $line;
 }
 exit;
}

sub trans_rend_16be {
 print "Content-type: text/plain; charset=utf-8;\n\n";
 open (REND,$transfilename);
 (@filearray) = (<REND>);
 close (REND);
 foreach $line (@filearray){
  chomp ($line);
  if ($line =~ /^#/){
   chomp ($line);
   print $line . "\n";
   next;
  }
  if ($line =~ /(.+?)=(.*)/){
   $title = $1;
   $value = $2;
  }
  Encode::from_to($value,'utf8','utf16be');
  $strvalue = "";
  (@strarray) = split(//,$value);
  $numcount = 0;
  foreach $strline (@strarray){
   $stroutput = "";
   $num16 = unpack('H2',$strline);
   if ($numcount == 0){
    $num16f = $num16;
    $numcount = 1;
    next;
   }
   else {
    $num16 = $num16f . $num16;
    $numcount = 0;
   }
   if ($num16 =~ /^00/){
    $stroutput = pack("H*",$num16);
    Encode::from_to($stroutput,'utf16be','cp932');
   }
   else {
    if ($num16 =~ /(..)(..)/){
     $stroutput = "\\u$1$2";
    }
   }
   $strvalue .= $stroutput;
  }
  print $title . "=" . $strvalue . "\n";
 }
 exit;
}
