source: spip-zone/_dev_/salvatore2/lecteur.php @ 70645

Last change on this file since 70645 was 70645, checked in by kent1@…, 7 years ago

lors de la suppression de chaines on les mets dans attic*module au lieu de attic tout court

File size: 12.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-2012
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
28require_once(dirname(__FILE__).'/inc_tradlang.php');
29$tmp=_SALVATORE_TMP;
30
31/* modules de SPIP requis - il y a surement plus propre... */
32include_spip('base/abstract_sql');
33include_spip('inc/invalideur');
34include_spip('inc/tradlang_verifier_langue_base');
35include_spip('inc/charsets');
36include_spip('inc/filtres');
37include_spip('inc/xml');
38include_spip('inc/lang_liste');
39
40$url_site = sql_getfetsel('valeur','spip_meta','nom="adresse_site"');
41
42/* MAIN ***********************************************************************/
43
44trad_log("\n=======================================\nLECTEUR\nPrend les fichiers de reference dans sa copie locale et met a jour la base de donnees\n=======================================\n");
45
46$liste_sources=charger_fichier_traductions(); // chargement du fichier traductions.txt
47
48foreach ($liste_sources as $source) {
49        trad_log("==== Module ".$source[1]." =======================================\n");
50        $liste_fic_lang= glob($tmp.$source[1].'/'.$source[1]."_*.php");
51        $import = true;
52        /**
53         * On test ici si le fichier est géré par un autre salvatore
54         * Si oui on empeche son export en le signifiant
55         */
56        if(file_exists($xml = $tmp.$source[1].'/'.$source[1].'.xml')){
57                $xml_content = spip_xml_load($xml);
58                if(is_array($xml_content)){
59                        spip_xml_match_nodes('/^traduction/',$xml_content,$matches);
60                        $test = '<'.key($matches).'>';
61                        $url = extraire_attribut($test,'url');
62                        if($url && ($url != $url_site)){
63                                $import = false;
64                                $sujet = 'Lecteur : Erreur sur '.$source[1];
65                                $corps = "\nErreur : import impossible, le fichier est traduit autre part : $url\n\n";
66                                trad_sendmail($sujet,$corps);
67                                trad_log("\nErreur : import impossible, le fichier est traduit autre part : $url\n\n");
68                        }
69                }
70        }
71        if($import){
72                /**
73                 * on doit absolument charger la langue principale en premier (a cause des MD5)
74                 */ 
75                $fic_lang_principal=$tmp.$source[1].'/'.$source[1].'_'.$source[2].".php";
76                $priorite = '';
77                $modifs = 0;
78                if(defined('_TRAD_PRIORITE_DEFAUT'))
79                        $priorite = _TRAD_PRIORITE_DEFAUT;
80                if (in_array($fic_lang_principal,$liste_fic_lang)) {
81                        $module = sql_fetsel('*','spip_tradlang_modules','module='.sql_quote($source[1]));
82                        $id_module = $module['id_tradlang_module'];
83                        /**
84                         * Si le module n'existe pas... on le crée
85                         */
86                        if(!intval($id_module)){
87                                $id_module = sql_insertq('spip_tradlang_modules',
88                                        array('module'=>$source[1],'nom_mod'=>$source[1],'lang_prefix'=>$source[1],'lang_mere'=>$source[2],'priorite' => $priorite)
89                                );
90                        }
91                        /**
92                         * Si la langue mere a changée, on la modifie
93                         */
94                        else if($module['lang_mere'] != $source[2]){
95                                $id_module = $module['id_tradlang_module'];
96                                sql_updateq('spip_tradlang_modules',array('lang_mere'=>$source[2]),'id_tradlang_module='.intval($id_module));
97                        }
98                        /**
99                         * Si $id_module n'est pas un entier => on tue le script
100                         */
101                        if(!intval($id_module)){
102                                $sujet = 'Lecteur : Erreur sur '.$source[1];
103                                $corps = "Le module n'est pas un entier";
104                                trad_sendmail($sujet,$corps);
105                                die("Le module n'est pas un entier");
106                        }
107                        $liste_id_orig = array();
108                        $modifs = import_module_spip($source,$fic_lang_principal,$liste_id_orig,1,$id_module);
109                        $langues_a_jour = array();
110                        foreach ($liste_fic_lang as $f){
111                                if ($f != $fic_lang_principal){
112                                        import_module_spip($source,$f,$liste_id_orig,0,$id_module);
113                                        $fich = basename($f,".php");
114                                        $fich = str_replace($source[1],'',$fich);
115                                        list(,$lang)=explode("_",$fich,2);
116                                        if(($modifs > 0) && function_exists('inc_tradlang_verifier_langue_base_dist')){
117                                                inc_tradlang_verifier_langue_base_dist($source[1],$lang);
118                                                trad_log("|-- Synchro de la langue ".$lang." pour le module ".$source[1]."\n");
119                                        }else if (!function_exists('inc_tradlang_verifier_langue_base_dist')){
120                                                trad_log("|-- Fonction de synchro inexistante\n");
121                                        }
122                                        $langues_a_jour[] = $lang;
123                                }
124                        }
125                        /**
126                         * On s'occupe des langues en base sans fichier
127                         * s'il y a eu au moins une modif et que l'on peut faire la synchro
128                         */
129                        if(($modifs > 0) && function_exists('inc_tradlang_verifier_langue_base_dist')){
130                                $langues_pas_a_jour = sql_select('lang','spip_tradlangs','id_tradlang_module='.intval($id_module).' AND '.sql_in('lang',$langues_a_jour,'NOT'),'lang');
131                                while($langue_a_jour = sql_fetch($langues_pas_a_jour)){
132                                        inc_tradlang_verifier_langue_base_dist($source[1],$langue_a_jour['lang']);
133                                        trad_log("|-- Synchro de la langue non exportée en fichier ".$langue_a_jour['lang']." pour le module ".$source[1]."\n");
134                                }
135                        }
136                        suivre_invalideur('1');
137                        trad_log("|\n");
138                        unset($langues_a_jour);
139                        unset($langues_pas_a_jour);
140                }
141                else {
142                        $sujet = 'Lecteur : Erreur sur '.$source[1];
143                        $corps = "|-- Pas de fichier lang ".$source[2]." pour le module ".$source[1]." : import impossible pour ce module\n";
144                        trad_sendmail($sujet,$corps);
145                        die("|-- Pas de fichier lang ".$source[2]." pour le module ".$source[1]." : import impossible pour ce module\n");
146                }
147        }
148}
149
150return 0;
151
152/**
153 * Import d'un fichier de langue dans la base
154 *
155 * @param array $source
156 * @param string $module
157 * @param array $liste_id_orig
158 * @param int $orig 1 signifie que c'est la langue originale
159 * @param int $id_module
160 * @return string
161 */
162function import_module_spip($source=array(),$module='',&$liste_id_orig,$orig=null,$id_module) {
163        trad_log( "!\n+ Import de $module\n");
164        $memtrad = $GLOBALS['idx_lang'] = 'i18n_'.crc32($module).'_tmp';
165        $GLOBALS[$GLOBALS['idx_lang']] = null;
166        $comm_fic_lang = charger_comm_fichier_langue($module);
167        include $module;
168
169        $str_lang = $GLOBALS[$memtrad];  // on a vu certains fichiers faire des betises et modifier idx_lang
170
171        if (is_null($str_lang)) {
172                trad_log("Erreur, fichier $module mal forme\n");
173                $sujet = 'Lecteur : Erreur sur '.$module;
174                $corps = "Erreur, fichier $module mal forme\n";
175                trad_sendmail($sujet,$corps);
176                return false;
177        }
178
179        /**
180         * Nettoyer le contenu de ses <MODIF>,<NEW> et <PLUS_UTILISE>
181         * Ces chaines sont utilisées comme statut
182         */ 
183        $status = array();
184
185        foreach($str_lang as $id=>$v) {
186                if(1==$orig)
187                        $status[$id] = 'OK';
188                else if (preg_match(',^<(MODIF|NEW|PLUS_UTILISE)>,US', $v, $r)) {
189                        $str_lang[$id] = preg_replace(',^(<(MODIF|NEW|PLUS_UTILISE)>)+,US', '', $v);
190                        $status[$id] = $r[1];
191                }
192                else   
193                        $status[$id] = 'OK';
194        }
195
196        $fich = basename($module,".php");
197        $fich = str_replace($source[1],'',$fich);
198        $mod = $source[1];
199        list(,$lang)=explode("_",$fich,2);
200       
201        if(!array_key_exists($lang,$GLOBALS['codes_langues'])){
202                trad_log("!-- Attention : La langue $lang n'existe pas dans les langues possibles - $mod \n"); 
203        }
204        else{
205                if (1==$orig)
206                        $res = spip_query("SELECT id, str, md5 FROM spip_tradlangs WHERE module='".$source[1]."' and lang='".$lang."' ");
207                else
208                        $res = spip_query("SELECT id, str, md5 FROM spip_tradlangs WHERE module='".$source[1]."' and lang='".$lang."' and statut!='MODIF' ");
209                $nb = sql_count($res);
210                if ($nb > 0)
211                        trad_log("!-- Fichier de langue $lang du module $mod deja inclus dans la base\n");
212       
213                $ajoutees = $inchangees = $supprimees = $modifiees = $ignorees = 0;
214               
215                /**
216                 * Si la langue est deja dans la base, on ne l'ecrase que s'il s'agit
217                 * de la langue source
218                 */
219                if ($nb == 0 OR $orig == 1) {
220                        // La liste de ce qui existe deja
221                        $existant = array();
222                        while ($t = spip_fetch_array($res))
223                                $existant[$t['id']] = $t['md5'];
224       
225                        $bigwhere = "module='".$source[1]."' and lang='".$lang."'";
226       
227                        // Dans ce qui arrive, il y a 4 cas :
228                        foreach (array_unique(array_merge(
229                                array_keys($existant), array_keys($str_lang)
230                        )) as $id) {
231                                $comm=(isset($comm_fic_lang[$id])) ? $comm_fic_lang[$id] : "";
232                                // * chaine neuve
233                                if (isset($str_lang[$id])
234                                AND !isset($existant[$id]))
235                                {
236                                        if ($orig) {
237                                                $md5 = md5($str_lang[$id]);
238                                        } else if (!isset($liste_id_orig[$id])) {
239                                                trad_log("!-- Chaine $id inconnue dans la langue principale\n");
240                                                $ignorees++;
241                                        } else {
242                                                $md5 = $liste_id_orig[$id];
243                                        }
244       
245                                        if (isset($md5)){
246                                                /**
247                                                 * Forcer le passage en UTF-8
248                                                 */
249                                                $str_lang[$id] = str_replace("\r\n", "\n", unicode_to_utf_8(
250                                                        html_entity_decode(
251                                                                preg_replace('/&([lg]t;)/S', '&amp;\1', $str_lang[$id]),
252                                                                ENT_NOQUOTES, 'utf-8')
253                                                ));
254                                                if(in_array($comm,array('NEW','OK','MODIF','MODI')) && $orig != 1){
255                                                        if($comm == 'MODI')
256                                                                $comm = 'MODIF';
257                                                        $status[$id] = $comm;
258                                                        $comm = '';
259                                                }
260                                                else if ((strlen($comm) > 1) && preg_match("/(.*?)(NEW|OK|MODIF)(.*?)/",$comm,$matches)) {
261                                                        if($orig != 1)
262                                                                $status[$id] = $matches[2];
263                                                        $comm = preg_replace("/(NEW|OK|MODIF)/",'',$comm);
264                                                }
265                                                $titre = $id.' : '.$source[1].' - '.$lang;
266                                                spip_query("INSERT spip_tradlangs (id_tradlang_module,titre,module,lang,id,str,comm,md5,statut)
267                                                VALUES ("
268                                                        ._q($id_module).', '
269                                                        ._q($titre).', '
270                                                        ._q($source[1]).', '
271                                                        ._q($lang).', '
272                                                        ._q($id).', '
273                                                        ._q($str_lang[$id]).', '
274                                                        ._q($comm).', '
275                                                        ._q($md5).', '
276                                                        ._q($status[$id])
277                                                        .")"
278                                                );
279                                                $ajoutees++;
280                                        }
281                                }
282                                else
283                                // * chaine existante
284                                if (isset($str_lang[$id]) AND isset($existant[$id]))
285                                {
286                                        // * identique ? => NOOP
287                                        $md5 = md5($str_lang[$id]);
288                                        if ($md5 == $existant[$id]) {
289                                                $inchangees++;
290                                        }
291                                        // * modifiee ? => UPDATE
292                                        else {
293                                                // modifier la chaine
294                                                spip_query("UPDATE spip_tradlangs SET
295                                                        str="._q($str_lang[$id])
296                                                        . ($orig
297                                                                ? ", md5="._q($md5).", statut='OK'"
298                                                                : ", md5="._q($existant[$id]).", statut=''"
299                                                        )
300                                                        . ($comm
301                                                                ? ", comm="._q($comm)." "
302                                                                : ""
303                                                        )
304                                                        ." WHERE $bigwhere AND id="._q($id)
305                                                );
306       
307                                                // signaler le status MODIF de ses traductions
308                                                if ($orig && ($orig != 0))
309                                                        spip_query("UPDATE spip_tradlangs SET statut='MODIF'
310                                                                WHERE module='".$source[1]
311                                                                ."' AND id="._q($id)
312                                                                ." AND md5!="._q($md5)
313                                                                ." AND lang!="._q($lang)
314                                                                ." AND statut!='NEW'"
315                                                        );
316                                                $modifiees++;
317                                        }
318                                }
319                                else
320                                // * chaine supprimee
321                                if (!isset($str_lang[$id]) AND isset($existant[$id])){
322                                        // mettre au grenier
323                                        spip_query("UPDATE spip_tradlangs SET id="._q($source[1].'_'.$id)
324                                        .", module='attic*".$source[1]."' WHERE id="._q($id)." AND module="._q($source[1]));
325                                        $supprimees++;
326                                }
327                               
328                                if ($orig AND isset($str_lang[$id]))
329                                        $liste_id_orig[$id] = md5($str_lang[$id]);
330                        }
331       
332                        trad_log("!-- module ".$source[1].", $lang : $modifiees modifiees, $ajoutees ajoutees, $supprimees supprimees, $ignorees ignorees, $inchangees inchangees\n");
333                }
334        }
335        unset($liste_id_orig);
336        unset($str_lang);
337        unset($GLOBALS[$GLOBALS['idx_lang']]);
338        return $ajoutees + $supprimees + $modifiees;
339}
340
341/**
342 * Chargement des commentaires de fichier de langue
343 * Le fichier est chargé en mode texte pour récupérer les commentaires dans lesquels sont situés les statuts
344 *
345 * @param string $f Le chemin du fichier de langue
346 * @return array $liste_trad Un tableau id/chaine
347 */
348function charger_comm_fichier_langue($f) {
349
350        $contenu=file_get_contents($f);
351
352        $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);
353
354        $liste_trad=array();
355        reset($tab);
356       
357        while (list(,$ligne) = each($tab))
358        {
359                $ligne = str_replace("\'",'',$ligne);
360                if (strlen($ligne)>0) {
361                        if (preg_match("/(.*?)\'[\s\t]*=>[\s\t]*\'(.*?)\'[\s\t]*,{0,1}[\s\t]*(#.*)?/ms",$ligne,$matches)) {
362                                if (isset($matches[1]) and isset($matches[3]) and strlen(trim($matches[3]))>0 ) {
363                                        list(,$comm)=explode("#",$matches[3]);
364                                        $liste_trad[$matches[1]]=trim($comm);
365                                }
366                        }
367                }
368        }
369        reset($liste_trad);
370        return $liste_trad;
371}
372
373?>
Note: See TracBrowser for help on using the repository browser.