source: spip-zone/_plugins_/trad-lang/trunk/inc/salvatore_lecteur.php @ 119839

Last change on this file since 119839 was 119839, checked in by Cerdic, 10 months ago

qu'on soit sur la langue maitre ou non, il faut compter les chaine hors attic (donc les MODIF)

  • Property svn:eol-style set to native
File size: 19.6 KB
Line 
1<?php
2
3/*
4    This file is part of Salvatore, the translation robot of Trad-lang (SPIP)
5
6    Salvatore is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10
11    Trad-Lang is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with Trad-Lang; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20    Copyright 2003-2020
21        Florent Jugla <florent.jugla@eledo.com>,
22        Philippe Riviere <fil@rezo.net>,
23        Chryjs <chryjs!@!free!.!fr>,
24        kent1 <kent1@arscenic.info>
25        Cerdic <cedric@yterium.com>
26*/
27
28
29include_spip('base/abstract_sql');
30include_spip('inc/charsets');
31include_spip('inc/filtres');
32include_spip('inc/texte');
33include_spip('inc/xml');
34include_spip('inc/lang_liste');
35include_spip('inc/session');
36
37/**
38 * @param array $liste_sources
39 * @param string $dir_modules
40 * @throws Exception
41 */
42function salvatore_lire($liste_sources, $dir_modules = null){
43        include_spip('inc/salvatore');
44        salvatore_init();
45
46        // on va modifier a la base, il faut qu'elle soit a jour
47        salvatore_verifier_base_upgradee();
48
49        if (is_null($dir_modules)){
50                $dir_modules = _DIR_SALVATORE_MODULES;
51        }
52        salvatore_check_dir($dir_modules);
53        $refresh_time = time()-_SALVATORE_LECTEUR_REFRESH_DELAY;
54
55        $tradlang_verifier_langue_base = charger_fonction('tradlang_verifier_langue_base', 'inc', true);
56        $tradlang_verifier_bilans = charger_fonction('tradlang_verifier_bilans', 'inc', true);
57        $invalider = false;
58
59        foreach ($liste_sources as $source){
60                salvatore_log("\n<info>--- Module " . $source['module'] . " | " . $source['dir_module'] . " | " . $source['url'] . "</info>");
61
62                $module = $source['module'];
63                $dir_module = $dir_modules . $source['dir_module'];
64
65                if ($autre_gestionnaire = salvatore_verifier_gestionnaire_traduction($dir_module, $module)){
66                        salvatore_fail("[Lecteur] Erreur sur $module", "Erreur : import impossible, le fichier est traduit autre part : $autre_gestionnaire\n");
67                }
68
69                /**
70                 * on doit absolument charger la langue principale en premier (a cause des MD5)
71                 */
72                $fichier_lang_principal = $dir_module . '/' . $module . '_' . $source['lang'] . '.php';
73                $liste_fichiers_lang = glob($dir_module . '/' . $module . '_*.php');
74                if (!in_array($fichier_lang_principal, $liste_fichiers_lang)){
75                        salvatore_fail("[Lecteur] Erreur sur $module", "|-- Pas de fichier lang principal $fichier_lang_principal : import impossible pour ce module");
76                }
77
78                // pour la suite, on enleve la langue principale de la liste des fichiers
79                $liste_fichiers_lang = array_diff($liste_fichiers_lang, [$fichier_lang_principal]);
80
81                /**
82                 * On regarde quelle est la date de dernière modification du fichier de langue principale
83                 */
84                $last_update = filemtime($fichier_lang_principal);
85
86                if ($row_module = salvatore_retrouver_tradlang_module($dir_module, $module)) {
87                        $id_tradlang_module = intval($row_module['id_tradlang_module']);
88                        salvatore_log("Module en base #$id_tradlang_module");
89                        /**
90                         * Si la langue mere a changée, on la modifie
91                         */
92                        if ($row_module['lang_mere']!==$source['lang']){
93                                sql_updateq('spip_tradlang_modules', array('lang_mere' => $source['lang']), 'id_tradlang_module=' . intval($id_tradlang_module));
94                                salvatore_log("lang_mere mise a jour : " . $row_module['lang_mere'] . " => " . $source['lang']);
95                                $last_update = time();
96                        }
97                        /**
98                         * Si le dir_module a change, on le met a jour
99                         */
100                        if ($row_module['dir_module']!==$source['dir_module']){
101                                sql_updateq('spip_tradlang_modules', array('dir_module' => $source['dir_module']), 'id_tradlang_module=' . intval($id_tradlang_module));
102                                salvatore_log("dir_module mis a jour : " . $row_module['dir_module'] . " => " . $source['dir_module']);
103                                $last_update = time();
104                        }
105                }
106
107                $langues_a_jour = array();
108
109                if (!$row_module or $last_update>$refresh_time){
110                        $priorite = '';
111                        $modifs = 0;
112                        if (defined('_TRAD_PRIORITE_DEFAUT')){
113                                $priorite = _TRAD_PRIORITE_DEFAUT;
114                        }
115
116                        /**
117                         * Si le module n'existe pas... on le crée
118                         */
119                        if (!$row_module or !$id_tradlang_module = intval($row_module['id_tradlang_module'])){
120                                $insert = [
121                                        'module' => $source['module'],
122                                        'dir_module' => $source['dir_module'],
123                                        'nom_mod' => $source['module'],
124                                        'lang_prefix' => $source['module'],
125                                        'lang_mere' => $source['lang'],
126                                        'priorite' => $priorite,
127                                ];
128                                $id_tradlang_module = sql_insertq('spip_tradlang_modules', $insert);
129                                /**
130                                 * Si insertion echoue on fail
131                                 */
132                                if (!intval($id_tradlang_module)){
133                                        salvatore_fail("[Lecteur] Erreur sur $module", "Echec insertion dans spip_tradlang_modules " . json_encode($insert));
134                                }
135                                else {
136                                        salvatore_log("Insertion en base #$id_tradlang_module");
137                                }
138                        }
139
140                }
141                // Pas de mise a jour recente du fichier maitre deja en base
142                else {
143                        salvatore_log("On ne modifie rien : fichier original $fichier_lang_principal inchangé depuis " . date("Y-m-d H:i:s", $last_update));
144                        $id_tradlang_module=intval($row_module['id_tradlang_module']);
145
146                        /**
147                         * Le fichier d'origine n'a pas été modifié
148                         * Mais on a peut être de nouvelles langues
149                         */
150                        $langues_en_base = sql_allfetsel('DISTINCT lang', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module));
151                        $langues_en_base = array_column($langues_en_base, 'lang');
152
153                        $langues_a_ajouter = array();
154                        foreach ($liste_fichiers_lang as $fichier_lang){
155                                $lang = salvatore_get_lang_from($module, $fichier_lang);
156                                if (!in_array($lang, $langues_en_base)){
157                                        $langues_a_ajouter[] = array('lang' => $lang, 'fichier' => $fichier_lang);
158                                }
159                                else {
160                                        // inutile de regarder ce fichier
161                                        $langues_a_jour[] = $lang;
162                                }
163                        }
164
165                        $liste_fichiers_lang = array();
166                        if ($langues_a_ajouter){
167                                salvatore_log('On a ' . count($langues_a_ajouter) . " nouvelle(s) langue(s) à insérer (".count($langues_en_base). " langue(s) an base)");
168                                $liste_fichiers_lang = array_column($langues_a_ajouter, 'fichier');
169                        }
170                }
171
172                // traiter les fichiers lang
173                if (count($liste_fichiers_lang)) {
174
175                        // on commence par la langue mere
176                        $liste_md5_master = array();
177                        $modifs_master = salvatore_importer_module_langue($id_tradlang_module, $source, $fichier_lang_principal, true, $liste_md5_master);
178
179                        // et on fait les autres langues
180                        foreach ($liste_fichiers_lang as $fichier_lang){
181                                salvatore_importer_module_langue($id_tradlang_module, $source, $fichier_lang, false, $liste_md5_master);
182
183                                $lang = salvatore_get_lang_from($module, $fichier_lang);
184                                if ($modifs_master>0) {
185                                        if ($tradlang_verifier_langue_base) {
186                                                $tradlang_verifier_langue_base($id_tradlang_module, $lang);
187                                                salvatore_log('|-- Synchro de la langue ' . $lang . ' pour le module ' . $source['module']);
188                                        }
189                                        else {
190                                                salvatore_log("<error>|-- Pas de Fonction de synchro inexistante pour synchroniser lang $lang</error>");
191                                        }
192                                }
193                                $langues_a_jour[] = $lang;
194                        }
195
196                        /**
197                         * On s'occupe des langues en base sans fichier
198                         * s'il y a eu au moins une modif et que l'on peut faire la synchro
199                         */
200                        if ($modifs_master>0 and $tradlang_verifier_langue_base){
201                                $langues_en_base = sql_allfetsel('DISTINCT lang', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module));
202                                $langues_en_base = array_column($langues_en_base, 'lang');
203
204                                if ($langues_pas_a_jour = array_diff($langues_en_base, $langues_a_jour)) {
205                                        foreach ($langues_pas_a_jour as $langue_todo){
206                                                $tradlang_verifier_langue_base($id_tradlang_module, $langue_todo);
207                                                salvatore_log("|-- Synchro de la langue non exportée en fichier $langue_todo pour le module $module");
208                                        }
209                                }
210                        }
211
212                        $invalider = true;
213                        salvatore_log("|");
214                        unset($langues_a_jour, $langues_pas_a_jour);
215                }
216
217                // Mise à jour des bilans
218                if ($tradlang_verifier_bilans){
219                        salvatore_log("Création ou MAJ des bilans du module #$id_tradlang_module $module");
220                        $tradlang_verifier_bilans($id_tradlang_module, $source['lang'], false);
221                        salvatore_log("-");
222                }
223        }
224
225        if ($invalider){
226                include_spip('inc/invalideur');
227                suivre_invalideur('1');
228        }
229}
230
231/**
232 * Import d'un fichier de langue dans la base
233 *
234 * @param int $id_tradlang_module
235 * @param array $source
236 *   tableau decrivant le module extrait du fichier traductions
237 * @param string $fichier_lang
238 *   chemin vers le fichier de langue
239 * @param bool $is_master
240 *   true signifie que c'est la langue originale
241 * @param array $liste_md5_master
242 * @return string
243 */
244function salvatore_importer_module_langue($id_tradlang_module, $source, $fichier_lang, $is_master, &$liste_md5_master){
245        salvatore_log("!\n+ Import de $fichier_lang\n");
246        $idx = $GLOBALS['idx_lang'] = 'i18n_' . crc32($fichier_lang) . '_tmp';
247
248        $lang = salvatore_get_lang_from($source['module'], $fichier_lang);
249        $module = $source['module'];
250
251        // charger le fichier et ses commentaires
252        $GLOBALS[$idx] = null;
253        $commentaires = salvatore_charger_commentaires_fichier_langue($fichier_lang);
254
255        include $fichier_lang;
256        $chaines = $GLOBALS[$idx];  // on a vu certains fichiers faire des betises et modifier idx_lang
257
258        if (is_null($chaines)){
259                $erreur = "Erreur, fichier $fichier_lang mal forme";
260                salvatore_log("<error>$erreur</error>");
261                salvatore_envoyer_mail("[Lecteur] Erreur sur $module", $erreur);
262                return false;
263        }
264
265        /**
266         * Nettoyer le contenu de ses <MODIF>,<NEW> et <PLUS_UTILISE>
267         * Ces chaines sont utilisées comme statut
268         */
269        $status = array();
270
271        foreach ($chaines as $id => $chaine){
272                if ($is_master){
273                        $status[$id] = 'OK';
274                } else {
275                        if (preg_match(',^<(MODIF|NEW|PLUS_UTILISE)>,US', $chaine, $r)){
276                                $chaines[$id] = preg_replace(',^(<(MODIF|NEW|PLUS_UTILISE)>)+,US', '', $chaine);
277                                $status[$id] = $r[1];
278                        } else {
279                                $status[$id] = 'OK';
280                        }
281                }
282        }
283
284        $ajoutees = $inchangees = $supprimees = $modifiees = $ignorees = $recuperees = 0;
285
286        if (array_key_exists($lang, $GLOBALS['codes_langues'])) {
287                $statut_exclus = 'attic';
288                $res = sql_select("id, str, md5", "spip_tradlangs", "id_tradlang_module=" . intval($id_tradlang_module) . " AND lang=" . sql_quote($lang) . " AND statut!=" . sql_quote($statut_exclus));
289                $nb = sql_count($res);
290                if ($nb>0){
291                        salvatore_log("!-- Fichier de langue $lang du module $module deja inclus dans la base\n");
292                }
293
294                /**
295                 * Si la langue est deja dans la base, on ne l'ecrase que s'il s'agit
296                 * de la langue source
297                 */
298                if (!$nb or $is_master){
299                        // La liste de ce qui existe deja
300                        $existant = $str_existant = array();
301                        while ($row = sql_fetch($res)){
302                                $existant[$row['id']] = $row['md5'];
303                                $str_existant[$row['id']] = $row['str'];
304                        }
305
306                        $bigwhere = "id_tradlang_module=" . intval($id_tradlang_module) . ' AND lang=' . sql_quote($lang);
307
308                        include_spip('action/editer_tradlang');
309                        // Dans ce qui arrive, il y a 4 cas :
310                        $ids = array_unique(array_merge(array_keys($existant), array_keys($chaines)));
311                        foreach ($ids as $id){
312                                $comm = (isset($commentaires[$id])) ? $commentaires[$id] : '';
313
314                                /**
315                                 * 1. chaine neuve
316                                 */
317                                if (isset($chaines[$id]) and !isset($existant[$id])){
318                                        $md5 = null;
319                                        if ($is_master){
320                                                $md5 = md5($chaines[$id]);
321                                        } else {
322                                                if (!isset($liste_md5_master[$id])){
323                                                        salvatore_log("<info>!-- Chaine $id inconnue dans la langue principale</info>");
324                                                        $ignorees++;
325                                                } else {
326                                                        $md5 = $liste_md5_master[$id];
327                                                }
328                                        }
329
330                                        if ($md5){
331                                                $chaines[$id] = salvatore_nettoyer_chaine_langue($chaines[$id], $lang);
332
333                                                /**
334                                                 * Calcul du nouveau md5
335                                                 */
336                                                $md5 = md5($chaines[$id]);
337
338                                                /**
339                                                 * Si le commentaire est un statut et que l'on ne traite pas le fichier de langue mère
340                                                 * On vire le commentaire et met son contenu comme statut
341                                                 */
342                                                if (in_array($comm, array('NEW', 'OK', 'MODIF', 'MODI')) and !$is_master){
343                                                        if ($comm=='MODI'){
344                                                                $comm = 'MODIF';
345                                                        }
346                                                        $status[$id] = $comm;
347                                                        $comm = '';
348                                                } else {
349                                                        if ((strlen($comm)>1) && preg_match('/(.*?)(NEW|OK|MODIF)(.*?)/', $comm, $matches)){
350                                                                if (!$is_master){
351                                                                        $status[$id] = $matches[2];
352                                                                }
353                                                                $comm = preg_replace('/(NEW|OK|MODIF)/', '', $comm);
354                                                        }
355                                                }
356
357                                                /**
358                                                 * On génère un titre
359                                                 */
360                                                $titre = $id . ' : ' . $source['module'] . ' - ' . $lang;
361
362                                                $set = array(
363                                                        'id_tradlang_module' => $id_tradlang_module,
364                                                        'titre' => $titre,
365                                                        'module' => $source['module'],
366                                                        'lang' => $lang,
367                                                        'id' => $id,
368                                                        'str' => $chaines[$id],
369                                                        'comm' => $comm,
370                                                        'md5' => $md5,
371                                                        'statut' => $status[$id]
372                                                );
373                                                $id_tradlang = sql_insertq('spip_tradlangs', $set);
374
375                                                /**
376                                                 * L'identifiant de la chaîne de langue a peut être déjà été utilisé puis mis au grenier
377                                                 * On le récupère donc
378                                                 */
379                                                if (!$id_tradlang){
380                                                        // mais il serait bien de pouvoir piquer une chaine attic du meme module meme si pas id_tradlang_module identique
381                                                        $tradlang = sql_fetsel('*', 'spip_tradlangs', 'id=' . sql_quote($id) . ' AND id_tradlang_module=' . intval($id_tradlang_module) . ' AND lang=' . sql_quote($lang) . ' AND statut=' . sql_quote('attic'));
382                                                        if ($tradlang and $id_tradlang = intval($tradlang['id_tradlang'])){
383                                                                salvatore_log("<info>Recuperation chaine ".$source['module'].":{$id}[{$lang}] de statut ATTIC</info>");
384                                                                sql_updateq('spip_tradlangs', $set, 'id_tradlang=' . intval($id_tradlang));
385
386                                                                $trads = sql_allfetsel('id_tradlang', 'spip_tradlangs', 'id=' . sql_quote($id) . ' AND id_tradlang_module=' . intval($id_tradlang_module) . 'AND lang!=' . sql_quote($lang) . ' AND statut=' . sql_quote('attic'));
387                                                                $maj = array('statut' => 'MODIF');
388                                                                foreach ($trads as $trad){
389                                                                        salvatore_log("Changement de la trad #" . $trad['id_tradlang'] . " ATTIC => MODIF");
390                                                                        sql_updateq('spip_tradlangs', $maj, 'id_tradlang=' . intval($trad['id_tradlang']));
391                                                                }
392                                                                $recuperees++;
393                                                        }
394                                                        else {
395                                                                salvatore_fail("[Lecteur] Echec insertion", "Echec insertion en base : " . json_encode($set));
396                                                        }
397                                                }
398
399                                                /**
400                                                 * Vérifier si une autre chaîne de langue était identique (str == str)
401                                                 *
402                                                 * Si oui, on sélectionne toutes les occurences existantes dans les autres langues et on les duplique
403                                                 */
404                                                $where_identique = [
405                                                        'id_tradlang_module=' . intval($id_tradlang_module),
406                                                        'lang=' . sql_quote($lang),
407                                                        'id!=' . sql_quote($id),
408                                                        'str=' . sql_quote($chaines[$id]),
409                                                ];
410                                                $identique_meme_module = sql_getfetsel('id', 'spip_tradlangs', $where_identique);
411                                                if ($identique_meme_module){
412                                                        salvatore_log("La nouvelle chaine $id est une chaine dupliquée de " . $identique_meme_module);
413
414                                                        $deja_lang = sql_allfetsel('lang', 'spip_tradlangs', 'id=' . sql_quote($id) . ' AND id_tradlang_module=' . intval($id_tradlang_module));
415                                                        $deja_lang = array_column($deja_lang, 'lang');
416                                                        $chaines_a_dupliquer = sql_allfetsel('*', 'spip_tradlangs', 'id=' . sql_quote($identique_meme_module) . ' AND id_tradlang_module=' . intval($id_tradlang_module) . ' AND ' . sql_in('lang', $deja_lang, 'NOT'));
417                                                        foreach ($chaines_a_dupliquer as $chaine){
418                                                                unset($chaine['id_tradlang']);
419                                                                unset($chaine['maj']);
420                                                                $chaine['id'] = $id;
421                                                                $chaine['titre'] = $id . ' : ' . $source['module'] . ' - ' . $chaine['lang'];
422                                                                $chaine['md5'] = md5($chaine['str']);
423                                                                $chaine['date_modif'] = date('Y-m-d H:i:s');
424                                                                if ($chaine['statut']=='attic'){
425                                                                        $chaine['statut'] = 'NEW';
426                                                                }
427                                                                $id_tradlang_new = sql_insertq('spip_tradlangs', $chaine);
428                                                                if (!$id_tradlang_new) {
429                                                                        salvatore_fail("[Lecteur] Echec insertion", "Echec insertion en base : " . json_encode($chaine));
430                                                                }
431                                                                salvatore_log('Ajout de la version ' . $chaine['lang'] . ' - #' . $id_tradlang_new);
432                                                        }
433                                                }
434                                                $ajoutees++;
435                                        }
436                                }
437
438
439                                /**
440                                 * 2. chaine existante
441                                 *
442                                 */
443                                elseif (isset($chaines[$id]) and isset($existant[$id])) {
444                                        // * chaine existante
445                                        // * identique ? => NOOP
446                                        $chaines[$id] = salvatore_nettoyer_chaine_langue($chaines[$id], $lang);
447
448                                        /**
449                                         * Calcul du nouveau md5
450                                         */
451                                        $md5 = md5($chaines[$id]);
452                                        if ($md5 === $existant[$id]){
453                                                $inchangees++;
454                                        }
455                                        else {
456                                                // * modifiee ? => UPDATE
457                                                salvatore_log("Chaine $id modifiee $md5 != ".$existant[$id]);
458
459                                                // modifier la chaine
460                                                $modifs = array(
461                                                        'str' => $chaines[$id],
462                                                        'md5' => ($is_master ? $md5 : $existant[$id]),
463                                                        'statut' => ($is_master ? 'OK' : ''),
464                                                        'comm' => $comm,
465                                                );
466                                                $id_tradlang = sql_getfetsel('id_tradlang', 'spip_tradlangs', "$bigwhere AND id = " . sql_quote($id));
467                                                $test = tradlang_set($id_tradlang, $modifs);
468
469                                                /**
470                                                 * signaler le statut MODIF de ses traductions OK
471                                                 * update des str de ses traductions NEW
472                                                 */
473                                                if ($is_master){
474                                                        sql_updateq('spip_tradlangs', array('statut'=> 'MODIF'),
475                                                                'id_tradlang_module=' . intval($id_tradlang_module)
476                                                                . ' AND id=' . sql_quote($id)
477                                                                . ' AND md5!=' . sql_quote($md5)
478                                                                . ' AND lang!=' . sql_quote($lang)
479                                                                . ' AND statut!=' . sql_quote('NEW'));
480                                                }
481                                                sql_updateq('spip_tradlangs', array('str'=> $chaines[$id]),
482                                                        'id_tradlang_module=' . intval($id_tradlang_module)
483                                                        . ' AND id=' . sql_quote($id)
484                                                        . ' AND md5!=' . sql_quote($md5)
485                                                        . ' AND lang!=' . sql_quote($lang)
486                                                        . ' AND statut=' . sql_quote('NEW'));
487                                                $modifiees++;
488                                        }
489                                }
490
491                                /**
492                                 * 3. chaine supprimee
493                                 *
494                                 */
495                                elseif (!isset($chaines[$id]) and isset($existant[$id])) {
496                                        // * chaine supprimee
497                                        // mettre au grenier
498                                        sql_updateq('spip_tradlangs', array('statut' => 'attic'), 'id_tradlang_module=' . intval($id_tradlang_module) . ' AND id=' . sql_quote($id));
499                                        $supprimees++;
500                                }
501
502                                if ($is_master and isset($chaines[$id])){
503                                        $liste_md5_master[$id] = md5($chaines[$id]);
504                                }
505                        }
506                        salvatore_log('!-- module ' . $source['module'] . ", $lang : $modifiees modifiees, $ajoutees ajoutees, $supprimees supprimees, $recuperees recuperees, $ignorees ignorees, $inchangees inchangees");
507                }
508        }
509        else {
510                salvatore_log("<error>!-- Attention : La langue $lang n'existe pas dans les langues possibles - $module</error>");
511        }
512
513        // TODO : BUG ?
514        // unset $liste_md5_master alors qu'elle est repassee d'un appel a l'autre ?
515        unset($liste_md5_master, $chaines, $GLOBALS[$GLOBALS['idx_lang']]);
516
517        return $ajoutees + $supprimees + $modifiees;
518}
519
520
521/**
522 * Chargement des commentaires de fichier de langue
523 * Le fichier est chargé en mode texte pour récupérer les commentaires dans lesquels sont situés les statuts
524 *
525 * @param string $fichier_lang Le chemin du fichier de langue
526 * @return array $liste_trad Un tableau id/chaine
527 */
528function salvatore_charger_commentaires_fichier_langue($fichier_lang){
529
530        $contenu = file_get_contents($fichier_lang);
531
532        $tab = preg_split("/\r\n|\n\r|;\n|\n\/\/|\(\n|\n\);\n|\'\,\n|\n[\s\t]*(\')|\/\/[\s\t][0-9A-Z]\n[\s\t](\')/", $contenu, '-1', PREG_SPLIT_NO_EMPTY);
533
534        $liste_trad = array();
535        reset($tab);
536
537        while (list(, $ligne) = each($tab)){
538                $ligne = str_replace("\'", '', $ligne);
539                if (strlen($ligne)>0){
540                        if (preg_match("/(.*?)\'[\s\t]*=>[\s\t]*\'(.*?)\'[\s\t]*,{0,1}[\s\t]*(#.*)?/ms", $ligne, $matches)){
541                                if (isset($matches[1]) and isset($matches[3]) and strlen(trim($matches[3]))>0){
542                                        list(, $comm) = explode('#', $matches[3]);
543                                        $liste_trad[$matches[1]] = trim($comm);
544                                }
545                        }
546                }
547        }
548        reset($liste_trad);
549        return $liste_trad;
550}
551
Note: See TracBrowser for help on using the repository browser.