diff --git a/inc/salvatore_ecriveur.php b/inc/salvatore_ecriveur.php index 2f1387ec9152c9c57e716507e53165e9a6c809b6..79558a16b7d50c5874ffa552bf7a6b1fbc8bd4c7 100644 --- a/inc/salvatore_ecriveur.php +++ b/inc/salvatore_ecriveur.php @@ -60,352 +60,365 @@ function salvatore_ecrire($liste_sources, $dir_modules = null, $message_commit=' $dir_module = $dir_modules . $source['dir_module']; if ($autre_gestionnaire = salvatore_verifier_gestionnaire_traduction($dir_module, $module)){ - salvatore_fail("[Lecteur] Erreur sur $module", "Erreur : import impossible, le fichier est traduit autre part : $autre_gestionnaire\n"); + salvatore_fail("[Ecriveur] Erreur sur $module", "Erreur : export impossible, le fichier est traduit autre part : $autre_gestionnaire\n"); } - $id_tradlang_module = sql_getfetsel('id_tradlang_module', 'spip_tradlang_modules', 'module = ' . sql_quote($source[1])); - - // url de l'interface de traduction d'un module - $url_trad = url_absolue(generer_url_entite($id_tradlang_module, 'tradlang_module'), $url_gestionnaire); - export_trad_module($source, $url_gestionnaire, $url_trad, $message_commit); + $id_tradlang_module = sql_getfetsel('id_tradlang_module', 'spip_tradlang_modules', 'dir_module = ' . sql_quote($source['dir_module'])); + if (!$id_tradlang_module) { + salvatore_fail("[Ecriveur] Erreur sur $module", "Erreur : export impossible, le module n'est pas en base\n"); + } + else { + // url de l'interface de traduction d'un module + $url_trad_module = url_absolue(generer_url_entite($id_tradlang_module, 'tradlang_module'), $url_gestionnaire); + salvatore_exporter_module($id_tradlang_module, $source, $url_gestionnaire, $url_trad_module, $message_commit); + } } } -// -// Genere les fichiers de traduction d'un module -// TODO -// -function export_trad_module($source, $url_site, $url_trad, $message_commit = ''){ - global $tmp; +/** + * Genere les fichiers de traduction d'un module + * + * @param int $id_tradlang_module + * @param array $source + * @param string $url_site + * @param string $url_trad_module + * @param string $dir_modules + * @param string $message_commit + */ +function salvatore_exporter_module($id_tradlang_module, $source, $url_site, $url_trad_module, $dir_modules, $message_commit = ''){ - // sanity check - if (!is_dir($tmp . $source[1] . '/')){ + $url_repo = $source['url']; + + $row_module = sql_fetsel('*', 'spip_tradlang_modules', 'id_tradlang_module=' . intval($id_tradlang_module)); + if (!$row_module) { + $module = $source['module']; + salvatore_log("<error>Le module #$id_tradlang_module $module n'existe pas</error>"); return false; } + $lang_ref = $row_module['lang_mere']; + $dir_module = $dir_modules . $row_module['dir_module']; + $module = $row_module['module']; - $module = sql_fetsel('id_tradlang_module,limite_trad,lang_mere', 'spip_tradlang_modules', 'module = ' . sql_quote($source[1])); - - $seuil_export = 50; - if (is_numeric($module['limite_trad']) and $module['limite_trad']>0){ - $seuil_export = $module['limite_trad']; - } elseif (function_exists('lire_config')) { - $seuil_export = lire_config('tradlang/seuil_export_tradlang', 50); + if (is_numeric($row_module['limite_trad']) and $row_module['limite_trad']>0){ + $seuil_export = $row_module['limite_trad']; + } + else { + $seuil_export = lire_config('tradlang/seuil_export_tradlang', _SALVATORE_SEUIL_EXPORT); } - if (intval($module['id_tradlang_module'])>=1){ - // charger la langue originale, pour la copier si necessaire - $count_original = 0; - $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'); - foreach ($res as $row){ - $row['statut'] = 'NEW'; - $lorigine[$row['id']] = $row; - $id_tradlang_module = $row['id_tradlang_module']; - $count_original++; - } - $liste_lang = $liste_lang_non_exportees = $liste_lang_supprimer = array(); - $minimal = ceil((($count_original*$seuil_export)/100)); - salvatore_log("\nMinimal = $minimal ($seuil_export %)\n"); + // charger la langue originale, pour la copier si necessaire + // TODO : simplifier ? aucune reference a $trad_reference + $trad_reference = []; + $count_trad_reference = 0; + $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'); + foreach ($rows as $row){ + $row['statut'] = 'NEW'; + $trad_reference[$row['id']] = $row; + $count_trad_reference++; + } - $res = sql_allfetsel('lang,COUNT(*) as N', 'spip_tradlangs', 'module = ' . sql_quote($source[1]) . ' AND statut != "NEW" AND statut != "attic"', 'lang', 'lang'); - foreach ($res as $row){ + $liste_lang = $liste_lang_non_exportees = $liste_lang_a_supprimer = array(); + $minimal = ceil((($count_trad_reference*$seuil_export)/100)); + salvatore_log("Minimal = $minimal ($seuil_export %)"); + + $langues = sql_allfetsel('lang,COUNT(*) as count', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . " AND statut != 'NEW' AND statut != 'attic'", 'lang', 'lang'); + foreach ($langues as $langue){ + /** + * Le fichier est il suffisamment traduit + */ + if ($langue['count']>=$minimal){ + $liste_lang[] = $langue['lang']; + } + else { /** - * Le fichier est il suffisamment traduit + * Le fichier n'est pas suffisamment traduit et n'existe pas, on ne fera donc rien */ - if ($row['N']>=$minimal){ - $liste_lang[] = $row['lang']; + if (!file_exists($dir_module . '/' . $module . '_' . $row['lang'] . '.php')){ + $liste_lang_non_exportees[] = $row['lang']; } else { /** - * Le fichier n'est pas suffisamment traduit et n'existe pas, on ne fera donc rien + * Il n'est pas suffisamment traduit, cependant, il existe déjà + * On ne va donc pas le supprimer à la barbare, mais on le met à jour quand même */ - if (!file_exists($tmp . $source[1] . '/' . $source[1] . '_' . $row['lang'] . '.php')){ - $liste_lang_non_exportees[] = $row['lang']; - } else { - /** - * Il n'est pas suffisamment traduit, cependant, il existe déjà - * On ne va donc pas le supprimer à la barbare, mais on le met à jour quand même - */ - $liste_lang[] = $row['lang']; - $liste_lang_supprimer[] = $row['lang']; - $percent = (($row['N']/$count_original)*100); - if ($percent<($seuil_export-15)){ - $message_commit .= "La langue '" . $row['lang'] . "' devrait être supprimée car trop peu traduite (" . number_format($percent, 2) . " %)\n"; - } + $liste_lang[] = $langue['lang']; + $liste_lang_a_supprimer[] = $langue['lang']; + $percent = (($row['N']/$count_trad_reference)*100); + if ($percent<($seuil_export-15)){ + $message_commit .= "La langue '" . $langue['lang'] . "' devrait être supprimée car trop peu traduite (" . number_format($percent, 2) . " %)\n"; } } } + } - // traiter chaque langue - $infos = $commiteurs = array(); - foreach ($liste_lang as $lang){ - salvatore_log("Generation de la langue $lang "); - // Proteger les caracteres typographiques a l'interieur des tags html - $typo = (in_array($lang, array('eo', 'fr', 'cpf')) || strncmp($lang, 'fr_', 3)==0) ? 'fr' : 'en'; - $typographie = charger_fonction($typo, 'typographie'); - $tab = "\t"; - - $x = $tous = $tradlangs = array(); - $prev = ''; - $traduits = $modifs = $relire = 0; - - // On ne prend que les MODIF, les RELIRE et les OK pour ne pas rendre les sites multilingues en français - $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'); - foreach ($res as $row){ - $tradlangs[] = $row['id_tradlang']; - $tous[$row['id']] = $row; + // traiter chaque langue + $infos = $commiteurs = array(); + foreach ($liste_lang as $lang){ + salvatore_log("Generation de la langue $lang "); + // Proteger les caracteres typographiques a l'interieur des tags html + $typo = (in_array($lang, array('eo', 'fr', 'cpf')) || strncmp($lang, 'fr_', 3)==0) ? 'fr' : 'en'; + $typographie = charger_fonction($typo, 'typographie'); + $tab = "\t"; + + $x = $tous = $tradlangs = array(); + $prev = ''; + $traduits = $modifs = $relire = 0; + + // On ne prend que les MODIF, les RELIRE et les OK pour ne pas rendre les sites multilingues en français + $res = sql_allfetsel('id_tradlang,id,str,comm,statut,md5', 'spip_tradlangs', 'module = "' . $module . '" AND lang = "' . $lang . '" AND statut != "NEW" AND statut != "attic"', 'id'); + foreach ($res as $row){ + $tradlangs[] = $row['id_tradlang']; + $tous[$row['id']] = $row; + } + ksort($tous); + + foreach ($tous as $row){ + if ($row['statut']=='OK'){ + $traduits++; + } elseif ($row['statut']=='MODIF') { + $modifs++; + } elseif ($row['statut']=='RELIRE') { + $relire++; } - ksort($tous); - - foreach ($tous as $row){ - if ($row['statut']=='OK'){ - $traduits++; - } elseif ($row['statut']=='MODIF') { - $modifs++; - } elseif ($row['statut']=='RELIRE') { - $relire++; - } - if (strlen($row['comm'])>1){ - // On remplace les sauts de lignes des commentaires sinon ça crée des erreurs php - $row['comm'] = str_replace(array("\r\n", "\n", "\r"), ' ', $row['comm']); - // Conversion des commentaires en utf-8 - $row['comm'] = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&\1', $row['comm']), ENT_NOQUOTES, 'utf-8')); - } + if (strlen($row['comm'])>1){ + // On remplace les sauts de lignes des commentaires sinon ça crée des erreurs php + $row['comm'] = str_replace(array("\r\n", "\n", "\r"), ' ', $row['comm']); + // Conversion des commentaires en utf-8 + $row['comm'] = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&\1', $row['comm']), ENT_NOQUOTES, 'utf-8')); + } - if ($prev!=strtoupper($row['id'][0])){ - $x[] = "\n$tab// " . strtoupper($row['id'][0]); - } - $prev = strtoupper($row['id'][0]); + if ($prev!=strtoupper($row['id'][0])){ + $x[] = "\n$tab// " . strtoupper($row['id'][0]); + } + $prev = strtoupper($row['id'][0]); - if (strlen($row['statut']) and ($row['statut']!='OK')){ - $row['comm'] .= ' ' . $row['statut']; - } - if (trim($row['comm'])){ - $row['comm'] = ' # ' . trim($row['comm']); // on rajoute les commentaires ? - } + if (strlen($row['statut']) and ($row['statut']!='OK')){ + $row['comm'] .= ' ' . $row['statut']; + } + if (trim($row['comm'])){ + $row['comm'] = ' # ' . trim($row['comm']); // on rajoute les commentaires ? + } - $str = $row['str']; + $str = $row['str']; - /** - * On enlève les sauts de lignes windows pour des sauts de ligne linux - */ - $str = str_replace("\r\n", "\n", $str); + /** + * On enlève les sauts de lignes windows pour des sauts de ligne linux + */ + $str = str_replace("\r\n", "\n", $str); - /** - * protection dans les balises genre <a href="..." ou <img src="..." - * cf inc/filtres - */ - if (preg_match_all(_TYPO_BALISE, $str, $regs, PREG_SET_ORDER)){ - foreach ($regs as $reg){ - $insert = $reg[0]; - // hack: on transforme les caracteres a proteger en les remplacant - // par des caracteres "illegaux". (cf corriger_caracteres()) - $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR); - $str = str_replace($reg[0], $insert, $str); - } + /** + * protection dans les balises genre <a href="..." ou <img src="..." + * cf inc/filtres + */ + if (preg_match_all(_TYPO_BALISE, $str, $regs, PREG_SET_ORDER)){ + foreach ($regs as $reg){ + $insert = $reg[0]; + // hack: on transforme les caracteres a proteger en les remplacant + // par des caracteres "illegaux". (cf corriger_caracteres()) + $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR); + $str = str_replace($reg[0], $insert, $str); } + } - /** - * Protéger le contenu des balises <html> <code> <cadre> <frame> <tt> <pre> - */ - define('_PROTEGE_BLOCS_HTML', ',<(html|code|cadre|pre|tt)(\s[^>]*)?>(.*)</\1>,UimsS'); - if ((strpos($str, '<')!==false) and preg_match_all(_PROTEGE_BLOCS_HTML, $str, $matches, PREG_SET_ORDER)){ - foreach ($matches as $reg){ - $insert = $reg[0]; - // hack: on transforme les caracteres a proteger en les remplacant - // par des caracteres "illegaux". (cf corriger_caracteres()) - $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR); - $str = str_replace($reg[0], $insert, $str); - } + /** + * Protéger le contenu des balises <html> <code> <cadre> <frame> <tt> <pre> + */ + define('_PROTEGE_BLOCS_HTML', ',<(html|code|cadre|pre|tt)(\s[^>]*)?>(.*)</\1>,UimsS'); + if ((strpos($str, '<')!==false) and preg_match_all(_PROTEGE_BLOCS_HTML, $str, $matches, PREG_SET_ORDER)){ + foreach ($matches as $reg){ + $insert = $reg[0]; + // hack: on transforme les caracteres a proteger en les remplacant + // par des caracteres "illegaux". (cf corriger_caracteres()) + $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR); + $str = str_replace($reg[0], $insert, $str); } + } - /** - * On applique la typographie de la langue - */ - $str = $typographie($str); - /** - * On remet les caractères normaux sur les caractères illégaux - */ - $str = strtr($str, _TYPO_PROTECTEUR, _TYPO_PROTEGER); - - $str = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&\1', $str), ENT_NOQUOTES, 'utf-8')); + /** + * On applique la typographie de la langue + */ + $str = $typographie($str); + /** + * On remet les caractères normaux sur les caractères illégaux + */ + $str = strtr($str, _TYPO_PROTECTEUR, _TYPO_PROTEGER); - /** - * Calcul du nouveau md5 - */ - $newmd5 = md5($str); + $str = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&\1', $str), ENT_NOQUOTES, 'utf-8')); - /** - * Si le md5 ou la chaine à changé, on la met à jour dans la base - */ - if (($row['md5']!=$newmd5) || ($str!=$row['str'])){ - $r = sql_updateq('spip_tradlangs', array('md5' => $newmd5, 'str' => $str), 'id_tradlang = ' . intval($row['id_tradlang'])); - } + /** + * Calcul du nouveau md5 + */ + $newmd5 = md5($str); - $x[] = $tab . var_export($row['id'], 1) . ' => ' . var_export($str, 1) . ',' . $row['comm']; + /** + * Si le md5 ou la chaine à changé, on la met à jour dans la base + */ + if (($row['md5']!=$newmd5) || ($str!=$row['str'])){ + $r = sql_updateq('spip_tradlangs', array('md5' => $newmd5, 'str' => $str), 'id_tradlang = ' . intval($row['id_tradlang'])); } - $orig = ($lang==$source[2]) ? $source[0] : false; - - salvatore_log(" - traduction ($traduits/$count_original OK | $relire/$count_original RELIRE | $modifs/$count_original MODIFS), export\n"); - // historiquement les fichiers de lang de spip_loader ne peuvent pas etre securises - $secure = ($source[1]=='tradloader') - ? '' - : "if (!defined('_ECRIRE_INC_VERSION')) { - return; + + $x[] = $tab . var_export($row['id'], 1) . ' => ' . var_export($str, 1) . ',' . $row['comm']; + } + $orig = ($lang==$lang_ref) ? $url_repo : false; + + salvatore_log(" - traduction ($traduits/$count_trad_reference OK | $relire/$count_trad_reference RELIRE | $modifs/$count_trad_reference MODIFS), export\n"); + // historiquement les fichiers de lang de spip_loader ne peuvent pas etre securises + $secure = ($module=='tradloader') + ? '' + : "if (!defined('_ECRIRE_INC_VERSION')) { +return; }\n\n"; - $fd = fopen($tmp . $source[1] . '/' . $source[1] . '_' . $lang . '.php', 'w'); + $fd = fopen($dir_module . '/' . $module . '_' . $lang . '.php', 'w'); - # supprimer la virgule du dernier item - $x[count($x)-1] = preg_replace('/,([^,]*)$/', '\1', $x[count($x)-1]); + # supprimer la virgule du dernier item + $x[count($x)-1] = preg_replace('/,([^,]*)$/', '\1', $x[count($x)-1]); - $contenu = join("\n", $x); + $contenu = join("\n", $x); - // L'URL du site de traduction - $url_trad = parametre_url($url_trad, 'lang_cible', $lang); - /** - * Ecrire le fichier de langue complet - */ - fwrite( - $fd, - '<' . '?php + // L'URL du site de traduction + $url_trad_module = parametre_url($url_trad_module, 'lang_cible', $lang); + /** + * Ecrire le fichier de langue complet + */ + fwrite( + $fd, + '<' . '?php // This is a SPIP language file -- Ceci est un fichier langue de SPIP ' - . ($orig - ? '// Fichier source, a modifier dans ' . $orig - : '// extrait automatiquement de ' . $url_trad . ' + . ($orig + ? '// Fichier source, a modifier dans ' . $orig + : '// extrait automatiquement de ' . $url_trad_module . ' // ** ne pas modifier le fichier ** ' - ) - . "\n" . $secure . '$GLOBALS[$GLOBALS[\'idx_lang\']] = array( + ) + . "\n" . $secure . '$GLOBALS[$GLOBALS[\'idx_lang\']] = array( ' - . $contenu - . ' + . $contenu + . ' ); ' - ); - fclose($fd); - - // noter la langue et les traducteurs pour lang/module.xml - $infos[$lang] = $people_unique = array(); - $infos[$lang]['traducteurs'] = array(); - $infos[$lang]['traduits'] = $traduits; - $infos[$lang]['modifs'] = $modifs; - $infos[$lang]['relire'] = $relire; - if (defined('_ID_AUTEUR_SALVATORE') and intval(_ID_AUTEUR_SALVATORE)>0){ - $people_unique[] = _ID_AUTEUR_SALVATORE; - } - $s = sql_allfetsel('DISTINCT(traducteur)', 'spip_tradlangs', 'id_tradlang_module = ' . intval($module['id_tradlang_module']) . ' AND lang = ' . sql_quote($lang)); - foreach ($s as $t){ - $traducteurs_lang = explode(',', $t['traducteur']); - foreach ($traducteurs_lang as $traducteur){ - if (!in_array($traducteur, $people_unique)){ - if (is_numeric($traducteur) and $id_auteur = intval($traducteur)){ - $traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom', 'spip_auteurs', 'id_auteur = ' . $id_auteur)); - $traducteur_supp['lien'] = url_absolue(generer_url_entite($id_auteur, 'auteur'), $url_site); - } elseif (trim(strlen($traducteur))>0) { - $traducteur_supp['nom'] = trim($traducteur); - $traducteur_supp['lien'] = ''; - } - if (isset($traducteur_supp['nom'])){ - $infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp; - } - unset($traducteur_supp); - $people_unique[] = $traducteur; + ); + fclose($fd); + + // noter la langue et les traducteurs pour lang/module.xml + $infos[$lang] = $people_unique = array(); + $infos[$lang]['traducteurs'] = array(); + $infos[$lang]['traduits'] = $traduits; + $infos[$lang]['modifs'] = $modifs; + $infos[$lang]['relire'] = $relire; + if (defined('_ID_AUTEUR_SALVATORE') and intval(_ID_AUTEUR_SALVATORE)>0){ + $people_unique[] = _ID_AUTEUR_SALVATORE; + } + $s = sql_allfetsel('DISTINCT(traducteur)', 'spip_tradlangs', 'id_tradlang_module = ' . intval($row_module['id_tradlang_module']) . ' AND lang = ' . sql_quote($lang)); + foreach ($s as $t){ + $traducteurs_lang = explode(',', $t['traducteur']); + foreach ($traducteurs_lang as $traducteur){ + if (!in_array($traducteur, $people_unique)){ + if (is_numeric($traducteur) and $id_auteur = intval($traducteur)){ + $traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom', 'spip_auteurs', 'id_auteur = ' . $id_auteur)); + $traducteur_supp['lien'] = url_absolue(generer_url_entite($id_auteur, 'auteur'), $url_site); + } elseif (trim(strlen($traducteur))>0) { + $traducteur_supp['nom'] = trim($traducteur); + $traducteur_supp['lien'] = ''; + } + if (isset($traducteur_supp['nom'])){ + $infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp; } + unset($traducteur_supp); + $people_unique[] = $traducteur; } } - unset($people_unique); - - if (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . '_' . $lang . '.php'), 0, 1)=='?'){ - if ($module['limite_trad']==0){ - passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php 2> /dev/null") ? salvatore_log("$log\n") : ''; - } elseif (!in_array($source[1], array('ecrire', 'spip', 'public'))) { - if ((intval(($infos[$lang]['traduits']/$count_original)*100)>$seuil_export)){ - passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; - } + } + unset($people_unique); + + if (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . '_' . $lang . '.php'), 0, 1)=='?'){ + if ($row_module['limite_trad']==0){ + passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php 2> /dev/null") ? salvatore_log("$log\n") : ''; + } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) { + if ((intval(($infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)){ + passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; } } - /** - * Le fichier a été modifié ou ajouté (svn status A ou M) - * - * On récupère la date de dernier changement avec svn info - * On cherche toutes les dernières modifications dans la base de donnée - * Si un seul auteur de révisions (Hors salvatore et -1) on l'ajoute comme commiteur - * Si plusieurs auteurs le commiteur sera Salvatore - */ - if (in_array(substr(exec('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php"), 0, 1), array('A', 'M'))){ - $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 }'"); - $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'); - if (count($auteur_versions)==1){ - $email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur = ' . intval($auteur_versions[0]['id_auteur'])); - if ($email){ - $commiteurs[$lang] = $email; - } - salvatore_log("\nLe commiteur sera pour la langue $lang : " . $commiteurs[$lang] . " \n"); + } + /** + * Le fichier a été modifié ou ajouté (svn status A ou M) + * + * On récupère la date de dernier changement avec svn info + * On cherche toutes les dernières modifications dans la base de donnée + * Si un seul auteur de révisions (Hors salvatore et -1) on l'ajoute comme commiteur + * Si plusieurs auteurs le commiteur sera Salvatore + */ + if (in_array(substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1), array('A', 'M'))){ + $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 }'"); + $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'); + if (count($auteur_versions)==1){ + $email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur = ' . intval($auteur_versions[0]['id_auteur'])); + if ($email){ + $commiteurs[$lang] = $email; } + salvatore_log("\nLe commiteur sera pour la langue $lang : " . $commiteurs[$lang] . " \n"); } } + } - // ecrire lang/module.xml - $xml = "<traduction module=\"$source[1]\" gestionnaire=\"salvatore\" url=\"$url_site\" source=\"$source[0]\" reference=\"$source[2]\">\n"; - foreach ($infos as $lang => $info){ - if (count($info['traducteurs']>0)){ - $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"; - ksort($info['traducteurs']); - foreach ($info['traducteurs'] as $nom => $people){ - $xml .= ' <traducteur nom="' . entites_html($people['nom']) . '" lien="' . entites_html($people['lien']) . "\" />\n"; - } - $xml .= " </langue>\n"; - } else { - $xml .= " <langue code=\"$lang\" url=\"" . parametre_url($url_trad, 'lang_cible', $lang) . "\" />\n"; + // ecrire lang/module.xml + $xml = "<traduction module=\"$module\" gestionnaire=\"salvatore\" url=\"$url_site\" source=\"$url_repo\" reference=\"$lang_ref\">\n"; + foreach ($infos as $lang => $info){ + if (count($info['traducteurs']>0)){ + $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"; + ksort($info['traducteurs']); + foreach ($info['traducteurs'] as $nom => $people){ + $xml .= ' <traducteur nom="' . entites_html($people['nom']) . '" lien="' . entites_html($people['lien']) . "\" />\n"; } + $xml .= " </langue>\n"; + } else { + $xml .= " <langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" />\n"; } - unset($traducteurs[$source[2]]); - $xml .= "</traduction>\n"; + } + unset($traducteurs[$lang_ref]); + $xml .= "</traduction>\n"; - ecrire_fichier($tmp . $source[1] . '/' . $source[1] . '.xml', $xml); + ecrire_fichier($dir_module . '/' . $module . '.xml', $xml); - if (isset($liste_lang_non_exportees) and (count($liste_lang_non_exportees)>0)){ - $liste_lang_non_exportees_string = implode(', ', $liste_lang_non_exportees); - salvatore_log("\nLes langues suivantes ne sont pas exportées car trop peu traduites:\n"); - salvatore_log("$liste_lang_non_exportees_string\n"); - } - if (isset($liste_lang_supprimer) and (count($liste_lang_supprimer)>0)){ - $liste_lang_supprimer_string = implode(', ', $liste_lang_supprimer); - salvatore_log("\nLes langues suivantes devraient être supprimées car trop peu traduites:\n"); - salvatore_log("$liste_lang_supprimer_string\n"); + if (isset($liste_lang_non_exportees) and (count($liste_lang_non_exportees)>0)){ + $liste_lang_non_exportees_string = implode(', ', $liste_lang_non_exportees); + salvatore_log("\nLes langues suivantes ne sont pas exportées car trop peu traduites:\n"); + salvatore_log("$liste_lang_non_exportees_string\n"); + } + if (isset($liste_lang_a_supprimer) and (count($liste_lang_a_supprimer)>0)){ + $liste_lang_a_supprimer_string = implode(', ', $liste_lang_a_supprimer); + salvatore_log("\nLes langues suivantes devraient être supprimées car trop peu traduites:\n"); + salvatore_log("$liste_lang_a_supprimer_string\n"); + } + if ($row_module['limite_trad']==0){ + foreach ($liste_lang as $lang){ + passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; } - if ($module['limite_trad']==0){ - foreach ($liste_lang as $lang){ - passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; - } - } elseif (!in_array($source[1], array('ecrire', 'spip', 'public'))) { - salvatore_log('Limite trad = ' . $seuil_export); - foreach ($liste_lang as $lang){ - if ((intval(($infos[$lang]['traduits']/$count_original)*100)>$seuil_export) - and (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php"), 0, 1)=='?')){ - passthru('svn add ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; - } + } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) { + salvatore_log('Limite trad = ' . $seuil_export); + foreach ($liste_lang as $lang){ + if ((intval(($infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export) + and (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1)=='?')){ + passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; } } - salvatore_log("\n" . passthru('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/') . "\n"); - if (strlen($message_commit)>1 || count($commiteurs)>0){ - $fd = fopen($tmp . $source[1] . '/message_commit.inc', 'w'); - # ecrire le fichier - fwrite( - $fd, - '<' . '?php + } + salvatore_log("\n" . passthru('svn status ' . _DIR_SALVATORE_TMP . $module . '/') . "\n"); + if (strlen($message_commit)>1 || count($commiteurs)>0){ + $fd = fopen($dir_module . '/message_commit.inc', 'w'); + # ecrire le fichier + fwrite( + $fd, + '<' . '?php $message_commit = "' . $message_commit . '"; $commiteurs = ' . var_export($commiteurs, 1) . '; ?' . '> ' - ); - fclose($fd); - } - } else { - salvatore_log("\n Ce module n'existe pas\n"); + ); + fclose($fd); } }