source: spip-zone/_plugins_/trad-lang/trunk/tradlang_fonctions.php @ 90095

Last change on this file since 90095 was 82033, checked in by kent1@…, 7 years ago

utiliser sql_allfetsel + foreach au lieur de sql_select + while + sql_fetch

Petites améliorations

File size: 8.9 KB
Line 
1<?php
2/**
3 *
4 * Trad-lang v2
5 * Plugin SPIP de traduction de fichiers de langue
6 * © Florent Jugla, Fil, kent1
7 *
8 * Fichier des fonctions spécifiques du plugin
9 *
10 * @package SPIP\Tradlang\Fonctions
11 */
12 
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15/**
16 * Retourne les modules disponibles en base sous la forme d'un array complet
17 *
18 * @return array $ret
19 *              Un array complet des modules en base
20 */
21function tradlang_getmodules_base(){
22        $ret = array();
23
24        /**
25         * Sélection de tous les modules de langue
26         */
27        $res = sql_allfetsel("module,id_tradlang_module","spip_tradlang_modules");
28        if (is_array($res)){
29                foreach($res as $row){
30                        $module = $row["module"];
31                        $ret[$module] = $row;
32
33                        /**
34                         * Récupération des différentes langues et calcul du nom des
35                         * fichiers de langue
36                         */
37                        $res2 = sql_allfetsel("DISTINCT lang","spip_tradlangs","id_tradlang_module=".intval($row['id_tradlang_module']));
38                        foreach($res2 as $row2){
39                                $lg = $row2["lang"];
40                                $ret[$module]["langue_".$lg] = $row["lang_prefix"]."_".$lg.".php";
41                        }
42                }
43        }
44        return $ret;
45}
46
47/**
48 * Teste la synchro du fichier de la base avec le fichier de langue en se basant
49 * sur une ligne ajoutée lors de l'import si possible
50 *
51 * @param array $id_tradlang_module
52 *              L'identifiant numérique du module
53 * @param string $lang
54 *              Le code de langue à vérifier
55 * @return
56 */
57function tradlang_testesynchro($id_tradlang_module, $lang){
58        $dir_lang = tradlang_dir_lang();
59
60        $module = sql_getfetsel('module','spip_tradlang_modules','id_tradlang_module='.intval($id_tradlang_module));
61
62        $modules = tradlang_getmodules_base();
63        $modok = $modules[$module];
64
65        $getmodules_fics = charger_fonction('tradlang_getmodules_fics','inc');
66        $modules2 = $getmodules_fics($dir_lang,$module);
67        $modok2 = $modules2[$module];
68
69        // union entre modok et modok2
70        if(is_array($modok2)){
71                foreach($modok2 as $cle=>$item){
72                        if (strncmp($cle, "langue_", 7) == 0){
73                                $sel = "";
74                                $lang = substr($cle,7);
75                                if (!array_key_exists($lang, $modok)){
76                                        $module_final["langue_".$lang] = $item;
77                                }
78                        }
79                }
80        }
81        // Le fichier n'existe pas
82        if(!$module_final["langue_".$lang]){
83                return false;
84        }
85       
86        // lit le timestamp fichier
87        $fic = $dir_lang."/".$module_final["langue_".$lang];
88        include($fic);
89        $chs = $GLOBALS[$GLOBALS['idx_lang']];
90        $tsf = $chs["zz_timestamp_nepastraduire"];
91        unset($GLOBALS[$GLOBALS['idx_lang']]);
92
93       
94        // lit le timestamp  base
95        $tsb = sql_getfetsel("maj","spip_tradlangs","module =".sql_quote($module)." AND lang=".sql_quote($lang),"","maj DESC","0,1");
96
97        return ($tsb == $tsf);
98}
99
100function tradlang_dir_lang(){
101        global $dossier_squelettes;
102        if(!$dossier_squelettes && !is_dir(_DIR_RACINE.'squelettes'))
103                return false;
104        else
105                $squelettes = $dossier_squelettes ? $dossier_squelettes : 'squelettes';
106
107        if(!is_dir($dir_lang=_DIR_RACINE.$squelettes.'/lang'))
108                return false;
109
110        return $dir_lang;
111}
112
113/**
114 * Filtre spip pour utiliser arsort sur un array
115 *
116 * @param array $array
117 */
118function langues_sort($array,$defaut=null){
119        if(is_array($array)){
120                arsort($array);
121                if(isset($defaut)){
122                        $langue_defaut = array($defaut => $array[$defaut]);
123                        unset($array[$defaut]);
124                        $array = array_merge($langue_defaut,$array);
125                }
126                return $array;
127        }
128        return false;
129}
130
131/**
132 * <BOUCLE(TRADLANG_MODULES)>
133 */
134function boucle_TRADLANG_MODULES_dist($id_boucle, &$boucles) {
135        $boucle = &$boucles[$id_boucle];
136       
137        /**
138         * Par défaut on tri par priorité et nom_mod
139         */
140        if (!isset($boucle->modificateur['par']) 
141                && !isset($boucle->modificateur['tri'])) {
142                        $id_table = $boucle->id_table;
143                        $boucle->order[] = "'$id_table." ."priorite'";
144                        $boucle->order[] = "'$id_table." ."nom_mod'";
145        }
146        return calculer_boucle($id_boucle, $boucles);
147}
148
149/**
150 * <BOUCLE(TRADLANGS)>
151 */
152function boucle_TRADLANGS_dist($id_boucle, &$boucles) {
153        $boucle = &$boucles[$id_boucle];
154        if(isset($boucle->nom) && ($boucle->nom == 'calculer_langues_utilisees') && $boucle->id_boucle == 'tradlang'){
155                $id_table = $boucle->id_table;
156                array_unshift($boucle->where,array("'='", "'$id_table." ."id_tradlang'", "'0'"));
157        }
158        return calculer_boucle($id_boucle, $boucles);
159}
160
161/**
162 * Le critère des langues préférées {langues_preferees}...
163 *
164 * {langues_preferees} : Sur une table avec le champ lang retourne uniquement les résultats dans les
165 * langues préférées des utilisateurs, si aucune langue préférée, ne retourne rien
166 * {!langues_preferees} : Sur une table avec le champ lang retourne uniquement les résultats dans les
167 * langues non préférées des utilisateurs, si aucune langue préférée, renverra tout
168 *
169 * Le critère est sessionné ... Le résultat des boucles l'utilisant est donc modifié en fonction de la session utilisateur
170 */
171function critere_langues_preferees_dist($idb,&$boucles,$crit){
172        $boucle = &$boucles[$idb];
173        $id_table = $boucle->id_table;
174        $not = ($crit->not ? '' : 'NOT');
175        $primary = 'lang';
176        $c = "sql_in('".$id_table.'.'.$primary."', prepare_langues_preferees()".($not=='NOT' ? "" : ",'NOT'").")";
177        $boucle->where[] = $c;
178        /**
179         * Cette boucle est sessionnée car on utilise $GLOBALS['visiteur_session']
180         */
181        $boucles[$idb]->descr['session'] = true;
182}
183
184/**
185 * Fonction de préparation de la sélection des langues préférées
186 *
187 * Les langues préférées d'un utilisateur sont stockées dans un array serialisé dans la table
188 * spip_auteurs (c'est le champ "langues_preferees")
189 *
190 * Si un auteur est identifié, on regarde en base si langue_preferees est rempli sinon on retourne toutes les
191 * langues de la liste de ecrire/inc/lang_liste.php
192 *
193 * @param return array
194 *              L'array des langues préférées ou toutes les langues possibles
195 */
196function prepare_langues_preferees() {
197        include_spip('inc/lang_liste');
198        if(isset($GLOBALS['visiteur_session']['id_auteur']) && $GLOBALS['visiteur_session']['id_auteur'] >= 1){
199                $langues_preferees = sql_getfetsel('langues_preferees','spip_auteurs','id_auteur='.intval($GLOBALS['visiteur_session']['id_auteur']));
200                if($langues_preferees && count(unserialize($langues_preferees)) > 0)
201                        $langues_array = unserialize($langues_preferees);
202                else
203                        $langues_array = array_keys($GLOBALS['codes_langues']);
204        }else
205                $langues_array = array_keys($GLOBALS['codes_langues']);
206        return $langues_array;
207}
208
209/**
210 * Critère sélectionnant les langues complêtement traduites d'un module
211 * soit dans l'environnement soit passé en paramètre
212 *
213 * Ce critère doit être utiliser dans une boucle (TRADLANGS)
214 *
215 * Utilisations :
216 * {langue_complete} ou {langue_complete #ID_TRADLANG_MODULE}
217 */
218function critere_langue_complete_dist($id_boucle, &$boucles, $crit){
219        $boucle = &$boucles[$id_boucle];
220        $id_table = $boucle->id_table;
221        if($id_table == 'tradlangs'){
222                if(isset($crit->param[0][0]))
223                        $id_module = calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucles[$id_boucle]->id_parent);
224                else
225                        $id_module = calculer_argument_precedent($id_boucle, 'id_tradlang_module', $boucles);
226       
227                $boucle->hash .= '
228                        $prepare_module = charger_fonction(\'prepare_module_langue_complete\', \'inc\');
229                        $module_having = $prepare_module('.$id_module.', "' . $boucle->sql_serveur . '");
230                ';
231
232                array_unshift($boucle->where,array("'='", "'$id_table." ."statut'", "'\"OK\"'"));
233                $boucles[$id_boucle]->group[] = "$id_table.lang";
234                $boucles[$id_boucle]->having[] = "\n\t\t".'$module_having';
235        }else
236                return (array('zbug_critere_inconnu', array('table' => $crit->op.' ?')));
237} 
238
239/**
240 * Fonction de préparation du critère {langue_complete}
241 *
242 * @param int $id_module
243 *              L'identifiant numérique du module
244 * @param string $serveur
245 * @return string $having
246 *              La clause having à utiliser par le critère
247 */
248function inc_prepare_module_langue_complete_dist($id_module,  $serveur='') {
249        /**
250         * On récupère la langue mère du module
251         */
252        $langue_mere = sql_getfetsel('lang_mere','spip_tradlang_modules','id_tradlang_module='.intval($id_module));
253        /**
254         * On compte le nombre d'éléments de la langue mère ce qui correspond au nombre total d'éléments à traduire pour un module
255         */
256        $count = sql_countsel('spip_tradlangs','id_tradlang_module='.$id_module.' AND statut="OK" AND lang='.sql_quote($langue_mere));
257        /**
258         * On crée ainsi la clause $having qui sera utilisée dans la boucle
259         */
260        $having = "COUNT(*)=$count";
261        return $having;
262}
263
264/**
265 * Convertie une chaîne de caractère en UTF-8
266 *
267 * @param string $str
268 *              La chaîne à convertir
269 * @return string $str
270 *              La chaîne convertie en UTF-8
271 */
272function tradlang_utf8($str){
273        $str = unicode_to_utf_8(
274                html_entity_decode(
275                        preg_replace('/&([lg]t;)/S', '&amp;\1', $str),
276                        ENT_NOQUOTES, 'utf-8')
277        );
278        return $str;
279}
280
281/**
282 * Fonction qui vérifie que le code de langue spécifié en paramètre est utilisable
283 *
284 * Les codes de langue acceptés sont ceux du fichier ecrire/inc/lang.php (s'il n'est pas surchargé)
285 *
286 * @param string $lang
287 *              Le code de lang à tester
288 * @return bool
289 *              true si ok, false sinon
290 */
291function langue_possible($lang){
292        include_spip('inc/lang');
293        $langues = $GLOBALS['codes_langues'];
294        if(key_exists($lang,$langues))
295                return true;
296
297        return false;
298}
299?>
Note: See TracBrowser for help on using the repository browser.