Completed
Push — master ( 7a7b60...db70c0 )
by cam
59s
created
prive/formulaires/editer_auteur.php 1 patch
Indentation   +369 added lines, -369 removed lines patch added patch discarded remove patch
@@ -7,7 +7,7 @@  discard block
 block discarded – undo
7 7
  **/
8 8
 
9 9
 if (!defined('_ECRIRE_INC_VERSION')) {
10
-	return;
10
+    return;
11 11
 }
12 12
 
13 13
 include_spip('inc/actions');
@@ -38,24 +38,24 @@  discard block
 block discarded – undo
38 38
  *     Environnement du formulaire
39 39
  **/
40 40
 function formulaires_editer_auteur_charger_dist(
41
-	$id_auteur = 'new',
42
-	$retour = '',
43
-	$associer_objet = '',
44
-	$config_fonc = 'auteurs_edit_config',
45
-	$row = [],
46
-	$hidden = ''
41
+    $id_auteur = 'new',
42
+    $retour = '',
43
+    $associer_objet = '',
44
+    $config_fonc = 'auteurs_edit_config',
45
+    $row = [],
46
+    $hidden = ''
47 47
 ) {
48
-	$valeurs = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
49
-	$valeurs['new_login'] = $valeurs['login'];
48
+    $valeurs = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
49
+    $valeurs['new_login'] = $valeurs['login'];
50 50
 	
51
-	// S'il n'y a pas la langue, on prend la langue du site
52
-	$valeurs['langue'] = $valeurs['langue'] ?: $GLOBALS['meta']['langue_site'];
51
+    // S'il n'y a pas la langue, on prend la langue du site
52
+    $valeurs['langue'] = $valeurs['langue'] ?: $GLOBALS['meta']['langue_site'];
53 53
 
54
-	if (!autoriser('modifier', 'auteur', intval($id_auteur))) {
55
-		$valeurs['editable'] = '';
56
-	}
54
+    if (!autoriser('modifier', 'auteur', intval($id_auteur))) {
55
+        $valeurs['editable'] = '';
56
+    }
57 57
 
58
-	return $valeurs;
58
+    return $valeurs;
59 59
 }
60 60
 
61 61
 /**
@@ -79,14 +79,14 @@  discard block
 block discarded – undo
79 79
  *     Hash du formulaire
80 80
  */
81 81
 function formulaires_editer_auteur_identifier_dist(
82
-	$id_auteur = 'new',
83
-	$retour = '',
84
-	$associer_objet = '',
85
-	$config_fonc = 'auteurs_edit_config',
86
-	$row = [],
87
-	$hidden = ''
82
+    $id_auteur = 'new',
83
+    $retour = '',
84
+    $associer_objet = '',
85
+    $config_fonc = 'auteurs_edit_config',
86
+    $row = [],
87
+    $hidden = ''
88 88
 ) {
89
-	return serialize([intval($id_auteur), $associer_objet]);
89
+    return serialize([intval($id_auteur), $associer_objet]);
90 90
 }
91 91
 
92 92
 
@@ -100,27 +100,27 @@  discard block
 block discarded – undo
100 100
  */
101 101
 function auteurs_edit_config(array $row): array {
102 102
 
103
-	$config = [];
104
-	$config['lignes'] = 8;
105
-	$config['langue'] = $GLOBALS['spip_lang'];
106
-
107
-	// pour instituer_auteur
108
-	$config['auteur'] = $row;
109
-
110
-	//$config['restreint'] = ($row['statut'] == 'publie');
111
-	$auth_methode = $row['source'];
112
-	include_spip('inc/auth');
113
-	$config['edit_login'] =
114
-		(auth_autoriser_modifier_login($auth_methode)
115
-			and autoriser('modifier', 'auteur', $row['id_auteur'], null, ['login' => true])
116
-			// legacy : ne pas risquer d'autoriser la modif login si fonction d'autorisation pas mise a jour et ne teste que l'option email
117
-			and autoriser('modifier', 'auteur', $row['id_auteur'], null, ['email' => true])
118
-		);
119
-	$config['edit_pass'] =
120
-		(auth_autoriser_modifier_pass($auth_methode)
121
-			and autoriser('modifier', 'auteur', $row['id_auteur']));
122
-
123
-	return $config;
103
+    $config = [];
104
+    $config['lignes'] = 8;
105
+    $config['langue'] = $GLOBALS['spip_lang'];
106
+
107
+    // pour instituer_auteur
108
+    $config['auteur'] = $row;
109
+
110
+    //$config['restreint'] = ($row['statut'] == 'publie');
111
+    $auth_methode = $row['source'];
112
+    include_spip('inc/auth');
113
+    $config['edit_login'] =
114
+        (auth_autoriser_modifier_login($auth_methode)
115
+            and autoriser('modifier', 'auteur', $row['id_auteur'], null, ['login' => true])
116
+            // legacy : ne pas risquer d'autoriser la modif login si fonction d'autorisation pas mise a jour et ne teste que l'option email
117
+            and autoriser('modifier', 'auteur', $row['id_auteur'], null, ['email' => true])
118
+        );
119
+    $config['edit_pass'] =
120
+        (auth_autoriser_modifier_pass($auth_methode)
121
+            and autoriser('modifier', 'auteur', $row['id_auteur']));
122
+
123
+    return $config;
124 124
 }
125 125
 
126 126
 /**
@@ -150,143 +150,143 @@  discard block
 block discarded – undo
150 150
  *     Erreurs des saisies
151 151
  **/
152 152
 function formulaires_editer_auteur_verifier_dist(
153
-	$id_auteur = 'new',
154
-	$retour = '',
155
-	$associer_objet = '',
156
-	$config_fonc = 'auteurs_edit_config',
157
-	$row = [],
158
-	$hidden = ''
153
+    $id_auteur = 'new',
154
+    $retour = '',
155
+    $associer_objet = '',
156
+    $config_fonc = 'auteurs_edit_config',
157
+    $row = [],
158
+    $hidden = ''
159 159
 ) {
160
-	// auto-renseigner le nom si il n'existe pas, sans couper
161
-	titre_automatique('nom', ['email', 'login'], 255);
162
-
163
-	$oblis = ['nom'];
164
-	// si on veut renvoyer des identifiants il faut un email et un login
165
-	if (_request('reset_password')) {
166
-		$oblis[] = 'email';
167
-		$oblis[] = 'new_login';
168
-	}
169
-	// mais il reste obligatoire si on a rien trouve
170
-	$erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, $oblis);
171
-	if (isset($erreurs['new_login'])) {
172
-		$erreurs['login'] = $erreurs['new_login'];
173
-		unset($erreurs['new_login']);
174
-	}
175
-
176
-	$auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
177
-	$auth_methode = ($auth_methode ?: 'spip');
178
-	include_spip('inc/auth');
179
-
180
-	if (!nom_acceptable(_request('nom'))) {
181
-		$erreurs['nom'] = _T('info_nom_pas_conforme');
182
-	}
183
-
184
-	if ($email = _request('email')) {
185
-		include_spip('inc/filtres');
186
-		include_spip('inc/autoriser');
187
-		// un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un
188
-		if (
189
-			!autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])
190
-			and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
191
-			and !strlen(trim($email))
192
-			and $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))
193
-		) {
194
-			$erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
195
-		} else {
196
-			if (!email_valide($email)) {
197
-				$erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
198
-			}
199
-		}
200
-		# Ne pas autoriser d'avoir deux auteurs avec le même email
201
-		# cette fonctionalité nécessite que la base soit clean à l'activation : pas de
202
-		# doublon sur la requête select email,count(*) from spip_auteurs group by email ;
203
-		if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) {
204
-			#Nouvel auteur
205
-			if (intval($id_auteur) == 0) {
206
-				#Un auteur existe deja avec cette adresse ?
207
-				if (sql_countsel('spip_auteurs', 'email=' . sql_quote($email)) > 0) {
208
-					$erreurs['email'] = _T('erreur_email_deja_existant');
209
-				}
210
-			} else {
211
-				#Un auteur existe deja avec cette adresse ? et n'est pas le user courant.
212
-				if (
213
-					(sql_countsel(
214
-						'spip_auteurs',
215
-						'email=' . sql_quote($email)
216
-					) > 0) and ($id_auteur != ($id_auteur_ancien = sql_getfetsel(
217
-						'id_auteur',
218
-						'spip_auteurs',
219
-						'email=' . sql_quote($email)
220
-					)))
221
-				) {
222
-					$erreurs['email'] = _T('erreur_email_deja_existant');
223
-				}
224
-			}
225
-		}
226
-	}
227
-
228
-	// quand c'est un auteur existant on fait le reset password ici
229
-	if (!(is_countable($erreurs) ? count($erreurs) : 0) and _request('reset_password') and intval($id_auteur)) {
230
-		$erreurs = auteur_reset_password($id_auteur, $erreurs);
231
-		return $erreurs;
232
-	}
233
-
234
-	// corriger un cas si frequent : www.example.org sans le http:// qui precede
235
-	if ($url = _request('url_site') and !tester_url_absolue($url)) {
236
-		if (strpos($url, ':') === false and strncasecmp($url, 'www.', 4) === 0) {
237
-			$url = 'http://' . $url;
238
-			set_request('url_site', $url);
239
-		}
240
-	}
241
-	// traiter les liens implicites avant de tester l'url
242
-	include_spip('inc/lien');
243
-	if ($url = calculer_url(_request('url_site')) and !tester_url_absolue($url)) {
244
-		$erreurs['url_site'] = _T('info_url_site_pas_conforme');
245
-	}
246
-
247
-	$erreurs['message_erreur'] = '';
248
-	if (_request('login')) {
249
-		// on n'est jamais cense poster le name 'login'
250
-		$erreurs['login'] = _T('info_non_modifiable');
251
-	}
252
-	elseif (
253
-		($login = _request('new_login')) and
254
-		$login !== sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur))
255
-	) {
256
-		// on verifie la meme chose que dans auteurs_edit_config()
257
-		if (
258
-			! auth_autoriser_modifier_login($auth_methode)
259
-			or !autoriser('modifier', 'auteur', intval($id_auteur), null, ['login' => true])
260
-			// legacy : ne pas risquer d'autoriser la modif login si fonction d'autorisation pas mise a jour et ne teste que l'option email
261
-			or !autoriser('modifier', 'auteur', intval($id_auteur), null, ['email' => true])
262
-		) {
263
-			$erreurs['login'] = _T('info_non_modifiable');
264
-		}
265
-	}
266
-
267
-	if (empty($erreurs['login'])) {
268
-		if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
269
-			$erreurs['login'] = $err;
270
-			$erreurs['message_erreur'] .= $err;
271
-		} else {
272
-			// pass trop court ou confirmation non identique
273
-			if ($p = _request('new_pass')) {
274
-				if ($p != _request('new_pass2')) {
275
-					$erreurs['new_pass'] = _T('info_passes_identiques');
276
-					$erreurs['message_erreur'] .= _T('info_passes_identiques');
277
-				} elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
278
-					$erreurs['new_pass'] = $err;
279
-					$erreurs['message_erreur'] .= $err;
280
-				}
281
-			}
282
-		}
283
-	}
284
-
285
-	if (!$erreurs['message_erreur']) {
286
-		unset($erreurs['message_erreur']);
287
-	}
288
-
289
-	return $erreurs;
160
+    // auto-renseigner le nom si il n'existe pas, sans couper
161
+    titre_automatique('nom', ['email', 'login'], 255);
162
+
163
+    $oblis = ['nom'];
164
+    // si on veut renvoyer des identifiants il faut un email et un login
165
+    if (_request('reset_password')) {
166
+        $oblis[] = 'email';
167
+        $oblis[] = 'new_login';
168
+    }
169
+    // mais il reste obligatoire si on a rien trouve
170
+    $erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, $oblis);
171
+    if (isset($erreurs['new_login'])) {
172
+        $erreurs['login'] = $erreurs['new_login'];
173
+        unset($erreurs['new_login']);
174
+    }
175
+
176
+    $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
177
+    $auth_methode = ($auth_methode ?: 'spip');
178
+    include_spip('inc/auth');
179
+
180
+    if (!nom_acceptable(_request('nom'))) {
181
+        $erreurs['nom'] = _T('info_nom_pas_conforme');
182
+    }
183
+
184
+    if ($email = _request('email')) {
185
+        include_spip('inc/filtres');
186
+        include_spip('inc/autoriser');
187
+        // un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un
188
+        if (
189
+            !autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])
190
+            and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
191
+            and !strlen(trim($email))
192
+            and $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))
193
+        ) {
194
+            $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
195
+        } else {
196
+            if (!email_valide($email)) {
197
+                $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
198
+            }
199
+        }
200
+        # Ne pas autoriser d'avoir deux auteurs avec le même email
201
+        # cette fonctionalité nécessite que la base soit clean à l'activation : pas de
202
+        # doublon sur la requête select email,count(*) from spip_auteurs group by email ;
203
+        if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) {
204
+            #Nouvel auteur
205
+            if (intval($id_auteur) == 0) {
206
+                #Un auteur existe deja avec cette adresse ?
207
+                if (sql_countsel('spip_auteurs', 'email=' . sql_quote($email)) > 0) {
208
+                    $erreurs['email'] = _T('erreur_email_deja_existant');
209
+                }
210
+            } else {
211
+                #Un auteur existe deja avec cette adresse ? et n'est pas le user courant.
212
+                if (
213
+                    (sql_countsel(
214
+                        'spip_auteurs',
215
+                        'email=' . sql_quote($email)
216
+                    ) > 0) and ($id_auteur != ($id_auteur_ancien = sql_getfetsel(
217
+                        'id_auteur',
218
+                        'spip_auteurs',
219
+                        'email=' . sql_quote($email)
220
+                    )))
221
+                ) {
222
+                    $erreurs['email'] = _T('erreur_email_deja_existant');
223
+                }
224
+            }
225
+        }
226
+    }
227
+
228
+    // quand c'est un auteur existant on fait le reset password ici
229
+    if (!(is_countable($erreurs) ? count($erreurs) : 0) and _request('reset_password') and intval($id_auteur)) {
230
+        $erreurs = auteur_reset_password($id_auteur, $erreurs);
231
+        return $erreurs;
232
+    }
233
+
234
+    // corriger un cas si frequent : www.example.org sans le http:// qui precede
235
+    if ($url = _request('url_site') and !tester_url_absolue($url)) {
236
+        if (strpos($url, ':') === false and strncasecmp($url, 'www.', 4) === 0) {
237
+            $url = 'http://' . $url;
238
+            set_request('url_site', $url);
239
+        }
240
+    }
241
+    // traiter les liens implicites avant de tester l'url
242
+    include_spip('inc/lien');
243
+    if ($url = calculer_url(_request('url_site')) and !tester_url_absolue($url)) {
244
+        $erreurs['url_site'] = _T('info_url_site_pas_conforme');
245
+    }
246
+
247
+    $erreurs['message_erreur'] = '';
248
+    if (_request('login')) {
249
+        // on n'est jamais cense poster le name 'login'
250
+        $erreurs['login'] = _T('info_non_modifiable');
251
+    }
252
+    elseif (
253
+        ($login = _request('new_login')) and
254
+        $login !== sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur))
255
+    ) {
256
+        // on verifie la meme chose que dans auteurs_edit_config()
257
+        if (
258
+            ! auth_autoriser_modifier_login($auth_methode)
259
+            or !autoriser('modifier', 'auteur', intval($id_auteur), null, ['login' => true])
260
+            // legacy : ne pas risquer d'autoriser la modif login si fonction d'autorisation pas mise a jour et ne teste que l'option email
261
+            or !autoriser('modifier', 'auteur', intval($id_auteur), null, ['email' => true])
262
+        ) {
263
+            $erreurs['login'] = _T('info_non_modifiable');
264
+        }
265
+    }
266
+
267
+    if (empty($erreurs['login'])) {
268
+        if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
269
+            $erreurs['login'] = $err;
270
+            $erreurs['message_erreur'] .= $err;
271
+        } else {
272
+            // pass trop court ou confirmation non identique
273
+            if ($p = _request('new_pass')) {
274
+                if ($p != _request('new_pass2')) {
275
+                    $erreurs['new_pass'] = _T('info_passes_identiques');
276
+                    $erreurs['message_erreur'] .= _T('info_passes_identiques');
277
+                } elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
278
+                    $erreurs['new_pass'] = $err;
279
+                    $erreurs['message_erreur'] .= $err;
280
+                }
281
+            }
282
+        }
283
+    }
284
+
285
+    if (!$erreurs['message_erreur']) {
286
+        unset($erreurs['message_erreur']);
287
+    }
288
+
289
+    return $erreurs;
290 290
 }
291 291
 
292 292
 
@@ -323,154 +323,154 @@  discard block
 block discarded – undo
323 323
  *     Retour des traitements
324 324
  **/
325 325
 function formulaires_editer_auteur_traiter_dist(
326
-	$id_auteur = 'new',
327
-	$retour = '',
328
-	$associer_objet = '',
329
-	$config_fonc = 'auteurs_edit_config',
330
-	$row = [],
331
-	$hidden = ''
326
+    $id_auteur = 'new',
327
+    $retour = '',
328
+    $associer_objet = '',
329
+    $config_fonc = 'auteurs_edit_config',
330
+    $row = [],
331
+    $hidden = ''
332 332
 ) {
333
-	if (_request('saisie_webmestre') or _request('webmestre')) {
334
-		set_request('webmestre', _request('webmestre') ?: 'non');
335
-	}
336
-
337
-	// si il y a des modifs sensibles (statut, mot de passe), on refuse le traitement en ajax
338
-	// le formulaire ne peut être traité depuis une XMLHttpRequest
339
-	$prev = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
340
-	if (
341
-		_request('new_pass') // nouveau mot de passe
342
-		or empty($prev['statut']) // creation auteur
343
-		or (_request('email') and $prev['email'] !== _request('email')) // modification email
344
-		or (_request('statut') === '0minirezo' and $prev['statut'] !== '0minirezo') // promotion 0minirezo
345
-		or (_request('statut') and intval(_request('statut')) < intval($prev['statut'])) // promotion de statut
346
-		or (_request('webmestre') and _request('webmestre') !== 'non' and $prev['webmestre'] !== 'oui') // promotion webmestre
347
-	) {
348
-		refuser_traiter_formulaire_ajax();
349
-		// si on arrive là encore en ajax c'est pas OK, on genere une erreur
350
-		if (_AJAX or !empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
351
-			return [
352
-				'message_erreur' => _T('erreur_technique_ajaxform')
353
-			];
354
-		}
355
-	}
356
-
357
-	$id_objet = null;
358
-	$retour = parametre_url($retour, 'email_confirm', '');
359
-
360
-	if ($restreintes = _request('restreintes')) {
361
-		foreach ($restreintes as $k => $v) {
362
-			if (strpos($v, 'rubrique|') === 0) {
363
-				$restreintes[$k] = substr($v, 9);
364
-			}
365
-		}
366
-		set_request('restreintes', $restreintes);
367
-	}
368
-
369
-	set_request(
370
-		'email',
371
-		email_valide(_request('email'))
372
-	); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier :
373
-	// "[email protected]  " ou encore "Marie Toto <[email protected]>"
374
-
375
-	include_spip('inc/autoriser');
376
-	if (!autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])) {
377
-		$email_nouveau = _request('email');
378
-		set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email
379
-		// mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique
380
-		// pour qu'il confirme qu'il possede bien cette adresse
381
-		// son clic sur l'url du message permettre de confirmer le changement
382
-		// et de revenir sur son profil
383
-		if (
384
-			$GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
385
-			and $email_nouveau !=
386
-				($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))
387
-		) {
388
-			$envoyer_mail = charger_fonction('envoyer_mail', 'inc');
389
-			$texte = _T(
390
-				'form_auteur_mail_confirmation',
391
-				[
392
-					'url' => generer_action_auteur(
393
-						'confirmer_email',
394
-						$email_nouveau,
395
-						parametre_url($retour, 'email_modif', 'ok')
396
-					)
397
-				]
398
-			);
399
-			$envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte);
400
-			set_request('email_confirm', $email_nouveau);
401
-			if ($email_ancien) {
402
-				$envoyer_mail(
403
-					$email_ancien,
404
-					_T('form_auteur_confirmation'),
405
-					_T('form_auteur_envoi_mail_confirmation', ['email' => $email_nouveau])
406
-				);
407
-			}
408
-			$retour = parametre_url($retour, 'email_confirm', $email_nouveau);
409
-		}
410
-	}
333
+    if (_request('saisie_webmestre') or _request('webmestre')) {
334
+        set_request('webmestre', _request('webmestre') ?: 'non');
335
+    }
336
+
337
+    // si il y a des modifs sensibles (statut, mot de passe), on refuse le traitement en ajax
338
+    // le formulaire ne peut être traité depuis une XMLHttpRequest
339
+    $prev = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
340
+    if (
341
+        _request('new_pass') // nouveau mot de passe
342
+        or empty($prev['statut']) // creation auteur
343
+        or (_request('email') and $prev['email'] !== _request('email')) // modification email
344
+        or (_request('statut') === '0minirezo' and $prev['statut'] !== '0minirezo') // promotion 0minirezo
345
+        or (_request('statut') and intval(_request('statut')) < intval($prev['statut'])) // promotion de statut
346
+        or (_request('webmestre') and _request('webmestre') !== 'non' and $prev['webmestre'] !== 'oui') // promotion webmestre
347
+    ) {
348
+        refuser_traiter_formulaire_ajax();
349
+        // si on arrive là encore en ajax c'est pas OK, on genere une erreur
350
+        if (_AJAX or !empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
351
+            return [
352
+                'message_erreur' => _T('erreur_technique_ajaxform')
353
+            ];
354
+        }
355
+    }
356
+
357
+    $id_objet = null;
358
+    $retour = parametre_url($retour, 'email_confirm', '');
359
+
360
+    if ($restreintes = _request('restreintes')) {
361
+        foreach ($restreintes as $k => $v) {
362
+            if (strpos($v, 'rubrique|') === 0) {
363
+                $restreintes[$k] = substr($v, 9);
364
+            }
365
+        }
366
+        set_request('restreintes', $restreintes);
367
+    }
368
+
369
+    set_request(
370
+        'email',
371
+        email_valide(_request('email'))
372
+    ); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier :
373
+    // "[email protected]  " ou encore "Marie Toto <[email protected]>"
374
+
375
+    include_spip('inc/autoriser');
376
+    if (!autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])) {
377
+        $email_nouveau = _request('email');
378
+        set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email
379
+        // mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique
380
+        // pour qu'il confirme qu'il possede bien cette adresse
381
+        // son clic sur l'url du message permettre de confirmer le changement
382
+        // et de revenir sur son profil
383
+        if (
384
+            $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
385
+            and $email_nouveau !=
386
+                ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))
387
+        ) {
388
+            $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
389
+            $texte = _T(
390
+                'form_auteur_mail_confirmation',
391
+                [
392
+                    'url' => generer_action_auteur(
393
+                        'confirmer_email',
394
+                        $email_nouveau,
395
+                        parametre_url($retour, 'email_modif', 'ok')
396
+                    )
397
+                ]
398
+            );
399
+            $envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte);
400
+            set_request('email_confirm', $email_nouveau);
401
+            if ($email_ancien) {
402
+                $envoyer_mail(
403
+                    $email_ancien,
404
+                    _T('form_auteur_confirmation'),
405
+                    _T('form_auteur_envoi_mail_confirmation', ['email' => $email_nouveau])
406
+                );
407
+            }
408
+            $retour = parametre_url($retour, 'email_confirm', $email_nouveau);
409
+        }
410
+    }
411 411
 	
412
-	// Trafic de langue pour enregistrer la bonne
413
-	if ($langue = _request('langue')) {
414
-		set_request('lang', $langue);
415
-	}
412
+    // Trafic de langue pour enregistrer la bonne
413
+    if ($langue = _request('langue')) {
414
+        set_request('lang', $langue);
415
+    }
416 416
 	
417
-	$res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
418
-
419
-	if (_request('reset_password') and !intval($id_auteur) and intval($res['id_auteur'])) {
420
-		$erreurs = [];
421
-		$erreurs = auteur_reset_password($res['id_auteur'], $erreurs);
422
-		if (isset($erreurs['message_ok'])) {
423
-			if (!isset($res['message_ok'])) { $res['message_ok'] = '';
424
-			}
425
-			$res['message_ok'] = trim($res['message_ok'] . ' ' . $erreurs['message_ok']);
426
-		}
427
-		if (isset($erreurs['message_erreur']) and $erreurs['message_erreur']) {
428
-			if (!isset($res['message_erreur'])) { $res['message_erreur'] = '';
429
-			}
430
-			$res['message_erreur'] = trim($res['message_erreur'] . ' ' . $erreurs['message_erreur']);
431
-		}
432
-	}
433
-
434
-	// Un lien auteur a prendre en compte ?
435
-	if ($associer_objet and $id_auteur = $res['id_auteur']) {
436
-		$objet = '';
437
-		if (intval($associer_objet)) {
438
-			$objet = 'article';
439
-			$id_objet = intval($associer_objet);
440
-		} elseif (preg_match(',^\w+\|[0-9]+$,', $associer_objet)) {
441
-			[$objet, $id_objet] = explode('|', $associer_objet);
442
-		}
443
-		if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) {
444
-			include_spip('action/editer_auteur');
445
-			auteur_associer($id_auteur, [$objet => $id_objet]);
446
-			if (isset($res['redirect'])) {
447
-				$res['redirect'] = parametre_url($res['redirect'], 'id_lien_ajoute', $id_auteur, '&');
448
-			}
449
-		}
450
-	}
451
-
452
-	return $res;
417
+    $res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
418
+
419
+    if (_request('reset_password') and !intval($id_auteur) and intval($res['id_auteur'])) {
420
+        $erreurs = [];
421
+        $erreurs = auteur_reset_password($res['id_auteur'], $erreurs);
422
+        if (isset($erreurs['message_ok'])) {
423
+            if (!isset($res['message_ok'])) { $res['message_ok'] = '';
424
+            }
425
+            $res['message_ok'] = trim($res['message_ok'] . ' ' . $erreurs['message_ok']);
426
+        }
427
+        if (isset($erreurs['message_erreur']) and $erreurs['message_erreur']) {
428
+            if (!isset($res['message_erreur'])) { $res['message_erreur'] = '';
429
+            }
430
+            $res['message_erreur'] = trim($res['message_erreur'] . ' ' . $erreurs['message_erreur']);
431
+        }
432
+    }
433
+
434
+    // Un lien auteur a prendre en compte ?
435
+    if ($associer_objet and $id_auteur = $res['id_auteur']) {
436
+        $objet = '';
437
+        if (intval($associer_objet)) {
438
+            $objet = 'article';
439
+            $id_objet = intval($associer_objet);
440
+        } elseif (preg_match(',^\w+\|[0-9]+$,', $associer_objet)) {
441
+            [$objet, $id_objet] = explode('|', $associer_objet);
442
+        }
443
+        if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) {
444
+            include_spip('action/editer_auteur');
445
+            auteur_associer($id_auteur, [$objet => $id_objet]);
446
+            if (isset($res['redirect'])) {
447
+                $res['redirect'] = parametre_url($res['redirect'], 'id_lien_ajoute', $id_auteur, '&');
448
+            }
449
+        }
450
+    }
451
+
452
+    return $res;
453 453
 }
454 454
 
455 455
 
456 456
 function auteur_reset_password($id_auteur, $erreurs = []) {
457
-	$auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
458
-	$config = auteurs_edit_config($auteur);
459
-
460
-	if ($config['edit_pass']) {
461
-		if ($email = auteur_regenerer_identifiants($id_auteur)) {
462
-			$erreurs['message_ok'] = _T('message_nouveaux_identifiants_ok', ['email' => $email]);
463
-			$erreurs['message_erreur'] = '';
464
-		} elseif ($email === false) {
465
-			$erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_envoi');
466
-		} else {
467
-			$erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
468
-		}
469
-	} else {
470
-		$erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
471
-	}
472
-
473
-	return $erreurs;
457
+    $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
458
+    $config = auteurs_edit_config($auteur);
459
+
460
+    if ($config['edit_pass']) {
461
+        if ($email = auteur_regenerer_identifiants($id_auteur)) {
462
+            $erreurs['message_ok'] = _T('message_nouveaux_identifiants_ok', ['email' => $email]);
463
+            $erreurs['message_erreur'] = '';
464
+        } elseif ($email === false) {
465
+            $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_envoi');
466
+        } else {
467
+            $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
468
+        }
469
+    } else {
470
+        $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
471
+    }
472
+
473
+    return $erreurs;
474 474
 }
475 475
 
476 476
 /**
@@ -481,53 +481,53 @@  discard block
 block discarded – undo
481 481
  * @return string
482 482
  */
483 483
 function auteur_regenerer_identifiants($id_auteur, $notifier = true, $contexte = []) {
484
-	if ($id_auteur) {
485
-		$set = [];
486
-		include_spip('inc/access');
487
-		$set['pass'] = creer_pass_aleatoire(max(_PASS_LONGUEUR_MINI, 16));
488
-
489
-		include_spip('action/editer_auteur');
490
-		auteur_modifier($id_auteur, $set);
491
-
492
-		$row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
493
-		include_spip('inc/filtres');
494
-		if (
495
-			$notifier
496
-			and $row['email']
497
-			and email_valide($row['email'])
498
-			and trouver_fond($fond = 'modeles/mail_nouveaux_identifiants')
499
-		) {
500
-			// envoyer l'email avec login/pass
501
-			$c = [
502
-				'id_auteur' => $id_auteur,
503
-				'nom' => $row['nom'],
504
-				'mode' => $row['statut'],
505
-				'email' => $row['email'],
506
-				'pass' => $set['pass'],
507
-			];
508
-			// on merge avec les champs fournit en appel, qui sont passes au modele de notification donc
509
-			$contexte = array_merge($contexte, $c);
510
-			// si pas de langue explicitement demandee, prendre celle de l'auteur si on la connait, ou a defaut celle du site
511
-			// plutot que celle de l'admin qui vient de cliquer sur le bouton
512
-			if (!isset($contexte['lang']) or !$contexte['lang']) {
513
-				if (isset($row['lang']) and $row['lang']) {
514
-					$contexte['lang'] = $row['lang'];
515
-				}
516
-				else {
517
-					$contexte['lang'] = $GLOBALS['meta']['langue_site'];
518
-				}
519
-			}
520
-			lang_select($contexte['lang']);
521
-			$message = recuperer_fond($fond, $contexte);
522
-			include_spip('inc/notifications');
523
-			notifications_envoyer_mails($row['email'], $message);
524
-			lang_select();
525
-
526
-			return $row['email'];
527
-		}
528
-
529
-		return false;
530
-	}
531
-
532
-	return '';
484
+    if ($id_auteur) {
485
+        $set = [];
486
+        include_spip('inc/access');
487
+        $set['pass'] = creer_pass_aleatoire(max(_PASS_LONGUEUR_MINI, 16));
488
+
489
+        include_spip('action/editer_auteur');
490
+        auteur_modifier($id_auteur, $set);
491
+
492
+        $row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
493
+        include_spip('inc/filtres');
494
+        if (
495
+            $notifier
496
+            and $row['email']
497
+            and email_valide($row['email'])
498
+            and trouver_fond($fond = 'modeles/mail_nouveaux_identifiants')
499
+        ) {
500
+            // envoyer l'email avec login/pass
501
+            $c = [
502
+                'id_auteur' => $id_auteur,
503
+                'nom' => $row['nom'],
504
+                'mode' => $row['statut'],
505
+                'email' => $row['email'],
506
+                'pass' => $set['pass'],
507
+            ];
508
+            // on merge avec les champs fournit en appel, qui sont passes au modele de notification donc
509
+            $contexte = array_merge($contexte, $c);
510
+            // si pas de langue explicitement demandee, prendre celle de l'auteur si on la connait, ou a defaut celle du site
511
+            // plutot que celle de l'admin qui vient de cliquer sur le bouton
512
+            if (!isset($contexte['lang']) or !$contexte['lang']) {
513
+                if (isset($row['lang']) and $row['lang']) {
514
+                    $contexte['lang'] = $row['lang'];
515
+                }
516
+                else {
517
+                    $contexte['lang'] = $GLOBALS['meta']['langue_site'];
518
+                }
519
+            }
520
+            lang_select($contexte['lang']);
521
+            $message = recuperer_fond($fond, $contexte);
522
+            include_spip('inc/notifications');
523
+            notifications_envoyer_mails($row['email'], $message);
524
+            lang_select();
525
+
526
+            return $row['email'];
527
+        }
528
+
529
+        return false;
530
+    }
531
+
532
+    return '';
533 533
 }
Please login to merge, or discard this patch.
ecrire/base/objets.php 1 patch
Indentation   +1257 added lines, -1257 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -32,11 +32,11 @@  discard block
 block discarded – undo
32 32
  * @return void
33 33
  **/
34 34
 function array_set_merge(&$table, $index, $valeur) {
35
-	if (!isset($table[$index])) {
36
-		$table[$index] = $valeur;
37
-	} else {
38
-		$table[$index] = array_merge($table[$index], $valeur);
39
-	}
35
+    if (!isset($table[$index])) {
36
+        $table[$index] = $valeur;
37
+    } else {
38
+        $table[$index] = array_merge($table[$index], $valeur);
39
+    }
40 40
 }
41 41
 
42 42
 /**
@@ -55,441 +55,441 @@  discard block
 block discarded – undo
55 55
  *   - string (interne) si table '::md5' retourne un hash
56 56
  */
