source: spip-zone/_plugins_/trad-lang/trunk/salvatore/lecteur.php @ 119878

Last change on this file since 119878 was 119878, checked in by Cerdic, 15 months ago

Gestion des renommages/decoupe de module : retrouver une chaine qui est une copie du meme id+contenu d'un autre module

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