]> git.treefish.org Git - fex.git/blob - locale/translate
Original release 20160328
[fex.git] / locale / translate
1 #!/usr/bin/perl -w
2
3 # translate english F*EX files into locale languange
4
5 use File::Basename;
6 use File::Copy;
7
8 @trfiles = qw(
9   lib/fex.pp
10   cgi-bin/foc
11   cgi-bin/fop
12   cgi-bin/fuc
13   cgi-bin/fup
14   cgi-bin/fur
15   cgi-bin/rup
16   cgi-bin/pup
17   htdocs/FAQ/FAQ.html
18 );
19
20 #  htdocs/FAQ/meta.faq
21 #  htdocs/FAQ/user.faq
22 #  htdocs/FAQ/admin.faq
23 #  htdocs/FAQ/misc.faq
24
25 @cpfiles = qw(
26   lang.html
27   htdocs/index.html
28   htdocs/FAQ
29   htdocs/FAQ.html
30   lib/fup.pl
31 );
32
33 @FEX = getpwnam('fex') or die "$0: no user fex\n";
34 $> = $FEX[2];
35 $) = $FEX[3];
36
37 umask 022;
38
39 $FEXHOME = $ENV{FEXHOME} || $FEX[7];
40
41 # require "$FEXHOME/lib/fex.pp" 
42 #   or die "$0: cannot load $FEXHOME/lib/fex.pp - $!\n";
43
44 $tr = "locale/translations";
45
46 $lang = shift or &usage;
47 exit if $lang eq 'english';
48
49 open $tr,$tr or die "$0: cannot open $tr - $!\n";
50
51 while (<$tr>) {
52   $n++;
53   last if /^\s*$/;
54   if (/^#\s*([\w-]+):/ and $lang eq $1) {
55     $ll = $n;
56   }
57 }
58
59 &usage unless $ll;
60
61 while (<$tr>) {
62   next if /^#/;
63   next if /^\s*$/;
64   chomp;
65   unless (/[a-z]/i) {
66     die "$0: syntax error in $tr line $. : no text\n";
67   }
68   $e = $_;
69   for my $l (2 .. $ll) { 
70     $_ = <$tr>||'';
71     chomp;
72     unless (/[a-z]/i) {
73       die "$0: syntax error in $tr line $. : no text\n";
74     }
75   }
76   $T{$e} = $_;
77   while (<$tr>) { last if /^\s*$/ }
78 }
79   
80 close $tr;
81 @E = sort {length $b <=> length $a} keys %T;
82
83 mkdir "$FEXHOME/locale";
84 $_ = "$FEXHOME/locale/english";
85 symlink '..',$_ unless -e;
86
87 foreach $file (@trfiles) {
88   local $/;
89   mkdirp("$FEXHOME/locale/$lang/".dirname($file));
90   $fe = "$FEXHOME/$file";
91   $ft = "$FEXHOME/locale/$lang/$file";
92   open $fe,"<$fe" or die "$0: cannot read $fe - $!\n";
93   unlink $ft; # beware symlink!
94   open $ft,">$ft" or die "$0: cannot write $ft - $!\n";
95   $_ = <$fe>;
96   close $fe;
97   foreach $e (@E) {
98     s/\Q$e/$T{$e}/g;
99   }
100   print {$ft} $_;
101   close $ft;
102   chmod((stat $fe)[2],$ft);
103   print "$ft written\n";
104 }
105
106 if ($FEXHOME !~ /fexdev/) {
107   
108   foreach $file (@cpfiles) {
109     my $fs = "locale/$lang/$file";
110     if (-e $fs) {
111       my $fd = "$FEXHOME/$fs";
112       mkdirp(dirname($fd));
113       if (-f $fs) {
114         $fd .= '_new' if -e $fd;
115         if (copy($fs,$fd)) {
116           chmod((stat $fs)[2],$fd);
117           print "$fd written\n";
118         }
119       } else {
120         if (-f $fd) {
121           my $fds = $fd.'_save';
122           my $fdn = $fd.'_new';
123           system "rm -rf $fds $fdn";
124           rename $fd,$fds;
125           system "tar cf - $fs | (cd $FEXHOME; tar xf -)";
126           rename $fd,$fdn;
127           rename $fds,$fd;
128           print "$fdn written\n";
129         } else {
130           system "tar cf - $fs | (cd $FEXHOME; tar xf -)";
131           print "$fd written\n";
132         }
133       }
134     }
135   }
136
137   foreach $fs (qw(fex.ph dop)) {
138     $fd = "$FEXHOME/locale/$lang/lib/$fs";
139     symlink "../../../lib/$fs",$fd and print "$fd linked\n";
140   }
141
142   unless (-f "$FEXHOME/locale/$lang/htdocs/FAQ/meta.faq") {
143     unlink "$FEXHOME/locale/$lang/htdocs/FAQ/FAQ.html";
144     rmdir  "$FEXHOME/locale/$lang/htdocs/FAQ";
145   }
146
147 }
148
149 make_lf($lang);
150 make_lf('english'); # unless -f "$FEXHOME/lib/lf.pl";
151
152 exit;
153
154
155 sub make_lf {
156   my $lang = shift;
157   my $fexpp = "$FEXHOME/locale/$lang/lib/fex.pp";
158   my $lf = "$FEXHOME/locale/$lang/lib/lf.pl";
159
160   open $fexpp,$fexpp or die "$0: no $fexpp - $!\n";
161   unlink $lf;
162   open $lf,'>',$lf or die "$0: cannot write $lf - $!\n";
163   print {$lf} "### auto-generated by install/translate - DO NOT EDIT! ###\n\n";
164   local $/;
165   $_ = <$fexpp>;
166   s/.*\n(\#\#\#* locale functions)/$1/s;
167   s/\nsub (\w+)/\n\$$1\{$lang\} = sub/gs;
168   s/\n\}\n/\n\};\n/gs;
169   print {$lf} $_;
170   close $lf;
171   close $fexpp;
172 }
173
174   
175   
176 # emulate mkdir -p
177 sub mkdirp {
178   my $dir = shift;
179   my $pdir;
180   
181   return if -d $dir;
182   $dir =~ s:/+$::;
183   die "$0: cannot mkdir /\n" unless $dir;
184   $pdir = $dir;
185   if ($pdir =~ s:/[^/]+$::) {
186     mkdirp($pdir) unless -d $pdir;
187   }
188   unless (-d $dir) {
189     mkdir $dir,0770 or die "$0: mkdir $dir - $!\n";
190   }
191 }
192
193
194 sub usage {
195   my @langs;
196
197   open $tr,$tr or die "$0: cannot open $tr - $!\n";
198
199   while (<$tr>) {
200     last if /^\s*$/;
201     push @langs,$1 if /^#\s*([\w-]+):/;
202   }
203   
204   foreach my $lang (@langs) {
205     if (not -l "locale/$lang" and -f "locale/$lang/lib/fup.pl") {
206       print "usage: $0 $lang\n";
207     }
208   }
209   
210   exit 1;
211 }