57 57
 function lister_tables_objets_sql(?string $table_sql = null, $desc = []) {
58
-	static $deja_la = false;
59
-	static $infos_tables = null;
60
-	static $md5 = null;
61
-	static $plugin_hash = null;
62
-
63
-	// plugins hash connu ? non si _CACHE_PLUGINS_OPT est pas encore chargé.
64
-	$_PLUGINS_HASH = defined('_PLUGINS_HASH') ? _PLUGINS_HASH : '!_CACHE_PLUGINS_OPT';
65
-
66
-	// prealablement recuperer les tables_principales
67
-	if (is_null($infos_tables) or $plugin_hash !== $_PLUGINS_HASH) {
68
-		// pas de reentrance (cas base/serial)
69
-		if ($deja_la) {
70
-			spip_log('Re-entrance anormale sur lister_tables_objets_sql : '
71
-				. var_export(debug_backtrace(), true), _LOG_CRITIQUE);
72
-
73
-			return ($table_sql === '::md5' ? $md5 : []);
74
-		}
75
-		$deja_la = true;
76
-		$plugin_hash = $_PLUGINS_HASH; // avant de lancer les pipelines
77
-
78
-		// recuperer les declarations explicites ancienne mode
79
-		// qui servent a completer declarer_tables_objets_sql
80
-		base_serial($GLOBALS['tables_principales']);
81
-		base_auxiliaires($GLOBALS['tables_auxiliaires']);
82
-		$infos_tables = [
83
-			'spip_articles' => [
84
-				'page' => 'article',
85
-				'texte_retour' => 'icone_retour_article',
86
-				'texte_modifier' => 'icone_modifier_article',
87
-				'texte_creer' => 'icone_ecrire_article',
88
-				'texte_objets' => 'public:articles',
89
-				'texte_objet' => 'public:article',
90
-				'texte_signale_edition' => 'texte_travail_article',
91
-				'info_aucun_objet' => 'info_aucun_article',
92
-				'info_1_objet' => 'info_1_article',
93
-				'info_nb_objets' => 'info_nb_articles',
94
-				'texte_logo_objet' => 'logo_article',
95
-				'texte_langue_objet' => 'titre_langue_article',
96
-				'texte_definir_comme_traduction_objet' => 'trad_lier',
97
-				'titre' => 'titre, lang',
98
-				'date' => 'date',
99
-				'principale' => 'oui',
100
-				'introduction_longueur' => '500',
101
-				'champs_editables' => [
102
-					'surtitre',
103
-					'titre',
104
-					'soustitre',
105
-					'descriptif',
106
-					'nom_site',
107
-					'url_site',
108
-					'chapo',
109
-					'texte',
110
-					'ps',
111
-					'virtuel'
112
-				],
113
-				'champs_versionnes' => [
114
-					'id_rubrique',
115
-					'surtitre',
116
-					'titre',
117
-					'soustitre',
118
-					'jointure_auteurs',
119
-					'descriptif',
120
-					'nom_site',
121
-					'url_site',
122
-					'chapo',
123
-					'texte',
124
-					'ps'
125
-				],
126
-				'field' => [
127
-					'id_article' => 'bigint(21) NOT NULL',
128
-					'surtitre' => "text DEFAULT '' NOT NULL",
129
-					'titre' => "text DEFAULT '' NOT NULL",
130
-					'soustitre' => "text DEFAULT '' NOT NULL",
131
-					'id_rubrique' => "bigint(21) DEFAULT '0' NOT NULL",
132
-					'descriptif' => "text DEFAULT '' NOT NULL",
133
-					'chapo' => "mediumtext DEFAULT '' NOT NULL",
134
-					'texte' => "longtext DEFAULT '' NOT NULL",
135
-					'ps' => "mediumtext DEFAULT '' NOT NULL",
136
-					'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
137
-					'statut' => "varchar(10) DEFAULT '0' NOT NULL",
138
-					'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
139
-					'maj' => 'TIMESTAMP',
140
-					'export' => "VARCHAR(10) DEFAULT 'oui'",
141
-					'date_redac' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
142
-					'visites' => "integer DEFAULT '0' NOT NULL",
143
-					'referers' => "integer DEFAULT '0' NOT NULL",
144
-					'popularite' => "DOUBLE DEFAULT '0' NOT NULL",
145
-					'accepter_forum' => "CHAR(3) DEFAULT '' NOT NULL",
146
-					'date_modif' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
147
-					'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
148
-					'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
149
-					'id_trad' => "bigint(21) DEFAULT '0' NOT NULL",
150
-					'nom_site' => "tinytext DEFAULT '' NOT NULL",
151
-					'url_site' => "text DEFAULT '' NOT NULL",
152
-					'virtuel' => "text DEFAULT '' NOT NULL",
153
-				],
154
-				'key' => [
155
-					'PRIMARY KEY' => 'id_article',
156
-					'KEY id_rubrique' => 'id_rubrique',
157
-					'KEY id_secteur' => 'id_secteur',
158
-					'KEY id_trad' => 'id_trad',
159
-					'KEY lang' => 'lang',
160
-					'KEY statut' => 'statut, date',
161
-				],
162
-				'join' => [
163
-					'id_article' => 'id_article',
164
-					'id_rubrique' => 'id_rubrique'
165
-				],
166
-				'parent' => [
167
-					['type' => 'rubrique', 'champ' => 'id_rubrique']
168
-				],
169
-				'rechercher_champs' => [
170
-					'surtitre' => 5,
171
-					'titre' => 8,
172
-					'soustitre' => 5,
173
-					'chapo' => 3,
174
-					'texte' => 1,
175
-					'ps' => 1,
176
-					'nom_site' => 1,
177
-					'url_site' => 1,
178
-					'descriptif' => 4
179
-				],
180
-				'rechercher_jointures' => [
181
-					'auteur' => ['nom' => 10],
182
-				],
183
-				'statut' => [
184
-					[
185
-						'champ' => 'statut',
186
-						'publie' => 'publie',
187
-						'previsu' => 'publie,prop,prepa/auteur',
188
-						'post_date' => 'date',
189
-						'exception' => ['statut', 'tout']
190
-					]
191
-				],
192
-				'statut_titres' => [
193
-					'prepa' => 'info_article_redaction',
194
-					'prop' => 'info_article_propose',
195
-					'publie' => 'info_article_publie',
196
-					'refuse' => 'info_article_refuse',
197
-					'poubelle' => 'info_article_supprime'
198
-				],
199
-				'statut_textes_instituer' => [
200
-					'prepa' => 'texte_statut_en_cours_redaction',
201
-					'prop' => 'texte_statut_propose_evaluation',
202
-					'publie' => 'texte_statut_publie',
203
-					'refuse' => 'texte_statut_refuse',
204
-					'poubelle' => 'texte_statut_poubelle',
205
-				],
206
-				'texte_changer_statut' => 'texte_article_statut',
207
-				'aide_changer_statut' => 'artstatut',
208
-				'tables_jointures' => [
209
-					'profondeur' => 'rubriques',
210
-					#'id_auteur' => 'auteurs_liens' // declaration generique plus bas
211
-				],
212
-			],
213
-			'spip_auteurs' => [
214
-				'page' => 'auteur',
215
-				'texte_retour' => 'icone_retour',
216
-				'texte_ajouter' => 'titre_ajouter_un_auteur',
217
-				'texte_modifier' => 'admin_modifier_auteur',
218
-				'texte_objets' => 'icone_auteurs',
219
-				'texte_objet' => 'public:auteur',
220
-				'info_aucun_objet' => 'info_aucun_auteur',
221
-				'info_1_objet' => 'info_1_auteur',
222
-				'info_nb_objets' => 'info_nb_auteurs',
223
-				'texte_logo_objet' => 'logo_auteur',
224
-				'texte_creer_associer' => 'creer_et_associer_un_auteur',
225
-				'titre' => "nom AS titre, '' AS lang",
226
-				'date' => 'date',
227
-				'principale' => 'oui',
228
-				'champs_editables' => ['nom', 'email', 'lang', 'bio', 'nom_site', 'url_site', 'imessage', 'pgp'],
229
-				'champs_versionnes' => ['nom', 'bio', 'lang', 'email', 'nom_site', 'url_site', 'login'],
230
-				'field' => [
231
-					'id_auteur' => 'bigint(21) NOT NULL',
232
-					'nom' => "text DEFAULT '' NOT NULL",
233
-					'bio' => "text DEFAULT '' NOT NULL",
234
-					'email' => "tinytext DEFAULT '' NOT NULL",
235
-					'nom_site' => "tinytext DEFAULT '' NOT NULL",
236
-					'url_site' => "text DEFAULT '' NOT NULL",
237
-					'login' => 'VARCHAR(255) BINARY',
238
-					'pass' => "tinytext DEFAULT '' NOT NULL",
239
-					'low_sec' => "tinytext DEFAULT '' NOT NULL",
240
-					'statut' => "varchar(255)  DEFAULT '0' NOT NULL",
241
-					'webmestre' => "varchar(3)  DEFAULT 'non' NOT NULL",
242
-					'maj' => 'TIMESTAMP',
243
-					'pgp' => "TEXT DEFAULT '' NOT NULL",
244
-					'htpass' => "tinytext DEFAULT '' NOT NULL",
245
-					'en_ligne' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
246
-					'alea_actuel' => 'tinytext',
247
-					'alea_futur' => 'tinytext',
248
-					'prefs' => 'text',
249
-					'cookie_oubli' => 'tinytext',
250
-					'source' => "VARCHAR(10) DEFAULT 'spip' NOT NULL",
251
-					'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
252
-					'imessage' => "VARCHAR(3) DEFAULT '' NOT NULL",
253
-					'backup_cles' => "mediumtext DEFAULT '' NOT NULL",
254
-				],
255
-				'key' => [
256
-					'PRIMARY KEY' => 'id_auteur',
257
-					'KEY login' => 'login',
258
-					'KEY statut' => 'statut',
259
-					'KEY en_ligne' => 'en_ligne',
260
-				],
261
-				'join' => [
262
-					'id_auteur' => 'id_auteur',
263
-					'login' => 'login'
264
-				],
265
-				'rechercher_champs' => [
266
-					'nom' => 5,
267
-					'bio' => 1,
268
-					'email' => 1,
269
-					'nom_site' => 1,
270
-					'url_site' => 1,
271
-					'login' => 1
272
-				],
273
-				// 2 conditions pour les auteurs : statut!=poubelle,
274
-				// et avoir des articles publies
275
-				'statut' => [
276
-					[
277
-						'champ' => 'statut',
278
-						'publie' => '!5poubelle',
279
-						'previsu' => '!5poubelle',
280
-						'exception' => 'statut'
281
-					],
282
-					[
283
-						'champ' => [
284
-							['spip_auteurs_liens', 'id_auteur'],
285
-							[
286
-								'spip_articles',
287
-								['id_objet', 'id_article', 'objet', 'article']
288
-							],
289
-							'statut'
290
-						],
291
-						'publie' => 'publie',
292
-						'previsu' => '!',
293
-						'post_date' => 'date',
294
-						'exception' => ['statut', 'lien', 'tout']
295
-					],
296
-				],
297
-				'statut_images' => [
298
-					'auteur-6forum-16.png',
299
-					'0minirezo' => 'auteur-0minirezo-16.png',
300
-					'1comite' => 'auteur-1comite-16.png',
301
-					'6forum' => 'auteur-6forum-16.png',
302
-					'5poubelle' => 'auteur-5poubelle-16.png',
303
-					'nouveau' => ''
304
-				],
305
-				'statut_titres' => [
306
-					'titre_image_visiteur',
307
-					'0minirezo' => 'titre_image_administrateur',
308
-					'1comite' => 'titre_image_redacteur_02',
309
-					'6forum' => 'titre_image_visiteur',
310
-					'5poubelle' => 'titre_image_auteur_supprime',
311
-				],
312
-				'tables_jointures' => [#'auteurs_liens' // declaration generique plus bas
313
-				],
314
-			],
315
-			'spip_rubriques' => [
316
-				'page' => 'rubrique',
317
-				'url_voir' => 'rubrique',
318
-				'url_edit' => 'rubrique_edit',
319
-				'texte_retour' => 'icone_retour',
320
-				'texte_objets' => 'public:rubriques',
321
-				'texte_objet' => 'public:rubrique',
322
-				'texte_modifier' => 'icone_modifier_rubrique',
323
-				'texte_creer' => 'icone_creer_rubrique',
324
-				'texte_ajouter' => 'titre_ajouter_une_rubrique',
325
-				'texte_creer_associer' => 'creer_et_associer_une_rubrique',
326
-				'info_aucun_objet' => 'info_aucun_rubrique',
327
-				'info_1_objet' => 'info_1_rubrique',
328
-				'info_nb_objets' => 'info_nb_rubriques',
329
-				'texte_logo_objet' => 'logo_rubrique',
330
-				'texte_langue_objet' => 'titre_langue_rubrique',
331
-				'texte_definir_comme_traduction_objet' => 'texte_definir_comme_traduction_rubrique',
332
-				'titre' => 'titre, lang',
333
-				'date' => 'date',
334
-				'principale' => 'oui',
335
-				'introduction_longueur' => '600',
336
-				'champs_editables' => ['titre', 'texte', 'descriptif', 'extra'],
337
-				'champs_versionnes' => ['titre', 'descriptif', 'texte'],
338
-				'field' => [
339
-					'id_rubrique' => 'bigint(21) NOT NULL',
340
-					'id_parent' => "bigint(21) DEFAULT '0' NOT NULL",
341
-					'titre' => "text DEFAULT '' NOT NULL",
342
-					'descriptif' => "text DEFAULT '' NOT NULL",
343
-					'texte' => "longtext DEFAULT '' NOT NULL",
344
-					'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
345
-					'maj' => 'TIMESTAMP',
346
-					'statut' => "varchar(10) DEFAULT '0' NOT NULL",
347
-					'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
348
-					'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
349
-					'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
350
-					'statut_tmp' => "varchar(10) DEFAULT '0' NOT NULL",
351
-					'date_tmp' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
352
-					'profondeur' => "smallint(5) DEFAULT '0' NOT NULL"
353
-				],
354
-				'key' => [
355
-					'PRIMARY KEY' => 'id_rubrique',
356
-					'KEY lang' => 'lang',
357
-					'KEY id_parent' => 'id_parent',
358
-				],
359
-				'parent' => [
360
-					['type' => 'rubrique', 'champ' => 'id_parent']
361
-				],
362
-				'rechercher_champs' => [
363
-					'titre' => 8,
364
-					'descriptif' => 5,
365
-					'texte' => 1
366
-				],
367
-				'statut' => [
368
-					[
369
-						'champ' => 'statut',
370
-						'publie' => 'publie',
371
-						'previsu' => '!',
372
-						'exception' => ['statut', 'tout']
373
-					],
374
-				],
375
-				'tables_jointures' => [#'id_auteur' => 'auteurs_liens' // declaration generique plus bas
376
-				],
377
-			],
378
-			// toutes les tables ont le droit a une jointure sur les auteurs
379
-			['tables_jointures' => ['id_auteur' => 'auteurs_liens']]
380
-		];
381
-
382
-		// avant d'appeller les pipeline qui peuvent generer une reentrance a l'install
383
-		// initialiser la signature
384
-		$md5 = md5(serialize($infos_tables));
385
-
386
-		$GLOBALS['tables_principales'] = pipeline('declarer_tables_principales', $GLOBALS['tables_principales']);
387
-		$GLOBALS['tables_auxiliaires'] = pipeline('declarer_tables_auxiliaires', $GLOBALS['tables_auxiliaires']);
388
-		$infos_tables = pipeline('declarer_tables_objets_sql', $infos_tables);
389
-
390
-		// completer les informations manquantes ou implicites
391
-		$all = [];
392
-		foreach (array_keys($infos_tables) as $t) {
393
-			// les cles numeriques servent a declarer
394
-			// les proprietes applicables a tous les objets
395
-			// on les mets de cote
396
-			if (is_numeric($t)) {
397
-				$all = array_merge_recursive($all, $infos_tables[$t]);
398
-				unset($infos_tables[$t]);
399
-			} else {
400
-				$infos_tables[$t] = renseigner_table_objet_sql($t, $infos_tables[$t]);
401
-			}
402
-		}
403
-
404
-		// repercuter les proprietes generales communes a tous les objets
405
-		foreach (array_keys($infos_tables) as $t) {
406
-			foreach ($all as $i => $v) {
407
-				if (in_array($i, ['tables_jointures', 'champs_versionnes'])) {
408
-					$add = $all[$i];
409
-					// eviter les doublons de declaration de table jointure (ex des mots sur auteurs)
410
-					// pour les declarations generiques avec cles numeriques
411
-					if ($i == 'tables_jointures' and isset($infos_tables[$t][$i]) and is_countable($infos_tables[$t][$i]) ? count($infos_tables[$t][$i]) : 0) {
412
-						$doublons = array_intersect($infos_tables[$t][$i], $add);
413
-						foreach ($doublons as $d) {
414
-							if (
415
-								is_numeric(array_search($d, $infos_tables[$t][$i]))
416
-								and is_numeric($k = array_search($d, $add))
417
-							) {
418
-								unset($add[$k]);
419
-							}
420
-						}
421
-					}
422
-					$infos_tables[$t][$i] = array_merge($infos_tables[$t][$i] ?? [], $add);
423
-				} else {
424
-					$infos_tables[$t][$i] = array_merge_recursive(
425
-						$infos_tables[$t][$i] ?? [],
426
-						$all[$i]
427
-					);
428
-				}
429
-			}
430
-		}
431
-
432
-		// completer les tables principales et auxiliaires
433
-		// avec celles declarees uniquement dans declarer_table_objets_sql
434
-		// pour assurer la compat en transition
435
-		foreach ($infos_tables as $table => $infos) {
436
-			$principale_ou_auxiliaire = ($infos['principale'] ? 'tables_principales' : 'tables_auxiliaires');
437
-			// memoriser des champs eventuels declares par des plugins dans le pipeline tables_xxx
438
-			// qui a ete appelle avant
439
-			$mem = ($GLOBALS[$principale_ou_auxiliaire][$table] ?? []);
440
-			// l'ajouter au tableau
441
-			$GLOBALS[$principale_ou_auxiliaire][$table] = [];
442
-			if (isset($infos['field']) and isset($infos['key'])) {
443
-				foreach (['field', 'key', 'join'] as $k) {
444
-					if (isset($infos_tables[$table][$k])) {
445
-						$GLOBALS[$principale_ou_auxiliaire][$table][$k] = &$infos_tables[$table][$k];
446
-					}
447
-				}
448
-			} else {
449
-				// ici on ne renvoie que les declarations, donc RIEN
450
-				// pour avoir la vrai description en base, il faut passer par trouver_table
451
-				$GLOBALS[$principale_ou_auxiliaire][$table] = [];
452
-			}
453
-			if (is_countable($mem) ? count($mem) : 0) {
454
-				foreach (array_keys($mem) as $k) {
455
-					if (isset($GLOBALS[$principale_ou_auxiliaire][$table][$k])) {
456
-						$GLOBALS[$principale_ou_auxiliaire][$table][$k] = array_merge(
457
-							$GLOBALS[$principale_ou_auxiliaire][$table][$k],
458
-							$mem[$k]
459
-						);
460
-					} else {
461
-						$GLOBALS[$principale_ou_auxiliaire][$table][$k] = $mem[$k];
462
-					}
463
-				}
464
-			}
465
-		}
466
-
467
-		// recuperer les interfaces (table_titre, table_date)
468
-		// on ne le fait que dans un second temps pour que table_objet soit fonctionnel
469
-		// dans le pipeline de declarer_tables_interfaces
470
-		include_spip('public/interfaces');
471
-		foreach (array_keys($infos_tables) as $t) {
472
-			$infos_tables[$t] = renseigner_table_objet_interfaces($t, $infos_tables[$t]);
473
-		}
474
-
475
-		$deja_la = false;
476
-		// signature
477
-		$md5 = md5(serialize($infos_tables));
478
-	}
479
-	if ($table_sql === '::md5') {
480
-		return $md5;
481
-	}
482
-	if ($table_sql and !isset($infos_tables[$table_sql])) {
483
-		#$desc = renseigner_table_objet_sql($table_sql,$desc);
484
-		$desc = renseigner_table_objet_interfaces($table_sql, $desc);
485
-
486
-		return $desc;
487
-	}
488
-	if ($table_sql) {
489
-		return $infos_tables[$table_sql] ?? [];
490
-	}
491
-
492
-	return $infos_tables;
58
+    static $deja_la = false;
59
+    static $infos_tables = null;
60
+    static $md5 = null;
61
+    static $plugin_hash = null;
62
+
63
+    // plugins hash connu ? non si _CACHE_PLUGINS_OPT est pas encore chargé.
64
+    $_PLUGINS_HASH = defined('_PLUGINS_HASH') ? _PLUGINS_HASH : '!_CACHE_PLUGINS_OPT';
65
+
66
+    // prealablement recuperer les tables_principales
67
+    if (is_null($infos_tables) or $plugin_hash !== $_PLUGINS_HASH) {
68
+        // pas de reentrance (cas base/serial)
69
+        if ($deja_la) {
70
+            spip_log('Re-entrance anormale sur lister_tables_objets_sql : '
71
+                . var_export(debug_backtrace(), true), _LOG_CRITIQUE);
72
+
73
+            return ($table_sql === '::md5' ? $md5 : []);
74
+        }
75
+        $deja_la = true;
76
+        $plugin_hash = $_PLUGINS_HASH; // avant de lancer les pipelines
77
+
78
+        // recuperer les declarations explicites ancienne mode
79
+        // qui servent a completer declarer_tables_objets_sql
80
+        base_serial($GLOBALS['tables_principales']);
81
+        base_auxiliaires($GLOBALS['tables_auxiliaires']);
82
+        $infos_tables = [
83
+            'spip_articles' => [
84
+                'page' => 'article',
85
+                'texte_retour' => 'icone_retour_article',
86
+                'texte_modifier' => 'icone_modifier_article',
87
+                'texte_creer' => 'icone_ecrire_article',
88
+                'texte_objets' => 'public:articles',
89
+                'texte_objet' => 'public:article',
90
+                'texte_signale_edition' => 'texte_travail_article',
91
+                'info_aucun_objet' => 'info_aucun_article',
92
+                'info_1_objet' => 'info_1_article',
93
+                'info_nb_objets' => 'info_nb_articles',
94
+                'texte_logo_objet' => 'logo_article',
95
+                'texte_langue_objet' => 'titre_langue_article',
96
+                'texte_definir_comme_traduction_objet' => 'trad_lier',
97
+                'titre' => 'titre, lang',
98
+                'date' => 'date',
99
+                'principale' => 'oui',
100
+                'introduction_longueur' => '500',
101
+                'champs_editables' => [
102
+                    'surtitre',
103
+                    'titre',
104
+                    'soustitre',
105
+                    'descriptif',
106
+                    'nom_site',
107
+                    'url_site',
108
+                    'chapo',
109
+                    'texte',
110
+                    'ps',
111
+                    'virtuel'
112
+                ],
113
+                'champs_versionnes' => [
114
+                    'id_rubrique',
115
+                    'surtitre',
116
+                    'titre',
117
+                    'soustitre',
118
+                    'jointure_auteurs',
119
+                    'descriptif',
120
+                    'nom_site',
121
+                    'url_site',
122
+                    'chapo',
123
+                    'texte',
124
+                    'ps'
125
+                ],
126
+                'field' => [
127
+                    'id_article' => 'bigint(21) NOT NULL',
128
+                    'surtitre' => "text DEFAULT '' NOT NULL",
129
+                    'titre' => "text DEFAULT '' NOT NULL",
130
+                    'soustitre' => "text DEFAULT '' NOT NULL",
131
+                    'id_rubrique' => "bigint(21) DEFAULT '0' NOT NULL",
132
+                    'descriptif' => "text DEFAULT '' NOT NULL",
133
+                    'chapo' => "mediumtext DEFAULT '' NOT NULL",
134
+                    'texte' => "longtext DEFAULT '' NOT NULL",
135
+                    'ps' => "mediumtext DEFAULT '' NOT NULL",
136
+                    'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
137
+                    'statut' => "varchar(10) DEFAULT '0' NOT NULL",
138
+                    'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
139
+                    'maj' => 'TIMESTAMP',
140
+                    'export' => "VARCHAR(10) DEFAULT 'oui'",
141
+                    'date_redac' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
142
+                    'visites' => "integer DEFAULT '0' NOT NULL",
143
+                    'referers' => "integer DEFAULT '0' NOT NULL",
144
+                    'popularite' => "DOUBLE DEFAULT '0' NOT NULL",
145
+                    'accepter_forum' => "CHAR(3) DEFAULT '' NOT NULL",
146
+                    'date_modif' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
147
+                    'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
148
+                    'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
149
+                    'id_trad' => "bigint(21) DEFAULT '0' NOT NULL",
150
+                    'nom_site' => "tinytext DEFAULT '' NOT NULL",
151
+                    'url_site' => "text DEFAULT '' NOT NULL",
152
+                    'virtuel' => "text DEFAULT '' NOT NULL",
153
+                ],
154
+                'key' => [
155
+                    'PRIMARY KEY' => 'id_article',
156
+                    'KEY id_rubrique' => 'id_rubrique',
157
+                    'KEY id_secteur' => 'id_secteur',
158
+                    'KEY id_trad' => 'id_trad',
159
+                    'KEY lang' => 'lang',
160
+                    'KEY statut' => 'statut, date',
161
+                ],
162
+                'join' => [
163
+                    'id_article' => 'id_article',
164
+                    'id_rubrique' => 'id_rubrique'
165
+                ],
166
+                'parent' => [
167
+                    ['type' => 'rubrique', 'champ' => 'id_rubrique']
168
+                ],
169
+                'rechercher_champs' => [
170
+                    'surtitre' => 5,
171
+                    'titre' => 8,
172
+                    'soustitre' => 5,
173
+                    'chapo' => 3,
174
+                    'texte' => 1,
175
+                    'ps' => 1,
176
+                    'nom_site' => 1,
177
+                    'url_site' => 1,
178
+                    'descriptif' => 4
179
+                ],
180
+                'rechercher_jointures' => [
181
+                    'auteur' => ['nom' => 10],
182
+                ],
183
+                'statut' => [
184
+                    [
185
+                        'champ' => 'statut',
186
+                        'publie' => 'publie',
187
+                        'previsu' => 'publie,prop,prepa/auteur',
188
+                        'post_date' => 'date',
189
+                        'exception' => ['statut', 'tout']
190
+                    ]
191
+                ],
192
+                'statut_titres' => [
193
+                    'prepa' => 'info_article_redaction',
194
+                    'prop' => 'info_article_propose',
195
+                    'publie' => 'info_article_publie',
196
+                    'refuse' => 'info_article_refuse',
197
+                    'poubelle' => 'info_article_supprime'
198
+                ],
199
+                'statut_textes_instituer' => [
200
+                    'prepa' => 'texte_statut_en_cours_redaction',
201
+                    'prop' => 'texte_statut_propose_evaluation',
202
+                    'publie' => 'texte_statut_publie',
203
+                    'refuse' => 'texte_statut_refuse',
204
+                    'poubelle' => 'texte_statut_poubelle',
205
+                ],
206
+                'texte_changer_statut' => 'texte_article_statut',
207
+                'aide_changer_statut' => 'artstatut',
208
+                'tables_jointures' => [
209
+                    'profondeur' => 'rubriques',
210
+                    #'id_auteur' => 'auteurs_liens' // declaration generique plus bas
211
+                ],
212
+            ],
213
+            'spip_auteurs' => [
214
+                'page' => 'auteur',
215
+                'texte_retour' => 'icone_retour',
216
+                'texte_ajouter' => 'titre_ajouter_un_auteur',
217
+                'texte_modifier' => 'admin_modifier_auteur',
218
+                'texte_objets' => 'icone_auteurs',
219
+                'texte_objet' => 'public:auteur',
220
+                'info_aucun_objet' => 'info_aucun_auteur',
221
+                'info_1_objet' => 'info_1_auteur',
222
+                'info_nb_objets' => 'info_nb_auteurs',
223
+                'texte_logo_objet' => 'logo_auteur',
224
+                'texte_creer_associer' => 'creer_et_associer_un_auteur',
225
+                'titre' => "nom AS titre, '' AS lang",
226
+                'date' => 'date',
227
+                'principale' => 'oui',
228
+                'champs_editables' => ['nom', 'email', 'lang', 'bio', 'nom_site', 'url_site', 'imessage', 'pgp'],
229
+                'champs_versionnes' => ['nom', 'bio', 'lang', 'email', 'nom_site', 'url_site', 'login'],
230
+                'field' => [
231
+                    'id_auteur' => 'bigint(21) NOT NULL',
232
+                    'nom' => "text DEFAULT '' NOT NULL",
233
+                    'bio' => "text DEFAULT '' NOT NULL",
234
+                    'email' => "tinytext DEFAULT '' NOT NULL",
235
+                    'nom_site' => "tinytext DEFAULT '' NOT NULL",
236
+                    'url_site' => "text DEFAULT '' NOT NULL",
237
+                    'login' => 'VARCHAR(255) BINARY',
238
+                    'pass' => "tinytext DEFAULT '' NOT NULL",
239
+                    'low_sec' => "tinytext DEFAULT '' NOT NULL",
240
+                    'statut' => "varchar(255)  DEFAULT '0' NOT NULL",
241
+                    'webmestre' => "varchar(3)  DEFAULT 'non' NOT NULL",
242
+                    'maj' => 'TIMESTAMP',
243
+                    'pgp' => "TEXT DEFAULT '' NOT NULL",
244
+                    'htpass' => "tinytext DEFAULT '' NOT NULL",
245
+                    'en_ligne' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
246
+                    'alea_actuel' => 'tinytext',
247
+                    'alea_futur' => 'tinytext',
248
+                    'prefs' => 'text',
249
+                    'cookie_oubli' => 'tinytext',
250
+                    'source' => "VARCHAR(10) DEFAULT 'spip' NOT NULL",
251
+                    'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
252
+                    'imessage' => "VARCHAR(3) DEFAULT '' NOT NULL",
253
+                    'backup_cles' => "mediumtext DEFAULT '' NOT NULL",
254
+                ],
255
+                'key' => [
256
+                    'PRIMARY KEY' => 'id_auteur',
257
+                    'KEY login' => 'login',
258
+                    'KEY statut' => 'statut',
259
+                    'KEY en_ligne' => 'en_ligne',
260
+                ],
261
+                'join' => [
262
+                    'id_auteur' => 'id_auteur',
263
+                    'login' => 'login'
264
+                ],
265
+                'rechercher_champs' => [
266
+                    'nom' => 5,
267
+                    'bio' => 1,
268
+                    'email' => 1,
269
+                    'nom_site' => 1,
270
+                    'url_site' => 1,
271
+                    'login' => 1
272
+                ],
273
+                // 2 conditions pour les auteurs : statut!=poubelle,
274
+                // et avoir des articles publies
275
+                'statut' => [
276
+                    [
277
+                        'champ' => 'statut',
278
+                        'publie' => '!5poubelle',
279
+                        'previsu' => '!5poubelle',
280
+                        'exception' => 'statut'
281
+                    ],
282
+                    [
283
+                        'champ' => [
284
+                            ['spip_auteurs_liens', 'id_auteur'],
285
+                            [
286
+                                'spip_articles',
287
+                                ['id_objet', 'id_article', 'objet', 'article']
288
+                            ],
289
+                            'statut'
290
+                        ],
291
+                        'publie' => 'publie',
292
+                        'previsu' => '!',
293
+                        'post_date' => 'date',
294
+                        'exception' => ['statut', 'lien', 'tout']
295
+                    ],
296
+                ],
297
+                'statut_images' => [
298
+                    'auteur-6forum-16.png',
299
+                    '0minirezo' => 'auteur-0minirezo-16.png',
300
+                    '1comite' => 'auteur-1comite-16.png',
301
+                    '6forum' => 'auteur-6forum-16.png',
302
+                    '5poubelle' => 'auteur-5poubelle-16.png',
303
+                    'nouveau' => ''
304
+                ],
305
+                'statut_titres' => [
306
+                    'titre_image_visiteur',
307
+                    '0minirezo' => 'titre_image_administrateur',
308
+                    '1comite' => 'titre_image_redacteur_02',
309
+                    '6forum' => 'titre_image_visiteur',
310
+                    '5poubelle' => 'titre_image_auteur_supprime',
311
+                ],
312
+                'tables_jointures' => [#'auteurs_liens' // declaration generique plus bas
313
+                ],
314
+            ],
315
+            'spip_rubriques' => [
316
+                'page' => 'rubrique',
317
+                'url_voir' => 'rubrique',
318
+                'url_edit' => 'rubrique_edit',
319
+                'texte_retour' => 'icone_retour',
320
+                'texte_objets' => 'public:rubriques',
321
+                'texte_objet' => 'public:rubrique',
322
+                'texte_modifier' => 'icone_modifier_rubrique',
323
+                'texte_creer' => 'icone_creer_rubrique',
324
+                'texte_ajouter' => 'titre_ajouter_une_rubrique',
325
+                'texte_creer_associer' => 'creer_et_associer_une_rubrique',
326
+                'info_aucun_objet' => 'info_aucun_rubrique',
327
+                'info_1_objet' => 'info_1_rubrique',
328
+                'info_nb_objets' => 'info_nb_rubriques',
329
+                'texte_logo_objet' => 'logo_rubrique',
330
+                'texte_langue_objet' => 'titre_langue_rubrique',
331
+                'texte_definir_comme_traduction_objet' => 'texte_definir_comme_traduction_rubrique',
332
+                'titre' => 'titre, lang',
333
+                'date' => 'date',
334
+                'principale' => 'oui',
335
+                'introduction_longueur' => '600',
336
+                'champs_editables' => ['titre', 'texte', 'descriptif', 'extra'],
337
+                'champs_versionnes' => ['titre', 'descriptif', 'texte'],
338
+                'field' => [
339
+                    'id_rubrique' => 'bigint(21) NOT NULL',
340
+                    'id_parent' => "bigint(21) DEFAULT '0' NOT NULL",
341
+                    'titre' => "text DEFAULT '' NOT NULL",
342
+                    'descriptif' => "text DEFAULT '' NOT NULL",
343
+                    'texte' => "longtext DEFAULT '' NOT NULL",
344
+                    'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL",
345
+                    'maj' => 'TIMESTAMP',
346
+                    'statut' => "varchar(10) DEFAULT '0' NOT NULL",
347
+                    'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
348
+                    'lang' => "VARCHAR(10) DEFAULT '' NOT NULL",
349
+                    'langue_choisie' => "VARCHAR(3) DEFAULT 'non'",
350
+                    'statut_tmp' => "varchar(10) DEFAULT '0' NOT NULL",
351
+                    'date_tmp' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
352
+                    'profondeur' => "smallint(5) DEFAULT '0' NOT NULL"
353
+                ],
354
+                'key' => [
355
+                    'PRIMARY KEY' => 'id_rubrique',
356
+                    'KEY lang' => 'lang',
357
+                    'KEY id_parent' => 'id_parent',
358
+                ],
359
+                'parent' => [
360
+                    ['type' => 'rubrique', 'champ' => 'id_parent']
361
+                ],
362
+                'rechercher_champs' => [
363
+                    'titre' => 8,
364
+                    'descriptif' => 5,
365
+                    'texte' => 1
366
+                ],
367
+                'statut' => [
368
+                    [
369
+                        'champ' => 'statut',
370
+                        'publie' => 'publie',
371
+                        'previsu' => '!',
372
+                        'exception' => ['statut', 'tout']
373
+                    ],
374
+                ],
375
+                'tables_jointures' => [#'id_auteur' => 'auteurs_liens' // declaration generique plus bas
376
+                ],
377
+            ],
378
+            // toutes les tables ont le droit a une jointure sur les auteurs
379
+            ['tables_jointures' => ['id_auteur' => 'auteurs_liens']]
380
+        ];
381
+
382
+        // avant d'appeller les pipeline qui peuvent generer une reentrance a l'install
383
+        // initialiser la signature
384
+        $md5 = md5(serialize($infos_tables));
385
+
386
+        $GLOBALS['tables_principales'] = pipeline('declarer_tables_principales', $GLOBALS['tables_principales']);
387
+        $GLOBALS['tables_auxiliaires'] = pipeline('declarer_tables_auxiliaires', $GLOBALS['tables_auxiliaires']);
388
+        $infos_tables = pipeline('declarer_tables_objets_sql', $infos_tables);
389
+
390
+        // completer les informations manquantes ou implicites
391
+        $all = [];
392
+        foreach (array_keys($infos_tables) as $t) {
393
+            // les cles numeriques servent a declarer
394
+            // les proprietes applicables a tous les objets
395
+            // on les mets de cote
396
+            if (is_numeric($t)) {
397
+                $all = array_merge_recursive($all, $infos_tables[$t]);
398
+                unset($infos_tables[$t]);
399
+            } else {
400
+                $infos_tables[$t] = renseigner_table_objet_sql($t, $infos_tables[$t]);
401
+            }
402
+        }
403
+
404
+        // repercuter les proprietes generales communes a tous les objets
405
+        foreach (array_keys($infos_tables) as $t) {
406
+            foreach ($all as $i => $v) {
407
+                if (in_array($i, ['tables_jointures', 'champs_versionnes'])) {
408
+                    $add = $all[$i];
409
+                    // eviter les doublons de declaration de table jointure (ex des mots sur auteurs)
410
+                    // pour les declarations generiques avec cles numeriques
411
+                    if ($i == 'tables_jointures' and isset($infos_tables[$t][$i]) and is_countable($infos_tables[$t][$i]) ? count($infos_tables[$t][$i]) : 0) {
412
+                        $doublons = array_intersect($infos_tables[$t][$i], $add);
413
+                        foreach ($doublons as $d) {
414
+                            if (
415
+                                is_numeric(array_search($d, $infos_tables[$t][$i]))
416
+                                and is_numeric($k = array_search($d, $add))
417
+                            ) {
418
+                                unset($add[$k]);
419
+                            }
420
+                        }
421
+                    }
422
+                    $infos_tables[$t][$i] = array_merge($infos_tables[$t][$i] ?? [], $add);
423
+                } else {
424
+                    $infos_tables[$t][$i] = array_merge_recursive(
425
+                        $infos_tables[$t][$i] ?? [],
426
+                        $all[$i]
427
+                    );
428
+                }
429
+            }
430
+        }
431
+
432
+        // completer les tables principales et auxiliaires
433
+        // avec celles declarees uniquement dans declarer_table_objets_sql
434
+        // pour assurer la compat en transition
435
+        foreach ($infos_tables as $table => $infos) {
436
+            $principale_ou_auxiliaire = ($infos['principale'] ? 'tables_principales' : 'tables_auxiliaires');
437
+            // memoriser des champs eventuels declares par des plugins dans le pipeline tables_xxx
438
+            // qui a ete appelle avant
439
+            $mem = ($GLOBALS[$principale_ou_auxiliaire][$table] ?? []);
440
+            // l'ajouter au tableau
441
+            $GLOBALS[$principale_ou_auxiliaire][$table] = [];
442
+            if (isset($infos['field']) and isset($infos['key'])) {
443
+                foreach (['field', 'key', 'join'] as $k) {
444
+                    if (isset($infos_tables[$table][$k])) {
445
+                        $GLOBALS[$principale_ou_auxiliaire][$table][$k] = &$infos_tables[$table][$k];
446
+                    }
447
+                }
448
+            } else {
449
+                // ici on ne renvoie que les declarations, donc RIEN
450
+                // pour avoir la vrai description en base, il faut passer par trouver_table
451
+                $GLOBALS[$principale_ou_auxiliaire][$table] = [];
452
+            }
453
+            if (is_countable($mem) ? count($mem) : 0) {
454
+                foreach (array_keys($mem) as $k) {
455
+                    if (isset($GLOBALS[$principale_ou_auxiliaire][$table][$k])) {
456
+                        $GLOBALS[$principale_ou_auxiliaire][$table][$k] = array_merge(
457
+                            $GLOBALS[$principale_ou_auxiliaire][$table][$k],
458
+                            $mem[$k]
459
+                        );
460
+                    } else {
461
+                        $GLOBALS[$principale_ou_auxiliaire][$table][$k] = $mem[$k];
462
+                    }
463
+                }
464
+            }
465
+        }
466
+
467
+        // recuperer les interfaces (table_titre, table_date)
468
+        // on ne le fait que dans un second temps pour que table_objet soit fonctionnel
469
+        // dans le pipeline de declarer_tables_interfaces
470
+        include_spip('public/interfaces');
471
+        foreach (array_keys($infos_tables) as $t) {
472
+            $infos_tables[$t] = renseigner_table_objet_interfaces($t, $infos_tables[$t]);
473
+        }
474
+
475
+        $deja_la = false;
476
+        // signature
477
+        $md5 = md5(serialize($infos_tables));
478
+    }
479
+    if ($table_sql === '::md5') {
480
+        return $md5;
481
+    }
482
+    if ($table_sql and !isset($infos_tables[$table_sql])) {
483
+        #$desc = renseigner_table_objet_sql($table_sql,$desc);
484
+        $desc = renseigner_table_objet_interfaces($table_sql, $desc);
485
+
486
+        return $desc;
487
+    }
488
+    if ($table_sql) {
489
+        return $infos_tables[$table_sql] ?? [];
490
+    }
491
+
492
+    return $infos_tables;
493 493
 }
494 494
 
495 495
 
@@ -504,27 +504,27 @@  discard block
 block discarded – undo
504 504
  **/
