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

Last change on this file since 120876 was 120876, checked in by Cerdic, 15 months ago

gerer le paquet.xml dans le nom du module, et affichage avec un filtre tradlang_module_jolinom dans le selecteur

File size: 8.0 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}
253
254function tradlang_module_jolinom($nom_mod) {
255        if (strpos($nom_mod, '[') !== false) {
256                $nom_mod = str_replace(array('[', ']'), array('<small class=\'text-muted\'>[', ']</small>'), $nom_mod);
257                if (strpos($nom_mod, ']') === false) {
258                        $nom_mod .= "</small>";
259                }
260        }
261        if (strpos($nom_mod, '(') !== false and strpos($nom_mod, ')') !== false) {
262                $nom_mod = str_replace("(", "<small class='text-muted'>(", $nom_mod);
263                $nom_mod = str_replace(")", ")</small>", $nom_mod);
264        }
265        return $nom_mod;
266}
Note: See TracBrowser for help on using the repository browser.