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

Last change on this file since 120875 was 120873, checked in by Cerdic, 16 months ago

code mort, ne sert plus (etait la version v1)

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