505 505
 function base_serial(&$tables_principales) {
506 506
 
507
-	$spip_jobs = [
508
-		'id_job' => 'bigint(21) NOT NULL',
509
-		'descriptif' => "text DEFAULT '' NOT NULL",
510
-		'fonction' => 'varchar(255) NOT NULL', //nom de la fonction
511
-		'args' => "longblob DEFAULT '' NOT NULL", // arguments
512
-		'md5args' => "char(32) NOT NULL default ''", // signature des arguments
513
-		'inclure' => 'varchar(255) NOT NULL', // fichier a inclure ou path/ pour charger_fonction
514
-		'priorite' => 'smallint(6) NOT NULL default 0',
515
-		'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot
516
-		'status' => 'tinyint NOT NULL default 1',
517
-	];
518
-
519
-	$spip_jobs_key = [
520
-		'PRIMARY KEY' => 'id_job',
521
-		'KEY date' => 'date',
522
-		'KEY status' => 'status',
523
-	];
524
-
525
-	/// Attention: mes_fonctions peut avoir deja defini cette variable
526
-	/// il faut donc rajouter, mais pas reinitialiser
527
-	$tables_principales['spip_jobs'] = ['field' => &$spip_jobs, 'key' => &$spip_jobs_key];
507
+    $spip_jobs = [
508
+        'id_job' => 'bigint(21) NOT NULL',
509
+        'descriptif' => "text DEFAULT '' NOT NULL",
510
+        'fonction' => 'varchar(255) NOT NULL', //nom de la fonction
511
+        'args' => "longblob DEFAULT '' NOT NULL", // arguments
512
+        'md5args' => "char(32) NOT NULL default ''", // signature des arguments
513
+        'inclure' => 'varchar(255) NOT NULL', // fichier a inclure ou path/ pour charger_fonction
514
+        'priorite' => 'smallint(6) NOT NULL default 0',
515
+        'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot
516
+        'status' => 'tinyint NOT NULL default 1',
517
+    ];
518
+
519
+    $spip_jobs_key = [
520
+        'PRIMARY KEY' => 'id_job',
521
+        'KEY date' => 'date',
522
+        'KEY status' => 'status',
523
+    ];
524
+
525
+    /// Attention: mes_fonctions peut avoir deja defini cette variable
526
+    /// il faut donc rajouter, mais pas reinitialiser
527
+    $tables_principales['spip_jobs'] = ['field' => &$spip_jobs, 'key' => &$spip_jobs_key];
528 528
 }
529 529
 
530 530
 
@@ -536,71 +536,71 @@  discard block
 block discarded – undo
536 536
  * @return void
537 537
  **/
538 538
 function base_auxiliaires(&$tables_auxiliaires) {
539
-	$spip_resultats = [
540
-		'recherche' => "char(16) DEFAULT '' NOT NULL",
541
-		'id' => 'INT UNSIGNED NOT NULL',
542
-		'points' => "INT UNSIGNED DEFAULT '0' NOT NULL",
543
-		'table_objet' => "varchar(30) DEFAULT '' NOT NULL",
544
-		'serveur' => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal)
545
-		'maj' => 'TIMESTAMP'
546
-	];
547
-
548
-	$spip_resultats_key = [// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ...
549
-	];
550
-
551
-	$spip_auteurs_liens = [
552
-		'id_auteur' => "bigint(21) DEFAULT '0' NOT NULL",
553
-		'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
554
-		'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
555
-		'vu' => "VARCHAR(6) DEFAULT 'non' NOT NULL"
556
-	];
557
-
558
-	$spip_auteurs_liens_key = [
559
-		'PRIMARY KEY' => 'id_auteur,id_objet,objet',
560
-		'KEY id_auteur' => 'id_auteur',
561
-		'KEY id_objet' => 'id_objet',
562
-		'KEY objet' => 'objet',
563
-	];
564
-
565
-	$spip_meta = [
566
-		'nom' => 'VARCHAR (255) NOT NULL',
567
-		'valeur' => "text DEFAULT ''",
568
-		'impt' => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL",
569
-		'maj' => 'TIMESTAMP'
570
-	];
571
-
572
-	$spip_meta_key = [
573
-		'PRIMARY KEY' => 'nom'
574
-	];
575
-
576
-	$spip_jobs_liens = [
577
-		'id_job' => "bigint(21) DEFAULT '0' NOT NULL",
578
-		'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
579
-		'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
580
-	];
581
-
582
-	$spip_jobs_liens_key = [
583
-		'PRIMARY KEY' => 'id_job,id_objet,objet',
584
-		'KEY id_job' => 'id_job'
585
-	];
586
-
587
-	$tables_auxiliaires['spip_auteurs_liens'] = [
588
-		'field' => &$spip_auteurs_liens,
589
-		'key' => &$spip_auteurs_liens_key
590
-	];
591
-
592
-	$tables_auxiliaires['spip_meta'] = [
593
-		'field' => &$spip_meta,
594
-		'key' => &$spip_meta_key
595
-	];
596
-	$tables_auxiliaires['spip_resultats'] = [
597
-		'field' => &$spip_resultats,
598
-		'key' => &$spip_resultats_key
599
-	];
600
-	$tables_auxiliaires['spip_jobs_liens'] = [
601
-		'field' => &$spip_jobs_liens,
602
-		'key' => &$spip_jobs_liens_key
603
-	];
539
+    $spip_resultats = [
540
+        'recherche' => "char(16) DEFAULT '' NOT NULL",
541
+        'id' => 'INT UNSIGNED NOT NULL',
542
+        'points' => "INT UNSIGNED DEFAULT '0' NOT NULL",
543
+        'table_objet' => "varchar(30) DEFAULT '' NOT NULL",
544
+        'serveur' => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal)
545
+        'maj' => 'TIMESTAMP'
546
+    ];
547
+
548
+    $spip_resultats_key = [// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ...
549
+    ];
550
+
551
+    $spip_auteurs_liens = [
552
+        'id_auteur' => "bigint(21) DEFAULT '0' NOT NULL",
553
+        'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
554
+        'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
555
+        'vu' => "VARCHAR(6) DEFAULT 'non' NOT NULL"
556
+    ];
557
+
558
+    $spip_auteurs_liens_key = [
559
+        'PRIMARY KEY' => 'id_auteur,id_objet,objet',
560
+        'KEY id_auteur' => 'id_auteur',
561
+        'KEY id_objet' => 'id_objet',
562
+        'KEY objet' => 'objet',
563
+    ];
564
+
565
+    $spip_meta = [
566
+        'nom' => 'VARCHAR (255) NOT NULL',
567
+        'valeur' => "text DEFAULT ''",
568
+        'impt' => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL",
569
+        'maj' => 'TIMESTAMP'
570
+    ];
571
+
572
+    $spip_meta_key = [
573
+        'PRIMARY KEY' => 'nom'
574
+    ];
575
+
576
+    $spip_jobs_liens = [
577
+        'id_job' => "bigint(21) DEFAULT '0' NOT NULL",
578
+        'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
579
+        'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
580
+    ];
581
+
582
+    $spip_jobs_liens_key = [
583
+        'PRIMARY KEY' => 'id_job,id_objet,objet',
584
+        'KEY id_job' => 'id_job'
585
+    ];
586
+
587
+    $tables_auxiliaires['spip_auteurs_liens'] = [
588
+        'field' => &$spip_auteurs_liens,
589
+        'key' => &$spip_auteurs_liens_key
590
+    ];
591
+
592
+    $tables_auxiliaires['spip_meta'] = [
593
+        'field' => &$spip_meta,
594
+        'key' => &$spip_meta_key
595
+    ];
596
+    $tables_auxiliaires['spip_resultats'] = [
597
+        'field' => &$spip_resultats,
598
+        'key' => &$spip_resultats_key
599
+    ];
600
+    $tables_auxiliaires['spip_jobs_liens'] = [
601
+        'field' => &$spip_jobs_liens,
602
+        'key' => &$spip_jobs_liens_key
603
+    ];
604 604
 }
605 605
 
606 606
 
@@ -657,129 +657,129 @@  discard block
 block discarded – undo
657 657
  * @return array
658 658
  */
659 659
 function renseigner_table_objet_sql($table_sql, &$infos) {
660
-	if (!isset($infos['type'])) {
661
-		// si on arrive de base/trouver_table, on a la cle primaire :
662
-		// s'en servir pour extrapoler le type
663
-		if (isset($infos['key']['PRIMARY KEY'])) {
664
-			$primary = $infos['key']['PRIMARY KEY'];
665
-			$primary = explode(',', $primary);
666
-			$primary = reset($primary);
667
-			$infos['type'] = preg_replace(',^spip_|^id_|s$,', '', $primary);
668
-		} else {
669
-			$infos['type'] = preg_replace(',^spip_|s$,', '', $table_sql);
670
-		}
671
-	}
672
-	if (!isset($infos['type_surnoms'])) {
673
-		$infos['type_surnoms'] = [];
674
-	}
675
-
676
-	if (!isset($infos['table_objet'])) {
677
-		$infos['table_objet'] = preg_replace(',^spip_,', '', $table_sql);
678
-	}
679
-	if (!isset($infos['table_objet_surnoms'])) {
680
-		$infos['table_objet_surnoms'] = [];
681
-	}
682
-
683
-	if (!isset($infos['principale'])) {
684
-		$infos['principale'] = (isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false);
685
-	}
686
-
687
-	// normaliser pour pouvoir tester en php $infos['principale']?
688
-	// et dans une boucle {principale=oui}
689
-	$infos['principale'] = (($infos['principale'] and $infos['principale'] != 'non') ? 'oui' : false);
690
-
691
-	// declarer et normaliser pour pouvoir tester en php $infos['editable']?
692
-	// et dans une boucle {editable=oui}
693
-	if (!isset($infos['editable'])) {
694
-		$infos['editable'] = 'oui';
695
-	}
696
-
697
-	$infos['editable'] = (($infos['editable'] and $infos['editable'] != 'non') ? 'oui' : false);
698
-
699
-	// les urls publiques sont par defaut page=type pour les tables principales, et rien pour les autres
700
-	// seules les exceptions sont donc a declarer
701
-	if (!isset($infos['page'])) {
702
-		$infos['page'] = ($infos['principale'] ? $infos['type'] : '');
703
-	}
704
-
705
-	if (!isset($infos['url_voir'])) {
706
-		$infos['url_voir'] = $infos['type'];
707
-	}
708
-	if (!isset($infos['url_edit'])) {
709
-		$infos['url_edit'] = $infos['url_voir'] . ($infos['editable'] ? '_edit' : '');
710
-	}
711
-	if (!isset($infos['icone_objet'])) {
712
-		$infos['icone_objet'] = $infos['type'];
713
-	}
714
-
715
-	// chaines de langue
716
-	// par defaut : objet:icone_xxx_objet
717
-	if (!isset($infos['texte_retour'])) {
718
-		$infos['texte_retour'] = 'icone_retour';
719
-	}
720
-	if (!isset($infos['texte_modifier'])) {
721
-		$infos['texte_modifier'] = $infos['type'] . ':' . 'icone_modifier_' . $infos['type'];
722
-	}
723
-	if (!isset($infos['texte_creer'])) {
724
-		$infos['texte_creer'] = $infos['type'] . ':' . 'icone_creer_' . $infos['type'];
725
-	}
726
-	if (!isset($infos['texte_creer_associer'])) {
727
-		$infos['texte_creer_associer'] = $infos['type'] . ':' . 'texte_creer_associer_' . $infos['type'];
728
-	}
729
-	if (!isset($infos['texte_ajouter'])) {
730
-		// Ajouter un X
731
-		$infos['texte_ajouter'] = $infos['type'] . ':' . 'texte_ajouter_' . $infos['type'];
732
-	}
733
-	if (!isset($infos['texte_objets'])) {
734
-		$infos['texte_objets'] = $infos['type'] . ':' . 'titre_' . $infos['table_objet'];
735
-	}
736
-	if (!isset($infos['texte_objet'])) {
737
-		$infos['texte_objet'] = $infos['type'] . ':' . 'titre_' . $infos['type'];
738
-	}
739
-	if (!isset($infos['texte_logo_objet'])) {
740
-		// objet:titre_logo_objet "Logo de ce X"
741
-		$infos['texte_logo_objet'] = $infos['type'] . ':' . 'titre_logo_' . $infos['type'];
742
-	}
743
-	if (!isset($infos['texte_langue_objet'])) {
744
-		// objet:texte_langue_objet "Langue de ce X"
745
-		$infos['texte_langue_objet'] = $infos['type'] . ':' . 'titre_langue_' . $infos['type'];
746
-	}
747
-	if (!isset($infos['texte_definir_comme_traduction_objet'])) {
748
-		// "Ce X est une traduction du X numéro :"
749
-		$infos['texte_definir_comme_traduction_objet'] = $infos['type'] . ':' . 'texte_definir_comme_traduction_' . $infos['type'];
750
-	}
751
-
752
-	// objet:info_aucun_objet
753
-	if (!isset($infos['info_aucun_objet'])) {
754
-		$infos['info_aucun_objet'] = $infos['type'] . ':' . 'info_aucun_' . $infos['type'];
755
-	}
756
-	// objet:info_1_objet
757
-	if (!isset($infos['info_1_objet'])) {
758
-		$infos['info_1_objet'] = $infos['type'] . ':' . 'info_1_' . $infos['type'];
759
-	}
760
-	// objet:info_nb_objets
761
-	if (!isset($infos['info_nb_objets'])) {
762
-		$infos['info_nb_objets'] = $infos['type'] . ':' . 'info_nb_' . $infos['table_objet'];
763
-	}
764
-
765
-	if (!isset($infos['champs_editables'])) {
766
-		$infos['champs_editables'] = [];
767
-	}
768
-	if (!isset($infos['champs_versionnes'])) {
769
-		$infos['champs_versionnes'] = [];
770
-	}
771
-	if (!isset($infos['rechercher_champs'])) {
772
-		$infos['rechercher_champs'] = [];
773
-	}
774
-	if (!isset($infos['rechercher_jointures'])) {
775
-		$infos['rechercher_jointures'] = [];
776
-	}
777
-
778
-	if (!isset($infos['modeles'])) {
779
-		$infos['modeles'] = [$infos['type']];
780
-	}
781
-
782
-	return $infos;
660
+    if (!isset($infos['type'])) {
661
+        // si on arrive de base/trouver_table, on a la cle primaire :
662
+        // s'en servir pour extrapoler le type
663
+        if (isset($infos['key']['PRIMARY KEY'])) {
664
+            $primary = $infos['key']['PRIMARY KEY'];
665
+            $primary = explode(',', $primary);
666
+            $primary = reset($primary);
667
+            $infos['type'] = preg_replace(',^spip_|^id_|s$,', '', $primary);
668
+        } else {
669
+            $infos['type'] = preg_replace(',^spip_|s$,', '', $table_sql);
670
+        }
671
+    }
672
+    if (!isset($infos['type_surnoms'])) {
673
+        $infos['type_surnoms'] = [];
674
+    }
675
+
676
+    if (!isset($infos['table_objet'])) {
677
+        $infos['table_objet'] = preg_replace(',^spip_,', '', $table_sql);
678
+    }
679
+    if (!isset($infos['table_objet_surnoms'])) {
680
+        $infos['table_objet_surnoms'] = [];
681
+    }
682
+
683
+    if (!isset($infos['principale'])) {
684
+        $infos['principale'] = (isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false);
685
+    }
686
+
687
+    // normaliser pour pouvoir tester en php $infos['principale']?
688
+    // et dans une boucle {principale=oui}
689
+    $infos['principale'] = (($infos['principale'] and $infos['principale'] != 'non') ? 'oui' : false);
690
+
691
+    // declarer et normaliser pour pouvoir tester en php $infos['editable']?
692
+    // et dans une boucle {editable=oui}
693
+    if (!isset($infos['editable'])) {
694
+        $infos['editable'] = 'oui';
695
+    }
696
+
697
+    $infos['editable'] = (($infos['editable'] and $infos['editable'] != 'non') ? 'oui' : false);
698
+
699
+    // les urls publiques sont par defaut page=type pour les tables principales, et rien pour les autres
700
+    // seules les exceptions sont donc a declarer
701
+    if (!isset($infos['page'])) {
702
+        $infos['page'] = ($infos['principale'] ? $infos['type'] : '');
703
+    }
704
+
705
+    if (!isset($infos['url_voir'])) {
706
+        $infos['url_voir'] = $infos['type'];
707
+    }
708
+    if (!isset($infos['url_edit'])) {
709
+        $infos['url_edit'] = $infos['url_voir'] . ($infos['editable'] ? '_edit' : '');
710
+    }
711
+    if (!isset($infos['icone_objet'])) {
712
+        $infos['icone_objet'] = $infos['type'];
713
+    }
714
+
715
+    // chaines de langue
716
+    // par defaut : objet:icone_xxx_objet
717
+    if (!isset($infos['texte_retour'])) {
718
+        $infos['texte_retour'] = 'icone_retour';
719
+    }
720
+    if (!isset($infos['texte_modifier'])) {
721
+        $infos['texte_modifier'] = $infos['type'] . ':' . 'icone_modifier_' . $infos['type'];
722
+    }
723
+    if (!isset($infos['texte_creer'])) {
724
+        $infos['texte_creer'] = $infos['type'] . ':' . 'icone_creer_' . $infos['type'];
725
+    }
726
+    if (!isset($infos['texte_creer_associer'])) {
727
+        $infos['texte_creer_associer'] = $infos['type'] . ':' . 'texte_creer_associer_' . $infos['type'];
728
+    }
729
+    if (!isset($infos['texte_ajouter'])) {
730
+        // Ajouter un X
731
+        $infos['texte_ajouter'] = $infos['type'] . ':' . 'texte_ajouter_' . $infos['type'];
732
+    }
733
+    if (!isset($infos['texte_objets'])) {
734
+        $infos['texte_objets'] = $infos['type'] . ':' . 'titre_' . $infos['table_objet'];
735
+    }
736
+    if (!isset($infos['texte_objet'])) {
737
+        $infos['texte_objet'] = $infos['type'] . ':' . 'titre_' . $infos['type'];
738
+    }
739
+    if (!isset($infos['texte_logo_objet'])) {
740
+        // objet:titre_logo_objet "Logo de ce X"
741
+        $infos['texte_logo_objet'] = $infos['type'] . ':' . 'titre_logo_' . $infos['type'];
742
+    }
743
+    if (!isset($infos['texte_langue_objet'])) {
744
+        // objet:texte_langue_objet "Langue de ce X"
745
+        $infos['texte_langue_objet'] = $infos['type'] . ':' . 'titre_langue_' . $infos['type'];
746
+    }
747
+    if (!isset($infos['texte_definir_comme_traduction_objet'])) {
748
+        // "Ce X est une traduction du X numéro :"
749
+        $infos['texte_definir_comme_traduction_objet'] = $infos['type'] . ':' . 'texte_definir_comme_traduction_' . $infos['type'];
750
+    }
751
+
752
+    // objet:info_aucun_objet
753
+    if (!isset($infos['info_aucun_objet'])) {
754
+        $infos['info_aucun_objet'] = $infos['type'] . ':' . 'info_aucun_' . $infos['type'];
755
+    }
756
+    // objet:info_1_objet
757
+    if (!isset($infos['info_1_objet'])) {
758
+        $infos['info_1_objet'] = $infos['type'] . ':' . 'info_1_' . $infos['type'];
759
+    }
760
+    // objet:info_nb_objets
761
+    if (!isset($infos['info_nb_objets'])) {
762
+        $infos['info_nb_objets'] = $infos['type'] . ':' . 'info_nb_' . $infos['table_objet'];
763
+    }
764
+
765
+    if (!isset($infos['champs_editables'])) {
766
+        $infos['champs_editables'] = [];
767
+    }
768
+    if (!isset($infos['champs_versionnes'])) {
769
+        $infos['champs_versionnes'] = [];
770
+    }
771
+    if (!isset($infos['rechercher_champs'])) {
772
+        $infos['rechercher_champs'] = [];
773
+    }
774
+    if (!isset($infos['rechercher_jointures'])) {
775
+        $infos['rechercher_jointures'] = [];
776
+    }
777
+
778
+    if (!isset($infos['modeles'])) {
779
+        $infos['modeles'] = [$infos['type']];
780
+    }
781
+
782
+    return $infos;
783 783
 }
784 784
 
785 785
 /**
@@ -796,30 +796,30 @@  discard block
 block discarded – undo
796 796
  * @return array
797 797
  */
798 798
 function renseigner_table_objet_interfaces($table_sql, &$infos) {
799
-	if (!isset($infos['titre'])) {
800
-		if (isset($infos['table_objet']) and isset($GLOBALS['table_titre'][$infos['table_objet']])) {
801
-			$infos['titre'] = $GLOBALS['table_titre'][$infos['table_objet']];
802
-		} else {
803
-			$infos['titre'] = ((isset($infos['field']['titre'])) ? 'titre,' : "'' as titre,");
804
-			$infos['titre'] .= ((isset($infos['field']['lang'])) ? 'lang' : "'' as lang");
805
-		}
806
-	}
807
-	if (!isset($infos['date'])) {
808
-		if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) {
809
-			$infos['date'] = $GLOBALS['table_date'][$infos['table_objet']];
810
-		} else {
811
-			$infos['date'] = ((isset($infos['field']['date'])) ? 'date' : '');
812
-		}
813
-	}
814
-
815
-	$infos['statut'] ??= $GLOBALS['table_statut'][$table_sql] ?? '';
816
-	$infos['tables_jointures'] ??= [];
817
-
818
-	if (isset($GLOBALS['tables_jointures'][$table_sql])) {
819
-		$infos['tables_jointures'] = array_merge($infos['tables_jointures'], $GLOBALS['tables_jointures'][$table_sql]);
820
-	}
821
-
822
-	return $infos;
799
+    if (!isset($infos['titre'])) {
800
+        if (isset($infos['table_objet']) and isset($GLOBALS['table_titre'][$infos['table_objet']])) {
801
+            $infos['titre'] = $GLOBALS['table_titre'][$infos['table_objet']];
802
+        } else {
803
+            $infos['titre'] = ((isset($infos['field']['titre'])) ? 'titre,' : "'' as titre,");
804
+            $infos['titre'] .= ((isset($infos['field']['lang'])) ? 'lang' : "'' as lang");
805
+        }
806
+    }
807
+    if (!isset($infos['date'])) {
808
+        if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) {
809
+            $infos['date'] = $GLOBALS['table_date'][$infos['table_objet']];
810
+        } else {
811
+            $infos['date'] = ((isset($infos['field']['date'])) ? 'date' : '');
812
+        }
813
+    }
814
+
815
+    $infos['statut'] ??= $GLOBALS['table_statut'][$table_sql] ?? '';
816
+    $infos['tables_jointures'] ??= [];
817
+
818
+    if (isset($GLOBALS['tables_jointures'][$table_sql])) {
819
+        $infos['tables_jointures'] = array_merge($infos['tables_jointures'], $GLOBALS['tables_jointures'][$table_sql]);
820
+    }
821
+
822
+    return $infos;
823 823
 }
824 824
 
825 825
 /**
@@ -830,13 +830,13 @@  discard block
 block discarded – undo
830 830
  *     Liste et descriptions des tables principales
831 831
  **/
832 832
 function lister_tables_principales() {
833
-	static $done = false;
834
-	if (!$done or !(is_countable($GLOBALS['tables_principales']) ? count($GLOBALS['tables_principales']) : 0)) {
835
-		lister_tables_objets_sql();
836
-		$done = true;
837
-	}
833
+    static $done = false;
834
+    if (!$done or !(is_countable($GLOBALS['tables_principales']) ? count($GLOBALS['tables_principales']) : 0)) {
835
+        lister_tables_objets_sql();
836
+        $done = true;
837
+    }
838 838
 
839
-	return $GLOBALS['tables_principales'];
839
+    return $GLOBALS['tables_principales'];
840 840
 }
841 841
 
842 842
 /**
@@ -847,13 +847,13 @@  discard block
 block discarded – undo
847 847
  *     Liste et descriptions des tables auxiliaires
848 848
  **/
849 849
 function lister_tables_auxiliaires() {
850
-	static $done = false;
851
-	if (!$done or !(is_countable($GLOBALS['tables_auxiliaires']) ? count($GLOBALS['tables_auxiliaires']) : 0)) {
852
-		lister_tables_objets_sql();
853
-		$done = true;
854
-	}
850
+    static $done = false;
851
+    if (!$done or !(is_countable($GLOBALS['tables_auxiliaires']) ? count($GLOBALS['tables_auxiliaires']) : 0)) {
852
+        lister_tables_objets_sql();
853
+        $done = true;
854
+    }
855 855
 
856
-	return $GLOBALS['tables_auxiliaires'];
856
+    return $GLOBALS['tables_auxiliaires'];
857 857
 }
858 858
 
859 859
 /**
@@ -862,45 +862,45 @@  discard block
 block discarded – undo
862 862
  * @return array
863 863
  */
864 864
 function lister_tables_objets_surnoms() {
865
-	static $surnoms = null;
866
-	static $md5 = null;
867
-	if (
868
-		!$surnoms
869
-		or $md5 != lister_tables_objets_sql('::md5')
870
-	) {
871
-		// passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
872
-		// pour compatibilite, car il faut dorenavent utiliser
873
-		// declarer_table_objets_sql
874
-		$surnoms = pipeline(
875
-			'declarer_tables_objets_surnoms',
876
-			[
877
-				# pour les modeles
878
-				# a enlever ?
879
-				'doc' => 'documents',
880
-				'img' => 'documents',
881
-				'emb' => 'documents',
882
-			]
883
-		);
884
-		$infos_tables = lister_tables_objets_sql();
885
-		foreach ($infos_tables as $t => $infos) {
886
-			// cas de base type=>table
887
-			// et preg_replace(',^spip_|^id_|s$,',table)=>table
888
-			if ($infos['table_objet']) { // securite, si la fonction est appelee trop tot, c'est vide
889
-				// optimisations pour table_objet
890
-				//$surnoms[$infos['type']] = $infos['table_objet'];
891
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['table_objet'];
892
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['table_objet'];
893
-				if (is_array($infos['table_objet_surnoms']) and count($infos['table_objet_surnoms'])) {
894
-					foreach ($infos['table_objet_surnoms'] as $surnom) {
895
-						$surnoms[$surnom] = $infos['table_objet'];
896
-					}
897
-				}
898
-			}
899
-		}
900
-		$md5 = lister_tables_objets_sql('::md5');
901
-	}
902
-
903
-	return $surnoms;
865
+    static $surnoms = null;
866
+    static $md5 = null;
867
+    if (
868
+        !$surnoms
869
+        or $md5 != lister_tables_objets_sql('::md5')
870
+    ) {
871
+        // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
872
+        // pour compatibilite, car il faut dorenavent utiliser
873
+        // declarer_table_objets_sql
874
+        $surnoms = pipeline(
875
+            'declarer_tables_objets_surnoms',
876
+            [
877
+                # pour les modeles
878
+                # a enlever ?
879
+                'doc' => 'documents',
880
+                'img' => 'documents',
881
+                'emb' => 'documents',
882
+            ]
883
+        );
884
+        $infos_tables = lister_tables_objets_sql();
885
+        foreach ($infos_tables as $t => $infos) {
886
+            // cas de base type=>table
887
+            // et preg_replace(',^spip_|^id_|s$,',table)=>table
888
+            if ($infos['table_objet']) { // securite, si la fonction est appelee trop tot, c'est vide
889
+                // optimisations pour table_objet
890
+                //$surnoms[$infos['type']] = $infos['table_objet'];
891
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['table_objet'];
892
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['table_objet'];
893
+                if (is_array($infos['table_objet_surnoms']) and count($infos['table_objet_surnoms'])) {
894
+                    foreach ($infos['table_objet_surnoms'] as $surnom) {
895
+                        $surnoms[$surnom] = $infos['table_objet'];
896
+                    }
897
+                }
898
+            }
899
+        }
900
+        $md5 = lister_tables_objets_sql('::md5');
901
+    }
902
+
903
+    return $surnoms;
904 904
 }
905 905
 
906 906
 /**
@@ -909,35 +909,35 @@  discard block
 block discarded – undo
909 909
  * @return array
910 910
  */
911 911
 function lister_types_surnoms() {
912
-	static $surnoms = null;
913
-	static $md5 = null;
914
-	if (
915
-		!$surnoms
916
-		or $md5 != lister_tables_objets_sql('::md5')
917
-	) {
918
-		// passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
919
-		// pour compatibilite, car il faut dorenavent utiliser
920
-		// declarer_table_objets_sql
921
-		$surnoms = pipeline('declarer_type_surnoms', ['racine-site' => 'site']);
922
-		$infos_tables = lister_tables_objets_sql();
923
-		foreach ($infos_tables as $t => $infos) {
924
-			if ($infos['type']) { // securite, si la fonction est appelee trop tot, c'est vide
925
-				// optimisations pour objet_type
926
-				//$surnoms[$infos['type']] = $infos['type'];
927
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['type'];
928
-				$surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['type'];
929
-				// surnoms declares
930
-				if (is_array($infos['type_surnoms']) and count($infos['type_surnoms'])) {
931
-					foreach ($infos['type_surnoms'] as $surnom) {
932
-						$surnoms[$surnom] = $infos['type'];
933
-					}
934
-				}
935
-			}
936
-		}
937
-		$md5 = lister_tables_objets_sql('::md5');
938
-	}
939
-
940
-	return $surnoms;
912
+    static $surnoms = null;
913
+    static $md5 = null;
914
+    if (
915
+        !$surnoms
916
+        or $md5 != lister_tables_objets_sql('::md5')
917
+    ) {
918
+        // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
919
+        // pour compatibilite, car il faut dorenavent utiliser
920
+        // declarer_table_objets_sql
921
+        $surnoms = pipeline('declarer_type_surnoms', ['racine-site' => 'site']);
922
+        $infos_tables = lister_tables_objets_sql();
923
+        foreach ($infos_tables as $t => $infos) {
924
+            if ($infos['type']) { // securite, si la fonction est appelee trop tot, c'est vide
925
+                // optimisations pour objet_type
926
+                //$surnoms[$infos['type']] = $infos['type'];
927
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['type'];
928
+                $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['type'];
929
+                // surnoms declares
930
+                if (is_array($infos['type_surnoms']) and count($infos['type_surnoms'])) {
931
+                    foreach ($infos['type_surnoms'] as $surnom) {
932
+                        $surnoms[$surnom] = $infos['type'];
933
+                    }
934
+                }
935
+            }
936
+        }
937
+        $md5 = lister_tables_objets_sql('::md5');
938
+    }
939
+
940
+    return $surnoms;
941 941
 }
942 942
 
943 943
 /**
@@ -951,22 +951,22 @@  discard block
 block discarded – undo
951 951
  *     Couples (nom de la table SQL => même nom, sans 'spip_' devant)
952 952
  **/
953 953
 function lister_tables_spip($serveur = '') {
954
-	static $tables = [];
955
-	if (!isset($tables[$serveur])) {
956
-		$tables[$serveur] = [];
957
-		if (!function_exists('sql_alltable')) {
958
-			include_spip('base/abstract_sql');
959
-		}
960
-		$ts = sql_alltable(null, $serveur); // toutes les tables "spip_" (ou prefixe perso)
961
-		$connexion = $GLOBALS['connexions'][$serveur ?: 0];
962
-		$spip = $connexion['prefixe'] . '_';
963
-		foreach ($ts as $t) {
964
-			$t = substr($t, strlen($spip));
965
-			$tables[$serveur]["spip_$t"] = $t;
966
-		}
967
-	}
968
-
969
-	return $tables[$serveur];
954
+    static $tables = [];
955
+    if (!isset($tables[$serveur])) {
956
+        $tables[$serveur] = [];
957
+        if (!function_exists('sql_alltable')) {
958
+            include_spip('base/abstract_sql');
959
+        }
960
+        $ts = sql_alltable(null, $serveur); // toutes les tables "spip_" (ou prefixe perso)
961
+        $connexion = $GLOBALS['connexions'][$serveur ?: 0];
962
+        $spip = $connexion['prefixe'] . '_';
963
+        foreach ($ts as $t) {
964
+            $t = substr($t, strlen($spip));
965
+            $tables[$serveur]["spip_$t"] = $t;
966
+        }
967
+    }
968
+
969
+    return $tables[$serveur];
970 970
 }
971 971
 
972 972
 
@@ -981,18 +981,18 @@  discard block
 block discarded – undo
981 981
  *     Couples (nom de la table SQL => même nom)
982 982
  **/
983 983
 function lister_toutes_tables($serveur) {
984
-	static $tables = [];
985
-	if (!isset($tables[$serveur])) {
986
-		$tables[$serveur] = [];
987
-		if (!function_exists('sql_alltable')) {
988
-			include_spip('base/abstract_sql');
989
-		}
990
-		$ts = sql_alltable('%', $serveur); // toutes les tables
991
-		foreach ($ts as $t) {
992
-			$tables[$serveur][$t] = $t;
993
-		}
994
-	}
995
-	return $tables[$serveur];
984
+    static $tables = [];
985
+    if (!isset($tables[$serveur])) {
986
+        $tables[$serveur] = [];
987
+        if (!function_exists('sql_alltable')) {
988
+            include_spip('base/abstract_sql');
989
+        }
990
+        $ts = sql_alltable('%', $serveur); // toutes les tables
991
+        foreach ($ts as $t) {
992
+            $tables[$serveur][$t] = $t;
993
+        }
994
+    }
995
+    return $tables[$serveur];
996 996
 }
997 997
 
998 998
 /**
@@ -1013,39 +1013,39 @@  discard block
 block discarded – undo
1013 1013
  **/
1014 1014
 function table_objet(string $type, string $serveur = ''): string {
1015 1015
 
1016
-	if ($type) {
1017
-		$type = preg_replace(',^spip_|^id_|s$,', '', $type);
1018
-	}
1019
-	if (!strlen($type)) {
1020
-		return '';
1021
-	}
1022
-
1023
-	$surnoms = lister_tables_objets_surnoms();
1024
-	if (isset($surnoms[$type])) {
1025
-		return $surnoms[$type];
1026
-	}
1027
-
1028
-	if ($serveur !== false) {
1029
-		$t = lister_tables_spip($serveur);
1030
-		$trouver_table = charger_fonction('trouver_table', 'base');
1031
-		$typetrim = rtrim($type, 's') . 's';
1032
-		if (
1033
-			(isset($t[$typetrim]) or in_array($typetrim, $t))
1034
-			and ($desc = $trouver_table(rtrim($type, 's') . 's', $serveur))
1035
-		) {
1036
-			return $desc['id_table'];
1037
-		} elseif (
1038
-			(isset($t[$type]) or in_array($type, $t))
1039
-			and ($desc = $trouver_table($type, $serveur))
1040
-		) {
1041
-			return $desc['id_table'];
1042
-		}
1043
-
1044
-		spip_log('table_objet(' . $type . ') calculee sans verification');
1045
-		#spip_log(debug_backtrace(),'db');
1046
-	}
1047
-
1048
-	return rtrim($type, 's') . 's'; # cas historique ne devant plus servir, sauf si $serveur=false
1016
+    if ($type) {
1017
+        $type = preg_replace(',^spip_|^id_|s$,', '', $type);
1018
+    }
1019
+    if (!strlen($type)) {
1020
+        return '';
1021
+    }
1022
+
1023
+    $surnoms = lister_tables_objets_surnoms();
1024
+    if (isset($surnoms[$type])) {
1025
+        return $surnoms[$type];
1026
+    }
1027
+
1028
+    if ($serveur !== false) {
1029
+        $t = lister_tables_spip($serveur);
1030
+        $trouver_table = charger_fonction('trouver_table', 'base');
1031
+        $typetrim = rtrim($type, 's') . 's';
1032
+        if (
1033
+            (isset($t[$typetrim]) or in_array($typetrim, $t))
1034
+            and ($desc = $trouver_table(rtrim($type, 's') . 's', $serveur))
1035
+        ) {
1036
+            return $desc['id_table'];
1037
+        } elseif (
1038
+            (isset($t[$type]) or in_array($type, $t))
1039
+            and ($desc = $trouver_table($type, $serveur))
1040
+        ) {
1041
+            return $desc['id_table'];
1042
+        }
1043
+
1044
+        spip_log('table_objet(' . $type . ') calculee sans verification');
1045
+        #spip_log(debug_backtrace(),'db');
1046
+    }
1047
+
1048
+    return rtrim($type, 's') . 's'; # cas historique ne devant plus servir, sauf si $serveur=false
1049 1049
 }
1050 1050
 
1051 1051
 /**
@@ -1066,33 +1066,33 @@  discard block
 block discarded – undo
1066 1066
  **/
1067 1067
 function table_objet_sql(string $type, string $serveur = ''): string {
1068 1068
 
1069
-	$nom = table_objet($type, $serveur);
1070
-	if (!strlen($nom)) {
1071
-		return '';
1072
-	}
1073
-	if (!isset($GLOBALS['table_des_tables']['articles'])) {
1074
-		// eviter de multiples inclusions
1075
-		include_spip('public/interfaces');
1076
-	}
1077
-	if (isset($GLOBALS['table_des_tables'][$nom])) {
1078
-		$nom = $GLOBALS['table_des_tables'][$nom];
1079
-		$nom = "spip_$nom";
1080
-	} else {
1081
-		$infos_tables = lister_tables_objets_sql();
1082
-		if (isset($infos_tables["spip_$nom"])) {
1083
-			$nom = "spip_$nom";
1084
-		} elseif ($serveur !== false) {
1085
-			$t = lister_tables_spip($serveur);
1086
-			if (isset($t[$nom]) or in_array($nom, $t)) {
1087
-				$trouver_table = charger_fonction('trouver_table', 'base');
1088
-				if ($desc = $trouver_table($nom, $serveur)) {
1089
-					return $desc['table_sql'];
1090
-				}
1091
-			}
1092
-		}
1093
-	}
1094
-
1095
-	return $nom;
1069
+    $nom = table_objet($type, $serveur);
1070
+    if (!strlen($nom)) {
1071
+        return '';
1072
+    }
1073
+    if (!isset($GLOBALS['table_des_tables']['articles'])) {
1074
+        // eviter de multiples inclusions
1075
+        include_spip('public/interfaces');
1076
+    }
1077
+    if (isset($GLOBALS['table_des_tables'][$nom])) {
1078
+        $nom = $GLOBALS['table_des_tables'][$nom];
1079
+        $nom = "spip_$nom";
1080
+    } else {
1081
+        $infos_tables = lister_tables_objets_sql();
1082
+        if (isset($infos_tables["spip_$nom"])) {
1083
+            $nom = "spip_$nom";
1084
+        } elseif ($serveur !== false) {
1085
+            $t = lister_tables_spip($serveur);
1086
+            if (isset($t[$nom]) or in_array($nom, $t)) {
1087
+                $trouver_table = charger_fonction('trouver_table', 'base');
1088
+                if ($desc = $trouver_table($nom, $serveur)) {
1089
+                    return $desc['table_sql'];
1090
+                }
1091
+            }
1092
+        }
1093
+    }
1094
+
1095
+    return $nom;
1096 1096
 }
1097 1097
 
1098 1098
 /**
@@ -1111,35 +1111,35 @@  discard block
 block discarded – undo
1111 1111
  *     Nom de la clé primaire
1112 1112
  **/
