Changeset 119837 in spip-zone
- Timestamp:
- Jan 20, 2020, 4:38:49 AM (13 months ago)
- Location:
- _plugins_/trad-lang/trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
_plugins_/trad-lang/trunk
- Property subgit:lock:4a818f39ef61a3acce3f8b14c12019cdaa463bcc deleted
-
Property
subgit:lock:1559b0188361028cb38e3178a89b604a90d1b5ac
set to
2020-01-20T09:05:31.983
-
_plugins_/trad-lang/trunk/inc/salvatore_ecriveur.php
r119836 r119837 38 38 /** 39 39 * @param array $liste_sources 40 * @param string $message_commit 40 41 * @param string $dir_modules 42 * @param string $dir_depots 41 43 * @throws Exception 42 44 */ 43 function salvatore_ecrire($liste_sources, $ dir_modules = null, $message_commit=''){45 function salvatore_ecrire($liste_sources, $message_commit='', $dir_modules = null, $dir_depots=null){ 44 46 include_spip('inc/salvatore'); 45 47 salvatore_init(); … … 52 54 } 53 55 salvatore_check_dir($dir_modules); 56 57 if (is_null($dir_depots)) { 58 $dir_depots = _DIR_SALVATORE_DEPOTS; 59 } 60 salvatore_check_dir($dir_depots); 61 54 62 $url_gestionnaire = salvatore_get_self_url(); 55 63 … … 71 79 // url de l'interface de traduction d'un module 72 80 $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);81 salvatore_exporter_module($id_tradlang_module, $source, $url_gestionnaire, $url_trad_module, $dir_modules, $dir_depots, $message_commit); 74 82 } 75 83 } … … 84 92 * @param string $url_trad_module 85 93 * @param string $dir_modules 94 * @param string $dir_depots 86 95 * @param string $message_commit 87 */ 88 function salvatore_exporter_module($id_tradlang_module, $source, $url_site, $url_trad_module, $dir_modules, $message_commit = ''){ 96 * @return false|int 97 */ 98 function salvatore_exporter_module($id_tradlang_module, $source, $url_site, $url_trad_module, $dir_modules, $dir_depots, $message_commit = ''){ 89 99 90 100 $url_repo = $source['url']; … … 107 117 } 108 118 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 119 120 $xml_infos = $commit_infos = array(); 120 121 $liste_lang = $liste_lang_non_exportees = $liste_lang_a_supprimer = array(); 122 123 $count_trad_reference = sql_countsel('spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . ' AND lang=' . sql_quote($row_module['lang_mere']) . " AND statut='OK'", 'id'); 121 124 $minimal = ceil((($count_trad_reference*$seuil_export)/100)); 122 125 salvatore_log("Minimal = $minimal ($seuil_export %)"); … … 129 132 if ($langue['count']>=$minimal){ 130 133 $liste_lang[] = $langue['lang']; 134 $commit_infos[$langue['lang']] = array(); 131 135 } 132 136 else { … … 142 146 */ 143 147 $liste_lang[] = $langue['lang']; 148 $commit_infos[$langue['lang']] = array(); 144 149 $liste_lang_a_supprimer[] = $langue['lang']; 145 150 $percent = (($langue['count']/$count_trad_reference)*100); 146 151 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";152 $commit_infos[$langue['lang']]['message'] = "La langue '" . $langue['lang'] . "' devrait être supprimée car trop peu traduite (" . number_format($percent, 2) . " %)\n"; 148 153 } 149 154 } … … 152 157 153 158 // traiter chaque langue 154 $infos = $commiteurs = array();155 159 foreach ($liste_lang as $lang){ 156 160 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 $indent = "\t"; 161 162 162 163 $php_lines = $chaines = $id_tradlangs = array(); … … 177 178 if ($initiale !== strtoupper($chaine['id'][0])){ 178 179 $initiale = strtoupper($chaine['id'][0]); 179 $php_lines[] = "\n$ tab// $initiale";180 $php_lines[] = "\n$indent// $initiale"; 180 181 } 181 182 … … 198 199 } 199 200 200 $php_lines[] = $ tab. var_export($chaine['id'], 1) . ' => ' . var_export($str, 1) . ',' . $comment;201 $php_lines[] = $indent . var_export($chaine['id'], 1) . ' => ' . var_export($str, 1) . ',' . $comment; 201 202 } 202 203 203 204 salvatore_log(" - traduction (".$total_chaines['OK']."/$count_trad_reference OK | ".$total_chaines['RELIRE']."/$count_trad_reference RELIRE | ".$total_chaines['MODIF']."/$count_trad_reference MODIFS), export"); 204 salvatore_exporter_fichier_php($dir_module, $module, $lang, $php_lines, $url_trad_module, ($lang==$lang_ref) ? $url_repo : false);205 $file_name = salvatore_exporter_fichier_php($dir_module, $module, $lang, $php_lines, $url_trad_module, ($lang==$lang_ref) ? $url_repo : false); 205 206 206 207 // noter la langue et les traducteurs pour lang/module.xml 207 $infos[$lang] = $people_unique = array(); 208 $infos[$lang]['traducteurs'] = array(); 209 $infos[$lang]['traduits'] = $total_chaines['OK']; 210 $infos[$lang]['modifs'] = $total_chaines['MODIF']; 211 $infos[$lang]['relire'] = $total_chaines['RELIRE']; 208 $people_unique = array(); 209 $xml_infos[$lang] = array( 210 'traducteurs' => array(), 211 'traduits' => $total_chaines['OK'], 212 'modifs' => $total_chaines['MODIF'], 213 'relire' => $total_chaines['RELIRE'], 214 ); 212 215 if (defined('_ID_AUTEUR_SALVATORE') and intval(_ID_AUTEUR_SALVATORE)>0){ 213 216 $people_unique[] = _ID_AUTEUR_SALVATORE; 214 217 } 215 $s = sql_allfetsel('DISTINCT(traducteur)', 'spip_tradlangs', 'id_tradlang_module = ' . intval($row_module['id_tradlang_module']) . ' AND lang = ' . sql_quote($lang)); 216 foreach ($s as $t){ 218 219 // ici on prend tous les statut de chaine (?) 220 $traducteurs = sql_allfetsel('DISTINCT(traducteur)', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . ' AND lang=' . sql_quote($lang)); 221 foreach ($traducteurs as $t){ 217 222 $traducteurs_lang = explode(',', $t['traducteur']); 218 223 foreach ($traducteurs_lang as $traducteur){ 219 224 if (!in_array($traducteur, $people_unique)){ 225 $traducteur_supp = array(); 220 226 if (is_numeric($traducteur) and $id_auteur = intval($traducteur)){ 221 227 $traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom', 'spip_auteurs', 'id_auteur = ' . $id_auteur)); … … 226 232 } 227 233 if (isset($traducteur_supp['nom'])){ 228 $ infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp;234 $xml_infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp; 229 235 } 230 unset($traducteur_supp);231 236 $people_unique[] = $traducteur; 232 237 } … … 235 240 unset($people_unique); 236 241 237 if (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . '_' . $lang . '.php'), 0, 1)=='?'){ 238 if ($row_module['limite_trad']==0){ 239 passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php 2> /dev/null") ? salvatore_log("$log\n") : ''; 240 } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) { 241 if ((intval(($infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)){ 242 passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; 243 } 244 } 245 } 246 /** 247 * Le fichier a été modifié ou ajouté (svn status A ou M) 248 * 249 * On récupère la date de dernier changement avec svn info 250 * On cherche toutes les dernières modifications dans la base de donnée 251 * Si un seul auteur de révisions (Hors salvatore et -1) on l'ajoute comme commiteur 252 * Si plusieurs auteurs le commiteur sera Salvatore 253 */ 254 if (in_array(substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1), array('A', 'M'))){ 255 $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 }'"); 256 $auteur_versions = sql_allfetsel('id_auteur', 'spip_versions', 'objet="tradlang" AND date > ' . sql_quote($last_change) . ' AND ' . sql_in('id_objet', $id_tradlangs) . ' AND id_auteur != "-1" AND id_auteur !=' . intval(_ID_AUTEUR_SALVATORE), 'id_auteur'); 242 $commit_infos[$lang]['file_name'] = basename($file_name); 243 $commit_infos[$lang]['lastmodified'] = salvatore_read_lastmodified_file(basename($file_name), $source, $dir_depots); 244 $commit_infos[$lang]['must_add'] = false; 245 246 if ($row_module['limite_trad']==0){ 247 $commit_infos[$lang]['must_add'] = true; 248 } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) { 249 if ((intval(($xml_infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)){ 250 $commit_infos[$lang]['must_add'] = true; 251 } 252 } 253 254 // trouver le commiteur si c'est un fichier deja versionne ou a ajouter 255 if ($commit_infos[$lang]['lastmodified'] or $commit_infos[$lang]['must_add']) { 256 $where = [ 257 "objet='tradlang'", 258 sql_in('id_objet', $id_tradlangs), 259 "id_auteur != '-1'", 260 'id_auteur !=' . intval(_ID_AUTEUR_SALVATORE), 261 ]; 262 if ($commit_infos[$lang]['lastmodified']) { 263 $where[] = "date>".sql_quote(date('Y-m-d H:i:s', $commit_infos[$lang]['lastmodified'])); 264 } 265 $auteur_versions = sql_allfetsel('DISTINCT id_auteur', 'spip_versions', $where); 257 266 if (count($auteur_versions)==1){ 258 267 $email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur = ' . intval($auteur_versions[0]['id_auteur'])); 259 268 if ($email){ 260 $commiteurs[$lang] = $email; 269 $commit_infos[$lang]['author'] = $email; 270 salvatore_log("Le commiteur pour la langue $lang : $email"); 261 271 } 262 salvatore_log("\nLe commiteur sera pour la langue $lang : " . $commiteurs[$lang] . " \n"); 263 } 264 } 265 } 266 267 // ecrire lang/module.xml 268 $xml = "<traduction module=\"$module\" gestionnaire=\"salvatore\" url=\"$url_site\" source=\"$url_repo\" reference=\"$lang_ref\">\n"; 269 foreach ($infos as $lang => $info){ 272 } 273 } 274 } 275 276 // le fichier XML recapitulatif 277 $indent = "\t"; 278 $xml = "<traduction 279 {$indent}module=\"$module\" 280 {$indent}dir_module=\"".$row_module['dir_module']."\" 281 {$indent}gestionnaire=\"salvatore\" 282 {$indent}url=\"$url_site\" 283 {$indent}source=\"$url_repo\" 284 {$indent}reference=\"$lang_ref\">\n"; 285 foreach ($xml_infos as $lang => $info){ 270 286 if (count($info['traducteurs']>0)){ 271 $xml .= " 287 $xml .= "$indent<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"; 272 288 ksort($info['traducteurs']); 273 289 foreach ($info['traducteurs'] as $nom => $people){ 274 $xml .= '<traducteur nom="' . entites_html($people['nom']) . '" lien="' . entites_html($people['lien']) . "\" />\n";275 } 276 $xml .= " 290 $xml .= $indent . $indent . '<traducteur nom="' . entites_html($people['nom']) . '" lien="' . entites_html($people['lien']) . "\" />\n"; 291 } 292 $xml .= "$indent</langue>\n"; 277 293 } else { 278 $xml .= " <langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" />\n"; 279 } 280 } 281 unset($traducteurs[$lang_ref]); 294 $xml .= "$indent<langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" />\n"; 295 } 296 } 282 297 $xml .= "</traduction>\n"; 283 284 ecrire_fichier($dir_module . '/' . $module . '.xml', $xml); 298 file_put_contents($dir_module . '/' . $module . '.xml', $xml); 299 285 300 286 301 if (isset($liste_lang_non_exportees) and (count($liste_lang_non_exportees)>0)){ 287 $liste_lang_non_exportees_string = implode(', ', $liste_lang_non_exportees); 288 salvatore_log("\nLes langues suivantes ne sont pas exportées car trop peu traduites:\n"); 289 salvatore_log("$liste_lang_non_exportees_string\n"); 302 salvatore_log("Les langues suivantes ne sont pas exportées car trop peu traduites:"); 303 salvatore_log(implode(', ', $liste_lang_non_exportees)); 290 304 } 291 305 if (isset($liste_lang_a_supprimer) and (count($liste_lang_a_supprimer)>0)){ 292 $liste_lang_a_supprimer_string = implode(', ', $liste_lang_a_supprimer); 293 salvatore_log("\nLes langues suivantes devraient être supprimées car trop peu traduites:\n"); 294 salvatore_log("$liste_lang_a_supprimer_string\n"); 295 } 296 if ($row_module['limite_trad']==0){ 297 foreach ($liste_lang as $lang){ 298 passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; 299 } 300 } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) { 301 salvatore_log('Limite trad = ' . $seuil_export); 302 foreach ($liste_lang as $lang){ 303 if ((intval(($infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export) 304 and (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1)=='?')){ 305 passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; 306 } 307 } 308 } 309 salvatore_log("\n" . passthru('svn status ' . _DIR_SALVATORE_TMP . $module . '/') . "\n"); 310 if (strlen($message_commit)>1 || count($commiteurs)>0){ 311 $fd = fopen($dir_module . '/message_commit.inc', 'w'); 312 # ecrire le fichier 313 fwrite( 314 $fd, 315 '<' . '?php 316 $message_commit = "' . $message_commit . '"; 317 318 $commiteurs = ' . var_export($commiteurs, 1) . '; 319 320 ?' . '> 321 ' 322 ); 323 fclose($fd); 324 } 306 salvatore_log("Les langues suivantes devraient être supprimées car trop peu traduites:"); 307 salvatore_log(implode(', ', $liste_lang_a_supprimer)); 308 } 309 310 $nb_to_commit = 0; 311 // et on ecrit un json pour que le pousseur sache quoi commit 312 if (count($commit_infos)) { 313 $nb_to_commit = count($commit_infos); 314 if ($message_commit) { 315 $commit_infos['message'] = $message_commit; 316 } 317 file_put_contents($dir_module . '/' . $module . '.commit.json', json_encode($commit_infos)); 318 } 319 320 $log = salvatore_read_status_modif($module, $source, $dir_depots); 321 salvatore_log($log); 322 return $nb_to_commit; 325 323 } 326 324 … … 341 339 } 342 340 341 343 342 /** 344 343 * Generer un fichier de langue a partir de ses lignes php … … 349 348 * @param string $url_trad_module 350 349 * @param $origin 350 * @return string 351 351 */ 352 352 function salvatore_exporter_fichier_php($dir_module, $module, $lang, $php_lines, $url_trad_module, $origin) { … … 376 376 $file_content .= implode("\n", $php_lines); 377 377 file_put_contents($file_name, $file_content); 378 } 378 return $file_name; 379 } 380 381 382 /** 383 * Lire la date de derniere modif d'un fichier de langue 384 * @param string $file_name 385 * @param array $source 386 * @param string $dir_depots 387 * @return false|int 388 */ 389 function salvatore_read_lastmodified_file($file_name, $source, $dir_depots) { 390 391 $file_path_relative = $file_name; 392 if ($source['dir']) { 393 $file_path_relative = $source['dir'] . DIRECTORY_SEPARATOR . $file_path_relative; 394 } 395 $file_path = $dir_depots . $source['dir_checkout'] . DIRECTORY_SEPARATOR . $file_path_relative; 396 397 $lastmodified = 0; 398 switch ($source['methode']) { 399 case 'git': 400 $d = getcwd(); 401 chdir($dir_depots . $source['dir_checkout']); 402 $lastmodified = exec("git log -1 -c --pretty=tformat:'%ct' $file_path_relative | head -1"); 403 $lastmodified = intval(trim($lastmodified)); 404 chdir($d); 405 break; 406 case 'svn': 407 $lastmodified = exec('env LC_MESSAGES=en_US.UTF-8 svn info ' . $file_path . "| awk '/^Last Changed Date/ { print $4 \" \" $5 }'"); 408 $lastmodified = strtotime($lastmodified); 409 break; 410 } 411 412 return $lastmodified; 413 } 414 415 416 /** 417 * Afficher le status des fichiers modifies pour un module 418 * @param string $module 419 * @param array $source 420 * @param $dir_depots 421 * @return string 422 */ 423 function salvatore_read_status_modif($module, $source, $dir_depots) { 424 $pre = ""; 425 if ($source['dir']) { 426 $pre = $source['dir'] . DIRECTORY_SEPARATOR; 427 } 428 $files_list = [$pre . $module . '_*', $pre . $module . '.xml']; 429 $files_list = implode(' ', $files_list); 430 431 $d = getcwd(); 432 chdir($dir_depots . $source['dir_checkout']); 433 $output = array(); 434 switch ($source['methode']) { 435 case 'git': 436 exec("git status $files_list 2>&1", $output); 437 break; 438 case 'svn': 439 exec("svn status $files_list 2>&1", $output); 440 break; 441 } 442 chdir($d); 443 return implode("\n", $output); 444 } 445 446 /* 447 if ($row_module['limite_trad']==0){ 448 foreach ($liste_lang as $lang){ 449 passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; 450 } 451 } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) { 452 salvatore_log('Limite trad = ' . $seuil_export); 453 foreach ($liste_lang as $lang){ 454 if ((intval(($xml_infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export) 455 and (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1)=='?')){ 456 passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; 457 } 458 } 459 } 460 */ 461 462 /* 463 464 if (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . '_' . $lang . '.php'), 0, 1)=='?'){ 465 if ($row_module['limite_trad']==0){ 466 passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php 2> /dev/null") ? salvatore_log("$log\n") : ''; 467 } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) { 468 if ((intval(($xml_infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)){ 469 passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : ''; 470 } 471 } 472 } 473 474 475 */ -
_plugins_/trad-lang/trunk/spip-cli/SalvatoreEcrire.php
r119824 r119837 85 85 $message = $input->getOption('message'); 86 86 87 salvatore_ecrire($liste_trad, null,$message ? $message : '');87 salvatore_ecrire($liste_trad, $message ? $message : ''); 88 88 } 89 89 }
Note: See TracChangeset
for help on using the changeset viewer.