<?php /** * Trad-lang v2 * Plugin SPIP de traduction de fichiers de langue * © Florent Jugla, Fil, kent1 * */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Fonction de vérification de la concordance d'une langue x par rapport à la langue mère * * @param int $id_tradlang_module * id du module concerne * ou module (deprecated) * @param string $langue * La langue à comparer * @return array */ function inc_tradlang_verifier_langue_base_dist($id_tradlang_module, $langue) { // compat anciens appels avec module if (!is_numeric($id_tradlang_module)) { $module = $id_tradlang_module; $ids = sql_allfetsel('id_tradlang_module', 'spip_tradlang_modules', 'module='.sql_quote($module)); $ids = array_column($ids, 'id_tradlang_module'); $res = []; foreach ($ids as $id) { $res[] = inc_tradlang_verifier_langue_base_dist($id, $langue); } $inserees = array_sum(array_column($res, 0)); $supprimees = array_sum(array_column($res, 1)); $recuperees = array_sum(array_column($res, 2)); return array($inserees,$supprimees,$recuperees); } if (!$row_module = sql_fetsel('*', 'spip_tradlang_modules', 'id_tradlang_module=' . intval($id_tradlang_module))) { return array(0,0,0); } $where_module = 'id_tradlang_module=' . intval($id_tradlang_module); $module = $row_module['module']; // pour les logs /** * Quelle est la langue mère */ $langue_mere = $row_module['lang_mere']; $trad_langue_mere_id = $trad_langue_cible_id = $trad_langue_cible_id_attic = array(); /** * On crée trois tableaux: * -* l'ensemble des id de la langue mère non supprimés * -* l'ensemble des id de la langue cible non supprimés * -* l'ensemble des id de la langue cible qui ont été supprimés par le passé * (dans le cas où l'on doit en récupérer) */ $trad_langue_mere_id = sql_allfetsel('id', 'spip_tradlangs', "$where_module AND lang=" . sql_quote($langue_mere) . " AND statut!='attic'", '', 'id'); $trad_langue_mere_id = array_column($trad_langue_mere_id, 'id'); $trad_langue_cible_id = sql_allfetsel('id', 'spip_tradlangs', "$where_module AND lang=" . sql_quote($langue) . " AND statut!='attic'", '', 'id'); $trad_langue_cible_id = array_column($trad_langue_cible_id, 'id'); $trad_langue_cible_id_attic = sql_allfetsel('id', 'spip_tradlangs', "$where_module AND lang=" . sql_quote($langue) . " AND statut='attic'", '', 'id'); $trad_langue_cible_id_attic = array_column($trad_langue_cible_id_attic, 'id'); $inserees = $supprimees = $recuperees = 0; /** * $diff1 est l'ensemble des chaines manquantes dans la langue cible * et donc à insérer * * On met dans un tableau les chaines en question si on a au moins un résultat */ $diff1 = array_diff($trad_langue_mere_id, $trad_langue_cible_id); if (count($diff1) > 0) { $diff1_array = sql_allfetsel('*', 'spip_tradlangs', "$where_module AND lang=" . sql_quote($langue_mere) . ' AND ' . sql_in('id', $diff1)); foreach ($diff1_array as $diff) { /** * La chaine était préalablement supprimée * Elle a le statut "attic" * On la récupère donc en lui donnant le statut "MODIF" */ if (in_array($diff['id'], $trad_langue_cible_id_attic)) { $titre = $diff['id'].' : '.$diff['module'].' - '.$langue; sql_updateq('spip_tradlangs', array('statut' => 'MODIF', 'titre' => $titre), "$where_module AND id=" . sql_quote($diff['id']) . ' AND lang=' . sql_quote($langue) . " AND statut='attic'"); $recuperees++; } else { $diff['orig'] = 0; $diff['lang'] = $langue; $diff['titre'] = $diff['id'].' : '.$diff['module'].' - '.$langue; $diff['statut'] = 'NEW'; unset($diff['maj']); unset($diff['id_tradlang']); unset($diff['traducteur']); $id_tradlang = sql_insertq('spip_tradlangs', $diff); $inserees++; } } } /** * $diff2 est l'ensemble des chaines en trop dans la langue fille * et donc à supprimer */ $diff2 = array_diff($trad_langue_cible_id, $trad_langue_mere_id); if (count($diff2) > 0) { foreach ($diff2 as $id) { sql_updateq('spip_tradlangs', array('statut' => 'attic'), "$where_module AND id=" . sql_quote($id) . ' AND lang=' . sql_quote($langue)); $supprimees++; } } if ($inserees + $supprimees + $recuperees > 0) { include_spip('inc/invalideur'); suivre_invalideur('1'); spip_log("$module: insert => $inserees - suppressions => $supprimees - recuperations => $recuperees", 'bilan.'._LOG_ERREUR); return array($inserees,$supprimees,$recuperees); } return array(0,0,0); }