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 | |
---|
13 | if (!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 | */ |
---|
23 | function 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 | |
---|
49 | function 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 | */ |
---|
69 | function 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 | */ |
---|
85 | function 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 | */ |
---|
103 | function 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 | */ |
---|
123 | function 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 | */ |
---|
148 | function 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 | */ |
---|
172 | function 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 | */ |
---|
204 | function 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 | */ |
---|
229 | function tradlang_utf8($str) { |
---|
230 | $str = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&\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 | */ |
---|
244 | function 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 | } |
---|