generate_lang_file.php : only ask translation for strings translated with __() functi...
[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   for ($i=1;$i<$argc;$i++) {
41     if (is_file($curdir.'/'.$argv[$i])) {
42       @include($curdir.'/'.$argv[$i]);
43       foreach($GLOBALS['LSlang'] as $msg => $trans) {
44         $translations[$msg]=$trans;
45       }
46     }
47     elseif($argv[$i]=='--without-select-list') {
48       $withoutselectlist=True;
49     }
50     elseif($argv[$i]=='--copy-original-value') {
51       $copyoriginalvalue=True;
52     }
53     elseif($argv[$i]=='--additional-file-format') {
54       $additionalfileformat=True;
55     }
56     elseif($argv[$i]=='--lang') {
57       $i++;
58       $parse_lang=explode('.',$argv[$i]);
59       if (count($parse_lang)==2) {
60         $lang=$parse_lang[0];
61         $encoding=$parse_lang[1];
62       }
63       else {
64         die("Invalid --lang parameter. Must be compose in format : [lang].[encoding]\n");
65       }
66     }
67     elseif($argv[$i]=='-h') {
68       echo "Usage : ".$argv[0]." [file1] [file2] [-h] [options]\n";
69       echo "  --without-select-list    Don't add possibles values of select list\n";
70       echo "  --copy-original-value    Copy original value as translated value when no translated value exists\n";
71       echo "  --additional-file-format Additional file format output\n";
72       echo "  --lang                   Load this specify lang (format : [lang].[encoding])\n";
73       exit(0);
74     }
75   }
76 }
77
78 $data=array();
79
80 function add($msg) {
81   if ($msg!='' && _($msg) == "$msg") {
82     global $data, $translations;
83     $data[$msg]=$translations[$msg];
84   }
85 }
86
87 // Initialize session
88 LSsession :: initialize($lang,$encoding);
89
90 // Load lang string if lang was specify
91 if ($lang && $encoding) {
92   foreach($GLOBALS['LSlang'] as $msg => $trans) {
93     $translations[$msg]=$trans;
94   }
95 }
96
97 // LDAP Servers
98 foreach($GLOBALS['LSconfig']['ldap_servers'] as $conf) {
99   add($conf['name']);
100   add($conf['subDnLabel']);
101   add($conf['recoverPassword']['recoveryHashMail']['subject']);
102   add($conf['recoverPassword']['recoveryHashMail']['msg']);
103   add($conf['recoverPassword']['newPasswordMail']['subject']);
104   add($conf['recoverPassword']['newPasswordMail']['msg']);
105   if (is_array($conf['subDn'])) {
106     foreach($conf['subDn'] as $name => $cf) {
107       if ($name!='LSobject') {
108         add($name);
109       }
110     }
111   }
112 }
113
114
115 // LSobject
116 if (loadDir(LS_OBJECTS_DIR) && loadDir(LS_LOCAL_DIR.LS_OBJECTS_DIR)) {
117   foreach($GLOBALS['LSobjects'] as $name => $conf) {
118     add($conf['label']);
119     
120     // LSrelation
121     if (is_array($conf['LSrelation'])) {
122       foreach($conf['LSrelation'] as $rel) {
123         add($rel['label']);
124         add($rel['emptyText']);
125       }
126     }
127     // Custom Actions
128     if (is_array($conf['customActions'])) {
129       foreach($conf['customActions'] as $act) {
130         add($act['label']);
131         add($act['question_format']);
132         add($act['onSuccessMsgFormat']);
133       }
134     }
135
136     // LSform
137     if (is_array($conf['LSform']['layout'])) {
138       foreach($conf['LSform']['layout'] as $lay) {
139         add($lay['label']);
140       }
141     }
142     if (is_array($conf['LSform']['dataEntryForm'])) {
143       foreach($conf['LSform']['dataEntryForm'] as $def) {
144         add($def['label']);
145       }
146     }
147     // LSsearch
148     if (is_array($conf['LSsearch']['predefinedFilters'])) {
149       foreach($conf['LSsearch']['predefinedFilters'] as $lay) {
150         add($lay);
151       }
152     }
153     if (is_array($conf['LSsearch']['extraDisplayedColumns'])) {
154       foreach($conf['LSsearch']['extraDisplayedColumns'] as $cid => $cconf) {
155         add($cconf['label']);
156       }
157     }
158     if (is_array($conf['LSsearch']['customActions'])) {
159       foreach($conf['LSsearch']['customActions'] as $act) {
160         add($act['label']);
161         add($act['question_format']);
162         add($act['onSuccessMsgFormat']);
163       }
164     }
165
166
167     
168     if(is_array($conf['attrs'])) {
169       foreach($conf['attrs'] as $attr) {
170         add($attr['label']);
171         add($attr['help_info']);
172         add($attr['no_value_label']);
173         add($attr['html_options']['mail']['subject']);
174         add($attr['html_options']['mail']['msg']);
175         
176         // LSattr_html_select_list
177         if (($attr['html_type']=='select_list' || $attr['html_type']=='select_box') && is_array($attr['html_options']['possible_values']) && !$withoutselectlist) {
178           foreach($attr['html_options']['possible_values'] as $pkey => $pname) {
179             if (is_array($pname)) {
180               add($pname['label']);
181               if (is_array($pname['possible_values'])) {
182                 foreach($pname['possible_values'] as $pk => $pn) {
183                   if ($pk == 'OTHER_OBJECT') continue;
184                   add($pn);
185                 }
186               }
187             }
188             elseif ($pkey != 'OTHER_OBJECT') {
189               add($pname);
190             }
191           }
192         }
193
194         // LSattr_html_valueWithUnit
195         if ($attr['html_type']=='valueWithUnit' && is_array($attr['html_options']['units'])) {
196           foreach($attr['html_options']['units'] as $pname) {
197             add($pname);
198           }
199         }
200         
201         // Check data
202         if (is_array($attr['check_data'])) {
203           foreach($attr['check_data'] as $check) {
204             add($check['msg']);
205           }
206         }
207         
208         // validation
209         if (is_array($attr['validation'])) {
210           foreach($attr['validation'] as $valid) {
211             add($valid['msg']);
212           }
213         }
214       }
215     }
216   }
217 }
218
219 /*
220  * Manage template file
221  */
222
223 function parse_template_file($file) {
224   foreach(file($file) as $line) {
225     if (preg_match_all('/\{ *tr +msg=["\']([^\}]+)["\'] *\}/',$line,$matches)) {
226       foreach($matches[1] as $t)
227         add($t);
228     }
229   }
230 }
231
232 function find_and_parse_template_file($dir) {
233   if (is_dir($dir)) {
234     if ($dh = opendir($dir)) {
235       while (($file = readdir($dh)) !== false) {
236         if ($file=='.' || $file=='..') continue;
237         if (is_dir($dir.'/'.$file)) {
238           find_and_parse_template_file($dir.'/'.$file);
239         }
240         elseif (is_file($dir."/".$file) && preg_match('/\.tpl$/',$file)) {
241           parse_template_file($dir.'/'.$file);
242         }
243       }
244       closedir($dh);
245     }
246   }
247 }
248
249 find_and_parse_template_file(LS_TEMPLATES_DIR);
250 find_and_parse_template_file(LS_LOCAL_DIR.LS_TEMPLATES_DIR);
251
252 /*
253  * Manage addons files
254  */
255
256 function parse_addon_file($file) {
257   foreach(file($file) as $line) {
258     $offset=0;
259     while ($pos = strpos($line,'__(',$offset)) {
260       $quote='';
261       $res='';
262       for ($i=$pos+2;$i<strlen($line);$i++) {
263         if ($line[$i]=='\\') {
264           $i++;
265         }
266         elseif (empty($quote) && ($line[$i]==' ' || $line[$i]=="\t"))  {
267           continue;
268         }
269         elseif (empty($quote) && ($line[$i]=='"' || $line[$i]=="'"))  {
270           $quote=$line[$i];
271         }
272         elseif (!empty($quote) && $line[$i]==$quote) {
273           $offset=$i;
274           break;
275         }
276         else {
277           $res.=$line[$i];
278         }
279       }
280       if (!empty($res)) add($res);
281     }
282   }
283 }
284
285 function find_and_parse_addon_file($dir) {
286   if (is_dir($dir)) {
287     if ($dh = opendir($dir)) {
288       while (($file = readdir($dh)) !== false) {
289         if (preg_match('/^LSaddons\.(.+)\.php$/',$file)) {
290           parse_addon_file($dir.'/'.$file);
291         }
292       }
293       closedir($dh);
294     }
295   }
296 }
297
298 find_and_parse_addon_file(LS_ADDONS_DIR);
299 find_and_parse_addon_file(LS_LOCAL_DIR.LS_ADDONS_DIR);
300
301
302 ksort($data);
303
304 echo "<?php\n\n";
305
306 if (!$additionalfileformat) print "\$GLOBALS['LSlang'] = array (\n";
307
308 foreach($data as $key => $val) {
309   if ($copyoriginalvalue && $val=="") {
310     $val=$key;
311   }
312   if ($additionalfileformat) {
313     print "\$GLOBALS['LSlang'][\"$key\"] = \"$val\";\n";
314   }
315   else {
316     print "\n\"$key\" =>\n  \"$val\",\n";
317   }
318 }
319
320 if (!$additionalfileformat) echo "\n);\n";
321
322 ?>