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

Last change on this file since 119821 was 119821, checked in by Cerdic, 9 months ago

Fix les detections de chaine dupliquee : ce doit etre un id different, et on essaye d'inserer que pour les langues pas deja presente + echouer si une insertion echoue car ce n'est pas normal

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