1113 1113
 function id_table_objet(string $type, string $serveur = ''): ?string {
1114
-	static $trouver_table = null;
1115
-	$type = objet_type($type, $serveur);
1116
-	if (!$type) {
1117
-		return null;
1118
-	}
1119
-	$t = table_objet($type);
1120
-	if (!$trouver_table) {
1121
-		$trouver_table = charger_fonction('trouver_table', 'base');
1122
-	}
1123
-
1124
-	$ts = lister_tables_spip($serveur);
1125
-	if (
1126
-		in_array($t, $ts)
1127
-		or in_array($t, lister_toutes_tables($serveur))
1128
-	) {
1129
-		$desc = $trouver_table($t, $serveur);
1130
-		if (isset($desc['key']['PRIMARY KEY'])) {
1131
-			return $desc['key']['PRIMARY KEY'];
1132
-		}
1133
-		if (!$desc or isset($desc['field']["id_$type"])) {
1134
-			return "id_$type";
1135
-		}
1136
-		// sinon renvoyer le premier champ de la table...
1137
-		$keys = array_keys($desc['field']);
1138
-
1139
-		return array_shift($keys);
1140
-	}
1141
-
1142
-	return "id_$type";
1114
+    static $trouver_table = null;
1115
+    $type = objet_type($type, $serveur);
1116
+    if (!$type) {
1117
+        return null;
1118
+    }
1119
+    $t = table_objet($type);
1120
+    if (!$trouver_table) {
1121
+        $trouver_table = charger_fonction('trouver_table', 'base');
1122
+    }
1123
+
1124
+    $ts = lister_tables_spip($serveur);
1125
+    if (
1126
+        in_array($t, $ts)
1127
+        or in_array($t, lister_toutes_tables($serveur))
1128
+    ) {
1129
+        $desc = $trouver_table($t, $serveur);
1130
+        if (isset($desc['key']['PRIMARY KEY'])) {
1131
+            return $desc['key']['PRIMARY KEY'];
1132
+        }
1133
+        if (!$desc or isset($desc['field']["id_$type"])) {
1134
+            return "id_$type";
1135
+        }
1136
+        // sinon renvoyer le premier champ de la table...
1137
+        $keys = array_keys($desc['field']);
1138
+
1139
+        return array_shift($keys);
1140
+    }
1141
+
1142
+    return "id_$type";
1143 1143
 }
1144 1144
 
1145 1145
 /**
@@ -1158,60 +1158,60 @@  discard block
 block discarded – undo
1158 1158
  *     Type de l'objet
1159 1159
  **/
1160 1160
 function objet_type(string $table_objet, string $serveur = ''): ?string {
1161
-	if (!$table_objet) {
1162
-		return null;
1163
-	}
1164
-	$surnoms = lister_types_surnoms();
1165
-
1166
-	// scenario de base
1167
-	// le type est decline a partir du nom de la table en enlevant le prefixe eventuel
1168
-	// et la marque du pluriel
1169
-	// on accepte id_xx en entree aussi
1170
-	$type = preg_replace(',^spip_|^id_|s$,', '', $table_objet);
1171
-	if (isset($surnoms[$type])) {
1172
-		return $surnoms[$type];
1173
-	}
1174
-
1175
-	// securite : eliminer les caracteres non \w
1176
-	$type = preg_replace(',[^\w-],', '', $type);
1177
-
1178
-	// si le type redonne bien la table c'est bon
1179
-	// oui si table_objet ressemblait deja a un type
1180
-	if (
1181
-		$type == $table_objet
1182
-		or (table_objet($type, $serveur) == $table_objet)
1183
-		or (table_objet_sql($type, $serveur) == $table_objet)
1184
-	) {
1185
-		return $type;
1186
-	}
1187
-
1188
-	// si on ne veut pas chercher en base
1189
-	if ($serveur === false) {
1190
-		return $type;
1191
-	}
1192
-
1193
-	// sinon on passe par la cle primaire id_xx pour trouver le type
1194
-	// car le s a la fin est incertain
1195
-	// notamment en cas de pluriel derogatoire
1196
-	// id_jeu/spip_jeux id_journal/spip_journaux qui necessitent tout deux
1197
-	// une declaration jeu => jeux, journal => journaux
1198
-	// dans le pipeline declarer_tables_objets_surnoms
1199
-	$trouver_table = charger_fonction('trouver_table', 'base');
1200
-	$ts = lister_tables_spip($serveur);
1201
-	$desc = false;
1202
-	if (in_array($table_objet, $ts)) {
1203
-		$desc = $trouver_table($table_objet);
1204
-	}
1205
-	if (!$desc and in_array($table_objet = table_objet($type, $serveur), $ts)) {
1206
-		$desc = $trouver_table($table_objet, $serveur);
1207
-	}
1208
-	// si le type est declare : bingo !
1209
-	if ($desc and isset($desc['type'])) {
1210
-		return $desc['type'];
1211
-	}
1212
-
1213
-	// on a fait ce qu'on a pu
1214
-	return $type;
1161
+    if (!$table_objet) {
1162
+        return null;
1163
+    }
1164
+    $surnoms = lister_types_surnoms();
1165
+
1166
+    // scenario de base
1167
+    // le type est decline a partir du nom de la table en enlevant le prefixe eventuel
1168
+    // et la marque du pluriel
1169
+    // on accepte id_xx en entree aussi
1170
+    $type = preg_replace(',^spip_|^id_|s$,', '', $table_objet);
1171
+    if (isset($surnoms[$type])) {
1172
+        return $surnoms[$type];
1173
+    }
1174
+
1175
+    // securite : eliminer les caracteres non \w
1176
+    $type = preg_replace(',[^\w-],', '', $type);
1177
+
1178
+    // si le type redonne bien la table c'est bon
1179
+    // oui si table_objet ressemblait deja a un type
1180
+    if (
1181
+        $type == $table_objet
1182
+        or (table_objet($type, $serveur) == $table_objet)
1183
+        or (table_objet_sql($type, $serveur) == $table_objet)
1184
+    ) {
1185
+        return $type;
1186
+    }
1187
+
1188
+    // si on ne veut pas chercher en base
1189
+    if ($serveur === false) {
1190
+        return $type;
1191
+    }
1192
+
1193
+    // sinon on passe par la cle primaire id_xx pour trouver le type
1194
+    // car le s a la fin est incertain
1195
+    // notamment en cas de pluriel derogatoire
1196
+    // id_jeu/spip_jeux id_journal/spip_journaux qui necessitent tout deux
1197
+    // une declaration jeu => jeux, journal => journaux
1198
+    // dans le pipeline declarer_tables_objets_surnoms
1199
+    $trouver_table = charger_fonction('trouver_table', 'base');
1200
+    $ts = lister_tables_spip($serveur);
1201
+    $desc = false;
1202
+    if (in_array($table_objet, $ts)) {
1203
+        $desc = $trouver_table($table_objet);
1204
+    }
1205
+    if (!$desc and in_array($table_objet = table_objet($type, $serveur), $ts)) {
1206
+        $desc = $trouver_table($table_objet, $serveur);
1207
+    }
1208
+    // si le type est declare : bingo !
1209
+    if ($desc and isset($desc['type'])) {
1210
+        return $desc['type'];
1211
+    }
1212
+
1213
+    // on a fait ce qu'on a pu
1214
+    return $type;
1215 1215
 }
1216 1216
 
1217 1217
 /**
@@ -1227,62 +1227,62 @@  discard block
 block discarded – undo
1227 1227
  * @return bool
1228 1228
  */
1229 1229
 function objet_test_si_publie($objet, $id_objet, $serveur = '') {
1230
-	// voir si une fonction est definie pour faire le boulot
1231
-	// elle a la priorite dans ce cas
1232
-	if ($f = charger_fonction($objet . '_test_si_publie', 'base', true)) {
1233
-		return $f($objet, $id_objet, $serveur);
1234
-	}
1235
-
1236
-	// sinon on se fie a la declaration de l'objet si presente
1237
-	$id_table = $table_objet = table_objet($objet);
1238
-	$id_table_objet = id_table_objet($objet, $serveur);
1239
-	$trouver_table = charger_fonction('trouver_table', 'base');
1240
-	if (
1241
-		$desc = $trouver_table($table_objet, $serveur)
1242
-		and isset($desc['statut'])
1243
-		and $desc['statut']
1244
-	) {
1245
-		$boucle = new Boucle();
1246
-		$boucle->show = $desc;
1247
-		$boucle->nom = 'objet_test_si_publie';
1248
-		$boucle->id_boucle = $id_table;
1249
-		$boucle->id_table = $id_table;
1250
-		$boucle->primary = $desc['key']['PRIMARY KEY'] ?? '';
1251
-		$boucle->sql_serveur = $serveur;
1252
-		$boucle->select[] = $id_table_objet;
1253
-		$boucle->from[$table_objet] = table_objet_sql($objet, $serveur);
1254
-		$boucle->where[] = $id_table . '.' . $id_table_objet . '=' . intval($id_objet);
1255
-
1256
-		$boucle->descr['nom'] = 'objet_test_si_publie'; // eviter notice php
1257
-		$boucle->descr['sourcefile'] = 'internal';
1258
-		$boucle->descr['gram'] = 'html';
1259
-
1260
-		include_spip('public/compiler');
1261
-		include_spip('public/composer');
1262
-		instituer_boucle($boucle, false, true);
1263
-		$res = calculer_select(
1264
-			$boucle->select,
1265
-			$boucle->from,
1266
-			$boucle->from_type,
1267
-			$boucle->where,
1268
-			$boucle->join,
1269
-			$boucle->group,
1270
-			$boucle->order,
1271
-			$boucle->limit,
1272
-			$boucle->having,
1273
-			$table_objet,
1274
-			$id_table,
1275
-			$serveur
1276
-		);
1277
-		if (sql_fetch($res)) {
1278
-			return true;
1279
-		}
1280
-
1281
-		return false;
1282
-	}
1283
-
1284
-	// si pas d'info statut ni de fonction : l'objet est publie
1285
-	return true;
1230
+    // voir si une fonction est definie pour faire le boulot
1231
+    // elle a la priorite dans ce cas
1232
+    if ($f = charger_fonction($objet . '_test_si_publie', 'base', true)) {
1233
+        return $f($objet, $id_objet, $serveur);
1234
+    }
1235
+
1236
+    // sinon on se fie a la declaration de l'objet si presente
1237
+    $id_table = $table_objet = table_objet($objet);
1238
+    $id_table_objet = id_table_objet($objet, $serveur);
1239
+    $trouver_table = charger_fonction('trouver_table', 'base');
1240
+    if (
1241
+        $desc = $trouver_table($table_objet, $serveur)
1242
+        and isset($desc['statut'])
1243
+        and $desc['statut']
1244
+    ) {
1245
+        $boucle = new Boucle();
1246
+        $boucle->show = $desc;
1247
+        $boucle->nom = 'objet_test_si_publie';
1248
+        $boucle->id_boucle = $id_table;
1249
+        $boucle->id_table = $id_table;
1250
+        $boucle->primary = $desc['key']['PRIMARY KEY'] ?? '';
1251
+        $boucle->sql_serveur = $serveur;
1252
+        $boucle->select[] = $id_table_objet;
1253
+        $boucle->from[$table_objet] = table_objet_sql($objet, $serveur);
1254
+        $boucle->where[] = $id_table . '.' . $id_table_objet . '=' . intval($id_objet);
1255
+
1256
+        $boucle->descr['nom'] = 'objet_test_si_publie'; // eviter notice php
1257
+        $boucle->descr['sourcefile'] = 'internal';
1258
+        $boucle->descr['gram'] = 'html';
1259
+
1260
+        include_spip('public/compiler');
1261
+        include_spip('public/composer');
1262
+        instituer_boucle($boucle, false, true);
1263
+        $res = calculer_select(
1264
+            $boucle->select,
1265
+            $boucle->from,
1266
+            $boucle->from_type,
1267
+            $boucle->where,
1268
+            $boucle->join,
1269
+            $boucle->group,
1270
+            $boucle->order,
1271
+            $boucle->limit,
1272
+            $boucle->having,
1273
+            $table_objet,
1274
+            $id_table,
1275
+            $serveur
1276
+        );
1277
+        if (sql_fetch($res)) {
1278
+            return true;
1279
+        }
1280
+
1281
+        return false;
1282
+    }
1283
+
1284
+    // si pas d'info statut ni de fonction : l'objet est publie
1285
+    return true;
1286 1286
 }
1287 1287
 
1288 1288
 
@@ -1317,124 +1317,124 @@  discard block
 block discarded – undo
1317 1317
  *     Retourne un tableau décrivant les parents trouvés
1318 1318
  */
1319 1319
 function objet_lister_parents($objet, $id_objet, $parent_direct_seulement = false) {
1320
-	$parents = [];
1321
-
1322
-	// Si on trouve une ou des méthodes de parent
1323
-	if ($parent_methodes = objet_type_decrire_infos_parents($objet)) {
1324
-		// On identifie les informations sur l'objet source dont on cherche le parent.
1325
-		include_spip('base/abstract_sql');
1326
-		$table_objet = table_objet_sql($objet);
1327
-		$cle_objet = id_table_objet($objet);
1328
-		$id_objet = intval($id_objet);
1329
-
1330
-		// On teste chacun méthode dans l'ordre, et dès qu'on a trouvé un parent on s'arrête
1331
-		foreach ($parent_methodes as $parent_methode) {
1332
-			// Champ identifiant le parent (id et éventuellement le type)
1333
-			// -- cette identification ne dépend pas du fait que le parent soit stocké dans une table de différente
1334
-			//    de celle de l'objet source
1335
-			$select = [];
1336
-			if (isset($parent_methode['champ'])) {
1337
-				$select[] = $parent_methode['champ'];
1338
-			}
1339
-			if (isset($parent_methode['champ_type'])) {
1340
-				$select[] = $parent_methode['champ_type'];
1341
-			}
1342
-
1343
-			// Détermination de la table du parent et des conditions sur l'objet source et le parent.
1344
-			$condition_objet_invalide = false;
1345
-			$where = [];
1346
-			if (!isset($parent_methode['table'])) {
1347
-				// Le parent est stocké dans la même table que l'objet source :
1348
-				// -- toutes les conditions s'appliquent à la table source.
1349
-				$table = $table_objet;
1350
-				$where = ["$cle_objet = $id_objet"];
1351
-				// -- Condition supplémentaire sur la détection du parent
1352
-				if (isset($parent_methode['condition'])) {
1353
-					$where[] = $parent_methode['condition'];
1354
-				}
1355
-			} elseif (!$parent_direct_seulement) {
1356
-				// Le parent est stocké dans une table différente de l'objet source.
1357
-				// -- on vérifie d'emblée si il y a une condition sur l'objet source et si celle-ci est vérifiée
1358
-				//    Si non, on peut arrêter le traitement.
1359
-				if (isset($parent_methode['condition'])) {
1360
-					$where = [
1361
-						"$cle_objet = $id_objet",
1362
-						$parent_methode['condition']
1363
-					];
1364
-					if (!sql_countsel($table_objet, $where)) {
1365
-						$condition_objet_invalide = true;
1366
-					}
1367
-				}
1368
-
1369
-				// Si pas de condition sur l'objet source ou que la condition est vérifiée, on peut construire
1370
-				// la requête sur la table qui accueille le parent.
1371
-				if (!$condition_objet_invalide) {
1372
-					$table = $parent_methode['table'];
1373
-					// On construit les conditions en fonction de l'identification de l'objet source
1374
-					$where = [];
1375
-					// -- si le champ_source de l'id n'est pas précisé c'est qu'il est déjà connu et donc que c'est
1376
-					//    le même que celui de l'objet source.
1377
-					$where[] = isset($parent_methode['source_champ'])
1378
-						? "{$parent_methode['source_champ']} = $id_objet"
1379
-						: "$cle_objet = $id_objet";
1380
-					if (isset($parent_methode['source_champ_type'])) {
1381
-						$where[] = "{$parent_methode['source_champ_type']} = " . sql_quote($objet);
1382
-					}
1383
-					// -- Condition supplémentaire sur la détection du parent
1384
-					if (isset($parent_methode['table_condition'])) {
1385
-						$where[] = $parent_methode['table_condition'];
1386
-					}
1387
-				}
1388
-			}
1389
-
1390
-			// On lance la requête de récupération du parent
1391
-			$is_table_lien = (strpos($table, '_liens') !== false and substr($table, -6) === '_liens');
1392
-			if (
1393
-				!$condition_objet_invalide
1394
-				and $where
1395
-				and ($lignes = sql_allfetsel($is_table_lien ? '*' : $select, $table, $where))
1396
-			) {
1397
-				foreach ($lignes as $ligne) {
1398
-					// Si le type est fixe
1399
-					if (isset($parent_methode['type'])) {
1400
-						$parent = [
1401
-							'objet' 	=> $parent_methode['type'],
1402
-							'id_objet'	=> intval($ligne[$parent_methode['champ']]),
1403
-							'champ' 	=> $parent_methode['champ'],
1404
-							'table'    => $table,
1405
-						];
1406
-					}
1407
-					elseif (isset($parent_methode['champ_type'])) {
1408
-						$parent = [
1409
-							'objet' 	 => $ligne[$parent_methode['champ_type']],
1410
-							'id_objet' 	 => intval($ligne[$parent_methode['champ']]),
1411
-							'champ' 	 => $parent_methode['champ'],
1412
-							'champ_type' => $parent_methode['champ_type'],
1413
-							'table'    => $table,
1414
-						];
1415
-					}
1416
-					if ($is_table_lien) {
1417
-						$parent['lien'] = $ligne;
1418
-					}
1419
-					$parents[] = $parent;
1420
-				}
1421
-			}
1422
-		}
1423
-	}
1424
-
1425
-	// On passe par un pipeline avant de retourner
1426
-	$parents = pipeline(
1427
-		'objet_lister_parents',
1428
-		[
1429
-			'args' => [
1430
-				'objet' => $objet,
1431
-				'id_objet' => $id_objet,
1432
-			],
1433
-			'data' => $parents,
1434
-		]
1435
-	);
1436
-
1437
-	return $parents;
1320
+    $parents = [];
1321
+
1322
+    // Si on trouve une ou des méthodes de parent
1323
+    if ($parent_methodes = objet_type_decrire_infos_parents($objet)) {
1324
+        // On identifie les informations sur l'objet source dont on cherche le parent.
1325
+        include_spip('base/abstract_sql');
1326
+        $table_objet = table_objet_sql($objet);
1327
+        $cle_objet = id_table_objet($objet);
1328
+        $id_objet = intval($id_objet);
1329
+
1330
+        // On teste chacun méthode dans l'ordre, et dès qu'on a trouvé un parent on s'arrête
1331
+        foreach ($parent_methodes as $parent_methode) {
1332
+            // Champ identifiant le parent (id et éventuellement le type)
1333
+            // -- cette identification ne dépend pas du fait que le parent soit stocké dans une table de différente
1334
+            //    de celle de l'objet source
1335
+            $select = [];
1336
+            if (isset($parent_methode['champ'])) {
1337
+                $select[] = $parent_methode['champ'];
1338
+            }
1339
+            if (isset($parent_methode['champ_type'])) {
1340
+                $select[] = $parent_methode['champ_type'];
1341
+            }
1342
+
1343
+            // Détermination de la table du parent et des conditions sur l'objet source et le parent.
1344
+            $condition_objet_invalide = false;
1345
+            $where = [];
1346
+            if (!isset($parent_methode['table'])) {
1347
+                // Le parent est stocké dans la même table que l'objet source :
1348
+                // -- toutes les conditions s'appliquent à la table source.
1349
+                $table = $table_objet;
1350
+                $where = ["$cle_objet = $id_objet"];
1351
+                // -- Condition supplémentaire sur la détection du parent
1352
+                if (isset($parent_methode['condition'])) {
1353
+                    $where[] = $parent_methode['condition'];
1354
+                }
1355
+            } elseif (!$parent_direct_seulement) {
1356
+                // Le parent est stocké dans une table différente de l'objet source.
1357
+                // -- on vérifie d'emblée si il y a une condition sur l'objet source et si celle-ci est vérifiée
1358
+                //    Si non, on peut arrêter le traitement.
1359
+                if (isset($parent_methode['condition'])) {
1360
+                    $where = [
1361
+                        "$cle_objet = $id_objet",
1362
+                        $parent_methode['condition']
1363
+                    ];
1364
+                    if (!sql_countsel($table_objet, $where)) {
1365
+                        $condition_objet_invalide = true;
1366
+                    }
1367
+                }
1368
+
1369
+                // Si pas de condition sur l'objet source ou que la condition est vérifiée, on peut construire
1370
+                // la requête sur la table qui accueille le parent.
1371
+                if (!$condition_objet_invalide) {
1372
+                    $table = $parent_methode['table'];
1373
+                    // On construit les conditions en fonction de l'identification de l'objet source
1374
+                    $where = [];
1375
+                    // -- si le champ_source de l'id n'est pas précisé c'est qu'il est déjà connu et donc que c'est
1376
+                    //    le même que celui de l'objet source.
1377
+                    $where[] = isset($parent_methode['source_champ'])
1378
+                        ? "{$parent_methode['source_champ']} = $id_objet"
1379
+                        : "$cle_objet = $id_objet";
1380
+                    if (isset($parent_methode['source_champ_type'])) {
1381
+                        $where[] = "{$parent_methode['source_champ_type']} = " . sql_quote($objet);
1382
+                    }
1383
+                    // -- Condition supplémentaire sur la détection du parent
1384
+                    if (isset($parent_methode['table_condition'])) {
1385
+                        $where[] = $parent_methode['table_condition'];
1386
+                    }
1387
+                }
1388
+            }
1389
+
1390
+            // On lance la requête de récupération du parent
1391
+            $is_table_lien = (strpos($table, '_liens') !== false and substr($table, -6) === '_liens');
1392
+            if (
1393
+                !$condition_objet_invalide
1394
+                and $where
1395
+                and ($lignes = sql_allfetsel($is_table_lien ? '*' : $select, $table, $where))
1396
+            ) {
1397
+                foreach ($lignes as $ligne) {
1398
+                    // Si le type est fixe
1399
+                    if (isset($parent_methode['type'])) {
1400
+                        $parent = [
1401
+                            'objet' 	=> $parent_methode['type'],
1402
+                            'id_objet'	=> intval($ligne[$parent_methode['champ']]),
1403
+                            'champ' 	=> $parent_methode['champ'],
1404
+                            'table'    => $table,
1405
+                        ];
1406
+                    }
1407
+                    elseif (isset($parent_methode['champ_type'])) {
1408
+                        $parent = [
1409
+                            'objet' 	 => $ligne[$parent_methode['champ_type']],
1410
+                            'id_objet' 	 => intval($ligne[$parent_methode['champ']]),
1411
+                            'champ' 	 => $parent_methode['champ'],
1412
+                            'champ_type' => $parent_methode['champ_type'],
1413
+                            'table'    => $table,
1414
+                        ];
1415
+                    }
1416
+                    if ($is_table_lien) {
1417
+                        $parent['lien'] = $ligne;
1418
+                    }
1419
+                    $parents[] = $parent;
1420
+                }
1421
+            }
1422
+        }
1423
+    }
1424
+
1425
+    // On passe par un pipeline avant de retourner
1426
+    $parents = pipeline(
1427
+        'objet_lister_parents',
1428
+        [
1429
+            'args' => [
1430
+                'objet' => $objet,
1431
+                'id_objet' => $id_objet,
1432
+            ],
1433
+            'data' => $parents,
1434
+        ]
1435
+    );
1436
+
1437
+    return $parents;
1438 1438
 }
1439 1439
 
1440 1440
 /**
@@ -1446,17 +1446,17 @@  discard block
 block discarded – undo
1446 1446
  * @return array
1447 1447
  */
1448 1448
 function objet_lister_parents_par_type($objet, $id_objet) {
1449
-	$parents = objet_lister_parents($objet, $id_objet);
1449
+    $parents = objet_lister_parents($objet, $id_objet);
1450 1450
 
1451
-	$parents_par_type = [];
1452
-	foreach ($parents as $parent) {
1453
-		if (!isset($parents_par_type[$parent['objet']])) {
1454
-			$parents_par_type[$parent['objet']] = [];
1455
-		}
1456
-		$parents_par_type[$parent['objet']][] = $parent['id_objet'];
1457
-	}
1451
+    $parents_par_type = [];
1452
+    foreach ($parents as $parent) {
1453
+        if (!isset($parents_par_type[$parent['objet']])) {
1454
+            $parents_par_type[$parent['objet']] = [];
1455
+        }
1456
+        $parents_par_type[$parent['objet']][] = $parent['id_objet'];
1457
+    }
1458 1458
 
1459
-	return $parents_par_type;
1459
+    return $parents_par_type;
1460 1460
 }
1461 1461
 
1462 1462
 
@@ -1489,85 +1489,85 @@  discard block
 block discarded – undo
1489 1489
  *     Retourne un tableau de tableaux, avec comme clés les types des objets, et dans chacun un tableau des identifiants trouvés
1490 1490
  */
1491 1491
 function objet_lister_enfants($objet, $id_objet) {
1492
-	$enfants = [];
1493
-
1494
-	// Si on trouve des types d'enfants et leurs méthodes
1495
-	if ($enfants_methodes = objet_type_decrire_infos_enfants($objet)) {
1496
-		include_spip('base/abstract_sql');
1497
-		$id_objet = intval($id_objet);
1498
-
1499
-		// On parcourt tous les types d'enfants trouvés
1500
-		foreach ($enfants_methodes as $objet_enfant => $_methode_parent) {
1501
-			// On construit les conditions d'identification du parent
1502
-			$where = [];
1503
-			// -- L'identifiant du parent
1504
-			if (isset($_methode_parent['champ'])) {
1505
-				$where[] = $_methode_parent['champ'] . ' = ' . $id_objet;
1506
-			}
1507
-			// -- Si le parent est variable
1508
-			if (isset($_methode_parent['champ_type'])) {
1509
-				$where[] = $_methode_parent['champ_type'] . ' = ' . sql_quote($objet);
1510
-			}
1511
-
1512
-			// On détermine la table, le champ id des enfants et on complète éventuellement les conditions
1513
-			if (!isset($_methode_parent['table'])) {
1514
-				// Les enfants sont stockés dans la même table que l'objet parent :
1515
-				$table_enfant = table_objet_sql($objet_enfant);
1516
-				$cle_objet_enfant = id_table_objet($objet_enfant);
1517
-
1518
-				// S'il y a une condition supplémentaire
1519
-				if (isset($_methode_parent['condition'])) {
1520
-					$where[] = $_methode_parent['condition'];
1521
-				}
1522
-			} else {
1523
-				// Les enfants sont stockés dans une table différente de l'objet parent.
1524
-				$table_enfant = $_methode_parent['table'];
1525
-				$cle_objet_enfant = $_methode_parent['source_champ'] ?? id_table_objet($objet_enfant);
1526
-
1527
-				// S'il y a une condition supplémentaire
1528
-				if (isset($_methode_parent['table_condition'])) {
1529
-					$where[] = $_methode_parent['table_condition'];
1530
-				}
1531
-			}
1532
-
1533
-			// On lance la requête
1534
-			$is_table_lien = (strpos($table_enfant, '_liens') !== false and substr($table_enfant, -6) === '_liens');
1535
-			if ($rows = sql_allfetsel($is_table_lien ? '*' : $cle_objet_enfant, $table_enfant, $where)) {
1536
-				$enfant = [
1537
-					'objet' => $objet_enfant,
1538
-					'id_objet' => 0,
1539
-					'table' => $table_enfant
1540
-				];
1541
-				if (isset($_methode_parent['champ'])) {
1542
-					$enfant['champ'] = $_methode_parent['champ'];
1543
-				}
1544
-				if (isset($_methode_parent['champ_type'])) {
1545
-					$enfant['champ_type'] = $_methode_parent['champ_type'];
1546
-				}
1547
-				foreach ($rows as $row) {
1548
-					$enfant['id_objet'] = intval($row[$cle_objet_enfant]);
1549
-					if ($is_table_lien) {
1550
-						$enfant['lien'] = $row;
1551
-					}
1552
-					$enfants[] = $enfant;
1553
-				}
1554
-			}
1555
-		}
1556
-	}
1557
-
1558
-	// On passe par un pipeline avant de retourner
1559
-	$enfants = pipeline(
1560
-		'objet_lister_enfants',
1561
-		[
1562
-			'args' => [
1563
-				'objet' => $objet,
1564
-				'id_objet' => $id_objet,
1565
-			],
1566
-			'data' => $enfants,
1567
-		]
1568
-	);
1569
-
1570
-	return $enfants;
1492
+    $enfants = [];
1493
+
1494
+    // Si on trouve des types d'enfants et leurs méthodes
1495
+    if ($enfants_methodes = objet_type_decrire_infos_enfants($objet)) {
1496
+        include_spip('base/abstract_sql');
1497
+        $id_objet = intval($id_objet);
1498
+
1499
+        // On parcourt tous les types d'enfants trouvés
1500
+        foreach ($enfants_methodes as $objet_enfant => $_methode_parent) {
1501
+            // On construit les conditions d'identification du parent
1502
+            $where = [];
1503
+            // -- L'identifiant du parent
1504
+            if (isset($_methode_parent['champ'])) {
1505
+                $where[] = $_methode_parent['champ'] . ' = ' . $id_objet;
1506
+            }
1507
+            // -- Si le parent est variable
1508
+            if (isset($_methode_parent['champ_type'])) {
1509
+                $where[] = $_methode_parent['champ_type'] . ' = ' . sql_quote($objet);
1510
+            }
1511
+
1512
+            // On détermine la table, le champ id des enfants et on complète éventuellement les conditions
1513
+            if (!isset($_methode_parent['table'])) {
1514
+                // Les enfants sont stockés dans la même table que l'objet parent :
1515
+                $table_enfant = table_objet_sql($objet_enfant);
1516
+                $cle_objet_enfant = id_table_objet($objet_enfant);
1517
+
1518
+                // S'il y a une condition supplémentaire
1519
+                if (isset($_methode_parent['condition'])) {
1520
+                    $where[] = $_methode_parent['condition'];
1521
+                }
1522
+            } else {
1523
+                // Les enfants sont stockés dans une table différente de l'objet parent.
1524
+                $table_enfant = $_methode_parent['table'];
1525
+                $cle_objet_enfant = $_methode_parent['source_champ'] ?? id_table_objet($objet_enfant);
1526
+
1527
+                // S'il y a une condition supplémentaire
1528
+                if (isset($_methode_parent['table_condition'])) {
1529
+                    $where[] = $_methode_parent['table_condition'];
1530
+                }
1531
+            }
1532
+
1533
+            // On lance la requête
1534
+            $is_table_lien = (strpos($table_enfant, '_liens') !== false and substr($table_enfant, -6) === '_liens');
1535
+            if ($rows = sql_allfetsel($is_table_lien ? '*' : $cle_objet_enfant, $table_enfant, $where)) {
1536
+                $enfant = [
1537
+                    'objet' => $objet_enfant,
1538
+                    'id_objet' => 0,
1539
+                    'table' => $table_enfant
1540
+                ];
1541
+                if (isset($_methode_parent['champ'])) {
1542
+                    $enfant['champ'] = $_methode_parent['champ'];
1543
+                }
1544
+                if (isset($_methode_parent['champ_type'])) {
1545
+                    $enfant['champ_type'] = $_methode_parent['champ_type'];
1546
+                }
1547
+                foreach ($rows as $row) {
1548
+                    $enfant['id_objet'] = intval($row[$cle_objet_enfant]);
1549
+                    if ($is_table_lien) {
1550
+                        $enfant['lien'] = $row;
1551
+                    }
1552
+                    $enfants[] = $enfant;
1553
+                }
1554
+            }
1555
+        }
1556
+    }
1557
+
1558
+    // On passe par un pipeline avant de retourner
1559
+    $enfants = pipeline(
1560
+        'objet_lister_enfants',
1561
+        [
1562
+            'args' => [
1563
+                'objet' => $objet,
1564
+                'id_objet' => $id_objet,
1565
+            ],
1566
+            'data' => $enfants,
1567
+        ]
1568
+    );
1569
+
1570
+    return $enfants;
1571 1571
 }
1572 1572
 
1573 1573
 /**
@@ -1579,17 +1579,17 @@  discard block
 block discarded – undo
1579 1579
  * @return array
1580 1580
  */
1581 1581
 function objet_lister_enfants_par_type($objet, $id_objet) {
1582
-	$enfants = objet_lister_enfants($objet, $id_objet);
1582
+    $enfants = objet_lister_enfants($objet, $id_objet);
1583 1583
 
1584
-	$enfants_par_type = [];
1585
-	foreach ($enfants as $enfant) {
1586
-		if (!isset($enfants_par_type[$enfant['objet']])) {
1587
-			$enfants_par_type[$enfant['objet']] = [];
1588
-		}
1589
-		$enfants_par_type[$enfant['objet']][] = $enfant['id_objet'];
1590
-	}
1584
+    $enfants_par_type = [];
1585
+    foreach ($enfants as $enfant) {
1586
+        if (!isset($enfants_par_type[$enfant['objet']])) {
1587
+            $enfants_par_type[$enfant['objet']] = [];
1588
+        }
1589
+        $enfants_par_type[$enfant['objet']][] = $enfant['id_objet'];
1590
+    }
1591 1591
 
1592
-	return $enfants_par_type;
1592
+    return $enfants_par_type;
1593 1593
 }
1594 1594
 
1595 1595
 /**
@@ -1601,35 +1601,35 @@  discard block
 block discarded – undo
1601 1601
  *     Retourne un tableau de tableau contenant les informations de type et de champ pour trouver le parent ou false sinon
1602 1602
  */
1603 1603
 function objet_type_decrire_infos_parents($objet) {
1604
-	static $parents = [];
1605
-
1606
-	// Si on ne l'a pas encore cherché pour cet objet
1607
-	if (!isset($parents[$objet])) {
1608
-		$parents[$objet] = false;
1609
-		$table = table_objet_sql($objet);
1610
-
1611
-		// Si on trouve bien la description de cet objet
1612
-		if ($infos = lister_tables_objets_sql($table)) {
1613
-			if (isset($infos['parent']) and is_array($infos['parent'])) {
1614
-				// S'il y a une description explicite de parent, c'est prioritaire
1615
-				// -- on traite les cas où il y a une ou plusieurs description mais on renvoie toujours un tableau
1616
-				//    de description
1617
-				if (!isset($infos['parent'][0])) {
1618
-					$parents[$objet] = [$infos['parent']];
1619
-				} else {
1620
-					$parents[$objet] = $infos['parent'];
1621
-				}
1622
-			} elseif (isset($infos['field']['id_rubrique'])) {
1623
-				// Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique
1624
-				$parents[$objet] = [['type' => 'rubrique', 'champ' => 'id_rubrique']];
1625
-			} elseif (isset($infos['field']['id_parent'])) {
1626
-				// Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même
1627
-				$parents[$objet] = [['type' => $objet, 'champ' => 'id_parent']];
1628
-			}
1629
-		}
1630
-	}
1631
-
1632
-	return $parents[$objet];
1604
+    static $parents = [];
1605
+
1606
+    // Si on ne l'a pas encore cherché pour cet objet
1607
+    if (!isset($parents[$objet])) {
1608
+        $parents[$objet] = false;
1609
+        $table = table_objet_sql($objet);
1610
+
1611
+        // Si on trouve bien la description de cet objet
1612
+        if ($infos = lister_tables_objets_sql($table)) {
1613
+            if (isset($infos['parent']) and is_array($infos['parent'])) {
1614
+                // S'il y a une description explicite de parent, c'est prioritaire
1615
+                // -- on traite les cas où il y a une ou plusieurs description mais on renvoie toujours un tableau
1616
+                //    de description
1617
+                if (!isset($infos['parent'][0])) {
1618
+                    $parents[$objet] = [$infos['parent']];
1619
+                } else {
1620
+                    $parents[$objet] = $infos['parent'];
1621
+                }
1622
+            } elseif (isset($infos['field']['id_rubrique'])) {
1623
+                // Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique
1624
+                $parents[$objet] = [['type' => 'rubrique', 'champ' => 'id_rubrique']];
1625
+            } elseif (isset($infos['field']['id_parent'])) {
1626
+                // Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même
1627
+                $parents[$objet] = [['type' => $objet, 'champ' => 'id_parent']];
1628
+            }
1629
+        }
1630
+    }
1631
+
1632
+    return $parents[$objet];
1633 1633
 }
1634 1634
 
1635 1635
 /**
@@ -1641,36 +1641,36 @@  discard block
 block discarded – undo
1641 1641
  *     Retourne un tableau de tableaux contenant chacun les informations d'un type d'enfant
1642 1642
  */
