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