source: spip-zone/_dev_/salvatore2/ecriveur.php @ 77237

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

Ce script est fonctionnel avec salvatore2, il faudrait que je réorganise l'ensemble

File size: 16.1 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-2013
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
27require_once(dirname(__FILE__).'/inc_tradlang.php');
28$tmp= _SALVATORE_TMP;
29
30trad_log("\n=======================================\nECRIVEUR\nExporte les fichiers de traduction dans sa copie locale a partir de la base de donnees\n=======================================\n");
31
32$liste_sources=charger_fichier_traductions(); // chargement du fichier traductions.txt
33
34if (!is_dir($tmp)) die ("Manque le repertoire ".$tmp);
35
36include_spip('base/abstract_sql');
37include_spip('inc/filtres');
38include_spip('inc/texte');
39include_spip('inc/config');
40include_spip('inc/xml');
41
42/**
43 * On récupère l'URL du site de traduction
44 * Elle servira à :
45 * -* empêcher l'export de fichiers traduits sur une autre plateforme
46 * -* générer l'url de l'interface de traduction d'un module
47 */
48$url_site = sql_getfetsel('valeur','spip_meta','nom="adresse_site"');
49
50if(isset($argv[1]) && strlen($argv[1]) > 1)
51        $message_commit = $argv[1]."\n\n";
52
53foreach ($liste_sources as $source) {
54        trad_log("==== Module ".$source[1]." =======================================\n");
55        $export = true;
56        /**
57         * On test ici si le fichier est géré par un autre salvatore
58         * Si oui on empeche son export en le signifiant
59         */
60        if(file_exists($xml = $tmp.$source[1].'/'.$source[1].'.xml')){
61                $xml_content = spip_xml_load($xml);
62                if(is_array($xml_content)){
63                        spip_xml_match_nodes('/^traduction/',$xml_content,$matches);
64                        $test = '<'.key($matches).'>';
65                        $url = extraire_attribut($test,'url');
66                        if($url && ($url != $url_site)){
67                                $export = false;
68                                $sujet = 'Ecriveur : Erreur sur '.$source[1];
69                                $corps = "\nErreur : export impossible, le fichier est traduit autre part : $url != $url_site\n\n";
70                                trad_sendmail($sujet,$corps);
71                                trad_log("\nErreur : export impossible, le fichier est traduit autre part : $url != $url_site\n\n");           
72                        }
73                }
74        }
75        /**
76         * Si on l'exporte
77         */
78        if($export){
79                $id_tradlang_module = sql_getfetsel('id_tradlang_module','spip_tradlang_modules','module='.sql_quote($source[1]));
80                $url_trad = url_absolue(generer_url_entite($id_tradlang_module,'tradlang_module'),$url_site);
81                export_trad_module($source,$url_site,$url_trad,$message_commit);
82        }
83}
84
85return 0;
86
87//
88// Genere les fichiers de traduction d'un module
89//
90function export_trad_module($source,$url_site,$url_trad,$message_commit='') {
91        global $tmp;
92
93        // sanity check
94        if (!is_dir($tmp.$source[1]."/"))
95                return false;
96
97        $module = sql_fetsel('*','spip_tradlang_modules','module='.sql_quote($source[1]));
98
99        $seuil_export = 50;
100        if(is_numeric($module['limite_trad']) && $module['limite_trad'] > 0){
101                $seuil_export = $module['limite_trad'];
102        }elseif(function_exists('lire_config')){
103                $seuil_export = lire_config('tradlang/seuil_export_tradlang',50);
104        }
105        if(intval($module['id_tradlang_module']) >= 1){
106                // charger la langue originale, pour la copier si necessaire
107                $count_original = 0;
108                $res=sql_allfetsel("id,id_tradlang_module,str,comm,statut","spip_tradlangs","id_tradlang_module='".$module['id_tradlang_module']."' and lang='".$module['lang_mere']."' AND statut='OK'","id");
109                foreach ($res as $row) {
110                        $row['statut'] = 'NEW';
111                        $lorigine[$row['id']] = $row;
112                        $id_tradlang_module = $row['id_tradlang_module'];
113                        $count_original++;
114                }
115
116                $res=spip_query("SELECT lang,COUNT(*) as N FROM spip_tradlangs WHERE module='".$source[1]."' AND statut != 'NEW' AND statut != 'attic' GROUP BY lang ORDER BY lang");
117                $liste_lang = $liste_lang_non_exportees = $liste_lang_supprimer = array();
118                $minimal = ceil((($count_original*$seuil_export)/100));
119                trad_log("\n Minimal = $minimal ($seuil_export %)\n");
120               
121                while ($row=spip_fetch_array($res)) {
122                        /**
123                         * Le fichier est il suffisamment traduit
124                         */
125                        if($row['N'] >= $minimal)
126                                $liste_lang[]=$row['lang'];
127                        else{
128                                /**
129                                 * Le fichier n'est pas suffisamment traduit et n'existe pas, on ne fera donc rien
130                                 */
131                                if(!file_exists($tmp.$source[1]."/".$source[1].'_'.$row['lang'].'.php')){
132                                        $liste_lang_non_exportees[]=$row['lang'];
133                                }
134                                /**
135                                 * Il n'est pas suffisamment traduit, cependant, il existe déjà
136                                 * On ne va donc pas le supprimer à la barbare, mais on le met à jour quand même
137                                 */
138                                else{
139                                        $liste_lang[]=$row['lang'];
140                                        $liste_lang_supprimer[]=$row['lang'];
141                                        $percent = (($row['N']/$count_original)*100);
142                                        if($percent < ($seuil_export-15))
143                                                $message_commit .= "La langue '".$row['lang']."' devrait être supprimée car trop peu traduite (".number_format($percent,2)." %)\n";
144                                }
145                        }
146                }
147       
148                // traiter chaque langue
149                $infos = $commiteurs = array();
150                foreach($liste_lang as $lang) {
151                        spip_timer('temp');
152                        //trad_log(" generation de la langue $lang ");
153                        // Proteger les caracteres typographiques a l'interieur des tags html
154                        $typo = (in_array($lang,array('eo','fr','cpf')) || strncmp($lang, 'fr_', 3)==0) ? 'fr' : 'en';
155                        $typographie = charger_fonction($typo, 'typographie');
156                        $tab = "\t";
157                       
158                        $x = $tradlangs = array();
159                        $prev="";
160                        $traduits = $modifs = $relire = 0;
161                        //$tous = $lorigine; // on part de l'origine comme ca on a tout meme si c'est pas dans la base de donnees (import de salvatore/lecteur.php)
162                        $tous = array();
163                        //while ($row=spip_mysql_fetch($res)) {
164                        // On ne prend que les MODIF, les RELIRE et les OK pour ne pas rendre les sites multilingues en français
165                        $res=sql_allfetsel("id_tradlang,id,str,comm,statut,md5","spip_tradlangs", "module='".$source[1]."' AND lang='".$lang."' AND statut != 'NEW' AND statut != 'attic'","id");
166                        foreach ($res as $row) {
167                                $tradlangs[] = $row['id_tradlang'];
168                                $tous[$row['id']] = $row;
169                        }
170                        ksort($tous);
171                        foreach ($tous as $row) {
172                                if ($row['statut'] == 'OK')
173                                        $traduits ++;
174                                else if($row['statut'] == 'MODIF')
175                                        $modifs ++;
176                                else if($row['statut'] == 'RELIRE')
177                                        $relire ++;
178       
179                                if(strlen($row['comm']) > 1){
180                                        // On remplace les sauts de lignes des commentaires sinon ça crée des erreurs php
181                                        $row['comm'] = str_replace(array("\r\n", "\n", "\r"),' ', $row['comm']);
182                                        // Conversion des commentaires en utf-8
183                                        $row['comm'] = unicode_to_utf_8(
184                                                html_entity_decode(
185                                                        preg_replace('/&([lg]t;)/S', '&amp;\1', $row['comm']),
186                                                        ENT_NOQUOTES, 'utf-8')
187                                        );
188                                }
189                               
190                                if ($prev!=strtoupper($row['id'][0])) $x[] = "\n$tab// ".strtoupper($row['id'][0]);
191                                $prev=strtoupper($row['id'][0]);
192                               
193                                if (strlen($row['statut']) && ($row['statut'] != 'OK'))
194                                        $row['comm'] .= ' '.$row['statut'];
195                                if (trim($row['comm'])) $row['comm']=" # ".trim($row['comm']); // on rajoute les commentaires ?
196       
197                                $str = $row['str'];
198                               
199                                /**
200                                 * On enlève les sauts de lignes windows pour des sauts de ligne linux
201                                 */
202                                $str = str_replace("\r\n", "\n", $str);
203                               
204                                /**
205                                 * protection dans les balises genre <a href="..." ou <img src="..."
206                                 * cf inc/filtres
207                                 */
208                                if (preg_match_all(_TYPO_BALISE, $str, $regs, PREG_SET_ORDER)) {
209                                        foreach ($regs as $reg) {
210                                                $insert = $reg[0];
211                                                // hack: on transforme les caracteres a proteger en les remplacant
212                                                // par des caracteres "illegaux". (cf corriger_caracteres())
213                                                $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
214                                                $str = str_replace($reg[0], $insert, $str);
215                                        }
216                                }
217                               
218                                /**
219                                 * Protéger le contenu des balises <html> <code> <cadre> <frame> <tt> <pre>
220                                 */
221                                define('_PROTEGE_BLOCS_HTML', ',<(html|code|cadre|pre|tt)(\s[^>]*)?>(.*)</\1>,UimsS');
222                                if ((strpos($str,"<")!==false) && preg_match_all(_PROTEGE_BLOCS_HTML, $str, $matches, PREG_SET_ORDER)) {
223                                        foreach ($matches as $reg) {
224                                                $insert = $reg[0];
225                                                // hack: on transforme les caracteres a proteger en les remplacant
226                                                // par des caracteres "illegaux". (cf corriger_caracteres())
227                                                $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
228                                                $str = str_replace($reg[0], $insert, $str);
229                                        }
230                                }
231                               
232                                /**
233                                 * On applique la typographie de la langue
234                                 */
235                                $str = $typographie($str);
236                                /**
237                                 * On remet les caractères normaux sur les caractères illégaux
238                                 */
239                                $str = strtr($str, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
240                               
241                                $str = unicode_to_utf_8(
242                                        html_entity_decode(
243                                                preg_replace('/&([lg]t;)/S', '&amp;\1',$str),
244                                                ENT_NOQUOTES, 'utf-8')
245                                );
246                               
247                                /**
248                                 * Calcul du nouveau md5
249                                 */
250                                $newmd5 = md5($str);
251                               
252                                /**
253                                 * Si le md5 ou la chaine à changé, on la met à jour dans la base
254                                 */
255                                if (($row['md5'] != $newmd5) || ($str != $row['str']))
256                                        $r = sql_updateq("spip_tradlangs",array('md5'=>$newmd5,'str' =>$str),"id_tradlang=".intval($row['id_tradlang']));
257       
258                                $x[]="$tab".var_export($row['id'],1).' => ' .var_export($str,1).','.$row['comm'];
259                        }
260                        $orig = ($lang == $source[2]) ? $source[0] : false;
261       
262                        //trad_log(" - traduction ($traduits/$count_original OK | $relire/$count_original RELIRE | $modifs/$count_original MODIFS), export\n");
263                        // historiquement les fichiers de lang de spip_loader ne peuvent pas etre securises
264                        $secure = ($source[1] == 'tradloader')
265                                ? ''
266                                : "if (!defined('_ECRIRE_INC_VERSION')) return;\n\n";
267       
268                        $fd = fopen($tmp.$source[1]."/".$source[1].'_'.$lang.'.php', 'w');
269       
270                        # supprimer la virgule du dernier item
271                        $x[count($x)-1] = preg_replace('/,([^,]*)$/', '\1', $x[count($x)-1]);
272       
273                        $contenu = join("\n",$x);
274       
275                        // L'URL du site de traduction
276                        $url_trad = parametre_url($url_trad,'lang_cible',$lang);
277                        /**
278                         * Ecrire le fichier de langue complet
279                         */
280                        fwrite($fd,
281                        '<'.'?php
282// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
283'
284
285. ($orig
286        ? '// Fichier source, a modifier dans '.$orig
287: '// extrait automatiquement de '.$url_trad.'
288// ** ne pas modifier le fichier **
289'
290)
291."\n".$secure.'$GLOBALS[$GLOBALS[\'idx_lang\']] = array(
292'
293. $contenu
294.'
295);
296
297?'.'>
298'
299                        );
300                        fclose($fd);
301                       
302                        // noter la langue et les traducteurs pour lang/module.xml
303                        $infos[$lang] = $people_unique = array();
304                        $infos[$lang]['traducteurs'] = array();
305                        $infos[$lang]['traduits'] = $traduits;
306                        $infos[$lang]['modifs'] = $modifs;
307                        $infos[$lang]['relire'] = $relire;
308                        if(defined('_ID_AUTEUR_SALVATORE') && intval(_ID_AUTEUR_SALVATORE) > 0)
309                                $people_unique[] = _ID_AUTEUR_SALVATORE;
310                        $s = spip_query('SELECT DISTINCT(traducteur) FROM spip_tradlangs WHERE module='._q($source[1])." and lang="._q($lang));
311                        while ($t = sql_fetch($s)){
312                                $traducteurs_lang = explode(',',$t['traducteur']);
313                                foreach($traducteurs_lang as $traducteur){
314                                        if(!in_array($traducteur,$people_unique)){
315                                                if(is_numeric($traducteur) AND $id_auteur=intval($traducteur)){
316                                                        $traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom','spip_auteurs','id_auteur='.$id_auteur));
317                                                        $traducteur_supp['lien'] = url_absolue(generer_url_entite($id_auteur,'auteur'),$url_site);
318                                                }else if(trim(strlen($traducteur)) > 0){
319                                                        $traducteur_supp['nom'] = trim($traducteur);
320                                                        $traducteur_supp['lien'] = '';
321                                                }
322                                                if(isset($traducteur_supp['nom']))
323                                                        $infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp;
324                                                unset($traducteur_supp);
325                                                $people_unique[] = $traducteur;
326                                        }
327                                }
328                        }
329                        unset($people_unique);
330
331                        if(substr(exec("svn status "._SALVATORE_TMP.$source[1]."/".$source[1]."_$lang.php"),0,1) == '?'){
332                                if($module['limite_trad'] == 0)
333                                        passthru("svn add "._SALVATORE_TMP.$source[1]."/".$source[1]."_$lang.php 2> /dev/null") ? trad_log("$log\n") : '';
334                                else if(!in_array($source[1],array('ecrire','spip','public'))){
335                                        if((intval(($infos[$lang]['traduits']/$count_original)*100) > $seuil_export))
336                                                passthru("svn add "._SALVATORE_TMP.$source[1]."/".$source[1]."_$lang.php* 2> /dev/null") ? trad_log("$log\n") : '';
337                                }
338                        }
339                        // fichier modifié
340                        if(in_array(substr(exec("svn status "._SALVATORE_TMP.$source[1]."/".$source[1]."_$lang.php"),0,1),array('A','M'))){
341                                $last_change = exec("env LC_MESSAGES=en_US.UTF-8 svn info "._SALVATORE_TMP.$source[1]."/".$source[1]."_$lang.php | awk '/^Last Changed Date/ { print $4 \" \" $5 }'");
342                                $auteur_versions = sql_allfetsel('id_auteur','spip_versions','objet="tradlang" AND date > '.sql_quote($last_change).' AND '.sql_in('id_objet',$tradlangs).' AND id_auteur != "-1" AND id_auteur !='.intval(_ID_AUTEUR_SALVATORE),"id_auteur");
343                                trad_log($auteur_versions[0]['id_auteur']);
344                                if(count($auteur_versions) == 1){
345                                        $email = sql_getfetsel('email','spip_auteurs','id_auteur='.intval($auteur_versions[0]['id_auteur']));
346                                        if($email)
347                                                $commiteurs[$lang] = $email;
348                                }
349
350                                trad_log("\nLe commiteur sera pour la langue $lang : ".$commiteurs[$lang]." \n");
351                                //die("Last change = $last_change");
352                        }
353                }
354       
355                // ecrire lang/module.xml
356                $xml = "<traduction module=\"$source[1]\" gestionnaire=\"salvatore\" url=\"$url_site\" source=\"$source[0]\" reference=\"$source[2]\">\n";
357                foreach($infos as $lang => $info) {
358                        if (count($info['traducteurs'] > 0)) {
359                                $xml .= "       <langue code=\"$lang\" url=\"".parametre_url($url_trad,'lang_cible',$lang)."\" total=\"$count_original\" traduits=\"".$info['traduits']."\" relire=\"".$info['relire']."\" modifs=\"".$info['modifs']."\" nouveaux=\"".($count_original-($info['modifs']+$info['traduits']+$info['relire']))."\" pourcent=\"".number_format((($info['traduits']/$count_original)*100),2)."\">\n";
360                                ksort($info['traducteurs']);
361                                foreach ($info['traducteurs'] as $nom => $people) {
362                                        $xml .= "               <traducteur nom=\"".entites_html($people['nom'])."\" lien=\"".entites_html($people['lien'])."\" />\n";
363                                }
364                                $xml .= "       </langue>\n";
365                        } else
366                                $xml .= "       <langue code=\"$lang\" url=\"".parametre_url($url_trad,'lang_cible',$lang)."\" />\n";
367                }
368                unset($traducteurs[$source[2]]);
369                $xml .= "</traduction>\n";
370       
371                ecrire_fichier($tmp.$source[1]."/".$source[1].'.xml', $xml);
372               
373                if(isset($liste_lang_non_exportees) && (count($liste_lang_non_exportees) > 0)){
374                        $liste_lang_non_exportees_string = implode(', ',$liste_lang_non_exportees);
375                        trad_log("\nLes langues suivantes ne sont pas exportées car trop peu traduites:\n");
376                        trad_log("$liste_lang_non_exportees_string\n");
377                }
378                if(isset($liste_lang_supprimer) && (count($liste_lang_supprimer) > 0)){
379                        $liste_lang_supprimer_string = implode(', ',$liste_lang_supprimer);
380                        trad_log("\nLes langues suivantes devraient être supprimées car trop peu traduites:\n");
381                        trad_log("$liste_lang_supprimer_string\n");
382                }
383                if($module['limite_trad'] == 0){
384                        foreach($liste_lang as $lang){
385                                passthru("svn add "._SALVATORE_TMP.$source[1]."/".$source[1]."_$lang.php* 2> /dev/null") ? trad_log("$log\n") : '';
386                        }
387                }
388                else if(!in_array($source[1],array('ecrire','spip','public'))){
389                        trad_log('Limite trad = '.$seuil_export);
390                        foreach($liste_lang as $lang){
391                                if( (intval(($infos[$lang]['traduits']/$count_original)*100) > $seuil_export) 
392                                        && (substr(exec("svn status "._SALVATORE_TMP.$source[1]."/".$source[1]."_$lang.php"),0,1) == '?')){
393                                        passthru("svn add "._SALVATORE_TMP.$source[1]."/".$source[1]."_$lang.php* 2> /dev/null") ? trad_log("$log\n") : '';
394                                }
395                        }
396                }
397                trad_log("\n".passthru("svn status "._SALVATORE_TMP.$source[1]."/")."\n");
398                trad_log(var_export($commiteurs,1));
399                if(strlen($message_commit) > 1 || count($commiteurs) > 0){
400                        $fd = fopen($tmp.$source[1]."/message_commit.inc", 'w');
401                        # ecrire le fichier
402                        fwrite($fd,
403                        '<'.'?php
404$message_commit = "'.$message_commit.'";
405
406$commiteurs = '.var_export($commiteurs,1).';
407
408?'.'>
409'
410                        );
411                        fclose($fd);
412                }
413        }else{
414                trad_log("\n Ce module n'existe pas\n");
415        }
416}
417
418?>
Note: See TracBrowser for help on using the repository browser.