Changeset 58648 in spip-zone


Ignore:
Timestamp:
Feb 17, 2012, 7:33:07 PM (8 years ago)
Author:
kent1@…
Message:

Salvatore refuse d'importer et d'exporter un module dont l'url de traduction dans module.xml pointe autre part

Il met les urls des modules de langue en entête des fichiers et dans le rapport xml

Location:
_dev_/salvatore2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _dev_/salvatore2/ecriveur.php

    r58440 r58648  
    3939if (!is_dir($tmp)) die ("Manque le repertoire ".$tmp);
    4040
     41include_spip('inc/xml');
     42
     43$url_site = sql_getfetsel('valeur','spip_meta','nom="adresse_site"');
     44
    4145foreach ($liste_sources as $source) {
    4246        trad_log("==== Module ".$source[1]." =======================================\n");
    43         export_trad_module($source);
     47        $export = true;
     48        /**
     49         * On test ici si le fichier est géré par un autre salvatore
     50         * Si oui on empeche son export en le signifiant
     51         */
     52        if(file_exists($xml = $tmp.$source[1].'/'.$source[1].'.xml')){
     53                $xml_content = spip_xml_load($xml);
     54                if(is_array($xml_content)){
     55                        spip_xml_match_nodes('/^traduction/',$xml_content,$matches);
     56                        $test = '<'.key($matches).'>';
     57                        $url = extraire_attribut($test,'url');
     58                        if($url && ($url != $url_site)){
     59                                $export = false;
     60                                trad_log("\nErreur : export impossible, le fichier est traduit autre part : $url != $url_site\n\n");           
     61                        }
     62                }
     63        }
     64        /**
     65         * Si on l'exporte
     66         */
     67        if($export){
     68                $id_tradlang_module = sql_getfetsel('id_tradlang_module','spip_tradlang_modules','module='.sql_quote($source[1]));
     69                $url_trad = url_absolue(generer_url_entite($id_tradlang_module,'tradlang_module'),$url_site);
     70                export_trad_module($source,$url_site,$url_trad);
     71        }
    4472}
    4573
    4674return 0;
     75
    4776/* MAIN ***********************************************************************/
    4877
     
    5079// Genere les fichiers de traduction d'un module
    5180//
    52 function export_trad_module($source) {
     81function export_trad_module($source,$url_site,$url_trad) {
    5382        global $tmp;
    5483
     
    5887
    5988        // charger la langue originale, pour la copier si necessaire
    60         $res=spip_query("SELECT id,str,comm,statut FROM spip_tradlangs WHERE module='".$source[1]."' and lang='".$source[2]."' GROUP BY id");
     89        $res=spip_query("SELECT id,id_tradlang_module,str,comm,statut FROM spip_tradlangs WHERE module='".$source[1]."' and lang='".$source[2]."' GROUP BY id");
    6190        $count_original = 0;
    6291        while ($row=spip_mysql_fetch($res)) {
    6392                $row['statut'] = 'NEW';
    6493                $lorigine[$row['id']] = $row;
     94                if(!$id_tradlang_module)
     95                        $id_tradlang_module = $row['id_tradlang_module'];
    6596                $count_original++;
    6697        }
     
    118149                $orig = ($lang == $source[2]) ? $source[0] : false;
    119150
    120                 // ne pas ecrire le fichier si le taux de traduction est trop faible
    121                 if ($traduits < $count_original/2 AND $count_original >= 2) {
    122                         trad_log(" - trop peu traduit ($traduits/$count_original), ignore\n");
    123                 } else {
    124                         trad_log(" - traduction ($traduits/$count_original), export\n");
    125                         // historiquement les fichiers de lang de spip_loader ne peuvent pas etre securises
    126                         $secure = ($source[1] == 'tradloader')
    127                                 ? ''
    128                                 : "if (!defined('_ECRIRE_INC_VERSION')) return;\n\n";
    129 
    130                         $fd = fopen($tmp.$source[1]."/".$source[1].'_'.$lang.'.php', 'w');
    131 
    132                         # supprimer la virgule du dernier item
    133                         $x[count($x)-1] = preg_replace('/,([^,]*)$/', '\1', $x[count($x)-1]);
    134 
    135                         $contenu = join("\n",$x);
    136 
    137                         // L'URL du site de traduction
    138                         $url_site = sql_getfetsel('valeur','spip_meta','nom="adresse_site"');
    139                         $url_trad = $url_site;
    140                        
    141                         # ecrire le fichier
    142                         fwrite($fd,
    143                         '<'.'?php
     151                trad_log(" - traduction ($traduits/$count_original), export\n");
     152                // historiquement les fichiers de lang de spip_loader ne peuvent pas etre securises
     153                $secure = ($source[1] == 'tradloader')
     154                        ? ''
     155                        : "if (!defined('_ECRIRE_INC_VERSION')) return;\n\n";
     156
     157                $fd = fopen($tmp.$source[1]."/".$source[1].'_'.$lang.'.php', 'w');
     158
     159                # supprimer la virgule du dernier item
     160                $x[count($x)-1] = preg_replace('/,([^,]*)$/', '\1', $x[count($x)-1]);
     161
     162                $contenu = join("\n",$x);
     163
     164                // L'URL du site de traduction
     165                $url_trad = parametre_url($url_trad,'lang_cible',$lang);
     166                # ecrire le fichier
     167                fwrite($fd,
     168                '<'.'?php
    144169// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
    145170'
     
    147172. ($orig
    148173        ? '// Fichier source, a modifier dans '.$orig
    149         : '// extrait automatiquement de '.$url_trad.'
     174: '// extrait automatiquement de '.$url_trad.'
    150175// ** ne pas modifier le fichier **
    151176'
     
    153178."\n".$secure.'$GLOBALS[$GLOBALS[\'idx_lang\']] = array(
    154179'
    155         . str_replace("\r\n", "\n", $contenu)
    156         .'
     180. str_replace("\r\n", "\n", $contenu)
     181.'
    157182);
    158183
    159184?'.'>
    160185'
    161                         );
    162                         fclose($fd);
    163                        
    164                         // noter la langue et les traducteurs pour lang/module.xml
    165                         $traducteurs[$lang] = array();
    166                         $people_unique = array();
    167                         $s = spip_query('SELECT DISTINCT(traducteur) FROM spip_tradlangs WHERE module='._q($source[1])." and lang="._q($lang));
    168                         while ($t = sql_fetch($s)){
    169                                 $traducteurs_lang = explode(',',$t['traducteur']);
    170                                 foreach($traducteurs_lang as $traducteur){
    171                                         if(!in_array($traducteur,$people_unique)){
    172                                                 if(is_numeric($traducteur) AND $id_auteur=intval($traducteur)){
    173                                                         $traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom','spip_auteurs','id_auteur='.$id_auteur));
    174                                                         $traducteur_supp['lien'] = url_absolue(generer_url_entite($id_auteur,'auteur'),$url_site);
    175                                                 }else if(trim(strlen($traducteur)) > 0){
    176                                                         $traducteur_supp['nom'] = trim($traducteur);
    177                                                 }
    178                                                 if(isset($traducteur_supp['nom']))
    179                                                         $traducteurs[$lang][] = $traducteur_supp;
    180                                                 unset($traducteur_supp);
    181                                                 $people_unique[] = $traducteur;
     186                );
     187                fclose($fd);
     188               
     189                // noter la langue et les traducteurs pour lang/module.xml
     190                $traducteurs[$lang] = array();
     191                $people_unique = array();
     192                $s = spip_query('SELECT DISTINCT(traducteur) FROM spip_tradlangs WHERE module='._q($source[1])." and lang="._q($lang));
     193                while ($t = sql_fetch($s)){
     194                        $traducteurs_lang = explode(',',$t['traducteur']);
     195                        foreach($traducteurs_lang as $traducteur){
     196                                if(!in_array($traducteur,$people_unique)){
     197                                        if(is_numeric($traducteur) AND $id_auteur=intval($traducteur)){
     198                                                $traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom','spip_auteurs','id_auteur='.$id_auteur));
     199                                                $traducteur_supp['lien'] = url_absolue(generer_url_entite($id_auteur,'auteur'),$url_site);
     200                                        }else if(trim(strlen($traducteur)) > 0){
     201                                                $traducteur_supp['nom'] = trim($traducteur);
    182202                                        }
     203                                        if(isset($traducteur_supp['nom']))
     204                                                $traducteurs[$lang][] = $traducteur_supp;
     205                                        unset($traducteur_supp);
     206                                        $people_unique[] = $traducteur;
    183207                                }
    184208                        }
    185                         unset($people_unique);
    186                 }
     209                }
     210                unset($people_unique);
    187211        }
    188212
     
    191215        foreach($traducteurs as $lang => $peoples) {
    192216                if ($peoples) {
    193                         $xml .= "       <langue code=\"$lang\">\n";
     217                        $xml .= "       <langue code=\"$lang\" url=\"".parametre_url($url_trad,'lang_cible',$lang)."\">\n";
    194218                        foreach ($peoples as $people) {
    195219                                $xml .= "               <traducteur nom=\"".entites_html($people['nom'])."\" lien=\"".entites_html($people['lien'])."\" />\n";
  • _dev_/salvatore2/inc_tradlang.php

    r58440 r58648  
    5050
    5151define('_SALVATORE_TMP', _SALVATORE.'tmp/');
    52 if (!is_dir(_SALVATORE_TMP)) die ('Manque le repertoire '._SALVATORE_TMP);
     52if (!is_dir(_SALVATORE_TMP)) die ("\nErreur : le répertoire "._SALVATORE_TMP." n'existe pas\n\n");
    5353
    5454//
  • _dev_/salvatore2/lecteur.php

    r58440 r58648  
    3535include_spip('inc/charsets');
    3636include_spip('inc/filtres');
     37include_spip('inc/xml');
     38
     39$url_site = sql_getfetsel('valeur','spip_meta','nom="adresse_site"');
    3740
    3841/* MAIN ***********************************************************************/
     
    4548        trad_log("==== Module ".$source[1]." =======================================\n");
    4649        $liste_fic_lang= glob($tmp.$source[1].'/'.$source[1]."_*.php");
     50        $import = true;
    4751        /**
    48          * on doit absolument charger la langue principale en premier (a cause des MD5)
    49          */
    50         $fic_lang_principal=$tmp.$source[1].'/'.$source[1].'_'.$source[2].".php";
    51         $priorite = '';
    52         $modifs = 0;
    53         if(defined('_TRAD_PRIORITE_DEFAUT'))
    54                 $priorite = _TRAD_PRIORITE_DEFAUT;
    55         if (in_array($fic_lang_principal,$liste_fic_lang)) {
    56                 $module = sql_fetsel('*','spip_tradlang_modules','module='.sql_quote($source[1]));
    57                 $id_module = $module['id_tradlang_module'];
     52         * On test ici si le fichier est géré par un autre salvatore
     53         * Si oui on empeche son export en le signifiant
     54         */
     55        if(file_exists($xml = $tmp.$source[1].'/'.$source[1].'.xml')){
     56                $xml_content = spip_xml_load($xml);
     57                if(is_array($xml_content)){
     58                        spip_xml_match_nodes('/^traduction/',$xml_content,$matches);
     59                        $test = '<'.key($matches).'>';
     60                        $url = extraire_attribut($test,'url');
     61                        if($url && ($url != $url_site)){
     62                                $import = false;
     63                                trad_log("\nErreur : import impossible, le fichier est traduit autre part : $url\n\n");         
     64                        }
     65                }
     66        }
     67        if($import){
    5868                /**
    59                  * Si le module n'existe pas... on le crée
    60                  */
    61                 if(!intval($id_module)){
    62                         $id_module = sql_insertq('spip_tradlang_modules',
    63                                 array('module'=>$source[1],'nom_mod'=>$source[1],'lang_prefix'=>$source[1],'lang_mere'=>$source[2],'priorite' => $priorite)
    64                         );
    65                 }
    66                 /**
    67                  * Si la langue mere a changée, on la modifie
    68                  */
    69                 else if($module['lang_mere'] != $source[2]){
     69                 * on doit absolument charger la langue principale en premier (a cause des MD5)
     70                 */
     71                $fic_lang_principal=$tmp.$source[1].'/'.$source[1].'_'.$source[2].".php";
     72                $priorite = '';
     73                $modifs = 0;
     74                if(defined('_TRAD_PRIORITE_DEFAUT'))
     75                        $priorite = _TRAD_PRIORITE_DEFAUT;
     76                if (in_array($fic_lang_principal,$liste_fic_lang)) {
     77                        $module = sql_fetsel('*','spip_tradlang_modules','module='.sql_quote($source[1]));
    7078                        $id_module = $module['id_tradlang_module'];
    71                         sql_updateq('spip_tradlang_modules',array('lang_mere'=>$source[2]),'id_tradlang_module='.intval($id_module));
    72                 }
    73                 /**
    74                  * Si $id_module n'est pas un entier => on tue le script
    75                  */
    76                 if(!intval($id_module)){
    77                         die("Le module n'est pas un entier");
    78                 }
    79                 $liste_id_orig = array();
    80                 $modifs = import_module($source,$fic_lang_principal,$liste_id_orig,1,$id_module);
    81                 $langues_a_jour = array();
    82                 foreach ($liste_fic_lang as $f){
    83                         if ($f != $fic_lang_principal){
    84                                 import_module($source,$f,$liste_id_orig,0,$id_module);
    85                                 $fich = basename($f,".php");
    86                                 $fich = str_replace($source[1],'',$fich);
    87                                 list(,$lang)=explode("_",$fich,2);
    88                                 if(($modifs > 0) && function_exists('inc_tradlang_verifier_langue_base_dist')){
    89                                         inc_tradlang_verifier_langue_base_dist($source[1],$lang);
    90                                         trad_log("|-- Synchro de la langue ".$lang." pour le module ".$source[1]."\n");
    91                                 }else if (!function_exists('inc_tradlang_verifier_langue_base_dist')){
    92                                         trad_log("|-- Fonction de synchro inexistante\n");
    93                                 }
    94                                 $langues_a_jour[] = $lang;
    95                         }
    96                 }
    97                 /**
    98                  * On s'occupe des langues en base sans fichier
    99                  * s'il y a eu au moins une modif et que l'on peut faire la synchro
    100                  */
    101                 if(($modifs > 0) && function_exists('inc_tradlang_verifier_langue_base_dist')){
    102                         $langues_pas_a_jour = sql_select('lang','spip_tradlangs','id_tradlang_module='.intval($id_module).' AND '.sql_in('lang',$langues_a_jour,'NOT'),'lang');
    103                         while($langue_a_jour = sql_fetch($langues_pas_a_jour)){
    104                                 inc_tradlang_verifier_langue_base_dist($source[1],$langue_a_jour['lang']);
    105                                 trad_log("|-- Synchro de la langue non exportée en fichier ".$langue_a_jour['lang']." pour le module ".$source[1]."\n");
    106                         }
    107                 }
    108                 suivre_invalideur('1');
    109                 trad_log("|\n");
    110                 unset($langues_a_jour);
    111                 unset($langues_pas_a_jour);
    112         }
    113         else {
    114                 die("|-- Pas de fichier lang ".$source[2]." pour le module ".$source[1]." : import impossible pour ce module\n");
     79                        /**
     80                         * Si le module n'existe pas... on le crée
     81                         */
     82                        if(!intval($id_module)){
     83                                $id_module = sql_insertq('spip_tradlang_modules',
     84                                        array('module'=>$source[1],'nom_mod'=>$source[1],'lang_prefix'=>$source[1],'lang_mere'=>$source[2],'priorite' => $priorite)
     85                                );
     86                        }
     87                        /**
     88                         * Si la langue mere a changée, on la modifie
     89                         */
     90                        else if($module['lang_mere'] != $source[2]){
     91                                $id_module = $module['id_tradlang_module'];
     92                                sql_updateq('spip_tradlang_modules',array('lang_mere'=>$source[2]),'id_tradlang_module='.intval($id_module));
     93                        }
     94                        /**
     95                         * Si $id_module n'est pas un entier => on tue le script
     96                         */
     97                        if(!intval($id_module)){
     98                                die("Le module n'est pas un entier");
     99                        }
     100                        $liste_id_orig = array();
     101                        $modifs = import_module($source,$fic_lang_principal,$liste_id_orig,1,$id_module);
     102                        $langues_a_jour = array();
     103                        foreach ($liste_fic_lang as $f){
     104                                if ($f != $fic_lang_principal){
     105                                        import_module($source,$f,$liste_id_orig,0,$id_module);
     106                                        $fich = basename($f,".php");
     107                                        $fich = str_replace($source[1],'',$fich);
     108                                        list(,$lang)=explode("_",$fich,2);
     109                                        if(($modifs > 0) && function_exists('inc_tradlang_verifier_langue_base_dist')){
     110                                                inc_tradlang_verifier_langue_base_dist($source[1],$lang);
     111                                                trad_log("|-- Synchro de la langue ".$lang." pour le module ".$source[1]."\n");
     112                                        }else if (!function_exists('inc_tradlang_verifier_langue_base_dist')){
     113                                                trad_log("|-- Fonction de synchro inexistante\n");
     114                                        }
     115                                        $langues_a_jour[] = $lang;
     116                                }
     117                        }
     118                        /**
     119                         * On s'occupe des langues en base sans fichier
     120                         * s'il y a eu au moins une modif et que l'on peut faire la synchro
     121                         */
     122                        if(($modifs > 0) && function_exists('inc_tradlang_verifier_langue_base_dist')){
     123                                $langues_pas_a_jour = sql_select('lang','spip_tradlangs','id_tradlang_module='.intval($id_module).' AND '.sql_in('lang',$langues_a_jour,'NOT'),'lang');
     124                                while($langue_a_jour = sql_fetch($langues_pas_a_jour)){
     125                                        inc_tradlang_verifier_langue_base_dist($source[1],$langue_a_jour['lang']);
     126                                        trad_log("|-- Synchro de la langue non exportée en fichier ".$langue_a_jour['lang']." pour le module ".$source[1]."\n");
     127                                }
     128                        }
     129                        suivre_invalideur('1');
     130                        trad_log("|\n");
     131                        unset($langues_a_jour);
     132                        unset($langues_pas_a_jour);
     133                }
     134                else {
     135                        die("|-- Pas de fichier lang ".$source[2]." pour le module ".$source[1]." : import impossible pour ce module\n");
     136                }
    115137        }
    116138}
Note: See TracChangeset for help on using the changeset viewer.