1643 1643
 function objet_type_decrire_infos_enfants($objet) {
1644
-	static $enfants = [];
1645
-
1646
-	// Si on a déjà fait la recherche pour ce type d'objet
1647
-	if (!isset($enfants[$objet])) {
1648
-		$enfants[$objet] = [];
1649
-		$tables = lister_tables_objets_sql();
1650
-
1651
-		// On parcourt toutes les tables d'objet, et on cherche si chacune peut être enfant
1652
-		foreach ($tables as $table => $infos) {
1653
-			$objet_enfant = objet_type($table);
1654
-
1655
-			// On ne va pas refaire les tests des différents cas, on réutilise
1656
-			if ($parent_methodes = objet_type_decrire_infos_parents($objet_enfant)) {
1657
-				// On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé
1658
-				foreach ($parent_methodes as $parent_methode) {
1659
-					// Si la méthode qu'on teste n'exclut pas le parent demandé
1660
-					if (!isset($parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) {
1661
-						// Si le type du parent est fixe et directement l'objet demandé
1662
-						if (isset($parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) {
1663
-							$enfants[$objet][$objet_enfant] = $parent_methode;
1664
-						}
1665
-						// Si le type est variable, alors l'objet demandé peut forcément être parent
1666
-						elseif (isset($parent_methode['champ_type']) and isset($parent_methode['champ'])) {
1667
-							$enfants[$objet][$objet_enfant] = $parent_methode;
1668
-						}
1669
-					}
1670
-				}
1671
-			}
1672
-		}
1673
-	}
1674
-
1675
-	return $enfants[$objet];
1644
+    static $enfants = [];
1645
+
1646
+    // Si on a déjà fait la recherche pour ce type d'objet
1647
+    if (!isset($enfants[$objet])) {
1648
+        $enfants[$objet] = [];
1649
+        $tables = lister_tables_objets_sql();
1650
+
1651
+        // On parcourt toutes les tables d'objet, et on cherche si chacune peut être enfant
1652
+        foreach ($tables as $table => $infos) {
1653
+            $objet_enfant = objet_type($table);
1654
+
1655
+            // On ne va pas refaire les tests des différents cas, on réutilise
1656
+            if ($parent_methodes = objet_type_decrire_infos_parents($objet_enfant)) {
1657
+                // On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé
1658
+                foreach ($parent_methodes as $parent_methode) {
1659
+                    // Si la méthode qu'on teste n'exclut pas le parent demandé
1660
+                    if (!isset($parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) {
1661
+                        // Si le type du parent est fixe et directement l'objet demandé
1662
+                        if (isset($parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) {
1663
+                            $enfants[$objet][$objet_enfant] = $parent_methode;
1664
+                        }
1665
+                        // Si le type est variable, alors l'objet demandé peut forcément être parent
1666
+                        elseif (isset($parent_methode['champ_type']) and isset($parent_methode['champ'])) {
1667
+                            $enfants[$objet][$objet_enfant] = $parent_methode;
1668
+                        }
1669
+                    }
1670
+                }
1671
+            }
1672
+        }
1673
+    }
1674
+
1675
+    return $enfants[$objet];
1676 1676
 }
Please login to merge, or discard this patch.
ecrire/lang/ecrire_fr.php 1 patch
Indentation   +839 added lines, -839 removed lines patch added patch discarded remove patch
@@ -2,438 +2,438 @@  discard block
 block discarded – undo
2 2
 // This is a SPIP language file  --  Ceci est un fichier langue de SPIP
3 3
 // Fichier source, a modifier dans https://git.spip.net/spip/spip.git
4 4
 if (!defined('_ECRIRE_INC_VERSION')) {
5
-	return;
5
+    return;
6 6
 }
7 7
 
8 8
 $GLOBALS[$GLOBALS['idx_lang']] = array(
9 9
 
10
-	// A
11
-	'activer_plugin' => 'Activer le plugin',
12
-	'affichage' => 'Affichage',
13
-	'aide_non_disponible' => 'Cette partie de l’aide en ligne n’est pas encore disponible dans cette langue.',
14
-	'annuler_recherche' => 'Annuler la recherche',
15
-	'auteur' => 'Auteur :',
16
-	'avis_acces_interdit' => 'Accès interdit.',
17
-	'avis_acces_interdit_prive' => 'Vous n’avez pas le droit d’accéder à la page <b>@exec@</b>.',
18
-	'avis_article_modifie' => 'Attention, @nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
19
-	'avis_aucun_resultat' => 'Aucun résultat.',
20
-	'avis_base_inaccessible' => 'Impossible de se connecter à la base de données @base@.',
21
-	'avis_chemin_invalide_1' => 'Le chemin que vous avez choisi',
22
-	'avis_chemin_invalide_2' => 'ne semble pas valide. Veuillez retourner à la page précédente et vérifier les informations fournies.',
23
-	'avis_connexion_echec_1' => 'La connexion  à la base de données a échoué.',
24
-	'avis_connexion_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
25
-	'avis_connexion_echec_3' => '<b>N.B.</b> Sur de nombreux serveurs, vous devez <b>demander</b> l’activation de votre accès à la base de données avant de pouvoir l’utiliser. Si vous ne pouvez vous connecter, vérifiez que vous avez effectué cette démarche.',
26
-	'avis_connexion_erreur_creer_base' => 'La base de données n’a pas pu être créée.',
27
-	'avis_connexion_erreur_fichier_cle_manquant_1' => 'L’installation doit être faite par un webmestre avec un backup des clés et son mot de passe',
28
-	'avis_connexion_erreur_fichier_cle_manquant_2' => 'L’installation doit être faite par un webmestre avec un backup des clés',
29
-	'avis_connexion_erreur_nom_base' => 'Le nom de la base ne peut contenir que des lettres, des chiffres et des tirets',
30
-	'avis_connexion_ldap_echec_1' => 'La connexion au serveur LDAP a échoué.',
31
-	'avis_connexion_ldap_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
32
-	'avis_connexion_ldap_echec_3' => 'Alternativement, n’utilisez pas le support LDAP pour importer des utilisateurs.',
33
-	'avis_deplacement_rubrique' => 'Attention ! Cette rubrique contient @contient_breves@ brève@scb@ : si vous la déplacez, veuillez cocher cette case de confirmation.',
34
-	'avis_erreur_connexion_mysql' => 'Erreur de connexion SQL',
35
-	'avis_erreur_creation_compte' => 'Echec lors de l’initialisation du compte',
36
-	'avis_espace_interdit' => '<b>Espace interdit</b> <div>SPIP est déjà installé.</div>',
37
-	'avis_lecture_noms_bases_1' => 'Le programme d’installation n’a pas pu lire les noms des bases de données installées.',
38
-	'avis_lecture_noms_bases_2' => 'Soit aucune base n’est disponible, soit la fonction permettant de lister les bases a été désactivée
10
+    // A
11
+    'activer_plugin' => 'Activer le plugin',
12
+    'affichage' => 'Affichage',
13
+    'aide_non_disponible' => 'Cette partie de l’aide en ligne n’est pas encore disponible dans cette langue.',
14
+    'annuler_recherche' => 'Annuler la recherche',
15
+    'auteur' => 'Auteur :',
16
+    'avis_acces_interdit' => 'Accès interdit.',
17
+    'avis_acces_interdit_prive' => 'Vous n’avez pas le droit d’accéder à la page <b>@exec@</b>.',
18
+    'avis_article_modifie' => 'Attention, @nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
19
+    'avis_aucun_resultat' => 'Aucun résultat.',
20
+    'avis_base_inaccessible' => 'Impossible de se connecter à la base de données @base@.',
21
+    'avis_chemin_invalide_1' => 'Le chemin que vous avez choisi',
22
+    'avis_chemin_invalide_2' => 'ne semble pas valide. Veuillez retourner à la page précédente et vérifier les informations fournies.',
23
+    'avis_connexion_echec_1' => 'La connexion  à la base de données a échoué.',
24
+    'avis_connexion_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
25
+    'avis_connexion_echec_3' => '<b>N.B.</b> Sur de nombreux serveurs, vous devez <b>demander</b> l’activation de votre accès à la base de données avant de pouvoir l’utiliser. Si vous ne pouvez vous connecter, vérifiez que vous avez effectué cette démarche.',
26
+    'avis_connexion_erreur_creer_base' => 'La base de données n’a pas pu être créée.',
27
+    'avis_connexion_erreur_fichier_cle_manquant_1' => 'L’installation doit être faite par un webmestre avec un backup des clés et son mot de passe',
28
+    'avis_connexion_erreur_fichier_cle_manquant_2' => 'L’installation doit être faite par un webmestre avec un backup des clés',
29
+    'avis_connexion_erreur_nom_base' => 'Le nom de la base ne peut contenir que des lettres, des chiffres et des tirets',
30
+    'avis_connexion_ldap_echec_1' => 'La connexion au serveur LDAP a échoué.',
31
+    'avis_connexion_ldap_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
32
+    'avis_connexion_ldap_echec_3' => 'Alternativement, n’utilisez pas le support LDAP pour importer des utilisateurs.',
33
+    'avis_deplacement_rubrique' => 'Attention ! Cette rubrique contient @contient_breves@ brève@scb@ : si vous la déplacez, veuillez cocher cette case de confirmation.',
34
+    'avis_erreur_connexion_mysql' => 'Erreur de connexion SQL',
35
+    'avis_erreur_creation_compte' => 'Echec lors de l’initialisation du compte',
36
+    'avis_espace_interdit' => '<b>Espace interdit</b> <div>SPIP est déjà installé.</div>',
37
+    'avis_lecture_noms_bases_1' => 'Le programme d’installation n’a pas pu lire les noms des bases de données installées.',
38
+    'avis_lecture_noms_bases_2' => 'Soit aucune base n’est disponible, soit la fonction permettant de lister les bases a été désactivée
39 39
 		pour des raisons de sécurité (ce qui est le cas chez de nombreux hébergeurs).',
40
-	'avis_lecture_noms_bases_3' => 'Dans la seconde alternative, il est probable qu’une base portant votre nom de login soit utilisable :',
41
-	'avis_non_acces_page' => 'Vous n’avez pas accès à cette page.',
42
-	'avis_operation_echec' => 'L’opération a échoué.',
43
-	'avis_operation_impossible' => 'Opération impossible',
44
-	'avis_suppression_base' => 'ATTENTION, la suppression des données est irréversible',
40
+    'avis_lecture_noms_bases_3' => 'Dans la seconde alternative, il est probable qu’une base portant votre nom de login soit utilisable :',
41
+    'avis_non_acces_page' => 'Vous n’avez pas accès à cette page.',
42
+    'avis_operation_echec' => 'L’opération a échoué.',
43
+    'avis_operation_impossible' => 'Opération impossible',
44
+    'avis_suppression_base' => 'ATTENTION, la suppression des données est irréversible',
45 45
 
46
-	// B
47
-	'bouton_acces_ldap' => 'Ajouter l’accès à LDAP',
48
-	'bouton_ajouter' => 'Ajouter',
49
-	'bouton_annuler' => 'Annuler',
50
-	'bouton_cache_activer' => 'Réactiver le cache',
51
-	'bouton_cache_desactiver' => 'Désactiver temporairement le cache',
52
-	'bouton_demande_publication' => 'Demander la publication de cet article',
53
-	'bouton_desactive_tout' => 'Tout désactiver',
54
-	'bouton_desinstaller' => 'Désinstaller',
55
-	'bouton_effacer_tout' => 'Effacer TOUT',
56
-	'bouton_envoyer_message' => 'Message définitif : envoyer',
57
-	'bouton_fermer' => 'Fermer',
58
-	'bouton_mettre_a_jour_base' => 'Mettre à jour la base de données',
59
-	'bouton_modifier' => 'Modifier',
60
-	'bouton_radio_afficher' => 'Afficher',
61
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Apparaître dans la liste des rédacteurs connectés',
62
-	'bouton_radio_envoi_annonces_adresse' => 'Envoyer les annonces à l’adresse :',
63
-	'bouton_radio_envoi_liste_nouveautes' => 'Envoyer la liste des nouveautés',
64
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Ne pas apparaître dans la liste des rédacteurs',
65
-	'bouton_radio_non_envoi_annonces_editoriales' => 'Ne pas envoyer d’annonces éditoriales',
66
-	'bouton_redirection' => 'REDIRECTION',
67
-	'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Réinitialiser aux valeurs par défaut',
68
-	'bouton_relancer_inscription' => 'Relancer l’inscription',
69
-	'bouton_relancer_inscriptions' => 'Relancer les inscriptions',
70
-	'bouton_relancer_installation' => 'Relancer l’installation',
71
-	'bouton_reset_password' => 'Générer un nouveau mot de passe et l’envoyer par email',
72
-	'bouton_suivant' => 'Suivant',
73
-	'bouton_tenter_recuperation' => 'Tenter une réparation',
74
-	'bouton_test_proxy' => 'Essayer le proxy',
75
-	'bouton_vider_cache' => 'Vider le cache',
46
+    // B
47
+    'bouton_acces_ldap' => 'Ajouter l’accès à LDAP',
48
+    'bouton_ajouter' => 'Ajouter',
49
+    'bouton_annuler' => 'Annuler',
50
+    'bouton_cache_activer' => 'Réactiver le cache',
51
+    'bouton_cache_desactiver' => 'Désactiver temporairement le cache',
52
+    'bouton_demande_publication' => 'Demander la publication de cet article',
53
+    'bouton_desactive_tout' => 'Tout désactiver',
54
+    'bouton_desinstaller' => 'Désinstaller',
55
+    'bouton_effacer_tout' => 'Effacer TOUT',
56
+    'bouton_envoyer_message' => 'Message définitif : envoyer',
57
+    'bouton_fermer' => 'Fermer',
58
+    'bouton_mettre_a_jour_base' => 'Mettre à jour la base de données',
59
+    'bouton_modifier' => 'Modifier',
60
+    'bouton_radio_afficher' => 'Afficher',
61
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Apparaître dans la liste des rédacteurs connectés',
62
+    'bouton_radio_envoi_annonces_adresse' => 'Envoyer les annonces à l’adresse :',
63
+    'bouton_radio_envoi_liste_nouveautes' => 'Envoyer la liste des nouveautés',
64
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Ne pas apparaître dans la liste des rédacteurs',
65
+    'bouton_radio_non_envoi_annonces_editoriales' => 'Ne pas envoyer d’annonces éditoriales',
66
+    'bouton_redirection' => 'REDIRECTION',
67
+    'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Réinitialiser aux valeurs par défaut',
68
+    'bouton_relancer_inscription' => 'Relancer l’inscription',
69
+    'bouton_relancer_inscriptions' => 'Relancer les inscriptions',
70
+    'bouton_relancer_installation' => 'Relancer l’installation',
71
+    'bouton_reset_password' => 'Générer un nouveau mot de passe et l’envoyer par email',
72
+    'bouton_suivant' => 'Suivant',
73
+    'bouton_tenter_recuperation' => 'Tenter une réparation',
74
+    'bouton_test_proxy' => 'Essayer le proxy',
75
+    'bouton_vider_cache' => 'Vider le cache',
76 76
 
77
-	// C
78
-	'cache_modifiable_webmestre' => 'Ce paramètre est modifiable par le webmestre du site.',
79
-	'calendrier_synchro' => 'Si vous utilisez un logiciel d’agenda compatible <b>iCal</b>, vous pouvez le synchroniser avec les informations de ce site.',
80
-	'config_activer_champs' => 'Activer les champs suivants',
81
-	'config_choix_base_sup' => 'indiquer une base sur ce serveur',
82
-	'config_erreur_base_sup' => 'SPIP n’a pas accès à la liste des bases accessibles',
83
-	'config_info_base_sup' => 'Si vous avez d’autres bases de données à interroger à travers SPIP, avec son serveur SQL ou avec un autre, le formulaire ci-dessous, vous permet de les déclarer. Si vous laissez certains champs vides, les identifiants de connexion à la base principale seront utilisés.',
84
-	'config_info_base_sup_disponibles' => 'Bases supplémentaires déjà interrogeables :',
85
-	'config_info_enregistree' => 'La nouvelle configuration a été enregistrée',
86
-	'config_info_logos' => 'Chaque élément du site peut avoir un logo, ainsi qu’un « logo de survol »',
87
-	'config_info_logos_utiliser' => 'Utiliser les logos',
88
-	'config_info_logos_utiliser_non' => 'Ne pas utiliser les logos',
89
-	'config_info_logos_utiliser_survol' => 'Utiliser les logos de survol',
90
-	'config_info_logos_utiliser_survol_non' => 'Ne pas utiliser les logos de survol',
91
-	'config_info_redirection' => 'En activant cette option, vous pourrez créer des articles virtuels, simples références d’articles publiés sur d’autres sites ou hors de SPIP.',
92
-	'config_redirection' => 'Articles virtuels',
93
-	'config_titre_base_sup' => 'Déclaration d’une base supplémentaire',
94
-	'config_titre_base_sup_choix' => 'Choisissez une base supplémentaire',
95
-	'connexion_ldap' => 'Connexion :',
96
-	'creer_et_associer_un_auteur' => 'Créer et associer un auteur',
77
+    // C
78
+    'cache_modifiable_webmestre' => 'Ce paramètre est modifiable par le webmestre du site.',
79
+    'calendrier_synchro' => 'Si vous utilisez un logiciel d’agenda compatible <b>iCal</b>, vous pouvez le synchroniser avec les informations de ce site.',
80
+    'config_activer_champs' => 'Activer les champs suivants',
81
+    'config_choix_base_sup' => 'indiquer une base sur ce serveur',
82
+    'config_erreur_base_sup' => 'SPIP n’a pas accès à la liste des bases accessibles',
83
+    'config_info_base_sup' => 'Si vous avez d’autres bases de données à interroger à travers SPIP, avec son serveur SQL ou avec un autre, le formulaire ci-dessous, vous permet de les déclarer. Si vous laissez certains champs vides, les identifiants de connexion à la base principale seront utilisés.',
84
+    'config_info_base_sup_disponibles' => 'Bases supplémentaires déjà interrogeables :',
85
+    'config_info_enregistree' => 'La nouvelle configuration a été enregistrée',
86
+    'config_info_logos' => 'Chaque élément du site peut avoir un logo, ainsi qu’un « logo de survol »',
87
+    'config_info_logos_utiliser' => 'Utiliser les logos',
88
+    'config_info_logos_utiliser_non' => 'Ne pas utiliser les logos',
89
+    'config_info_logos_utiliser_survol' => 'Utiliser les logos de survol',
90
+    'config_info_logos_utiliser_survol_non' => 'Ne pas utiliser les logos de survol',
91
+    'config_info_redirection' => 'En activant cette option, vous pourrez créer des articles virtuels, simples références d’articles publiés sur d’autres sites ou hors de SPIP.',
92
+    'config_redirection' => 'Articles virtuels',
93
+    'config_titre_base_sup' => 'Déclaration d’une base supplémentaire',
94
+    'config_titre_base_sup_choix' => 'Choisissez une base supplémentaire',
95
+    'connexion_ldap' => 'Connexion :',
96
+    'creer_et_associer_un_auteur' => 'Créer et associer un auteur',
97 97
 
98
-	// D
99
-	'date_mot_heures' => 'heures',
98
+    // D
99
+    'date_mot_heures' => 'heures',
100 100
 
101
-	// E
102
-	'ecran_connexion_couleur_principale' => 'Couleur principale',
103
-	'ecran_connexion_image_fond' => 'Image de fond',
104
-	'ecran_connexion_image_fond_explication' => 'Utiliser une image (format JPEG, 1920x1080 pixels)',
105
-	'ecran_connexion_image_revenir_couleur_defaut' => 'Revenir à la couleur par défaut',
106
-	'ecran_connexion_titre' => 'Écran de connexion',
107
-	'ecran_securite' => ' + écran de sécurité @version@',
108
-	'email' => 'email',
109
-	'email_2' => 'email :',
110
-	'en_savoir_plus' => 'En savoir plus',
111
-	'entree_adresse_annuaire' => 'Adresse de l’annuaire',
112
-	'entree_adresse_email' => 'Votre adresse email',
113
-	'entree_adresse_email_2' => 'Adresse email',
114
-	'entree_base_donnee_1' => 'Adresse de la base de données',
115
-	'entree_base_donnee_2' => '(Souvent cette adresse correspond à celle de votre site, parfois elle correspond à la mention « localhost », parfois elle est laissée totalement vide.)',
116
-	'entree_biographie' => 'Courte biographie en quelques mots.',
117
-	'entree_chemin_acces' => '<b>Entrer</b> le chemin d’accès :',
118
-	'entree_cle_pgp' => 'Votre clé PGP',
119
-	'entree_cle_pgp_2' => 'Clé PGP',
120
-	'entree_contenu_rubrique' => '(Contenu de la rubrique en quelques mots.)',
121
-	'entree_identifiants_connexion' => 'Vos identifiants de connexion...',
122
-	'entree_identifiants_connexion_2' => 'Identifiants de connexion',
123
-	'entree_informations_connexion_ldap' => 'Veuillez entrer dans ce formulaire les informations de connexion à votre annuaire LDAP.
101
+    // E
102
+    'ecran_connexion_couleur_principale' => 'Couleur principale',
103
+    'ecran_connexion_image_fond' => 'Image de fond',
104
+    'ecran_connexion_image_fond_explication' => 'Utiliser une image (format JPEG, 1920x1080 pixels)',
105
+    'ecran_connexion_image_revenir_couleur_defaut' => 'Revenir à la couleur par défaut',
106
+    'ecran_connexion_titre' => 'Écran de connexion',
107
+    'ecran_securite' => ' + écran de sécurité @version@',
108
+    'email' => 'email',
109
+    'email_2' => 'email :',
110
+    'en_savoir_plus' => 'En savoir plus',
111
+    'entree_adresse_annuaire' => 'Adresse de l’annuaire',
112
+    'entree_adresse_email' => 'Votre adresse email',
113
+    'entree_adresse_email_2' => 'Adresse email',
114
+    'entree_base_donnee_1' => 'Adresse de la base de données',
115
+    'entree_base_donnee_2' => '(Souvent cette adresse correspond à celle de votre site, parfois elle correspond à la mention « localhost », parfois elle est laissée totalement vide.)',
116
+    'entree_biographie' => 'Courte biographie en quelques mots.',
117
+    'entree_chemin_acces' => '<b>Entrer</b> le chemin d’accès :',
118
+    'entree_cle_pgp' => 'Votre clé PGP',
119
+    'entree_cle_pgp_2' => 'Clé PGP',
120
+    'entree_contenu_rubrique' => '(Contenu de la rubrique en quelques mots.)',
121
+    'entree_identifiants_connexion' => 'Vos identifiants de connexion...',
122
+    'entree_identifiants_connexion_2' => 'Identifiants de connexion',
123
+    'entree_informations_connexion_ldap' => 'Veuillez entrer dans ce formulaire les informations de connexion à votre annuaire LDAP.
124 124
 	Ces informations doivent pouvoir vous être fournies par l’administrateur du système,
125 125
 	ou du réseau.',
126
-	'entree_infos_perso' => 'Qui êtes-vous ?',
127
-	'entree_infos_perso_2' => 'Qui est l’auteur ?',
128
-	'entree_interieur_rubrique' => 'À l’intérieur de la rubrique :',
129
-	'entree_liens_sites' => '<b>Lien hypertexte</b> (référence, site à visiter...)',
130
-	'entree_login' => 'Votre login',
131
-	'entree_login_connexion_1' => 'Le login de connexion',
132
-	'entree_login_connexion_2' => '(Correspond parfois à votre login d’accès au FTP ; parfois laissé vide)',
133
-	'entree_mot_passe' => 'Votre mot de passe',
134
-	'entree_mot_passe_1' => 'Le mot de passe de connexion',
135
-	'entree_mot_passe_2' => '(Correspond parfois à votre mot de passe pour le FTP ; parfois laissé vide)',
136
-	'entree_nom_fichier' => 'Veuillez entrer le nom du fichier @texte_compresse@ :',
137
-	'entree_nom_pseudo' => 'Votre nom ou votre pseudo',
138
-	'entree_nom_pseudo_1' => '(Votre nom ou votre pseudo)',
139
-	'entree_nom_pseudo_2' => 'Nom ou pseudo',
140
-	'entree_nom_site' => 'Le nom de votre site',
141
-	'entree_nom_site_2' => 'Nom du site de l’auteur',
142
-	'entree_nouveau_passe' => 'Nouveau mot de passe',
143
-	'entree_passe_ldap' => 'Mot de passe',
144
-	'entree_port_annuaire' => 'Le numéro de port de l’annuaire',
145
-	'entree_signature' => 'Signature',
146
-	'entree_titre_obligatoire' => '<b>Titre</b> [Obligatoire]<br />',
147
-	'entree_url' => 'L’adresse (URL) de votre site',
148
-	'entree_url_2' => 'Adresse (URL) du site',
149
-	'erreur_connect_deja_existant' => 'Un serveur existe déjà avec ce nom',
150
-	'erreur_contenu_suspect' => 'Texte échappé',
151
-	'erreur_email_deja_existant' => 'Cette adresse email est déjà enregistrée.',
152
-	'erreur_nom_connect_incorrect' => 'Ce nom de serveur n’est pas autorisé',
153
-	'erreur_plugin_attribut_balise_manquant' => 'Attribut @attribut@ manquant dans la balise @balise@.',
154
-	'erreur_plugin_desinstalation_echouee' => 'La désinstallation du plugin a échoué. Vous pouvez néanmoins le désactiver.',
155
-	'erreur_plugin_fichier_absent' => 'Fichier absent',
156
-	'erreur_plugin_fichier_def_absent' => 'Fichier de définition absent',
157
-	'erreur_plugin_nom_fonction_interdit' => 'Nom de fonction interdit',
158
-	'erreur_plugin_nom_manquant' => 'Nom du plugin manquant',
159
-	'erreur_plugin_prefix_manquant' => 'Espace de nommage du plugin non défini',
160
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; manquant dans le fichier de définition',
161
-	'erreur_plugin_version_manquant' => 'Version du plugin manquante',
162
-	'erreur_type_fichier' => 'Type de fichier incorrect',
126
+    'entree_infos_perso' => 'Qui êtes-vous ?',
127
+    'entree_infos_perso_2' => 'Qui est l’auteur ?',
128
+    'entree_interieur_rubrique' => 'À l’intérieur de la rubrique :',
129
+    'entree_liens_sites' => '<b>Lien hypertexte</b> (référence, site à visiter...)',
130
+    'entree_login' => 'Votre login',
131
+    'entree_login_connexion_1' => 'Le login de connexion',
132
+    'entree_login_connexion_2' => '(Correspond parfois à votre login d’accès au FTP ; parfois laissé vide)',
133
+    'entree_mot_passe' => 'Votre mot de passe',
134
+    'entree_mot_passe_1' => 'Le mot de passe de connexion',
135
+    'entree_mot_passe_2' => '(Correspond parfois à votre mot de passe pour le FTP ; parfois laissé vide)',
136
+    'entree_nom_fichier' => 'Veuillez entrer le nom du fichier @texte_compresse@ :',
137
+    'entree_nom_pseudo' => 'Votre nom ou votre pseudo',
138
+    'entree_nom_pseudo_1' => '(Votre nom ou votre pseudo)',
139
+    'entree_nom_pseudo_2' => 'Nom ou pseudo',
140
+    'entree_nom_site' => 'Le nom de votre site',
141
+    'entree_nom_site_2' => 'Nom du site de l’auteur',
142
+    'entree_nouveau_passe' => 'Nouveau mot de passe',
143
+    'entree_passe_ldap' => 'Mot de passe',
144
+    'entree_port_annuaire' => 'Le numéro de port de l’annuaire',
145
+    'entree_signature' => 'Signature',
146
+    'entree_titre_obligatoire' => '<b>Titre</b> [Obligatoire]<br />',
147
+    'entree_url' => 'L’adresse (URL) de votre site',
148
+    'entree_url_2' => 'Adresse (URL) du site',
149
+    'erreur_connect_deja_existant' => 'Un serveur existe déjà avec ce nom',
150
+    'erreur_contenu_suspect' => 'Texte échappé',
151
+    'erreur_email_deja_existant' => 'Cette adresse email est déjà enregistrée.',
152
+    'erreur_nom_connect_incorrect' => 'Ce nom de serveur n’est pas autorisé',
153
+    'erreur_plugin_attribut_balise_manquant' => 'Attribut @attribut@ manquant dans la balise @balise@.',
154
+    'erreur_plugin_desinstalation_echouee' => 'La désinstallation du plugin a échoué. Vous pouvez néanmoins le désactiver.',
155
+    'erreur_plugin_fichier_absent' => 'Fichier absent',
156
+    'erreur_plugin_fichier_def_absent' => 'Fichier de définition absent',
157
+    'erreur_plugin_nom_fonction_interdit' => 'Nom de fonction interdit',
158
+    'erreur_plugin_nom_manquant' => 'Nom du plugin manquant',
159
+    'erreur_plugin_prefix_manquant' => 'Espace de nommage du plugin non défini',
160
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; manquant dans le fichier de définition',
161
+    'erreur_plugin_version_manquant' => 'Version du plugin manquante',
162
+    'erreur_type_fichier' => 'Type de fichier incorrect',
163 163
 
164
-	// H
165
-	'htaccess_a_simuler' => 'Avertissement : la configuration de votre serveur HTTP ne tient pas compte des fichiers @htaccess@. Pour pouvoir assurer une bonne sécurité, il faut que vous modifiiez cette configuration sur ce point, ou bien que les constantes @constantes@ (définissables dans le fichier mes_options.php) aient comme valeur des répertoires en dehors de @document_root@.',
166
-	'htaccess_inoperant' => 'htaccess inopérant',
164
+    // H
165
+    'htaccess_a_simuler' => 'Avertissement : la configuration de votre serveur HTTP ne tient pas compte des fichiers @htaccess@. Pour pouvoir assurer une bonne sécurité, il faut que vous modifiiez cette configuration sur ce point, ou bien que les constantes @constantes@ (définissables dans le fichier mes_options.php) aient comme valeur des répertoires en dehors de @document_root@.',
166
+    'htaccess_inoperant' => 'htaccess inopérant',
167 167
 
168
-	// I
169
-	'ical_info1' => 'Cette page présente plusieurs méthodes pour rester en contact avec la vie de ce site.',
170
-	'ical_info2' => 'Pour plus de renseignements sur toutes ces techniques, n’hésitez pas à consulter <a href="@spipnet@">la documentation de SPIP</a>.',
171
-	'ical_info_calendrier' => 'Deux calendriers sont à votre disposition. Le premier est un plan du site annonçant tous les articles publiés. Le second contient les annonces éditoriales ainsi que vos derniers messages privés : il vous est réservé grâce à une clé personnelle, que vous pouvez modifier à tout moment en renouvelant votre mot de passe.',
172
-	'ical_methode_http' => 'Téléchargement',
173
-	'ical_methode_webcal' => 'Synchronisation (webcal://)',
174
-	'ical_texte_prive' => 'Ce calendrier, à usage strictement personnel, vous informe de l’activité éditoriale privée de ce site (tâches et rendez-vous personnels, articles et brèves proposés...).',
175
-	'ical_texte_public' => 'Ce calendrier vous permet de suivre l’activité publique de ce site (articles et brèves publiés).',
176
-	'ical_texte_rss' => 'Vous pouvez syndiquer les nouveautés de ce site dans n’importe quel lecteur de fichiers au format XML/RSS (Rich Site Summary). C’est aussi le format qui permet à SPIP de lire les nouveautés publiées sur d’autres sites utilisant un format d’échange compatible (sites syndiqués).',
177
-	'ical_titre_js' => 'Javascript',
178
-	'ical_titre_mailing' => 'Mailing-list',
179
-	'ical_titre_rss' => 'Fichiers de syndication',
180
-	'icone_accueil' => 'Accueil',
181
-	'icone_activer_cookie' => 'Activer le cookie de correspondance',
182
-	'icone_activite' => 'Activité',
183
-	'icone_admin_plugin' => 'Gestion des plugins',
184
-	'icone_administration' => 'Maintenance',
185
-	'icone_afficher_auteurs' => 'Afficher les auteurs',
186
-	'icone_afficher_visiteurs' => 'Afficher les visiteurs',
187
-	'icone_arret_discussion' => 'Ne plus participer à cette discussion',
188
-	'icone_calendrier' => 'Calendrier',
189
-	'icone_configuration' => 'Configuration',
190
-	'icone_creer_auteur' => 'Créer un nouvel auteur et l’associer à cet article',
191
-	'icone_creer_mot_cle' => 'Créer un nouveau mot-clé et le lier à cet article',
192
-	'icone_creer_rubrique_2' => 'Créer une nouvelle rubrique',
193
-	'icone_developpement' => 'Développement',
194
-	'icone_edition' => 'Édition',
195
-	'icone_ma_langue' => 'Ma langue',
196
-	'icone_mes_infos' => 'Mes informations',
197
-	'icone_mes_preferences' => 'Mes préférences',
198
-	'icone_modifier_article' => 'Modifier cet article',
199
-	'icone_modifier_rubrique' => 'Modifier cette rubrique',
200
-	'icone_publication' => 'Publication',
201
-	'icone_relancer_signataire' => 'Relancer le signataire',
202
-	'icone_retour' => 'Retour',
203
-	'icone_retour_article' => 'Retour à l’article',
204
-	'icone_squelette' => 'Squelettes',
205
-	'icone_suivi_publication' => 'Suivi de la publication',
206
-	'icone_supprimer_cookie' => 'Supprimer le cookie de correspondance',
207
-	'icone_supprimer_rubrique' => 'Supprimer cette rubrique',
208
-	'icone_supprimer_signature' => 'Supprimer cette signature',
209
-	'icone_valider_signature' => 'Valider cette signature',
210
-	'image_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
211
-	'impossible_modifier_login_auteur' => 'Impossible de modifier le login.',
212
-	'impossible_modifier_pass_auteur' => 'Impossible de modifier le mot de passe.',
213
-	'info_1_article' => '1 article',
214
-	'info_1_auteur' => '1 auteur',
215
-	'info_1_message' => '1 message',
216
-	'info_1_mot_cle' => '1 mot-clé',
217
-	'info_1_rubrique' => '1 rubrique',
218
-	'info_1_visiteur' => '1 visiteur',
219
-	'info_activer_cookie' => 'Vous pouvez activer un <b>cookie de correspondance</b>, ce qui vous
168
+    // I
169
+    'ical_info1' => 'Cette page présente plusieurs méthodes pour rester en contact avec la vie de ce site.',
170
+    'ical_info2' => 'Pour plus de renseignements sur toutes ces techniques, n’hésitez pas à consulter <a href="@spipnet@">la documentation de SPIP</a>.',
171
+    'ical_info_calendrier' => 'Deux calendriers sont à votre disposition. Le premier est un plan du site annonçant tous les articles publiés. Le second contient les annonces éditoriales ainsi que vos derniers messages privés : il vous est réservé grâce à une clé personnelle, que vous pouvez modifier à tout moment en renouvelant votre mot de passe.',
172
+    'ical_methode_http' => 'Téléchargement',
173
+    'ical_methode_webcal' => 'Synchronisation (webcal://)',
174
+    'ical_texte_prive' => 'Ce calendrier, à usage strictement personnel, vous informe de l’activité éditoriale privée de ce site (tâches et rendez-vous personnels, articles et brèves proposés...).',
175
+    'ical_texte_public' => 'Ce calendrier vous permet de suivre l’activité publique de ce site (articles et brèves publiés).',
176
+    'ical_texte_rss' => 'Vous pouvez syndiquer les nouveautés de ce site dans n’importe quel lecteur de fichiers au format XML/RSS (Rich Site Summary). C’est aussi le format qui permet à SPIP de lire les nouveautés publiées sur d’autres sites utilisant un format d’échange compatible (sites syndiqués).',
177
+    'ical_titre_js' => 'Javascript',
178
+    'ical_titre_mailing' => 'Mailing-list',
179
+    'ical_titre_rss' => 'Fichiers de syndication',
180
+    'icone_accueil' => 'Accueil',
181
+    'icone_activer_cookie' => 'Activer le cookie de correspondance',
182
+    'icone_activite' => 'Activité',
183
+    'icone_admin_plugin' => 'Gestion des plugins',
184
+    'icone_administration' => 'Maintenance',
185
+    'icone_afficher_auteurs' => 'Afficher les auteurs',
186
+    'icone_afficher_visiteurs' => 'Afficher les visiteurs',
187
+    'icone_arret_discussion' => 'Ne plus participer à cette discussion',
188
+    'icone_calendrier' => 'Calendrier',
189
+    'icone_configuration' => 'Configuration',
190
+    'icone_creer_auteur' => 'Créer un nouvel auteur et l’associer à cet article',
191
+    'icone_creer_mot_cle' => 'Créer un nouveau mot-clé et le lier à cet article',
192
+    'icone_creer_rubrique_2' => 'Créer une nouvelle rubrique',
193
+    'icone_developpement' => 'Développement',
194
+    'icone_edition' => 'Édition',
195
+    'icone_ma_langue' => 'Ma langue',
196
+    'icone_mes_infos' => 'Mes informations',
197
+    'icone_mes_preferences' => 'Mes préférences',
198
+    'icone_modifier_article' => 'Modifier cet article',
199
+    'icone_modifier_rubrique' => 'Modifier cette rubrique',
200
+    'icone_publication' => 'Publication',
201
+    'icone_relancer_signataire' => 'Relancer le signataire',
202
+    'icone_retour' => 'Retour',
203
+    'icone_retour_article' => 'Retour à l’article',
204
+    'icone_squelette' => 'Squelettes',
205
+    'icone_suivi_publication' => 'Suivi de la publication',
206
+    'icone_supprimer_cookie' => 'Supprimer le cookie de correspondance',
207
+    'icone_supprimer_rubrique' => 'Supprimer cette rubrique',
208
+    'icone_supprimer_signature' => 'Supprimer cette signature',
209
+    'icone_valider_signature' => 'Valider cette signature',
210
+    'image_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
211
+    'impossible_modifier_login_auteur' => 'Impossible de modifier le login.',
212
+    'impossible_modifier_pass_auteur' => 'Impossible de modifier le mot de passe.',
213
+    'info_1_article' => '1 article',
214
+    'info_1_auteur' => '1 auteur',
215
+    'info_1_message' => '1 message',
216
+    'info_1_mot_cle' => '1 mot-clé',
217
+    'info_1_rubrique' => '1 rubrique',
218
+    'info_1_visiteur' => '1 visiteur',
219
+    'info_activer_cookie' => 'Vous pouvez activer un <b>cookie de correspondance</b>, ce qui vous
220 220
 	permettra de passer facilement du site public au site privé.',
221
-	'info_activer_menu_developpement' => 'Afficher le menu Développement',
222
-	'info_admin_etre_webmestre' => 'Me donner les droits de webmestre',
223
-	'info_admin_je_suis_webmestre' => 'Je suis <b>webmestre</b>',
224
-	'info_admin_statuer_webmestre' => 'Donner à cet administrateur les droits de webmestre',
225
-	'info_admin_webmestre' => 'Cet administrateur est <b>webmestre</b>',
226
-	'info_administrateur' => 'Administrateur',
227
-	'info_administrateur_1' => 'Administrateur',
228
-	'info_administrateur_2' => 'du site (<i>utilisez avec précaution</i>)',
229
-	'info_administrateur_site_01' => 'Si vous êtes administrateur du site, veuillez',
230
-	'info_administrateur_site_02' => 'cliquer sur ce lien',
231
-	'info_administrateurs' => 'Administrateurs',
232
-	'info_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
233
-	'info_adresse' => 'à l’adresse :',
234
-	'info_adresse_desinscription' => 'Adresse de désinscription :',
235
-	'info_adresse_url' => 'Adresse (URL) du site public',
236
-	'info_afficher_par_nb' => 'Afficher par',
237
-	'info_aide_en_ligne' => 'Aide en ligne SPIP',
238
-	'info_ajout_image' => 'Lorsque vous ajoutez des images en tant que documents joints à un article,
221
+    'info_activer_menu_developpement' => 'Afficher le menu Développement',
222
+    'info_admin_etre_webmestre' => 'Me donner les droits de webmestre',
223
+    'info_admin_je_suis_webmestre' => 'Je suis <b>webmestre</b>',
224
+    'info_admin_statuer_webmestre' => 'Donner à cet administrateur les droits de webmestre',
225
+    'info_admin_webmestre' => 'Cet administrateur est <b>webmestre</b>',
226
+    'info_administrateur' => 'Administrateur',
227
+    'info_administrateur_1' => 'Administrateur',
228
+    'info_administrateur_2' => 'du site (<i>utilisez avec précaution</i>)',
229
+    'info_administrateur_site_01' => 'Si vous êtes administrateur du site, veuillez',
230
+    'info_administrateur_site_02' => 'cliquer sur ce lien',
231
+    'info_administrateurs' => 'Administrateurs',
232
+    'info_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
233
+    'info_adresse' => 'à l’adresse :',
234
+    'info_adresse_desinscription' => 'Adresse de désinscription :',
235
+    'info_adresse_url' => 'Adresse (URL) du site public',
236
+    'info_afficher_par_nb' => 'Afficher par',
237
+    'info_aide_en_ligne' => 'Aide en ligne SPIP',
238
+    'info_ajout_image' => 'Lorsque vous ajoutez des images en tant que documents joints à un article,
239 239
 		SPIP peut créer pour vous, automatiquement, des vignettes (miniatures) des
240 240
 		images insérées. Cela permet par exemple de créer
241 241
 		automatiquement une galerie ou un portfolio.',
242
-	'info_ajouter_rubrique' => 'Ajouter une autre rubrique à administrer :',
243
-	'info_annonce_nouveautes' => 'Annonce des nouveautés',
244
-	'info_article' => 'article',
245
-	'info_article_2' => 'articles',
246
-	'info_article_a_paraitre' => 'Les articles post-datés à paraître',
247
-	'info_articles_02' => 'articles',
248
-	'info_articles_2' => 'Articles',
249
-	'info_articles_auteur' => 'Les articles de cet auteur',
250
-	'info_articles_miens' => 'Mes articles',
251
-	'info_articles_tous' => 'Tous les articles',
252
-	'info_articles_trouves' => 'Articles trouvés',
253
-	'info_attente_validation' => 'Vos articles en attente de validation',
254
-	'info_aucun_article' => 'Aucun article',
255
-	'info_aucun_auteur' => 'Aucun auteur',
256
-	'info_aucun_message' => 'Aucun message',
257
-	'info_aucun_rubrique' => 'Aucune rubrique',
258
-	'info_aujourdhui' => 'aujourd’hui :',
259
-	'info_auteur_gere_rubriques' => 'Cet auteur gère les rubriques suivantes :',
260
-	'info_auteur_gere_toutes_rubriques' => 'Cet auteur gère <b>toutes les rubriques</b>',
261
-	'info_auteur_gere_toutes_rubriques_2' => 'Je gère <b>toutes les rubriques</b>',
262
-	'info_auteurs' => 'Les auteurs',
263
-	'info_auteurs_par_tri' => 'Auteurs@partri@',
264
-	'info_auteurs_trouves' => 'Auteurs trouvés',
265
-	'info_authentification_externe' => 'Authentification externe',
266
-	'info_avertissement' => 'Avertissement',
267
-	'info_barre_outils' => 'avec sa barre d’outils ?',
268
-	'info_base_installee' => 'La structure de votre base de données est installée.',
269
-	'info_bio' => 'Biographie',
270
-	'info_cache_desactive' => 'Le cache est temporairement désactivé.',
271
-	'info_chapeau' => 'Chapeau',
272
-	'info_chapeau_2' => 'Chapeau :',
273
-	'info_chemin_acces_1' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
274
-	'info_chemin_acces_2' => 'Vous devez désormais configurer le chemin d’accès aux informations dans l’annuaire. Cette information est indispensable pour lire les profils utilisateurs stockés dans l’annuaire.',
275
-	'info_chemin_acces_annuaire' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
276
-	'info_choix_base' => 'Troisième étape :',
277
-	'info_classement_1' => '<sup>er</sup> sur @liste@',
278
-	'info_classement_2' => '<sup>e</sup> sur @liste@',
279
-	'info_code_acces' => 'N’oubliez pas vos propres codes d’accès !',
280
-	'info_config_suivi' => 'Si cette adresse correspond à une mailing-list, vous pouvez indiquer ci-dessous l’adresse à laquelle les participants au site peuvent s’inscrire. Cette adresse peut être une URL (par exemple la page d’inscription à la liste par le Web), ou une adresse email dotée d’un sujet spécifique (par exemple : <tt>@adresse_suivi@?subject=subscribe</tt>) :',
281
-	'info_config_suivi_explication' => 'Vous pouvez vous abonner à la mailing-list de ce site. Vous recevrez alors par courrier électronique les annonces d’articles et de brèves proposés à la publication.',
282
-	'info_confirmer_passe' => 'Confirmer ce nouveau mot de passe :',
283
-	'info_conflit_edition_avis_non_sauvegarde' => 'Attention, les champs suivants ont été modifiés par ailleurs. Vos modifications sur ces champs n’ont donc pas été enregistrées.',
284
-	'info_conflit_edition_differences' => 'Différences :',
285
-	'info_conflit_edition_version_enregistree' => 'La version enregistrée :',
286
-	'info_conflit_edition_votre_version' => 'Votre version :',
287
-	'info_connexion_base' => 'Essai de connexion à la base',
288
-	'info_connexion_base_donnee' => 'Connexion à votre base de données',
289
-	'info_connexion_ldap_ok' => '<b>La connexion LDAP a réussi.</b><p> Vous pouvez passer à l’étape suivante.</p>',
290
-	'info_connexion_mysql' => 'Votre connexion SQL',
291
-	'info_connexion_ok' => 'La connexion a réussi.',
292
-	'info_contact' => 'Contact',
293
-	'info_contenu_articles' => 'Contenu des articles',
294
-	'info_contributions' => 'Contributions',
295
-	'info_creation_paragraphe' => 'Pour créer des paragraphes, laissez simplement des lignes vides.',
296
-	'info_creation_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer au moins une rubrique.<br />',
297
-	'info_creation_tables' => 'Création des tables de la base',
298
-	'info_creer_base' => '<b>Créer</b> une nouvelle base de données :',
299
-	'info_dans_rubrique' => 'Dans la rubrique :',
300
-	'info_date_publication_anterieure' => 'Date de rédaction antérieure :',
301
-	'info_date_referencement' => 'DATE DE RÉFÉRENCEMENT DE CE SITE :',
302
-	'info_derniere_etape' => 'C’est terminé !',
303
-	'info_descriptif' => 'Descriptif :',
304
-	'info_desinstaller_plugin' => 'supprime les données et désactive le plugin',
305
-	'info_discussion_cours' => 'Discussions en cours',
306
-	'info_ecrire_article' => 'Avant de pouvoir écrire des articles, vous devez créer au moins une rubrique.',
307
-	'info_email_envoi' => 'Adresse email d’envoi (optionnel)',
308
-	'info_email_envoi_txt' => 'Indiquez ici l’adresse à utiliser pour envoyer les emails (à défaut, l’adresse destinataire sera utilisée comme adresse d’envoi) :',
309
-	'info_email_webmestre' => 'Adresse email du webmestre',
310
-	'info_envoi_email_automatique' => 'Envoi de mails automatique',
311
-	'info_envoyer_maintenant' => 'Envoyer maintenant',
312
-	'info_etape_suivante' => 'Passer à l’étape suivante',
313
-	'info_etape_suivante_1' => 'Vous pouvez passer à l’étape suivante.',
314
-	'info_etape_suivante_2' => 'Vous pouvez passer à l’étape suivante.',
315
-	'info_exceptions_proxy' => 'Exceptions pour le proxy',
316
-	'info_exportation_base' => 'exportation de la base vers @archive@',
317
-	'info_facilite_suivi_activite' => 'Afin de faciliter le suivi de l’activité
242
+    'info_ajouter_rubrique' => 'Ajouter une autre rubrique à administrer :',
243
+    'info_annonce_nouveautes' => 'Annonce des nouveautés',
244
+    'info_article' => 'article',
245
+    'info_article_2' => 'articles',
246
+    'info_article_a_paraitre' => 'Les articles post-datés à paraître',
247
+    'info_articles_02' => 'articles',
248
+    'info_articles_2' => 'Articles',
249
+    'info_articles_auteur' => 'Les articles de cet auteur',
250
+    'info_articles_miens' => 'Mes articles',
251
+    'info_articles_tous' => 'Tous les articles',
252
+    'info_articles_trouves' => 'Articles trouvés',
253
+    'info_attente_validation' => 'Vos articles en attente de validation',
254
+    'info_aucun_article' => 'Aucun article',
255
+    'info_aucun_auteur' => 'Aucun auteur',
256
+    'info_aucun_message' => 'Aucun message',
257
+    'info_aucun_rubrique' => 'Aucune rubrique',
258
+    'info_aujourdhui' => 'aujourd’hui :',
259
+    'info_auteur_gere_rubriques' => 'Cet auteur gère les rubriques suivantes :',
260
+    'info_auteur_gere_toutes_rubriques' => 'Cet auteur gère <b>toutes les rubriques</b>',
261
+    'info_auteur_gere_toutes_rubriques_2' => 'Je gère <b>toutes les rubriques</b>',
262
+    'info_auteurs' => 'Les auteurs',
263
+    'info_auteurs_par_tri' => 'Auteurs@partri@',
264
+    'info_auteurs_trouves' => 'Auteurs trouvés',
265
+    'info_authentification_externe' => 'Authentification externe',
266
+    'info_avertissement' => 'Avertissement',
267
+    'info_barre_outils' => 'avec sa barre d’outils ?',
268
+    'info_base_installee' => 'La structure de votre base de données est installée.',
269
+    'info_bio' => 'Biographie',
270
+    'info_cache_desactive' => 'Le cache est temporairement désactivé.',
271
+    'info_chapeau' => 'Chapeau',
272
+    'info_chapeau_2' => 'Chapeau :',
273
+    'info_chemin_acces_1' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
274
+    'info_chemin_acces_2' => 'Vous devez désormais configurer le chemin d’accès aux informations dans l’annuaire. Cette information est indispensable pour lire les profils utilisateurs stockés dans l’annuaire.',
275
+    'info_chemin_acces_annuaire' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
276
+    'info_choix_base' => 'Troisième étape :',
277
+    'info_classement_1' => '<sup>er</sup> sur @liste@',
278
+    'info_classement_2' => '<sup>e</sup> sur @liste@',
279
+    'info_code_acces' => 'N’oubliez pas vos propres codes d’accès !',
280
+    'info_config_suivi' => 'Si cette adresse correspond à une mailing-list, vous pouvez indiquer ci-dessous l’adresse à laquelle les participants au site peuvent s’inscrire. Cette adresse peut être une URL (par exemple la page d’inscription à la liste par le Web), ou une adresse email dotée d’un sujet spécifique (par exemple : <tt>@adresse_suivi@?subject=subscribe</tt>) :',
281
+    'info_config_suivi_explication' => 'Vous pouvez vous abonner à la mailing-list de ce site. Vous recevrez alors par courrier électronique les annonces d’articles et de brèves proposés à la publication.',
282
+    'info_confirmer_passe' => 'Confirmer ce nouveau mot de passe :',
283
+    'info_conflit_edition_avis_non_sauvegarde' => 'Attention, les champs suivants ont été modifiés par ailleurs. Vos modifications sur ces champs n’ont donc pas été enregistrées.',
284
+    'info_conflit_edition_differences' => 'Différences :',
285
+    'info_conflit_edition_version_enregistree' => 'La version enregistrée :',
286
+    'info_conflit_edition_votre_version' => 'Votre version :',
287
+    'info_connexion_base' => 'Essai de connexion à la base',
288
+    'info_connexion_base_donnee' => 'Connexion à votre base de données',
289
+    'info_connexion_ldap_ok' => '<b>La connexion LDAP a réussi.</b><p> Vous pouvez passer à l’étape suivante.</p>',
290
+    'info_connexion_mysql' => 'Votre connexion SQL',
291
+    'info_connexion_ok' => 'La connexion a réussi.',
292
+    'info_contact' => 'Contact',
293
+    'info_contenu_articles' => 'Contenu des articles',
294
+    'info_contributions' => 'Contributions',
295
+    'info_creation_paragraphe' => 'Pour créer des paragraphes, laissez simplement des lignes vides.',
296
+    'info_creation_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer au moins une rubrique.<br />',
297
+    'info_creation_tables' => 'Création des tables de la base',
298
+    'info_creer_base' => '<b>Créer</b> une nouvelle base de données :',
299
+    'info_dans_rubrique' => 'Dans la rubrique :',
300
+    'info_date_publication_anterieure' => 'Date de rédaction antérieure :',
301
+    'info_date_referencement' => 'DATE DE RÉFÉRENCEMENT DE CE SITE :',
302
+    'info_derniere_etape' => 'C’est terminé !',
303
+    'info_descriptif' => 'Descriptif :',
304
+    'info_desinstaller_plugin' => 'supprime les données et désactive le plugin',
305
+    'info_discussion_cours' => 'Discussions en cours',
306
+    'info_ecrire_article' => 'Avant de pouvoir écrire des articles, vous devez créer au moins une rubrique.',
307
+    'info_email_envoi' => 'Adresse email d’envoi (optionnel)',
308
+    'info_email_envoi_txt' => 'Indiquez ici l’adresse à utiliser pour envoyer les emails (à défaut, l’adresse destinataire sera utilisée comme adresse d’envoi) :',
309
+    'info_email_webmestre' => 'Adresse email du webmestre',
310
+    'info_envoi_email_automatique' => 'Envoi de mails automatique',
311
+    'info_envoyer_maintenant' => 'Envoyer maintenant',
312
+    'info_etape_suivante' => 'Passer à l’étape suivante',
313
+    'info_etape_suivante_1' => 'Vous pouvez passer à l’étape suivante.',
314
+    'info_etape_suivante_2' => 'Vous pouvez passer à l’étape suivante.',
315
+    'info_exceptions_proxy' => 'Exceptions pour le proxy',
316
+    'info_exportation_base' => 'exportation de la base vers @archive@',
317
+    'info_facilite_suivi_activite' => 'Afin de faciliter le suivi de l’activité
318 318
 		éditoriale du site, SPIP peut faire parvenir par mail, par exemple
319 319
 		à une mailing-list des rédacteurs, l’annonce des demandes de
320 320
 		publication et des validations d’articles. Indiquer une ou plusieurs adresses, séparées par des virgules.',
321
-	'info_fichiers_authent' => 'Fichiers d’authentification « .htpasswd »',
322
-	'info_forums_abo_invites' => 'Votre site comporte des forums sur abonnement ; les visiteurs sont donc invités à s’enregistrer sur le site public.',
323
-	'info_gauche_admin_tech' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
321
+    'info_fichiers_authent' => 'Fichiers d’authentification « .htpasswd »',
322
+    'info_forums_abo_invites' => 'Votre site comporte des forums sur abonnement ; les visiteurs sont donc invités à s’enregistrer sur le site public.',
323
+    'info_gauche_admin_tech' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
324 324
 fonctions de maintenance technique. Certaines d’entre elles donnent lieu à un processus d’authentification spécifique, qui
325 325
 exige d’avoir un accès FTP au site Web.</p>',
326
-	'info_gauche_admin_vider' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
326
+    'info_gauche_admin_vider' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
327 327
 fonctions de maintenance technique. Certaines d’entre elles donnent lieu à un processus d’authentification spécifique, qui
328 328
 exige d’avoir un accès FTP au site Web.</p>',
329
-	'info_gauche_auteurs' => 'Vous trouverez ici tous les auteurs du site.
329
+    'info_gauche_auteurs' => 'Vous trouverez ici tous les auteurs du site.
330 330
  Leur statut est indiqué par la couleur de leur icone (administrateur = vert ; rédacteur = jaune).',
331
-	'info_gauche_auteurs_exterieurs' => 'Les auteurs extérieurs, sans accès au site, sont indiqués par une icone bleue ;
331
+    'info_gauche_auteurs_exterieurs' => 'Les auteurs extérieurs, sans accès au site, sont indiqués par une icone bleue ;
332 332
 		les auteurs effacés par une icone grise.',
333
-	'info_gauche_messagerie' => 'La messagerie vous permet d’échanger des messages entre rédacteurs, de conserver des pense-bêtes (pour votre usage personnel) ou d’afficher des annonces sur la page d’accueil de l’espace privé (si vous êtes administrateur).',
334
-	'info_gauche_statistiques_referers' => 'Cette page présente la liste des <i>referers</i>, c’est-à-dire des sites contenant des liens menant vers votre propre site, uniquement pour hier et aujourd’hui ; cette liste est remise à zéro toutes les 24 heures.',
335
-	'info_gauche_visiteurs_enregistres' => 'Vous trouverez ici les visiteurs enregistrés
333
+    'info_gauche_messagerie' => 'La messagerie vous permet d’échanger des messages entre rédacteurs, de conserver des pense-bêtes (pour votre usage personnel) ou d’afficher des annonces sur la page d’accueil de l’espace privé (si vous êtes administrateur).',
334
+    'info_gauche_statistiques_referers' => 'Cette page présente la liste des <i>referers</i>, c’est-à-dire des sites contenant des liens menant vers votre propre site, uniquement pour hier et aujourd’hui ; cette liste est remise à zéro toutes les 24 heures.',
335
+    'info_gauche_visiteurs_enregistres' => 'Vous trouverez ici les visiteurs enregistrés
336 336
 	dans l’espace public du site (forums sur abonnement).',
337
-	'info_generation_miniatures_images' => 'Génération de miniatures des images',
338
-	'info_gerer_trad_objets' => '@objets@ : gérer les liens de traduction',
339
-	'info_hebergeur_desactiver_envoi_email' => 'Certains hébergeurs désactivent l’envoi automatique de
337
+    'info_generation_miniatures_images' => 'Génération de miniatures des images',
338
+    'info_gerer_trad_objets' => '@objets@ : gérer les liens de traduction',
339
+    'info_hebergeur_desactiver_envoi_email' => 'Certains hébergeurs désactivent l’envoi automatique de
340 340
 		mails depuis leurs serveurs. Dans ce cas, les fonctionnalités suivantes
341 341
 		de SPIP ne fonctionneront pas.',
342
-	'info_hier' => 'hier :',
343
-	'info_identification_publique' => 'Votre identité publique...',
344
-	'info_image_process' => 'Veuillez sélectionner la meilleure méthode de fabrication des vignettes en cliquant sur l’image correspondante.',
345
-	'info_image_process2' => 'Si aucune image n’apparaît, alors le serveur qui héberge votre site n’a pas été configuré pour utiliser de tels outils. Si vous souhaitez utiliser ces fonctions, contactez le responsable technique et demandez les extensions « GD » ou « Imagick ».',
346
-	'info_images_auto' => 'Images calculées automatiquement',
347
-	'info_informations_personnelles' => 'Informations personnelles',
348
-	'info_inscription' => 'Inscription le',
349
-	'info_inscription_automatique' => 'Inscription automatique de nouveaux rédacteurs',
350
-	'info_jeu_caractere' => 'Jeu de caractères du site',
351
-	'info_jours' => 'jours',
352
-	'info_laisser_champs_vides' => 'laisser ces champs vides)',
353
-	'info_langues' => 'Langues du site',
354
-	'info_ldap_ok' => 'L’authentification LDAP est installée.',
355
-	'info_lien_hypertexte' => 'Lien hypertexte :',
356
-	'info_liste_nouveautes_envoyee' => 'La liste des nouveautés a été envoyée',
357
-	'info_liste_redacteurs_connectes' => 'Liste des rédacteurs connectés',
358
-	'info_login_existant' => 'Ce login existe déjà.',
359
-	'info_login_trop_court' => 'Login trop court.',
360
-	'info_login_trop_court_car_pluriel' => 'Le login doit contenir au moins @nb@ caractères.',
361
-	'info_logos' => 'Les logos',
362
-	'info_maximum' => 'maximum :',
363
-	'info_meme_rubrique' => 'Dans la même rubrique',
364
-	'info_message_en_redaction' => 'Vos messages en cours de rédaction',
365
-	'info_message_technique' => 'Message technique :',
366
-	'info_messagerie_interne' => 'Messagerie interne',
367
-	'info_mise_a_niveau_base' => 'mise à niveau de votre base SQL',
368
-	'info_mise_a_niveau_base_2' => '{{Attention !}} Vous avez installé une version
342
+    'info_hier' => 'hier :',
343
+    'info_identification_publique' => 'Votre identité publique...',
344
+    'info_image_process' => 'Veuillez sélectionner la meilleure méthode de fabrication des vignettes en cliquant sur l’image correspondante.',
345
+    'info_image_process2' => 'Si aucune image n’apparaît, alors le serveur qui héberge votre site n’a pas été configuré pour utiliser de tels outils. Si vous souhaitez utiliser ces fonctions, contactez le responsable technique et demandez les extensions « GD » ou « Imagick ».',
346
+    'info_images_auto' => 'Images calculées automatiquement',
347
+    'info_informations_personnelles' => 'Informations personnelles',
348
+    'info_inscription' => 'Inscription le',
349
+    'info_inscription_automatique' => 'Inscription automatique de nouveaux rédacteurs',
350
+    'info_jeu_caractere' => 'Jeu de caractères du site',
351
+    'info_jours' => 'jours',
352
+    'info_laisser_champs_vides' => 'laisser ces champs vides)',
353
+    'info_langues' => 'Langues du site',
354
+    'info_ldap_ok' => 'L’authentification LDAP est installée.',
355
+    'info_lien_hypertexte' => 'Lien hypertexte :',
356
+    'info_liste_nouveautes_envoyee' => 'La liste des nouveautés a été envoyée',
357
+    'info_liste_redacteurs_connectes' => 'Liste des rédacteurs connectés',
358
+    'info_login_existant' => 'Ce login existe déjà.',
359
+    'info_login_trop_court' => 'Login trop court.',
360
+    'info_login_trop_court_car_pluriel' => 'Le login doit contenir au moins @nb@ caractères.',
361
+    'info_logos' => 'Les logos',
362
+    'info_maximum' => 'maximum :',
363
+    'info_meme_rubrique' => 'Dans la même rubrique',
364
+    'info_message_en_redaction' => 'Vos messages en cours de rédaction',
365
+    'info_message_technique' => 'Message technique :',
366
+    'info_messagerie_interne' => 'Messagerie interne',
367
+    'info_mise_a_niveau_base' => 'mise à niveau de votre base SQL',
368
+    'info_mise_a_niveau_base_2' => '{{Attention !}} Vous avez installé une version
369 369
 		des fichiers SPIP {antérieure} à celle qui se trouvait
370 370
 		auparavant sur ce site : votre base de données risque d’être
371 371
 		perdue et votre site ne fonctionnera plus.<br />{{Réinstallez les
372 372
 		fichiers de SPIP.}}',
373
-	'info_modification_enregistree' => 'Votre modification a été enregistrée',
374
-	'info_modifier_auteur' => 'Modifier l’auteur :',
375
-	'info_modifier_rubrique' => 'Modifier la rubrique :',
376
-	'info_modifier_titre' => 'Modifier : @titre@',
377
-	'info_mon_site_spip' => 'Mon site SPIP',
378
-	'info_moyenne' => 'moyenne :',
379
-	'info_multi_cet_article' => 'Langue de cet article :',
380
-	'info_multi_langues_choisies' => 'Veuillez sélectionner ci-après les langues à disposition des rédacteurs de votre site.
373
+    'info_modification_enregistree' => 'Votre modification a été enregistrée',
374
+    'info_modifier_auteur' => 'Modifier l’auteur :',
375
+    'info_modifier_rubrique' => 'Modifier la rubrique :',
376
+    'info_modifier_titre' => 'Modifier : @titre@',
377
+    'info_mon_site_spip' => 'Mon site SPIP',
378
+    'info_moyenne' => 'moyenne :',
379
+    'info_multi_cet_article' => 'Langue de cet article :',
380
+    'info_multi_langues_choisies' => 'Veuillez sélectionner ci-après les langues à disposition des rédacteurs de votre site.
381 381
 		Les langues déjà utilisées dans votre site (affichées en premier) ne peuvent pas être désactivées.',
382
-	'info_multi_objets' => '@objets@ : activer le menu de langue',
383
-	'info_multi_secteurs' => '... seulement pour les rubriques situées à la racine ?',
384
-	'info_nb_articles' => '@nb@ articles',
385
-	'info_nb_auteurs' => '@nb@ auteurs',
386
-	'info_nb_messages' => '@nb@ messages',
387
-	'info_nb_mots_cles' => '@nb@ mots-clés',
388
-	'info_nb_rubriques' => '@nb@ rubriques',
389
-	'info_nb_visiteurs' => '@nb@ visiteurs',
390
-	'info_nom' => 'Nom',
391
-	'info_nom_destinataire' => 'Nom du destinataire',
392
-	'info_nom_pas_conforme' => 'les tags html ne sont pas autorisés',
393
-	'info_nom_site' => 'Nom de votre site',
394
-	'info_nombre_articles' => '@nb_articles@ articles,',
395
-	'info_nombre_rubriques' => '@nb_rubriques@ rubriques,',
396
-	'info_nombre_sites' => '@nb_sites@ sites,',
397
-	'info_non_deplacer' => 'Ne pas déplacer...',
398
-	'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP peut envoyer, régulièrement, l’annonce des dernières nouveautés du site
382
+    'info_multi_objets' => '@objets@ : activer le menu de langue',
383
+    'info_multi_secteurs' => '... seulement pour les rubriques situées à la racine ?',
384
+    'info_nb_articles' => '@nb@ articles',
385
+    'info_nb_auteurs' => '@nb@ auteurs',
386
+    'info_nb_messages' => '@nb@ messages',
387
+    'info_nb_mots_cles' => '@nb@ mots-clés',
388
+    'info_nb_rubriques' => '@nb@ rubriques',
389
+    'info_nb_visiteurs' => '@nb@ visiteurs',
390
+    'info_nom' => 'Nom',
391
+    'info_nom_destinataire' => 'Nom du destinataire',
392
+    'info_nom_pas_conforme' => 'les tags html ne sont pas autorisés',
393
+    'info_nom_site' => 'Nom de votre site',
394
+    'info_nombre_articles' => '@nb_articles@ articles,',
395
+    'info_nombre_rubriques' => '@nb_rubriques@ rubriques,',
396
+    'info_nombre_sites' => '@nb_sites@ sites,',
397
+    'info_non_deplacer' => 'Ne pas déplacer...',
398
+    'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP peut envoyer, régulièrement, l’annonce des dernières nouveautés du site
399 399
 		(articles et brèves récemment publiés).',
400
-	'info_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
401
-	'info_non_modifiable' => 'ne peut pas être modifié',
402
-	'info_non_suppression_mot_cle' => 'je ne veux pas supprimer ce mot-clé.',
403
-	'info_notes' => 'Notes',
404
-	'info_nouvel_article' => 'Nouvel article',
405
-	'info_nouvelle_traduction' => 'Nouvelle traduction :',
406
-	'info_numero_article' => 'ARTICLE NUMÉRO :',
407
-	'info_obligatoire_02' => '(obligatoire)',
408
-	'info_option_accepter_visiteurs' => 'Accepter l’inscription de visiteurs du site public',
409
-	'info_option_ne_pas_accepter_visiteurs' => 'Refuser l’inscription des visiteurs',
410
-	'info_options_avancees' => 'OPTIONS AVANCÉES',
411
-	'info_ou' => 'ou...',
412
-	'info_page_interdite' => 'Page interdite',
413
-	'info_par_nom' => 'par nom',
414
-	'info_par_nombre_article' => 'par nombre d’articles',
415
-	'info_par_statut' => 'par statut',
416
-	'info_par_tri' => '’(par @tri@)’',
417
-	'info_passe_trop_court' => 'Mot de passe trop court.',
418
-	'info_passe_trop_court_car_pluriel' => 'Le mot de passe doit contenir au moins @nb@ caractères.',
419
-	'info_passes_identiques' => 'Les deux mots de passe ne sont pas identiques.',
420
-	'info_plus_cinq_car' => 'plus de 5 caractères',
421
-	'info_plus_cinq_car_2' => '(Plus de 5 caractères)',
422
-	'info_plus_trois_car' => '(Plus de 3 caractères)',
423
-	'info_popularite' => 'popularité : @popularite@ ; visites : @visites@',
424
-	'info_post_scriptum' => 'Post-Scriptum',
425
-	'info_post_scriptum_2' => 'Post-scriptum :',
426
-	'info_pour' => 'pour',
427
-	'info_preview_texte' => 'Il est possible de prévisualiser les différents éléments éditoriaux du site ayant au moins le statut « proposé », ainsi que les éléments en cours de rédaction dont on est l’auteur. Cette fonctionnalité doit-elle être disponible pour les administrateurs, les rédacteurs, ou personne ?',
428
-	'info_procedez_par_etape' => 'procédez étape par étape',
429
-	'info_procedure_maj_version' => 'la procédure de mise à jour doit être lancée afin d’adapter
400
+    'info_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
401
+    'info_non_modifiable' => 'ne peut pas être modifié',
402
+    'info_non_suppression_mot_cle' => 'je ne veux pas supprimer ce mot-clé.',
403
+    'info_notes' => 'Notes',
404
+    'info_nouvel_article' => 'Nouvel article',
405
+    'info_nouvelle_traduction' => 'Nouvelle traduction :',
406
+    'info_numero_article' => 'ARTICLE NUMÉRO :',
407
+    'info_obligatoire_02' => '(obligatoire)',
408
+    'info_option_accepter_visiteurs' => 'Accepter l’inscription de visiteurs du site public',
409
+    'info_option_ne_pas_accepter_visiteurs' => 'Refuser l’inscription des visiteurs',
410
+    'info_options_avancees' => 'OPTIONS AVANCÉES',
411
+    'info_ou' => 'ou...',
412
+    'info_page_interdite' => 'Page interdite',
413
+    'info_par_nom' => 'par nom',
414
+    'info_par_nombre_article' => 'par nombre d’articles',
415
+    'info_par_statut' => 'par statut',
416
+    'info_par_tri' => '’(par @tri@)’',
417
+    'info_passe_trop_court' => 'Mot de passe trop court.',
418
+    'info_passe_trop_court_car_pluriel' => 'Le mot de passe doit contenir au moins @nb@ caractères.',
419
+    'info_passes_identiques' => 'Les deux mots de passe ne sont pas identiques.',
420
+    'info_plus_cinq_car' => 'plus de 5 caractères',
421
+    'info_plus_cinq_car_2' => '(Plus de 5 caractères)',
422
+    'info_plus_trois_car' => '(Plus de 3 caractères)',
423
+    'info_popularite' => 'popularité : @popularite@ ; visites : @visites@',
424
+    'info_post_scriptum' => 'Post-Scriptum',
425
+    'info_post_scriptum_2' => 'Post-scriptum :',
426
+    'info_pour' => 'pour',
427
+    'info_preview_texte' => 'Il est possible de prévisualiser les différents éléments éditoriaux du site ayant au moins le statut « proposé », ainsi que les éléments en cours de rédaction dont on est l’auteur. Cette fonctionnalité doit-elle être disponible pour les administrateurs, les rédacteurs, ou personne ?',
428
+    'info_procedez_par_etape' => 'procédez étape par étape',
429
+    'info_procedure_maj_version' => 'la procédure de mise à jour doit être lancée afin d’adapter
430 430
 	la base de données à la nouvelle version de SPIP.',
431
-	'info_proxy_ok' => 'Test du proxy réussi.',
432
-	'info_ps' => 'P.-S.',
433
-	'info_publier' => 'publier',
434
-	'info_publies' => 'Vos articles publiés en ligne',
435
-	'info_question_accepter_visiteurs' => 'Si les squelettes de votre site prévoient l’enregistrement de visiteurs sans accès à l’espace privé, veuillez activer l’option ci-dessous :',
436
-	'info_question_inscription_nouveaux_redacteurs' => 'Acceptez-vous les inscriptions de nouveaux rédacteurs à
431
+    'info_proxy_ok' => 'Test du proxy réussi.',
432
+    'info_ps' => 'P.-S.',
433
+    'info_publier' => 'publier',
434
+    'info_publies' => 'Vos articles publiés en ligne',
435
+    'info_question_accepter_visiteurs' => 'Si les squelettes de votre site prévoient l’enregistrement de visiteurs sans accès à l’espace privé, veuillez activer l’option ci-dessous :',
436
+    'info_question_inscription_nouveaux_redacteurs' => 'Acceptez-vous les inscriptions de nouveaux rédacteurs à
437 437
   partir du site public ? Si vous acceptez, les visiteurs pourront s’inscrire
438 438
   depuis un formulaire automatisé et accéderont alors à l’espace privé pour
439 439
   proposer leurs propres articles. <div class="notice">Lors de la phase d’inscription,
@@ -442,405 +442,405 @@  discard block
 block discarded – undo
442 442
   hébergeurs désactivent l’envoi de mails depuis leurs
443 443
   serveurs : dans ce cas, l’inscription automatique est
444 444
   impossible.</div>',
445
-	'info_qui_edite' => '@nom_auteur_modif@ a travaillé sur ce contenu il y a @date_diff@ minutes',
446
-	'info_racine_site' => 'Racine du site',
447
-	'info_recharger_page' => 'Veuillez recharger cette page dans quelques instants.',
448
-	'info_recherche_auteur_zero' => 'Aucun résultat pour « @cherche_auteur@ ».',
449
-	'info_recommencer' => 'Veuillez recommencer.',
450
-	'info_redacteur_1' => 'Rédacteur',
451
-	'info_redacteur_2' => 'ayant accès à l’espace privé (<i>recommandé</i>)',
452
-	'info_redacteurs' => 'Rédacteurs',
453
-	'info_redaction_en_cours' => 'EN COURS DE RÉDACTION',
454
-	'info_redirection' => 'Redirection',
455
-	'info_redirection_activee' => 'La redirection est activée.',
456
-	'info_redirection_boucle' => 'Vous essayez de rediriger l’article sur lui-même.',
457
-	'info_redirection_desactivee' => 'La redirection a été supprimée.',
458
-	'info_refuses' => 'Vos articles refusés',
459
-	'info_reglage_ldap' => 'Options : <b>Réglage de l’importation LDAP</b>',
460
-	'info_renvoi_article' => '<b>Redirection.</b> Cet article renvoie à la page :',
461
-	'info_reserve_admin' => 'Seuls les administrateurs peuvent modifier cette adresse.',
462
-	'info_restreindre_rubrique' => 'Restreindre la gestion à la rubrique :',
463
-	'info_resultat_recherche' => 'Résultats de la recherche :',
464
-	'info_rubriques' => 'Rubriques',
465
-	'info_rubriques_02' => 'rubriques',
466
-	'info_rubriques_trouvees' => 'Rubriques trouvées',
467
-	'info_sans_titre' => 'Sans titre',
468
-	'info_selection_chemin_acces' => '<b>Sélectionnez</b> ci-après le chemin d’accès dans l’annuaire :',
469
-	'info_signatures' => 'signatures',
470
-	'info_site' => 'Site',
471
-	'info_site_2' => 'site :',
472
-	'info_site_min' => 'site',
473
-	'info_site_reference_2' => 'Site référencé',
474
-	'info_site_web' => 'Site Web :',
475
-	'info_sites' => 'sites',
476
-	'info_sites_lies_mot' => 'Les sites référencés liés à ce mot-clé',
477
-	'info_sites_proxy' => 'Utiliser un proxy',
478
-	'info_sites_trouves' => 'Sites trouvés',
479
-	'info_sous_titre' => 'Soustitre :',
480
-	'info_statut_administrateur' => 'Administrateur',
481
-	'info_statut_auteur' => 'Statut de cet auteur :',
482
-	'info_statut_auteur_2' => 'Je suis',
483
-	'info_statut_auteur_a_confirmer' => 'Inscription à confirmer',
484
-	'info_statut_auteur_autre' => 'Autre statut :',
485
-	'info_statut_redacteur' => 'Rédacteur',
486
-	'info_statut_utilisateurs_1' => 'Statut par défaut des utilisateurs importés',
487
-	'info_statut_utilisateurs_2' => 'Choisissez le statut qui est attribué aux personnes présentes dans l’annuaire LDAP lorsqu’elles se connectent pour la première fois. Vous pourrez par la suite modifier cette valeur pour chaque auteur au cas par cas.',
488
-	'info_suivi_activite' => 'Suivi de l’activité éditoriale',
489
-	'info_surtitre' => 'Surtitre :',
490
-	'info_syndication_integrale_1' => 'Votre site propose des fichiers de syndication (voir « <a href="@url@">@titre@</a> »).',
491
-	'info_syndication_integrale_2' => 'Souhaitez-vous transmettre les articles dans leur intégralité, ou ne diffuser qu’un résumé de quelques centaines de caractères ?',
492
-	'info_table_prefix' => 'Vous pouvez modifier le préfixe du nom des tables de données (ceci est indispensable lorsque l’on souhaite installer plusieurs sites dans la même base de données). Ce préfixe s’écrit en lettres minuscules, non accentuées, et sans espace.',
493
-	'info_taille_maximale_images' => 'SPIP va tester la taille maximale des images qu’il peut traiter (en millions de pixels).<br /> Les images plus grandes ne seront pas réduites.',
494
-	'info_taille_maximale_vignette' => 'Taille maximale des vignettes générées par le système :',
495
-	'info_terminer_installation' => 'Vous pouvez maintenant terminer la procédure d’installation standard.',
496
-	'info_texte' => 'Texte',
497
-	'info_texte_explicatif' => 'Texte explicatif',
498
-	'info_texte_long' => '(le texte est long : il apparaît donc en plusieurs parties qui seront recollées après validation.)',
499
-	'info_texte_message' => 'Texte de votre message',
500
-	'info_texte_message_02' => 'Texte du message',
501
-	'info_titre' => 'Titre :',
502
-	'info_total' => 'total :',
503
-	'info_tous_articles_en_redaction' => 'Tous les articles en cours de rédaction',
504
-	'info_tous_articles_presents' => 'Tous les articles publiés dans cette rubrique',
505
-	'info_tous_articles_refuses' => 'Tous les articles refusés',
506
-	'info_tous_les' => 'tous les :',
507
-	'info_tout_site' => 'Tout le site',
508
-	'info_tout_site2' => 'L’article n’a pas été traduit dans cette langue.',
509
-	'info_tout_site3' => 'L’article a été traduit dans cette langue, mais des modifications ont été apportées par la suite à l’article de référence. La traduction doit être mise à jour.',
510
-	'info_tout_site4' => 'L’article a été traduit dans cette langue, et la traduction est à jour.',
511
-	'info_tout_site5' => 'Article original.',
512
-	'info_tout_site6' => '<b>Attention :</b> seuls les articles originaux sont affichés.
445
+    'info_qui_edite' => '@nom_auteur_modif@ a travaillé sur ce contenu il y a @date_diff@ minutes',
446
+    'info_racine_site' => 'Racine du site',
447
+    'info_recharger_page' => 'Veuillez recharger cette page dans quelques instants.',
448
+    'info_recherche_auteur_zero' => 'Aucun résultat pour « @cherche_auteur@ ».',
449
+    'info_recommencer' => 'Veuillez recommencer.',
450
+    'info_redacteur_1' => 'Rédacteur',
451
+    'info_redacteur_2' => 'ayant accès à l’espace privé (<i>recommandé</i>)',
452
+    'info_redacteurs' => 'Rédacteurs',
453
+    'info_redaction_en_cours' => 'EN COURS DE RÉDACTION',
454
+    'info_redirection' => 'Redirection',
455
+    'info_redirection_activee' => 'La redirection est activée.',
456
+    'info_redirection_boucle' => 'Vous essayez de rediriger l’article sur lui-même.',
457
+    'info_redirection_desactivee' => 'La redirection a été supprimée.',
458
+    'info_refuses' => 'Vos articles refusés',
459
+    'info_reglage_ldap' => 'Options : <b>Réglage de l’importation LDAP</b>',
460
+    'info_renvoi_article' => '<b>Redirection.</b> Cet article renvoie à la page :',
461
+    'info_reserve_admin' => 'Seuls les administrateurs peuvent modifier cette adresse.',
462
+    'info_restreindre_rubrique' => 'Restreindre la gestion à la rubrique :',
463
+    'info_resultat_recherche' => 'Résultats de la recherche :',
464
+    'info_rubriques' => 'Rubriques',
465
+    'info_rubriques_02' => 'rubriques',
466
+    'info_rubriques_trouvees' => 'Rubriques trouvées',
467
+    'info_sans_titre' => 'Sans titre',
468
+    'info_selection_chemin_acces' => '<b>Sélectionnez</b> ci-après le chemin d’accès dans l’annuaire :',
469
+    'info_signatures' => 'signatures',
470
+    'info_site' => 'Site',
471
+    'info_site_2' => 'site :',
472
+    'info_site_min' => 'site',
473
+    'info_site_reference_2' => 'Site référencé',
474
+    'info_site_web' => 'Site Web :',
475
+    'info_sites' => 'sites',
476
+    'info_sites_lies_mot' => 'Les sites référencés liés à ce mot-clé',
477
+    'info_sites_proxy' => 'Utiliser un proxy',
478
+    'info_sites_trouves' => 'Sites trouvés',
479
+    'info_sous_titre' => 'Soustitre :',
480
+    'info_statut_administrateur' => 'Administrateur',
481
+    'info_statut_auteur' => 'Statut de cet auteur :',
482
+    'info_statut_auteur_2' => 'Je suis',
483
+    'info_statut_auteur_a_confirmer' => 'Inscription à confirmer',
484
+    'info_statut_auteur_autre' => 'Autre statut :',
485
+    'info_statut_redacteur' => 'Rédacteur',
486
+    'info_statut_utilisateurs_1' => 'Statut par défaut des utilisateurs importés',
487
+    'info_statut_utilisateurs_2' => 'Choisissez le statut qui est attribué aux personnes présentes dans l’annuaire LDAP lorsqu’elles se connectent pour la première fois. Vous pourrez par la suite modifier cette valeur pour chaque auteur au cas par cas.',
488
+    'info_suivi_activite' => 'Suivi de l’activité éditoriale',
489
+    'info_surtitre' => 'Surtitre :',
490
+    'info_syndication_integrale_1' => 'Votre site propose des fichiers de syndication (voir « <a href="@url@">@titre@</a> »).',
491
+    'info_syndication_integrale_2' => 'Souhaitez-vous transmettre les articles dans leur intégralité, ou ne diffuser qu’un résumé de quelques centaines de caractères ?',
492
+    'info_table_prefix' => 'Vous pouvez modifier le préfixe du nom des tables de données (ceci est indispensable lorsque l’on souhaite installer plusieurs sites dans la même base de données). Ce préfixe s’écrit en lettres minuscules, non accentuées, et sans espace.',
493
+    'info_taille_maximale_images' => 'SPIP va tester la taille maximale des images qu’il peut traiter (en millions de pixels).<br /> Les images plus grandes ne seront pas réduites.',
494
+    'info_taille_maximale_vignette' => 'Taille maximale des vignettes générées par le système :',
495
+    'info_terminer_installation' => 'Vous pouvez maintenant terminer la procédure d’installation standard.',
496
+    'info_texte' => 'Texte',
497
+    'info_texte_explicatif' => 'Texte explicatif',
498
+    'info_texte_long' => '(le texte est long : il apparaît donc en plusieurs parties qui seront recollées après validation.)',
499
+    'info_texte_message' => 'Texte de votre message',
500
+    'info_texte_message_02' => 'Texte du message',
501
+    'info_titre' => 'Titre :',
502
+    'info_total' => 'total :',
503
+    'info_tous_articles_en_redaction' => 'Tous les articles en cours de rédaction',
504
+    'info_tous_articles_presents' => 'Tous les articles publiés dans cette rubrique',
505
+    'info_tous_articles_refuses' => 'Tous les articles refusés',
506
+    'info_tous_les' => 'tous les :',
507
+    'info_tout_site' => 'Tout le site',
508
+    'info_tout_site2' => 'L’article n’a pas été traduit dans cette langue.',
509
+    'info_tout_site3' => 'L’article a été traduit dans cette langue, mais des modifications ont été apportées par la suite à l’article de référence. La traduction doit être mise à jour.',
510
+    'info_tout_site4' => 'L’article a été traduit dans cette langue, et la traduction est à jour.',
511
+    'info_tout_site5' => 'Article original.',
512
+    'info_tout_site6' => '<b>Attention :</b> seuls les articles originaux sont affichés.
513 513
 Les traductions sont associées à l’original,
514 514
 dans une couleur qui indique leur état :',
515
-	'info_traductions' => 'Traductions',
516
-	'info_travail_colaboratif' => 'Travail collaboratif sur les articles',
517
-	'info_un_article' => 'un article,',
518
-	'info_un_site' => 'un site,',
519
-	'info_une_rubrique' => 'une rubrique,',
520
-	'info_une_rubrique_02' => '1 rubrique',
521
-	'info_url' => 'URL :',
522
-	'info_url_proxy' => 'URL du proxy',
523
-	'info_url_proxy_pas_conforme' => 'l’URL du proxy n’est pas valide.',
524
-	'info_url_site_pas_conforme' => 'l’URL du site n’est pas valide.',
525
-	'info_url_test_proxy' => 'URL de test',
526
-	'info_urlref' => 'Lien hypertexte :',
527
-	'info_utilisation_spip' => 'Vous pouvez maintenant commencer à utiliser le système de publication assistée...',
528
-	'info_visites_par_mois' => 'Affichage par mois :',
529
-	'info_visiteur_1' => 'Visiteur',
530
-	'info_visiteur_2' => 'du site public',
531
-	'info_visiteurs' => 'Visiteurs',
532
-	'info_visiteurs_02' => 'Visiteurs du site public',
533
-	'info_webmestre_forces' => 'Les webmestres sont actuellement définis dans <tt>@file_options@</tt>.',
534
-	'install_adresse_base_hebergeur' => 'Adresse de la base de données attribuée par l’hébergeur',
535
-	'install_connect_ok' => 'La nouvelle base a bien été déclarée sous le nom de serveur @connect@.',
536
-	'install_echec_annonce' => 'L’installation va probablement échouer, ou aboutir à un site non fonctionnel...',
537
-	'install_extension_mbstring' => 'SPIP ne fonctionne pas avec :',
538
-	'install_extension_php_obligatoire' => 'SPIP exige l’extension php :',
539
-	'install_login_base_hebergeur' => 'Login de connexion attribué par l’hébergeur',
540
-	'install_nom_base_hebergeur' => 'Nom de la base attribué par l’hébergeur :',
541
-	'install_pas_table' => 'Base actuellement sans tables',
542
-	'install_pass_base_hebergeur' => 'Mot de passe de connexion attribué par l’hébergeur',
543
-	'install_php_extension' => 'Les extensions suivantes sont manquantes : @extensions@',
544
-	'install_php_version' => 'PHP version @version@ insuffisant (minimum = @minimum@)',
545
-	'install_php_version_max' => 'PHP version @version@ trop récent (maximum = @maximum@)',
546
-	'install_select_langue' => 'Sélectionnez une langue puis cliquez sur le bouton « suivant » pour lancer la procédure d’installation.',
547
-	'install_select_type_db' => 'Indiquer le type de base de données :',
548
-	'install_select_type_mysql' => 'MySQL',
549
-	'install_select_type_pg' => 'PostgreSQL',
550
-	'install_select_type_sqlite2' => 'SQLite 2',
551
-	'install_select_type_sqlite3' => 'SQLite 3',
552
-	'install_serveur_hebergeur' => 'Serveur de base de données attribué par l’hébergeur',
553
-	'install_table_prefix_hebergeur' => 'Préfixe de table attribué par l’hébergeur :',
554
-	'install_tables_base' => 'Tables de la base',
555
-	'install_types_db_connus' => 'SPIP sait utiliser <b>MySQL</b> (le plus répandu) et <b>SQLite</b>.',
556
-	'install_types_db_connus_avertissement' => 'Le support de <b>PostgreSQL</b> est également proposé à titre experimental',
557
-	'instituer_erreur_statut_a_change' => 'Le statut a déjà été modifié',
558
-	'instituer_erreur_statut_non_autorise' => 'Vous ne pouvez pas choisir ce statut',
559
-	'intem_redacteur' => 'rédacteur',
560
-	'intitule_licence' => 'Licence',
561
-	'item_accepter_inscriptions' => 'Accepter les inscriptions',
562
-	'item_activer_messages_avertissement' => 'Activer les messages d’avertissement',
563
-	'item_administrateur_2' => 'administrateur',
564
-	'item_afficher_calendrier' => 'Afficher dans le calendrier',
565
-	'item_autoriser_syndication_integrale' => 'Diffuser l’intégralité des articles dans les fichiers de syndication',
566
-	'item_choix_administrateurs' => 'les administrateurs',
567
-	'item_choix_generation_miniature' => 'Générer automatiquement les miniatures des images.',
568
-	'item_choix_non_generation_miniature' => 'Ne pas générer de miniatures des images.',
569
-	'item_choix_redacteurs' => 'les rédacteurs',
570
-	'item_choix_visiteurs' => 'les visiteurs du site public',
571
-	'item_creer_fichiers_authent' => 'Créer les fichiers .htpasswd',
572
-	'item_login' => 'Login',
573
-	'item_messagerie_agenda' => 'Activer la messagerie et l’agenda',
574
-	'item_mots_cles_association_articles' => 'aux articles',
575
-	'item_mots_cles_association_rubriques' => 'aux rubriques',
576
-	'item_mots_cles_association_sites' => 'aux sites référencés ou syndiqués.',
577
-	'item_non' => 'Non',
578
-	'item_non_accepter_inscriptions' => 'Ne pas accepter les inscriptions',
579
-	'item_non_activer_messages_avertissement' => 'Pas de messages d’avertissement',
580
-	'item_non_afficher_calendrier' => 'Ne pas afficher dans le calendrier',
581
-	'item_non_autoriser_syndication_integrale' => 'Ne diffuser qu’un résumé',
582
-	'item_non_creer_fichiers_authent' => 'Ne pas créer ces fichiers',
583
-	'item_non_messagerie_agenda' => 'Désactiver la messagerie et l’agenda',
584
-	'item_non_publier_articles' => 'Ne pas publier les articles avant la date de publication fixée.',
585
-	'item_nouvel_auteur' => 'Nouvel auteur',
586
-	'item_nouvelle_rubrique' => 'Nouvelle rubrique',
587
-	'item_oui' => 'Oui',
588
-	'item_publier_articles' => 'Publier les articles, quelle que soit leur date de publication.',
589
-	'item_reponse_article' => 'Réponse à l’article',
590
-	'item_visiteur' => 'visiteur',
515
+    'info_traductions' => 'Traductions',
516
+    'info_travail_colaboratif' => 'Travail collaboratif sur les articles',
517
+    'info_un_article' => 'un article,',
518
+    'info_un_site' => 'un site,',
519
+    'info_une_rubrique' => 'une rubrique,',
520
+    'info_une_rubrique_02' => '1 rubrique',
521
+    'info_url' => 'URL :',
522
+    'info_url_proxy' => 'URL du proxy',
523
+    'info_url_proxy_pas_conforme' => 'l’URL du proxy n’est pas valide.',
524
+    'info_url_site_pas_conforme' => 'l’URL du site n’est pas valide.',
525
+    'info_url_test_proxy' => 'URL de test',
526
+    'info_urlref' => 'Lien hypertexte :',
527
+    'info_utilisation_spip' => 'Vous pouvez maintenant commencer à utiliser le système de publication assistée...',
528
+    'info_visites_par_mois' => 'Affichage par mois :',
529
+    'info_visiteur_1' => 'Visiteur',
530
+    'info_visiteur_2' => 'du site public',
531
+    'info_visiteurs' => 'Visiteurs',
532
+    'info_visiteurs_02' => 'Visiteurs du site public',
533
+    'info_webmestre_forces' => 'Les webmestres sont actuellement définis dans <tt>@file_options@</tt>.',
534
+    'install_adresse_base_hebergeur' => 'Adresse de la base de données attribuée par l’hébergeur',
535
+    'install_connect_ok' => 'La nouvelle base a bien été déclarée sous le nom de serveur @connect@.',
536
+    'install_echec_annonce' => 'L’installation va probablement échouer, ou aboutir à un site non fonctionnel...',
537
+    'install_extension_mbstring' => 'SPIP ne fonctionne pas avec :',
538
+    'install_extension_php_obligatoire' => 'SPIP exige l’extension php :',
539
+    'install_login_base_hebergeur' => 'Login de connexion attribué par l’hébergeur',
540
+    'install_nom_base_hebergeur' => 'Nom de la base attribué par l’hébergeur :',
541
+    'install_pas_table' => 'Base actuellement sans tables',
542
+    'install_pass_base_hebergeur' => 'Mot de passe de connexion attribué par l’hébergeur',
543
+    'install_php_extension' => 'Les extensions suivantes sont manquantes : @extensions@',
544
+    'install_php_version' => 'PHP version @version@ insuffisant (minimum = @minimum@)',
545
+    'install_php_version_max' => 'PHP version @version@ trop récent (maximum = @maximum@)',
546
+    'install_select_langue' => 'Sélectionnez une langue puis cliquez sur le bouton « suivant » pour lancer la procédure d’installation.',
547
+    'install_select_type_db' => 'Indiquer le type de base de données :',
548
+    'install_select_type_mysql' => 'MySQL',
549
+    'install_select_type_pg' => 'PostgreSQL',
550
+    'install_select_type_sqlite2' => 'SQLite 2',
551
+    'install_select_type_sqlite3' => 'SQLite 3',
552
+    'install_serveur_hebergeur' => 'Serveur de base de données attribué par l’hébergeur',
553
+    'install_table_prefix_hebergeur' => 'Préfixe de table attribué par l’hébergeur :',
554
+    'install_tables_base' => 'Tables de la base',
555
+    'install_types_db_connus' => 'SPIP sait utiliser <b>MySQL</b> (le plus répandu) et <b>SQLite</b>.',
556
+    'install_types_db_connus_avertissement' => 'Le support de <b>PostgreSQL</b> est également proposé à titre experimental',
557
+    'instituer_erreur_statut_a_change' => 'Le statut a déjà été modifié',
558
+    'instituer_erreur_statut_non_autorise' => 'Vous ne pouvez pas choisir ce statut',
559
+    'intem_redacteur' => 'rédacteur',
560
+    'intitule_licence' => 'Licence',
561
+    'item_accepter_inscriptions' => 'Accepter les inscriptions',
562
+    'item_activer_messages_avertissement' => 'Activer les messages d’avertissement',
563
+    'item_administrateur_2' => 'administrateur',
564
+    'item_afficher_calendrier' => 'Afficher dans le calendrier',
565
+    'item_autoriser_syndication_integrale' => 'Diffuser l’intégralité des articles dans les fichiers de syndication',
566
+    'item_choix_administrateurs' => 'les administrateurs',
567
+    'item_choix_generation_miniature' => 'Générer automatiquement les miniatures des images.',
568
+    'item_choix_non_generation_miniature' => 'Ne pas générer de miniatures des images.',
569
+    'item_choix_redacteurs' => 'les rédacteurs',
570
+    'item_choix_visiteurs' => 'les visiteurs du site public',
571
+    'item_creer_fichiers_authent' => 'Créer les fichiers .htpasswd',
572
+    'item_login' => 'Login',
573
+    'item_messagerie_agenda' => 'Activer la messagerie et l’agenda',
574
+    'item_mots_cles_association_articles' => 'aux articles',
575
+    'item_mots_cles_association_rubriques' => 'aux rubriques',
576
+    'item_mots_cles_association_sites' => 'aux sites référencés ou syndiqués.',
577
+    'item_non' => 'Non',
578
+    'item_non_accepter_inscriptions' => 'Ne pas accepter les inscriptions',
579
+    'item_non_activer_messages_avertissement' => 'Pas de messages d’avertissement',
580
+    'item_non_afficher_calendrier' => 'Ne pas afficher dans le calendrier',
581
+    'item_non_autoriser_syndication_integrale' => 'Ne diffuser qu’un résumé',
582
+    'item_non_creer_fichiers_authent' => 'Ne pas créer ces fichiers',
583
+    'item_non_messagerie_agenda' => 'Désactiver la messagerie et l’agenda',
584
+    'item_non_publier_articles' => 'Ne pas publier les articles avant la date de publication fixée.',
585
+    'item_nouvel_auteur' => 'Nouvel auteur',
586
+    'item_nouvelle_rubrique' => 'Nouvelle rubrique',
587
+    'item_oui' => 'Oui',
588
+    'item_publier_articles' => 'Publier les articles, quelle que soit leur date de publication.',
589
+    'item_reponse_article' => 'Réponse à l’article',
590
+    'item_visiteur' => 'visiteur',
591 591
 
592
-	// J
593
-	'jour_non_connu_nc' => 'n.c.',
592
+    // J
593
+    'jour_non_connu_nc' => 'n.c.',
594 594
 
595
-	// L
596
-	'label_bando_outils' => 'Barre d’outils',
597
-	'label_bando_outils_afficher' => 'Afficher les outils',
598
-	'label_bando_outils_masquer' => 'Masquer les outils',
599
-	'label_choix_langue' => 'Sélectionnez votre langue',
600
-	'label_langue' => 'Langue',
601
-	'label_nom_fichier_connect' => 'Indiquez le nom utilisé pour ce serveur',
602
-	'label_slogan_site' => 'Slogan du site',
603
-	'label_taille_ecran' => 'Largeur de l’écran',
604
-	'label_texte_et_icones_navigation' => 'Menu de navigation',
605
-	'label_texte_et_icones_page' => 'Affichage dans la page',
606
-	'ldap_correspondance' => 'héritage du champ @champ@',
607
-	'ldap_correspondance_1' => 'Héritage des champs LDAP',
608
-	'ldap_correspondance_2' => 'Pour chacun des champs SPIP suivants, indiquer le nom du champ LDAP correspondant. Laisser vide pour ne pas le remplir, séparer par des espaces ou des virgules pour essayer plusieurs champs LDAP.',
609
-	'lien_ajouter_auteur' => 'Ajouter cet auteur',
610
-	'lien_ajouter_une_rubrique' => 'Ajouter cette rubrique',
611
-	'lien_email' => 'email',
612
-	'lien_nom_site' => 'NOM DU SITE :',
613
-	'lien_rapide_contenu' => 'Aller au contenu',
614
-	'lien_rapide_navigation' => 'Aller à la navigation',
615
-	'lien_rapide_recherche' => 'Aller à la recherche',
616
-	'lien_retirer_auteur' => 'Retirer l’auteur',
617
-	'lien_retirer_rubrique' => 'Retirer la rubrique',
618
-	'lien_retirer_tous_auteurs' => 'Retirer tous les auteurs',
619
-	'lien_retirer_toutes_rubriques' => 'Retirer toutes les rubriques',
620
-	'lien_site' => 'site',
621
-	'lien_tout_decocher' => 'Tout décocher',
622
-	'lien_tout_deplier' => 'Tout déplier',
623
-	'lien_tout_replier' => 'Tout replier',
624
-	'lien_tout_supprimer' => 'Tout supprimer',
625
-	'lien_trier_nom' => 'Trier par nom',
626
-	'lien_trier_nombre_articles' => 'Trier par nombre d’articles',
627
-	'lien_trier_statut' => 'Trier par statut',
628
-	'lien_voir_en_ligne' => 'VOIR EN LIGNE :',
629
-	'logo_article' => 'Logo de l’article',
630
-	'logo_auteur' => 'Logo de l’auteur',
631
-	'logo_rubrique' => 'Logo de la rubrique',
632
-	'logo_site' => 'Logo de ce site',
633
-	'logo_standard_rubrique' => 'Logo standard des rubriques',
634
-	'logo_survol' => 'Logo pour survol',
595
+    // L
596
+    'label_bando_outils' => 'Barre d’outils',
597
+    'label_bando_outils_afficher' => 'Afficher les outils',
598
+    'label_bando_outils_masquer' => 'Masquer les outils',
599
+    'label_choix_langue' => 'Sélectionnez votre langue',
600
+    'label_langue' => 'Langue',
601
+    'label_nom_fichier_connect' => 'Indiquez le nom utilisé pour ce serveur',
602
+    'label_slogan_site' => 'Slogan du site',
603
+    'label_taille_ecran' => 'Largeur de l’écran',
604
+    'label_texte_et_icones_navigation' => 'Menu de navigation',
605
+    'label_texte_et_icones_page' => 'Affichage dans la page',
606
+    'ldap_correspondance' => 'héritage du champ @champ@',
607
+    'ldap_correspondance_1' => 'Héritage des champs LDAP',
608
+    'ldap_correspondance_2' => 'Pour chacun des champs SPIP suivants, indiquer le nom du champ LDAP correspondant. Laisser vide pour ne pas le remplir, séparer par des espaces ou des virgules pour essayer plusieurs champs LDAP.',
609
+    'lien_ajouter_auteur' => 'Ajouter cet auteur',
610
+    'lien_ajouter_une_rubrique' => 'Ajouter cette rubrique',
611
+    'lien_email' => 'email',
612
+    'lien_nom_site' => 'NOM DU SITE :',
613
+    'lien_rapide_contenu' => 'Aller au contenu',
614
+    'lien_rapide_navigation' => 'Aller à la navigation',
615
+    'lien_rapide_recherche' => 'Aller à la recherche',
616
+    'lien_retirer_auteur' => 'Retirer l’auteur',
617
+    'lien_retirer_rubrique' => 'Retirer la rubrique',
618
+    'lien_retirer_tous_auteurs' => 'Retirer tous les auteurs',
619
+    'lien_retirer_toutes_rubriques' => 'Retirer toutes les rubriques',
620
+    'lien_site' => 'site',
621
+    'lien_tout_decocher' => 'Tout décocher',
622
+    'lien_tout_deplier' => 'Tout déplier',
623
+    'lien_tout_replier' => 'Tout replier',
624
+    'lien_tout_supprimer' => 'Tout supprimer',
625
+    'lien_trier_nom' => 'Trier par nom',
626
+    'lien_trier_nombre_articles' => 'Trier par nombre d’articles',
627
+    'lien_trier_statut' => 'Trier par statut',
628
+    'lien_voir_en_ligne' => 'VOIR EN LIGNE :',
629
+    'logo_article' => 'Logo de l’article',
630
+    'logo_auteur' => 'Logo de l’auteur',
631
+    'logo_rubrique' => 'Logo de la rubrique',
632
+    'logo_site' => 'Logo de ce site',
633
+    'logo_standard_rubrique' => 'Logo standard des rubriques',
634
+    'logo_survol' => 'Logo pour survol',
635 635
 
636
-	// M
637
-	'menu_aide_installation_choix_base' => 'Choix de votre base',
638
-	'module_fichier_langue' => 'Fichier de langue',
639
-	'module_raccourci' => 'Raccourci',
640
-	'module_texte_affiche' => 'Texte affiché',
641
-	'module_texte_explicatif' => 'Vous pouvez insérer les raccourcis suivants dans les squelettes de votre site public. Ils seront automatiquement traduits dans les différentes langues pour lesquelles il existe un fichier de langue.',
642
-	'module_texte_traduction' => 'Le fichier de langue « @module@ » est disponible en :',
643
-	'mois_non_connu' => 'non connu',
636
+    // M
637
+    'menu_aide_installation_choix_base' => 'Choix de votre base',
638
+    'module_fichier_langue' => 'Fichier de langue',
639
+    'module_raccourci' => 'Raccourci',
640
+    'module_texte_affiche' => 'Texte affiché',
641
+    'module_texte_explicatif' => 'Vous pouvez insérer les raccourcis suivants dans les squelettes de votre site public. Ils seront automatiquement traduits dans les différentes langues pour lesquelles il existe un fichier de langue.',
642
+    'module_texte_traduction' => 'Le fichier de langue « @module@ » est disponible en :',
643
+    'mois_non_connu' => 'non connu',
644 644
 
645
-	// N
646
-	'nouvelle_version_spip' => 'La mise à jour @version@ de SPIP est disponible',
647
-	'nouvelle_version_spip_majeure' => 'Une nouvelle version SPIP @version@ est disponible',
645
+    // N
646
+    'nouvelle_version_spip' => 'La mise à jour @version@ de SPIP est disponible',
647
+    'nouvelle_version_spip_majeure' => 'Une nouvelle version SPIP @version@ est disponible',
648 648
 
649
-	// O
650
-	'onglet_contenu' => 'Contenu',
651
-	'onglet_declarer_une_autre_base' => 'Déclarer une autre base',
652
-	'onglet_discuter' => 'Discuter',
653
-	'onglet_interactivite' => 'Interactivité',
654
-	'onglet_proprietes' => 'Propriétés',
655
-	'onglet_repartition_actuelle' => 'actuellement',
656
-	'onglet_sous_rubriques' => 'Sous-rubriques',
649
+    // O
650
+    'onglet_contenu' => 'Contenu',
651
+    'onglet_declarer_une_autre_base' => 'Déclarer une autre base',
652
+    'onglet_discuter' => 'Discuter',
653
+    'onglet_interactivite' => 'Interactivité',
654
+    'onglet_proprietes' => 'Propriétés',
655
+    'onglet_repartition_actuelle' => 'actuellement',
656
+    'onglet_sous_rubriques' => 'Sous-rubriques',
657 657
 
658
-	// P
659
-	'page_pas_proxy' => 'Cette page ne doit pas passer par le proxy',
660
-	'pas_de_proxy_pour' => 'Au besoin, indiquez les machines ou domaines pour lesquels ce proxy ne doit pas s’appliquer (par exemple : @exemple@)',
661
-	'phpinfo' => 'Configuration PHP',
662
-	'plugin_charge_paquet' => 'Chargement du paquet @name@',
663
-	'plugin_charger' => 'Télécharger',
664
-	'plugin_erreur_charger' => 'erreur : impossible de charger @zip@',
665
-	'plugin_erreur_droit1' => 'Le répertoire <code>@dest@</code> n’est pas accessible en écriture.',
666
-	'plugin_erreur_droit2' => 'Veuillez vérifier les droits sur ce répertoire (et le créer le cas échéant), ou installer les fichiers par FTP.',
667
-	'plugin_erreur_zip' => 'échec pclzip : erreur @status@',
668
-	'plugin_etat_developpement' => 'en développement',
669
-	'plugin_etat_experimental' => 'expérimental',
670
-	'plugin_etat_stable' => 'stable',
671
-	'plugin_etat_test' => 'en test',
672
-	'plugin_impossible_activer' => 'Impossible d’activer le plugin @plugin@',
673
-	'plugin_info_automatique1' => 'Si vous souhaitez autoriser l’installation automatique des plugins, veuillez :',
674
-	'plugin_info_automatique1_lib' => 'Si vous souhaitez autoriser l’installation automatique de cette librairie, veuillez :',
675
-	'plugin_info_automatique2' => 'créer un répertoire <code>@rep@</code> ;',
676
-	'plugin_info_automatique3' => 'vérifier que le serveur est autorisé à écrire dans ce répertoire.',
677
-	'plugin_info_automatique_creer' => 'à créer à la racine du site.',
678
-	'plugin_info_automatique_exemples' => 'exemples :',
679
-	'plugin_info_automatique_ftp' => 'Vous pouvez installer des plugins, par FTP, dans le répertoire <tt>@rep@</tt>',
680
-	'plugin_info_automatique_lib' => 'Certains plugins demandent aussi à pouvoir télécharger des fichiers dans le répertoire <code>lib/</code>, à créer le cas échéant à la racine du site.',
681
-	'plugin_info_automatique_liste' => 'Vos listes de plugins :',
682
-	'plugin_info_automatique_liste_officielle' => 'les plugins officiels',
683
-	'plugin_info_automatique_liste_update' => 'Mettre à jour les listes',
684
-	'plugin_info_automatique_ou' => 'ou...',
685
-	'plugin_info_automatique_select' => 'Sélectionnez ci-dessous un plugin : SPIP le téléchargera et l’installera dans le répertoire <code>@rep@</code> ; si ce plugin existe déjà, il sera mis à jour.',
686
-	'plugin_info_credit' => 'Crédits',
687
-	'plugin_info_erreur_xml' => 'La déclaration de ce plugin est incorrecte',
688
-	'plugin_info_install_ok' => 'Installation réussie',
689
-	'plugin_info_necessite' => 'Nécessite :',
690
-	'plugin_info_non_compatible_spip' => 'Ce plugin n’est pas compatible avec cette version de SPIP',
691
-	'plugin_info_plugins_dist_1' => 'Les plugins ci-dessous sont chargés et activés dans le répertoire @plugins_dist@.',
692
-	'plugin_info_plugins_dist_2' => 'Ils ne sont pas désactivables.',
693
-	'plugin_info_telecharger' => 'à télécharger depuis @url@ et à installer dans @rep@',
694
-	'plugin_info_upgrade_ok' => 'Mise à jour réussie',
695
-	'plugin_librairies_installees' => 'Librairies installées',
696
-	'plugin_necessite_extension_php' => 'Nécessite l’extension PHP @plugin@ en version @version@.',
697
-	'plugin_necessite_extension_php_sans_version' => 'Nécessite l’extension PHP @plugin@',
698
-	'plugin_necessite_lib' => 'Ce plugin nécessite la librairie @lib@',
699
-	'plugin_necessite_php' => 'Nécessite @plugin@ en version @version@.',
700
-	'plugin_necessite_plugin' => 'Nécessite le plugin @plugin@ en version @version@.',
701
-	'plugin_necessite_plugin_sans_version' => 'Nécessite le plugin @plugin@',
702
-	'plugin_necessite_spip' => 'Nécessite SPIP en version @version@ minimum.',
703
-	'plugin_source' => 'source : ',
704
-	'plugin_titre_automatique' => 'Installation automatique',
705
-	'plugin_titre_automatique_ajouter' => 'Ajouter des plugins',
706
-	'plugin_titre_installation' => 'Installation du plugin @plugin@',
707
-	'plugin_titre_modifier' => 'Mes plugins',
708
-	'plugin_utilise_extension_php' => 'L’extension PHP @plugin@ doit être en version @version@.',
709
-	'plugin_utilise_php' => '@plugin@ doit être en version @version@.',
710
-	'plugin_utilise_plugin' => 'Le plugin @plugin@ doit être en version @version@.',
711
-	'plugin_zip_active' => 'Continuez pour l’activer',
712
-	'plugin_zip_adresse' => 'indiquez ci-dessous l’adresse d’un fichier zip de plugin à télécharger, ou encore l’adresse d’une liste de plugins.',
713
-	'plugin_zip_adresse_champ' => 'Adresse du plugin ou de la liste ',
714
-	'plugin_zip_content' => 'Il contient les fichiers suivants (@taille@),<br />prêts à installer dans le répertoire <code>@rep@</code>',
715
-	'plugin_zip_installe_finie' => 'Le fichier @zip@ a été décompacté et installé.',
716
-	'plugin_zip_installe_rep_finie' => 'Le fichier @zip@ a été décompacté et installé dans le répertoire @rep@',
717
-	'plugin_zip_installer' => 'Vous pouvez maintenant l’installer.',
718
-	'plugin_zip_telecharge' => 'Le fichier @zip@ a été téléchargé',
719
-	'plugins_actif_aucun' => 'Aucun plugin activé.',
720
-	'plugins_actif_un' => 'Un plugin activé.',
721
-	'plugins_actifs' => '@count@ plugins activés.',
722
-	'plugins_actifs_liste' => 'Actifs',
723
-	'plugins_compte' => '@count@ plugins',
724
-	'plugins_disponible_un' => 'Un plugin disponible.',
725
-	'plugins_disponibles' => '@count@ plugins disponibles.',
726
-	'plugins_erreur' => 'Erreur dans les plugins : @plugins@',
727
-	'plugins_liste' => 'Liste des plugins',
728
-	'plugins_liste_dist' => 'Plugins verrouillés',
729
-	'plugins_recents' => 'Plugins récents.',
730
-	'plugins_tous_liste' => 'Tous',
731
-	'plugins_vue_hierarchie' => 'Hiérarchie',
732
-	'plugins_vue_liste' => 'Liste',
733
-	'protocole_ldap' => 'Version du protocole :',
658
+    // P
659
+    'page_pas_proxy' => 'Cette page ne doit pas passer par le proxy',
660
+    'pas_de_proxy_pour' => 'Au besoin, indiquez les machines ou domaines pour lesquels ce proxy ne doit pas s’appliquer (par exemple : @exemple@)',
661
+    'phpinfo' => 'Configuration PHP',
662
+    'plugin_charge_paquet' => 'Chargement du paquet @name@',
663
+    'plugin_charger' => 'Télécharger',
664
+    'plugin_erreur_charger' => 'erreur : impossible de charger @zip@',
665
+    'plugin_erreur_droit1' => 'Le répertoire <code>@dest@</code> n’est pas accessible en écriture.',
666
+    'plugin_erreur_droit2' => 'Veuillez vérifier les droits sur ce répertoire (et le créer le cas échéant), ou installer les fichiers par FTP.',
667
+    'plugin_erreur_zip' => 'échec pclzip : erreur @status@',
668
+    'plugin_etat_developpement' => 'en développement',
669
+    'plugin_etat_experimental' => 'expérimental',
670
+    'plugin_etat_stable' => 'stable',
671
+    'plugin_etat_test' => 'en test',
672
+    'plugin_impossible_activer' => 'Impossible d’activer le plugin @plugin@',
673
+    'plugin_info_automatique1' => 'Si vous souhaitez autoriser l’installation automatique des plugins, veuillez :',
674
+    'plugin_info_automatique1_lib' => 'Si vous souhaitez autoriser l’installation automatique de cette librairie, veuillez :',
675
+    'plugin_info_automatique2' => 'créer un répertoire <code>@rep@</code> ;',
676
+    'plugin_info_automatique3' => 'vérifier que le serveur est autorisé à écrire dans ce répertoire.',
677
+    'plugin_info_automatique_creer' => 'à créer à la racine du site.',
678
+    'plugin_info_automatique_exemples' => 'exemples :',
679
+    'plugin_info_automatique_ftp' => 'Vous pouvez installer des plugins, par FTP, dans le répertoire <tt>@rep@</tt>',
680
+    'plugin_info_automatique_lib' => 'Certains plugins demandent aussi à pouvoir télécharger des fichiers dans le répertoire <code>lib/</code>, à créer le cas échéant à la racine du site.',
681
+    'plugin_info_automatique_liste' => 'Vos listes de plugins :',
682
+    'plugin_info_automatique_liste_officielle' => 'les plugins officiels',
683
+    'plugin_info_automatique_liste_update' => 'Mettre à jour les listes',
684
+    'plugin_info_automatique_ou' => 'ou...',
685
+    'plugin_info_automatique_select' => 'Sélectionnez ci-dessous un plugin : SPIP le téléchargera et l’installera dans le répertoire <code>@rep@</code> ; si ce plugin existe déjà, il sera mis à jour.',
686
+    'plugin_info_credit' => 'Crédits',
687
+    'plugin_info_erreur_xml' => 'La déclaration de ce plugin est incorrecte',
688
+    'plugin_info_install_ok' => 'Installation réussie',
689
+    'plugin_info_necessite' => 'Nécessite :',
690
+    'plugin_info_non_compatible_spip' => 'Ce plugin n’est pas compatible avec cette version de SPIP',
691
+    'plugin_info_plugins_dist_1' => 'Les plugins ci-dessous sont chargés et activés dans le répertoire @plugins_dist@.',
692
+    'plugin_info_plugins_dist_2' => 'Ils ne sont pas désactivables.',
693
+    'plugin_info_telecharger' => 'à télécharger depuis @url@ et à installer dans @rep@',
694
+    'plugin_info_upgrade_ok' => 'Mise à jour réussie',
695
+    'plugin_librairies_installees' => 'Librairies installées',
696
+    'plugin_necessite_extension_php' => 'Nécessite l’extension PHP @plugin@ en version @version@.',
697
+    'plugin_necessite_extension_php_sans_version' => 'Nécessite l’extension PHP @plugin@',
698
+    'plugin_necessite_lib' => 'Ce plugin nécessite la librairie @lib@',
699
+    'plugin_necessite_php' => 'Nécessite @plugin@ en version @version@.',
700
+    'plugin_necessite_plugin' => 'Nécessite le plugin @plugin@ en version @version@.',
701
+    'plugin_necessite_plugin_sans_version' => 'Nécessite le plugin @plugin@',
702
+    'plugin_necessite_spip' => 'Nécessite SPIP en version @version@ minimum.',
703
+    'plugin_source' => 'source : ',
704
+    'plugin_titre_automatique' => 'Installation automatique',
705
+    'plugin_titre_automatique_ajouter' => 'Ajouter des plugins',
706
+    'plugin_titre_installation' => 'Installation du plugin @plugin@',
707
+    'plugin_titre_modifier' => 'Mes plugins',
708
+    'plugin_utilise_extension_php' => 'L’extension PHP @plugin@ doit être en version @version@.',
709
+    'plugin_utilise_php' => '@plugin@ doit être en version @version@.',
710
+    'plugin_utilise_plugin' => 'Le plugin @plugin@ doit être en version @version@.',
711
+    'plugin_zip_active' => 'Continuez pour l’activer',
712
+    'plugin_zip_adresse' => 'indiquez ci-dessous l’adresse d’un fichier zip de plugin à télécharger, ou encore l’adresse d’une liste de plugins.',
713
+    'plugin_zip_adresse_champ' => 'Adresse du plugin ou de la liste ',
714
+    'plugin_zip_content' => 'Il contient les fichiers suivants (@taille@),<br />prêts à installer dans le répertoire <code>@rep@</code>',
715
+    'plugin_zip_installe_finie' => 'Le fichier @zip@ a été décompacté et installé.',
716
+    'plugin_zip_installe_rep_finie' => 'Le fichier @zip@ a été décompacté et installé dans le répertoire @rep@',
717
+    'plugin_zip_installer' => 'Vous pouvez maintenant l’installer.',
718
+    'plugin_zip_telecharge' => 'Le fichier @zip@ a été téléchargé',
719
+    'plugins_actif_aucun' => 'Aucun plugin activé.',
720
+    'plugins_actif_un' => 'Un plugin activé.',
721
+    'plugins_actifs' => '@count@ plugins activés.',
722
+    'plugins_actifs_liste' => 'Actifs',
723
+    'plugins_compte' => '@count@ plugins',
724
+    'plugins_disponible_un' => 'Un plugin disponible.',
725
+    'plugins_disponibles' => '@count@ plugins disponibles.',
726
+    'plugins_erreur' => 'Erreur dans les plugins : @plugins@',
727
+    'plugins_liste' => 'Liste des plugins',
728
+    'plugins_liste_dist' => 'Plugins verrouillés',
729
+    'plugins_recents' => 'Plugins récents.',
730
+    'plugins_tous_liste' => 'Tous',
731
+    'plugins_vue_hierarchie' => 'Hiérarchie',
732
+    'plugins_vue_liste' => 'Liste',
733
+    'protocole_ldap' => 'Version du protocole :',
734 734
 
735
-	// Q
736
-	'queue_executer_maintenant' => 'Exécuter maintenant',
737
-	'queue_info_purger' => 'Vous pouvez supprimer toutes les tâches de fond en attente et réinitialiser la liste avec les tâches périodiques',
738
-	'queue_nb_jobs_in_queue' => '@nb@ tâches en attente',
739
-	'queue_next_job_in_nb_sec' => 'Prochaine tâche dans @nb@ s',
740
-	'queue_no_job_in_queue' => 'Aucune tâche en attente',
741
-	'queue_one_job_in_queue' => '1 tâche en attente',
742
-	'queue_priorite_tache' => 'priorité',
743
-	'queue_purger_queue' => 'Réinitialiser la liste des tâches',
744
-	'queue_titre' => 'Tâches de fond',
735
+    // Q
736
+    'queue_executer_maintenant' => 'Exécuter maintenant',
737
+    'queue_info_purger' => 'Vous pouvez supprimer toutes les tâches de fond en attente et réinitialiser la liste avec les tâches périodiques',
738
+    'queue_nb_jobs_in_queue' => '@nb@ tâches en attente',
739
+    'queue_next_job_in_nb_sec' => 'Prochaine tâche dans @nb@ s',
740
+    'queue_no_job_in_queue' => 'Aucune tâche en attente',
741
+    'queue_one_job_in_queue' => '1 tâche en attente',
742
+    'queue_priorite_tache' => 'priorité',
743
+    'queue_purger_queue' => 'Réinitialiser la liste des tâches',
744
+    'queue_titre' => 'Tâches de fond',
745 745
 
746
-	// R
747
-	'repertoire_plugins' => 'Répertoire :',
748
-	'required' => '(obligatoire)',
746
+    // R
747
+    'repertoire_plugins' => 'Répertoire :',
748
+    'required' => '(obligatoire)',
749 749
 
750
-	// S
751
-	'sans_heure' => 'sans heure',
752
-	'statut_admin_restreint' => 'admin restreint',
753
-	'statut_webmestre' => 'webmestre',
750
+    // S
751
+    'sans_heure' => 'sans heure',
752
+    'statut_admin_restreint' => 'admin restreint',
753
+    'statut_webmestre' => 'webmestre',
754 754
 
755
-	// T
756
-	'tache_cron_asap' => 'Tâche CRON @function@ (ASAP)',
757
-	'tache_cron_secondes' => 'Tâche CRON @function@ (toutes les @nb@ s)',
758
-	'taille_cache_image' => 'Les images calculées automatiquement par SPIP (vignettes des documents, titres présentés sous forme graphique, fonctions mathématiques au format TeX...) occupent dans le répertoire @dir@ un total de @taille@.',
759
-	'taille_cache_moins_de' => 'La taille du cache est de moins de @octets@.',
760
-	'taille_cache_octets' => 'La taille du cache est actuellement de @octets@ environ.',
761
-	'taille_cache_vide' => 'Le cache est vide.',
762
-	'taille_repertoire_cache' => 'Taille du répertoire cache',
763
-	'text_article_propose_publication' => 'Article proposé pour la publication.',
764
-	'texte_acces_ldap_anonyme_1' => 'Certains serveurs LDAP n’acceptent aucun accès anonyme. Dans ce cas il faut spécifier un identifiant d’accès initial afin de pouvoir ensuite rechercher des informations dans l’annuaire. Dans la plupart des cas néanmoins, les champs suivants pourront être laissés vides.',
765
-	'texte_admin_effacer_01' => 'Cette commande efface <i>tout</i> le contenu de la base de données,
755
+    // T
756
+    'tache_cron_asap' => 'Tâche CRON @function@ (ASAP)',
757
+    'tache_cron_secondes' => 'Tâche CRON @function@ (toutes les @nb@ s)',
758
+    'taille_cache_image' => 'Les images calculées automatiquement par SPIP (vignettes des documents, titres présentés sous forme graphique, fonctions mathématiques au format TeX...) occupent dans le répertoire @dir@ un total de @taille@.',
759
+    'taille_cache_moins_de' => 'La taille du cache est de moins de @octets@.',
760
+    'taille_cache_octets' => 'La taille du cache est actuellement de @octets@ environ.',
761
+    'taille_cache_vide' => 'Le cache est vide.',
762
+    'taille_repertoire_cache' => 'Taille du répertoire cache',
763
+    'text_article_propose_publication' => 'Article proposé pour la publication.',
764
+    'texte_acces_ldap_anonyme_1' => 'Certains serveurs LDAP n’acceptent aucun accès anonyme. Dans ce cas il faut spécifier un identifiant d’accès initial afin de pouvoir ensuite rechercher des informations dans l’annuaire. Dans la plupart des cas néanmoins, les champs suivants pourront être laissés vides.',
765
+    'texte_admin_effacer_01' => 'Cette commande efface <i>tout</i> le contenu de la base de données,
766 766
 y compris <i>tous</i> les accès rédacteurs et administrateurs. Après l’avoir exécutée, vous devrez lancer la
767 767
 réinstallation de SPIP pour recréer une nouvelle base ainsi qu’un premier accès administrateur.',
768
-	'texte_adresse_annuaire_1' => '(Si votre annuaire est installé sur la même machine que ce site Web, il s’agit probablement de « localhost ».)',
769
-	'texte_ajout_auteur' => 'L’auteur suivant a été ajouté à l’article :',
770
-	'texte_annuaire_ldap_1' => 'Si vous avez accès à un annuaire (LDAP), vous pouvez l’utiliser pour importer automatiquement des utilisateurs sous SPIP.',
771
-	'texte_article_statut' => 'Cet article est :',
772
-	'texte_article_virtuel' => 'Article virtuel',
773
-	'texte_article_virtuel_reference' => '<b>Article virtuel :</b> article référencé dans votre site SPIP, mais redirigé vers une autre URL. Pour supprimer la redirection, effacez l’URL ci-dessus.',
774
-	'texte_aucun_resultat_auteur' => 'Aucun résultat pour "@cherche_auteur@"',
775
-	'texte_auteur_messagerie' => 'Ce site peut vous indiquer en permanence la liste des rédacteurs connectés, ce qui vous permet d’échanger des messages en direct. Vous pouvez décider de ne pas apparaître dans cette liste (vous êtes « invisible » pour les autres utilisateurs).',
776
-	'texte_auteurs' => 'LES AUTEURS',
777
-	'texte_choix_base_1' => 'Choisissez votre base :',
778
-	'texte_choix_base_2' => 'Le serveur SQL contient plusieurs bases de données.',
779
-	'texte_choix_base_3' => '<b>Sélectionnez</b> ci-après celle qui vous a été attribuée par votre hébergeur :',
780
-	'texte_choix_table_prefix' => 'Préfixe des tables :',
781
-	'texte_compte_element' => '@count@ élément',
782
-	'texte_compte_elements' => '@count@ éléments',
783
-	'texte_conflit_edition_correction' => 'Veuillez contrôler ci-dessous les différences entre les deux versions du texte ; vous pouvez aussi copier vos modifications, puis recommencer.',
784
-	'texte_connexion_mysql' => 'Consultez les informations fournies par votre hébergeur : vous devez y trouver le serveur de base de données qu’il propose et vos identifiants personnels pour vous y connecter.',
785
-	'texte_contenu_article' => '(Contenu de l’article en quelques mots.)',
786
-	'texte_contenu_articles' => 'Selon la maquette adoptée pour votre site, vous pouvez décider
768
+    'texte_adresse_annuaire_1' => '(Si votre annuaire est installé sur la même machine que ce site Web, il s’agit probablement de « localhost ».)',
769
+    'texte_ajout_auteur' => 'L’auteur suivant a été ajouté à l’article :',
770
+    'texte_annuaire_ldap_1' => 'Si vous avez accès à un annuaire (LDAP), vous pouvez l’utiliser pour importer automatiquement des utilisateurs sous SPIP.',
771
+    'texte_article_statut' => 'Cet article est :',
772
+    'texte_article_virtuel' => 'Article virtuel',
773
+    'texte_article_virtuel_reference' => '<b>Article virtuel :</b> article référencé dans votre site SPIP, mais redirigé vers une autre URL. Pour supprimer la redirection, effacez l’URL ci-dessus.',
774
+    'texte_aucun_resultat_auteur' => 'Aucun résultat pour "@cherche_auteur@"',
775
+    'texte_auteur_messagerie' => 'Ce site peut vous indiquer en permanence la liste des rédacteurs connectés, ce qui vous permet d’échanger des messages en direct. Vous pouvez décider de ne pas apparaître dans cette liste (vous êtes « invisible » pour les autres utilisateurs).',
776
+    'texte_auteurs' => 'LES AUTEURS',
777
+    'texte_choix_base_1' => 'Choisissez votre base :',
778
+    'texte_choix_base_2' => 'Le serveur SQL contient plusieurs bases de données.',
779
+    'texte_choix_base_3' => '<b>Sélectionnez</b> ci-après celle qui vous a été attribuée par votre hébergeur :',
780
+    'texte_choix_table_prefix' => 'Préfixe des tables :',
781
+    'texte_compte_element' => '@count@ élément',
782
+    'texte_compte_elements' => '@count@ éléments',
783
+    'texte_conflit_edition_correction' => 'Veuillez contrôler ci-dessous les différences entre les deux versions du texte ; vous pouvez aussi copier vos modifications, puis recommencer.',
784
+    'texte_connexion_mysql' => 'Consultez les informations fournies par votre hébergeur : vous devez y trouver le serveur de base de données qu’il propose et vos identifiants personnels pour vous y connecter.',
785
+    'texte_contenu_article' => '(Contenu de l’article en quelques mots.)',
786
+    'texte_contenu_articles' => 'Selon la maquette adoptée pour votre site, vous pouvez décider
787 787
 		que certains éléments des articles ne sont pas utilisés.
788 788
 		Utilisez la liste ci-dessous pour indiquer quels éléments sont disponibles.',
789
-	'texte_crash_base' => 'Si votre base de données a
789
+    'texte_crash_base' => 'Si votre base de données a
790 790
 			crashé, vous pouvez tenter une réparation
791 791
 			automatique.',
792
-	'texte_creer_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer une rubrique.',
793
-	'texte_date_creation_article' => 'DATE DE CRÉATION DE L’ARTICLE :', # on ajoute le ":"
794
-	'texte_date_creation_objet' => 'Date de création :', # on ajoute le ":"
795
-	'texte_date_publication_anterieure' => 'Date de rédaction antérieure :',
796
-	'texte_date_publication_anterieure_nonaffichee' => 'Ne pas afficher de date de rédaction antérieure.',
797
-	'texte_date_publication_article' => 'DATE DE PUBLICATION EN LIGNE :',
798
-	'texte_date_publication_objet' => 'Date de publication en ligne :',
799
-	'texte_definir_comme_traduction_rubrique' => 'Cette rubrique est une traduction de la rubrique numéro :',
800
-	'texte_descriptif_rapide' => 'Descriptif rapide',
801
-	'texte_effacer_base' => 'Effacer la base de données SPIP',
802
-	'texte_effacer_statistiques' => 'Effacer les statistiques',
803
-	'texte_en_cours_validation' => 'Les contenus ci-dessous sont en attente de validation.',
804
-	'texte_enrichir_mise_a_jour' => 'Vous pouvez enrichir la mise en page de votre texte en utilisant des « raccourcis typographiques ».',
805
-	'texte_fichier_authent' => '<b>SPIP doit-il créer les fichiers spéciaux
792
+    'texte_creer_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer une rubrique.',
793
+    'texte_date_creation_article' => 'DATE DE CRÉATION DE L’ARTICLE :', # on ajoute le ":"
794
+    'texte_date_creation_objet' => 'Date de création :', # on ajoute le ":"
795
+    'texte_date_publication_anterieure' => 'Date de rédaction antérieure :',
796
+    'texte_date_publication_anterieure_nonaffichee' => 'Ne pas afficher de date de rédaction antérieure.',
797
+    'texte_date_publication_article' => 'DATE DE PUBLICATION EN LIGNE :',
798
+    'texte_date_publication_objet' => 'Date de publication en ligne :',
799
+    'texte_definir_comme_traduction_rubrique' => 'Cette rubrique est une traduction de la rubrique numéro :',
800
+    'texte_descriptif_rapide' => 'Descriptif rapide',
801
+    'texte_effacer_base' => 'Effacer la base de données SPIP',
802
+    'texte_effacer_statistiques' => 'Effacer les statistiques',
803
+    'texte_en_cours_validation' => 'Les contenus ci-dessous sont en attente de validation.',
804
+    'texte_enrichir_mise_a_jour' => 'Vous pouvez enrichir la mise en page de votre texte en utilisant des « raccourcis typographiques ».',
805
+    'texte_fichier_authent' => '<b>SPIP doit-il créer les fichiers spéciaux
806 806
 <tt>.htpasswd</tt> et <tt>.htpasswd-admin</tt> dans le répertoire @dossier@ ?</b>
807 807
 <p>Ces fichiers peuvent vous servir à restreindre l’accès aux auteurs et administrateurs en d’autres endroits de votre site (programme externe de statistiques, par exemple).</p>
808 808
 <p>Si vous n’en avez pas l’utilité, vous pouvez laisser cette option à sa valeur par défaut (pas de création des fichiers).</p>',
809
-	'texte_informations_personnelles_1' => 'Le système va maintenant vous créer un accès personnalisé au site.',
810
-	'texte_informations_personnelles_2' => '(Note : il s’agit d’une réinstallation, si votre accès marche toujours vous pouvez',
811
-	'texte_introductif_article' => '(Texte introductif de l’article.)',
812
-	'texte_jeu_caractere' => 'Il est conseillé d’employer, sur votre site, l’alphabet universel (<tt>utf-8</tt>) : celui-ci permet l’affichage de textes dans toutes les langues, et ne pose plus de problèmes de compatibilité avec les navigateurs modernes.',
813
-	'texte_jeu_caractere_3' => 'Votre site est actuellement installé dans le jeu de caractères :',
814
-	'texte_jeu_caractere_4' => 'Si cela ne correspond pas à la réalité de vos données (suite, par exemple, à une restauration de base de données), ou si <em>vous démarrez ce site</em> et souhaitez partir sur un autre jeu de caractères, veuillez indiquer ce dernier ici :',
815
-	'texte_login_ldap_1' => '(Laisser vide pour un accès anonyme, ou entrer le chemin complet, par exemple « <tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt> ».)',
816
-	'texte_login_precaution' => 'Attention ! Ceci est le login sous lequel vous êtes connecté actuellement.
809
+    'texte_informations_personnelles_1' => 'Le système va maintenant vous créer un accès personnalisé au site.',
810
+    'texte_informations_personnelles_2' => '(Note : il s’agit d’une réinstallation, si votre accès marche toujours vous pouvez',
811
+    'texte_introductif_article' => '(Texte introductif de l’article.)',
812
+    'texte_jeu_caractere' => 'Il est conseillé d’employer, sur votre site, l’alphabet universel (<tt>utf-8</tt>) : celui-ci permet l’affichage de textes dans toutes les langues, et ne pose plus de problèmes de compatibilité avec les navigateurs modernes.',
813
+    'texte_jeu_caractere_3' => 'Votre site est actuellement installé dans le jeu de caractères :',
814
+    'texte_jeu_caractere_4' => 'Si cela ne correspond pas à la réalité de vos données (suite, par exemple, à une restauration de base de données), ou si <em>vous démarrez ce site</em> et souhaitez partir sur un autre jeu de caractères, veuillez indiquer ce dernier ici :',
815
+    'texte_login_ldap_1' => '(Laisser vide pour un accès anonyme, ou entrer le chemin complet, par exemple « <tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt> ».)',
816
+    'texte_login_precaution' => 'Attention ! Ceci est le login sous lequel vous êtes connecté actuellement.
817 817
 	Utilisez ce formulaire avec précaution...',
818
-	'texte_messagerie_agenda' => 'Une messagerie permet aux rédacteurs du site de communiquer entre eux directement dans l’espace privé du site. Elle est associée à un agenda.',
819
-	'texte_mise_a_niveau_base_1' => 'Vous venez de mettre à jour les fichiers SPIP.
818
+    'texte_messagerie_agenda' => 'Une messagerie permet aux rédacteurs du site de communiquer entre eux directement dans l’espace privé du site. Elle est associée à un agenda.',
819
+    'texte_mise_a_niveau_base_1' => 'Vous venez de mettre à jour les fichiers SPIP.
820 820
 	Il faut maintenant mettre à niveau la base de données
821 821
 	du site.',
822
-	'texte_modifier_article' => 'Modifier l’article :',
823
-	'texte_multilinguisme' => 'Si vous souhaitez gérer des objets en plusieurs langues, avec une navigation complexe, vous pouvez ajouter un menu de sélection de langue sur ces objets, en fonction de l’organisation de votre site.',
824
-	'texte_multilinguisme_trad' => 'Vous pouvez également activer un système de gestion de liens entre les différentes traductions sur certains objets.',
825
-	'texte_non_compresse' => '<i>non compressé</i> (votre serveur ne supportant pas cette fonctionnalité)',
826
-	'texte_nouvelle_version_spip_1' => 'Vous avez installé une nouvelle version de SPIP.',
827
-	'texte_nouvelle_version_spip_2' => 'Cette nouvelle version nécessite une mise à jour plus complète qu’à l’accoutumée. Si vous êtes webmestre du site, veuillez effacer le fichier @connect@ et reprendre l’installation afin de mettre à jour vos paramètres de connexion à la base de données.<p> (NB. : si vous avez oublié vos paramètres de connexion, jetez un œil au fichier @connect@ avant de le supprimer...)</p>',
828
-	'texte_operation_echec' => 'Retournez à la page précédente, sélectionnez une autre base ou créez-en une nouvelle. Vérifiez les informations fournies par votre hébergeur.',
829
-	'texte_plus_trois_car' => 'plus de 3 caractères',
830
-	'texte_plusieurs_articles' => 'Plusieurs auteurs trouvés pour "@cherche_auteur@" :',
831
-	'texte_port_annuaire' => '(La valeur indiquée par défaut convient généralement.)',
832
-	'texte_presente_plugin' => 'Cette page liste les plugins disponibles sur le site. Vous pouvez activer les plugins nécessaires en cochant la case correspondante.',
833
-	'texte_proposer_publication' => 'Lorsque votre article est terminé,<br /> vous pouvez proposer sa publication.',
834
-	'texte_proxy' => 'Dans certains cas (intranet, réseaux protégés), les sites distants (documentation de SPIP, sites syndiqués, etc.) ne sont accessibles qu’à travers un <i>proxy HTTP</i>. Le cas échéant, indiquez ci-dessous son adresse, sous la forme @proxy_en_cours@. En général, vous laisserez cette case vide.',
835
-	'texte_publication_articles_post_dates' => 'Quel comportement SPIP doit-il adopter face aux articles dont la
822
+    'texte_modifier_article' => 'Modifier l’article :',
823
+    'texte_multilinguisme' => 'Si vous souhaitez gérer des objets en plusieurs langues, avec une navigation complexe, vous pouvez ajouter un menu de sélection de langue sur ces objets, en fonction de l’organisation de votre site.',
824
+    'texte_multilinguisme_trad' => 'Vous pouvez également activer un système de gestion de liens entre les différentes traductions sur certains objets.',
825
+    'texte_non_compresse' => '<i>non compressé</i> (votre serveur ne supportant pas cette fonctionnalité)',
826
+    'texte_nouvelle_version_spip_1' => 'Vous avez installé une nouvelle version de SPIP.',
827
+    'texte_nouvelle_version_spip_2' => 'Cette nouvelle version nécessite une mise à jour plus complète qu’à l’accoutumée. Si vous êtes webmestre du site, veuillez effacer le fichier @connect@ et reprendre l’installation afin de mettre à jour vos paramètres de connexion à la base de données.<p> (NB. : si vous avez oublié vos paramètres de connexion, jetez un œil au fichier @connect@ avant de le supprimer...)</p>',
828
+    'texte_operation_echec' => 'Retournez à la page précédente, sélectionnez une autre base ou créez-en une nouvelle. Vérifiez les informations fournies par votre hébergeur.',
829
+    'texte_plus_trois_car' => 'plus de 3 caractères',
830
+    'texte_plusieurs_articles' => 'Plusieurs auteurs trouvés pour "@cherche_auteur@" :',
831
+    'texte_port_annuaire' => '(La valeur indiquée par défaut convient généralement.)',
832
+    'texte_presente_plugin' => 'Cette page liste les plugins disponibles sur le site. Vous pouvez activer les plugins nécessaires en cochant la case correspondante.',
833
+    'texte_proposer_publication' => 'Lorsque votre article est terminé,<br /> vous pouvez proposer sa publication.',
834
+    'texte_proxy' => 'Dans certains cas (intranet, réseaux protégés), les sites distants (documentation de SPIP, sites syndiqués, etc.) ne sont accessibles qu’à travers un <i>proxy HTTP</i>. Le cas échéant, indiquez ci-dessous son adresse, sous la forme @proxy_en_cours@. En général, vous laisserez cette case vide.',
835
+    'texte_publication_articles_post_dates' => 'Quel comportement SPIP doit-il adopter face aux articles dont la
836 836
 		date de publication a été fixée à une
837 837
 		échéance future ?',
838
-	'texte_rappel_selection_champs' => '[N’oubliez pas de sélectionner correctement ce champ.]',
839
-	'texte_recalcul_page' => 'Si vous voulez
838
+    'texte_rappel_selection_champs' => '[N’oubliez pas de sélectionner correctement ce champ.]',
839
+    'texte_recalcul_page' => 'Si vous voulez
840 840
 recalculer une seule page, passez plutôt par l’espace public et utilisez-y le bouton « recalculer ».',
841
-	'texte_recuperer_base' => 'Réparer la base de données',
842
-	'texte_reference_mais_redirige' => 'article référencé dans votre site SPIP, mais redirigé vers une autre URL.',
843
-	'texte_requetes_echouent' => '<b>Lorsque certaines requêtes SQL échouent
841
+    'texte_recuperer_base' => 'Réparer la base de données',
842
+    'texte_reference_mais_redirige' => 'article référencé dans votre site SPIP, mais redirigé vers une autre URL.',
843
+    'texte_requetes_echouent' => '<b>Lorsque certaines requêtes SQL échouent
844 844
   systématiquement et sans raison apparente, il est possible
845 845
   que ce soit à cause de la base de données
846 846
   elle-même.</b><p>
@@ -851,90 +851,90 @@  discard block
 block discarded – undo
851 851
   peut-être des indices de ce qui ne va pas...</p><p>
852 852
   Si le problème persiste, prenez contact avec votre
853 853
   hébergeur.</p>',
854
-	'texte_selection_langue_principale' => 'Vous pouvez sélectionner ci-dessous la « langue principale » du site. Ce choix ne vous oblige - heureusement ! - pas à écrire vos articles dans la langue sélectionnée, mais permet de déterminer :
854
+    'texte_selection_langue_principale' => 'Vous pouvez sélectionner ci-dessous la « langue principale » du site. Ce choix ne vous oblige - heureusement ! - pas à écrire vos articles dans la langue sélectionnée, mais permet de déterminer :
855 855
 	<ul><li> le format par défaut des dates sur le site public ;</li>
856 856
 	<li> la nature du moteur typographique que SPIP doit utiliser pour le rendu des textes ;</li>
857 857
 	<li> la langue utilisée dans les formulaires du site public ;</li>
858 858
 	<li> la langue présentée par défaut dans l’espace privé.</li></ul>',
859
-	'texte_sous_titre' => 'Sous-titre',
860
-	'texte_statistiques_visites' => '(barres foncées :  dimanche / courbe foncée : évolution de la moyenne)',
861
-	'texte_statut_attente_validation' => 'en attente de validation',
862
-	'texte_statut_publies' => 'publiés en ligne',
863
-	'texte_statut_refuses' => 'refusés',
864
-	'texte_suppression_fichiers' => 'Utilisez cette commande afin de supprimer tous les fichiers présents
859
+    'texte_sous_titre' => 'Sous-titre',
860
+    'texte_statistiques_visites' => '(barres foncées :  dimanche / courbe foncée : évolution de la moyenne)',
861
+    'texte_statut_attente_validation' => 'en attente de validation',
862
+    'texte_statut_publies' => 'publiés en ligne',
863
+    'texte_statut_refuses' => 'refusés',
864
+    'texte_suppression_fichiers' => 'Utilisez cette commande afin de supprimer tous les fichiers présents
865 865
 dans le cache SPIP. Cela permet par exemple de forcer un recalcul de toutes les pages si vous
866 866
 avez fait des modifications importantes de graphisme ou de structure du site.',
867
-	'texte_sur_titre' => 'Sur-titre',
868
-	'texte_table_ok' => ' : cette table est OK.',
869
-	'texte_tentative_recuperation' => 'Tentative de réparation',
870
-	'texte_tenter_reparation' => 'Tenter une réparation de la base de données',
871
-	'texte_test_proxy' => 'Pour faire un essai de ce proxy, indiquez ici l’adresse d’un site Web
867
+    'texte_sur_titre' => 'Sur-titre',
868
+    'texte_table_ok' => ' : cette table est OK.',
869
+    'texte_tentative_recuperation' => 'Tentative de réparation',
870
+    'texte_tenter_reparation' => 'Tenter une réparation de la base de données',
871
+    'texte_test_proxy' => 'Pour faire un essai de ce proxy, indiquez ici l’adresse d’un site Web
872 872
 				que vous souhaitez tester.',
873
-	'texte_titre_02' => 'Titre :',
874
-	'texte_titre_obligatoire' => '<b>Titre</b> [Obligatoire]',
875
-	'texte_travail_article' => '@nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
876
-	'texte_travail_collaboratif' => 'S’il est fréquent que plusieurs rédacteurs
873
+    'texte_titre_02' => 'Titre :',
874
+    'texte_titre_obligatoire' => '<b>Titre</b> [Obligatoire]',
875
+    'texte_travail_article' => '@nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
876
+    'texte_travail_collaboratif' => 'S’il est fréquent que plusieurs rédacteurs
877 877
 		travaillent sur le même article, le système
878 878
 		peut afficher les articles récemment « ouverts »
879 879
 		afin d’éviter les modifications simultanées.
880 880
 		Cette option est désactivée par défaut
881 881
 		afin d’éviter d’afficher des messages d’avertissement
882 882
 		intempestifs.',
883
-	'texte_vide' => 'vide',
884
-	'texte_vider_cache' => 'Vider le cache',
885
-	'titre_admin_tech' => 'Maintenance technique',
886
-	'titre_admin_vider' => 'Maintenance technique',
887
-	'titre_ajouter_un_auteur' => 'Ajouter un auteur',
888
-	'titre_ajouter_un_mot' => 'Ajouter un mot-clé',
889
-	'titre_cadre_afficher_article' => 'Afficher les articles',
890
-	'titre_cadre_afficher_traductions' => 'Afficher l’état des traductions pour les langues suivantes :',
891
-	'titre_cadre_ajouter_auteur' => 'AJOUTER UN AUTEUR :',
892
-	'titre_cadre_interieur_rubrique' => 'À l’intérieur de la rubrique',
893
-	'titre_cadre_numero_auteur' => 'AUTEUR NUMÉRO',
894
-	'titre_cadre_numero_objet' => '@objet@ NUMÉRO :',
895
-	'titre_cadre_signature_obligatoire' => '<b>Signature</b> [Obligatoire]<br />',
896
-	'titre_config_contenu_notifications' => 'Notifications',
897
-	'titre_config_contenu_prive' => 'Dans l’espace privé',
898
-	'titre_config_contenu_public' => 'Sur le site public',
899
-	'titre_config_fonctions' => 'Configuration du site',
900
-	'titre_config_langage' => 'Configurer la langue',
901
-	'titre_configuration' => 'Configuration du site',
902
-	'titre_configurer_preferences' => 'Configurer vos préférences',
903
-	'titre_configurer_preferences_menus' => 'Configurer vos préférences de menus',
904
-	'titre_conflit_edition' => 'Conflit lors de l’édition',
905
-	'titre_connexion_ldap' => 'Options : <b>Votre connexion LDAP</b>',
906
-	'titre_groupe_mots' => 'GROUPE DE MOTS :',
907
-	'titre_identite_site' => 'Identité du site',
908
-	'titre_langue_article' => 'Langue de l’article',
909
-	'titre_langue_rubrique' => 'Langue de la rubrique',
910
-	'titre_langue_trad_article' => 'LANGUE ET TRADUCTIONS DE L’ARTICLE',
911
-	'titre_les_articles' => 'LES ARTICLES',
912
-	'titre_messagerie_agenda' => 'Messagerie et agenda',
913
-	'titre_naviguer_dans_le_site' => 'Naviguer dans le site...',
914
-	'titre_nouvelle_rubrique' => 'Nouvelle rubrique',
915
-	'titre_numero_rubrique' => 'RUBRIQUE NUMÉRO :',
916
-	'titre_page_articles_edit' => 'Modifier : @titre@',
917
-	'titre_page_articles_page' => 'Les articles',
918
-	'titre_page_articles_tous' => 'Tout le site',
919
-	'titre_page_calendrier' => 'Calendrier @nom_mois@ @annee@',
920
-	'titre_page_config_contenu' => 'Configuration du site',
921
-	'titre_page_delete_all' => 'suppression totale et irréversible',
922
-	'titre_page_recherche' => 'Résultats de la recherche @recherche@',
923
-	'titre_page_statistiques_referers' => 'Statistiques (liens entrants)',
924
-	'titre_page_upgrade' => 'Mise à niveau de SPIP',
925
-	'titre_preference_menus_favoris' => 'Menus favoris',
926
-	'titre_publication_articles_post_dates' => 'Publication des articles post-datés',
927
-	'titre_reparation' => 'Réparation',
928
-	'titre_suivi_petition' => 'Suivi des pétitions',
929
-	'tls_ldap' => 'Transport Layer Security :',
930
-	'trad_article_traduction' => 'Toutes les versions de cet article :',
931
-	'trad_delier' => 'Ne plus lier à ces traductions',
932
-	'trad_lier' => 'Cet article est une traduction de l’article numéro :',
933
-	'trad_new' => 'Écrire une nouvelle traduction',
883
+    'texte_vide' => 'vide',
884
+    'texte_vider_cache' => 'Vider le cache',
885
+    'titre_admin_tech' => 'Maintenance technique',
886
+    'titre_admin_vider' => 'Maintenance technique',
887
+    'titre_ajouter_un_auteur' => 'Ajouter un auteur',
888
+    'titre_ajouter_un_mot' => 'Ajouter un mot-clé',
889
+    'titre_cadre_afficher_article' => 'Afficher les articles',
890
+    'titre_cadre_afficher_traductions' => 'Afficher l’état des traductions pour les langues suivantes :',
891
+    'titre_cadre_ajouter_auteur' => 'AJOUTER UN AUTEUR :',
892
+    'titre_cadre_interieur_rubrique' => 'À l’intérieur de la rubrique',
893
+    'titre_cadre_numero_auteur' => 'AUTEUR NUMÉRO',
894
+    'titre_cadre_numero_objet' => '@objet@ NUMÉRO :',
895
+    'titre_cadre_signature_obligatoire' => '<b>Signature</b> [Obligatoire]<br />',
896
+    'titre_config_contenu_notifications' => 'Notifications',
897
+    'titre_config_contenu_prive' => 'Dans l’espace privé',
898
+    'titre_config_contenu_public' => 'Sur le site public',
899
+    'titre_config_fonctions' => 'Configuration du site',
900
+    'titre_config_langage' => 'Configurer la langue',
901
+    'titre_configuration' => 'Configuration du site',
902
+    'titre_configurer_preferences' => 'Configurer vos préférences',
903
+    'titre_configurer_preferences_menus' => 'Configurer vos préférences de menus',
904
+    'titre_conflit_edition' => 'Conflit lors de l’édition',
905
+    'titre_connexion_ldap' => 'Options : <b>Votre connexion LDAP</b>',
906
+    'titre_groupe_mots' => 'GROUPE DE MOTS :',
907
+    'titre_identite_site' => 'Identité du site',
908
+    'titre_langue_article' => 'Langue de l’article',
909
+    'titre_langue_rubrique' => 'Langue de la rubrique',
910
+    'titre_langue_trad_article' => 'LANGUE ET TRADUCTIONS DE L’ARTICLE',
911
+    'titre_les_articles' => 'LES ARTICLES',
912
+    'titre_messagerie_agenda' => 'Messagerie et agenda',
913
+    'titre_naviguer_dans_le_site' => 'Naviguer dans le site...',
914
+    'titre_nouvelle_rubrique' => 'Nouvelle rubrique',
915
+    'titre_numero_rubrique' => 'RUBRIQUE NUMÉRO :',
916
+    'titre_page_articles_edit' => 'Modifier : @titre@',
917
+    'titre_page_articles_page' => 'Les articles',
918
+    'titre_page_articles_tous' => 'Tout le site',
919
+    'titre_page_calendrier' => 'Calendrier @nom_mois@ @annee@',
920
+    'titre_page_config_contenu' => 'Configuration du site',
921
+    'titre_page_delete_all' => 'suppression totale et irréversible',
922
+    'titre_page_recherche' => 'Résultats de la recherche @recherche@',
923
+    'titre_page_statistiques_referers' => 'Statistiques (liens entrants)',
924
+    'titre_page_upgrade' => 'Mise à niveau de SPIP',
925
+    'titre_preference_menus_favoris' => 'Menus favoris',
926
+    'titre_publication_articles_post_dates' => 'Publication des articles post-datés',
927
+    'titre_reparation' => 'Réparation',
928
+    'titre_suivi_petition' => 'Suivi des pétitions',
929
+    'tls_ldap' => 'Transport Layer Security :',
930
+    'trad_article_traduction' => 'Toutes les versions de cet article :',
931
+    'trad_delier' => 'Ne plus lier à ces traductions',
932
+    'trad_lier' => 'Cet article est une traduction de l’article numéro :',
933
+    'trad_new' => 'Écrire une nouvelle traduction',
934 934
 
935
-	// U
936
-	'utf8_convert_erreur_orig' => 'Erreur : le jeu de caractères @charset@ n’est pas supporté.',
935
+    // U
936
+    'utf8_convert_erreur_orig' => 'Erreur : le jeu de caractères @charset@ n’est pas supporté.',
937 937
 
938
-	// V
939
-	'version' => 'Version :'
938
+    // V
939
+    'version' => 'Version :'
940 940
 );
Please login to merge, or discard this patch.