source: spip-zone/_plugins_/trad-lang/trunk/inc/tradlang_verifier_langue_base.php @ 119737

Last change on this file since 119737 was 119737, checked in by Cerdic, 2 years ago

Refactoring : utiliser de preference id_tradlang_module en entree mais supporter aussi module pour compat avec tous les appels

File size: 4.4 KB
Line 
1<?php
2/**
3 * Trad-lang v2
4 * Plugin SPIP de traduction de fichiers de langue
5 * © Florent Jugla, Fil, kent1
6 *
7 */
8
9if (!defined('_ECRIRE_INC_VERSION')) {
10        return;
11}
12
13/**
14 * Fonction de vérification de la concordance d'une langue x par rapport à la langue mère
15 *
16 * @param int $id_tradlang_module
17 *              id du module concerne
18 *    ou module (deprecated)
19 * @param string $langue
20 *              La langue à comparer
21 * @return array
22 */
23function inc_tradlang_verifier_langue_base_dist($id_tradlang_module, $langue) {
24
25        // compat anciens appels avec module
26        if (!is_numeric($id_tradlang_module)) {
27                $module = $id_tradlang_module;
28                $ids = sql_allfetsel('id_tradlang_module', 'spip_tradlang_modules', 'module='.sql_quote($module));
29                $ids = array_column($ids, 'id_tradlang_module');
30                $res = [];
31                foreach ($ids as $id) {
32                        $res[] = inc_tradlang_verifier_langue_base_dist($id, $langue);
33                }
34                $inserees = array_sum(array_column($res, 0));
35                $supprimees = array_sum(array_column($res, 1));
36                $recuperees = array_sum(array_column($res, 2));
37
38                return array($inserees,$supprimees,$recuperees);
39        }
40
41        if (!$row_module = sql_fetsel('*', 'spip_tradlang_modules', 'id_tradlang_module=' . intval($id_tradlang_module))) {
42                return array(0,0,0);
43        }
44        $where_module = 'id_tradlang_module=' . intval($id_tradlang_module);
45        $module = $row_module['module']; // pour les logs
46
47        /**
48         * Quelle est la langue mère
49         */
50        $langue_mere = $row_module['lang_mere'];
51        $trad_langue_mere_id = $trad_langue_cible_id = $trad_langue_cible_id_attic = array();
52
53        /**
54         * On crée trois tableaux:
55         * -* l'ensemble des id de la langue mère non supprimés
56         * -* l'ensemble des id de la langue cible non supprimés
57         * -* l'ensemble des id de la langue cible qui ont été supprimés par le passé
58         * (dans le cas où l'on doit en récupérer)
59         */
60        $trad_langue_mere_id = sql_allfetsel('id', 'spip_tradlangs', "$where_module AND lang=" . sql_quote($langue_mere) . " AND statut!='attic'", '', 'id');
61        $trad_langue_mere_id = array_column($trad_langue_mere_id, 'id');
62
63        $trad_langue_cible_id  = sql_allfetsel('id', 'spip_tradlangs', "$where_module AND lang=" . sql_quote($langue) . " AND statut!='attic'", '', 'id');
64        $trad_langue_cible_id = array_column($trad_langue_cible_id, 'id');
65
66        $trad_langue_cible_id_attic  = sql_allfetsel('id', 'spip_tradlangs', "$where_module AND lang=" . sql_quote($langue) . " AND statut='attic'", '', 'id');
67        $trad_langue_cible_id_attic = array_column($trad_langue_cible_id_attic, 'id');
68
69        $inserees = $supprimees = $recuperees = 0;
70
71        /**
72         * $diff1 est l'ensemble des chaines manquantes dans la langue cible
73         * et donc à insérer
74         *
75         * On met dans un tableau les chaines en question si on a au moins un résultat
76         */
77        $diff1 = array_diff($trad_langue_mere_id, $trad_langue_cible_id);
78        if (count($diff1) > 0) {
79                $diff1_array = sql_allfetsel('*', 'spip_tradlangs', "$where_module AND lang=" . sql_quote($langue_mere) . ' AND ' . sql_in('id', $diff1));
80                foreach ($diff1_array as $diff) {
81                        /**
82                         * La chaine était préalablement supprimée
83                         * Elle a le statut "attic"
84                         * On la récupère donc en lui donnant le statut "MODIF"
85                         */
86                        if (in_array($diff['id'], $trad_langue_cible_id_attic)) {
87                                $titre = $diff['id'].' : '.$diff['module'].' - '.$langue;
88                                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'");
89                                $recuperees++;
90                        } else {
91                                $diff['orig'] = 0;
92                                $diff['lang'] = $langue;
93                                $diff['titre'] = $diff['id'].' : '.$diff['module'].' - '.$langue;
94                                $diff['statut'] = 'NEW';
95                                unset($diff['maj']);
96                                unset($diff['id_tradlang']);
97                                unset($diff['traducteur']);
98                                $id_tradlang = sql_insertq('spip_tradlangs', $diff);
99                                $inserees++;
100                        }
101                }
102        }
103
104        /**
105         * $diff2 est l'ensemble des chaines en trop dans la langue fille
106         * et donc à supprimer
107         */
108        $diff2 = array_diff($trad_langue_cible_id, $trad_langue_mere_id);
109        if (count($diff2) > 0) {
110                foreach ($diff2 as $id) {
111                        sql_updateq('spip_tradlangs', array('statut' => 'attic'), "$where_module AND id=" . sql_quote($id) . ' AND lang=' . sql_quote($langue));
112                        $supprimees++;
113                }
114        }
115
116        if ($inserees + $supprimees + $recuperees > 0) {
117                include_spip('inc/invalideur');
118                suivre_invalideur('1');
119                spip_log("$module: insert => $inserees - suppressions => $supprimees - recuperations => $recuperees", 'bilan.'._LOG_ERREUR);
120                return array($inserees,$supprimees,$recuperees);
121        }
122
123        return array(0,0,0);
124}
Note: See TracBrowser for help on using the repository browser.