Changeset 119834 in spip-zone


Ignore:
Timestamp:
Jan 20, 2020, 4:38:49 AM (5 weeks ago)
Author:
Cerdic
Message:

refactoring ecriveur, wip

Location:
_plugins_/trad-lang/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/trad-lang/trunk

    • Property subgit:lock:95b8b99287e746de20428b080e42622ab2db7b4d deleted
    • Property subgit:lock:31958fee15838b46471996f730740f5715b28985 set to 2020-01-20T09:05:29.575
  • _plugins_/trad-lang/trunk/inc/salvatore_ecriveur.php

    r119832 r119834  
    6161
    6262                if ($autre_gestionnaire = salvatore_verifier_gestionnaire_traduction($dir_module, $module)){
    63                         salvatore_fail("[Lecteur] Erreur sur $module", "Erreur : import impossible, le fichier est traduit autre part : $autre_gestionnaire\n");
    64                 }
    65 
    66                 $id_tradlang_module = sql_getfetsel('id_tradlang_module', 'spip_tradlang_modules', 'module = ' . sql_quote($source[1]));
    67 
    68                 // url de l'interface de traduction d'un module
    69                 $url_trad = url_absolue(generer_url_entite($id_tradlang_module, 'tradlang_module'), $url_gestionnaire);
    70                 export_trad_module($source, $url_gestionnaire, $url_trad, $message_commit);
     63                        salvatore_fail("[Ecriveur] Erreur sur $module", "Erreur : export impossible, le fichier est traduit autre part : $autre_gestionnaire\n");
     64                }
     65
     66                $id_tradlang_module = sql_getfetsel('id_tradlang_module', 'spip_tradlang_modules', 'dir_module = ' . sql_quote($source['dir_module']));
     67                if (!$id_tradlang_module) {
     68                        salvatore_fail("[Ecriveur] Erreur sur $module", "Erreur : export impossible, le module n'est pas en base\n");
     69                }
     70                else {
     71                        // url de l'interface de traduction d'un module
     72                        $url_trad_module = url_absolue(generer_url_entite($id_tradlang_module, 'tradlang_module'), $url_gestionnaire);
     73                        salvatore_exporter_module($id_tradlang_module, $source, $url_gestionnaire, $url_trad_module, $message_commit);
     74                }
    7175        }
    7276}
    7377
    74 //
    75 // Genere les fichiers de traduction d'un module
    76 // TODO
    77 //
    78 function export_trad_module($source, $url_site, $url_trad, $message_commit = ''){
    79         global $tmp;
    80 
    81         // sanity check
    82         if (!is_dir($tmp . $source[1] . '/')){
     78/**
     79 * Genere les fichiers de traduction d'un module
     80 *
     81 * @param int $id_tradlang_module
     82 * @param array $source
     83 * @param string $url_site
     84 * @param string $url_trad_module
     85 * @param string $dir_modules
     86 * @param string $message_commit
     87 */
     88function salvatore_exporter_module($id_tradlang_module, $source, $url_site, $url_trad_module, $dir_modules, $message_commit = ''){
     89
     90        $url_repo = $source['url'];
     91
     92        $row_module = sql_fetsel('*', 'spip_tradlang_modules', 'id_tradlang_module=' . intval($id_tradlang_module));
     93        if (!$row_module) {
     94                $module = $source['module'];
     95                salvatore_log("<error>Le module #$id_tradlang_module $module n'existe pas</error>");
    8396                return false;
    8497        }
    85 
    86         $module = sql_fetsel('id_tradlang_module,limite_trad,lang_mere', 'spip_tradlang_modules', 'module = ' . sql_quote($source[1]));
    87 
    88         $seuil_export = 50;
    89         if (is_numeric($module['limite_trad']) and $module['limite_trad']>0){
    90                 $seuil_export = $module['limite_trad'];
    91         } elseif (function_exists('lire_config')) {
    92                 $seuil_export = lire_config('tradlang/seuil_export_tradlang', 50);
    93         }
    94         if (intval($module['id_tradlang_module'])>=1){
    95                 // charger la langue originale, pour la copier si necessaire
    96                 $count_original = 0;
    97                 $res = sql_allfetsel('id, id_tradlang_module,str,comm,statut', 'spip_tradlangs', 'id_tradlang_module = ' . intval($module['id_tradlang_module']) . ' AND lang = ' . sql_quote($module['lang_mere']) . ' AND statut="OK"', 'id');
    98                 foreach ($res as $row){
    99                         $row['statut'] = 'NEW';
    100                         $lorigine[$row['id']] = $row;
    101                         $id_tradlang_module = $row['id_tradlang_module'];
    102                         $count_original++;
    103                 }
    104 
    105                 $liste_lang = $liste_lang_non_exportees = $liste_lang_supprimer = array();
    106                 $minimal = ceil((($count_original*$seuil_export)/100));
    107                 salvatore_log("\nMinimal = $minimal ($seuil_export %)\n");
    108 
    109                 $res = sql_allfetsel('lang,COUNT(*) as N', 'spip_tradlangs', 'module = ' . sql_quote($source[1]) . ' AND statut != "NEW" AND statut != "attic"', 'lang', 'lang');
    110                 foreach ($res as $row){
    111                         /**
    112                          * Le fichier est il suffisamment traduit
    113                          */
    114                         if ($row['N']>=$minimal){
    115                                 $liste_lang[] = $row['lang'];
     98        $lang_ref = $row_module['lang_mere'];
     99        $dir_module = $dir_modules . $row_module['dir_module'];
     100        $module = $row_module['module'];
     101
     102        if (is_numeric($row_module['limite_trad']) and $row_module['limite_trad']>0){
     103                $seuil_export = $row_module['limite_trad'];
     104        }
     105        else {
     106                $seuil_export = lire_config('tradlang/seuil_export_tradlang', _SALVATORE_SEUIL_EXPORT);
     107        }
     108
     109        // charger la langue originale, pour la copier si necessaire
     110        // TODO : simplifier ? aucune reference a $trad_reference
     111        $trad_reference = [];
     112        $count_trad_reference = 0;
     113        $rows = sql_allfetsel('id, id_tradlang_module,str,comm,statut', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . ' AND lang=' . sql_quote($row_module['lang_mere']) . " AND statut='OK'", 'id');
     114        foreach ($rows as $row){
     115                $row['statut'] = 'NEW';
     116                $trad_reference[$row['id']] = $row;
     117                $count_trad_reference++;
     118        }
     119
     120        $liste_lang = $liste_lang_non_exportees = $liste_lang_a_supprimer = array();
     121        $minimal = ceil((($count_trad_reference*$seuil_export)/100));
     122        salvatore_log("Minimal = $minimal ($seuil_export %)");
     123
     124        $langues = sql_allfetsel('lang,COUNT(*) as count', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . " AND statut != 'NEW' AND statut != 'attic'", 'lang', 'lang');
     125        foreach ($langues as $langue){
     126                /**
     127                 * Le fichier est il suffisamment traduit
     128                 */
     129                if ($langue['count']>=$minimal){
     130                        $liste_lang[] = $langue['lang'];
     131                }
     132                else {
     133                        /**
     134                         * Le fichier n'est pas suffisamment traduit et n'existe pas, on ne fera donc rien
     135                         */
     136                        if (!file_exists($dir_module . '/' . $module . '_' . $row['lang'] . '.php')){
     137                                $liste_lang_non_exportees[] = $row['lang'];
    116138                        } else {
    117139                                /**
    118                                  * Le fichier n'est pas suffisamment traduit et n'existe pas, on ne fera donc rien
     140                                 * Il n'est pas suffisamment traduit, cependant, il existe déjà
     141                                 * On ne va donc pas le supprimer à la barbare, mais on le met à jour quand même
    119142                                 */
    120                                 if (!file_exists($tmp . $source[1] . '/' . $source[1] . '_' . $row['lang'] . '.php')){
    121                                         $liste_lang_non_exportees[] = $row['lang'];
    122                                 } else {
    123                                         /**
    124                                          * Il n'est pas suffisamment traduit, cependant, il existe déjà
    125                                          * On ne va donc pas le supprimer à la barbare, mais on le met à jour quand même
    126                                          */
    127                                         $liste_lang[] = $row['lang'];
    128                                         $liste_lang_supprimer[] = $row['lang'];
    129                                         $percent = (($row['N']/$count_original)*100);
    130                                         if ($percent<($seuil_export-15)){
    131                                                 $message_commit .= "La langue '" . $row['lang'] . "' devrait être supprimée car trop peu traduite (" . number_format($percent, 2) . " %)\n";
    132                                         }
    133                                 }
    134                         }
    135                 }
    136 
    137                 // traiter chaque langue
    138                 $infos = $commiteurs = array();
    139                 foreach ($liste_lang as $lang){
    140                         salvatore_log("Generation de la langue $lang ");
    141                         // Proteger les caracteres typographiques a l'interieur des tags html
    142                         $typo = (in_array($lang, array('eo', 'fr', 'cpf')) || strncmp($lang, 'fr_', 3)==0) ? 'fr' : 'en';
    143                         $typographie = charger_fonction($typo, 'typographie');
    144                         $tab = "\t";
    145 
    146                         $x = $tous = $tradlangs = array();
    147                         $prev = '';
    148                         $traduits = $modifs = $relire = 0;
    149 
    150                         // On ne prend que les MODIF, les RELIRE et les OK pour ne pas rendre les sites multilingues en français
    151                         $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');
    152                         foreach ($res as $row){
    153                                 $tradlangs[] = $row['id_tradlang'];
    154                                 $tous[$row['id']] = $row;
    155                         }
    156                         ksort($tous);
    157 
    158                         foreach ($tous as $row){
    159                                 if ($row['statut']=='OK'){
    160                                         $traduits++;
    161                                 } elseif ($row['statut']=='MODIF') {
    162                                         $modifs++;
    163                                 } elseif ($row['statut']=='RELIRE') {
    164                                         $relire++;
    165                                 }
    166 
    167                                 if (strlen($row['comm'])>1){
    168                                         // On remplace les sauts de lignes des commentaires sinon ça crée des erreurs php
    169                                         $row['comm'] = str_replace(array("\r\n", "\n", "\r"), ' ', $row['comm']);
    170                                         // Conversion des commentaires en utf-8
    171                                         $row['comm'] = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $row['comm']), ENT_NOQUOTES, 'utf-8'));
    172                                 }
    173 
    174                                 if ($prev!=strtoupper($row['id'][0])){
    175                                         $x[] = "\n$tab// " . strtoupper($row['id'][0]);
    176                                 }
    177                                 $prev = strtoupper($row['id'][0]);
    178 
    179                                 if (strlen($row['statut']) and ($row['statut']!='OK')){
    180                                         $row['comm'] .= ' ' . $row['statut'];
    181                                 }
    182                                 if (trim($row['comm'])){
    183                                         $row['comm'] = ' # ' . trim($row['comm']); // on rajoute les commentaires ?
    184                                 }
    185 
    186                                 $str = $row['str'];
    187 
    188                                 /**
    189                                  * On enlève les sauts de lignes windows pour des sauts de ligne linux
    190                                  */
    191                                 $str = str_replace("\r\n", "\n", $str);
    192 
    193                                 /**
    194                                  * protection dans les balises genre <a href="..." ou <img src="..."
    195                                  * cf inc/filtres
    196                                  */
    197                                 if (preg_match_all(_TYPO_BALISE, $str, $regs, PREG_SET_ORDER)){
    198                                         foreach ($regs as $reg){
    199                                                 $insert = $reg[0];
    200                                                 // hack: on transforme les caracteres a proteger en les remplacant
    201                                                 // par des caracteres "illegaux". (cf corriger_caracteres())
    202                                                 $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
    203                                                 $str = str_replace($reg[0], $insert, $str);
    204                                         }
    205                                 }
    206 
    207                                 /**
    208                                  * Protéger le contenu des balises <html> <code> <cadre> <frame> <tt> <pre>
    209                                  */
    210                                 define('_PROTEGE_BLOCS_HTML', ',<(html|code|cadre|pre|tt)(\s[^>]*)?>(.*)</\1>,UimsS');
    211                                 if ((strpos($str, '<')!==false) and preg_match_all(_PROTEGE_BLOCS_HTML, $str, $matches, PREG_SET_ORDER)){
    212                                         foreach ($matches as $reg){
    213                                                 $insert = $reg[0];
    214                                                 // hack: on transforme les caracteres a proteger en les remplacant
    215                                                 // par des caracteres "illegaux". (cf corriger_caracteres())
    216                                                 $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
    217                                                 $str = str_replace($reg[0], $insert, $str);
    218                                         }
    219                                 }
    220 
    221                                 /**
    222                                  * On applique la typographie de la langue
    223                                  */
    224                                 $str = $typographie($str);
    225                                 /**
    226                                  * On remet les caractères normaux sur les caractères illégaux
    227                                  */
    228                                 $str = strtr($str, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
    229 
    230                                 $str = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $str), ENT_NOQUOTES, 'utf-8'));
    231 
    232                                 /**
    233                                  * Calcul du nouveau md5
    234                                  */
    235                                 $newmd5 = md5($str);
    236 
    237                                 /**
    238                                  * Si le md5 ou la chaine à changé, on la met à jour dans la base
    239                                  */
    240                                 if (($row['md5']!=$newmd5) || ($str!=$row['str'])){
    241                                         $r = sql_updateq('spip_tradlangs', array('md5' => $newmd5, 'str' => $str), 'id_tradlang = ' . intval($row['id_tradlang']));
    242                                 }
    243 
    244                                 $x[] = $tab . var_export($row['id'], 1) . ' => ' . var_export($str, 1) . ',' . $row['comm'];
    245                         }
    246                         $orig = ($lang==$source[2]) ? $source[0] : false;
    247 
    248                         salvatore_log(" - traduction ($traduits/$count_original OK | $relire/$count_original RELIRE | $modifs/$count_original MODIFS), export\n");
    249                         // historiquement les fichiers de lang de spip_loader ne peuvent pas etre securises
    250                         $secure = ($source[1]=='tradloader')
    251                                 ? ''
    252                                 : "if (!defined('_ECRIRE_INC_VERSION')) {
    253         return;
     143                                $liste_lang[] = $langue['lang'];
     144                                $liste_lang_a_supprimer[] = $langue['lang'];
     145                                $percent = (($row['N']/$count_trad_reference)*100);
     146                                if ($percent<($seuil_export-15)){
     147                                        $message_commit .= "La langue '" . $langue['lang'] . "' devrait être supprimée car trop peu traduite (" . number_format($percent, 2) . " %)\n";
     148                                }
     149                        }
     150                }
     151        }
     152
     153        // traiter chaque langue
     154        $infos = $commiteurs = array();
     155        foreach ($liste_lang as $lang){
     156                salvatore_log("Generation de la langue $lang ");
     157                // Proteger les caracteres typographiques a l'interieur des tags html
     158                $typo = (in_array($lang, array('eo', 'fr', 'cpf')) || strncmp($lang, 'fr_', 3)==0) ? 'fr' : 'en';
     159                $typographie = charger_fonction($typo, 'typographie');
     160                $tab = "\t";
     161
     162                $x = $tous = $tradlangs = array();
     163                $prev = '';
     164                $traduits = $modifs = $relire = 0;
     165
     166                // On ne prend que les MODIF, les RELIRE et les OK pour ne pas rendre les sites multilingues en français
     167                $res = sql_allfetsel('id_tradlang,id,str,comm,statut,md5', 'spip_tradlangs', 'module = "' . $module . '" AND lang = "' . $lang . '" AND statut != "NEW" AND statut != "attic"', 'id');
     168                foreach ($res as $row){
     169                        $tradlangs[] = $row['id_tradlang'];
     170                        $tous[$row['id']] = $row;
     171                }
     172                ksort($tous);
     173
     174                foreach ($tous as $row){
     175                        if ($row['statut']=='OK'){
     176                                $traduits++;
     177                        } elseif ($row['statut']=='MODIF') {
     178                                $modifs++;
     179                        } elseif ($row['statut']=='RELIRE') {
     180                                $relire++;
     181                        }
     182
     183                        if (strlen($row['comm'])>1){
     184                                // On remplace les sauts de lignes des commentaires sinon ça crée des erreurs php
     185                                $row['comm'] = str_replace(array("\r\n", "\n", "\r"), ' ', $row['comm']);
     186                                // Conversion des commentaires en utf-8
     187                                $row['comm'] = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $row['comm']), ENT_NOQUOTES, 'utf-8'));
     188                        }
     189
     190                        if ($prev!=strtoupper($row['id'][0])){
     191                                $x[] = "\n$tab// " . strtoupper($row['id'][0]);
     192                        }
     193                        $prev = strtoupper($row['id'][0]);
     194
     195                        if (strlen($row['statut']) and ($row['statut']!='OK')){
     196                                $row['comm'] .= ' ' . $row['statut'];
     197                        }
     198                        if (trim($row['comm'])){
     199                                $row['comm'] = ' # ' . trim($row['comm']); // on rajoute les commentaires ?
     200                        }
     201
     202                        $str = $row['str'];
     203
     204                        /**
     205                         * On enlève les sauts de lignes windows pour des sauts de ligne linux
     206                         */
     207                        $str = str_replace("\r\n", "\n", $str);
     208
     209                        /**
     210                         * protection dans les balises genre <a href="..." ou <img src="..."
     211                         * cf inc/filtres
     212                         */
     213                        if (preg_match_all(_TYPO_BALISE, $str, $regs, PREG_SET_ORDER)){
     214                                foreach ($regs as $reg){
     215                                        $insert = $reg[0];
     216                                        // hack: on transforme les caracteres a proteger en les remplacant
     217                                        // par des caracteres "illegaux". (cf corriger_caracteres())
     218                                        $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
     219                                        $str = str_replace($reg[0], $insert, $str);
     220                                }
     221                        }
     222
     223                        /**
     224                         * Protéger le contenu des balises <html> <code> <cadre> <frame> <tt> <pre>
     225                         */
     226                        define('_PROTEGE_BLOCS_HTML', ',<(html|code|cadre|pre|tt)(\s[^>]*)?>(.*)</\1>,UimsS');
     227                        if ((strpos($str, '<')!==false) and preg_match_all(_PROTEGE_BLOCS_HTML, $str, $matches, PREG_SET_ORDER)){
     228                                foreach ($matches as $reg){
     229                                        $insert = $reg[0];
     230                                        // hack: on transforme les caracteres a proteger en les remplacant
     231                                        // par des caracteres "illegaux". (cf corriger_caracteres())
     232                                        $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
     233                                        $str = str_replace($reg[0], $insert, $str);
     234                                }
     235                        }
     236
     237                        /**
     238                         * On applique la typographie de la langue
     239                         */
     240                        $str = $typographie($str);
     241                        /**
     242                         * On remet les caractères normaux sur les caractères illégaux
     243                         */
     244                        $str = strtr($str, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
     245
     246                        $str = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $str), ENT_NOQUOTES, 'utf-8'));
     247
     248                        /**
     249                         * Calcul du nouveau md5
     250                         */
     251                        $newmd5 = md5($str);
     252
     253                        /**
     254                         * Si le md5 ou la chaine à changé, on la met à jour dans la base
     255                         */
     256                        if (($row['md5']!=$newmd5) || ($str!=$row['str'])){
     257                                $r = sql_updateq('spip_tradlangs', array('md5' => $newmd5, 'str' => $str), 'id_tradlang = ' . intval($row['id_tradlang']));
     258                        }
     259
     260                        $x[] = $tab . var_export($row['id'], 1) . ' => ' . var_export($str, 1) . ',' . $row['comm'];
     261                }
     262                $orig = ($lang==$lang_ref) ? $url_repo : false;
     263
     264                salvatore_log(" - traduction ($traduits/$count_trad_reference OK | $relire/$count_trad_reference RELIRE | $modifs/$count_trad_reference MODIFS), export\n");
     265                // historiquement les fichiers de lang de spip_loader ne peuvent pas etre securises
     266                $secure = ($module=='tradloader')
     267                        ? ''
     268                        : "if (!defined('_ECRIRE_INC_VERSION')) {
     269return;
    254270}\n\n";
    255271
    256                         $fd = fopen($tmp . $source[1] . '/' . $source[1] . '_' . $lang . '.php', 'w');
    257 
    258                         # supprimer la virgule du dernier item
    259                         $x[count($x)-1] = preg_replace('/,([^,]*)$/', '\1', $x[count($x)-1]);
    260 
    261                         $contenu = join("\n", $x);
    262 
    263                         // L'URL du site de traduction
    264                         $url_trad = parametre_url($url_trad, 'lang_cible', $lang);
    265                         /**
    266                         * Ecrire le fichier de langue complet
    267                         */
    268                         fwrite(
    269                                 $fd,
    270                                 '<' . '?php
     272                $fd = fopen($dir_module . '/' . $module . '_' . $lang . '.php', 'w');
     273
     274                # supprimer la virgule du dernier item
     275                $x[count($x)-1] = preg_replace('/,([^,]*)$/', '\1', $x[count($x)-1]);
     276
     277                $contenu = join("\n", $x);
     278
     279                // L'URL du site de traduction
     280                $url_trad_module = parametre_url($url_trad_module, 'lang_cible', $lang);
     281                /**
     282                * Ecrire le fichier de langue complet
     283                */
     284                fwrite(
     285                        $fd,
     286                        '<' . '?php
    271287// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
    272288'
    273289
    274                                 . ($orig
    275                                         ? '// Fichier source, a modifier dans ' . $orig
    276                                         : '// extrait automatiquement de ' . $url_trad . '
     290                        . ($orig
     291                                ? '// Fichier source, a modifier dans ' . $orig
     292                                : '// extrait automatiquement de ' . $url_trad_module . '
    277293// ** ne pas modifier le fichier **
    278294'
    279                                 )
    280                                 . "\n" . $secure . '$GLOBALS[$GLOBALS[\'idx_lang\']] = array(
     295                        )
     296                        . "\n" . $secure . '$GLOBALS[$GLOBALS[\'idx_lang\']] = array(
    281297'
    282                                 . $contenu
    283                                 . '
     298                        . $contenu
     299                        . '
    284300);
    285301'
    286                         );
    287                         fclose($fd);
    288 
    289                         // noter la langue et les traducteurs pour lang/module.xml
    290                         $infos[$lang] = $people_unique = array();
    291                         $infos[$lang]['traducteurs'] = array();
    292                         $infos[$lang]['traduits'] = $traduits;
    293                         $infos[$lang]['modifs'] = $modifs;
    294                         $infos[$lang]['relire'] = $relire;
    295                         if (defined('_ID_AUTEUR_SALVATORE') and intval(_ID_AUTEUR_SALVATORE)>0){
    296                                 $people_unique[] = _ID_AUTEUR_SALVATORE;
    297                         }
    298                         $s = sql_allfetsel('DISTINCT(traducteur)', 'spip_tradlangs', 'id_tradlang_module = ' . intval($module['id_tradlang_module']) . ' AND lang = ' . sql_quote($lang));
    299                         foreach ($s as $t){
    300                                 $traducteurs_lang = explode(',', $t['traducteur']);
    301                                 foreach ($traducteurs_lang as $traducteur){
    302                                         if (!in_array($traducteur, $people_unique)){
    303                                                 if (is_numeric($traducteur) and $id_auteur = intval($traducteur)){
    304                                                         $traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom', 'spip_auteurs', 'id_auteur = ' . $id_auteur));
    305                                                         $traducteur_supp['lien'] = url_absolue(generer_url_entite($id_auteur, 'auteur'), $url_site);
    306                                                 } elseif (trim(strlen($traducteur))>0) {
    307                                                         $traducteur_supp['nom'] = trim($traducteur);
    308                                                         $traducteur_supp['lien'] = '';
    309                                                 }
    310                                                 if (isset($traducteur_supp['nom'])){
    311                                                         $infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp;
    312                                                 }
    313                                                 unset($traducteur_supp);
    314                                                 $people_unique[] = $traducteur;
     302                );
     303                fclose($fd);
     304
     305                // noter la langue et les traducteurs pour lang/module.xml
     306                $infos[$lang] = $people_unique = array();
     307                $infos[$lang]['traducteurs'] = array();
     308                $infos[$lang]['traduits'] = $traduits;
     309                $infos[$lang]['modifs'] = $modifs;
     310                $infos[$lang]['relire'] = $relire;
     311                if (defined('_ID_AUTEUR_SALVATORE') and intval(_ID_AUTEUR_SALVATORE)>0){
     312                        $people_unique[] = _ID_AUTEUR_SALVATORE;
     313                }
     314                $s = sql_allfetsel('DISTINCT(traducteur)', 'spip_tradlangs', 'id_tradlang_module = ' . intval($row_module['id_tradlang_module']) . ' AND lang = ' . sql_quote($lang));
     315                foreach ($s as $t){
     316                        $traducteurs_lang = explode(',', $t['traducteur']);
     317                        foreach ($traducteurs_lang as $traducteur){
     318                                if (!in_array($traducteur, $people_unique)){
     319                                        if (is_numeric($traducteur) and $id_auteur = intval($traducteur)){
     320                                                $traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom', 'spip_auteurs', 'id_auteur = ' . $id_auteur));
     321                                                $traducteur_supp['lien'] = url_absolue(generer_url_entite($id_auteur, 'auteur'), $url_site);
     322                                        } elseif (trim(strlen($traducteur))>0) {
     323                                                $traducteur_supp['nom'] = trim($traducteur);
     324                                                $traducteur_supp['lien'] = '';
    315325                                        }
    316                                 }
    317                         }
    318                         unset($people_unique);
    319 
    320                         if (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . '_' . $lang . '.php'), 0, 1)=='?'){
    321                                 if ($module['limite_trad']==0){
    322                                         passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php 2> /dev/null") ? salvatore_log("$log\n") : '';
    323                                 } elseif (!in_array($source[1], array('ecrire', 'spip', 'public'))) {
    324                                         if ((intval(($infos[$lang]['traduits']/$count_original)*100)>$seuil_export)){
    325                                                 passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
     326                                        if (isset($traducteur_supp['nom'])){
     327                                                $infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp;
    326328                                        }
    327                                 }
    328                         }
    329                         /**
    330                          * Le fichier a été modifié ou ajouté (svn status A ou M)
    331                          *
    332                          * On récupère la date de dernier changement avec svn info
    333                          * On cherche toutes les dernières modifications dans la base de donnée
    334                          * Si un seul auteur de révisions (Hors salvatore et -1) on l'ajoute comme commiteur
    335                          * Si plusieurs auteurs le commiteur sera Salvatore
    336                          */
    337                         if (in_array(substr(exec('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php"), 0, 1), array('A', 'M'))){
    338                                 $last_change = exec('env LC_MESSAGES=en_US.UTF-8 svn info ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php | awk '/^Last Changed Date/ { print $4 \" \" $5 }'");
    339                                 $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');
    340                                 if (count($auteur_versions)==1){
    341                                         $email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur = ' . intval($auteur_versions[0]['id_auteur']));
    342                                         if ($email){
    343                                                 $commiteurs[$lang] = $email;
    344                                         }
    345                                         salvatore_log("\nLe commiteur sera pour la langue $lang : " . $commiteurs[$lang] . " \n");
    346                                 }
    347                         }
    348                 }
    349 
    350                 // ecrire lang/module.xml
    351                 $xml = "<traduction module=\"$source[1]\" gestionnaire=\"salvatore\" url=\"$url_site\" source=\"$source[0]\" reference=\"$source[2]\">\n";
    352                 foreach ($infos as $lang => $info){
    353                         if (count($info['traducteurs']>0)){
    354                                 $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";
    355                                 ksort($info['traducteurs']);
    356                                 foreach ($info['traducteurs'] as $nom => $people){
    357                                         $xml .= '               <traducteur nom="' . entites_html($people['nom']) . '" lien="' . entites_html($people['lien']) . "\" />\n";
    358                                 }
    359                                 $xml .= "       </langue>\n";
    360                         } else {
    361                                 $xml .= "       <langue code=\"$lang\" url=\"" . parametre_url($url_trad, 'lang_cible', $lang) . "\" />\n";
    362                         }
    363                 }
    364                 unset($traducteurs[$source[2]]);
    365                 $xml .= "</traduction>\n";
    366 
    367                 ecrire_fichier($tmp . $source[1] . '/' . $source[1] . '.xml', $xml);
    368 
    369                 if (isset($liste_lang_non_exportees) and (count($liste_lang_non_exportees)>0)){
    370                         $liste_lang_non_exportees_string = implode(', ', $liste_lang_non_exportees);
    371                         salvatore_log("\nLes langues suivantes ne sont pas exportées car trop peu traduites:\n");
    372                         salvatore_log("$liste_lang_non_exportees_string\n");
    373                 }
    374                 if (isset($liste_lang_supprimer) and (count($liste_lang_supprimer)>0)){
    375                         $liste_lang_supprimer_string = implode(', ', $liste_lang_supprimer);
    376                         salvatore_log("\nLes langues suivantes devraient être supprimées car trop peu traduites:\n");
    377                         salvatore_log("$liste_lang_supprimer_string\n");
    378                 }
    379                 if ($module['limite_trad']==0){
    380                         foreach ($liste_lang as $lang){
    381                                 passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
    382                         }
    383                 } elseif (!in_array($source[1], array('ecrire', 'spip', 'public'))) {
    384                         salvatore_log('Limite trad = ' . $seuil_export);
    385                         foreach ($liste_lang as $lang){
    386                                 if ((intval(($infos[$lang]['traduits']/$count_original)*100)>$seuil_export)
    387                                         and (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php"), 0, 1)=='?')){
    388                                         passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
    389                                 }
    390                         }
    391                 }
    392                 salvatore_log("\n" . passthru('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/') . "\n");
    393                 if (strlen($message_commit)>1 || count($commiteurs)>0){
    394                         $fd = fopen($tmp . $source[1] . '/message_commit.inc', 'w');
    395                         # ecrire le fichier
    396                         fwrite(
    397                                 $fd,
    398                                 '<' . '?php
     329                                        unset($traducteur_supp);
     330                                        $people_unique[] = $traducteur;
     331                                }
     332                        }
     333                }
     334                unset($people_unique);
     335
     336                if (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . '_' . $lang . '.php'), 0, 1)=='?'){
     337                        if ($row_module['limite_trad']==0){
     338                                passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php 2> /dev/null") ? salvatore_log("$log\n") : '';
     339                        } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) {
     340                                if ((intval(($infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)){
     341                                        passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
     342                                }
     343                        }
     344                }
     345                /**
     346                 * Le fichier a été modifié ou ajouté (svn status A ou M)
     347                 *
     348                 * On récupère la date de dernier changement avec svn info
     349                 * On cherche toutes les dernières modifications dans la base de donnée
     350                 * Si un seul auteur de révisions (Hors salvatore et -1) on l'ajoute comme commiteur
     351                 * Si plusieurs auteurs le commiteur sera Salvatore
     352                 */
     353                if (in_array(substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1), array('A', 'M'))){
     354                        $last_change = exec('env LC_MESSAGES=en_US.UTF-8 svn info ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php | awk '/^Last Changed Date/ { print $4 \" \" $5 }'");
     355                        $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');
     356                        if (count($auteur_versions)==1){
     357                                $email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur = ' . intval($auteur_versions[0]['id_auteur']));
     358                                if ($email){
     359                                        $commiteurs[$lang] = $email;
     360                                }
     361                                salvatore_log("\nLe commiteur sera pour la langue $lang : " . $commiteurs[$lang] . " \n");
     362                        }
     363                }
     364        }
     365
     366        // ecrire lang/module.xml
     367        $xml = "<traduction module=\"$module\" gestionnaire=\"salvatore\" url=\"$url_site\" source=\"$url_repo\" reference=\"$lang_ref\">\n";
     368        foreach ($infos as $lang => $info){
     369                if (count($info['traducteurs']>0)){
     370                        $xml .= "       <langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" total=\"$count_trad_reference\" traduits=\"" . $info['traduits'] . '" relire="' . $info['relire'] . '" modifs="' . $info['modifs'] . '" nouveaux="' . ($count_trad_reference-($info['modifs']+$info['traduits']+$info['relire'])) . '" pourcent="' . number_format((($info['traduits']/$count_trad_reference)*100), 2) . "\">\n";
     371                        ksort($info['traducteurs']);
     372                        foreach ($info['traducteurs'] as $nom => $people){
     373                                $xml .= '               <traducteur nom="' . entites_html($people['nom']) . '" lien="' . entites_html($people['lien']) . "\" />\n";
     374                        }
     375                        $xml .= "       </langue>\n";
     376                } else {
     377                        $xml .= "       <langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" />\n";
     378                }
     379        }
     380        unset($traducteurs[$lang_ref]);
     381        $xml .= "</traduction>\n";
     382
     383        ecrire_fichier($dir_module . '/' . $module . '.xml', $xml);
     384
     385        if (isset($liste_lang_non_exportees) and (count($liste_lang_non_exportees)>0)){
     386                $liste_lang_non_exportees_string = implode(', ', $liste_lang_non_exportees);
     387                salvatore_log("\nLes langues suivantes ne sont pas exportées car trop peu traduites:\n");
     388                salvatore_log("$liste_lang_non_exportees_string\n");
     389        }
     390        if (isset($liste_lang_a_supprimer) and (count($liste_lang_a_supprimer)>0)){
     391                $liste_lang_a_supprimer_string = implode(', ', $liste_lang_a_supprimer);
     392                salvatore_log("\nLes langues suivantes devraient être supprimées car trop peu traduites:\n");
     393                salvatore_log("$liste_lang_a_supprimer_string\n");
     394        }
     395        if ($row_module['limite_trad']==0){
     396                foreach ($liste_lang as $lang){
     397                        passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
     398                }
     399        } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) {
     400                salvatore_log('Limite trad = ' . $seuil_export);
     401                foreach ($liste_lang as $lang){
     402                        if ((intval(($infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)
     403                                and (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1)=='?')){
     404                                passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
     405                        }
     406                }
     407        }
     408        salvatore_log("\n" . passthru('svn status ' . _DIR_SALVATORE_TMP . $module . '/') . "\n");
     409        if (strlen($message_commit)>1 || count($commiteurs)>0){
     410                $fd = fopen($dir_module . '/message_commit.inc', 'w');
     411                # ecrire le fichier
     412                fwrite(
     413                        $fd,
     414                        '<' . '?php
    399415$message_commit = "' . $message_commit . '";
    400416
     
    403419?' . '>
    404420'
    405                         );
    406                         fclose($fd);
    407                 }
    408         } else {
    409                 salvatore_log("\n Ce module n'existe pas\n");
     421                );
     422                fclose($fd);
    410423        }
    411424}
Note: See TracChangeset for help on using the changeset viewer.