generate_lang_file.php : fix to handle double-quotes in PHP output
[ldapsaisie.git] / public_html / lang / generate_lang_file.php
1 #!/usr/bin/php
2 <?php
3 /*******************************************************************************
4  * Copyright (C) 2007 Easter-eggs
5  * http://ldapsaisie.labs.libre-entreprise.org
6  *
7  * Author: See AUTHORS file in top-level directory.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License version 2
11  * as published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21
22 ******************************************************************************/
23
24 error_reporting(E_ERROR);
25
26 // Change directory
27 $curdir=getcwd();
28 chdir(dirname(__FILE__).'/../');
29
30 require_once('core.php');
31 require_once('conf/config.inc.php');
32
33 $withoutselectlist=False;
34 $copyoriginalvalue=False;
35 $additionalfileformat=False;
36 $lang=False;
37 $encoding=False;
38 $translations=array();
39 if ($argc > 1) {
40   // Change dir again to manage file input
41   chdir($curdir);
42   for ($i=1;$i<$argc;$i++) {
43     if (is_file($argv[$i])) {
44       @include($argv[$i]);
45       foreach($GLOBALS['LSlang'] as $msg => $trans) {
46         $translations[$msg]=$trans;
47       }
48     }
49     elseif($argv[$i]=='--without-select-list') {
50       $withoutselectlist=True;
51     }
52     elseif($argv[$i]=='--copy-original-value') {
53       $copyoriginalvalue=True;
54     }
55     elseif($argv[$i]=='--additional-file-format') {
56       $additionalfileformat=True;
57     }
58     elseif($argv[$i]=='--lang') {
59       $i++;
60       $parse_lang=explode('.',$argv[$i]);
61       if (count($parse_lang)==2) {
62         $lang=$parse_lang[0];
63         $encoding=$parse_lang[1];
64       }
65       else {
66         die("Invalid --lang parameter. Must be compose in format : [lang].[encoding]\n");
67       }
68     }
69     elseif($argv[$i]=='-h') {
70       echo "Usage : ".$argv[0]." [file1] [file2] [-h] [options]\n";
71       echo "  --without-select-list    Don't add possibles values of select list\n";
72       echo "  --copy-original-value    Copy original value as translated value when no translated value exists\n";
73       echo "  --additional-file-format Additional file format output\n";
74       echo "  --lang                   Load this specify lang (format : [lang].[encoding])\n";
75       exit(0);
76     }
77   }
78   chdir(dirname(__FILE__).'/../');
79 }
80
81 $data=array();
82
83 function add($msg) {
84   if ($msg!='' && _($msg) == "$msg") {
85     global $data, $translations;
86     $data[$msg]=$translations[$msg];
87   }
88 }
89
90 // Initialize session
91 LSsession :: initialize($lang,$encoding);
92
93 // Load lang string if lang was specify
94 if ($lang && $encoding) {
95   foreach($GLOBALS['LSlang'] as $msg => $trans) {
96     $translations[$msg]=$trans;
97   }
98 }
99
100 // LDAP Servers
101 foreach($GLOBALS['LSconfig']['ldap_servers'] as $conf) {
102   add($conf['name']);
103   add($conf['subDnLabel']);
104   add($conf['recoverPassword']['recoveryHashMail']['subject']);
105   add($conf['recoverPassword']['recoveryHashMail']['msg']);
106   add($conf['recoverPassword']['newPasswordMail']['subject']);
107   add($conf['recoverPassword']['newPasswordMail']['msg']);
108   if (is_array($conf['subDn'])) {
109     foreach($conf['subDn'] as $name => $cf) {
110       if ($name!='LSobject') {
111         add($name);
112       }
113     }
114   }
115 }
116
117
118 // LSobject
119 if (loadDir(LS_OBJECTS_DIR) && loadDir(LS_LOCAL_DIR.LS_OBJECTS_DIR)) {
120   foreach($GLOBALS['LSobjects'] as $name => $conf) {
121     add($conf['label']);
122     
123     // LSrelation
124     if (is_array($conf['LSrelation'])) {
125       foreach($conf['LSrelation'] as $rel) {
126         add($rel['label']);
127         add($rel['emptyText']);
128       }
129     }
130     // Custom Actions
131     if (is_array($conf['customActions'])) {
132       foreach($conf['customActions'] as $act) {
133         add($act['label']);
134         add($act['question_format']);
135         add($act['onSuccessMsgFormat']);
136       }
137     }
138
139     // LSform
140     if (is_array($conf['LSform']['layout'])) {
141       foreach($conf['LSform']['layout'] as $lay) {
142         add($lay['label']);
143       }
144     }
145     if (is_array($conf['LSform']['dataEntryForm'])) {
146       foreach($conf['LSform']['dataEntryForm'] as $def) {
147         add($def['label']);
148       }
149     }
150     // LSsearch
151     if (is_array($conf['LSsearch']['predefinedFilters'])) {
152       foreach($conf['LSsearch']['predefinedFilters'] as $lay) {
153         add($lay);
154       }
155     }
156     if (is_array($conf['LSsearch']['extraDisplayedColumns'])) {
157       foreach($conf['LSsearch']['extraDisplayedColumns'] as $cid => $cconf) {
158         add($cconf['label']);
159       }
160     }
161     if (is_array($conf['LSsearch']['customActions'])) {
162       foreach($conf['LSsearch']['customActions'] as $act) {
163         add($act['label']);
164         add($act['question_format']);
165         add($act['onSuccessMsgFormat']);
166       }
167     }
168
169
170     
171     if(is_array($conf['attrs'])) {
172       foreach($conf['attrs'] as $attr) {
173         add($attr['label']);
174         add($attr['help_info']);
175         add($attr['no_value_label']);
176         add($attr['html_options']['mail']['subject']);
177         add($attr['html_options']['mail']['msg']);
178         
179         // LSattr_html_select_list
180         if (($attr['html_type']=='select_list' || $attr['html_type']=='select_box') && is_array($attr['html_options']['possible_values']) && !$withoutselectlist) {
181           foreach($attr['html_options']['possible_values'] as $pkey => $pname) {
182             if (is_array($pname)) {
183               add($pname['label']);
184               if (is_array($pname['possible_values'])) {
185                 foreach($pname['possible_values'] as $pk => $pn) {
186                   if ($pk == 'OTHER_OBJECT') continue;
187                   add($pn);
188                 }
189               }
190             }
191             elseif ($pkey != 'OTHER_OBJECT') {
192               add($pname);
193             }
194           }
195         }
196
197         // LSattr_html_valueWithUnit
198         if ($attr['html_type']=='valueWithUnit' && is_array($attr['html_options']['units'])) {
199           foreach($attr['html_options']['units'] as $pname) {
200             add($pname);
201           }
202         }
203         
204         // Check data
205         if (is_array($attr['check_data'])) {
206           foreach($attr['check_data'] as $check) {
207             add($check['msg']);
208           }
209         }
210         
211         // validation
212         if (is_array($attr['validation'])) {
213           foreach($attr['validation'] as $valid) {
214             add($valid['msg']);
215           }
216         }
217       }
218     }
219   }
220 }
221
222 /*
223  * Manage template file
224  */
225
226 function parse_template_file($file) {
227   foreach(file($file) as $line) {
228     if (preg_match_all('/\{ *tr +msg=["\']([^\}]+)["\'] *\}/',$line,$matches)) {
229       foreach($matches[1] as $t)
230         add($t);
231     }
232   }
233 }
234
235 function find_and_parse_template_file($dir) {
236   if (is_dir($dir)) {
237     if ($dh = opendir($dir)) {
238       while (($file = readdir($dh)) !== false) {
239         if ($file=='.' || $file=='..') continue;
240         if (is_dir($dir.'/'.$file)) {
241           find_and_parse_template_file($dir.'/'.$file);
242         }
243         elseif (is_file($dir."/".$file) && preg_match('/\.tpl$/',$file)) {
244           parse_template_file($dir.'/'.$file);
245         }
246       }
247       closedir($dh);
248     }
249   }
250 }
251
252 find_and_parse_template_file(LS_TEMPLATES_DIR);
253 find_and_parse_template_file(LS_LOCAL_DIR.LS_TEMPLATES_DIR);
254
255 /*
256  * Manage addons files
257  */
258
259 function parse_addon_file($file) {
260   foreach(file($file) as $line) {
261     $offset=0;
262     while ($pos = strpos($line,'__(',$offset)) {
263       $quote='';
264       $res='';
265       for ($i=$pos+3;$i<strlen($line);$i++) {
266         if (empty($quote)) {
267           if ($line[$i]=='\\') {
268             $i++;
269           }
270           elseif ($line[$i]=='"' || $line[$i]=="'") {
271             $quote=$line[$i];
272           }
273         }
274         elseif (!empty($quote)) {
275           if ($line[$i]=='\\') {
276             $res.=$line[$i];
277             $i++;
278             $res.=$line[$i];
279           }
280           elseif ($line[$i]==$quote) {
281             $offset=$i;
282             break;
283           }
284           else {
285             $res.=$line[$i];
286           }
287         }
288       }
289       if (!empty($res)) add($res);
290     }
291   }
292 }
293
294 function find_and_parse_addon_file($dir) {
295   if (is_dir($dir)) {
296     if ($dh = opendir($dir)) {
297       while (($file = readdir($dh)) !== false) {
298         if (preg_match('/^LSaddons\.(.+)\.php$/',$file)) {
299           parse_addon_file($dir.'/'.$file);
300         }
301       }
302       closedir($dh);
303     }
304   }
305 }
306
307 find_and_parse_addon_file(LS_ADDONS_DIR);
308 find_and_parse_addon_file(LS_LOCAL_DIR.LS_ADDONS_DIR);
309
310
311 ksort($data);
312
313 echo "<?php\n\n";
314
315 if (!$additionalfileformat) print "\$GLOBALS['LSlang'] = array (\n";
316
317 foreach($data as $key => $val) {
318   if ($copyoriginalvalue && $val=="") {
319     $val=$key;
320   }
321   $key=str_replace('"','\\"',$key);
322   $val=str_replace('"','\\"',$val);
323   if ($additionalfileformat) {
324     print "\$GLOBALS['LSlang'][\"$key\"] = \"$val\";\n";
325   }
326   else {
327     print "\n\"$key\" =>\n  \"$val\",\n";
328   }
329 }
330
331 if (!$additionalfileformat) echo "\n);\n";
332
333 ?>