Completed
Push — master ( 8b5a3c...b0cbd6 )
by cam
01:56
created
ecrire/action/inscrire_auteur.php 2 patches
Indentation   +235 added lines, -235 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
 
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 
@@ -43,68 +43,68 @@  discard block
 block discarded – undo
43 43
  * @return array|string
44 44
  */
45 45
 function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = []) {
46
-	if (!is_array($options)) {
47
-		$options = ['id' => $options];
48
-	}
49
-
50
-	$f = function_exists('test_inscription')
51
-		? 'test_inscription'
52
-		: 'test_inscription_dist';
53
-	$desc = $f($statut, $mail_complet, $nom, $options);
54
-
55
-	// erreur ?
56
-	if (!is_array($desc)) {
57
-		return _T($desc);
58
-	}
59
-
60
-	include_spip('base/abstract_sql');
61
-	$res = sql_select('statut, id_auteur, login, email, nom', 'spip_auteurs', 'email=' . sql_quote($desc['email']));
62
-	// erreur ?
63
-	if (!$res) {
64
-		return _T('titre_probleme_technique');
65
-	}
66
-
67
-	$row = sql_fetch($res);
68
-	sql_free($res);
69
-	if ($row) {
70
-		if (isset($options['force_nouveau']) && $options['force_nouveau'] == true) {
71
-			$desc['id_auteur'] = $row['id_auteur'];
72
-			$desc = inscription_nouveau($desc);
73
-		} else {
74
-			$desc = $row;
75
-		}
76
-	} else // s'il n'existe pas deja, creer les identifiants
77
-	{
78
-		$desc = inscription_nouveau($desc);
79
-	}
80
-
81
-	// erreur ?
82
-	if (!is_array($desc)) {
83
-		return $desc;
84
-	}
85
-
86
-
87
-	// generer le mot de passe (ou le refaire si compte inutilise)
88
-	$desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']);
89
-
90
-	// attribuer un jeton pour confirmation par clic sur un lien
91
-	$desc['jeton'] = auteur_attribuer_jeton($desc['id_auteur']);
92
-
93
-	// charger de suite cette fonction, pour ses utilitaires
94
-	$envoyer_inscription = charger_fonction('envoyer_inscription', '');
95
-	[$sujet, $msg, $from, $head] = $envoyer_inscription($desc, $nom, $statut, $options);
96
-
97
-	$notifications = charger_fonction('notifications', 'inc');
98
-	notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head);
99
-
100
-	// Notifications
101
-	$notifications(
102
-		'inscription',
103
-		$desc['id_auteur'],
104
-		['nom' => $desc['nom'], 'email' => $desc['email']]
105
-	);
106
-
107
-	return $desc;
46
+    if (!is_array($options)) {
47
+        $options = ['id' => $options];
48
+    }
49
+
50
+    $f = function_exists('test_inscription')
51
+        ? 'test_inscription'
52
+        : 'test_inscription_dist';
53
+    $desc = $f($statut, $mail_complet, $nom, $options);
54
+
55
+    // erreur ?
56
+    if (!is_array($desc)) {
57
+        return _T($desc);
58
+    }
59
+
60
+    include_spip('base/abstract_sql');
61
+    $res = sql_select('statut, id_auteur, login, email, nom', 'spip_auteurs', 'email=' . sql_quote($desc['email']));
62
+    // erreur ?
63
+    if (!$res) {
64
+        return _T('titre_probleme_technique');
65
+    }
66
+
67
+    $row = sql_fetch($res);
68
+    sql_free($res);
69
+    if ($row) {
70
+        if (isset($options['force_nouveau']) && $options['force_nouveau'] == true) {
71
+            $desc['id_auteur'] = $row['id_auteur'];
72
+            $desc = inscription_nouveau($desc);
73
+        } else {
74
+            $desc = $row;
75
+        }
76
+    } else // s'il n'existe pas deja, creer les identifiants
77
+    {
78
+        $desc = inscription_nouveau($desc);
79
+    }
80
+
81
+    // erreur ?
82
+    if (!is_array($desc)) {
83
+        return $desc;
84
+    }
85
+
86
+
87
+    // generer le mot de passe (ou le refaire si compte inutilise)
88
+    $desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']);
89
+
90
+    // attribuer un jeton pour confirmation par clic sur un lien
91
+    $desc['jeton'] = auteur_attribuer_jeton($desc['id_auteur']);
92
+
93
+    // charger de suite cette fonction, pour ses utilitaires
94
+    $envoyer_inscription = charger_fonction('envoyer_inscription', '');
95
+    [$sujet, $msg, $from, $head] = $envoyer_inscription($desc, $nom, $statut, $options);
96
+
97
+    $notifications = charger_fonction('notifications', 'inc');
98
+    notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head);
99
+
100
+    // Notifications
101
+    $notifications(
102
+        'inscription',
103
+        $desc['id_auteur'],
104
+        ['nom' => $desc['nom'], 'email' => $desc['email']]
105
+    );
106
+
107
+    return $desc;
108 108
 }
109 109
 
110 110
 
@@ -127,23 +127,23 @@  discard block
 block discarded – undo
127 127
  *
128 128
  */
129 129
 function test_inscription_dist($statut, $mail, $nom, $options) {
130
-	include_spip('inc/filtres');
131
-	if (!$r = email_valide($mail)) {
132
-		return 'info_email_invalide';
133
-	}
134
-	$nom = trim((string) corriger_caracteres($nom));
135
-	$res = ['email' => $r, 'nom' => $nom, 'prefs' => $statut];
136
-	if (isset($options['login'])) {
137
-		$login = trim((string) corriger_caracteres($options['login']));
138
-		if (strlen($login) >= _LOGIN_TROP_COURT && strlen($nom) <= 64) {
139
-			$res['login'] = $login;
140
-		}
141
-	}
142
-	if (!isset($res['login']) && (strlen($nom) < _LOGIN_TROP_COURT || strlen($nom) > 64)) {
143
-		return 'ecrire:info_login_trop_court';
144
-	}
145
-
146
-	return $res;
130
+    include_spip('inc/filtres');
131
+    if (!$r = email_valide($mail)) {
132
+        return 'info_email_invalide';
133
+    }
134
+    $nom = trim((string) corriger_caracteres($nom));
135
+    $res = ['email' => $r, 'nom' => $nom, 'prefs' => $statut];
136
+    if (isset($options['login'])) {
137
+        $login = trim((string) corriger_caracteres($options['login']));
138
+        if (strlen($login) >= _LOGIN_TROP_COURT && strlen($nom) <= 64) {
139
+            $res['login'] = $login;
140
+        }
141
+    }
142
+    if (!isset($res['login']) && (strlen($nom) < _LOGIN_TROP_COURT || strlen($nom) > 64)) {
143
+        return 'ecrire:info_login_trop_court';
144
+    }
145
+
146
+    return $res;
147 147
 }
148 148
 
149 149
 
@@ -156,29 +156,29 @@  discard block
 block discarded – undo
156 156
  * @return mixed|string
157 157
  */
158 158
 function inscription_nouveau($desc) {
159
-	if (!isset($desc['login']) || !strlen((string) $desc['login'])) {
160
-		$desc['login'] = test_login($desc['nom'], $desc['email']);
161
-	}
159
+    if (!isset($desc['login']) || !strlen((string) $desc['login'])) {
160
+        $desc['login'] = test_login($desc['nom'], $desc['email']);
161
+    }
162 162
 
163
-	$desc['statut'] = 'nouveau';
164
-	include_spip('action/editer_auteur');
165
-	$id_auteur = $desc['id_auteur'] ?? auteur_inserer();
163
+    $desc['statut'] = 'nouveau';
164
+    include_spip('action/editer_auteur');
165
+    $id_auteur = $desc['id_auteur'] ?? auteur_inserer();
166 166
 
167
-	if (!$id_auteur) {
168
-		return _T('titre_probleme_technique');
169
-	}
167
+    if (!$id_auteur) {
168
+        return _T('titre_probleme_technique');
169
+    }
170 170
 
171
-	$desc['lang'] = $GLOBALS['spip_lang'];
171
+    $desc['lang'] = $GLOBALS['spip_lang'];
172 172
 
173
-	include_spip('inc/autoriser');
174
-	// lever l'autorisation pour pouvoir modifier le statut
175
-	autoriser_exception('modifier', 'auteur', $id_auteur);
176
-	auteur_modifier($id_auteur, $desc);
177
-	autoriser_exception('modifier', 'auteur', $id_auteur, false);
173
+    include_spip('inc/autoriser');
174
+    // lever l'autorisation pour pouvoir modifier le statut
175
+    autoriser_exception('modifier', 'auteur', $id_auteur);
176
+    auteur_modifier($id_auteur, $desc);
177
+    autoriser_exception('modifier', 'auteur', $id_auteur, false);
178 178
 
179
-	$desc['id_auteur'] = $id_auteur;
179
+    $desc['id_auteur'] = $id_auteur;
180 180
 
181
-	return $desc;
181
+    return $desc;
182 182
 }
183 183
 
184 184
 
@@ -194,27 +194,27 @@  discard block
 block discarded – undo
194 194
  * @param string $mail
195 195
  */
196 196
 function test_login($nom, $mail): string {
197
-	include_spip('inc/charsets');
198
-	$nom = strtolower((string) translitteration($nom));
199
-	$login_base = preg_replace('/[^\w\d_]/', '_', $nom);
200
-
201
-	// il faut eviter que le login soit vraiment trop court
202
-	if (strlen($login_base) < 3) {
203
-		$mail = strtolower((string) translitteration(preg_replace('/@.*/', '', $mail)));
204
-		$login_base = preg_replace('/[^\w\d]/', '_', $mail);
205
-	}
206
-	if (strlen($login_base) < 3) {
207
-		$login_base = 'user';
208
-	}
209
-
210
-	$login = $login_base;
211
-
212
-	for ($i = 1;; $i++) {
213
-		if (!sql_countsel('spip_auteurs', "login='$login'")) {
214
-			return $login;
215
-		}
216
-		$login = $login_base . $i;
217
-	}
197
+    include_spip('inc/charsets');
198
+    $nom = strtolower((string) translitteration($nom));
199
+    $login_base = preg_replace('/[^\w\d_]/', '_', $nom);
200
+
201
+    // il faut eviter que le login soit vraiment trop court
202
+    if (strlen($login_base) < 3) {
203
+        $mail = strtolower((string) translitteration(preg_replace('/@.*/', '', $mail)));
204
+        $login_base = preg_replace('/[^\w\d]/', '_', $mail);
205
+    }
206
+    if (strlen($login_base) < 3) {
207
+        $login_base = 'user';
208
+    }
209
+
210
+    $login = $login_base;
211
+
212
+    for ($i = 1;; $i++) {
213
+        if (!sql_countsel('spip_auteurs', "login='$login'")) {
214
+            return $login;
215
+        }
216
+        $login = $login_base . $i;
217
+    }
218 218
 }
219 219
 
220 220
 
@@ -232,26 +232,26 @@  discard block
 block discarded – undo
232 232
  */
233 233
 function envoyer_inscription_dist($desc, $nom, $mode, $options = []) {
234 234
 
235
-	$contexte = array_merge($desc, $options);
236
-	$contexte['nom'] = $nom;
237
-	$contexte['mode'] = $mode;
238
-	$contexte['url_confirm'] = generer_url_action('confirmer_inscription', '', true, true);
239
-	$contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'email', $desc['email']);
240
-	$contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'jeton', $desc['jeton']);
241
-	// S'il y a l'option redirect, on l'ajoute directement ici
242
-	if (isset($options['redirect'])) {
243
-		$contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'redirect', $options['redirect']);
244
-	}
245
-
246
-	$modele_mail = 'modeles/mail_inscription';
247
-	if (isset($options['modele_mail']) && $options['modele_mail']) {
248
-		$modele_mail = $options['modele_mail'];
249
-	}
250
-	$message = recuperer_fond($modele_mail, $contexte);
251
-	$from = ($options['from'] ?? '');
252
-	$head = '';
253
-
254
-	return ['', $message, $from, $head];
235
+    $contexte = array_merge($desc, $options);
236
+    $contexte['nom'] = $nom;
237
+    $contexte['mode'] = $mode;
238
+    $contexte['url_confirm'] = generer_url_action('confirmer_inscription', '', true, true);
239
+    $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'email', $desc['email']);
240
+    $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'jeton', $desc['jeton']);
241
+    // S'il y a l'option redirect, on l'ajoute directement ici
242
+    if (isset($options['redirect'])) {
243
+        $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'redirect', $options['redirect']);
244
+    }
245
+
246
+    $modele_mail = 'modeles/mail_inscription';
247
+    if (isset($options['modele_mail']) && $options['modele_mail']) {
248
+        $modele_mail = $options['modele_mail'];
249
+    }
250
+    $message = recuperer_fond($modele_mail, $contexte);
251
+    $from = ($options['from'] ?? '');
252
+    $head = '';
253
+
254
+    return ['', $message, $from, $head];
255 255
 }
256 256
 
257 257
 
@@ -262,12 +262,12 @@  discard block
 block discarded – undo
262 262
  * @return string
263 263
  */
264 264
 function creer_pass_pour_auteur($id_auteur) {
265
-	include_spip('inc/acces');
266
-	$pass = creer_pass_aleatoire(max(_PASS_LONGUEUR_MINI, 16), $id_auteur);
267
-	include_spip('action/editer_auteur');
268
-	auteur_instituer($id_auteur, ['pass' => $pass]);
265
+    include_spip('inc/acces');
266
+    $pass = creer_pass_aleatoire(max(_PASS_LONGUEUR_MINI, 16), $id_auteur);
267
+    include_spip('action/editer_auteur');
268
+    auteur_instituer($id_auteur, ['pass' => $pass]);
269 269
 
270
-	return $pass;
270
+    return $pass;
271 271
 }
272 272
 
273 273
 /**
@@ -280,17 +280,17 @@  discard block
 block discarded – undo
280 280
  * @return string
281 281
  */
282 282
 function tester_statut_inscription($statut_tmp, $id) {
283
-	include_spip('inc/autoriser');
284
-	if ($statut_tmp) {
285
-		return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : '';
286
-	} elseif (
287
-		autoriser('inscrireauteur', $statut_tmp = '1comite', $id)
288
-		|| autoriser('inscrireauteur', $statut_tmp = '6forum', $id)
289
-	) {
290
-		return $statut_tmp;
291
-	}
292
-
293
-	return '';
283
+    include_spip('inc/autoriser');
284
+    if ($statut_tmp) {
285
+        return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : '';
286
+    } elseif (
287
+        autoriser('inscrireauteur', $statut_tmp = '1comite', $id)
288
+        || autoriser('inscrireauteur', $statut_tmp = '6forum', $id)
289
+    ) {
290
+        return $statut_tmp;
291
+    }
292
+
293
+    return '';
294 294
 }
295 295
 
296 296
 
@@ -304,35 +304,35 @@  discard block
 block discarded – undo
304 304
  * @return array
305 305
  */
306 306
 function confirmer_statut_inscription($auteur) {
307
-	// securite
308
-	if ($auteur['statut'] != 'nouveau') {
309
-		return $auteur;
310
-	}
311
-
312
-	$s = $auteur['prefs'];
313
-	// securite, au cas ou prefs aurait ete corrompu (ou deja ecrase par un tableau serialize)
314
-	if (!preg_match(',^\w+$,', (string) $s)) {
315
-		$s = '6forum';
316
-	}
317
-	include_spip('inc/autoriser');
318
-	if (!autoriser('inscrireauteur', $s)) {
319
-		return $auteur;
320
-	}
321
-
322
-	include_spip('inc/autoriser');
323
-	// accorder l'autorisation de modif du statut auteur
324
-	autoriser_exception('modifier', 'auteur', $auteur['id_auteur']);
325
-	include_spip('action/editer_auteur');
326
-	// changer le statut
327
-	auteur_modifier($auteur['id_auteur'], ['statut' => $s]);
328
-	unset($_COOKIE['spip_session']); // forcer la maj de la session
329
-	// lever l'autorisation de modif du statut auteur
330
-	autoriser_exception('modifier', 'auteur', $auteur['id_auteur'], false);
331
-
332
-	// mettre a jour le statut
333
-	$auteur['statut'] = $s;
334
-
335
-	return $auteur;
307
+    // securite
308
+    if ($auteur['statut'] != 'nouveau') {
309
+        return $auteur;
310
+    }
311
+
312
+    $s = $auteur['prefs'];
313
+    // securite, au cas ou prefs aurait ete corrompu (ou deja ecrase par un tableau serialize)
314
+    if (!preg_match(',^\w+$,', (string) $s)) {
315
+        $s = '6forum';
316
+    }
317
+    include_spip('inc/autoriser');
318
+    if (!autoriser('inscrireauteur', $s)) {
319
+        return $auteur;
320
+    }
321
+
322
+    include_spip('inc/autoriser');
323
+    // accorder l'autorisation de modif du statut auteur
324
+    autoriser_exception('modifier', 'auteur', $auteur['id_auteur']);
325
+    include_spip('action/editer_auteur');
326
+    // changer le statut
327
+    auteur_modifier($auteur['id_auteur'], ['statut' => $s]);
328
+    unset($_COOKIE['spip_session']); // forcer la maj de la session
329
+    // lever l'autorisation de modif du statut auteur
330
+    autoriser_exception('modifier', 'auteur', $auteur['id_auteur'], false);
331
+
332
+    // mettre a jour le statut
333
+    $auteur['statut'] = $s;
334
+
335
+    return $auteur;
336 336
 }
337 337
 
338 338
 
@@ -346,20 +346,20 @@  discard block
 block discarded – undo
346 346
  * @return string
347 347
  */
348 348
 function auteur_attribuer_jeton($id_auteur): string {
349
-	include_spip('base/abstract_sql');
350
-	include_spip('inc/acces');
351
-
352
-	// s'assurer de l'unicite du jeton pour le couple (email,cookie)
353
-	do {
354
-		// Un morceau du jeton est lisible en bdd pour éviter de devoir déchiffrer
355
-		// tous les jetons connus pour vérifier le jeton d’un auteur.
356
-		$public = substr((string) creer_uniqid(), 0, 7) . '.';
357
-		$jeton = $public . creer_uniqid();
358
-		$jeton_chiffre_prefixe = $public . Chiffrement::chiffrer($jeton, SpipCles::secret_du_site());
359
-		sql_updateq('spip_auteurs', ['cookie_oubli' => $jeton_chiffre_prefixe], 'id_auteur=' . (int) $id_auteur);
360
-	} while (sql_countsel('spip_auteurs', 'cookie_oubli=' . sql_quote($jeton_chiffre_prefixe, '', 'string')) > 1);
361
-
362
-	return $jeton;
349
+    include_spip('base/abstract_sql');
350
+    include_spip('inc/acces');
351
+
352
+    // s'assurer de l'unicite du jeton pour le couple (email,cookie)
353
+    do {
354
+        // Un morceau du jeton est lisible en bdd pour éviter de devoir déchiffrer
355
+        // tous les jetons connus pour vérifier le jeton d’un auteur.
356
+        $public = substr((string) creer_uniqid(), 0, 7) . '.';
357
+        $jeton = $public . creer_uniqid();
358
+        $jeton_chiffre_prefixe = $public . Chiffrement::chiffrer($jeton, SpipCles::secret_du_site());
359
+        sql_updateq('spip_auteurs', ['cookie_oubli' => $jeton_chiffre_prefixe], 'id_auteur=' . (int) $id_auteur);
360
+    } while (sql_countsel('spip_auteurs', 'cookie_oubli=' . sql_quote($jeton_chiffre_prefixe, '', 'string')) > 1);
361
+
362
+    return $jeton;
363 363
 }
364 364
 
365 365
 /**
@@ -373,19 +373,19 @@  discard block
 block discarded – undo
373 373
  * @return string|null
374 374
  */
375 375
 function auteur_lire_jeton(int $id_auteur, bool $autoInit = false): ?string {
376
-	include_spip('base/abstract_sql');
377
-	$jeton_chiffre_prefixe = sql_getfetsel('cookie_oubli', 'spip_auteurs', 'id_auteur=' . $id_auteur);
378
-	if ($jeton_chiffre_prefixe) {
379
-		$jeton_chiffre = substr((string) $jeton_chiffre_prefixe, 8);
380
-		$jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
381
-		if ($jeton) {
382
-			return $jeton;
383
-		}
384
-	}
385
-	if ($autoInit) {
386
-		return auteur_attribuer_jeton($id_auteur);
387
-	}
388
-	return null;
376
+    include_spip('base/abstract_sql');
377
+    $jeton_chiffre_prefixe = sql_getfetsel('cookie_oubli', 'spip_auteurs', 'id_auteur=' . $id_auteur);
378
+    if ($jeton_chiffre_prefixe) {
379
+        $jeton_chiffre = substr((string) $jeton_chiffre_prefixe, 8);
380
+        $jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
381
+        if ($jeton) {
382
+            return $jeton;
383
+        }
384
+    }
385
+    if ($autoInit) {
386
+        return auteur_attribuer_jeton($id_auteur);
387
+    }
388
+    return null;
389 389
 }
390 390
 
391 391
 /**
@@ -395,29 +395,29 @@  discard block
 block discarded – undo
395 395
  * @return array|bool
396 396
  */
397 397
 function auteur_verifier_jeton($jeton) {
398
-	// refuser un jeton corrompu
399
-	if (preg_match(',[^0-9a-f.],i', $jeton)) {
400
-		return false;
401
-	}
402
-
403
-	include_spip('base/abstract_sql');
404
-	$public = substr($jeton, 0, 8);
405
-
406
-	// Les auteurs qui ont un jetons ressemblant
407
-	$auteurs = sql_allfetsel('*', 'spip_auteurs', 'cookie_oubli LIKE ' . sql_quote($public . '%'));
408
-	foreach ($auteurs as $auteur) {
409
-		$jeton_chiffre = substr((string) $auteur['cookie_oubli'], 8);
410
-		try {
411
-			$_jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
412
-		} catch (\Exception $e) {
413
-			spip_log('Échec du déchiffrage du jeton d’auteur: ' . $e->getMessage(), 'chiffrer.' . _LOG_ERREUR);
414
-			return false;
415
-		}
416
-		if ($_jeton && hash_equals($jeton, $_jeton)) {
417
-			return $auteur;
418
-		}
419
-	}
420
-	return false;
398
+    // refuser un jeton corrompu
399
+    if (preg_match(',[^0-9a-f.],i', $jeton)) {
400
+        return false;
401
+    }
402
+
403
+    include_spip('base/abstract_sql');
404
+    $public = substr($jeton, 0, 8);
405
+
406
+    // Les auteurs qui ont un jetons ressemblant
407
+    $auteurs = sql_allfetsel('*', 'spip_auteurs', 'cookie_oubli LIKE ' . sql_quote($public . '%'));
408
+    foreach ($auteurs as $auteur) {
409
+        $jeton_chiffre = substr((string) $auteur['cookie_oubli'], 8);
410
+        try {
411
+            $_jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
412
+        } catch (\Exception $e) {
413
+            spip_log('Échec du déchiffrage du jeton d’auteur: ' . $e->getMessage(), 'chiffrer.' . _LOG_ERREUR);
414
+            return false;
415
+        }
416
+        if ($_jeton && hash_equals($jeton, $_jeton)) {
417
+            return $auteur;
418
+        }
419
+    }
420
+    return false;
421 421
 }
422 422
 
423 423
 /**
@@ -427,6 +427,6 @@  discard block
 block discarded – undo
427 427
  * @return bool
428 428
  */
429 429
 function auteur_effacer_jeton($id_auteur) {
430
-	include_spip('base/abstract_sql');
431
-	return sql_updateq('spip_auteurs', ['cookie_oubli' => ''], 'id_auteur=' . (int) $id_auteur);
430
+    include_spip('base/abstract_sql');
431
+    return sql_updateq('spip_auteurs', ['cookie_oubli' => ''], 'id_auteur=' . (int) $id_auteur);
432 432
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -58,7 +58,7 @@  discard block
 block discarded – undo
58 58
 	}
59 59
 
60 60
 	include_spip('base/abstract_sql');
61
-	$res = sql_select('statut, id_auteur, login, email, nom', 'spip_auteurs', 'email=' . sql_quote($desc['email']));
61
+	$res = sql_select('statut, id_auteur, login, email, nom', 'spip_auteurs', 'email='.sql_quote($desc['email']));
62 62
 	// erreur ?
63 63
 	if (!$res) {
64 64
 		return _T('titre_probleme_technique');
@@ -209,11 +209,11 @@  discard block
 block discarded – undo
209 209
 
210 210
 	$login = $login_base;
211 211
 
212
-	for ($i = 1;; $i++) {
212
+	for ($i = 1; ; $i++) {
213 213
 		if (!sql_countsel('spip_auteurs', "login='$login'")) {
214 214
 			return $login;
215 215
 		}
216
-		$login = $login_base . $i;
216
+		$login = $login_base.$i;
217 217
 	}
218 218
 }
219 219
 
@@ -353,11 +353,11 @@  discard block
 block discarded – undo
353 353
 	do {
354 354
 		// Un morceau du jeton est lisible en bdd pour éviter de devoir déchiffrer
355 355
 		// tous les jetons connus pour vérifier le jeton d’un auteur.
356
-		$public = substr((string) creer_uniqid(), 0, 7) . '.';
357
-		$jeton = $public . creer_uniqid();
358
-		$jeton_chiffre_prefixe = $public . Chiffrement::chiffrer($jeton, SpipCles::secret_du_site());
359
-		sql_updateq('spip_auteurs', ['cookie_oubli' => $jeton_chiffre_prefixe], 'id_auteur=' . (int) $id_auteur);
360
-	} while (sql_countsel('spip_auteurs', 'cookie_oubli=' . sql_quote($jeton_chiffre_prefixe, '', 'string')) > 1);
356
+		$public = substr((string) creer_uniqid(), 0, 7).'.';
357
+		$jeton = $public.creer_uniqid();
358
+		$jeton_chiffre_prefixe = $public.Chiffrement::chiffrer($jeton, SpipCles::secret_du_site());
359
+		sql_updateq('spip_auteurs', ['cookie_oubli' => $jeton_chiffre_prefixe], 'id_auteur='.(int) $id_auteur);
360
+	} while (sql_countsel('spip_auteurs', 'cookie_oubli='.sql_quote($jeton_chiffre_prefixe, '', 'string')) > 1);
361 361
 
362 362
 	return $jeton;
363 363
 }
@@ -374,7 +374,7 @@  discard block
 block discarded – undo
374 374
  */
375 375
 function auteur_lire_jeton(int $id_auteur, bool $autoInit = false): ?string {
376 376
 	include_spip('base/abstract_sql');
377
-	$jeton_chiffre_prefixe = sql_getfetsel('cookie_oubli', 'spip_auteurs', 'id_auteur=' . $id_auteur);
377
+	$jeton_chiffre_prefixe = sql_getfetsel('cookie_oubli', 'spip_auteurs', 'id_auteur='.$id_auteur);
378 378
 	if ($jeton_chiffre_prefixe) {
379 379
 		$jeton_chiffre = substr((string) $jeton_chiffre_prefixe, 8);
380 380
 		$jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
@@ -404,13 +404,13 @@  discard block
 block discarded – undo
404 404
 	$public = substr($jeton, 0, 8);
405 405
 
406 406
 	// Les auteurs qui ont un jetons ressemblant
407
-	$auteurs = sql_allfetsel('*', 'spip_auteurs', 'cookie_oubli LIKE ' . sql_quote($public . '%'));
407
+	$auteurs = sql_allfetsel('*', 'spip_auteurs', 'cookie_oubli LIKE '.sql_quote($public.'%'));
408 408
 	foreach ($auteurs as $auteur) {
409 409
 		$jeton_chiffre = substr((string) $auteur['cookie_oubli'], 8);
410 410
 		try {
411 411
 			$_jeton = Chiffrement::dechiffrer($jeton_chiffre, SpipCles::secret_du_site());
412 412
 		} catch (\Exception $e) {
413
-			spip_log('Échec du déchiffrage du jeton d’auteur: ' . $e->getMessage(), 'chiffrer.' . _LOG_ERREUR);
413
+			spip_log('Échec du déchiffrage du jeton d’auteur: '.$e->getMessage(), 'chiffrer.'._LOG_ERREUR);
414 414
 			return false;
415 415
 		}
416 416
 		if ($_jeton && hash_equals($jeton, $_jeton)) {
@@ -428,5 +428,5 @@  discard block
 block discarded – undo
428 428
  */
429 429
 function auteur_effacer_jeton($id_auteur) {
430 430
 	include_spip('base/abstract_sql');
431
-	return sql_updateq('spip_auteurs', ['cookie_oubli' => ''], 'id_auteur=' . (int) $id_auteur);
431
+	return sql_updateq('spip_auteurs', ['cookie_oubli' => ''], 'id_auteur='.(int) $id_auteur);
432 432
 }
Please login to merge, or discard this patch.
ecrire/inc/session.php 2 patches
Indentation   +497 added lines, -497 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  */
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 
@@ -39,15 +39,15 @@  discard block
 block discarded – undo
39 39
  * @return bool|null|void
40 40
  */
41 41
 function inc_session_dist($auteur = false) {
42
-	if (is_numeric($auteur)) {
43
-		return supprimer_sessions($auteur, $auteur > 0);
44
-	} else {
45
-		if (is_array($auteur)) {
46
-			return ajouter_session($auteur);
47
-		} else {
48
-			return verifier_session($auteur);
49
-		}
50
-	}
42
+    if (is_numeric($auteur)) {
43
+        return supprimer_sessions($auteur, $auteur > 0);
44
+    } else {
45
+        if (is_array($auteur)) {
46
+            return ajouter_session($auteur);
47
+        } else {
48
+            return verifier_session($auteur);
49
+        }
50
+    }
51 51
 }
52 52
 
53 53
 
@@ -76,37 +76,37 @@  discard block
 block discarded – undo
76 76
  */
77 77
 function supprimer_sessions($id_auteur, $toutes = true, $actives = true) {
78 78
 
79
-	$nb_files = 0;
80
-	$nb_max_files = (defined('_MAX_NB_SESSIONS_OUVERTES') ? _MAX_NB_SESSIONS_OUVERTES : 1000);
81
-	spip_log("supprimer sessions auteur $id_auteur", 'session');
82
-	if ($toutes || $id_auteur !== $GLOBALS['visiteur_session']['id_auteur']) {
83
-		if ($dir = opendir(_DIR_SESSIONS)) {
84
-			$t = $_SERVER['REQUEST_TIME']  - (4 * _RENOUVELLE_ALEA); // 48h par defaut
85
-			$t_short = $_SERVER['REQUEST_TIME']  - max(_RENOUVELLE_ALEA / 4, 3 * 3600); // 3h par defaut
86
-			while (($f = readdir($dir)) !== false) {
87
-				$nb_files++;
88
-				if (preg_match(',^[^\d-]*(-?\d+)_\w{32}\.php[3]?$,', $f, $regs)) {
89
-					$f = _DIR_SESSIONS . $f;
90
-					if ($actives && $regs[1] == $id_auteur || $t > filemtime($f)) {
91
-						spip_unlink($f);
92
-					}
93
-					// si il y a trop de sessions ouvertes, on purge les sessions anonymes de plus de 3H
94
-					// cf http://core.spip.org/issues/3276
95
-					elseif ($nb_files > $nb_max_files && !intval($regs[1]) && $t_short > filemtime($f)) {
96
-						spip_unlink($f);
97
-					}
98
-				}
99
-			}
100
-		}
101
-	} else {
102
-		verifier_session();
103
-		if ($cookie = lire_cookie_session()) {
104
-			spip_unlink(chemin_fichier_session('alea_ephemere', $cookie, true));
105
-		}
106
-	}
107
-
108
-	// forcer le recalcul de la session courante
109
-	spip_session(true);
79
+    $nb_files = 0;
80
+    $nb_max_files = (defined('_MAX_NB_SESSIONS_OUVERTES') ? _MAX_NB_SESSIONS_OUVERTES : 1000);
81
+    spip_log("supprimer sessions auteur $id_auteur", 'session');
82
+    if ($toutes || $id_auteur !== $GLOBALS['visiteur_session']['id_auteur']) {
83
+        if ($dir = opendir(_DIR_SESSIONS)) {
84
+            $t = $_SERVER['REQUEST_TIME']  - (4 * _RENOUVELLE_ALEA); // 48h par defaut
85
+            $t_short = $_SERVER['REQUEST_TIME']  - max(_RENOUVELLE_ALEA / 4, 3 * 3600); // 3h par defaut
86
+            while (($f = readdir($dir)) !== false) {
87
+                $nb_files++;
88
+                if (preg_match(',^[^\d-]*(-?\d+)_\w{32}\.php[3]?$,', $f, $regs)) {
89
+                    $f = _DIR_SESSIONS . $f;
90
+                    if ($actives && $regs[1] == $id_auteur || $t > filemtime($f)) {
91
+                        spip_unlink($f);
92
+                    }
93
+                    // si il y a trop de sessions ouvertes, on purge les sessions anonymes de plus de 3H
94
+                    // cf http://core.spip.org/issues/3276
95
+                    elseif ($nb_files > $nb_max_files && !intval($regs[1]) && $t_short > filemtime($f)) {
96
+                        spip_unlink($f);
97
+                    }
98
+                }
99
+            }
100
+        }
101
+    } else {
102
+        verifier_session();
103
+        if ($cookie = lire_cookie_session()) {
104
+            spip_unlink(chemin_fichier_session('alea_ephemere', $cookie, true));
105
+        }
106
+    }
107
+
108
+    // forcer le recalcul de la session courante
109
+    spip_session(true);
110 110
 }
111 111
 
112 112
 /**
@@ -124,124 +124,124 @@  discard block
 block discarded – undo
124 124
  * @return bool|string
125 125
  */
126 126
 function ajouter_session($auteur) {
127
-	// Si le client a deja une session valide pour son id_auteur
128
-	// on conserve le meme fichier
129
-
130
-	// Attention un visiteur peut avoir une session et un id=0,
131
-	// => ne pas melanger les sessions des differents visiteurs
132
-	$id_auteur = isset($auteur['id_auteur']) ? intval($auteur['id_auteur']) : 0;
133
-
134
-	// Si ce n'est pas un inscrit (les inscrits ont toujours des choses en session)
135
-	// on va vérifier s'il y a vraiment des choses à écrire
136
-	if (!$id_auteur) {
137
-		// On supprime les données de base pour voir le contenu réel de la session
138
-		$auteur_verif = $auteur;
139
-		if (isset($auteur_verif['id_auteur'])) {
140
-			unset($auteur_verif['id_auteur']);
141
-		}
142
-		if (isset($auteur_verif['hash_env'])) {
143
-			unset($auteur_verif['hash_env']);
144
-		}
145
-		if (isset($auteur_verif['ip_change'])) {
146
-			unset($auteur_verif['ip_change']);
147
-		}
148
-		if (isset($auteur_verif['date_session'])) {
149
-			unset($auteur_verif['date_session']);
150
-		}
151
-
152
-		// Les variables vraiment nulle ne sont pas à prendre en compte non plus
153
-		foreach ($auteur_verif as $variable => $valeur) {
154
-			if ($valeur === null) {
155
-				unset($auteur_verif[$variable]);
156
-			}
157
-		}
158
-
159
-		// Si après ça la session est vide alors on supprime l'éventuel fichier et on arrête là
160
-		if (!$auteur_verif) {
161
-			if ($cookie = lire_cookie_session()) {
162
-				if (isset($_SESSION[$cookie])) {
163
-					unset($_SESSION[$cookie]);
164
-				}
165
-				unset($_COOKIE['spip_session']);
166
-			}
167
-
168
-			return false;
169
-		}
170
-	}
171
-
172
-	if (
173
-		(!$cookie = lire_cookie_session())
174
-		|| intval($cookie) !== $id_auteur
175
-	) {
176
-		$cookie = $id_auteur . '_' . md5(uniqid(random_int(0, mt_getrandmax()), true));
177
-	}
178
-
179
-	// Maintenant on sait qu'on a des choses à écrire
180
-	// On s'assure d'avoir au moins ces valeurs
181
-	$auteur['id_auteur'] = $id_auteur;
182
-	if (!isset($auteur['hash_env'])) {
183
-		$auteur['hash_env'] = hash_env();
184
-	}
185
-	if (!isset($auteur['ip_change'])) {
186
-		$auteur['ip_change'] = false;
187
-	}
188
-
189
-	if (!isset($auteur['date_session'])) {
190
-		$auteur['date_session'] = time();
191
-	}
192
-	if (
193
-		isset($auteur['prefs'])
194
-		&& is_string($auteur['prefs'])
195
-		&& ($prefs = @unserialize($auteur['prefs']))
196
-	) {
197
-		$auteur['prefs'] = $prefs;
198
-	}
199
-
200
-	$fichier_session = '';
201
-
202
-	// les sessions anonymes sont stockees dans $_SESSION
203
-	if (!$id_auteur) {
204
-		spip_php_session_start();
205
-		$_SESSION[$cookie] = preparer_ecriture_session($auteur);
206
-	} else {
207
-		$fichier_session = chemin_fichier_session('alea_ephemere', $cookie);
208
-		if (!ecrire_fichier_session($fichier_session, $auteur)) {
209
-			spip_log('Echec ecriture fichier session ' . $fichier_session, 'session' . _LOG_HS);
210
-			include_spip('inc/minipres');
211
-			echo minipres();
212
-			exit;
213
-		}
214
-		// verifier et limiter le nombre maxi de sessions
215
-		// https://core.spip.net/issues/3807
216
-		lister_sessions_auteur($id_auteur);
217
-	}
218
-
219
-	// poser le cookie de session SPIP
220
-	include_spip('inc/cookie');
221
-	$duree = definir_duree_cookie_session($auteur);
222
-	$cookie = set_cookie_session($cookie, time() + $duree);
223
-	spip_log("ajoute session $fichier_session cookie $duree", 'session');
224
-
225
-	// Si on est admin, poser le cookie de correspondance
226
-	if (!function_exists('autoriser')) {
227
-		include_spip('inc/autoriser');
228
-	}
229
-	if (autoriser('ecrire', '', '', $auteur) && _DUREE_COOKIE_ADMIN) {
230
-		spip_setcookie(
231
-			'spip_admin',
232
-			'@' . ($auteur['email'] ?: $auteur['login']),
233
-			time() + max(_DUREE_COOKIE_ADMIN, $duree),
234
-			httponly: true
235
-		);
236
-	} else {
237
-		// sinon le supprimer ...
238
-		spip_setcookie('spip_admin', '', 1, httponly: true);
239
-	}
240
-
241
-	# on en profite pour purger les vieilles sessions anonymes abandonnees
242
-	# supprimer_sessions(0, true, false);
243
-
244
-	return $cookie;
127
+    // Si le client a deja une session valide pour son id_auteur
128
+    // on conserve le meme fichier
129
+
130
+    // Attention un visiteur peut avoir une session et un id=0,
131
+    // => ne pas melanger les sessions des differents visiteurs
132
+    $id_auteur = isset($auteur['id_auteur']) ? intval($auteur['id_auteur']) : 0;
133
+
134
+    // Si ce n'est pas un inscrit (les inscrits ont toujours des choses en session)
135
+    // on va vérifier s'il y a vraiment des choses à écrire
136
+    if (!$id_auteur) {
137
+        // On supprime les données de base pour voir le contenu réel de la session
138
+        $auteur_verif = $auteur;
139
+        if (isset($auteur_verif['id_auteur'])) {
140
+            unset($auteur_verif['id_auteur']);
141
+        }
142
+        if (isset($auteur_verif['hash_env'])) {
143
+            unset($auteur_verif['hash_env']);
144
+        }
145
+        if (isset($auteur_verif['ip_change'])) {
146
+            unset($auteur_verif['ip_change']);
147
+        }
148
+        if (isset($auteur_verif['date_session'])) {
149
+            unset($auteur_verif['date_session']);
150
+        }
151
+
152
+        // Les variables vraiment nulle ne sont pas à prendre en compte non plus
153
+        foreach ($auteur_verif as $variable => $valeur) {
154
+            if ($valeur === null) {
155
+                unset($auteur_verif[$variable]);
156
+            }
157
+        }
158
+
159
+        // Si après ça la session est vide alors on supprime l'éventuel fichier et on arrête là
160
+        if (!$auteur_verif) {
161
+            if ($cookie = lire_cookie_session()) {
162
+                if (isset($_SESSION[$cookie])) {
163
+                    unset($_SESSION[$cookie]);
164
+                }
165
+                unset($_COOKIE['spip_session']);
166
+            }
167
+
168
+            return false;
169
+        }
170
+    }
171
+
172
+    if (
173
+        (!$cookie = lire_cookie_session())
174
+        || intval($cookie) !== $id_auteur
175
+    ) {
176
+        $cookie = $id_auteur . '_' . md5(uniqid(random_int(0, mt_getrandmax()), true));
177
+    }
178
+
179
+    // Maintenant on sait qu'on a des choses à écrire
180
+    // On s'assure d'avoir au moins ces valeurs
181
+    $auteur['id_auteur'] = $id_auteur;
182
+    if (!isset($auteur['hash_env'])) {
183
+        $auteur['hash_env'] = hash_env();
184
+    }
185
+    if (!isset($auteur['ip_change'])) {
186
+        $auteur['ip_change'] = false;
187
+    }
188
+
189
+    if (!isset($auteur['date_session'])) {
190
+        $auteur['date_session'] = time();
191
+    }
192
+    if (
193
+        isset($auteur['prefs'])
194
+        && is_string($auteur['prefs'])
195
+        && ($prefs = @unserialize($auteur['prefs']))
196
+    ) {
197
+        $auteur['prefs'] = $prefs;
198
+    }
199
+
200
+    $fichier_session = '';
201
+
202
+    // les sessions anonymes sont stockees dans $_SESSION
203
+    if (!$id_auteur) {
204
+        spip_php_session_start();
205
+        $_SESSION[$cookie] = preparer_ecriture_session($auteur);
206
+    } else {
207
+        $fichier_session = chemin_fichier_session('alea_ephemere', $cookie);
208
+        if (!ecrire_fichier_session($fichier_session, $auteur)) {
209
+            spip_log('Echec ecriture fichier session ' . $fichier_session, 'session' . _LOG_HS);
210
+            include_spip('inc/minipres');
211
+            echo minipres();
212
+            exit;
213
+        }
214
+        // verifier et limiter le nombre maxi de sessions
215
+        // https://core.spip.net/issues/3807
216
+        lister_sessions_auteur($id_auteur);
217
+    }
218
+
219
+    // poser le cookie de session SPIP
220
+    include_spip('inc/cookie');
221
+    $duree = definir_duree_cookie_session($auteur);
222
+    $cookie = set_cookie_session($cookie, time() + $duree);
223
+    spip_log("ajoute session $fichier_session cookie $duree", 'session');
224
+
225
+    // Si on est admin, poser le cookie de correspondance
226
+    if (!function_exists('autoriser')) {
227
+        include_spip('inc/autoriser');
228
+    }
229
+    if (autoriser('ecrire', '', '', $auteur) && _DUREE_COOKIE_ADMIN) {
230
+        spip_setcookie(
231
+            'spip_admin',
232
+            '@' . ($auteur['email'] ?: $auteur['login']),
233
+            time() + max(_DUREE_COOKIE_ADMIN, $duree),
234
+            httponly: true
235
+        );
236
+    } else {
237
+        // sinon le supprimer ...
238
+        spip_setcookie('spip_admin', '', 1, httponly: true);
239
+    }
240
+
241
+    # on en profite pour purger les vieilles sessions anonymes abandonnees
242
+    # supprimer_sessions(0, true, false);
243
+
244
+    return $cookie;
245 245
 }
246 246
 
247 247
 /**
@@ -261,54 +261,54 @@  discard block
 block discarded – undo
261 261
  *     Durée en secondes
262 262
 **/
263 263
 function definir_duree_cookie_session($auteur) {
264
-	$coef = 2;
265
-	if (isset($auteur['cookie'])) {
266
-		if (is_numeric($auteur['cookie'])) {
267
-			$coef = $auteur['cookie'];
268
-		} else {
269
-			$coef = 20;
270
-		}
271
-	}
272
-	return (int)(_RENOUVELLE_ALEA * $coef);
264
+    $coef = 2;
265
+    if (isset($auteur['cookie'])) {
266
+        if (is_numeric($auteur['cookie'])) {
267
+            $coef = $auteur['cookie'];
268
+        } else {
269
+            $coef = 20;
270
+        }
271
+    }
272
+    return (int)(_RENOUVELLE_ALEA * $coef);
273 273
 }
274 274
 
275 275
 /**
276 276
  * Lire le cookie de session et le valider de façon centralisée
277 277
  */
278 278
 function lire_cookie_session(bool $accepter_test = false): ?string {
279
-	static $cookie_valide = [];
280
-	// pas de cookie ?
281
-	if (!isset($_COOKIE['spip_session'])) {
282
-		return null;
283
-	}
284
-
285
-	if (array_key_exists($_COOKIE['spip_session'], $cookie_valide)) {
286
-		return $cookie_valide[$_COOKIE['spip_session']];
287
-	}
288
-
289
-	if ($accepter_test && $_COOKIE['spip_session'] === 'test_echec_cookie') {
290
-		return 'test_echec_cookie';
291
-	}
292
-
293
-	if (!preg_match(",^\d+_[0-9a-f]{32}$,", $_COOKIE['spip_session'])) {
294
-		// cookie invalide ?
295
-		effacer_cookie_session();
296
-		return null;
297
-	}
298
-
299
-	// ok
300
-	$cookie_valide[$_COOKIE['spip_session']] = $_COOKIE['spip_session'];
301
-
302
-	return $_COOKIE['spip_session'];
279
+    static $cookie_valide = [];
280
+    // pas de cookie ?
281
+    if (!isset($_COOKIE['spip_session'])) {
282
+        return null;
283
+    }
284
+
285
+    if (array_key_exists($_COOKIE['spip_session'], $cookie_valide)) {
286
+        return $cookie_valide[$_COOKIE['spip_session']];
287
+    }
288
+
289
+    if ($accepter_test && $_COOKIE['spip_session'] === 'test_echec_cookie') {
290
+        return 'test_echec_cookie';
291
+    }
292
+
293
+    if (!preg_match(",^\d+_[0-9a-f]{32}$,", $_COOKIE['spip_session'])) {
294
+        // cookie invalide ?
295
+        effacer_cookie_session();
296
+        return null;
297
+    }
298
+
299
+    // ok
300
+    $cookie_valide[$_COOKIE['spip_session']] = $_COOKIE['spip_session'];
301
+
302
+    return $_COOKIE['spip_session'];
303 303
 }
304 304
 
305 305
 /** Annuler le cookie de session */
306 306
 function effacer_cookie_session(): void {
307
-	// supprimer le cookie
308
-	if (isset($_COOKIE['spip_session'])) {
309
-		spip_setcookie('spip_session', '', time() - 24 * 3600, httponly: true);
310
-		unset($_COOKIE['spip_session']);
311
-	}
307
+    // supprimer le cookie
308
+    if (isset($_COOKIE['spip_session'])) {
309
+        spip_setcookie('spip_session', '', time() - 24 * 3600, httponly: true);
310
+        unset($_COOKIE['spip_session']);
311
+    }
312 312
 }
313 313
 
314 314
 /**
@@ -320,20 +320,20 @@  discard block
 block discarded – undo
320 320
  *   timestamp d'expiration
321 321
  */
322 322
 function set_cookie_session(?string $valeur_cookie = null, int $expires = 0): ?string {
323
-	if ($valeur_cookie !== null) {
324
-		// vérifié par lire_cookie_session()
325
-		$_COOKIE['spip_session'] = $valeur_cookie;
326
-	}
323
+    if ($valeur_cookie !== null) {
324
+        // vérifié par lire_cookie_session()
325
+        $_COOKIE['spip_session'] = $valeur_cookie;
326
+    }
327 327
 
328
-	$valeur_cookie = lire_cookie_session();
328
+    $valeur_cookie = lire_cookie_session();
329 329
 
330
-	if ($valeur_cookie === null) {
331
-		effacer_cookie_session();
332
-	} else {
333
-		spip_setcookie('spip_session', $valeur_cookie, $expires, httponly: true);
334
-	}
330
+    if ($valeur_cookie === null) {
331
+        effacer_cookie_session();
332
+    } else {
333
+        spip_setcookie('spip_session', $valeur_cookie, $expires, httponly: true);
334
+    }
335 335
 
336
-	return $valeur_cookie;
336
+    return $valeur_cookie;
337 337
 }
338 338
 
339 339
 /**
@@ -353,91 +353,91 @@  discard block
 block discarded – undo
353 353
  * @return bool|int|null
354 354
  */
355 355
 function verifier_session($change = false) {
356
-	// si pas de cookie, c'est fichu
357
-	if (!$cookie = lire_cookie_session()) {
358
-		return false;
359
-	}
360
-
361
-	$fichier_session = '';
362
-
363
-	// est-ce une session anonyme ?
364
-	if (!intval($cookie)) {
365
-		spip_php_session_start();
366
-		if (!isset($_SESSION[$cookie]) || !is_array($_SESSION[$cookie])) {
367
-			return false;
368
-		}
369
-		$GLOBALS['visiteur_session'] = $_SESSION[$cookie];
370
-	} else {
371
-		// Tester avec alea courant
372
-		$fichier_session = chemin_fichier_session('alea_ephemere', $cookie, true);
373
-		if ($fichier_session && @file_exists($fichier_session)) {
374
-			include($fichier_session);
375
-		} else {
376
-			// Sinon, tester avec alea precedent
377
-			$fichier_session = chemin_fichier_session('alea_ephemere_ancien', $cookie, true);
378
-			if (!$fichier_session || !@file_exists($fichier_session)) {
379
-				return false;
380
-			}
381
-
382
-			// Renouveler la session avec l'alea courant
383
-			include($fichier_session);
384
-			spip_log('renouvelle session ' . $GLOBALS['visiteur_session']['id_auteur'], 'session');
385
-			spip_unlink($fichier_session);
386
-			ajouter_session($GLOBALS['visiteur_session']);
387
-		}
388
-	}
389
-
390
-	// Compatibilite ascendante : auteur_session est visiteur_session si
391
-	// c'est un auteur SPIP authentifie (tandis qu'un visiteur_session peut
392
-	// n'etre qu'identifie, sans aucune authentification).
393
-
394
-	if (isset($GLOBALS['visiteur_session']['id_auteur']) && $GLOBALS['visiteur_session']['id_auteur']) {
395
-		$GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session'];
396
-	}
397
-
398
-
399
-	// Si l'adresse IP change, inc/presentation mettra une balise image
400
-	// avec un URL de rappel demandant a changer le nom de la session.
401
-	// Seul celui qui a l'IP d'origine est rejoue
402
-	// ainsi un eventuel voleur de cookie ne pourrait pas deconnecter
403
-	// sa victime, mais se ferait deconnecter par elle.
404
-	if (hash_env() != $GLOBALS['visiteur_session']['hash_env']) {
405
-		if (!$GLOBALS['visiteur_session']['ip_change']) {
406
-			define('_SESSION_REJOUER', true);
407
-			$GLOBALS['visiteur_session']['ip_change'] = true;
408
-			ajouter_session($GLOBALS['visiteur_session']);
409
-		} else {
410
-			if ($change) {
411
-				spip_log('session non rejouee, vol de cookie ?', 'session');
412
-			}
413
-		}
414
-	} else {
415
-		if ($change) {
416
-			spip_log("rejoue session $fichier_session $cookie", 'session');
417
-			if ($fichier_session) {
418
-				spip_unlink($fichier_session);
419
-			}
420
-			$GLOBALS['visiteur_session']['ip_change'] = false;
421
-			unset($_COOKIE['spip_session']);
422
-			ajouter_session($GLOBALS['visiteur_session']);
423
-		}
424
-	}
425
-
426
-	// Si la session a ete initiee il y a trop longtemps, elle est annulee
427
-	if (
428
-		isset($GLOBALS['visiteur_session'])
429
-		&& defined('_AGE_SESSION_MAX')
430
-		&& _AGE_SESSION_MAX > 0
431
-		&& time() - @$GLOBALS['visiteur_session']['date_session'] > _AGE_SESSION_MAX
432
-	) {
433
-		unset($GLOBALS['visiteur_session']);
434
-
435
-		return false;
436
-	}
437
-
438
-	return is_numeric($GLOBALS['visiteur_session']['id_auteur'])
439
-		? $GLOBALS['visiteur_session']['id_auteur']
440
-		: null;
356
+    // si pas de cookie, c'est fichu
357
+    if (!$cookie = lire_cookie_session()) {
358
+        return false;
359
+    }
360
+
361
+    $fichier_session = '';
362
+
363
+    // est-ce une session anonyme ?
364
+    if (!intval($cookie)) {
365
+        spip_php_session_start();
366
+        if (!isset($_SESSION[$cookie]) || !is_array($_SESSION[$cookie])) {
367
+            return false;
368
+        }
369
+        $GLOBALS['visiteur_session'] = $_SESSION[$cookie];
370
+    } else {
371
+        // Tester avec alea courant
372
+        $fichier_session = chemin_fichier_session('alea_ephemere', $cookie, true);
373
+        if ($fichier_session && @file_exists($fichier_session)) {
374
+            include($fichier_session);
375
+        } else {
376
+            // Sinon, tester avec alea precedent
377
+            $fichier_session = chemin_fichier_session('alea_ephemere_ancien', $cookie, true);
378
+            if (!$fichier_session || !@file_exists($fichier_session)) {
379
+                return false;
380
+            }
381
+
382
+            // Renouveler la session avec l'alea courant
383
+            include($fichier_session);
384
+            spip_log('renouvelle session ' . $GLOBALS['visiteur_session']['id_auteur'], 'session');
385
+            spip_unlink($fichier_session);
386
+            ajouter_session($GLOBALS['visiteur_session']);
387
+        }
388
+    }
389
+
390
+    // Compatibilite ascendante : auteur_session est visiteur_session si
391
+    // c'est un auteur SPIP authentifie (tandis qu'un visiteur_session peut
392
+    // n'etre qu'identifie, sans aucune authentification).
393
+
394
+    if (isset($GLOBALS['visiteur_session']['id_auteur']) && $GLOBALS['visiteur_session']['id_auteur']) {
395
+        $GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session'];
396
+    }
397
+
398
+
399
+    // Si l'adresse IP change, inc/presentation mettra une balise image
400
+    // avec un URL de rappel demandant a changer le nom de la session.
401
+    // Seul celui qui a l'IP d'origine est rejoue
402
+    // ainsi un eventuel voleur de cookie ne pourrait pas deconnecter
403
+    // sa victime, mais se ferait deconnecter par elle.
404
+    if (hash_env() != $GLOBALS['visiteur_session']['hash_env']) {
405
+        if (!$GLOBALS['visiteur_session']['ip_change']) {
406
+            define('_SESSION_REJOUER', true);
407
+            $GLOBALS['visiteur_session']['ip_change'] = true;
408
+            ajouter_session($GLOBALS['visiteur_session']);
409
+        } else {
410
+            if ($change) {
411
+                spip_log('session non rejouee, vol de cookie ?', 'session');
412
+            }
413
+        }
414
+    } else {
415
+        if ($change) {
416
+            spip_log("rejoue session $fichier_session $cookie", 'session');
417
+            if ($fichier_session) {
418
+                spip_unlink($fichier_session);
419
+            }
420
+            $GLOBALS['visiteur_session']['ip_change'] = false;
421
+            unset($_COOKIE['spip_session']);
422
+            ajouter_session($GLOBALS['visiteur_session']);
423
+        }
424
+    }
425
+
426
+    // Si la session a ete initiee il y a trop longtemps, elle est annulee
427
+    if (
428
+        isset($GLOBALS['visiteur_session'])
429
+        && defined('_AGE_SESSION_MAX')
430
+        && _AGE_SESSION_MAX > 0
431
+        && time() - @$GLOBALS['visiteur_session']['date_session'] > _AGE_SESSION_MAX
432
+    ) {
433
+        unset($GLOBALS['visiteur_session']);
434
+
435
+        return false;
436
+    }
437
+
438
+    return is_numeric($GLOBALS['visiteur_session']['id_auteur'])
439
+        ? $GLOBALS['visiteur_session']['id_auteur']
440
+        : null;
441 441
 }
442 442
 
443 443
 /**
@@ -452,7 +452,7 @@  discard block
 block discarded – undo
452 452
  *     Valeur, si trouvée, `null` sinon.
453 453
  */
454 454
 function session_get($nom) {
455
-	return $GLOBALS['visiteur_session'][$nom] ?? null;
455
+    return $GLOBALS['visiteur_session'][$nom] ?? null;
456 456
 }
457 457
 
458 458
 
@@ -468,32 +468,32 @@  discard block
 block discarded – undo
468 468
  * @return void|array
469 469
  */
470 470
 function session_set($nom, $val = null) {
471
-	static $remove = [];
472
-	static $actualiser_sessions = false;
473
-	if ($nom === false) {
474
-		return $remove;
475
-	}
476
-	if (is_null($val)) {
477
-		// rien a faire
478
-		if (!isset($GLOBALS['visiteur_session'][$nom])) {
479
-			return;
480
-		}
481
-		unset($GLOBALS['visiteur_session'][$nom]);
482
-		$remove[] = $nom;
483
-	} else {
484
-		// On ajoute la valeur dans la globale
485
-		$GLOBALS['visiteur_session'][$nom] = $val;
486
-		if ($remove) {
487
-			$remove = array_diff($remove, [$nom]);
488
-		}
489
-	}
490
-	if (!$actualiser_sessions) {
491
-		// il faut creer la session si on en a pas, la premiere fois
492
-		ajouter_session($GLOBALS['visiteur_session']);
493
-		// in register la fonction qui mettra a jour toutes les sessions en fin de hit
494
-		register_shutdown_function('terminer_actualiser_sessions');
495
-		$actualiser_sessions = true;
496
-	}
471
+    static $remove = [];
472
+    static $actualiser_sessions = false;
473
+    if ($nom === false) {
474
+        return $remove;
475
+    }
476
+    if (is_null($val)) {
477
+        // rien a faire
478
+        if (!isset($GLOBALS['visiteur_session'][$nom])) {
479
+            return;
480
+        }
481
+        unset($GLOBALS['visiteur_session'][$nom]);
482
+        $remove[] = $nom;
483
+    } else {
484
+        // On ajoute la valeur dans la globale
485
+        $GLOBALS['visiteur_session'][$nom] = $val;
486
+        if ($remove) {
487
+            $remove = array_diff($remove, [$nom]);
488
+        }
489
+    }
490
+    if (!$actualiser_sessions) {
491
+        // il faut creer la session si on en a pas, la premiere fois
492
+        ajouter_session($GLOBALS['visiteur_session']);
493
+        // in register la fonction qui mettra a jour toutes les sessions en fin de hit
494
+        register_shutdown_function('terminer_actualiser_sessions');
495
+        $actualiser_sessions = true;
496
+    }
497 497
 }
498 498
 
499 499
 /**
@@ -502,12 +502,12 @@  discard block
 block discarded – undo
502 502
  * @uses actualiser_sessions()
503 503
  */
504 504
 function terminer_actualiser_sessions() {
505
-	// se remettre dans le dossier de travail au cas ou Apache a change
506
-	chdir(_ROOT_CWD);
507
-	// recuperer les variables a effacer
508
-	$remove = session_set(false);
509
-	// mettre a jour toutes les sessions
510
-	actualiser_sessions($GLOBALS['visiteur_session'], $remove);
505
+    // se remettre dans le dossier de travail au cas ou Apache a change
506
+    chdir(_ROOT_CWD);
507
+    // recuperer les variables a effacer
508
+    $remove = session_set(false);
509
+    // mettre a jour toutes les sessions
510
+    actualiser_sessions($GLOBALS['visiteur_session'], $remove);
511 511
 }
512 512
 
513 513
 
@@ -532,83 +532,83 @@  discard block
 block discarded – undo
532 532
  */
533 533
 function actualiser_sessions($auteur, $supprimer_cles = []) {
534 534
 
535
-	$id_auteur = isset($auteur['id_auteur']) ? intval($auteur['id_auteur']) : 0;
536
-	$id_auteur_courant = isset($GLOBALS['visiteur_session']['id_auteur']) ? intval($GLOBALS['visiteur_session']['id_auteur']) : 0;
537
-
538
-	// si l'auteur est celui de la session courante, verifier/creer la session si besoin
539
-	$fichier_session_courante = '';
540
-	if ($id_auteur == $id_auteur_courant) {
541
-		$auteur = array_merge($GLOBALS['visiteur_session'], $auteur);
542
-		ajouter_session($auteur);
543
-		if ($id_auteur && ($cookie = lire_cookie_session())) {
544
-			$fichier_session_courante = chemin_fichier_session('alea_ephemere', $cookie);
545
-		}
546
-	}
547
-
548
-	// si session anonyme on ne fait rien d'autre ici : les sessions anonymes sont non partagees
549
-	if (!$id_auteur) {
550
-		return;
551
-	}
552
-
553
-	// les préférences sont désérialisées, toujours.
554
-	// [fixme] Le champ 'prefs' sert aussi à l’inscription
555
-	if (isset($auteur['prefs']) && is_string($auteur['prefs'])) {
556
-		$auteur['prefs'] = @unserialize($auteur['prefs']);
557
-		if (!is_array($auteur['prefs'])) {
558
-			$auteur['prefs'] = [];
559
-		}
560
-	}
561
-
562
-	// memoriser l'auteur courant (celui qui modifie la fiche)
563
-	$sauve = $GLOBALS['visiteur_session'];
564
-
565
-	// .. mettre a jour les sessions de l'auteur cible
566
-	// attention au $ final pour ne pas risquer d'embarquer un .php.jeton temporaire
567
-	// cree par une ecriture concurente d'une session (fichier atomique temporaire)
568
-	$sessions = lister_sessions_auteur($id_auteur);
569
-
570
-	// 1ere passe : lire et fusionner les sessions
571
-	foreach ($sessions as $session) {
572
-		$GLOBALS['visiteur_session'] = [];
573
-		// a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence)
574
-		if (
575
-			$session !== $fichier_session_courante
576
-			&& @file_exists($session)
577
-		) {
578
-			include $session; # $GLOBALS['visiteur_session'] est alors l'auteur cible
579
-
580
-			$auteur = array_merge($GLOBALS['visiteur_session'], $auteur);
581
-		}
582
-	}
583
-
584
-	// supprimer les eventuelles cles dont on ne veut plus
585
-	foreach ($supprimer_cles as $cle) {
586
-		unset($auteur[$cle]);
587
-	}
588
-
589
-	$auteur_session = preparer_ecriture_session($auteur);
590
-
591
-	// seconde passe : ecrire les sessions qui ne sont pas a jour
592
-	foreach ($sessions as $session) {
593
-		$GLOBALS['visiteur_session'] = [];
594
-		// a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence)
595
-		if (@file_exists($session)) {
596
-			include $session; # $GLOBALS['visiteur_session'] est alors l'auteur cible
597
-
598
-			// est-ce que cette session est a mettre a jour ?
599
-			if ($auteur_session != $GLOBALS['visiteur_session']) {
600
-				ecrire_fichier_session($session, $auteur);
601
-			}
602
-		}
603
-	}
604
-
605
-	if ($id_auteur == $id_auteur_courant) {
606
-		$GLOBALS['visiteur_session'] = $auteur;
607
-		$GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session'];
608
-	} else {
609
-		// restaurer l'auteur courant
610
-		$GLOBALS['visiteur_session'] = $sauve;
611
-	}
535
+    $id_auteur = isset($auteur['id_auteur']) ? intval($auteur['id_auteur']) : 0;
536
+    $id_auteur_courant = isset($GLOBALS['visiteur_session']['id_auteur']) ? intval($GLOBALS['visiteur_session']['id_auteur']) : 0;
537
+
538
+    // si l'auteur est celui de la session courante, verifier/creer la session si besoin
539
+    $fichier_session_courante = '';
540
+    if ($id_auteur == $id_auteur_courant) {
541
+        $auteur = array_merge($GLOBALS['visiteur_session'], $auteur);
542
+        ajouter_session($auteur);
543
+        if ($id_auteur && ($cookie = lire_cookie_session())) {
544
+            $fichier_session_courante = chemin_fichier_session('alea_ephemere', $cookie);
545
+        }
546
+    }
547
+
548
+    // si session anonyme on ne fait rien d'autre ici : les sessions anonymes sont non partagees
549
+    if (!$id_auteur) {
550
+        return;
551
+    }
552
+
553
+    // les préférences sont désérialisées, toujours.
554
+    // [fixme] Le champ 'prefs' sert aussi à l’inscription
555
+    if (isset($auteur['prefs']) && is_string($auteur['prefs'])) {
556
+        $auteur['prefs'] = @unserialize($auteur['prefs']);
557
+        if (!is_array($auteur['prefs'])) {
558
+            $auteur['prefs'] = [];
559
+        }
560
+    }
561
+
562
+    // memoriser l'auteur courant (celui qui modifie la fiche)
563
+    $sauve = $GLOBALS['visiteur_session'];
564
+
565
+    // .. mettre a jour les sessions de l'auteur cible
566
+    // attention au $ final pour ne pas risquer d'embarquer un .php.jeton temporaire
567
+    // cree par une ecriture concurente d'une session (fichier atomique temporaire)
568
+    $sessions = lister_sessions_auteur($id_auteur);
569
+
570
+    // 1ere passe : lire et fusionner les sessions
571
+    foreach ($sessions as $session) {
572
+        $GLOBALS['visiteur_session'] = [];
573
+        // a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence)
574
+        if (
575
+            $session !== $fichier_session_courante
576
+            && @file_exists($session)
577
+        ) {
578
+            include $session; # $GLOBALS['visiteur_session'] est alors l'auteur cible
579
+
580
+            $auteur = array_merge($GLOBALS['visiteur_session'], $auteur);
581
+        }
582
+    }
583
+
584
+    // supprimer les eventuelles cles dont on ne veut plus
585
+    foreach ($supprimer_cles as $cle) {
586
+        unset($auteur[$cle]);
587
+    }
588
+
589
+    $auteur_session = preparer_ecriture_session($auteur);
590
+
591
+    // seconde passe : ecrire les sessions qui ne sont pas a jour
592
+    foreach ($sessions as $session) {
593
+        $GLOBALS['visiteur_session'] = [];
594
+        // a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence)
595
+        if (@file_exists($session)) {
596
+            include $session; # $GLOBALS['visiteur_session'] est alors l'auteur cible
597
+
598
+            // est-ce que cette session est a mettre a jour ?
599
+            if ($auteur_session != $GLOBALS['visiteur_session']) {
600
+                ecrire_fichier_session($session, $auteur);
601
+            }
602
+        }
603
+    }
604
+
605
+    if ($id_auteur == $id_auteur_courant) {
606
+        $GLOBALS['visiteur_session'] = $auteur;
607
+        $GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session'];
608
+    } else {
609
+        // restaurer l'auteur courant
610
+        $GLOBALS['visiteur_session'] = $sauve;
611
+    }
612 612
 }
613 613
 
614 614
 /**
@@ -622,48 +622,48 @@  discard block
 block discarded – undo
622 622
  */
623 623
 function lister_sessions_auteur($id_auteur, $nb_max = null) {
624 624
 
625
-	if (is_null($nb_max)) {
626
-		if (!defined('_NB_SESSIONS_MAX')) {
627
-			define('_NB_SESSIONS_MAX', 100);
628
-		}
629
-		$nb_max = _NB_SESSIONS_MAX;
630
-	}
631
-
632
-	// liste des sessions
633
-	$sessions = preg_files(_DIR_SESSIONS, '/' . $id_auteur . '_.*\.php$');
634
-
635
-	// si on en a plus que la limite, supprimer les plus vieilles
636
-	// si ce ne sont pas des sessions anonymes car elles sont alors chacune differentes
637
-	if (
638
-		$id_auteur
639
-		&& count($sessions) > $nb_max
640
-	) {
641
-		// limiter le nombre de sessions ouvertes par un auteur
642
-		// filemtime sur les sessions
643
-		$sessions = array_flip($sessions);
644
-
645
-		// 1ere passe : lire les filemtime
646
-		foreach ($sessions as $session => $z) {
647
-			if (
648
-				$d = @filemtime($session)
649
-			) {
650
-				$sessions[$session] = $d;
651
-			} else {
652
-				$sessions[$session] = 0;
653
-			}
654
-		}
655
-
656
-		// les plus anciennes en premier
657
-		asort($sessions);
658
-
659
-		$sessions = array_keys($sessions);
660
-		while (count($sessions) > $nb_max) {
661
-			$session = array_shift($sessions);
662
-			@unlink($session);
663
-		}
664
-	}
665
-
666
-	return $sessions;
625
+    if (is_null($nb_max)) {
626
+        if (!defined('_NB_SESSIONS_MAX')) {
627
+            define('_NB_SESSIONS_MAX', 100);
628
+        }
629
+        $nb_max = _NB_SESSIONS_MAX;
630
+    }
631
+
632
+    // liste des sessions
633
+    $sessions = preg_files(_DIR_SESSIONS, '/' . $id_auteur . '_.*\.php$');
634
+
635
+    // si on en a plus que la limite, supprimer les plus vieilles
636
+    // si ce ne sont pas des sessions anonymes car elles sont alors chacune differentes
637
+    if (
638
+        $id_auteur
639
+        && count($sessions) > $nb_max
640
+    ) {
641
+        // limiter le nombre de sessions ouvertes par un auteur
642
+        // filemtime sur les sessions
643
+        $sessions = array_flip($sessions);
644
+
645
+        // 1ere passe : lire les filemtime
646
+        foreach ($sessions as $session => $z) {
647
+            if (
648
+                $d = @filemtime($session)
649
+            ) {
650
+                $sessions[$session] = $d;
651
+            } else {
652
+                $sessions[$session] = 0;
653
+            }
654
+        }
655
+
656
+        // les plus anciennes en premier
657
+        asort($sessions);
658
+
659
+        $sessions = array_keys($sessions);
660
+        while (count($sessions) > $nb_max) {
661
+            $session = array_shift($sessions);
662
+            @unlink($session);
663
+        }
664
+    }
665
+
666
+    return $sessions;
667 667
 }
668 668
 
669 669
 
@@ -678,22 +678,22 @@  discard block
 block discarded – undo
678 678
  */
679 679
 function preparer_ecriture_session(array $auteur): array {
680 680
 
681
-	$row = $auteur;
681
+    $row = $auteur;
682 682
 
683
-	// ne pas enregistrer ces elements de securite dans le fichier de session
684
-	include_spip('inc/auth');
685
-	$auteur = auth_desensibiliser_session($auteur);
683
+    // ne pas enregistrer ces elements de securite dans le fichier de session
684
+    include_spip('inc/auth');
685
+    $auteur = auth_desensibiliser_session($auteur);
686 686
 
687
-	$auteur = pipeline('preparer_fichier_session', ['args' => ['row' => $row], 'data' => $auteur]);
687
+    $auteur = pipeline('preparer_fichier_session', ['args' => ['row' => $row], 'data' => $auteur]);
688 688
 
689
-	// ne pas enregistrer les valeurs vraiment nulle dans le fichier
690
-	foreach ($auteur as $variable => $valeur) {
691
-		if ($valeur === null) {
692
-			unset($auteur[$variable]);
693
-		}
694
-	}
689
+    // ne pas enregistrer les valeurs vraiment nulle dans le fichier
690
+    foreach ($auteur as $variable => $valeur) {
691
+        if ($valeur === null) {
692
+            unset($auteur[$variable]);
693
+        }
694
+    }
695 695
 
696
-	return $auteur;
696
+    return $auteur;
697 697
 }
698 698
 
699 699
 /**
@@ -705,39 +705,39 @@  discard block
 block discarded – undo
705 705
  */
706 706
 function ecrire_fichier_session($fichier, $auteur) {
707 707
 
708
-	$auteur = preparer_ecriture_session($auteur);
708
+    $auteur = preparer_ecriture_session($auteur);
709 709
 
710
-	// enregistrer les autres donnees du visiteur
711
-	$texte = '<' . "?php\n";
712
-	foreach ($auteur as $var => $val) {
713
-		$texte .= '$GLOBALS[\'visiteur_session\'][' . var_export($var, true) . '] = '
714
-			. var_export($val, true) . ";\n";
715
-	}
716
-	$texte .= '?' . ">\n";
710
+    // enregistrer les autres donnees du visiteur
711
+    $texte = '<' . "?php\n";
712
+    foreach ($auteur as $var => $val) {
713
+        $texte .= '$GLOBALS[\'visiteur_session\'][' . var_export($var, true) . '] = '
714
+            . var_export($val, true) . ";\n";
715
+    }
716
+    $texte .= '?' . ">\n";
717 717
 
718
-	return ecrire_fichier($fichier, $texte);
718
+    return ecrire_fichier($fichier, $texte);
719 719
 }
720 720
 
721 721
 /**
722 722
  * Calculer le chemin vers le fichier de session
723 723
  */
724 724
 function chemin_fichier_session(string $alea, string $cookie_session, bool $tantpis = false): string {
725
-	include_spip('inc/acces');
726
-	charger_aleas();
727
-
728
-	if (empty($GLOBALS['meta'][$alea])) {
729
-		if (!$tantpis) {
730
-			spip_log("fichier session ($tantpis): $alea indisponible", 'session');
731
-			include_spip('inc/minipres');
732
-			echo minipres();
733
-		}
734
-
735
-		return ''; // echec mais $tanpis
736
-	}
737
-
738
-	$repertoire = sous_repertoire(_DIR_SESSIONS, '', false, $tantpis);
739
-	$id_auteur = intval($cookie_session);
740
-	return $repertoire . $id_auteur . '_' . md5($cookie_session . ' ' . $GLOBALS['meta'][$alea]) . '.php';
725
+    include_spip('inc/acces');
726
+    charger_aleas();
727
+
728
+    if (empty($GLOBALS['meta'][$alea])) {
729
+        if (!$tantpis) {
730
+            spip_log("fichier session ($tantpis): $alea indisponible", 'session');
731
+            include_spip('inc/minipres');
732
+            echo minipres();
733
+        }
734
+
735
+        return ''; // echec mais $tanpis
736
+    }
737
+
738
+    $repertoire = sous_repertoire(_DIR_SESSIONS, '', false, $tantpis);
739
+    $id_auteur = intval($cookie_session);
740
+    return $repertoire . $id_auteur . '_' . md5($cookie_session . ' ' . $GLOBALS['meta'][$alea]) . '.php';
741 741
 }
742 742
 
743 743
 /**
@@ -748,7 +748,7 @@  discard block
 block discarded – undo
748 748
  * @param bool $tantpis
749 749
  */
750 750
 function fichier_session($alea, $tantpis = false): string {
751
-	return chemin_fichier_session((string) $alea, lire_cookie_session(), (bool) $tantpis);
751
+    return chemin_fichier_session((string) $alea, lire_cookie_session(), (bool) $tantpis);
752 752
 }
753 753
 
754 754
 
@@ -765,7 +765,7 @@  discard block
 block discarded – undo
765 765
  * @return string
766 766
  */
767 767
 function rejouer_session() {
768
-	return '<img src="' . generer_url_action('cookie', 'change_session=oui', true) . '" width="0" height="0" alt="" />';
768
+    return '<img src="' . generer_url_action('cookie', 'change_session=oui', true) . '" width="0" height="0" alt="" />';
769 769
 }
770 770
 
771 771
 
@@ -775,12 +775,12 @@  discard block
 block discarded – undo
775 775
  * @return string
776 776
  */
777 777
 function hash_env() {
778
-	static $res = '';
779
-	if ($res) {
780
-		return $res;
781
-	}
778
+    static $res = '';
779
+    if ($res) {
780
+        return $res;
781
+    }
782 782
 
783
-	return $res = md5($GLOBALS['ip'] . ($_SERVER['HTTP_USER_AGENT'] ?? ''));
783
+    return $res = md5($GLOBALS['ip'] . ($_SERVER['HTTP_USER_AGENT'] ?? ''));
784 784
 }
785 785
 
786 786
 
@@ -792,11 +792,11 @@  discard block
 block discarded – undo
792 792
  * @return bool True si une session PHP est ouverte.
793 793
  **/
794 794
 function spip_php_session_start() {
795
-	if (!is_php_session_started()) {
796
-		return session_start();
797
-	}
795
+    if (!is_php_session_started()) {
796
+        return session_start();
797
+    }
798 798
 
799
-	return true;
799
+    return true;
800 800
 }
801 801
 
802 802
 /**
@@ -806,9 +806,9 @@  discard block
 block discarded – undo
806 806
  * @return bool true si une session PHP est active
807 807
  **/
808 808
 function is_php_session_started() {
809
-	if (php_sapi_name() !== 'cli') {
810
-		return session_status() === PHP_SESSION_ACTIVE ? true : false;
811
-	}
809
+    if (php_sapi_name() !== 'cli') {
810
+        return session_status() === PHP_SESSION_ACTIVE ? true : false;
811
+    }
812 812
 
813
-	return false;
813
+    return false;
814 814
 }
Please login to merge, or discard this patch.
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -81,12 +81,12 @@  discard block
 block discarded – undo
81 81
 	spip_log("supprimer sessions auteur $id_auteur", 'session');
82 82
 	if ($toutes || $id_auteur !== $GLOBALS['visiteur_session']['id_auteur']) {
83 83
 		if ($dir = opendir(_DIR_SESSIONS)) {
84
-			$t = $_SERVER['REQUEST_TIME']  - (4 * _RENOUVELLE_ALEA); // 48h par defaut
85
-			$t_short = $_SERVER['REQUEST_TIME']  - max(_RENOUVELLE_ALEA / 4, 3 * 3600); // 3h par defaut
84
+			$t = $_SERVER['REQUEST_TIME'] - (4 * _RENOUVELLE_ALEA); // 48h par defaut
85
+			$t_short = $_SERVER['REQUEST_TIME'] - max(_RENOUVELLE_ALEA / 4, 3 * 3600); // 3h par defaut
86 86
 			while (($f = readdir($dir)) !== false) {
87 87
 				$nb_files++;
88 88
 				if (preg_match(',^[^\d-]*(-?\d+)_\w{32}\.php[3]?$,', $f, $regs)) {
89
-					$f = _DIR_SESSIONS . $f;
89
+					$f = _DIR_SESSIONS.$f;
90 90
 					if ($actives && $regs[1] == $id_auteur || $t > filemtime($f)) {
91 91
 						spip_unlink($f);
92 92
 					}
@@ -173,7 +173,7 @@  discard block
 block discarded – undo
173 173
 		(!$cookie = lire_cookie_session())
174 174
 		|| intval($cookie) !== $id_auteur
175 175
 	) {
176
-		$cookie = $id_auteur . '_' . md5(uniqid(random_int(0, mt_getrandmax()), true));
176
+		$cookie = $id_auteur.'_'.md5(uniqid(random_int(0, mt_getrandmax()), true));
177 177
 	}
178 178
 
179 179
 	// Maintenant on sait qu'on a des choses à écrire
@@ -206,7 +206,7 @@  discard block
 block discarded – undo
206 206
 	} else {
207 207
 		$fichier_session = chemin_fichier_session('alea_ephemere', $cookie);
208 208
 		if (!ecrire_fichier_session($fichier_session, $auteur)) {
209
-			spip_log('Echec ecriture fichier session ' . $fichier_session, 'session' . _LOG_HS);
209
+			spip_log('Echec ecriture fichier session '.$fichier_session, 'session'._LOG_HS);
210 210
 			include_spip('inc/minipres');
211 211
 			echo minipres();
212 212
 			exit;
@@ -229,9 +229,9 @@  discard block
 block discarded – undo
229 229
 	if (autoriser('ecrire', '', '', $auteur) && _DUREE_COOKIE_ADMIN) {
230 230
 		spip_setcookie(
231 231
 			'spip_admin',
232
-			'@' . ($auteur['email'] ?: $auteur['login']),
232
+			'@'.($auteur['email'] ?: $auteur['login']),
233 233
 			time() + max(_DUREE_COOKIE_ADMIN, $duree),
234
-			httponly: true
234
+			httponly : true
235 235
 		);
236 236
 	} else {
237 237
 		// sinon le supprimer ...
@@ -269,7 +269,7 @@  discard block
 block discarded – undo
269 269
 			$coef = 20;
270 270
 		}
271 271
 	}
272
-	return (int)(_RENOUVELLE_ALEA * $coef);
272
+	return (int) (_RENOUVELLE_ALEA * $coef);
273 273
 }
274 274
 
275 275
 /**
@@ -381,7 +381,7 @@  discard block
 block discarded – undo
381 381
 
382 382
 			// Renouveler la session avec l'alea courant
383 383
 			include($fichier_session);
384
-			spip_log('renouvelle session ' . $GLOBALS['visiteur_session']['id_auteur'], 'session');
384
+			spip_log('renouvelle session '.$GLOBALS['visiteur_session']['id_auteur'], 'session');
385 385
 			spip_unlink($fichier_session);
386 386
 			ajouter_session($GLOBALS['visiteur_session']);
387 387
 		}
@@ -630,7 +630,7 @@  discard block
 block discarded – undo
630 630
 	}
631 631
 
632 632
 	// liste des sessions
633
-	$sessions = preg_files(_DIR_SESSIONS, '/' . $id_auteur . '_.*\.php$');
633
+	$sessions = preg_files(_DIR_SESSIONS, '/'.$id_auteur.'_.*\.php$');
634 634
 
635 635
 	// si on en a plus que la limite, supprimer les plus vieilles
636 636
 	// si ce ne sont pas des sessions anonymes car elles sont alors chacune differentes
@@ -708,12 +708,12 @@  discard block
 block discarded – undo
708 708
 	$auteur = preparer_ecriture_session($auteur);
709 709
 
710 710
 	// enregistrer les autres donnees du visiteur
711
-	$texte = '<' . "?php\n";
711
+	$texte = '<'."?php\n";
712 712
 	foreach ($auteur as $var => $val) {
713
-		$texte .= '$GLOBALS[\'visiteur_session\'][' . var_export($var, true) . '] = '
714
-			. var_export($val, true) . ";\n";
713
+		$texte .= '$GLOBALS[\'visiteur_session\']['.var_export($var, true).'] = '
714
+			. var_export($val, true).";\n";
715 715
 	}
716
-	$texte .= '?' . ">\n";
716
+	$texte .= '?'.">\n";
717 717
 
718 718
 	return ecrire_fichier($fichier, $texte);
719 719
 }
@@ -737,7 +737,7 @@  discard block
 block discarded – undo
737 737
 
738 738
 	$repertoire = sous_repertoire(_DIR_SESSIONS, '', false, $tantpis);
739 739
 	$id_auteur = intval($cookie_session);
740
-	return $repertoire . $id_auteur . '_' . md5($cookie_session . ' ' . $GLOBALS['meta'][$alea]) . '.php';
740
+	return $repertoire.$id_auteur.'_'.md5($cookie_session.' '.$GLOBALS['meta'][$alea]).'.php';
741 741
 }
742 742
 
743 743
 /**
@@ -765,7 +765,7 @@  discard block
 block discarded – undo
765 765
  * @return string
766 766
  */
767 767
 function rejouer_session() {
768
-	return '<img src="' . generer_url_action('cookie', 'change_session=oui', true) . '" width="0" height="0" alt="" />';
768
+	return '<img src="'.generer_url_action('cookie', 'change_session=oui', true).'" width="0" height="0" alt="" />';
769 769
 }
770 770
 
771 771
 
@@ -780,7 +780,7 @@  discard block
 block discarded – undo
780 780
 		return $res;
781 781
 	}
782 782
 
783
-	return $res = md5($GLOBALS['ip'] . ($_SERVER['HTTP_USER_AGENT'] ?? ''));
783
+	return $res = md5($GLOBALS['ip'].($_SERVER['HTTP_USER_AGENT'] ?? ''));
784 784
 }
785 785
 
786 786
 
Please login to merge, or discard this patch.
ecrire/lang/spip_pt_br.php 1 patch
Indentation   +672 added lines, -672 removed lines patch added patch discarded remove patch
@@ -5,577 +5,577 @@  discard block
 block discarded – undo
5 5
 
6 6
 return [
7 7
 
8
-	// A
9
-	'access_interface_graphique' => 'Voltar para a interface gráfica completa',
10
-	'access_mode_texte' => 'Exibir a interface textual simplificada',
11
-	'admin_debug' => 'depurar',
12
-	'admin_modifier_article' => 'Editar esta matéria',
13
-	'admin_modifier_auteur' => 'Editar este autor',
14
-	'admin_modifier_breve' => 'Editar esta nota',
15
-	'admin_modifier_mot' => 'Editar esta palavra-chave',
16
-	'admin_modifier_rubrique' => 'Editar esta seção',
17
-	'admin_recalculer' => 'Atualizar esta página',
18
-	'afficher_calendrier' => 'Exibir o calendário',
19
-	'afficher_trad' => 'exibir as traduções',
20
-	'alerte_maj_impossible' => '<b>Atenção!</b> A atualização da base de dados SQL para a versão @version@ não é possível, provavelmente por problema de direitos de edição na base de dados. Por favor, contate o seu provedor de hospedagem.',
21
-	'alerte_modif_info_concourante' => 'ATENÇÃO: Esta informação foi alterada por outra pessoa. O valor atual é:',
22
-	'analyse_xml' => 'Analisar XML',
23
-	'annuler' => 'Cancelar',
24
-	'antispam_champ_vide' => 'Por favor, deixe este campo vazio:',
25
-	'articles_recents' => 'Matérias mais recentes',
26
-	'attention_champ_mini_nb_caractères' => 'Atenção! Mínimo de @nb@ caracteres',
27
-	'avis_1_erreur_saisie' => 'Há um erro nos dados informados. Por favor, verifique.',
28
-	'avis_archive_incorrect' => 'a cópia de segurança não é um arquivo do SPIP',
29
-	'avis_archive_invalide' => 'a cópia de segurança não é válida',
30
-	'avis_attention' => 'ATENÇÃO!',
31
-	'avis_champ_incorrect_type_objet' => 'Nome de campo @name@ incorreto para objeto do tipo @type@',
32
-	'avis_colonne_inexistante' => 'A coluna @col@ não existe',
33
-	'avis_erreur' => 'Erro: ver abaixo',
34
-	'avis_erreur_connexion' => 'Erro de conexão',
35
-	'avis_erreur_cookie' => 'problema de cookie',
36
-	'avis_erreur_fonction_contexte' => 'Erro de programação. Esta função não deve ser chamada neste contexto.',
37
-	'avis_erreur_mysql' => 'Erro SQL',
38
-	'avis_erreur_sauvegarde' => 'Erro na cópia de segurança (@type@ @id_objet@) !',
39
-	'avis_erreur_visiteur' => 'Problema de acesso ao espaço privado',
40
-	'avis_nb_erreurs_saisie' => 'Há @nb@ erros nos dados informados. Por favor, verifique.',
8
+    // A
9
+    'access_interface_graphique' => 'Voltar para a interface gráfica completa',
10
+    'access_mode_texte' => 'Exibir a interface textual simplificada',
11
+    'admin_debug' => 'depurar',
12
+    'admin_modifier_article' => 'Editar esta matéria',
13
+    'admin_modifier_auteur' => 'Editar este autor',
14
+    'admin_modifier_breve' => 'Editar esta nota',
15
+    'admin_modifier_mot' => 'Editar esta palavra-chave',
16
+    'admin_modifier_rubrique' => 'Editar esta seção',
17
+    'admin_recalculer' => 'Atualizar esta página',
18
+    'afficher_calendrier' => 'Exibir o calendário',
19
+    'afficher_trad' => 'exibir as traduções',
20
+    'alerte_maj_impossible' => '<b>Atenção!</b> A atualização da base de dados SQL para a versão @version@ não é possível, provavelmente por problema de direitos de edição na base de dados. Por favor, contate o seu provedor de hospedagem.',
21
+    'alerte_modif_info_concourante' => 'ATENÇÃO: Esta informação foi alterada por outra pessoa. O valor atual é:',
22
+    'analyse_xml' => 'Analisar XML',
23
+    'annuler' => 'Cancelar',
24
+    'antispam_champ_vide' => 'Por favor, deixe este campo vazio:',
25
+    'articles_recents' => 'Matérias mais recentes',
26
+    'attention_champ_mini_nb_caractères' => 'Atenção! Mínimo de @nb@ caracteres',
27
+    'avis_1_erreur_saisie' => 'Há um erro nos dados informados. Por favor, verifique.',
28
+    'avis_archive_incorrect' => 'a cópia de segurança não é um arquivo do SPIP',
29
+    'avis_archive_invalide' => 'a cópia de segurança não é válida',
30
+    'avis_attention' => 'ATENÇÃO!',
31
+    'avis_champ_incorrect_type_objet' => 'Nome de campo @name@ incorreto para objeto do tipo @type@',
32
+    'avis_colonne_inexistante' => 'A coluna @col@ não existe',
33
+    'avis_erreur' => 'Erro: ver abaixo',
34
+    'avis_erreur_connexion' => 'Erro de conexão',
35
+    'avis_erreur_cookie' => 'problema de cookie',
36
+    'avis_erreur_fonction_contexte' => 'Erro de programação. Esta função não deve ser chamada neste contexto.',
37
+    'avis_erreur_mysql' => 'Erro SQL',
38
+    'avis_erreur_sauvegarde' => 'Erro na cópia de segurança (@type@ @id_objet@) !',
39
+    'avis_erreur_visiteur' => 'Problema de acesso ao espaço privado',
40
+    'avis_nb_erreurs_saisie' => 'Há @nb@ erros nos dados informados. Por favor, verifique.',
41 41
 
42
-	// B
43
-	'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave',
44
-	'barre_aide' => 'utilize os atalhos tipográficos para enriquecer o seu layout',
45
-	'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo',
46
-	'barre_eo' => 'Inserir um OE contraído',
47
-	'barre_eo_maj' => 'Inserir um OE contraído maiúsculo',
48
-	'barre_euro' => 'Inserir o símbolo € (euro)',
49
-	'barre_gras' => 'Escrever em {{negrito}}',
50
-	'barre_guillemets' => 'envolver em "aspas"',
51
-	'barre_guillemets_simples' => 'Envolver em ’plicas’',
52
-	'barre_intertitre' => 'Transformar em {{{entretítulo}}}',
53
-	'barre_italic' => 'Escrever em {itálico}',
54
-	'barre_lien' => 'Transformar em [link hipertexto->http://...]',
55
-	'barre_lien_input' => 'Informe o endereço do seu link (você pode informar um endereço web do tipo http://www.monsite/com ou simplesmente informar o número de uma matéria deste site.',
56
-	'barre_note' => 'Transformar em [[Nota de pé de página]]',
57
-	'barre_paragraphe' => 'Criar um parágrafo',
58
-	'barre_quote' => '<quote>Citar uma mensagem</quote>',
59
-	'bouton_changer' => 'Alterar',
60
-	'bouton_chercher' => 'Procurar',
61
-	'bouton_choisir' => 'Escolher',
62
-	'bouton_deplacer' => 'Deslocar',
63
-	'bouton_download' => 'Baixar',
64
-	'bouton_enregistrer' => 'Gravar',
65
-	'bouton_radio_desactiver_messagerie_interne' => 'Desativar o sistema interno de mensagens',
66
-	'bouton_radio_envoi_annonces' => 'Enviar os avisos editoriais',
67
-	'bouton_radio_non_envoi_annonces' => 'Não enviar os avisos',
68
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista de novidades',
69
-	'bouton_recharger_page' => 'atualizar esta página',
70
-	'bouton_telecharger' => 'Transferir',
71
-	'bouton_upload' => 'Upload',
72
-	'bouton_valider' => 'Validar',
42
+    // B
43
+    'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave',
44
+    'barre_aide' => 'utilize os atalhos tipográficos para enriquecer o seu layout',
45
+    'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo',
46
+    'barre_eo' => 'Inserir um OE contraído',
47
+    'barre_eo_maj' => 'Inserir um OE contraído maiúsculo',
48
+    'barre_euro' => 'Inserir o símbolo € (euro)',
49
+    'barre_gras' => 'Escrever em {{negrito}}',
50
+    'barre_guillemets' => 'envolver em "aspas"',
51
+    'barre_guillemets_simples' => 'Envolver em ’plicas’',
52
+    'barre_intertitre' => 'Transformar em {{{entretítulo}}}',
53
+    'barre_italic' => 'Escrever em {itálico}',
54
+    'barre_lien' => 'Transformar em [link hipertexto->http://...]',
55
+    'barre_lien_input' => 'Informe o endereço do seu link (você pode informar um endereço web do tipo http://www.monsite/com ou simplesmente informar o número de uma matéria deste site.',
56
+    'barre_note' => 'Transformar em [[Nota de pé de página]]',
57
+    'barre_paragraphe' => 'Criar um parágrafo',
58
+    'barre_quote' => '<quote>Citar uma mensagem</quote>',
59
+    'bouton_changer' => 'Alterar',
60
+    'bouton_chercher' => 'Procurar',
61
+    'bouton_choisir' => 'Escolher',
62
+    'bouton_deplacer' => 'Deslocar',
63
+    'bouton_download' => 'Baixar',
64
+    'bouton_enregistrer' => 'Gravar',
65
+    'bouton_radio_desactiver_messagerie_interne' => 'Desativar o sistema interno de mensagens',
66
+    'bouton_radio_envoi_annonces' => 'Enviar os avisos editoriais',
67
+    'bouton_radio_non_envoi_annonces' => 'Não enviar os avisos',
68
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista de novidades',
69
+    'bouton_recharger_page' => 'atualizar esta página',
70
+    'bouton_telecharger' => 'Transferir',
71
+    'bouton_upload' => 'Upload',
72
+    'bouton_valider' => 'Validar',
73 73
 
74
-	// C
75
-	'cal_apresmidi' => 'tarde',
76
-	'cal_jour_entier' => 'dia todo',
77
-	'cal_matin' => 'manhã',
78
-	'cal_par_jour' => 'calendário por dia',
79
-	'cal_par_mois' => 'calendário por mês',
80
-	'cal_par_semaine' => 'calendário por semana',
81
-	'choix_couleur_interface' => 'côr',
82
-	'choix_interface' => 'escolha da interface',
83
-	'colonne' => 'Coluna',
84
-	'confirm_changer_statut' => 'Atenção, você solicitou a alteração de status deste elemento. Deseja continuar?',
85
-	'correcte' => 'correta',
74
+    // C
75
+    'cal_apresmidi' => 'tarde',
76
+    'cal_jour_entier' => 'dia todo',
77
+    'cal_matin' => 'manhã',
78
+    'cal_par_jour' => 'calendário por dia',
79
+    'cal_par_mois' => 'calendário por mês',
80
+    'cal_par_semaine' => 'calendário por semana',
81
+    'choix_couleur_interface' => 'côr',
82
+    'choix_interface' => 'escolha da interface',
83
+    'colonne' => 'Coluna',
84
+    'confirm_changer_statut' => 'Atenção, você solicitou a alteração de status deste elemento. Deseja continuar?',
85
+    'correcte' => 'correta',
86 86
 
87
-	// D
88
-	'date_aujourdhui' => 'hoje',
89
-	'date_avant_jc' => 'a.C.',
90
-	'date_dans' => 'entre @delai@',
91
-	'date_de_mois_1' => '@j@ de @nommois@',
92
-	'date_de_mois_10' => '@j@ de @nommois@',
93
-	'date_de_mois_11' => '@j@ de @nommois@',
94
-	'date_de_mois_12' => '@j@ de @nommois@',
95
-	'date_de_mois_2' => '@j@ de @nommois@',
96
-	'date_de_mois_3' => '@j@ de @nommois@',
97
-	'date_de_mois_4' => '@j@ de @nommois@',
98
-	'date_de_mois_5' => '@j@ de @nommois@',
99
-	'date_de_mois_6' => '@j@ de @nommois@',
100
-	'date_de_mois_7' => '@j@ de @nommois@',
101
-	'date_de_mois_8' => '@j@ de @nommois@',
102
-	'date_de_mois_9' => '@j@ de @nommois@',
103
-	'date_demain' => 'amanhã',
104
-	'date_fmt_heures_minutes' => '@h@h@m@min',
105
-	'date_fmt_heures_minutes_court' => '@h@h@m@',
106
-	'date_fmt_jour' => '@nomjour@ @jour@',
107
-	'date_fmt_jour_heure' => '@jour@ - @heure@',
108
-	'date_fmt_jour_heure_debut_fin' => 'dia @jour@ de @heure_debut@ a @heure_fin@',
109
-	'date_fmt_jour_heure_debut_fin_abbr' => 'dia @dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@',
110
-	'date_fmt_jour_mois' => '@jour@ de @nommois@',
111
-	'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@',
112
-	'date_fmt_mois_annee' => '@nommois@ de @annee@',
113
-	'date_fmt_nomjour' => '@nomjour@ @date@',
114
-	'date_fmt_nomjour_date' => '@nomjour@ de @date@',
115
-	'date_fmt_periode' => 'De @date_debut@ a @date_fin@',
116
-	'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@',
117
-	'date_fmt_periode_from' => 'De',
118
-	'date_fmt_periode_to' => 'para',
119
-	'date_fmt_saison_annee' => '@saison@ @annee@',
120
-	'date_heures' => 'horas',
121
-	'date_hier' => 'ontem',
122
-	'date_il_y_a' => 'há @delai@',
123
-	'date_jnum1' => '1º',
124
-	'date_jnum10' => '10',
125
-	'date_jnum11' => '11',
126
-	'date_jnum12' => '12',
127
-	'date_jnum13' => '13',
128
-	'date_jnum14' => '14',
129
-	'date_jnum15' => '15',
130
-	'date_jnum16' => '16',
131
-	'date_jnum17' => '17',
132
-	'date_jnum18' => '18',
133
-	'date_jnum19' => '19',
134
-	'date_jnum2' => '2',
135
-	'date_jnum20' => '20',
136
-	'date_jnum21' => '21',
137
-	'date_jnum22' => '22',
138
-	'date_jnum23' => '23',
139
-	'date_jnum24' => '24',
140
-	'date_jnum25' => '25',
141
-	'date_jnum26' => '26',
142
-	'date_jnum27' => '27',
143
-	'date_jnum28' => '28',
144
-	'date_jnum29' => '29',
145
-	'date_jnum3' => '3',
146
-	'date_jnum30' => '30',
147
-	'date_jnum31' => '31',
148
-	'date_jnum4' => '4',
149
-	'date_jnum5' => '5',
150
-	'date_jnum6' => '6',
151
-	'date_jnum7' => '7',
152
-	'date_jnum8' => '8',
153
-	'date_jnum9' => '9',
154
-	'date_jour_1' => 'domingo',
155
-	'date_jour_1_abbr' => 'dom.',
156
-	'date_jour_1_initiale' => 'd.',
157
-	'date_jour_2' => 'segunda-feira',
158
-	'date_jour_2_abbr' => 'seg.',
159
-	'date_jour_2_initiale' => 's.',
160
-	'date_jour_3' => 'terça-feira',
161
-	'date_jour_3_abbr' => 'ter.',
162
-	'date_jour_3_initiale' => 't.',
163
-	'date_jour_4' => 'quarta-feira',
164
-	'date_jour_4_abbr' => 'quar.',
165
-	'date_jour_4_initiale' => 'q.',
166
-	'date_jour_5' => 'quinta-feira',
167
-	'date_jour_5_abbr' => 'quin.',
168
-	'date_jour_5_initiale' => 'q.',
169
-	'date_jour_6' => 'sexta-feira',
170
-	'date_jour_6_abbr' => 'sex.',
171
-	'date_jour_6_initiale' => 's.',
172
-	'date_jour_7' => 'sábado',
173
-	'date_jour_7_abbr' => 'sáb.',
174
-	'date_jour_7_initiale' => 's.',
175
-	'date_jours' => 'dias',
176
-	'date_minutes' => 'minutos',
177
-	'date_mois' => 'meses',
178
-	'date_mois_1' => 'janeiro',
179
-	'date_mois_10' => 'outubro',
180
-	'date_mois_10_abbr' => 'out.',
181
-	'date_mois_11' => 'novembro',
182
-	'date_mois_11_abbr' => 'nov.',
183
-	'date_mois_12' => 'dezembro',
184
-	'date_mois_12_abbr' => 'dez.',
185
-	'date_mois_1_abbr' => 'jan.',
186
-	'date_mois_2' => 'fevereiro',
187
-	'date_mois_2_abbr' => 'fev.',
188
-	'date_mois_3' => 'março',
189
-	'date_mois_3_abbr' => 'mar.',
190
-	'date_mois_4' => 'abril',
191
-	'date_mois_4_abbr' => 'abr.',
192
-	'date_mois_5' => 'maio',
193
-	'date_mois_5_abbr' => 'mai.',
194
-	'date_mois_6' => 'junho',
195
-	'date_mois_6_abbr' => 'jun.',
196
-	'date_mois_7' => 'julho',
197
-	'date_mois_7_abbr' => 'jul.',
198
-	'date_mois_8' => 'agosto',
199
-	'date_mois_8_abbr' => 'ago.',
200
-	'date_mois_9' => 'setembro',
201
-	'date_mois_9_abbr' => 'set.',
202
-	'date_saison_1' => 'inverno',
203
-	'date_saison_2' => 'primavera',
204
-	'date_saison_3' => 'verão',
205
-	'date_saison_4' => 'outono',
206
-	'date_secondes' => 'segundos',
207
-	'date_semaines' => 'semanas',
208
-	'date_un_mois' => 'mês',
209
-	'date_une_heure' => 'hora',
210
-	'date_une_minute' => 'minuto',
211
-	'date_une_seconde' => 'segundo',
212
-	'date_une_semaine' => 'semana',
213
-	'dirs_commencer' => 'Para começar realmente a instalação',
214
-	'dirs_preliminaire' => 'Preliminar: <b>Configurar os direitos de acesso</b>',
215
-	'dirs_probleme_droits' => 'Problema com as permissões de acesso',
216
-	'dirs_repertoires_absents' => '<p><b>Os diretórios a seguir não foram encontrados:</b></p><ul>@bad_dirs@.</ul>
87
+    // D
88
+    'date_aujourdhui' => 'hoje',
89
+    'date_avant_jc' => 'a.C.',
90
+    'date_dans' => 'entre @delai@',
91
+    'date_de_mois_1' => '@j@ de @nommois@',
92
+    'date_de_mois_10' => '@j@ de @nommois@',
93
+    'date_de_mois_11' => '@j@ de @nommois@',
94
+    'date_de_mois_12' => '@j@ de @nommois@',
95
+    'date_de_mois_2' => '@j@ de @nommois@',
96
+    'date_de_mois_3' => '@j@ de @nommois@',
97
+    'date_de_mois_4' => '@j@ de @nommois@',
98
+    'date_de_mois_5' => '@j@ de @nommois@',
99
+    'date_de_mois_6' => '@j@ de @nommois@',
100
+    'date_de_mois_7' => '@j@ de @nommois@',
101
+    'date_de_mois_8' => '@j@ de @nommois@',
102
+    'date_de_mois_9' => '@j@ de @nommois@',
103
+    'date_demain' => 'amanhã',
104
+    'date_fmt_heures_minutes' => '@h@h@m@min',
105
+    'date_fmt_heures_minutes_court' => '@h@h@m@',
106
+    'date_fmt_jour' => '@nomjour@ @jour@',
107
+    'date_fmt_jour_heure' => '@jour@ - @heure@',
108
+    'date_fmt_jour_heure_debut_fin' => 'dia @jour@ de @heure_debut@ a @heure_fin@',
109
+    'date_fmt_jour_heure_debut_fin_abbr' => 'dia @dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@',
110
+    'date_fmt_jour_mois' => '@jour@ de @nommois@',
111
+    'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@',
112
+    'date_fmt_mois_annee' => '@nommois@ de @annee@',
113
+    'date_fmt_nomjour' => '@nomjour@ @date@',
114
+    'date_fmt_nomjour_date' => '@nomjour@ de @date@',
115
+    'date_fmt_periode' => 'De @date_debut@ a @date_fin@',
116
+    'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@',
117
+    'date_fmt_periode_from' => 'De',
118
+    'date_fmt_periode_to' => 'para',
119
+    'date_fmt_saison_annee' => '@saison@ @annee@',
120
+    'date_heures' => 'horas',
121
+    'date_hier' => 'ontem',
122
+    'date_il_y_a' => 'há @delai@',
123
+    'date_jnum1' => '1º',
124
+    'date_jnum10' => '10',
125
+    'date_jnum11' => '11',
126
+    'date_jnum12' => '12',
127
+    'date_jnum13' => '13',
128
+    'date_jnum14' => '14',
129
+    'date_jnum15' => '15',
130
+    'date_jnum16' => '16',
131
+    'date_jnum17' => '17',
132
+    'date_jnum18' => '18',
133
+    'date_jnum19' => '19',
134
+    'date_jnum2' => '2',
135
+    'date_jnum20' => '20',
136
+    'date_jnum21' => '21',
137
+    'date_jnum22' => '22',
138
+    'date_jnum23' => '23',
139
+    'date_jnum24' => '24',
140
+    'date_jnum25' => '25',
141
+    'date_jnum26' => '26',
142
+    'date_jnum27' => '27',
143
+    'date_jnum28' => '28',
144
+    'date_jnum29' => '29',
145
+    'date_jnum3' => '3',
146
+    'date_jnum30' => '30',
147
+    'date_jnum31' => '31',
148
+    'date_jnum4' => '4',
149
+    'date_jnum5' => '5',
150
+    'date_jnum6' => '6',
151
+    'date_jnum7' => '7',
152
+    'date_jnum8' => '8',
153
+    'date_jnum9' => '9',
154
+    'date_jour_1' => 'domingo',
155
+    'date_jour_1_abbr' => 'dom.',
156
+    'date_jour_1_initiale' => 'd.',
157
+    'date_jour_2' => 'segunda-feira',
158
+    'date_jour_2_abbr' => 'seg.',
159
+    'date_jour_2_initiale' => 's.',
160
+    'date_jour_3' => 'terça-feira',
161
+    'date_jour_3_abbr' => 'ter.',
162
+    'date_jour_3_initiale' => 't.',
163
+    'date_jour_4' => 'quarta-feira',
164
+    'date_jour_4_abbr' => 'quar.',
165
+    'date_jour_4_initiale' => 'q.',
166
+    'date_jour_5' => 'quinta-feira',
167
+    'date_jour_5_abbr' => 'quin.',
168
+    'date_jour_5_initiale' => 'q.',
169
+    'date_jour_6' => 'sexta-feira',
170
+    'date_jour_6_abbr' => 'sex.',
171
+    'date_jour_6_initiale' => 's.',
172
+    'date_jour_7' => 'sábado',
173
+    'date_jour_7_abbr' => 'sáb.',
174
+    'date_jour_7_initiale' => 's.',
175
+    'date_jours' => 'dias',
176
+    'date_minutes' => 'minutos',
177
+    'date_mois' => 'meses',
178
+    'date_mois_1' => 'janeiro',
179
+    'date_mois_10' => 'outubro',
180
+    'date_mois_10_abbr' => 'out.',
181
+    'date_mois_11' => 'novembro',
182
+    'date_mois_11_abbr' => 'nov.',
183
+    'date_mois_12' => 'dezembro',
184
+    'date_mois_12_abbr' => 'dez.',
185
+    'date_mois_1_abbr' => 'jan.',
186
+    'date_mois_2' => 'fevereiro',
187
+    'date_mois_2_abbr' => 'fev.',
188
+    'date_mois_3' => 'março',
189
+    'date_mois_3_abbr' => 'mar.',
190
+    'date_mois_4' => 'abril',
191
+    'date_mois_4_abbr' => 'abr.',
192
+    'date_mois_5' => 'maio',
193
+    'date_mois_5_abbr' => 'mai.',
194
+    'date_mois_6' => 'junho',
195
+    'date_mois_6_abbr' => 'jun.',
196
+    'date_mois_7' => 'julho',
197
+    'date_mois_7_abbr' => 'jul.',
198
+    'date_mois_8' => 'agosto',
199
+    'date_mois_8_abbr' => 'ago.',
200
+    'date_mois_9' => 'setembro',
201
+    'date_mois_9_abbr' => 'set.',
202
+    'date_saison_1' => 'inverno',
203
+    'date_saison_2' => 'primavera',
204
+    'date_saison_3' => 'verão',
205
+    'date_saison_4' => 'outono',
206
+    'date_secondes' => 'segundos',
207
+    'date_semaines' => 'semanas',
208
+    'date_un_mois' => 'mês',
209
+    'date_une_heure' => 'hora',
210
+    'date_une_minute' => 'minuto',
211
+    'date_une_seconde' => 'segundo',
212
+    'date_une_semaine' => 'semana',
213
+    'dirs_commencer' => 'Para começar realmente a instalação',
214
+    'dirs_preliminaire' => 'Preliminar: <b>Configurar os direitos de acesso</b>',
215
+    'dirs_probleme_droits' => 'Problema com as permissões de acesso',
216
+    'dirs_repertoires_absents' => '<p><b>Os diretórios a seguir não foram encontrados:</b></p><ul>@bad_dirs@.</ul>
217 217
 <p>É provável que isto se deva a um problema de letras em maiúsculas e minúsculas.
218 218
 Verifique se as maiúsculas e minúsuculas destes diretórios coincidem exatamente com o que está sendo exibido abaixo; se este não for o caso, renomeie os diretórios com o seu programa de FTP de modo a corrigir o erro.
219 219
 <p>Uma vêz feita esta manipulação, você poderá ',
220
-	'dirs_repertoires_suivants' => '<p><b>Os diretórios a seguir não estão acessiveis para leitura:</b></p><ul>@bad_dirs@.</ul>
220
+    'dirs_repertoires_suivants' => '<p><b>Os diretórios a seguir não estão acessiveis para leitura:</b></p><ul>@bad_dirs@.</ul>
221 221
 <p>Para corrigir, utilize o seu programa de FTP para configurar os direitos de acesso de cada um destes diretórios. O procedimento está explicado em detalhes no guia de instalação.</p>
222 222
 <p>Uma vêz feita esta alteração, você poderá ',
223
-	'double_occurrence' => 'Ocorrência dupla de @balise@',
223
+    'double_occurrence' => 'Ocorrência dupla de @balise@',
224 224
 
225
-	// E
226
-	'en_cours' => 'em curso',
227
-	'envoi_via_le_site' => 'Envio pelo site',
228
-	'erreur' => 'Erro',
229
-	'erreur_balise_non_fermee' => 'Última tag em aberto:',
230
-	'erreur_technique_ajaxform' => 'Ooops. Um erro inesperado impediu o envio do formulário. Você pode tentar novamente.',
231
-	'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu a gravação correta do campo @champs@.',
232
-	'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu a gravação.',
233
-	'erreur_texte' => 'erro(s)',
234
-	'etape' => 'Etapa',
225
+    // E
226
+    'en_cours' => 'em curso',
227
+    'envoi_via_le_site' => 'Envio pelo site',
228
+    'erreur' => 'Erro',
229
+    'erreur_balise_non_fermee' => 'Última tag em aberto:',
230
+    'erreur_technique_ajaxform' => 'Ooops. Um erro inesperado impediu o envio do formulário. Você pode tentar novamente.',
231
+    'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu a gravação correta do campo @champs@.',
232
+    'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu a gravação.',
233
+    'erreur_texte' => 'erro(s)',
234
+    'etape' => 'Etapa',
235 235
 
236
-	// F
237
-	'fichier_introuvable' => 'Arquivo @fichier@ não encontrado.',
238
-	'fonction_introuvable' => 'Função @fonction@() não encontrada.',
239
-	'form_auteur_confirmation' => 'Confirme o seu endereço de e-mail',
240
-	'form_auteur_email_modifie' => 'O seu endereço de e-mail foi alterado.',
241
-	'form_auteur_envoi_mail_confirmation' => 'Uma mensagem de confirmação acabou de ser enviada para @email@. Você precisa entrar no endereço web mencionado na mensagem para validar o seu endereço de e-mail.',
242
-	'form_auteur_mail_confirmation' => 'Olá,
236
+    // F
237
+    'fichier_introuvable' => 'Arquivo @fichier@ não encontrado.',
238
+    'fonction_introuvable' => 'Função @fonction@() não encontrada.',
239
+    'form_auteur_confirmation' => 'Confirme o seu endereço de e-mail',
240
+    'form_auteur_email_modifie' => 'O seu endereço de e-mail foi alterado.',
241
+    'form_auteur_envoi_mail_confirmation' => 'Uma mensagem de confirmação acabou de ser enviada para @email@. Você precisa entrar no endereço web mencionado na mensagem para validar o seu endereço de e-mail.',
242
+    'form_auteur_mail_confirmation' => 'Olá,
243 243
 
244 244
 Você pediu para alterar o seu endereço de e-mail
245 245
 Para confirmar o seu novo endereço, basta acessar o endereço abaixo (cas contrário, a sua solicitação será ignorada):
246 246
 
247 247
     @url@
248 248
 ',
249
-	'form_deja_inscrit' => 'Você já está inscrito.',
250
-	'form_email_non_valide' => 'Seu endereço de e-mail não é válido.',
251
-	'form_forum_access_refuse' => 'Você não tem mais acesso a este site.',
252
-	'form_forum_bonjour' => 'Bom dia @nom@,',
253
-	'form_forum_confirmer_email' => 'Para confirmar o seu endereço de e-mail, clique neste link: @url_confirm@',
254
-	'form_forum_email_deja_enregistre' => 'Este endereço de e-mail já está cadastrado, você pode usar a sua senha habitual.',
255
-	'form_forum_identifiant_mail' => 'Seu novo login foi enviado por e-mail.',
256
-	'form_forum_identifiants' => 'Identificadores pessoais',
257
-	'form_forum_indiquer_nom_email' => 'Informe aqui o seu nome  endereço de e-mail. O seu identificador pessoal será enviado de imediato por correio eletrônico.',
258
-	'form_forum_login' => 'login:',
259
-	'form_forum_message_auto' => '(esta é uma mensagem automática)',
260
-	'form_forum_pass' => 'senha:',
261
-	'form_forum_probleme_mail' => 'Problema de e-mail: o identificador não pôde ser enviado.',
262
-	'form_forum_voici1' => 'Estes são os seus identificadores para que você possa participar da vida do site "@nom_site_spip@" (@adresse_site@):',
263
-	'form_forum_voici2' => 'Estes são os seus identificadores para que você possa propor matérias ao site "@nom_site_spip@" (@adresse_login@):',
264
-	'form_indiquer_email' => 'Por favor, informe o seu endereço de e-mail.',
265
-	'form_indiquer_nom' => 'Por favor, informe o seu nome.',
266
-	'form_indiquer_nom_site' => 'Por favor, informe o nome do seu site.',
267
-	'form_pet_deja_enregistre' => 'Este site já está cadastrado',
268
-	'form_pet_signature_pasprise' => 'Sua assinatura não foi computada.',
269
-	'form_prop_confirmer_envoi' => 'Confirmar o envio',
270
-	'form_prop_description' => 'Descrição / comentário',
271
-	'form_prop_enregistre' => 'Sua proposta foi cadastrada, ela aparecerá online após ser validada pelos responsáveis deste site.',
272
-	'form_prop_envoyer' => 'Enviar uma mensagem',
273
-	'form_prop_indiquer_email' => 'Por favor, indique um endereço de e-mail válido',
274
-	'form_prop_indiquer_nom_site' => 'Por favor, informe o nome do site.',
275
-	'form_prop_indiquer_sujet' => 'Por favor, informe um assunto',
276
-	'form_prop_message_envoye' => 'Mensagem enviada',
277
-	'form_prop_non_enregistre' => 'Sua proposta não foi cadastrada.',
278
-	'form_prop_sujet' => 'Assunto',
279
-	'form_prop_url_site' => 'Endereço URL do site',
280
-	'format_date_attendu' => 'Inserir uma data no formato dd/mm/aaaa.',
281
-	'format_date_incorrecte' => 'A data e o seu formato está incorreta',
282
-	'format_heure_attendu' => 'Inserir uma hora no formato hh:mm.',
283
-	'format_heure_incorrecte' => 'A hora e o seu formato está incorreta',
284
-	'forum_non_inscrit' => 'Você não está inscrito, ou o endereço ou a senha estão errados.',
285
-	'forum_par_auteur' => 'por @auteur@',
286
-	'forum_titre_erreur' => 'Erro...',
249
+    'form_deja_inscrit' => 'Você já está inscrito.',
250
+    'form_email_non_valide' => 'Seu endereço de e-mail não é válido.',
251
+    'form_forum_access_refuse' => 'Você não tem mais acesso a este site.',
252
+    'form_forum_bonjour' => 'Bom dia @nom@,',
253
+    'form_forum_confirmer_email' => 'Para confirmar o seu endereço de e-mail, clique neste link: @url_confirm@',
254
+    'form_forum_email_deja_enregistre' => 'Este endereço de e-mail já está cadastrado, você pode usar a sua senha habitual.',
255
+    'form_forum_identifiant_mail' => 'Seu novo login foi enviado por e-mail.',
256
+    'form_forum_identifiants' => 'Identificadores pessoais',
257
+    'form_forum_indiquer_nom_email' => 'Informe aqui o seu nome  endereço de e-mail. O seu identificador pessoal será enviado de imediato por correio eletrônico.',
258
+    'form_forum_login' => 'login:',
259
+    'form_forum_message_auto' => '(esta é uma mensagem automática)',
260
+    'form_forum_pass' => 'senha:',
261
+    'form_forum_probleme_mail' => 'Problema de e-mail: o identificador não pôde ser enviado.',
262
+    'form_forum_voici1' => 'Estes são os seus identificadores para que você possa participar da vida do site "@nom_site_spip@" (@adresse_site@):',
263
+    'form_forum_voici2' => 'Estes são os seus identificadores para que você possa propor matérias ao site "@nom_site_spip@" (@adresse_login@):',
264
+    'form_indiquer_email' => 'Por favor, informe o seu endereço de e-mail.',
265
+    'form_indiquer_nom' => 'Por favor, informe o seu nome.',
266
+    'form_indiquer_nom_site' => 'Por favor, informe o nome do seu site.',
267
+    'form_pet_deja_enregistre' => 'Este site já está cadastrado',
268
+    'form_pet_signature_pasprise' => 'Sua assinatura não foi computada.',
269
+    'form_prop_confirmer_envoi' => 'Confirmar o envio',
270
+    'form_prop_description' => 'Descrição / comentário',
271
+    'form_prop_enregistre' => 'Sua proposta foi cadastrada, ela aparecerá online após ser validada pelos responsáveis deste site.',
272
+    'form_prop_envoyer' => 'Enviar uma mensagem',
273
+    'form_prop_indiquer_email' => 'Por favor, indique um endereço de e-mail válido',
274
+    'form_prop_indiquer_nom_site' => 'Por favor, informe o nome do site.',
275
+    'form_prop_indiquer_sujet' => 'Por favor, informe um assunto',
276
+    'form_prop_message_envoye' => 'Mensagem enviada',
277
+    'form_prop_non_enregistre' => 'Sua proposta não foi cadastrada.',
278
+    'form_prop_sujet' => 'Assunto',
279
+    'form_prop_url_site' => 'Endereço URL do site',
280
+    'format_date_attendu' => 'Inserir uma data no formato dd/mm/aaaa.',
281
+    'format_date_incorrecte' => 'A data e o seu formato está incorreta',
282
+    'format_heure_attendu' => 'Inserir uma hora no formato hh:mm.',
283
+    'format_heure_incorrecte' => 'A hora e o seu formato está incorreta',
284
+    'forum_non_inscrit' => 'Você não está inscrito, ou o endereço ou a senha estão errados.',
285
+    'forum_par_auteur' => 'por @auteur@',
286
+    'forum_titre_erreur' => 'Erro...',
287 287
 
288
-	// I
289
-	'ical_texte_rss_articles' => 'O arquivo «backend» das matérias deste site encontra-se no endereço:',
290
-	'ical_texte_rss_articles2' => 'Você pode também obter os arquivos «backend» para as matérias de cada seção do site:',
291
-	'ical_texte_rss_breves' => 'Existe também um arquivo contendo as notas do site. Ao especificar um número de seção, você obterá unicamente as natos dessa seção.',
292
-	'icone_a_suivre' => 'Acompanhar',
293
-	'icone_admin_site' => 'Administração do site',
294
-	'icone_agenda' => 'Agenda',
295
-	'icone_aide_ligne' => 'Ajuda',
296
-	'icone_articles' => 'Matérias',
297
-	'icone_auteurs' => 'Autores',
298
-	'icone_brouteur' => 'Navegação rápida',
299
-	'icone_configuration_site' => 'Configuração',
300
-	'icone_configurer_site' => 'Configurar o seu site',
301
-	'icone_creer_nouvel_auteur' => 'Criar um novo autor',
302
-	'icone_creer_rubrique' => 'Criar uma seção',
303
-	'icone_creer_sous_rubrique' => 'Criar uma subseção',
304
-	'icone_deconnecter' => 'Desconectar-se',
305
-	'icone_discussions' => 'Discussões',
306
-	'icone_doc_rubrique' => 'Documentos das seções',
307
-	'icone_ecrire_article' => 'Escrever uma nova matéria',
308
-	'icone_edition_site' => 'Edição',
309
-	'icone_gestion_langues' => 'Gerenciamento de idiomas',
310
-	'icone_informations_personnelles' => 'Informações pessoais',
311
-	'icone_interface_complet' => 'interface completa',
312
-	'icone_interface_simple' => 'Interface simplificada',
313
-	'icone_maintenance_site' => 'Manutenção do site',
314
-	'icone_messagerie_personnelle' => 'Mensagens pessoais',
315
-	'icone_repartition_debut' => 'Exibir a repartição após o início',
316
-	'icone_rubriques' => 'Seções',
317
-	'icone_sauver_site' => 'Backup do site',
318
-	'icone_site_entier' => 'Todo o site',
319
-	'icone_sites_references' => 'Sites referenciados',
320
-	'icone_statistiques' => 'Estatísticas do site',
321
-	'icone_suivi_activite' => 'Acompanhar a vida do site',
322
-	'icone_suivi_actualite' => 'Evolução do site',
323
-	'icone_suivi_pettions' => 'Acompanhar / gerenciar as petições',
324
-	'icone_suivi_revisions' => 'Modificações das matérias',
325
-	'icone_supprimer_document' => 'Suprimir este documento',
326
-	'icone_supprimer_image' => 'Suprimir esta imagem',
327
-	'icone_tous_articles' => 'Todas as suas matérias',
328
-	'icone_tous_auteur' => 'Todos os autores',
329
-	'icone_tous_visiteur' => 'Todos os visitantes',
330
-	'icone_visiter_site' => 'Ver o site público',
331
-	'icone_voir_en_ligne' => 'Ver online',
332
-	'img_indisponible' => 'imagem indisponível',
333
-	'impossible' => 'impossível',
334
-	'info_a_suivre' => 'ACOMPANHAR»',
335
-	'info_acces_interdit' => 'Acesso interdito',
336
-	'info_acces_refuse' => 'Acesso recusado',
337
-	'info_action' => 'Ação: @action@',
338
-	'info_administrer_rubriques' => 'Você pode administrar esta seção e suas subseções',
339
-	'info_adresse_non_indiquee' => 'Você não informou o endereço a testar!',
340
-	'info_aide' => 'AJUDA:',
341
-	'info_ajouter_mot' => 'Incluir esta palavra',
342
-	'info_annonce' => 'AVISO',
343
-	'info_annonces_generales' => 'Avisos gerais:',
344
-	'info_article_propose' => 'Matéria proposta',
345
-	'info_article_publie' => 'Matéria publicada',
346
-	'info_article_redaction' => 'Matéria em fase de redação',
347
-	'info_article_refuse' => 'Matéria recusada',
348
-	'info_article_supprime' => 'Matéria suprimida',
349
-	'info_articles' => 'Matérias',
350
-	'info_articles_a_valider' => 'As matérias para validar',
351
-	'info_articles_nb' => '@nb@ matérias',
352
-	'info_articles_proposes' => 'Matérias propostas',
353
-	'info_articles_un' => '1 matéria',
354
-	'info_auteurs_nombre' => 'autor(es):',
355
-	'info_authentification_ftp' => 'Autenticação (por FTP).',
356
-	'info_breves_2' => 'notas',
357
-	'info_breves_nb' => '@nb@ notas',
358
-	'info_breves_un' => '1 nota',
359
-	'info_connexion_refusee' => 'Conexão recusada',
360
-	'info_contact_developpeur' => 'Por favor, contate um desenvolvedor.',
361
-	'info_contenance' => 'Este site contém:',
362
-	'info_contribution' => 'contribuições',
363
-	'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.',
364
-	'info_copyright_doc' => 'Para mais informações, veja o site <a href="@spipnet@">@spipnet_affiche@</a>.',
365
-	'info_copyright_gpl' => 'sob licença GPL',
366
-	'info_cours_edition' => 'Em edição',
367
-	'info_creer_repertoire' => 'Por favor, crie um arquivo ou diretório com o nome:',
368
-	'info_creer_repertoire_2' => 'dentro do subdiretório <b>@repertoire@</b>, e depois:',
369
-	'info_creer_vignette' => 'criação automática do ícone',
370
-	'info_creerdansrubrique_non_autorise' => 'Você não tem permissão para criar um conteúdo nesta seção',
371
-	'info_deplier' => 'Expandir',
372
-	'info_descriptif_nombre' => 'descrição(ões):',
373
-	'info_description' => 'Resumo:',
374
-	'info_description_2' => 'Resumo:',
375
-	'info_dimension' => 'Dimensões:',
376
-	'info_documents_nb' => '@nb@ documentos',
377
-	'info_documents_un' => '1 documento',
378
-	'info_ecire_message_prive' => 'Escrever uma mensagem privada',
379
-	'info_email_invalide' => 'Endereço de e-mail inválido.',
380
-	'info_en_cours_validation' => 'Suas matérias em fase de redação',
381
-	'info_en_ligne' => 'Atualmente online:',
382
-	'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor',
383
-	'info_erreur_requete' => 'Erro na requisição:',
384
-	'info_erreur_squelette2' => 'Nenhum template <b>@fichier@</b> está disponível...',
385
-	'info_erreur_systeme' => 'Erro do sistema (errno @errsys@)',
386
-	'info_erreur_systeme2' => 'É possível que não haja espaço livre em disco, ou que a base de dados esteja corrompida.<br />
288
+    // I
289
+    'ical_texte_rss_articles' => 'O arquivo «backend» das matérias deste site encontra-se no endereço:',
290
+    'ical_texte_rss_articles2' => 'Você pode também obter os arquivos «backend» para as matérias de cada seção do site:',
291
+    'ical_texte_rss_breves' => 'Existe também um arquivo contendo as notas do site. Ao especificar um número de seção, você obterá unicamente as natos dessa seção.',
292
+    'icone_a_suivre' => 'Acompanhar',
293
+    'icone_admin_site' => 'Administração do site',
294
+    'icone_agenda' => 'Agenda',
295
+    'icone_aide_ligne' => 'Ajuda',
296
+    'icone_articles' => 'Matérias',
297
+    'icone_auteurs' => 'Autores',
298
+    'icone_brouteur' => 'Navegação rápida',
299
+    'icone_configuration_site' => 'Configuração',
300
+    'icone_configurer_site' => 'Configurar o seu site',
301
+    'icone_creer_nouvel_auteur' => 'Criar um novo autor',
302
+    'icone_creer_rubrique' => 'Criar uma seção',
303
+    'icone_creer_sous_rubrique' => 'Criar uma subseção',
304
+    'icone_deconnecter' => 'Desconectar-se',
305
+    'icone_discussions' => 'Discussões',
306
+    'icone_doc_rubrique' => 'Documentos das seções',
307
+    'icone_ecrire_article' => 'Escrever uma nova matéria',
308
+    'icone_edition_site' => 'Edição',
309
+    'icone_gestion_langues' => 'Gerenciamento de idiomas',
310
+    'icone_informations_personnelles' => 'Informações pessoais',
311
+    'icone_interface_complet' => 'interface completa',
312
+    'icone_interface_simple' => 'Interface simplificada',
313
+    'icone_maintenance_site' => 'Manutenção do site',
314
+    'icone_messagerie_personnelle' => 'Mensagens pessoais',
315
+    'icone_repartition_debut' => 'Exibir a repartição após o início',
316
+    'icone_rubriques' => 'Seções',
317
+    'icone_sauver_site' => 'Backup do site',
318
+    'icone_site_entier' => 'Todo o site',
319
+    'icone_sites_references' => 'Sites referenciados',
320
+    'icone_statistiques' => 'Estatísticas do site',
321
+    'icone_suivi_activite' => 'Acompanhar a vida do site',
322
+    'icone_suivi_actualite' => 'Evolução do site',
323
+    'icone_suivi_pettions' => 'Acompanhar / gerenciar as petições',
324
+    'icone_suivi_revisions' => 'Modificações das matérias',
325
+    'icone_supprimer_document' => 'Suprimir este documento',
326
+    'icone_supprimer_image' => 'Suprimir esta imagem',
327
+    'icone_tous_articles' => 'Todas as suas matérias',
328
+    'icone_tous_auteur' => 'Todos os autores',
329
+    'icone_tous_visiteur' => 'Todos os visitantes',
330
+    'icone_visiter_site' => 'Ver o site público',
331
+    'icone_voir_en_ligne' => 'Ver online',
332
+    'img_indisponible' => 'imagem indisponível',
333
+    'impossible' => 'impossível',
334
+    'info_a_suivre' => 'ACOMPANHAR»',
335
+    'info_acces_interdit' => 'Acesso interdito',
336
+    'info_acces_refuse' => 'Acesso recusado',
337
+    'info_action' => 'Ação: @action@',
338
+    'info_administrer_rubriques' => 'Você pode administrar esta seção e suas subseções',
339
+    'info_adresse_non_indiquee' => 'Você não informou o endereço a testar!',
340
+    'info_aide' => 'AJUDA:',
341
+    'info_ajouter_mot' => 'Incluir esta palavra',
342
+    'info_annonce' => 'AVISO',
343
+    'info_annonces_generales' => 'Avisos gerais:',
344
+    'info_article_propose' => 'Matéria proposta',
345
+    'info_article_publie' => 'Matéria publicada',
346
+    'info_article_redaction' => 'Matéria em fase de redação',
347
+    'info_article_refuse' => 'Matéria recusada',
348
+    'info_article_supprime' => 'Matéria suprimida',
349
+    'info_articles' => 'Matérias',
350
+    'info_articles_a_valider' => 'As matérias para validar',
351
+    'info_articles_nb' => '@nb@ matérias',
352
+    'info_articles_proposes' => 'Matérias propostas',
353
+    'info_articles_un' => '1 matéria',
354
+    'info_auteurs_nombre' => 'autor(es):',
355
+    'info_authentification_ftp' => 'Autenticação (por FTP).',
356
+    'info_breves_2' => 'notas',
357
+    'info_breves_nb' => '@nb@ notas',
358
+    'info_breves_un' => '1 nota',
359
+    'info_connexion_refusee' => 'Conexão recusada',
360
+    'info_contact_developpeur' => 'Por favor, contate um desenvolvedor.',
361
+    'info_contenance' => 'Este site contém:',
362
+    'info_contribution' => 'contribuições',
363
+    'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.',
364
+    'info_copyright_doc' => 'Para mais informações, veja o site <a href="@spipnet@">@spipnet_affiche@</a>.',
365
+    'info_copyright_gpl' => 'sob licença GPL',
366
+    'info_cours_edition' => 'Em edição',
367
+    'info_creer_repertoire' => 'Por favor, crie um arquivo ou diretório com o nome:',
368
+    'info_creer_repertoire_2' => 'dentro do subdiretório <b>@repertoire@</b>, e depois:',
369
+    'info_creer_vignette' => 'criação automática do ícone',
370
+    'info_creerdansrubrique_non_autorise' => 'Você não tem permissão para criar um conteúdo nesta seção',
371
+    'info_deplier' => 'Expandir',
372
+    'info_descriptif_nombre' => 'descrição(ões):',
373
+    'info_description' => 'Resumo:',
374
+    'info_description_2' => 'Resumo:',
375
+    'info_dimension' => 'Dimensões:',
376
+    'info_documents_nb' => '@nb@ documentos',
377
+    'info_documents_un' => '1 documento',
378
+    'info_ecire_message_prive' => 'Escrever uma mensagem privada',
379
+    'info_email_invalide' => 'Endereço de e-mail inválido.',
380
+    'info_en_cours_validation' => 'Suas matérias em fase de redação',
381
+    'info_en_ligne' => 'Atualmente online:',
382
+    'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor',
383
+    'info_erreur_requete' => 'Erro na requisição:',
384
+    'info_erreur_squelette2' => 'Nenhum template <b>@fichier@</b> está disponível...',
385
+    'info_erreur_systeme' => 'Erro do sistema (errno @errsys@)',
386
+    'info_erreur_systeme2' => 'É possível que não haja espaço livre em disco, ou que a base de dados esteja corrompida.<br />
387 387
 <span style="color:red;">Tente <a href=\'@script@\'>reparar a base</a>, ou contate o seu serviço de hospedagem.</span>',
388
-	'info_fini' => 'Terminou!',
389
-	'info_format_image' => 'Formatos das imagens que podem ser utilizados para criar os ícones @gd_formats@.',
390
-	'info_format_non_defini' => 'formato não definido',
391
-	'info_grand_ecran' => 'Alta resolução',
392
-	'info_image_aide' => 'AJUDA',
393
-	'info_image_process_titre' => 'Método de criação dos ícones',
394
-	'info_impossible_lire_page' => '<b>Erro!</b> Impossível ler a página <tt><html>@test_proxy@</html></tt> via proxy',
395
-	'info_installation_systeme_publication' => 'Instalação do sistema de publicação...',
396
-	'info_installer_documents' => 'Você pode instalar automaticamente todos os documentos contídos no diretório @upload@.',
397
-	'info_installer_ftp' => 'Como administrador, você pode transferir (por FTP) arquivos para o diretório @upload@ para, em seguida, selecioná-los aqui diretamente.',
398
-	'info_installer_images' => 'Você pode transferir imagens nos formatos JPEG, GIF e PNG.',
399
-	'info_installer_images_dossier' => 'Transferir as imagens para o diretório @upload@ para poder selecioná-las aqui.',
400
-	'info_interface_complete' => 'interface completa',
401
-	'info_interface_simple' => 'Interface simplificada',
402
-	'info_joindre_document_article' => 'Você pode anexar a esta matéria documentos dos tipos a seguir',
403
-	'info_joindre_document_rubrique' => 'Você pode anexar a esta seção documentos dos tipos a seguir',
404
-	'info_joindre_documents_article' => 'Você pode anexar à sua matéria documentos dos tipos a seguir:',
405
-	'info_l_article' => 'a matéria',
406
-	'info_la_breve' => 'a nota',
407
-	'info_la_rubrique' => 'a seção',
408
-	'info_langue_principale' => 'Idioma principal do site',
409
-	'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
410
-	'info_les_auteurs_1' => 'por @les_auteurs@',
411
-	'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.',
412
-	'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).',
413
-	'info_mail_fournisseur' => '[email protected]',
414
-	'info_message_2' => 'MENSAGEM',
415
-	'info_message_supprime' => 'MENSAGEM EXCLUÍDA',
416
-	'info_messages_nb' => '@nb@ mensagens',
417
-	'info_messages_un' => '1 mensagem',
418
-	'info_mise_en_ligne' => 'Data de publicação online:',
419
-	'info_modification_parametres_securite' => 'modificações dos parâmetros de segurança',
420
-	'info_mois_courant' => 'No mês corrente:',
421
-	'info_mot_cle_ajoute' => 'A palavra-chave a seguir foi associada a',
422
-	'info_multi_herit' => 'Idioma padrão',
423
-	'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhados</u> dispõem de tradução total ou parcial dos textos da interface. Se você escolher esses idiomas, diversos elementos do site público (datas, formulários) são traduzidos automaticamente. Para os idiomas não sublinhados, estes elementos aparecerão no idioma principal do site.',
424
-	'info_multilinguisme' => 'Multilinguismo',
425
-	'info_nom_non_utilisateurs_connectes' => 'Seu nome não aparece na relação de usuários conectados.',
426
-	'info_nom_utilisateurs_connectes' => 'Seu nome aparecerá na relação de usuários conectados.',
427
-	'info_nombre_en_ligne' => 'Online neste momento:',
428
-	'info_non_resultat' => 'Nenhum resultados para "@cherche_mot@"',
429
-	'info_non_utilisation_messagerie' => 'Você não utiliza o sistema de mensagens deste site.',
430
-	'info_nouveau_message' => 'VOCÊ TEM UMA NOVA MENSAGEM',
431
-	'info_nouveaux_messages' => 'VOCÊ TEM @total_messages@ MENSAGENS NOVAS',
432
-	'info_numero_abbreviation' => 'N° ',
433
-	'info_obligatoire' => 'Esta informação é obrigatória',
434
-	'info_page_actuelle' => 'Página atual',
435
-	'info_pense_bete' => 'LEMBRETE',
436
-	'info_petit_ecran' => 'Baixa resolução',
437
-	'info_petition_close' => 'Petição fechada',
438
-	'info_pixels' => 'pixels',
439
-	'info_plusieurs_mots_trouves' => 'Várias palavras-chave encontradas para "@cherche_mot@":',
440
-	'info_portfolio_automatique' => 'Portfólio automático:',
441
-	'info_premier_resultat' => '[@debut_limit@ primeiros resultados de @total@]',
442
-	'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados de @total@]',
443
-	'info_propose_1' => '[@nom_site_spip@] Propõe: @titre@',
444
-	'info_propose_2' => 'Matéria proposta
388
+    'info_fini' => 'Terminou!',
389
+    'info_format_image' => 'Formatos das imagens que podem ser utilizados para criar os ícones @gd_formats@.',
390
+    'info_format_non_defini' => 'formato não definido',
391
+    'info_grand_ecran' => 'Alta resolução',
392
+    'info_image_aide' => 'AJUDA',
393
+    'info_image_process_titre' => 'Método de criação dos ícones',
394
+    'info_impossible_lire_page' => '<b>Erro!</b> Impossível ler a página <tt><html>@test_proxy@</html></tt> via proxy',
395
+    'info_installation_systeme_publication' => 'Instalação do sistema de publicação...',
396
+    'info_installer_documents' => 'Você pode instalar automaticamente todos os documentos contídos no diretório @upload@.',
397
+    'info_installer_ftp' => 'Como administrador, você pode transferir (por FTP) arquivos para o diretório @upload@ para, em seguida, selecioná-los aqui diretamente.',
398
+    'info_installer_images' => 'Você pode transferir imagens nos formatos JPEG, GIF e PNG.',
399
+    'info_installer_images_dossier' => 'Transferir as imagens para o diretório @upload@ para poder selecioná-las aqui.',
400
+    'info_interface_complete' => 'interface completa',
401
+    'info_interface_simple' => 'Interface simplificada',
402
+    'info_joindre_document_article' => 'Você pode anexar a esta matéria documentos dos tipos a seguir',
403
+    'info_joindre_document_rubrique' => 'Você pode anexar a esta seção documentos dos tipos a seguir',
404
+    'info_joindre_documents_article' => 'Você pode anexar à sua matéria documentos dos tipos a seguir:',
405
+    'info_l_article' => 'a matéria',
406
+    'info_la_breve' => 'a nota',
407
+    'info_la_rubrique' => 'a seção',
408
+    'info_langue_principale' => 'Idioma principal do site',
409
+    'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
410
+    'info_les_auteurs_1' => 'por @les_auteurs@',
411
+    'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.',
412
+    'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).',
413
+    'info_mail_fournisseur' => '[email protected]',
414
+    'info_message_2' => 'MENSAGEM',
415
+    'info_message_supprime' => 'MENSAGEM EXCLUÍDA',
416
+    'info_messages_nb' => '@nb@ mensagens',
417
+    'info_messages_un' => '1 mensagem',
418
+    'info_mise_en_ligne' => 'Data de publicação online:',
419
+    'info_modification_parametres_securite' => 'modificações dos parâmetros de segurança',
420
+    'info_mois_courant' => 'No mês corrente:',
421
+    'info_mot_cle_ajoute' => 'A palavra-chave a seguir foi associada a',
422
+    'info_multi_herit' => 'Idioma padrão',
423
+    'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhados</u> dispõem de tradução total ou parcial dos textos da interface. Se você escolher esses idiomas, diversos elementos do site público (datas, formulários) são traduzidos automaticamente. Para os idiomas não sublinhados, estes elementos aparecerão no idioma principal do site.',
424
+    'info_multilinguisme' => 'Multilinguismo',
425
+    'info_nom_non_utilisateurs_connectes' => 'Seu nome não aparece na relação de usuários conectados.',
426
+    'info_nom_utilisateurs_connectes' => 'Seu nome aparecerá na relação de usuários conectados.',
427
+    'info_nombre_en_ligne' => 'Online neste momento:',
428
+    'info_non_resultat' => 'Nenhum resultados para "@cherche_mot@"',
429
+    'info_non_utilisation_messagerie' => 'Você não utiliza o sistema de mensagens deste site.',
430
+    'info_nouveau_message' => 'VOCÊ TEM UMA NOVA MENSAGEM',
431
+    'info_nouveaux_messages' => 'VOCÊ TEM @total_messages@ MENSAGENS NOVAS',
432
+    'info_numero_abbreviation' => 'N° ',
433
+    'info_obligatoire' => 'Esta informação é obrigatória',
434
+    'info_page_actuelle' => 'Página atual',
435
+    'info_pense_bete' => 'LEMBRETE',
436
+    'info_petit_ecran' => 'Baixa resolução',
437
+    'info_petition_close' => 'Petição fechada',
438
+    'info_pixels' => 'pixels',
439
+    'info_plusieurs_mots_trouves' => 'Várias palavras-chave encontradas para "@cherche_mot@":',
440
+    'info_portfolio_automatique' => 'Portfólio automático:',
441
+    'info_premier_resultat' => '[@debut_limit@ primeiros resultados de @total@]',
442
+    'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados de @total@]',
443
+    'info_propose_1' => '[@nom_site_spip@] Propõe: @titre@',
444
+    'info_propose_2' => 'Matéria proposta
445 445
 ----------------',
446
-	'info_propose_3' => 'A matéria "@titre@" foi proposta para publicação.',
447
-	'info_propose_4' => 'Você está convidado a consultá-la e dar sua opinião',
448
-	'info_propose_5' => 'no fórum a ela anexado. Ela está disponível no endereço:',
449
-	'info_publie_01' => 'A matéria "@titre@" foi validada por @connect_nom@.',
450
-	'info_publie_1' => '[@nom_site_spip@] PUBLICADO: @titre@',
451
-	'info_publie_2' => 'Matéria publicada
446
+    'info_propose_3' => 'A matéria "@titre@" foi proposta para publicação.',
447
+    'info_propose_4' => 'Você está convidado a consultá-la e dar sua opinião',
448
+    'info_propose_5' => 'no fórum a ela anexado. Ela está disponível no endereço:',
449
+    'info_publie_01' => 'A matéria "@titre@" foi validada por @connect_nom@.',
450
+    'info_publie_1' => '[@nom_site_spip@] PUBLICADO: @titre@',
451
+    'info_publie_2' => 'Matéria publicada
452 452
 -----------------',
453
-	'info_rechercher' => 'Procurar',
454
-	'info_rechercher_02' => 'Procurar:',
455
-	'info_remplacer_vignette' => 'Substituir o ícone padrão por um logo personalizado:',
456
-	'info_rubriques_nb' => '@nb@ seções',
457
-	'info_rubriques_un' => '1 seção',
458
-	'info_sans_titre_2' => 'sem título',
459
-	'info_selectionner_fichier' => 'Você pode escolher um arquivo do diretório @upload@',
460
-	'info_selectionner_fichier_2' => 'Selecionar um arquivo:',
461
-	'info_sites_nb' => '@nb@ sites',
462
-	'info_sites_un' => '1 site',
463
-	'info_supprimer_vignette' => 'excluir o ícone',
464
-	'info_symbole_bleu' => 'O ícone <b>azul</b> indica um <b>lembrete</b>: ou seja, uma mensagem para seu uso pessoal.',
465
-	'info_symbole_jaune' => 'O ícone <b>amarelo</b> indica um  <b>anúncio para todos os redatores</b>: modificável por todos os administradores, e visível por todos os redatores.',
466
-	'info_symbole_vert' => 'O ícone <b>verde</b> indica as  <b>mensagens trocadas com outros usuários</b> do site.',
467
-	'info_telecharger_nouveau_logo' => 'Transferir um novo logo:',
468
-	'info_telecharger_ordinateur' => 'Tranferir do seu computador:',
469
-	'info_tous_resultats_enregistres' => '[todos os resultados são gravados]',
470
-	'info_tout_afficher' => 'Mostrar todas',
471
-	'info_travaux_texte' => 'Este site ainda não está configurado. Volte mais tarde...',
472
-	'info_travaux_titre' => 'Site em manutenção',
473
-	'info_trop_resultat' => 'Resultados de mais para "@cherche_mot@"; por favor, refine a busca.',
474
-	'info_utilisation_messagerie_interne' => 'Você usa o sistema interno de mensagens deste site.',
475
-	'info_valider_lien' => 'validar este link',
476
-	'info_verifier_image' => ', verifique se as suas imagens foram transferidas corretamente.',
477
-	'info_vignette_defaut' => 'Ícone padrão',
478
-	'info_vignette_personnalisee' => 'Ícone personalizado',
479
-	'info_visite' => 'visita:',
480
-	'info_vos_rendez_vous' => 'Seus encontros futuros',
481
-	'infos_vos_pense_bete' => 'Seus lembretes',
453
+    'info_rechercher' => 'Procurar',
454
+    'info_rechercher_02' => 'Procurar:',
455
+    'info_remplacer_vignette' => 'Substituir o ícone padrão por um logo personalizado:',
456
+    'info_rubriques_nb' => '@nb@ seções',
457
+    'info_rubriques_un' => '1 seção',
458
+    'info_sans_titre_2' => 'sem título',
459
+    'info_selectionner_fichier' => 'Você pode escolher um arquivo do diretório @upload@',
460
+    'info_selectionner_fichier_2' => 'Selecionar um arquivo:',
461
+    'info_sites_nb' => '@nb@ sites',
462
+    'info_sites_un' => '1 site',
463
+    'info_supprimer_vignette' => 'excluir o ícone',
464
+    'info_symbole_bleu' => 'O ícone <b>azul</b> indica um <b>lembrete</b>: ou seja, uma mensagem para seu uso pessoal.',
465
+    'info_symbole_jaune' => 'O ícone <b>amarelo</b> indica um  <b>anúncio para todos os redatores</b>: modificável por todos os administradores, e visível por todos os redatores.',
466
+    'info_symbole_vert' => 'O ícone <b>verde</b> indica as  <b>mensagens trocadas com outros usuários</b> do site.',
467
+    'info_telecharger_nouveau_logo' => 'Transferir um novo logo:',
468
+    'info_telecharger_ordinateur' => 'Tranferir do seu computador:',
469
+    'info_tous_resultats_enregistres' => '[todos os resultados são gravados]',
470
+    'info_tout_afficher' => 'Mostrar todas',
471
+    'info_travaux_texte' => 'Este site ainda não está configurado. Volte mais tarde...',
472
+    'info_travaux_titre' => 'Site em manutenção',
473
+    'info_trop_resultat' => 'Resultados de mais para "@cherche_mot@"; por favor, refine a busca.',
474
+    'info_utilisation_messagerie_interne' => 'Você usa o sistema interno de mensagens deste site.',
475
+    'info_valider_lien' => 'validar este link',
476
+    'info_verifier_image' => ', verifique se as suas imagens foram transferidas corretamente.',
477
+    'info_vignette_defaut' => 'Ícone padrão',
478
+    'info_vignette_personnalisee' => 'Ícone personalizado',
479
+    'info_visite' => 'visita:',
480
+    'info_vos_rendez_vous' => 'Seus encontros futuros',
481
+    'infos_vos_pense_bete' => 'Seus lembretes',
482 482
 
483
-	// L
484
-	'label_ajout_id_rapide' => 'Ajuda rápida',
485
-	'label_poids_fichier' => 'Tamanho',
486
-	'label_ponctuer' => '@label@:',
487
-	'lien_afficher_icones_seuls' => 'Exibir apenas os ícones',
488
-	'lien_afficher_texte_icones' => 'Exibir ícones e texto',
489
-	'lien_afficher_texte_seul' => 'Exibir apenas o texto',
490
-	'lien_aller_a_la_derniere_page' => 'Ir para a última página',
491
-	'lien_aller_a_la_page_nb' => 'Ir para a página @nb@',
492
-	'lien_aller_a_la_page_precedente' => 'Ir para a página anterior',
493
-	'lien_aller_a_la_page_suivante' => 'Ir para a página seguinte',
494
-	'lien_aller_a_la_premiere_page' => 'Ir para a primeira página',
495
-	'lien_liberer' => 'liberar',
496
-	'lien_liberer_tous' => 'liberar todas',
497
-	'lien_nouvea_pense_bete' => 'NOVO LEMBRETE',
498
-	'lien_nouveau_message' => 'NOVA MENSAGEM',
499
-	'lien_nouvelle_annonce' => 'NOVO ANÚNCIO',
500
-	'lien_petitions' => 'PETIÇÃO',
501
-	'lien_popularite' => 'popularidade: @popularite@%',
502
-	'lien_racine_site' => 'RAIZ DO SITE',
503
-	'lien_reessayer' => 'tente novamente',
504
-	'lien_repondre_message' => 'Responder a esta mensagem',
505
-	'lien_supprimer' => 'excluir',
506
-	'lien_tout_afficher' => 'Mostrar tudo',
507
-	'lien_visite_site' => 'visitar este site',
508
-	'lien_visites' => '@visites@ visitas',
509
-	'lien_voir_auteur' => 'Ver este autor',
510
-	'ligne' => 'Linha',
511
-	'login' => 'Conexão',
512
-	'login_acces_prive' => 'acesso ao espaço privado',
513
-	'login_autre_identifiant' => 'conectar-se com outra identificação',
514
-	'login_cookie_accepte' => 'Por favor, configure o seu navegador para aceitá-los (pelo menos para este site).',
515
-	'login_cookie_oblige' => 'Para você se identificar de modo seguro neste site, você precisa aceitar cookies.',
516
-	'login_deconnexion_ok' => 'Desconexão efetuada.',
517
-	'login_erreur_pass' => 'Erro de senha.',
518
-	'login_espace_prive' => 'espaço privado',
519
-	'login_identifiant_inconnu' => 'O identificador «@login@» não está cadastrado.',
520
-	'login_login' => 'Login:',
521
-	'login_login2' => 'Login',
522
-	'login_login_pass_incorrect' => '(Login ou senha incorreta.)',
523
-	'login_motpasseoublie' => 'esqueceu sua senha?',
524
-	'login_non_securise' => 'Atenção, este formulário não é seguro.
483
+    // L
484
+    'label_ajout_id_rapide' => 'Ajuda rápida',
485
+    'label_poids_fichier' => 'Tamanho',
486
+    'label_ponctuer' => '@label@:',
487
+    'lien_afficher_icones_seuls' => 'Exibir apenas os ícones',
488
+    'lien_afficher_texte_icones' => 'Exibir ícones e texto',
489
+    'lien_afficher_texte_seul' => 'Exibir apenas o texto',
490
+    'lien_aller_a_la_derniere_page' => 'Ir para a última página',
491
+    'lien_aller_a_la_page_nb' => 'Ir para a página @nb@',
492
+    'lien_aller_a_la_page_precedente' => 'Ir para a página anterior',
493
+    'lien_aller_a_la_page_suivante' => 'Ir para a página seguinte',
494
+    'lien_aller_a_la_premiere_page' => 'Ir para a primeira página',
495
+    'lien_liberer' => 'liberar',
496
+    'lien_liberer_tous' => 'liberar todas',
497
+    'lien_nouvea_pense_bete' => 'NOVO LEMBRETE',
498
+    'lien_nouveau_message' => 'NOVA MENSAGEM',
499
+    'lien_nouvelle_annonce' => 'NOVO ANÚNCIO',
500
+    'lien_petitions' => 'PETIÇÃO',
501
+    'lien_popularite' => 'popularidade: @popularite@%',
502
+    'lien_racine_site' => 'RAIZ DO SITE',
503
+    'lien_reessayer' => 'tente novamente',
504
+    'lien_repondre_message' => 'Responder a esta mensagem',
505
+    'lien_supprimer' => 'excluir',
506
+    'lien_tout_afficher' => 'Mostrar tudo',
507
+    'lien_visite_site' => 'visitar este site',
508
+    'lien_visites' => '@visites@ visitas',
509
+    'lien_voir_auteur' => 'Ver este autor',
510
+    'ligne' => 'Linha',
511
+    'login' => 'Conexão',
512
+    'login_acces_prive' => 'acesso ao espaço privado',
513
+    'login_autre_identifiant' => 'conectar-se com outra identificação',
514
+    'login_cookie_accepte' => 'Por favor, configure o seu navegador para aceitá-los (pelo menos para este site).',
515
+    'login_cookie_oblige' => 'Para você se identificar de modo seguro neste site, você precisa aceitar cookies.',
516
+    'login_deconnexion_ok' => 'Desconexão efetuada.',
517
+    'login_erreur_pass' => 'Erro de senha.',
518
+    'login_espace_prive' => 'espaço privado',
519
+    'login_identifiant_inconnu' => 'O identificador «@login@» não está cadastrado.',
520
+    'login_login' => 'Login:',
521
+    'login_login2' => 'Login',
522
+    'login_login_pass_incorrect' => '(Login ou senha incorreta.)',
523
+    'login_motpasseoublie' => 'esqueceu sua senha?',
524
+    'login_non_securise' => 'Atenção, este formulário não é seguro.
525 525
 Se você não quiser que a sua senha possa ser interceptada na rede, por favor ative o Javascript no seu navegador e',
526
-	'login_nouvelle_tentative' => 'Tentar novamente',
527
-	'login_par_ici' => 'VocÊ está registrado... por aqui...',
528
-	'login_pass2' => 'Senha:',
529
-	'login_preferez_refuser' => '<b>Se você prefere recusar os cookies</b>, um outro método de conexão (menos seguro) está disponível:',
530
-	'login_recharger' => 'atualizar esta página',
531
-	'login_rester_identifie' => 'Manter-se identificado',
532
-	'login_retour_public' => 'Voltar ao site público',
533
-	'login_retour_site' => 'Voltar ao site público',
534
-	'login_retoursitepublic' => 'voltar ao site público',
535
-	'login_sans_cookie' => 'Identificação sem cookie',
536
-	'login_securise' => 'Login seguro',
537
-	'login_sinscrire' => 'Cadastrar-se',
538
-	'login_test_navigateur' => 'testar navegador/reconexão',
539
-	'login_verifiez_navigateur' => '(Verifique sempre se o seu navegador não está memorizando a sua senha...)',
526
+    'login_nouvelle_tentative' => 'Tentar novamente',
527
+    'login_par_ici' => 'VocÊ está registrado... por aqui...',
528
+    'login_pass2' => 'Senha:',
529
+    'login_preferez_refuser' => '<b>Se você prefere recusar os cookies</b>, um outro método de conexão (menos seguro) está disponível:',
530
+    'login_recharger' => 'atualizar esta página',
531
+    'login_rester_identifie' => 'Manter-se identificado',
532
+    'login_retour_public' => 'Voltar ao site público',
533
+    'login_retour_site' => 'Voltar ao site público',
534
+    'login_retoursitepublic' => 'voltar ao site público',
535
+    'login_sans_cookie' => 'Identificação sem cookie',
536
+    'login_securise' => 'Login seguro',
537
+    'login_sinscrire' => 'Cadastrar-se',
538
+    'login_test_navigateur' => 'testar navegador/reconexão',
539
+    'login_verifiez_navigateur' => '(Verifique sempre se o seu navegador não está memorizando a sua senha...)',
540 540
 
541
-	// M
542
-	'masquer_colonne' => 'Ocultar esta coluna',
543
-	'masquer_trad' => 'esconder as traduções',
544
-	'message_nouveaux_identifiants_echec' => 'Impossível criar novos logins.',
545
-	'message_nouveaux_identifiants_echec_envoi' => 'Os novos logins de conexão não puderam ser enviados.',
546
-	'message_nouveaux_identifiants_ok' => 'Os novos logins de conexão foram enviados para @email@.',
547
-	'module_fichiers_langues' => 'Arquivos de idioma',
541
+    // M
542
+    'masquer_colonne' => 'Ocultar esta coluna',
543
+    'masquer_trad' => 'esconder as traduções',
544
+    'message_nouveaux_identifiants_echec' => 'Impossível criar novos logins.',
545
+    'message_nouveaux_identifiants_echec_envoi' => 'Os novos logins de conexão não puderam ser enviados.',
546
+    'message_nouveaux_identifiants_ok' => 'Os novos logins de conexão foram enviados para @email@.',
547
+    'module_fichiers_langues' => 'Arquivos de idioma',
548 548
 
549
-	// N
550
-	'navigateur_pas_redirige' => 'Se o seu navegador não o redirecionar, clique aqui para continuar.',
551
-	'numero' => 'Número',
549
+    // N
550
+    'navigateur_pas_redirige' => 'Se o seu navegador não o redirecionar, clique aqui para continuar.',
551
+    'numero' => 'Número',
552 552
 
553
-	// O
554
-	'occurence' => 'Ocorrência',
555
-	'onglet_affacer_base' => 'Apagar a base',
556
-	'onglet_auteur' => 'O autor',
557
-	'onglet_contenu_site' => 'Conteúdo do site',
558
-	'onglet_evolution_visite_mod' => 'Evolução',
559
-	'onglet_fonctions_avances' => 'Funções avançadas',
560
-	'onglet_informations_personnelles' => 'Informações pessoais',
561
-	'onglet_interactivite' => 'Interatividade',
562
-	'onglet_messagerie' => 'Sistema de mensagens',
563
-	'onglet_repartition_rubrique' => 'Repartição por seções',
564
-	'onglet_save_restaur_base' => 'Fazer cópia de segurança/restaurar a base',
565
-	'onglet_vider_cache' => 'Esvaziar o cache',
553
+    // O
554
+    'occurence' => 'Ocorrência',
555
+    'onglet_affacer_base' => 'Apagar a base',
556
+    'onglet_auteur' => 'O autor',
557
+    'onglet_contenu_site' => 'Conteúdo do site',
558
+    'onglet_evolution_visite_mod' => 'Evolução',
559
+    'onglet_fonctions_avances' => 'Funções avançadas',
560
+    'onglet_informations_personnelles' => 'Informações pessoais',
561
+    'onglet_interactivite' => 'Interatividade',
562
+    'onglet_messagerie' => 'Sistema de mensagens',
563
+    'onglet_repartition_rubrique' => 'Repartição por seções',
564
+    'onglet_save_restaur_base' => 'Fazer cópia de segurança/restaurar a base',
565
+    'onglet_vider_cache' => 'Esvaziar o cache',
566 566
 
567
-	// P
568
-	'pass_choix_pass' => 'Por favor, escolha a sua nova senha:',
569
-	'pass_erreur' => 'Erro',
570
-	'pass_erreur_acces_refuse' => '<b>Erro:</b> você não tem mais acesso a este site.',
571
-	'pass_erreur_code_inconnu' => '<b>Erro:</b> este login não corresponde a nenhum visitante com permissão de acesso a este site.',
572
-	'pass_erreur_non_enregistre' => '<b>Erro:</b> o e-mail <tt>@email_oubli@</tt> não está cadastrado neste site.',
573
-	'pass_erreur_non_valide' => '<b>Erro:</b> o e-mail <tt>@email_oubli@</tt> não é válido!',
574
-	'pass_erreur_probleme_technique' => '<b>Erro:</b> este e-mail não pôde ser enviado devido a um problema técnico.',
575
-	'pass_espace_prive_bla' => 'O espaço privado deste site é aberto aos visitantes, após inscrição. Uma vez cadastrado, você poderá consultar as matérias em fase de redação, propor a publicação de novas matérias e participar de todos os fóruns.',
576
-	'pass_forum_bla' => 'Você soliciou a participação num fórum reservado a visitantes registrados.',
577
-	'pass_indiquez_cidessous' => 'Informe abaixo o endereço de e-mail com o qual você se cadastrou anteriormente. Você receberá um e-mail lhe indicando os procedimentos a seguir para recuperar o seu acesso.',
578
-	'pass_mail_passcookie' => '(esta é uma mensagem automática)
567
+    // P
568
+    'pass_choix_pass' => 'Por favor, escolha a sua nova senha:',
569
+    'pass_erreur' => 'Erro',
570
+    'pass_erreur_acces_refuse' => '<b>Erro:</b> você não tem mais acesso a este site.',
571
+    'pass_erreur_code_inconnu' => '<b>Erro:</b> este login não corresponde a nenhum visitante com permissão de acesso a este site.',
572
+    'pass_erreur_non_enregistre' => '<b>Erro:</b> o e-mail <tt>@email_oubli@</tt> não está cadastrado neste site.',
573
+    'pass_erreur_non_valide' => '<b>Erro:</b> o e-mail <tt>@email_oubli@</tt> não é válido!',
574
+    'pass_erreur_probleme_technique' => '<b>Erro:</b> este e-mail não pôde ser enviado devido a um problema técnico.',
575
+    'pass_espace_prive_bla' => 'O espaço privado deste site é aberto aos visitantes, após inscrição. Uma vez cadastrado, você poderá consultar as matérias em fase de redação, propor a publicação de novas matérias e participar de todos os fóruns.',
576
+    'pass_forum_bla' => 'Você soliciou a participação num fórum reservado a visitantes registrados.',
577
+    'pass_indiquez_cidessous' => 'Informe abaixo o endereço de e-mail com o qual você se cadastrou anteriormente. Você receberá um e-mail lhe indicando os procedimentos a seguir para recuperar o seu acesso.',
578
+    'pass_mail_passcookie' => '(esta é uma mensagem automática)
579 579
 Para recuperar o seu acesso ao site
580 580
 @nom_site_spip@ (@adresse_site@)
581 581
 
@@ -587,140 +587,140 @@  discard block
 block discarded – undo
587 587
 e reconectar-se com o site.
588 588
 
589 589
 ',
590
-	'pass_mot_oublie' => 'Senha esquecida',
591
-	'pass_nouveau_enregistre' => 'Sua nova senha foi cadastrada.',
592
-	'pass_nouveau_pass' => 'Nova senha',
593
-	'pass_ok' => 'OK',
594
-	'pass_oubli_mot' => 'Esquecimento de senha',
595
-	'pass_procedure_changer' => 'Para alterar a sua senha, por favor informe o endereço de e-mail associado à sua conta.',
596
-	'pass_quitter_fenetre' => 'Fechar esta janela',
597
-	'pass_rappel_login' => 'Lembrete: seu login é «@login@».',
598
-	'pass_recevoir_mail' => 'Um link para redefinição da sua senha foi enviado para o seu endereço de e-mail (se ele for válido).',
599
-	'pass_retour_public' => 'Voltar para o site público',
600
-	'pass_rien_a_faire_ici' => 'Nada a fazer aqui.',
601
-	'pass_vousinscrire' => 'Cadastrar-se neste site',
602
-	'precedent' => 'precedente',
603
-	'previsualisation' => 'Visualização',
604
-	'previsualiser' => 'Visualizar',
590
+    'pass_mot_oublie' => 'Senha esquecida',
591
+    'pass_nouveau_enregistre' => 'Sua nova senha foi cadastrada.',
592
+    'pass_nouveau_pass' => 'Nova senha',
593
+    'pass_ok' => 'OK',
594
+    'pass_oubli_mot' => 'Esquecimento de senha',
595
+    'pass_procedure_changer' => 'Para alterar a sua senha, por favor informe o endereço de e-mail associado à sua conta.',
596
+    'pass_quitter_fenetre' => 'Fechar esta janela',
597
+    'pass_rappel_login' => 'Lembrete: seu login é «@login@».',
598
+    'pass_recevoir_mail' => 'Um link para redefinição da sua senha foi enviado para o seu endereço de e-mail (se ele for válido).',
599
+    'pass_retour_public' => 'Voltar para o site público',
600
+    'pass_rien_a_faire_ici' => 'Nada a fazer aqui.',
601
+    'pass_vousinscrire' => 'Cadastrar-se neste site',
602
+    'precedent' => 'precedente',
603
+    'previsualisation' => 'Visualização',
604
+    'previsualiser' => 'Visualizar',
605 605
 
606
-	// R
607
-	'retour' => 'Voltar',
606
+    // R
607
+    'retour' => 'Voltar',
608 608
 
609
-	// S
610
-	'spip_conforme_dtd' => 'O SPIP considera este documento de acordo com o seu DOCTYPE:',
611
-	'squelette' => 'template',
612
-	'squelette_inclus_ligne' => 'template incluído, linha',
613
-	'squelette_ligne' => 'template, linha',
614
-	'stats_visites_et_popularite' => '@visites@ visitas; popularidade: @popularite@',
615
-	'suivant' => 'seguinte',
609
+    // S
610
+    'spip_conforme_dtd' => 'O SPIP considera este documento de acordo com o seu DOCTYPE:',
611
+    'squelette' => 'template',
612
+    'squelette_inclus_ligne' => 'template incluído, linha',
613
+    'squelette_ligne' => 'template, linha',
614
+    'stats_visites_et_popularite' => '@visites@ visitas; popularidade: @popularite@',
615
+    'suivant' => 'seguinte',
616 616
 
617
-	// T
618
-	'taille_go' => '@taille@ GB',
619
-	'taille_go_bi' => '@taille@ GB',
620
-	'taille_ko' => '@taille@ KB',
621
-	'taille_ko_bi' => '@taille@ kB',
622
-	'taille_mo' => '@taille@ MB',
623
-	'taille_mo_bi' => '@taille@ MB',
624
-	'taille_octets' => ' @taille@ bytes',
625
-	'taille_octets_bi' => ' @taille@ bytes',
626
-	'texte_actualite_site_1' => 'Quando você estiver mais familiarizado com a interface, clique em «',
627
-	'texte_actualite_site_2' => 'interface completa',
628
-	'texte_actualite_site_3' => '» para abrir mais possibilidades.',
629
-	'texte_creation_automatique_vignette' => 'A criação automática de ícones de visualização está ativada neste site. Se você transferir por este formulário imagens no(s) formato(s) @gd_formats@, elas serão acompanhadas de um ícone com o tamanho máximo de @taille_preview@ pixels.',
630
-	'texte_documents_associes' => 'Os documentos a seguir estão associados à matéria,
617
+    // T
618
+    'taille_go' => '@taille@ GB',
619
+    'taille_go_bi' => '@taille@ GB',
620
+    'taille_ko' => '@taille@ KB',
621
+    'taille_ko_bi' => '@taille@ kB',
622
+    'taille_mo' => '@taille@ MB',
623
+    'taille_mo_bi' => '@taille@ MB',
624
+    'taille_octets' => ' @taille@ bytes',
625
+    'taille_octets_bi' => ' @taille@ bytes',
626
+    'texte_actualite_site_1' => 'Quando você estiver mais familiarizado com a interface, clique em «',
627
+    'texte_actualite_site_2' => 'interface completa',
628
+    'texte_actualite_site_3' => '» para abrir mais possibilidades.',
629
+    'texte_creation_automatique_vignette' => 'A criação automática de ícones de visualização está ativada neste site. Se você transferir por este formulário imagens no(s) formato(s) @gd_formats@, elas serão acompanhadas de um ícone com o tamanho máximo de @taille_preview@ pixels.',
630
+    'texte_documents_associes' => 'Os documentos a seguir estão associados à matéria,
631 631
 mas eles não foram inseridos diretamente. Dependendo da elaboração dos templates do site público, eles podem aparecer como documentos anexados.',
632
-	'texte_erreur_mise_niveau_base' => 'Erro da base de dados durante a atualização.
632
+    'texte_erreur_mise_niveau_base' => 'Erro da base de dados durante a atualização.
633 633
 A imagem <b>@fichier@</b> não passou (matéria @id_article@).
634 634
 Anote esta referência, tente novamente a atualização e, finalmente, verifique se as imagens aparecem nas matérias.',
635
-	'texte_erreur_visiteur' => 'Você tentou acessar o espaço restrito com um login que não tem a permissão necessária.',
636
-	'texte_inc_auth_1' => 'Você se identificou com o login <b>@auth_login@</b>, mas ele não consta (mais) na base.
635
+    'texte_erreur_visiteur' => 'Você tentou acessar o espaço restrito com um login que não tem a permissão necessária.',
636
+    'texte_inc_auth_1' => 'Você se identificou com o login <b>@auth_login@</b>, mas ele não consta (mais) na base.
637 637
 Tente se',
638
-	'texte_inc_auth_2' => 'reconectar',
639
-	'texte_inc_auth_3' => ', após ter eventualmente saído e reiniciado o seu navegador.',
640
-	'texte_inc_config' => 'As modificações efetuadas nestas páginas influem consideravelmente no funcionamento do seu site. É recomendável não intervir enquanto você não estiver familiarizado com o funcionamento do sistema SPIP.<br /><br /><b>Geralmente, é fortemente aconselhável deixar a carga destas páginas para o webmaster principal do seu site.</b>',
641
-	'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do site, queira por favor,',
642
-	'texte_inc_meta_2' => 'Verificar os direitos de escrita',
643
-	'texte_inc_meta_3' => 'no diretório <code>@repertoire@</code>.',
644
-	'texte_statut_en_cours_redaction' => 'em fase de redação',
645
-	'texte_statut_poubelle' => 'na lixeira',
646
-	'texte_statut_propose_evaluation' => 'proposto para avaliação',
647
-	'texte_statut_publie' => 'publicado online',
648
-	'texte_statut_refuse' => 'recusado',
649
-	'titre_ajouter_mot_cle' => 'INCLUIR UMA PALAVRA-CHAVE:',
650
-	'titre_cadre_raccourcis' => 'ATALHOS:',
651
-	'titre_changer_couleur_interface' => 'Alterar a côr da interface',
652
-	'titre_image_admin_article' => 'Você pode administrar esta matéria',
653
-	'titre_image_administrateur' => 'Administrador',
654
-	'titre_image_aide' => 'Ajuda sobre este elemento',
655
-	'titre_image_auteur_supprime' => 'Autor excluído',
656
-	'titre_image_redacteur' => 'Redator sem acesso',
657
-	'titre_image_redacteur_02' => 'Redator',
658
-	'titre_image_selecteur' => 'Ver a lista',
659
-	'titre_image_visiteur' => 'Visitante',
660
-	'titre_joindre_document' => 'INCLUIR UM DOCUMENTO',
661
-	'titre_mots_cles' => 'PALAVRAS-CHAVE',
662
-	'titre_probleme_technique' => 'Atenção: um problema técnico (servidor SQL) impede o acesso a esta parte do site. Agradecemos sua compreensão.',
663
-	'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA SEÇÃO',
664
-	'titre_signatures_attente' => 'Assinaturas aguardando validação',
665
-	'titre_signatures_confirmees' => 'Assinaturas confirmadas',
666
-	'titre_statistiques' => 'Estatísticas do site',
667
-	'titre_titre_document' => 'Título do documento:',
668
-	'todo' => 'breve',
669
-	'trad_definir_reference' => 'Escolher "@titre@" como referência das traduções',
670
-	'trad_reference' => '(matéria das traduções)',
638
+    'texte_inc_auth_2' => 'reconectar',
639
+    'texte_inc_auth_3' => ', após ter eventualmente saído e reiniciado o seu navegador.',
640
+    'texte_inc_config' => 'As modificações efetuadas nestas páginas influem consideravelmente no funcionamento do seu site. É recomendável não intervir enquanto você não estiver familiarizado com o funcionamento do sistema SPIP.<br /><br /><b>Geralmente, é fortemente aconselhável deixar a carga destas páginas para o webmaster principal do seu site.</b>',
641
+    'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do site, queira por favor,',
642
+    'texte_inc_meta_2' => 'Verificar os direitos de escrita',
643
+    'texte_inc_meta_3' => 'no diretório <code>@repertoire@</code>.',
644
+    'texte_statut_en_cours_redaction' => 'em fase de redação',
645
+    'texte_statut_poubelle' => 'na lixeira',
646
+    'texte_statut_propose_evaluation' => 'proposto para avaliação',
647
+    'texte_statut_publie' => 'publicado online',
648
+    'texte_statut_refuse' => 'recusado',
649
+    'titre_ajouter_mot_cle' => 'INCLUIR UMA PALAVRA-CHAVE:',
650
+    'titre_cadre_raccourcis' => 'ATALHOS:',
651
+    'titre_changer_couleur_interface' => 'Alterar a côr da interface',
652
+    'titre_image_admin_article' => 'Você pode administrar esta matéria',
653
+    'titre_image_administrateur' => 'Administrador',
654
+    'titre_image_aide' => 'Ajuda sobre este elemento',
655
+    'titre_image_auteur_supprime' => 'Autor excluído',
656
+    'titre_image_redacteur' => 'Redator sem acesso',
657
+    'titre_image_redacteur_02' => 'Redator',
658
+    'titre_image_selecteur' => 'Ver a lista',
659
+    'titre_image_visiteur' => 'Visitante',
660
+    'titre_joindre_document' => 'INCLUIR UM DOCUMENTO',
661
+    'titre_mots_cles' => 'PALAVRAS-CHAVE',
662
+    'titre_probleme_technique' => 'Atenção: um problema técnico (servidor SQL) impede o acesso a esta parte do site. Agradecemos sua compreensão.',
663
+    'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA SEÇÃO',
664
+    'titre_signatures_attente' => 'Assinaturas aguardando validação',
665
+    'titre_signatures_confirmees' => 'Assinaturas confirmadas',
666
+    'titre_statistiques' => 'Estatísticas do site',
667
+    'titre_titre_document' => 'Título do documento:',
668
+    'todo' => 'breve',
669
+    'trad_definir_reference' => 'Escolher "@titre@" como referência das traduções',
670
+    'trad_reference' => '(matéria das traduções)',
671 671
 
672
-	// U
673
-	'upload_limit' => 'Este arquivo é grande demais para o servidor; o tamanho máximo autorizado para <i>upload</i> é de @max@.',
672
+    // U
673
+    'upload_limit' => 'Este arquivo é grande demais para o servidor; o tamanho máximo autorizado para <i>upload</i> é de @max@.',
674 674
 
675
-	// Z
676
-	'zbug_balise_b_aval' => ': tag B colocada após BOUCLE',
677
-	'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@',
678
-	'zbug_balise_sans_argument' => 'Falta um arqumento na tag @balise@',
679
-	'zbug_boucle' => 'laço',
680
-	'zbug_boucle_recursive_undef' => 'Laço recursivo não definido: @nom@',
681
-	'zbug_calcul' => 'cálculo',
682
-	'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço',
683
-	'zbug_champ_hors_critere' => 'Campo @champ@ fora do critério @critere@',
684
-	'zbug_champ_hors_motif' => 'Campo @champ@ fora de um contexto @motif@',
685
-	'zbug_code' => 'código',
686
-	'zbug_critere_inconnu' => 'Critério @critere@ desconhecido',
687
-	'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} em uma tabela sem chave primária atômica',
688
-	'zbug_distant_interdit' => 'Externa interdita',
689
-	'zbug_doublon_table_sans_cle_primaire' => 'Duplicação em tabela sem chave primária atômica',
690
-	'zbug_doublon_table_sans_index' => 'Doublons em uma tabela sem index',
691
-	'zbug_erreur_boucle_double' => 'Dupla definição do laço @id@',
692
-	'zbug_erreur_boucle_fermant' => 'Laço @id@ não fechado',
693
-	'zbug_erreur_boucle_syntaxe' => 'Sintaxe do laço @id@ está incorreta',
694
-	'zbug_erreur_compilation' => 'Erro de compilação',
695
-	'zbug_erreur_execution_page' => 'Erro de execução',
696
-	'zbug_erreur_filtre' => 'Filtro @filtre@ não definido',
697
-	'zbug_erreur_filtre_nbarg_min' => 'Filtro @filtre@: falta(m) @nb@ argumento(s)',
698
-	'zbug_erreur_meme_parent' => 'O critério {meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)',
699
-	'zbug_erreur_squelette' => 'Erro(s) no template',
700
-	'zbug_hors_compilation' => 'Fora de Compilação',
701
-	'zbug_info_erreur_squelette' => 'Erro no site',
702
-	'zbug_inversion_ordre_inexistant' => 'Inversão de uma ordem inexistente',
703
-	'zbug_pagination_sans_critere' => 'Tag #PAGINATION sem critério {pagination} ou usada dentro de uma boucle recursiva',
704
-	'zbug_parametres_inclus_incorrects' => 'Parâmetro de inclusão incorreto: @param@',
705
-	'zbug_profile' => 'Tempo de processamento: @time@',
706
-	'zbug_resultat' => 'resultado',
707
-	'zbug_serveur_indefini' => 'Sevidor SQL não definido',
708
-	'zbug_statistiques' => 'Estatísticas das requisições SQL classificadas por duração',
709
-	'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida',
710
-	'zxml_connus_attributs' => 'atributos conhecidos',
711
-	'zxml_de' => 'de',
712
-	'zxml_inconnu_attribut' => 'atributo desconhecido',
713
-	'zxml_inconnu_balise' => 'tag desconhecida',
714
-	'zxml_inconnu_entite' => 'entidade desconhecida',
715
-	'zxml_inconnu_id' => 'ID desconhecida',
716
-	'zxml_mais_de' => 'mas de',
717
-	'zxml_non_conforme' => 'não está de acordo com o motivo',
718
-	'zxml_non_fils' => 'não é filho de',
719
-	'zxml_nonvide_balise' => 'tag não vazia',
720
-	'zxml_obligatoire_attribut' => 'atributo obrigatório mas ausente em',
721
-	'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorreta',
722
-	'zxml_survoler' => 'sobrepor para ver os corretos',
723
-	'zxml_valeur_attribut' => 'valor do atributo',
724
-	'zxml_vide_balise' => 'tag vazia',
725
-	'zxml_vu' => 'previsualização',
675
+    // Z
676
+    'zbug_balise_b_aval' => ': tag B colocada após BOUCLE',
677
+    'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@',
678
+    'zbug_balise_sans_argument' => 'Falta um arqumento na tag @balise@',
679
+    'zbug_boucle' => 'laço',
680
+    'zbug_boucle_recursive_undef' => 'Laço recursivo não definido: @nom@',
681
+    'zbug_calcul' => 'cálculo',
682
+    'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço',
683
+    'zbug_champ_hors_critere' => 'Campo @champ@ fora do critério @critere@',
684
+    'zbug_champ_hors_motif' => 'Campo @champ@ fora de um contexto @motif@',
685
+    'zbug_code' => 'código',
686
+    'zbug_critere_inconnu' => 'Critério @critere@ desconhecido',
687
+    'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} em uma tabela sem chave primária atômica',
688
+    'zbug_distant_interdit' => 'Externa interdita',
689
+    'zbug_doublon_table_sans_cle_primaire' => 'Duplicação em tabela sem chave primária atômica',
690
+    'zbug_doublon_table_sans_index' => 'Doublons em uma tabela sem index',
691
+    'zbug_erreur_boucle_double' => 'Dupla definição do laço @id@',
692
+    'zbug_erreur_boucle_fermant' => 'Laço @id@ não fechado',
693
+    'zbug_erreur_boucle_syntaxe' => 'Sintaxe do laço @id@ está incorreta',
694
+    'zbug_erreur_compilation' => 'Erro de compilação',
695
+    'zbug_erreur_execution_page' => 'Erro de execução',
696
+    'zbug_erreur_filtre' => 'Filtro @filtre@ não definido',
697
+    'zbug_erreur_filtre_nbarg_min' => 'Filtro @filtre@: falta(m) @nb@ argumento(s)',
698
+    'zbug_erreur_meme_parent' => 'O critério {meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)',
699
+    'zbug_erreur_squelette' => 'Erro(s) no template',
700
+    'zbug_hors_compilation' => 'Fora de Compilação',
701
+    'zbug_info_erreur_squelette' => 'Erro no site',
702
+    'zbug_inversion_ordre_inexistant' => 'Inversão de uma ordem inexistente',
703
+    'zbug_pagination_sans_critere' => 'Tag #PAGINATION sem critério {pagination} ou usada dentro de uma boucle recursiva',
704
+    'zbug_parametres_inclus_incorrects' => 'Parâmetro de inclusão incorreto: @param@',
705
+    'zbug_profile' => 'Tempo de processamento: @time@',
706
+    'zbug_resultat' => 'resultado',
707
+    'zbug_serveur_indefini' => 'Sevidor SQL não definido',
708
+    'zbug_statistiques' => 'Estatísticas das requisições SQL classificadas por duração',
709
+    'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida',
710
+    'zxml_connus_attributs' => 'atributos conhecidos',
711
+    'zxml_de' => 'de',
712
+    'zxml_inconnu_attribut' => 'atributo desconhecido',
713
+    'zxml_inconnu_balise' => 'tag desconhecida',
714
+    'zxml_inconnu_entite' => 'entidade desconhecida',
715
+    'zxml_inconnu_id' => 'ID desconhecida',
716
+    'zxml_mais_de' => 'mas de',
717
+    'zxml_non_conforme' => 'não está de acordo com o motivo',
718
+    'zxml_non_fils' => 'não é filho de',
719
+    'zxml_nonvide_balise' => 'tag não vazia',
720
+    'zxml_obligatoire_attribut' => 'atributo obrigatório mas ausente em',
721
+    'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorreta',
722
+    'zxml_survoler' => 'sobrepor para ver os corretos',
723
+    'zxml_valeur_attribut' => 'valor do atributo',
724
+    'zxml_vide_balise' => 'tag vazia',
725
+    'zxml_vu' => 'previsualização',
726 726
 ];
Please login to merge, or discard this patch.
ecrire/lang/ecrire_pt_br.php 1 patch
Indentation   +843 added lines, -843 removed lines patch added patch discarded remove patch
@@ -5,879 +5,879 @@
 block discarded – undo
5 5
 
6 6
 return [
7 7
 
8
-	// A
9
-	'activer_plugin' => 'Ativar o plugin',
10
-	'affichage' => 'Exibição',
11
-	'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.',
12
-	'annuler_recherche' => 'Cancelar a busca',
13
-	'auteur' => 'Autor:',
14
-	'avis_acces_interdit' => 'Acesso negado.',
15
-	'avis_acces_interdit_prive' => 'Você não está autorizado a acessar a página <b>@exec@</b>.',
16
-	'avis_article_modifie' => 'Atenção, @nom_auteur_modif@ editou esta matéria há @date_diff@ minutos',
17
-	'avis_aucun_resultat' => 'Nenhum resultado.',
18
-	'avis_base_inaccessible' => 'Não foi possível conectar com a base de dados @base@.',
19
-	'avis_chemin_invalide_1' => 'O caminho que você escolheu',
20
-	'avis_chemin_invalide_2' => 'não parece válido. Por favor, volte à página anterior e verifique as informações fornecidas.',
21
-	'avis_connexion_echec_1' => 'A conexão com a base de dados falhou.',
22
-	'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
23
-	'avis_connexion_echec_3' => '<b>N.B.</b> Em diversos servidores, você precisa <b>solicitar</b> a ativação do seu acesso à base de dados antes de poder utilizá-la. Se você não consegue se conectar, verifique se você efetuou esse pedido.',
24
-	'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.',
25
-	'avis_connexion_erreur_fichier_cle_manquant_1' => 'A instalação deve ser realizada por um webmaster com um backup das chaves e sua senha.',
26
-	'avis_connexion_erreur_fichier_cle_manquant_2' => 'A instalação deve ser feita por um webmaster com um backup das chaves',
27
-	'avis_connexion_erreur_nom_base' => 'O nome da base só pode conter letras, números e traços',
28
-	'avis_connexion_ldap_echec_1' => 'A conexão ao servidor LDAP falhou.',
29
-	'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
30
-	'avis_connexion_ldap_echec_3' => 'Opcionalmente, não use o suporte LDAP para importar os usuários.',
31
-	'avis_deplacement_rubrique' => 'Atenção! Esta seção contém @contient_breves@ nota@scb@: se você a transferir, por favor, marque este quadrado.',
32
-	'avis_erreur_connexion_mysql' => 'Erro de conexão SQL',
33
-	'avis_erreur_creation_compte' => 'Erro durante a inicialização da conta',
34
-	'avis_espace_interdit' => '<b>Área interdita</b> <div>O SPIP já está instalado.</div>',
35
-	'avis_lecture_noms_bases_1' => 'O programa de instalação não pôde ler os nomes das bases de dados instaladas.',
36
-	'avis_lecture_noms_bases_2' => 'Ou nenhuma base de dados esta disponível, ou a função que permite listar as bases foi desativada por razões de segurança (o que é o caso de diversos provedores de hospedagem).',
37
-	'avis_lecture_noms_bases_3' => 'No segundo caso, é provável que uma base de dados com o nome do seu login possa ser utilizada:',
38
-	'avis_non_acces_page' => 'Você não tem acesso a esta página.',
39
-	'avis_operation_echec' => 'A operação falhou.',
40
-	'avis_operation_impossible' => 'Operação impossível',
41
-	'avis_suppression_base' => 'ATENÇÃO, a supressão dos dados é irreversível',
8
+    // A
9
+    'activer_plugin' => 'Ativar o plugin',
10
+    'affichage' => 'Exibição',
11
+    'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.',
12
+    'annuler_recherche' => 'Cancelar a busca',
13
+    'auteur' => 'Autor:',
14
+    'avis_acces_interdit' => 'Acesso negado.',
15
+    'avis_acces_interdit_prive' => 'Você não está autorizado a acessar a página <b>@exec@</b>.',
16
+    'avis_article_modifie' => 'Atenção, @nom_auteur_modif@ editou esta matéria há @date_diff@ minutos',
17
+    'avis_aucun_resultat' => 'Nenhum resultado.',
18
+    'avis_base_inaccessible' => 'Não foi possível conectar com a base de dados @base@.',
19
+    'avis_chemin_invalide_1' => 'O caminho que você escolheu',
20
+    'avis_chemin_invalide_2' => 'não parece válido. Por favor, volte à página anterior e verifique as informações fornecidas.',
21
+    'avis_connexion_echec_1' => 'A conexão com a base de dados falhou.',
22
+    'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
23
+    'avis_connexion_echec_3' => '<b>N.B.</b> Em diversos servidores, você precisa <b>solicitar</b> a ativação do seu acesso à base de dados antes de poder utilizá-la. Se você não consegue se conectar, verifique se você efetuou esse pedido.',
24
+    'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.',
25
+    'avis_connexion_erreur_fichier_cle_manquant_1' => 'A instalação deve ser realizada por um webmaster com um backup das chaves e sua senha.',
26
+    'avis_connexion_erreur_fichier_cle_manquant_2' => 'A instalação deve ser feita por um webmaster com um backup das chaves',
27
+    'avis_connexion_erreur_nom_base' => 'O nome da base só pode conter letras, números e traços',
28
+    'avis_connexion_ldap_echec_1' => 'A conexão ao servidor LDAP falhou.',
29
+    'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
30
+    'avis_connexion_ldap_echec_3' => 'Opcionalmente, não use o suporte LDAP para importar os usuários.',
31
+    'avis_deplacement_rubrique' => 'Atenção! Esta seção contém @contient_breves@ nota@scb@: se você a transferir, por favor, marque este quadrado.',
32
+    'avis_erreur_connexion_mysql' => 'Erro de conexão SQL',
33
+    'avis_erreur_creation_compte' => 'Erro durante a inicialização da conta',
34
+    'avis_espace_interdit' => '<b>Área interdita</b> <div>O SPIP já está instalado.</div>',
35
+    'avis_lecture_noms_bases_1' => 'O programa de instalação não pôde ler os nomes das bases de dados instaladas.',
36
+    'avis_lecture_noms_bases_2' => 'Ou nenhuma base de dados esta disponível, ou a função que permite listar as bases foi desativada por razões de segurança (o que é o caso de diversos provedores de hospedagem).',
37
+    'avis_lecture_noms_bases_3' => 'No segundo caso, é provável que uma base de dados com o nome do seu login possa ser utilizada:',
38
+    'avis_non_acces_page' => 'Você não tem acesso a esta página.',
39
+    'avis_operation_echec' => 'A operação falhou.',
40
+    'avis_operation_impossible' => 'Operação impossível',
41
+    'avis_suppression_base' => 'ATENÇÃO, a supressão dos dados é irreversível',
42 42
 
43
-	// B
44
-	'bouton_acces_ldap' => 'Incluir o acesso ao LDAP',
45
-	'bouton_ajouter' => 'Incluir',
46
-	'bouton_annuler' => 'Anular',
47
-	'bouton_cache_activer' => 'Reativar o cache',
48
-	'bouton_cache_desactiver' => 'Desativar temporariamente o cache',
49
-	'bouton_demande_publication' => 'Solicitar a publicação desta matéria',
50
-	'bouton_desactive_tout' => 'Desativar tudo',
51
-	'bouton_desinstaller' => 'Desinstalar',
52
-	'bouton_effacer_tout' => 'Apagar TUDO',
53
-	'bouton_envoyer_message' => 'Mensagem definitiva: enviar',
54
-	'bouton_fermer' => 'Fechar',
55
-	'bouton_mettre_a_jour_base' => 'Atualizar a base de dados',
56
-	'bouton_modifier' => 'Alterar',
57
-	'bouton_radio_afficher' => 'Exibir',
58
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Exibir nas listas de redatores conectados',
59
-	'bouton_radio_envoi_annonces_adresse' => 'Enviar os avisos para o endereço:',
60
-	'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista de novidades',
61
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não exibir na lista de redatores',
62
-	'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar os avisos editoriais',
63
-	'bouton_redirection' => 'REDIRECIONAMENTO',
64
-	'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Reiniciar aos valores padrão',
65
-	'bouton_relancer_inscription' => 'Reiniciar o registro',
66
-	'bouton_relancer_inscriptions' => 'Reiniciar os registros',
67
-	'bouton_relancer_installation' => 'Reiniciar a instalação',
68
-	'bouton_reset_password' => 'Criar uma nova senha e enviá-la por e-mail',
69
-	'bouton_suivant' => 'Avançar',
70
-	'bouton_tenter_recuperation' => 'Tentar uma reparação',
71
-	'bouton_test_proxy' => 'Testar o proxy',
72
-	'bouton_vider_cache' => 'Limpar o cache',
43
+    // B
44
+    'bouton_acces_ldap' => 'Incluir o acesso ao LDAP',
45
+    'bouton_ajouter' => 'Incluir',
46
+    'bouton_annuler' => 'Anular',
47
+    'bouton_cache_activer' => 'Reativar o cache',
48
+    'bouton_cache_desactiver' => 'Desativar temporariamente o cache',
49
+    'bouton_demande_publication' => 'Solicitar a publicação desta matéria',
50
+    'bouton_desactive_tout' => 'Desativar tudo',
51
+    'bouton_desinstaller' => 'Desinstalar',
52
+    'bouton_effacer_tout' => 'Apagar TUDO',
53
+    'bouton_envoyer_message' => 'Mensagem definitiva: enviar',
54
+    'bouton_fermer' => 'Fechar',
55
+    'bouton_mettre_a_jour_base' => 'Atualizar a base de dados',
56
+    'bouton_modifier' => 'Alterar',
57
+    'bouton_radio_afficher' => 'Exibir',
58
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Exibir nas listas de redatores conectados',
59
+    'bouton_radio_envoi_annonces_adresse' => 'Enviar os avisos para o endereço:',
60
+    'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista de novidades',
61
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não exibir na lista de redatores',
62
+    'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar os avisos editoriais',
63
+    'bouton_redirection' => 'REDIRECIONAMENTO',
64
+    'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Reiniciar aos valores padrão',
65
+    'bouton_relancer_inscription' => 'Reiniciar o registro',
66
+    'bouton_relancer_inscriptions' => 'Reiniciar os registros',
67
+    'bouton_relancer_installation' => 'Reiniciar a instalação',
68
+    'bouton_reset_password' => 'Criar uma nova senha e enviá-la por e-mail',
69
+    'bouton_suivant' => 'Avançar',
70
+    'bouton_tenter_recuperation' => 'Tentar uma reparação',
71
+    'bouton_test_proxy' => 'Testar o proxy',
72
+    'bouton_vider_cache' => 'Limpar o cache',
73 73
 
74
-	// C
75
-	'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.',
76
-	'calendrier_synchro' => 'Se você usa um programa de agenda compatível com <b>iCal</b>, você pode sincronizá-lo com as informações deste site.',
77
-	'config_activer_champs' => 'Ativar os campos a seguir',
78
-	'config_choix_base_sup' => 'indicar uma base neste servidor',
79
-	'config_erreur_base_sup' => 'O SPIP não tem acesso à lista de bases acessíveis',
80
-	'config_info_base_sup' => 'Se você tiver outras bases de dados para serem consultadas via SPIP, em seu servidor SQL ou em outro, o formulário abaixo permite configurá-las. Se você deixar determinados campos em branco, os dados de conexão da base principal serão utilizados.',
81
-	'config_info_base_sup_disponibles' => 'Bases suplementares já consultáveis:',
82
-	'config_info_enregistree' => 'A nova configuração foi gravada',
83
-	'config_info_logos' => 'Cada elemento do site pode ter um ícone, bem como um ícone de «mouseOver»',
84
-	'config_info_logos_utiliser' => 'Usar os ícones',
85
-	'config_info_logos_utiliser_non' => 'Não usar o ícones',
86
-	'config_info_logos_utiliser_survol' => 'Usar os ícones de mouseOver',
87
-	'config_info_logos_utiliser_survol_non' => 'Não usar os ícones de mouseOver',
88
-	'config_info_redirection' => 'Ao ativar esta opção, você poderá criar matérias virtuais, meras referências a matérias publicadas em outros sites ou fora do SPIP.',
89
-	'config_redirection' => 'Matérias virtuais',
90
-	'config_titre_base_sup' => 'Configuração de uma base suplementar',
91
-	'config_titre_base_sup_choix' => 'Escolha uma base suplementar',
92
-	'connexion_ldap' => 'Conexão:',
93
-	'creer_et_associer_un_auteur' => 'Criar e vincular um autor',
74
+    // C
75
+    'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.',
76
+    'calendrier_synchro' => 'Se você usa um programa de agenda compatível com <b>iCal</b>, você pode sincronizá-lo com as informações deste site.',
77
+    'config_activer_champs' => 'Ativar os campos a seguir',
78
+    'config_choix_base_sup' => 'indicar uma base neste servidor',
79
+    'config_erreur_base_sup' => 'O SPIP não tem acesso à lista de bases acessíveis',
80
+    'config_info_base_sup' => 'Se você tiver outras bases de dados para serem consultadas via SPIP, em seu servidor SQL ou em outro, o formulário abaixo permite configurá-las. Se você deixar determinados campos em branco, os dados de conexão da base principal serão utilizados.',
81
+    'config_info_base_sup_disponibles' => 'Bases suplementares já consultáveis:',
82
+    'config_info_enregistree' => 'A nova configuração foi gravada',
83
+    'config_info_logos' => 'Cada elemento do site pode ter um ícone, bem como um ícone de «mouseOver»',
84
+    'config_info_logos_utiliser' => 'Usar os ícones',
85
+    'config_info_logos_utiliser_non' => 'Não usar o ícones',
86
+    'config_info_logos_utiliser_survol' => 'Usar os ícones de mouseOver',
87
+    'config_info_logos_utiliser_survol_non' => 'Não usar os ícones de mouseOver',
88
+    'config_info_redirection' => 'Ao ativar esta opção, você poderá criar matérias virtuais, meras referências a matérias publicadas em outros sites ou fora do SPIP.',
89
+    'config_redirection' => 'Matérias virtuais',
90
+    'config_titre_base_sup' => 'Configuração de uma base suplementar',
91
+    'config_titre_base_sup_choix' => 'Escolha uma base suplementar',
92
+    'connexion_ldap' => 'Conexão:',
93
+    'creer_et_associer_un_auteur' => 'Criar e vincular um autor',
94 94
 
95
-	// D
96
-	'date_mot_heures' => 'horas',
95
+    // D
96
+    'date_mot_heures' => 'horas',
97 97
 
98
-	// E
99
-	'ecran_connexion_couleur_principale' => 'Cor principal',
100
-	'ecran_connexion_image_fond' => 'Imagem de fundo',
101
-	'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)',
102
-	'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão',
103
-	'ecran_connexion_titre' => 'Tela de conexão',
104
-	'ecran_securite' => ' + tela de segurança @version@',
105
-	'email' => 'e-mail',
106
-	'email_2' => 'e-mail:',
107
-	'en_savoir_plus' => 'Saiba mais',
108
-	'entree_adresse_annuaire' => 'Endereço do catálogo',
109
-	'entree_adresse_email' => 'Seu endereço de e-mail',
110
-	'entree_adresse_email_2' => 'Endereço de e-mail',
111
-	'entree_base_donnee_1' => 'Endereço da base de dados',
112
-	'entree_base_donnee_2' => '(Frequentemente este endereço corresponde ao do seu site, às vezes ele corresponde ao nome «localhost», algumas vezes ele pode ser deixado completamente em branco.)',
113
-	'entree_biographie' => 'Biografia curta em poucas palavras.',
114
-	'entree_chemin_acces' => '<b>Informe</b> o caminho de acesso:',
115
-	'entree_cle_pgp' => 'Sua chave PGP',
116
-	'entree_cle_pgp_2' => 'Chave PGP',
117
-	'entree_contenu_rubrique' => '(Conteúdo da seção em poucas palavras.)',
118
-	'entree_identifiants_connexion' => 'Seus dados de conexão...',
119
-	'entree_identifiants_connexion_2' => 'Dados de conexão',
120
-	'entree_informations_connexion_ldap' => 'Informe neste formulário os dados de conexão ao seu catálogo LDAP.
98
+    // E
99
+    'ecran_connexion_couleur_principale' => 'Cor principal',
100
+    'ecran_connexion_image_fond' => 'Imagem de fundo',
101
+    'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)',
102
+    'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão',
103
+    'ecran_connexion_titre' => 'Tela de conexão',
104
+    'ecran_securite' => ' + tela de segurança @version@',
105
+    'email' => 'e-mail',
106
+    'email_2' => 'e-mail:',
107
+    'en_savoir_plus' => 'Saiba mais',
108
+    'entree_adresse_annuaire' => 'Endereço do catálogo',
109
+    'entree_adresse_email' => 'Seu endereço de e-mail',
110
+    'entree_adresse_email_2' => 'Endereço de e-mail',
111
+    'entree_base_donnee_1' => 'Endereço da base de dados',
112
+    'entree_base_donnee_2' => '(Frequentemente este endereço corresponde ao do seu site, às vezes ele corresponde ao nome «localhost», algumas vezes ele pode ser deixado completamente em branco.)',
113
+    'entree_biographie' => 'Biografia curta em poucas palavras.',
114
+    'entree_chemin_acces' => '<b>Informe</b> o caminho de acesso:',
115
+    'entree_cle_pgp' => 'Sua chave PGP',
116
+    'entree_cle_pgp_2' => 'Chave PGP',
117
+    'entree_contenu_rubrique' => '(Conteúdo da seção em poucas palavras.)',
118
+    'entree_identifiants_connexion' => 'Seus dados de conexão...',
119
+    'entree_identifiants_connexion_2' => 'Dados de conexão',
120
+    'entree_informations_connexion_ldap' => 'Informe neste formulário os dados de conexão ao seu catálogo LDAP.
121 121
 Estas informações deverão ser fornecidas pelo administrador do sistema ou da rede.',
122
-	'entree_infos_perso' => 'Quem é você?',
123
-	'entree_infos_perso_2' => 'Quem é o autor?',
124
-	'entree_interieur_rubrique' => 'No interior da seção:',
125
-	'entree_liens_sites' => '<b>Link hipertexto</b> (referência, site a visitar...)',
126
-	'entree_login' => 'Seu login',
127
-	'entree_login_connexion_1' => 'O login de conexão',
128
-	'entree_login_connexion_2' => '(Frequentemente corresponde ao seu login para acesso por FTP; às vezes pode ser deixado em branco)',
129
-	'entree_mot_passe' => 'Sua senha',
130
-	'entree_mot_passe_1' => 'A senha de conexão',
131
-	'entree_mot_passe_2' => '(Frequentemente corresponde à sua senha para acesso por FTP; às vezes pode ser deixado em branco)',
132
-	'entree_nom_fichier' => 'Por favor, informe o nome do arquivo @texte_compresse@:',
133
-	'entree_nom_pseudo' => 'Seu nome ou apelido',
134
-	'entree_nom_pseudo_1' => '(Seu nome ou apelido)',
135
-	'entree_nom_pseudo_2' => 'Nome ou apelido',
136
-	'entree_nom_site' => 'O nome do seu site',
137
-	'entree_nom_site_2' => 'Nome do site do autor',
138
-	'entree_nouveau_passe' => 'Nova senha',
139
-	'entree_passe_ldap' => 'Senha',
140
-	'entree_port_annuaire' => 'O número da porta do catálogo',
141
-	'entree_signature' => 'Assinatura',
142
-	'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />',
143
-	'entree_url' => 'O endereço (URL) do seu site',
144
-	'entree_url_2' => 'Endereço (URL) do site',
145
-	'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome',
146
-	'erreur_contenu_suspect' => 'Texto escapado',
147
-	'erreur_email_deja_existant' => 'Esse endereço de email já está em uso.',
148
-	'erreur_nom_connect_incorrect' => 'Este nome de servidor não é autorizado',
149
-	'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ faltando no tag @balise@.',
150
-	'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, você pode desativá-lo.',
151
-	'erreur_plugin_fichier_absent' => 'Arquivo ausente',
152
-	'erreur_plugin_fichier_def_absent' => 'Arquivo de definição ausente',
153
-	'erreur_plugin_nom_fonction_interdit' => 'Nome de função não permitido',
154
-	'erreur_plugin_nom_manquant' => 'Nome do plugin ausente',
155
-	'erreur_plugin_prefix_manquant' => 'Área de nomeação do plugin não definida',
156
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; ausente no arquivo de definição',
157
-	'erreur_plugin_version_manquant' => 'Versão do plugin ausente',
158
-	'erreur_type_fichier' => 'Tipo de arquivo incorreto',
122
+    'entree_infos_perso' => 'Quem é você?',
123
+    'entree_infos_perso_2' => 'Quem é o autor?',
124
+    'entree_interieur_rubrique' => 'No interior da seção:',
125
+    'entree_liens_sites' => '<b>Link hipertexto</b> (referência, site a visitar...)',
126
+    'entree_login' => 'Seu login',
127
+    'entree_login_connexion_1' => 'O login de conexão',
128
+    'entree_login_connexion_2' => '(Frequentemente corresponde ao seu login para acesso por FTP; às vezes pode ser deixado em branco)',
129
+    'entree_mot_passe' => 'Sua senha',
130
+    'entree_mot_passe_1' => 'A senha de conexão',
131
+    'entree_mot_passe_2' => '(Frequentemente corresponde à sua senha para acesso por FTP; às vezes pode ser deixado em branco)',
132
+    'entree_nom_fichier' => 'Por favor, informe o nome do arquivo @texte_compresse@:',
133
+    'entree_nom_pseudo' => 'Seu nome ou apelido',
134
+    'entree_nom_pseudo_1' => '(Seu nome ou apelido)',
135
+    'entree_nom_pseudo_2' => 'Nome ou apelido',
136
+    'entree_nom_site' => 'O nome do seu site',
137
+    'entree_nom_site_2' => 'Nome do site do autor',
138
+    'entree_nouveau_passe' => 'Nova senha',
139
+    'entree_passe_ldap' => 'Senha',
140
+    'entree_port_annuaire' => 'O número da porta do catálogo',
141
+    'entree_signature' => 'Assinatura',
142
+    'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />',
143
+    'entree_url' => 'O endereço (URL) do seu site',
144
+    'entree_url_2' => 'Endereço (URL) do site',
145
+    'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome',
146
+    'erreur_contenu_suspect' => 'Texto escapado',
147
+    'erreur_email_deja_existant' => 'Esse endereço de email já está em uso.',
148
+    'erreur_nom_connect_incorrect' => 'Este nome de servidor não é autorizado',
149
+    'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ faltando no tag @balise@.',
150
+    'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, você pode desativá-lo.',
151
+    'erreur_plugin_fichier_absent' => 'Arquivo ausente',
152
+    'erreur_plugin_fichier_def_absent' => 'Arquivo de definição ausente',
153
+    'erreur_plugin_nom_fonction_interdit' => 'Nome de função não permitido',
154
+    'erreur_plugin_nom_manquant' => 'Nome do plugin ausente',
155
+    'erreur_plugin_prefix_manquant' => 'Área de nomeação do plugin não definida',
156
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; ausente no arquivo de definição',
157
+    'erreur_plugin_version_manquant' => 'Versão do plugin ausente',
158
+    'erreur_type_fichier' => 'Tipo de arquivo incorreto',
159 159
 
160
-	// H
161
-	'htaccess_a_simuler' => 'Aviso: a configuração do seu servidor HTTP não leva em conta os arquivos @htaccess@. Para poder garantir um bom nível de segurança, é preciso que você altere esta configuração, ou que as constantes @constantes@ (definíveis no arquivo mes_options.php) tenham como valor os diretórios abaixo de @document_root@.',
162
-	'htaccess_inoperant' => 'htaccess inoperante',
160
+    // H
161
+    'htaccess_a_simuler' => 'Aviso: a configuração do seu servidor HTTP não leva em conta os arquivos @htaccess@. Para poder garantir um bom nível de segurança, é preciso que você altere esta configuração, ou que as constantes @constantes@ (definíveis no arquivo mes_options.php) tenham como valor os diretórios abaixo de @document_root@.',
162
+    'htaccess_inoperant' => 'htaccess inoperante',
163 163
 
164
-	// I
165
-	'ical_info1' => 'Esta página apresenta diversos métodos para se manter a par da atividade deste site.',
166
-	'ical_info2' => 'Para mais informações sobre todas estas técnicas, não deixe de consultar <a href="@spipnet@">a documentação do SPIP</a>.',
167
-	'ical_info_calendrier' => 'Dois calendários estão à sua disposição. O primeiro é um mapa do site anunciando todas as matérias publicadas. O segundo contém os avisos editoriais bem como suas últimas mensagens privadas: ele lhe é reservado graças a uma chave pessoal, que você pode alterar a qualquer momento ao renovar a sua senha.',
168
-	'ical_methode_http' => 'Transferência',
169
-	'ical_methode_webcal' => 'Sincronização (webcal://)',
170
-	'ical_texte_prive' => 'Este calendário, de uso estritamente pessoal, o informa sobre a atividade editorial privada deste site (tarefas e encontros pessoais, matérias e notas propostas...).',
171
-	'ical_texte_public' => 'Este calendário permite-lhe acompanhar a atividade pública deste site (matérias e notas publicadas).',
172
-	'ical_texte_rss' => 'Você pode sindicar as novidades deste site em qualquer leitor de arquivos em formato XML/RSS (Rich Site Summary). É também o formato que permite ao SPIP ler as novidades publicadas em outros sites que utilizem um formato de troca de informações compatível (sites sindicados).',
173
-	'ical_titre_js' => 'Javascript',
174
-	'ical_titre_mailing' => 'Mailing-list',
175
-	'ical_titre_rss' => 'Arquivos de sindicação',
176
-	'icone_accueil' => 'Página Inicial',
177
-	'icone_activer_cookie' => 'Ativar o coockie de correspondência',
178
-	'icone_activite' => 'Atividade',
179
-	'icone_admin_plugin' => 'Gerenciamento dos plugins',
180
-	'icone_administration' => 'Manutenção',
181
-	'icone_afficher_auteurs' => 'Exibir os autores',
182
-	'icone_afficher_visiteurs' => 'Exibir os visitantes',
183
-	'icone_arret_discussion' => 'Não participar mais desta discussão',
184
-	'icone_calendrier' => 'Calendário',
185
-	'icone_configuration' => 'Configuração',
186
-	'icone_creer_auteur' => 'Criar um novo autor e vinculá-lo a esta matéria',
187
-	'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a esta matéria',
188
-	'icone_creer_rubrique_2' => 'Criar uma nova seção',
189
-	'icone_developpement' => 'Desenvolvimento',
190
-	'icone_edition' => 'Edição',
191
-	'icone_ma_langue' => 'Meu idioma',
192
-	'icone_mes_infos' => 'Minhas informações',
193
-	'icone_mes_preferences' => 'Minhas preferências',
194
-	'icone_modifier_article' => 'Editar esta matéria',
195
-	'icone_modifier_rubrique' => 'Editar esta seção',
196
-	'icone_publication' => 'Publicação',
197
-	'icone_relancer_signataire' => 'Reconfirmar o assinante',
198
-	'icone_retour' => 'Voltar',
199
-	'icone_retour_article' => 'Voltar para a matéria',
200
-	'icone_squelette' => 'Templates',
201
-	'icone_suivi_publication' => 'Acompanhamento da publicação',
202
-	'icone_supprimer_cookie' => 'Excluir o cookie de correspondência',
203
-	'icone_supprimer_rubrique' => 'Excluir esta seção',
204
-	'icone_supprimer_signature' => 'Excluir esta assinatura',
205
-	'icone_valider_signature' => 'Validar esta assinatura',
206
-	'image_administrer_rubrique' => 'Você pode administrar esta seção',
207
-	'impossible_modifier_login_auteur' => 'Não foi possível alterar o login.',
208
-	'impossible_modifier_pass_auteur' => 'Não foi possível alterar a senha.',
209
-	'info_1_article' => '1 matéria',
210
-	'info_1_auteur' => '1 autor',
211
-	'info_1_message' => '1 mensagem',
212
-	'info_1_mot_cle' => '1 palavra-chave',
213
-	'info_1_rubrique' => '1 seção',
214
-	'info_1_visiteur' => '1 visitante',
215
-	'info_activer_cookie' => 'Você pode ativar um <b>cookie de correspondência</b>, que lhe permitirá passar facilmente do site público para o site privado.',
216
-	'info_activer_menu_developpement' => 'Exibir o menu Desenvolvimento',
217
-	'info_admin_etre_webmestre' => 'Me conceder direitos de webmaster',
218
-	'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>',
219
-	'info_admin_statuer_webmestre' => 'Dar a este administrador os direitos de webmaster',
220
-	'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>',
221
-	'info_administrateur' => 'Administrador',
222
-	'info_administrateur_1' => 'Administrador',
223
-	'info_administrateur_2' => 'do site (<i>use com cuidado</i>)',
224
-	'info_administrateur_site_01' => 'Se você é administrador do site, por favor,',
225
-	'info_administrateur_site_02' => 'clique neste link',
226
-	'info_administrateurs' => 'Administradores',
227
-	'info_administrer_rubrique' => 'Você pode administrar esta seção',
228
-	'info_adresse' => 'no endereço:',
229
-	'info_adresse_desinscription' => 'Endereço da desinscrição:',
230
-	'info_adresse_inscription' => 'Endereço de inscrição:',
231
-	'info_adresse_url' => 'Endereço (URL) do site público',
232
-	'info_afficher_par_nb' => 'Exibir por',
233
-	'info_aide_en_ligne' => 'Ajuda online SPIP',
234
-	'info_ajout_image' => 'Assim que você incluir imagens e documentos anexados a uma matéria, o SPIP pode criar para você, automaticamente, ícones (miniaturas) das imagens inseridas. Isto permite, por exemplo, criar automaticamente uma galeria ou um portfólio.',
235
-	'info_ajouter_rubrique' => 'Incluir outra seção para administrar:',
236
-	'info_annonce_nouveautes' => 'Aviso das novidades',
237
-	'info_article' => 'matéria',
238
-	'info_article_2' => 'matérias',
239
-	'info_article_a_paraitre' => 'As matérias pós-datadas para exibição',
240
-	'info_articles_02' => 'matérias',
241
-	'info_articles_2' => 'Matérias',
242
-	'info_articles_auteur' => 'As matérias deste autor',
243
-	'info_articles_miens' => 'Minhas matérias',
244
-	'info_articles_tous' => 'Todas as matérias',
245
-	'info_articles_trouves' => 'Matérias encontradas',
246
-	'info_attente_validation' => 'Suas matérias aguardando validação',
247
-	'info_aucun_article' => 'Nenhuma matéria',
248
-	'info_aucun_auteur' => 'Nenhum autor',
249
-	'info_aucun_message' => 'Nenhuma mensagem',
250
-	'info_aucun_rubrique' => 'Nenhuma seção',
251
-	'info_aujourdhui' => 'Hoje:',
252
-	'info_auteur_gere_rubriques' => 'Este autor gerencia as seções a seguir:',
253
-	'info_auteur_gere_toutes_rubriques' => 'Este autor gerencia <b>todas as seções</b>',
254
-	'info_auteur_gere_toutes_rubriques_2' => 'Eu gerencio <b>todas as seções</b>',
255
-	'info_auteurs' => 'Os autores',
256
-	'info_auteurs_par_tri' => 'Autores@partri@',
257
-	'info_auteurs_trouves' => 'Autores encontrados',
258
-	'info_authentification_externe' => 'Autenticação externa',
259
-	'info_avertissement' => 'Aviso',
260
-	'info_barre_outils' => 'com sua barra de ferramentas?',
261
-	'info_base_installee' => 'A estrutura da sua base de dados foi instalada.',
262
-	'info_bio' => 'Biografia',
263
-	'info_cache_desactive' => 'O cache está temporariamente desativado.',
264
-	'info_chapeau' => 'Introdução',
265
-	'info_chapeau_2' => 'Introdução:',
266
-	'info_chemin_acces_1' => 'Opções: <b>Caminho de acesso no diretório</b>',
267
-	'info_chemin_acces_2' => 'A partir daqui, você deverá configurar o caminho de acesso às informações do diretório. Esta informação é indispensávelpara ler os perfis dos usuários no diretório.',
268
-	'info_chemin_acces_annuaire' => 'Opções: <b>Caminho de acesso no diretório</b>',
269
-	'info_choix_base' => 'Terceiro passo:',
270
-	'info_classement_1' => '<sup><u>o</u></sup> em @liste@',
271
-	'info_classement_2' => '<sup><u>a</u></sup> em @liste@',
272
-	'info_code_acces' => 'Não se esqueça dos seus dados de conexão!',
273
-	'info_config_suivi' => 'Se este endereço corresponde a uma mailing-list, você pode informar abaixo o endereço onde os participantes do site podem se inscrever. Este endereço pode ser um URL (por exemplo a página de inscrição na lista pela Web), ou um endereço de e-mail dotado de um assunto específico (par exemple: <tt>@adresse_suivi@?subject=subscribe</tt>):',
274
-	'info_config_suivi_explication' => 'Voce pode assinar a  mailing-list deste site. Você irá receber por e-mail, os avisos de matérias e notas propostos para publicação.',
275
-	'info_confirmer_passe' => 'Confirmar a nova senha:',
276
-	'info_conflit_edition_avis_non_sauvegarde' => 'Atenção os campos a seguir foram alterados por terceiros. As suas modificações nestes campos não foram, por isso, gravadas.',
277
-	'info_conflit_edition_differences' => 'Diferenças:',
278
-	'info_conflit_edition_version_enregistree' => 'A versão gravada:',
279
-	'info_conflit_edition_votre_version' => 'A sua versão:',
280
-	'info_connexion_base' => 'Teste de conexão com a base',
281
-	'info_connexion_base_donnee' => 'Conexão à sua base de dados',
282
-	'info_connexion_ldap_ok' => '<b>A conexão LDAP foi efetuada.</b><p>Você pode passar para o próximo passo.</p>',
283
-	'info_connexion_mysql' => 'Sua conexão SQL',
284
-	'info_connexion_ok' => 'A conexão foi obtida.',
285
-	'info_contact' => 'Contato',
286
-	'info_contenu_articles' => 'Conteúdo das matérias',
287
-	'info_contributions' => 'Contribuições',
288
-	'info_creation_paragraphe' => 'Para criar parágrafos, basta deixar linhas em branco.',
289
-	'info_creation_rubrique' => 'Antes de poder escrever matérias, você deve criar, pelo menos, uma seção.<br />',
290
-	'info_creation_tables' => 'Criação das tabelas da base',
291
-	'info_creer_base' => '<b>Criar</b> uma nova base de dados:',
292
-	'info_dans_rubrique' => 'Na seção:',
293
-	'info_date_publication_anterieure' => 'Data de redação anterior:',
294
-	'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SITE:',
295
-	'info_derniere_etape' => 'Terminou!',
296
-	'info_descriptif' => 'Descrição:',
297
-	'info_desinstaller_plugin' => 'exclui os dados e desativa o plugin',
298
-	'info_discussion_cours' => 'Discussões em andamento',
299
-	'info_ecrire_article' => 'Antes de poder escrever matérias, você precisa criar pelo menos uma seção.',
300
-	'info_email_envoi' => 'Endereço de e-mail de envio (opcional)',
301
-	'info_email_envoi_txt' => 'Informe aqui o endereço a ser utilizado para enviar os e-mails (por padrão, o endereço de destino será usado como endereço de envio):',
302
-	'info_email_webmestre' => 'Endereço de e-mail do webmaster',
303
-	'info_envoi_email_automatique' => 'Envio automático de e-mails',
304
-	'info_envoyer_maintenant' => 'Enviar agora',
305
-	'info_etape_suivante' => 'Avançar para a próxima etapa',
306
-	'info_etape_suivante_1' => 'Você pode passar para a próxima etapa.',
307
-	'info_etape_suivante_2' => 'Você pode passar para a próxima etapa.',
308
-	'info_exceptions_proxy' => 'Exceções para o proxy',
309
-	'info_exportation_base' => 'exportação da base para @archive@',
310
-	'info_facilite_suivi_activite' => 'Para facilitar o acompanhamento da atividade editorial do site, o SPIP pode avisar por e-mail, por exemplo para uma mailing-list de redatores, os avisos dos pedidos de publicação e das validações das matérias. Informe um ou mais endereços, separados por vírgula.',
311
-	'info_fichiers_authent' => 'Arquivos de autenticação «.htpasswd»',
312
-	'info_forums_abo_invites' => 'O seu site comporta fóruns por assinatura; os visitantes são convidados a se registrar no site público.',
313
-	'info_gauche_admin_tech' => '<b>Esta página é acessível apenas aos responsáveis pelo site.</b><p>Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao website.</p>',
314
-	'info_gauche_admin_vider' => '<b>Esta página é acessível apenas aos responsáveis pelo site.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao website.</p>',
315
-	'info_gauche_auteurs' => 'Aqui, você encontra todos os autores do site.
164
+    // I
165
+    'ical_info1' => 'Esta página apresenta diversos métodos para se manter a par da atividade deste site.',
166
+    'ical_info2' => 'Para mais informações sobre todas estas técnicas, não deixe de consultar <a href="@spipnet@">a documentação do SPIP</a>.',
167
+    'ical_info_calendrier' => 'Dois calendários estão à sua disposição. O primeiro é um mapa do site anunciando todas as matérias publicadas. O segundo contém os avisos editoriais bem como suas últimas mensagens privadas: ele lhe é reservado graças a uma chave pessoal, que você pode alterar a qualquer momento ao renovar a sua senha.',
168
+    'ical_methode_http' => 'Transferência',
169
+    'ical_methode_webcal' => 'Sincronização (webcal://)',
170
+    'ical_texte_prive' => 'Este calendário, de uso estritamente pessoal, o informa sobre a atividade editorial privada deste site (tarefas e encontros pessoais, matérias e notas propostas...).',
171
+    'ical_texte_public' => 'Este calendário permite-lhe acompanhar a atividade pública deste site (matérias e notas publicadas).',
172
+    'ical_texte_rss' => 'Você pode sindicar as novidades deste site em qualquer leitor de arquivos em formato XML/RSS (Rich Site Summary). É também o formato que permite ao SPIP ler as novidades publicadas em outros sites que utilizem um formato de troca de informações compatível (sites sindicados).',
173
+    'ical_titre_js' => 'Javascript',
174
+    'ical_titre_mailing' => 'Mailing-list',
175
+    'ical_titre_rss' => 'Arquivos de sindicação',
176
+    'icone_accueil' => 'Página Inicial',
177
+    'icone_activer_cookie' => 'Ativar o coockie de correspondência',
178
+    'icone_activite' => 'Atividade',
179
+    'icone_admin_plugin' => 'Gerenciamento dos plugins',
180
+    'icone_administration' => 'Manutenção',
181
+    'icone_afficher_auteurs' => 'Exibir os autores',
182
+    'icone_afficher_visiteurs' => 'Exibir os visitantes',
183
+    'icone_arret_discussion' => 'Não participar mais desta discussão',
184
+    'icone_calendrier' => 'Calendário',
185
+    'icone_configuration' => 'Configuração',
186
+    'icone_creer_auteur' => 'Criar um novo autor e vinculá-lo a esta matéria',
187
+    'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a esta matéria',
188
+    'icone_creer_rubrique_2' => 'Criar uma nova seção',
189
+    'icone_developpement' => 'Desenvolvimento',
190
+    'icone_edition' => 'Edição',
191
+    'icone_ma_langue' => 'Meu idioma',
192
+    'icone_mes_infos' => 'Minhas informações',
193
+    'icone_mes_preferences' => 'Minhas preferências',
194
+    'icone_modifier_article' => 'Editar esta matéria',
195
+    'icone_modifier_rubrique' => 'Editar esta seção',
196
+    'icone_publication' => 'Publicação',
197
+    'icone_relancer_signataire' => 'Reconfirmar o assinante',
198
+    'icone_retour' => 'Voltar',
199
+    'icone_retour_article' => 'Voltar para a matéria',
200
+    'icone_squelette' => 'Templates',
201
+    'icone_suivi_publication' => 'Acompanhamento da publicação',
202
+    'icone_supprimer_cookie' => 'Excluir o cookie de correspondência',
203
+    'icone_supprimer_rubrique' => 'Excluir esta seção',
204
+    'icone_supprimer_signature' => 'Excluir esta assinatura',
205
+    'icone_valider_signature' => 'Validar esta assinatura',
206
+    'image_administrer_rubrique' => 'Você pode administrar esta seção',
207
+    'impossible_modifier_login_auteur' => 'Não foi possível alterar o login.',
208
+    'impossible_modifier_pass_auteur' => 'Não foi possível alterar a senha.',
209
+    'info_1_article' => '1 matéria',
210
+    'info_1_auteur' => '1 autor',
211
+    'info_1_message' => '1 mensagem',
212
+    'info_1_mot_cle' => '1 palavra-chave',
213
+    'info_1_rubrique' => '1 seção',
214
+    'info_1_visiteur' => '1 visitante',
215
+    'info_activer_cookie' => 'Você pode ativar um <b>cookie de correspondência</b>, que lhe permitirá passar facilmente do site público para o site privado.',
216
+    'info_activer_menu_developpement' => 'Exibir o menu Desenvolvimento',
217
+    'info_admin_etre_webmestre' => 'Me conceder direitos de webmaster',
218
+    'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>',
219
+    'info_admin_statuer_webmestre' => 'Dar a este administrador os direitos de webmaster',
220
+    'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>',
221
+    'info_administrateur' => 'Administrador',
222
+    'info_administrateur_1' => 'Administrador',
223
+    'info_administrateur_2' => 'do site (<i>use com cuidado</i>)',
224
+    'info_administrateur_site_01' => 'Se você é administrador do site, por favor,',
225
+    'info_administrateur_site_02' => 'clique neste link',
226
+    'info_administrateurs' => 'Administradores',
227
+    'info_administrer_rubrique' => 'Você pode administrar esta seção',
228
+    'info_adresse' => 'no endereço:',
229
+    'info_adresse_desinscription' => 'Endereço da desinscrição:',
230
+    'info_adresse_inscription' => 'Endereço de inscrição:',
231
+    'info_adresse_url' => 'Endereço (URL) do site público',
232
+    'info_afficher_par_nb' => 'Exibir por',
233
+    'info_aide_en_ligne' => 'Ajuda online SPIP',
234
+    'info_ajout_image' => 'Assim que você incluir imagens e documentos anexados a uma matéria, o SPIP pode criar para você, automaticamente, ícones (miniaturas) das imagens inseridas. Isto permite, por exemplo, criar automaticamente uma galeria ou um portfólio.',
235
+    'info_ajouter_rubrique' => 'Incluir outra seção para administrar:',
236
+    'info_annonce_nouveautes' => 'Aviso das novidades',
237
+    'info_article' => 'matéria',
238
+    'info_article_2' => 'matérias',
239
+    'info_article_a_paraitre' => 'As matérias pós-datadas para exibição',
240
+    'info_articles_02' => 'matérias',
241
+    'info_articles_2' => 'Matérias',
242
+    'info_articles_auteur' => 'As matérias deste autor',
243
+    'info_articles_miens' => 'Minhas matérias',
244
+    'info_articles_tous' => 'Todas as matérias',
245
+    'info_articles_trouves' => 'Matérias encontradas',
246
+    'info_attente_validation' => 'Suas matérias aguardando validação',
247
+    'info_aucun_article' => 'Nenhuma matéria',
248
+    'info_aucun_auteur' => 'Nenhum autor',
249
+    'info_aucun_message' => 'Nenhuma mensagem',
250
+    'info_aucun_rubrique' => 'Nenhuma seção',
251
+    'info_aujourdhui' => 'Hoje:',
252
+    'info_auteur_gere_rubriques' => 'Este autor gerencia as seções a seguir:',
253
+    'info_auteur_gere_toutes_rubriques' => 'Este autor gerencia <b>todas as seções</b>',
254
+    'info_auteur_gere_toutes_rubriques_2' => 'Eu gerencio <b>todas as seções</b>',
255
+    'info_auteurs' => 'Os autores',
256
+    'info_auteurs_par_tri' => 'Autores@partri@',
257
+    'info_auteurs_trouves' => 'Autores encontrados',
258
+    'info_authentification_externe' => 'Autenticação externa',
259
+    'info_avertissement' => 'Aviso',
260
+    'info_barre_outils' => 'com sua barra de ferramentas?',
261
+    'info_base_installee' => 'A estrutura da sua base de dados foi instalada.',
262
+    'info_bio' => 'Biografia',
263
+    'info_cache_desactive' => 'O cache está temporariamente desativado.',
264
+    'info_chapeau' => 'Introdução',
265
+    'info_chapeau_2' => 'Introdução:',
266
+    'info_chemin_acces_1' => 'Opções: <b>Caminho de acesso no diretório</b>',
267
+    'info_chemin_acces_2' => 'A partir daqui, você deverá configurar o caminho de acesso às informações do diretório. Esta informação é indispensávelpara ler os perfis dos usuários no diretório.',
268
+    'info_chemin_acces_annuaire' => 'Opções: <b>Caminho de acesso no diretório</b>',
269
+    'info_choix_base' => 'Terceiro passo:',
270
+    'info_classement_1' => '<sup><u>o</u></sup> em @liste@',
271
+    'info_classement_2' => '<sup><u>a</u></sup> em @liste@',
272
+    'info_code_acces' => 'Não se esqueça dos seus dados de conexão!',
273
+    'info_config_suivi' => 'Se este endereço corresponde a uma mailing-list, você pode informar abaixo o endereço onde os participantes do site podem se inscrever. Este endereço pode ser um URL (por exemplo a página de inscrição na lista pela Web), ou um endereço de e-mail dotado de um assunto específico (par exemple: <tt>@adresse_suivi@?subject=subscribe</tt>):',
274
+    'info_config_suivi_explication' => 'Voce pode assinar a  mailing-list deste site. Você irá receber por e-mail, os avisos de matérias e notas propostos para publicação.',
275
+    'info_confirmer_passe' => 'Confirmar a nova senha:',
276
+    'info_conflit_edition_avis_non_sauvegarde' => 'Atenção os campos a seguir foram alterados por terceiros. As suas modificações nestes campos não foram, por isso, gravadas.',
277
+    'info_conflit_edition_differences' => 'Diferenças:',
278
+    'info_conflit_edition_version_enregistree' => 'A versão gravada:',
279
+    'info_conflit_edition_votre_version' => 'A sua versão:',
280
+    'info_connexion_base' => 'Teste de conexão com a base',
281
+    'info_connexion_base_donnee' => 'Conexão à sua base de dados',
282
+    'info_connexion_ldap_ok' => '<b>A conexão LDAP foi efetuada.</b><p>Você pode passar para o próximo passo.</p>',
283
+    'info_connexion_mysql' => 'Sua conexão SQL',
284
+    'info_connexion_ok' => 'A conexão foi obtida.',
285
+    'info_contact' => 'Contato',
286
+    'info_contenu_articles' => 'Conteúdo das matérias',
287
+    'info_contributions' => 'Contribuições',
288
+    'info_creation_paragraphe' => 'Para criar parágrafos, basta deixar linhas em branco.',
289
+    'info_creation_rubrique' => 'Antes de poder escrever matérias, você deve criar, pelo menos, uma seção.<br />',
290
+    'info_creation_tables' => 'Criação das tabelas da base',
291
+    'info_creer_base' => '<b>Criar</b> uma nova base de dados:',
292
+    'info_dans_rubrique' => 'Na seção:',
293
+    'info_date_publication_anterieure' => 'Data de redação anterior:',
294
+    'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SITE:',
295
+    'info_derniere_etape' => 'Terminou!',
296
+    'info_descriptif' => 'Descrição:',
297
+    'info_desinstaller_plugin' => 'exclui os dados e desativa o plugin',
298
+    'info_discussion_cours' => 'Discussões em andamento',
299
+    'info_ecrire_article' => 'Antes de poder escrever matérias, você precisa criar pelo menos uma seção.',
300
+    'info_email_envoi' => 'Endereço de e-mail de envio (opcional)',
301
+    'info_email_envoi_txt' => 'Informe aqui o endereço a ser utilizado para enviar os e-mails (por padrão, o endereço de destino será usado como endereço de envio):',
302
+    'info_email_webmestre' => 'Endereço de e-mail do webmaster',
303
+    'info_envoi_email_automatique' => 'Envio automático de e-mails',
304
+    'info_envoyer_maintenant' => 'Enviar agora',
305
+    'info_etape_suivante' => 'Avançar para a próxima etapa',
306
+    'info_etape_suivante_1' => 'Você pode passar para a próxima etapa.',
307
+    'info_etape_suivante_2' => 'Você pode passar para a próxima etapa.',
308
+    'info_exceptions_proxy' => 'Exceções para o proxy',
309
+    'info_exportation_base' => 'exportação da base para @archive@',
310
+    'info_facilite_suivi_activite' => 'Para facilitar o acompanhamento da atividade editorial do site, o SPIP pode avisar por e-mail, por exemplo para uma mailing-list de redatores, os avisos dos pedidos de publicação e das validações das matérias. Informe um ou mais endereços, separados por vírgula.',
311
+    'info_fichiers_authent' => 'Arquivos de autenticação «.htpasswd»',
312
+    'info_forums_abo_invites' => 'O seu site comporta fóruns por assinatura; os visitantes são convidados a se registrar no site público.',
313
+    'info_gauche_admin_tech' => '<b>Esta página é acessível apenas aos responsáveis pelo site.</b><p>Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao website.</p>',
314
+    'info_gauche_admin_vider' => '<b>Esta página é acessível apenas aos responsáveis pelo site.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao website.</p>',
315
+    'info_gauche_auteurs' => 'Aqui, você encontra todos os autores do site.
316 316
 Os status dos autores é indicado pela côr dos ícones (administrador = verde; redator = amarelo).',
317
-	'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao site, são indicados por um ícone azul;
317
+    'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao site, são indicados por um ícone azul;
318 318
 os autores excluídos por um ícone cinza.',
319
-	'info_gauche_messagerie' => 'O sistema interno de mensagens permite a troca de mensagens entre redatores, a criação de lembretes (para seu uso pessoal) ou exibir anúncios na página de entrada da área privada (se você for administrador).',
320
-	'info_gauche_statistiques_referers' => 'Esta página apresenta a lista dos  <i>referers</i>, ou seja, dos sites que contêm links para o seu site, unicamente para ontem e hoje; esta lista é zerada a cada 24 horas.',
321
-	'info_gauche_visiteurs_enregistres' => 'Você encontrará aqui os visitantes registrados na área pública do site (fóruns por assinatura).',
322
-	'info_generation_miniatures_images' => 'Geração de miniaturas das imagens',
323
-	'info_gerer_trad_objets' => '@objets@ : gerenciar os links de tradução',
324
-	'info_hebergeur_desactiver_envoi_email' => 'Alguns serviços de hospedagem desativam o envio automático de e-mails a partir dos seus servidores. Neste caso, as funcionalidades a seguir não funcionarão.',
325
-	'info_hier' => 'ontem:',
326
-	'info_identification_publique' => 'Sua identificação pública...',
327
-	'info_image_process' => 'Por favor, selecione o melhor método de criação dos ícones, clicando na imagem correspondente.',
328
-	'info_images_auto' => 'Imagens calculadas automaticamente',
329
-	'info_informations_personnelles' => 'Informações pessoais',
330
-	'info_inscription' => 'Inscrição online',
331
-	'info_inscription_automatique' => 'Inscrição automática de novos redatores',
332
-	'info_jeu_caractere' => 'Conjunto de caracteres do site',
333
-	'info_jours' => 'dias',
334
-	'info_laisser_champs_vides' => 'deixar estes campos vazios)',
335
-	'info_langues' => 'Idiomas do site',
336
-	'info_ldap_ok' => 'A autenticação LDAP está instalada.',
337
-	'info_lien_hypertexte' => 'Link hipertexto:',
338
-	'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada',
339
-	'info_liste_redacteurs_connectes' => 'Lista de redatores conectados',
340
-	'info_login_existant' => 'Este login já está cadastrado.',
341
-	'info_login_trop_court' => 'Login muito curto.',
342
-	'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.',
343
-	'info_logos' => 'Os ícones',
344
-	'info_maximum' => 'máximo:',
345
-	'info_meme_rubrique' => 'Na mesma seção',
346
-	'info_message_en_redaction' => 'Suas mensagens em fase de redação',
347
-	'info_message_technique' => 'Mensagem técnica:',
348
-	'info_messagerie_interne' => 'Mensageria interna',
349
-	'info_mise_a_niveau_base' => 'atualização da sua base SQL',
350
-	'info_mise_a_niveau_base_2' => '{{Atenção!}} Você instalou uma versão de arquivos SPIP {anterior} à que estava instalada no site: a sua base de dados corre o risco de se corromper e o seu site não funcionar mais.<br />{{Reinstale os arquivos SPIP.}}',
351
-	'info_modification_enregistree' => 'Sua alteração foi gravada',
352
-	'info_modifier_auteur' => 'Editar o autor:',
353
-	'info_modifier_rubrique' => 'Editar a seção:',
354
-	'info_modifier_titre' => 'Editar: @titre@',
355
-	'info_mon_site_spip' => 'Meu site SPIP',
356
-	'info_moyenne' => 'média:',
357
-	'info_multi_cet_article' => 'Idioma desta matéria:',
358
-	'info_multi_langues_choisies' => 'Por favor, selecione a seguir os idiomas à disposição dos redatores do seu site.
319
+    'info_gauche_messagerie' => 'O sistema interno de mensagens permite a troca de mensagens entre redatores, a criação de lembretes (para seu uso pessoal) ou exibir anúncios na página de entrada da área privada (se você for administrador).',
320
+    'info_gauche_statistiques_referers' => 'Esta página apresenta a lista dos  <i>referers</i>, ou seja, dos sites que contêm links para o seu site, unicamente para ontem e hoje; esta lista é zerada a cada 24 horas.',
321
+    'info_gauche_visiteurs_enregistres' => 'Você encontrará aqui os visitantes registrados na área pública do site (fóruns por assinatura).',
322
+    'info_generation_miniatures_images' => 'Geração de miniaturas das imagens',
323
+    'info_gerer_trad_objets' => '@objets@ : gerenciar os links de tradução',
324
+    'info_hebergeur_desactiver_envoi_email' => 'Alguns serviços de hospedagem desativam o envio automático de e-mails a partir dos seus servidores. Neste caso, as funcionalidades a seguir não funcionarão.',
325
+    'info_hier' => 'ontem:',
326
+    'info_identification_publique' => 'Sua identificação pública...',
327
+    'info_image_process' => 'Por favor, selecione o melhor método de criação dos ícones, clicando na imagem correspondente.',
328
+    'info_images_auto' => 'Imagens calculadas automaticamente',
329
+    'info_informations_personnelles' => 'Informações pessoais',
330
+    'info_inscription' => 'Inscrição online',
331
+    'info_inscription_automatique' => 'Inscrição automática de novos redatores',
332
+    'info_jeu_caractere' => 'Conjunto de caracteres do site',
333
+    'info_jours' => 'dias',
334
+    'info_laisser_champs_vides' => 'deixar estes campos vazios)',
335
+    'info_langues' => 'Idiomas do site',
336
+    'info_ldap_ok' => 'A autenticação LDAP está instalada.',
337
+    'info_lien_hypertexte' => 'Link hipertexto:',
338
+    'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada',
339
+    'info_liste_redacteurs_connectes' => 'Lista de redatores conectados',
340
+    'info_login_existant' => 'Este login já está cadastrado.',
341
+    'info_login_trop_court' => 'Login muito curto.',
342
+    'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.',
343
+    'info_logos' => 'Os ícones',
344
+    'info_maximum' => 'máximo:',
345
+    'info_meme_rubrique' => 'Na mesma seção',
346
+    'info_message_en_redaction' => 'Suas mensagens em fase de redação',
347
+    'info_message_technique' => 'Mensagem técnica:',
348
+    'info_messagerie_interne' => 'Mensageria interna',
349
+    'info_mise_a_niveau_base' => 'atualização da sua base SQL',
350
+    'info_mise_a_niveau_base_2' => '{{Atenção!}} Você instalou uma versão de arquivos SPIP {anterior} à que estava instalada no site: a sua base de dados corre o risco de se corromper e o seu site não funcionar mais.<br />{{Reinstale os arquivos SPIP.}}',
351
+    'info_modification_enregistree' => 'Sua alteração foi gravada',
352
+    'info_modifier_auteur' => 'Editar o autor:',
353
+    'info_modifier_rubrique' => 'Editar a seção:',
354
+    'info_modifier_titre' => 'Editar: @titre@',
355
+    'info_mon_site_spip' => 'Meu site SPIP',
356
+    'info_moyenne' => 'média:',
357
+    'info_multi_cet_article' => 'Idioma desta matéria:',
358
+    'info_multi_langues_choisies' => 'Por favor, selecione a seguir os idiomas à disposição dos redatores do seu site.
359 359
 Os idiomas já utilizados no site (no topo da lista) não podem ser desativados.',
360
-	'info_multi_objets' => '@objets@ : ativar o menu de idioma',
361
-	'info_multi_secteurs' => '... apenas para as seções situadas na raiz?',
362
-	'info_nb_articles' => '@nb@ matérias',
363
-	'info_nb_auteurs' => '@nb@ autores',
364
-	'info_nb_messages' => '@nb@ mensagens',
365
-	'info_nb_mots_cles' => '@nb@ palavras-chave',
366
-	'info_nb_rubriques' => '@nb@ seções',
367
-	'info_nb_visiteurs' => '@nb@ visitantes',
368
-	'info_nom' => 'Nome',
369
-	'info_nom_destinataire' => 'Nome do destinatário',
370
-	'info_nom_pas_conforme' => 'tags HTML não são permitidas',
371
-	'info_nom_site' => 'Nome do seu site',
372
-	'info_nombre_articles' => '@nb_articles@ matérias,',
373
-	'info_nombre_rubriques' => '@nb_rubriques@ seções,',
374
-	'info_nombre_sites' => '@nb_sites@ sites,',
375
-	'info_non_deplacer' => 'Não mover...',
376
-	'info_non_envoi_annonce_dernieres_nouveautes' => 'O SPIP pode enviar regularmente o anúncio das últimas novidades do site (matérias e notas publicadas recentemente).',
377
-	'info_non_envoi_liste_nouveautes' => 'Não enviar a lista de novidades',
378
-	'info_non_modifiable' => 'não pode ser modificado',
379
-	'info_non_suppression_mot_cle' => 'Eu não quero excluir esta palavra-chave.',
380
-	'info_notes' => 'Observações',
381
-	'info_nouvel_article' => 'Nova matéria',
382
-	'info_nouvelle_traduction' => 'Nova tradução:',
383
-	'info_numero_article' => 'MATÉRIA NÚMERO:',
384
-	'info_obligatoire_02' => '(obrigatório)',
385
-	'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do site público',
386
-	'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição dos visitantes',
387
-	'info_options_avancees' => 'OPÇÕES AVANÇADAS',
388
-	'info_ou' => 'ou...',
389
-	'info_page_interdite' => 'Página não autorizada',
390
-	'info_par_nom' => 'por nome',
391
-	'info_par_nombre_article' => 'por número de matérias',
392
-	'info_par_statut' => 'por status',
393
-	'info_par_tri' => '’(por @tri@)’',
394
-	'info_passe_trop_court' => 'Senha muito curta.',
395
-	'info_passe_trop_court_car_pluriel' => 'A senha deve conter pelo menos @nb@ caracteres.',
396
-	'info_passes_identiques' => 'As duas senhas não são idênticas.',
397
-	'info_plus_cinq_car' => 'mais de 5 caracteres',
398
-	'info_plus_cinq_car_2' => '(Mais de 5 caracteres)',
399
-	'info_plus_trois_car' => '(Mais de 3 caracteres)',
400
-	'info_popularite' => 'popularidade: @popularite@; visitas: @visites@',
401
-	'info_post_scriptum' => 'Rodapé',
402
-	'info_post_scriptum_2' => 'Rodapé:',
403
-	'info_pour' => 'para',
404
-	'info_preview_texte' => 'É possível visualizar os diferentes elementos editoriais do site que tenham  pelo menos o status de «proposto», bem como os elementos em fase de redação de que se é autor. Esta funcionalidade deve estar disponível para os administradores, para os redatores, ou para ninguém?',
405
-	'info_procedez_par_etape' => 'proceder passo-a-passo',
406
-	'info_procedure_maj_version' => 'o procedimento de atualização deve ser rodado para adaptar a base de dados à nova versão do SPIP.',
407
-	'info_proxy_ok' => 'Teste do proxy bem sucedido',
408
-	'info_ps' => 'P.S.',
409
-	'info_publier' => 'publicar',
410
-	'info_publies' => 'Suas matérias publicadas online',
411
-	'info_question_accepter_visiteurs' => 'Se os templates do seu site prevêem o cadastramento de visitantes sem acesso à área privada, por favor, ative a opção abaixo:',
412
-	'info_question_inscription_nouveaux_redacteurs' => 'Você quer aceitar inscrições de novos redatores a partir do site público? Se você aceitar, os visitantes poderão se cadastrar através de um formulário automatizado, tendo acesso à área privada para propôr as suas próprias matérias. <div class="notice">Durante a fase de inscrição, os usuários recebem um e-mail automático, fornecendo-lhes os seus códigos de acesso à área privada. Alguns serviços de hospedagem desativam o envio de e-mails a partir dos seus servidores: nesse caso, a inscrição automática é impossível.</div>',
413
-	'info_qui_edite' => '@nom_auteur_modif@ trabalhou neste conteúdo há @date_diff@ minutos',
414
-	'info_racine_site' => 'Raiz do site',
415
-	'info_recharger_page' => 'Por favor, atualize esta página em alguns instantes.',
416
-	'info_recherche_auteur_zero' => 'Nenhum resultado para «@cherche_auteur@».',
417
-	'info_recommencer' => 'Por favor, recomece.',
418
-	'info_redacteur_1' => 'Redator',
419
-	'info_redacteur_2' => 'com acesso à área privada (<i>recomendado</i>)',
420
-	'info_redacteurs' => 'Redatores',
421
-	'info_redaction_en_cours' => 'EM FASE DE REDAÇÃO',
422
-	'info_redirection' => 'Redirecionamento',
423
-	'info_redirection_activee' => 'O redirecionamento foi ativado.',
424
-	'info_redirection_boucle' => 'Você tentou redirecionar a matéria para ela mesma.',
425
-	'info_redirection_desactivee' => 'O redirecionamento foi excluído.',
426
-	'info_refuses' => 'Suas matérias recusadas',
427
-	'info_reglage_ldap' => 'Opções: <b>Configuração da importação LDAP</b>',
428
-	'info_renvoi_article' => '<b>Redirecionamento.</b> Esta matéria redireciona para a página:',
429
-	'info_reserve_admin' => 'Apenas os administradores podem alterar este endereço.',
430
-	'info_restreindre_rubrique' => 'Restringir o gerenciamento à seção:',
431
-	'info_resultat_recherche' => 'Resultados da busca:',
432
-	'info_rubriques' => 'Seções',
433
-	'info_rubriques_02' => 'seções',
434
-	'info_rubriques_trouvees' => 'Seções encontradas',
435
-	'info_sans_titre' => 'Sem título',
436
-	'info_selection_chemin_acces' => '<b>Selecione</b> a seguir o caminho para acessar o diretório:',
437
-	'info_signatures' => 'assinaturas',
438
-	'info_site' => 'Site',
439
-	'info_site_2' => 'site:',
440
-	'info_site_min' => 'site',
441
-	'info_site_reference_2' => 'Site referenciado',
442
-	'info_site_web' => 'Website:',
443
-	'info_sites' => 'sites',
444
-	'info_sites_lies_mot' => 'Os sites referenciados vinculados a esta palavra-chave',
445
-	'info_sites_proxy' => 'Utilizar um proxy',
446
-	'info_sites_trouves' => 'Sites encontrados',
447
-	'info_sous_titre' => 'Subtítulo:',
448
-	'info_statut_administrateur' => 'Administrador',
449
-	'info_statut_auteur' => 'Status deste autor:',
450
-	'info_statut_auteur_2' => 'Eu sou',
451
-	'info_statut_auteur_a_confirmer' => 'Inscrição a confirmar',
452
-	'info_statut_auteur_autre' => 'Outro status:',
453
-	'info_statut_redacteur' => 'Redator',
454
-	'info_statut_utilisateurs_1' => 'Status padrão dos usuários importados',
455
-	'info_statut_utilisateurs_2' => 'Escolha o status atribuído às pessoas que constam do diretório LDAP, quando elas se conectarem pela primeira vêz. Você poderá, em seguida, alterar caso a caso este valor para cada autor.',
456
-	'info_suivi_activite' => 'Acompanhamento da atividade editorial',
457
-	'info_surtitre' => 'Sobretítulo:',
458
-	'info_syndication_integrale_1' => 'O seu site propõe arquivos de sindicação (ver «<a href="@url@">@titre@</a>»).',
459
-	'info_syndication_integrale_2' => 'Você deseja transmitir as matérias integralmente, ou difundir apenas um resumo de algumas centenas de caracteres?',
460
-	'info_table_prefix' => 'Você pode alterar o prefixo do nome das tabelas de dados (indispensável no caso de pretender instalar diversos sites na mesma base de dados). Este prefixo deve estar em minúsculas, não acentuadas, e sem espaços.',
461
-	'info_taille_maximale_images' => 'SPIP irá testar o tamanho máximo das imagens que o sistema pode tratar (em milhões de pixels).<br />As imagens muito grandes não serão reduzidas.',
462
-	'info_taille_maximale_vignette' => 'Tamanho máximo dos ícones gerados pelo sistema:',
463
-	'info_terminer_installation' => 'Você pode agora terminar o procedimento de instalação padrão.',
464
-	'info_texte' => 'Texto',
465
-	'info_texte_explicatif' => 'Texto explicativo',
466
-	'info_texte_long' => '(o texto é longo: ele aparecerá em diversas partes que serão recombinadas após validação.)',
467
-	'info_texte_message' => 'Texto da sua mensagem',
468
-	'info_texte_message_02' => 'Texto da mensagem',
469
-	'info_titre' => 'Título:',
470
-	'info_total' => 'total:',
471
-	'info_tous_articles_en_redaction' => 'Todas as matérias em fase de redação',
472
-	'info_tous_articles_presents' => 'Todas as matérias publicadas nesta seção',
473
-	'info_tous_articles_refuses' => 'Todas as matérias recusadas',
474
-	'info_tous_les' => 'todos os:',
475
-	'info_tout_site' => 'Todo o site',
476
-	'info_tout_site2' => 'A matéria não foi traduzida para este idioma.',
477
-	'info_tout_site3' => 'A matéria foi traduzida para este idioma, mas foram feitas alterações na matéria de referência. A tradução procisa ser atualizada.',
478
-	'info_tout_site4' => 'A matéria foi traduzida para este idioma e a tradução está em dia.',
479
-	'info_tout_site5' => 'Matéria original.',
480
-	'info_tout_site6' => '<b>Atenção:</b> apenas as matérias originais estão exibidas.
360
+    'info_multi_objets' => '@objets@ : ativar o menu de idioma',
361
+    'info_multi_secteurs' => '... apenas para as seções situadas na raiz?',
362
+    'info_nb_articles' => '@nb@ matérias',
363
+    'info_nb_auteurs' => '@nb@ autores',
364
+    'info_nb_messages' => '@nb@ mensagens',
365
+    'info_nb_mots_cles' => '@nb@ palavras-chave',
366
+    'info_nb_rubriques' => '@nb@ seções',
367
+    'info_nb_visiteurs' => '@nb@ visitantes',
368
+    'info_nom' => 'Nome',
369
+    'info_nom_destinataire' => 'Nome do destinatário',
370
+    'info_nom_pas_conforme' => 'tags HTML não são permitidas',
371
+    'info_nom_site' => 'Nome do seu site',
372
+    'info_nombre_articles' => '@nb_articles@ matérias,',
373
+    'info_nombre_rubriques' => '@nb_rubriques@ seções,',
374
+    'info_nombre_sites' => '@nb_sites@ sites,',
375
+    'info_non_deplacer' => 'Não mover...',
376
+    'info_non_envoi_annonce_dernieres_nouveautes' => 'O SPIP pode enviar regularmente o anúncio das últimas novidades do site (matérias e notas publicadas recentemente).',
377
+    'info_non_envoi_liste_nouveautes' => 'Não enviar a lista de novidades',
378
+    'info_non_modifiable' => 'não pode ser modificado',
379
+    'info_non_suppression_mot_cle' => 'Eu não quero excluir esta palavra-chave.',
380
+    'info_notes' => 'Observações',
381
+    'info_nouvel_article' => 'Nova matéria',
382
+    'info_nouvelle_traduction' => 'Nova tradução:',
383
+    'info_numero_article' => 'MATÉRIA NÚMERO:',
384
+    'info_obligatoire_02' => '(obrigatório)',
385
+    'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do site público',
386
+    'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição dos visitantes',
387
+    'info_options_avancees' => 'OPÇÕES AVANÇADAS',
388
+    'info_ou' => 'ou...',
389
+    'info_page_interdite' => 'Página não autorizada',
390
+    'info_par_nom' => 'por nome',
391
+    'info_par_nombre_article' => 'por número de matérias',
392
+    'info_par_statut' => 'por status',
393
+    'info_par_tri' => '’(por @tri@)’',
394
+    'info_passe_trop_court' => 'Senha muito curta.',
395
+    'info_passe_trop_court_car_pluriel' => 'A senha deve conter pelo menos @nb@ caracteres.',
396
+    'info_passes_identiques' => 'As duas senhas não são idênticas.',
397
+    'info_plus_cinq_car' => 'mais de 5 caracteres',
398
+    'info_plus_cinq_car_2' => '(Mais de 5 caracteres)',
399
+    'info_plus_trois_car' => '(Mais de 3 caracteres)',
400
+    'info_popularite' => 'popularidade: @popularite@; visitas: @visites@',
401
+    'info_post_scriptum' => 'Rodapé',
402
+    'info_post_scriptum_2' => 'Rodapé:',
403
+    'info_pour' => 'para',
404
+    'info_preview_texte' => 'É possível visualizar os diferentes elementos editoriais do site que tenham  pelo menos o status de «proposto», bem como os elementos em fase de redação de que se é autor. Esta funcionalidade deve estar disponível para os administradores, para os redatores, ou para ninguém?',
405
+    'info_procedez_par_etape' => 'proceder passo-a-passo',
406
+    'info_procedure_maj_version' => 'o procedimento de atualização deve ser rodado para adaptar a base de dados à nova versão do SPIP.',
407
+    'info_proxy_ok' => 'Teste do proxy bem sucedido',
408
+    'info_ps' => 'P.S.',
409
+    'info_publier' => 'publicar',
410
+    'info_publies' => 'Suas matérias publicadas online',
411
+    'info_question_accepter_visiteurs' => 'Se os templates do seu site prevêem o cadastramento de visitantes sem acesso à área privada, por favor, ative a opção abaixo:',
412
+    'info_question_inscription_nouveaux_redacteurs' => 'Você quer aceitar inscrições de novos redatores a partir do site público? Se você aceitar, os visitantes poderão se cadastrar através de um formulário automatizado, tendo acesso à área privada para propôr as suas próprias matérias. <div class="notice">Durante a fase de inscrição, os usuários recebem um e-mail automático, fornecendo-lhes os seus códigos de acesso à área privada. Alguns serviços de hospedagem desativam o envio de e-mails a partir dos seus servidores: nesse caso, a inscrição automática é impossível.</div>',
413
+    'info_qui_edite' => '@nom_auteur_modif@ trabalhou neste conteúdo há @date_diff@ minutos',
414
+    'info_racine_site' => 'Raiz do site',
415
+    'info_recharger_page' => 'Por favor, atualize esta página em alguns instantes.',
416
+    'info_recherche_auteur_zero' => 'Nenhum resultado para «@cherche_auteur@».',
417
+    'info_recommencer' => 'Por favor, recomece.',
418
+    'info_redacteur_1' => 'Redator',
419
+    'info_redacteur_2' => 'com acesso à área privada (<i>recomendado</i>)',
420
+    'info_redacteurs' => 'Redatores',
421
+    'info_redaction_en_cours' => 'EM FASE DE REDAÇÃO',
422
+    'info_redirection' => 'Redirecionamento',
423
+    'info_redirection_activee' => 'O redirecionamento foi ativado.',
424
+    'info_redirection_boucle' => 'Você tentou redirecionar a matéria para ela mesma.',
425
+    'info_redirection_desactivee' => 'O redirecionamento foi excluído.',
426
+    'info_refuses' => 'Suas matérias recusadas',
427
+    'info_reglage_ldap' => 'Opções: <b>Configuração da importação LDAP</b>',
428
+    'info_renvoi_article' => '<b>Redirecionamento.</b> Esta matéria redireciona para a página:',
429
+    'info_reserve_admin' => 'Apenas os administradores podem alterar este endereço.',
430
+    'info_restreindre_rubrique' => 'Restringir o gerenciamento à seção:',
431
+    'info_resultat_recherche' => 'Resultados da busca:',
432
+    'info_rubriques' => 'Seções',
433
+    'info_rubriques_02' => 'seções',
434
+    'info_rubriques_trouvees' => 'Seções encontradas',
435
+    'info_sans_titre' => 'Sem título',
436
+    'info_selection_chemin_acces' => '<b>Selecione</b> a seguir o caminho para acessar o diretório:',
437
+    'info_signatures' => 'assinaturas',
438
+    'info_site' => 'Site',
439
+    'info_site_2' => 'site:',
440
+    'info_site_min' => 'site',
441
+    'info_site_reference_2' => 'Site referenciado',
442
+    'info_site_web' => 'Website:',
443
+    'info_sites' => 'sites',
444
+    'info_sites_lies_mot' => 'Os sites referenciados vinculados a esta palavra-chave',
445
+    'info_sites_proxy' => 'Utilizar um proxy',
446
+    'info_sites_trouves' => 'Sites encontrados',
447
+    'info_sous_titre' => 'Subtítulo:',
448
+    'info_statut_administrateur' => 'Administrador',
449
+    'info_statut_auteur' => 'Status deste autor:',
450
+    'info_statut_auteur_2' => 'Eu sou',
451
+    'info_statut_auteur_a_confirmer' => 'Inscrição a confirmar',
452
+    'info_statut_auteur_autre' => 'Outro status:',
453
+    'info_statut_redacteur' => 'Redator',
454
+    'info_statut_utilisateurs_1' => 'Status padrão dos usuários importados',
455
+    'info_statut_utilisateurs_2' => 'Escolha o status atribuído às pessoas que constam do diretório LDAP, quando elas se conectarem pela primeira vêz. Você poderá, em seguida, alterar caso a caso este valor para cada autor.',
456
+    'info_suivi_activite' => 'Acompanhamento da atividade editorial',
457
+    'info_surtitre' => 'Sobretítulo:',
458
+    'info_syndication_integrale_1' => 'O seu site propõe arquivos de sindicação (ver «<a href="@url@">@titre@</a>»).',
459
+    'info_syndication_integrale_2' => 'Você deseja transmitir as matérias integralmente, ou difundir apenas um resumo de algumas centenas de caracteres?',
460
+    'info_table_prefix' => 'Você pode alterar o prefixo do nome das tabelas de dados (indispensável no caso de pretender instalar diversos sites na mesma base de dados). Este prefixo deve estar em minúsculas, não acentuadas, e sem espaços.',
461
+    'info_taille_maximale_images' => 'SPIP irá testar o tamanho máximo das imagens que o sistema pode tratar (em milhões de pixels).<br />As imagens muito grandes não serão reduzidas.',
462
+    'info_taille_maximale_vignette' => 'Tamanho máximo dos ícones gerados pelo sistema:',
463
+    'info_terminer_installation' => 'Você pode agora terminar o procedimento de instalação padrão.',
464
+    'info_texte' => 'Texto',
465
+    'info_texte_explicatif' => 'Texto explicativo',
466
+    'info_texte_long' => '(o texto é longo: ele aparecerá em diversas partes que serão recombinadas após validação.)',
467
+    'info_texte_message' => 'Texto da sua mensagem',
468
+    'info_texte_message_02' => 'Texto da mensagem',
469
+    'info_titre' => 'Título:',
470
+    'info_total' => 'total:',
471
+    'info_tous_articles_en_redaction' => 'Todas as matérias em fase de redação',
472
+    'info_tous_articles_presents' => 'Todas as matérias publicadas nesta seção',
473
+    'info_tous_articles_refuses' => 'Todas as matérias recusadas',
474
+    'info_tous_les' => 'todos os:',
475
+    'info_tout_site' => 'Todo o site',
476
+    'info_tout_site2' => 'A matéria não foi traduzida para este idioma.',
477
+    'info_tout_site3' => 'A matéria foi traduzida para este idioma, mas foram feitas alterações na matéria de referência. A tradução procisa ser atualizada.',
478
+    'info_tout_site4' => 'A matéria foi traduzida para este idioma e a tradução está em dia.',
479
+    'info_tout_site5' => 'Matéria original.',
480
+    'info_tout_site6' => '<b>Atenção:</b> apenas as matérias originais estão exibidas.
481 481
 As traduções estão associadas ao original, numa côr que indica o seu status:',
482
-	'info_traductions' => 'Traduções',
483
-	'info_travail_colaboratif' => 'Trabalho colaborativo nas matérias',
484
-	'info_un_article' => 'uma matéria,',
485
-	'info_un_site' => 'um site,',
486
-	'info_une_rubrique' => 'uma seção,',
487
-	'info_une_rubrique_02' => '1 seção',
488
-	'info_url' => 'URL:',
489
-	'info_url_proxy' => 'URL do proxy',
490
-	'info_url_proxy_pas_conforme' => 'O URL do proxy não é válido.',
491
-	'info_url_site_pas_conforme' => 'O URL do site não é válido.',
492
-	'info_url_test_proxy' => 'URL de teste',
493
-	'info_urlref' => 'Link hipertexto:',
494
-	'info_utilisation_spip' => 'Você pode agora começar a utilizar o sistema de publicação assistida...',
495
-	'info_visites_par_mois' => 'Exibir por mês:',
496
-	'info_visiteur_1' => 'Visitante',
497
-	'info_visiteur_2' => 'do site público',
498
-	'info_visiteurs' => 'Visitantes',
499
-	'info_visiteurs_02' => 'Visitantes do site público',
500
-	'info_webmestre_forces' => 'Os webmasters são definidos em <tt>@file_options@</tt>.',
501
-	'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem:',
502
-	'install_connect_ok' => 'A nova base de dados foi corretamente declarada sob o nome de servidor @connect@.',
503
-	'install_echec_annonce' => 'A instalação irá, provavelmente, falhar, ou levar a um site que não funciona...',
504
-	'install_extension_php_obligatoire' => 'O SPIP exige a extensão php:',
505
-	'install_login_base_hebergeur' => 'Login de conexão atribuído pelo serviço de hospedagem:',
506
-	'install_nom_base_hebergeur' => 'Nome da base atribuído pelo serviço de hospedagem:',
507
-	'install_pas_table' => 'Base atualmente sem tabelas',
508
-	'install_pass_base_hebergeur' => 'Senha de conexão atribuída pelo serviço de hospedagem',
509
-	'install_php_extension' => 'As extensões a seguir estão faltando: @extensions@',
510
-	'install_php_version' => 'PHP versão @version@ é insuficiente (mínimo = @minimum@)',
511
-	'install_php_version_max' => 'A versão @version@ do PHP é muito recente (máximo = @maximum@)',
512
-	'install_select_langue' => 'Escolha um idioma e clique no botão «avançar» para iniciar o procedimento de instalação.',
513
-	'install_select_type_db' => 'Indicar o tipo de base de dados:',
514
-	'install_select_type_mysql' => 'MySQL',
515
-	'install_select_type_pg' => 'PostgreSQL',
516
-	'install_select_type_sqlite2' => 'SQLite 2',
517
-	'install_select_type_sqlite3' => 'SQLite 3',
518
-	'install_serveur_hebergeur' => 'Servidor de base de dados atribuído pelo serviço de hospedagem',
519
-	'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:',
520
-	'install_tables_base' => 'Tabelas da base',
521
-	'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (a mais comum), e <b>SQLite</b>.',
522
-	'install_types_db_connus_avertissement' => 'O suporte ao <b>PostgreSQL</b> é também proposto a título experimental',
523
-	'instituer_erreur_statut_a_change' => 'O status já foi alterado',
524
-	'instituer_erreur_statut_non_autorise' => 'Você não pode escolher este status',
525
-	'intem_redacteur' => 'redator',
526
-	'intitule_licence' => 'Licença',
527
-	'item_accepter_inscriptions' => 'Aceitar as inscrições',
528
-	'item_activer_messages_avertissement' => 'Ativar as mensagens de aviso',
529
-	'item_administrateur_2' => 'administrador',
530
-	'item_afficher_calendrier' => 'Exibir no calendário',
531
-	'item_autoriser_syndication_integrale' => 'Difundir a íntegra das matérias nos arquivos de sindicação',
532
-	'item_choix_administrateurs' => 'os administradores',
533
-	'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.',
534
-	'item_choix_non_generation_miniature' => 'Não gerar as miniaturas das imagens.',
535
-	'item_choix_redacteurs' => 'os redatores',
536
-	'item_choix_visiteurs' => 'os visitantes do site público',
537
-	'item_creer_fichiers_authent' => 'Criar os arquivos .htpasswd',
538
-	'item_login' => 'Login',
539
-	'item_messagerie_agenda' => 'Ativar as mesagens internas e a agenda',
540
-	'item_mots_cles_association_articles' => 'às matérias',
541
-	'item_mots_cles_association_rubriques' => 'às seções',
542
-	'item_mots_cles_association_sites' => 'aos sites referenciados ou sindicados.',
543
-	'item_non' => 'Não',
544
-	'item_non_accepter_inscriptions' => 'Não aceitar inscrições',
545
-	'item_non_activer_messages_avertissement' => 'Sem mensagens de aviso',
546
-	'item_non_afficher_calendrier' => 'Não exibir no calendário',
547
-	'item_non_autoriser_syndication_integrale' => 'Difundir apenas um resumo',
548
-	'item_non_creer_fichiers_authent' => 'Não criar os arquivos',
549
-	'item_non_messagerie_agenda' => 'Desativar as mensagens internas e a agenda',
550
-	'item_non_publier_articles' => 'Não publicar as matérias antes da data de publicação fixada.',
551
-	'item_nouvel_auteur' => 'Novo autor',
552
-	'item_nouvelle_rubrique' => 'Nova seção',
553
-	'item_oui' => 'Sim',
554
-	'item_publier_articles' => 'Publicar as matérias seja qual for a sua data de publicação.',
555
-	'item_reponse_article' => 'Resposta à matéria',
556
-	'item_visiteur' => 'Visitante',
482
+    'info_traductions' => 'Traduções',
483
+    'info_travail_colaboratif' => 'Trabalho colaborativo nas matérias',
484
+    'info_un_article' => 'uma matéria,',
485
+    'info_un_site' => 'um site,',
486
+    'info_une_rubrique' => 'uma seção,',
487
+    'info_une_rubrique_02' => '1 seção',
488
+    'info_url' => 'URL:',
489
+    'info_url_proxy' => 'URL do proxy',
490
+    'info_url_proxy_pas_conforme' => 'O URL do proxy não é válido.',
491
+    'info_url_site_pas_conforme' => 'O URL do site não é válido.',
492
+    'info_url_test_proxy' => 'URL de teste',
493
+    'info_urlref' => 'Link hipertexto:',
494
+    'info_utilisation_spip' => 'Você pode agora começar a utilizar o sistema de publicação assistida...',
495
+    'info_visites_par_mois' => 'Exibir por mês:',
496
+    'info_visiteur_1' => 'Visitante',
497
+    'info_visiteur_2' => 'do site público',
498
+    'info_visiteurs' => 'Visitantes',
499
+    'info_visiteurs_02' => 'Visitantes do site público',
500
+    'info_webmestre_forces' => 'Os webmasters são definidos em <tt>@file_options@</tt>.',
501
+    'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem:',
502
+    'install_connect_ok' => 'A nova base de dados foi corretamente declarada sob o nome de servidor @connect@.',
503
+    'install_echec_annonce' => 'A instalação irá, provavelmente, falhar, ou levar a um site que não funciona...',
504
+    'install_extension_php_obligatoire' => 'O SPIP exige a extensão php:',
505
+    'install_login_base_hebergeur' => 'Login de conexão atribuído pelo serviço de hospedagem:',
506
+    'install_nom_base_hebergeur' => 'Nome da base atribuído pelo serviço de hospedagem:',
507
+    'install_pas_table' => 'Base atualmente sem tabelas',
508
+    'install_pass_base_hebergeur' => 'Senha de conexão atribuída pelo serviço de hospedagem',
509
+    'install_php_extension' => 'As extensões a seguir estão faltando: @extensions@',
510
+    'install_php_version' => 'PHP versão @version@ é insuficiente (mínimo = @minimum@)',
511
+    'install_php_version_max' => 'A versão @version@ do PHP é muito recente (máximo = @maximum@)',
512
+    'install_select_langue' => 'Escolha um idioma e clique no botão «avançar» para iniciar o procedimento de instalação.',
513
+    'install_select_type_db' => 'Indicar o tipo de base de dados:',
514
+    'install_select_type_mysql' => 'MySQL',
515
+    'install_select_type_pg' => 'PostgreSQL',
516
+    'install_select_type_sqlite2' => 'SQLite 2',
517
+    'install_select_type_sqlite3' => 'SQLite 3',
518
+    'install_serveur_hebergeur' => 'Servidor de base de dados atribuído pelo serviço de hospedagem',
519
+    'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:',
520
+    'install_tables_base' => 'Tabelas da base',
521
+    'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (a mais comum), e <b>SQLite</b>.',
522
+    'install_types_db_connus_avertissement' => 'O suporte ao <b>PostgreSQL</b> é também proposto a título experimental',
523
+    'instituer_erreur_statut_a_change' => 'O status já foi alterado',
524
+    'instituer_erreur_statut_non_autorise' => 'Você não pode escolher este status',
525
+    'intem_redacteur' => 'redator',
526
+    'intitule_licence' => 'Licença',
527
+    'item_accepter_inscriptions' => 'Aceitar as inscrições',
528
+    'item_activer_messages_avertissement' => 'Ativar as mensagens de aviso',
529
+    'item_administrateur_2' => 'administrador',
530
+    'item_afficher_calendrier' => 'Exibir no calendário',
531
+    'item_autoriser_syndication_integrale' => 'Difundir a íntegra das matérias nos arquivos de sindicação',
532
+    'item_choix_administrateurs' => 'os administradores',
533
+    'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.',
534
+    'item_choix_non_generation_miniature' => 'Não gerar as miniaturas das imagens.',
535
+    'item_choix_redacteurs' => 'os redatores',
536
+    'item_choix_visiteurs' => 'os visitantes do site público',
537
+    'item_creer_fichiers_authent' => 'Criar os arquivos .htpasswd',
538
+    'item_login' => 'Login',
539
+    'item_messagerie_agenda' => 'Ativar as mesagens internas e a agenda',
540
+    'item_mots_cles_association_articles' => 'às matérias',
541
+    'item_mots_cles_association_rubriques' => 'às seções',
542
+    'item_mots_cles_association_sites' => 'aos sites referenciados ou sindicados.',
543
+    'item_non' => 'Não',
544
+    'item_non_accepter_inscriptions' => 'Não aceitar inscrições',
545
+    'item_non_activer_messages_avertissement' => 'Sem mensagens de aviso',
546
+    'item_non_afficher_calendrier' => 'Não exibir no calendário',
547
+    'item_non_autoriser_syndication_integrale' => 'Difundir apenas um resumo',
548
+    'item_non_creer_fichiers_authent' => 'Não criar os arquivos',
549
+    'item_non_messagerie_agenda' => 'Desativar as mensagens internas e a agenda',
550
+    'item_non_publier_articles' => 'Não publicar as matérias antes da data de publicação fixada.',
551
+    'item_nouvel_auteur' => 'Novo autor',
552
+    'item_nouvelle_rubrique' => 'Nova seção',
553
+    'item_oui' => 'Sim',
554
+    'item_publier_articles' => 'Publicar as matérias seja qual for a sua data de publicação.',
555
+    'item_reponse_article' => 'Resposta à matéria',
556
+    'item_visiteur' => 'Visitante',
557 557
 
558
-	// J
559
-	'jour_non_connu_nc' => 'n.c.',
558
+    // J
559
+    'jour_non_connu_nc' => 'n.c.',
560 560
 
561
-	// L
562
-	'label_bando_outils' => 'Barra de ferramentas',
563
-	'label_bando_outils_afficher' => 'Exibir as ferramentas',
564
-	'label_bando_outils_masquer' => 'Esconder as ferramentas',
565
-	'label_choix_langue' => 'Escolha o seu idioma',
566
-	'label_langue' => 'Idioma',
567
-	'label_nom_fichier_connect' => 'Informe o nome usado por este servidor',
568
-	'label_slogan_site' => 'Slogan do site',
569
-	'label_taille_ecran' => 'Largura da tela',
570
-	'label_texte_et_icones_navigation' => 'Menu de navegação',
571
-	'label_texte_et_icones_page' => 'Exibição na página',
572
-	'ldap_correspondance' => 'herança do campo @champ@',
573
-	'ldap_correspondance_1' => 'Herança dos campos LDAP',
574
-	'ldap_correspondance_2' => 'Para cada um dos campos SPIP a seguir, indique o nome do campo LDAP correspondente. Deixe em branco para não preencher, separe por espaços ou vírgulas para tentar vários campos LDAP.',
575
-	'lien_ajouter_auteur' => 'Incluir este autor',
576
-	'lien_ajouter_une_rubrique' => 'Incluir esta seção',
577
-	'lien_email' => 'e-mail',
578
-	'lien_nom_site' => 'NOME DO SITE:',
579
-	'lien_rapide_contenu' => 'Ir para o conteúdo',
580
-	'lien_rapide_navigation' => 'Ir para a navegação',
581
-	'lien_rapide_recherche' => 'Ir para a busca',
582
-	'lien_retirer_auteur' => 'Retirar o autor',
583
-	'lien_retirer_rubrique' => 'Excluir a seção',
584
-	'lien_retirer_tous_auteurs' => 'Retirar todos os autores',
585
-	'lien_retirer_toutes_rubriques' => 'Retirar todas as seções',
586
-	'lien_site' => 'site',
587
-	'lien_tout_decocher' => 'Desmarcar tudo',
588
-	'lien_tout_deplier' => 'Expandir tudo',
589
-	'lien_tout_replier' => 'Retrair tudo',
590
-	'lien_tout_supprimer' => 'Excluir tudo',
591
-	'lien_trier_nom' => 'Ordenar pelo nome',
592
-	'lien_trier_nombre_articles' => 'Ordenar por número de matérias',
593
-	'lien_trier_statut' => 'Ordenar pelo status',
594
-	'lien_voir_en_ligne' => 'VER ONLINE:',
595
-	'logo_article' => 'Ícone da matéria',
596
-	'logo_auteur' => 'Ícone do autor',
597
-	'logo_rubrique' => 'Ícone da seção',
598
-	'logo_site' => 'Ícone deste site',
599
-	'logo_standard_rubrique' => 'Ícone padrão das seções',
600
-	'logo_survol' => 'Ícone para mouseOver',
561
+    // L
562
+    'label_bando_outils' => 'Barra de ferramentas',
563
+    'label_bando_outils_afficher' => 'Exibir as ferramentas',
564
+    'label_bando_outils_masquer' => 'Esconder as ferramentas',
565
+    'label_choix_langue' => 'Escolha o seu idioma',
566
+    'label_langue' => 'Idioma',
567
+    'label_nom_fichier_connect' => 'Informe o nome usado por este servidor',
568
+    'label_slogan_site' => 'Slogan do site',
569
+    'label_taille_ecran' => 'Largura da tela',
570
+    'label_texte_et_icones_navigation' => 'Menu de navegação',
571
+    'label_texte_et_icones_page' => 'Exibição na página',
572
+    'ldap_correspondance' => 'herança do campo @champ@',
573
+    'ldap_correspondance_1' => 'Herança dos campos LDAP',
574
+    'ldap_correspondance_2' => 'Para cada um dos campos SPIP a seguir, indique o nome do campo LDAP correspondente. Deixe em branco para não preencher, separe por espaços ou vírgulas para tentar vários campos LDAP.',
575
+    'lien_ajouter_auteur' => 'Incluir este autor',
576
+    'lien_ajouter_une_rubrique' => 'Incluir esta seção',
577
+    'lien_email' => 'e-mail',
578
+    'lien_nom_site' => 'NOME DO SITE:',
579
+    'lien_rapide_contenu' => 'Ir para o conteúdo',
580
+    'lien_rapide_navigation' => 'Ir para a navegação',
581
+    'lien_rapide_recherche' => 'Ir para a busca',
582
+    'lien_retirer_auteur' => 'Retirar o autor',
583
+    'lien_retirer_rubrique' => 'Excluir a seção',
584
+    'lien_retirer_tous_auteurs' => 'Retirar todos os autores',
585
+    'lien_retirer_toutes_rubriques' => 'Retirar todas as seções',
586
+    'lien_site' => 'site',
587
+    'lien_tout_decocher' => 'Desmarcar tudo',
588
+    'lien_tout_deplier' => 'Expandir tudo',
589
+    'lien_tout_replier' => 'Retrair tudo',
590
+    'lien_tout_supprimer' => 'Excluir tudo',
591
+    'lien_trier_nom' => 'Ordenar pelo nome',
592
+    'lien_trier_nombre_articles' => 'Ordenar por número de matérias',
593
+    'lien_trier_statut' => 'Ordenar pelo status',
594
+    'lien_voir_en_ligne' => 'VER ONLINE:',
595
+    'logo_article' => 'Ícone da matéria',
596
+    'logo_auteur' => 'Ícone do autor',
597
+    'logo_rubrique' => 'Ícone da seção',
598
+    'logo_site' => 'Ícone deste site',
599
+    'logo_standard_rubrique' => 'Ícone padrão das seções',
600
+    'logo_survol' => 'Ícone para mouseOver',
601 601
 
602
-	// M
603
-	'menu_aide_installation_choix_base' => 'Seleção da sua base',
604
-	'module_fichier_langue' => 'Arquivo de idioma',
605
-	'module_raccourci' => 'Atalho',
606
-	'module_texte_affiche' => 'Texto exibido',
607
-	'module_texte_explicatif' => 'Você pode inserir os atalhos a seguir nos templates do seu site público. Eles serão traduzidos automaticamente para os idiomas para os quais exista um arquivo de idioma.',
608
-	'module_texte_traduction' => 'O arquivo de idioma «@module@» está disponível em:',
609
-	'mois_non_connu' => 'desconhecido',
602
+    // M
603
+    'menu_aide_installation_choix_base' => 'Seleção da sua base',
604
+    'module_fichier_langue' => 'Arquivo de idioma',
605
+    'module_raccourci' => 'Atalho',
606
+    'module_texte_affiche' => 'Texto exibido',
607
+    'module_texte_explicatif' => 'Você pode inserir os atalhos a seguir nos templates do seu site público. Eles serão traduzidos automaticamente para os idiomas para os quais exista um arquivo de idioma.',
608
+    'module_texte_traduction' => 'O arquivo de idioma «@module@» está disponível em:',
609
+    'mois_non_connu' => 'desconhecido',
610 610
 
611
-	// N
612
-	'nouvelle_version_spip' => 'A versão @version@ do SPIP está disponível',
613
-	'nouvelle_version_spip_majeure' => 'Uma nova versão SPIP @version@ está disponível',
611
+    // N
612
+    'nouvelle_version_spip' => 'A versão @version@ do SPIP está disponível',
613
+    'nouvelle_version_spip_majeure' => 'Uma nova versão SPIP @version@ está disponível',
614 614
 
615
-	// O
616
-	'onglet_contenu' => 'Conteúdo',
617
-	'onglet_declarer_une_autre_base' => 'Configurar outra base',
618
-	'onglet_discuter' => 'Discutir',
619
-	'onglet_interactivite' => 'Interatividade',
620
-	'onglet_proprietes' => 'Propriedades',
621
-	'onglet_repartition_actuelle' => 'atualmente',
622
-	'onglet_sous_rubriques' => 'Subseções',
615
+    // O
616
+    'onglet_contenu' => 'Conteúdo',
617
+    'onglet_declarer_une_autre_base' => 'Configurar outra base',
618
+    'onglet_discuter' => 'Discutir',
619
+    'onglet_interactivite' => 'Interatividade',
620
+    'onglet_proprietes' => 'Propriedades',
621
+    'onglet_repartition_actuelle' => 'atualmente',
622
+    'onglet_sous_rubriques' => 'Subseções',
623 623
 
624
-	// P
625
-	'page_pas_proxy' => 'Esta página não deve passar pelo proxy',
626
-	'pas_de_proxy_pour' => 'Se necessário, indique as máquinas ou domínios para os quais este proxy não se aplica (por exemplo: @exemple@)',
627
-	'phpinfo' => 'Configuração PHP',
628
-	'plugin_charge_paquet' => 'Carregamento do pacote @name@',
629
-	'plugin_charger' => 'Transferir',
630
-	'plugin_erreur_charger' => 'erro: não foi possível carregar @zip@',
631
-	'plugin_erreur_droit1' => 'O diretório <code>@dest@</code> não está acessível para escrita.',
632
-	'plugin_erreur_droit2' => 'Por favor, verifique os direitos deste diretório (e criá-lo, caso não exista), ou instalar os arquivos por FTP.',
633
-	'plugin_erreur_zip' => 'falha pclzip: erro @status@',
634
-	'plugin_etat_developpement' => 'em desenvolvimento',
635
-	'plugin_etat_experimental' => 'experimental',
636
-	'plugin_etat_stable' => 'estável',
637
-	'plugin_etat_test' => 'em teste',
638
-	'plugin_impossible_activer' => 'Não foi possível ativar o plugin @plugin@',
639
-	'plugin_info_automatique1' => 'Se você deseja autorizar a instalaçào automática dos plugins, por favor:',
640
-	'plugin_info_automatique1_lib' => 'Se você deseja autorizar a instalação automática desta biblioteca, por favor:',
641
-	'plugin_info_automatique2' => 'crie um diretório <code>@rep@</code> ;',
642
-	'plugin_info_automatique3' => 'verifique se o servidor está autorizado a escrever neste diretório',
643
-	'plugin_info_automatique_creer' => 'a ser criado na raiz do site.',
644
-	'plugin_info_automatique_exemples' => 'exemplos:',
645
-	'plugin_info_automatique_ftp' => 'Você pode instalar os plugins, por FTP, no diretório <tt>@rep@</tt>',
646
-	'plugin_info_automatique_lib' => 'Alguns plugins precisam também poder transferir arquivos para o diretório <code>lib/</code>, a ser criado, caso não exista, na raiz do site.',
647
-	'plugin_info_automatique_liste' => 'Suas listas de plugins:',
648
-	'plugin_info_automatique_liste_officielle' => 'os plugins oficiais',
649
-	'plugin_info_automatique_liste_update' => 'Atualizar as listas',
650
-	'plugin_info_automatique_ou' => 'ou...',
651
-	'plugin_info_automatique_select' => 'Selecione abaixo um plugin: O SPIP o transferirá e o instalará no diretório <code>@rep@</code>; se o plugin já existir, será atualizado.',
652
-	'plugin_info_credit' => 'Créditos',
653
-	'plugin_info_erreur_xml' => 'A declaração deste plugin está incorreta',
654
-	'plugin_info_install_ok' => 'Instalação bem sucedida',
655
-	'plugin_info_necessite' => 'Requer:',
656
-	'plugin_info_non_compatible_spip' => 'Este plugin não é compatível com esta versão do SPIP',
657
-	'plugin_info_plugins_dist_1' => 'Os plugins abaixo são carregados e ativados no diretório @plugins_dist@.',
658
-	'plugin_info_plugins_dist_2' => 'Eles não são desativáveis.',
659
-	'plugin_info_telecharger' => 'transferir de @url@ e instalar em @rep@',
660
-	'plugin_info_upgrade_ok' => 'Atualização bem sucedida',
661
-	'plugin_librairies_installees' => 'Bibliotecas instaladas',
662
-	'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ na versão @version@.',
663
-	'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@',
664
-	'plugin_necessite_lib' => 'Este plugin precisa da biblioteca @lib@',
665
-	'plugin_necessite_php' => 'Requer @plugin@ na versão @version@.',
666
-	'plugin_necessite_plugin' => 'Precisa do plugin @plugin@, na versão @version@.',
667
-	'plugin_necessite_plugin_sans_version' => 'Precisa do plugin @plugin@',
668
-	'plugin_necessite_spip' => 'É necessário o SPIP na versão @version@, pelo menos.',
669
-	'plugin_source' => 'fonte: ',
670
-	'plugin_titre_automatique' => 'Instalação automática',
671
-	'plugin_titre_automatique_ajouter' => 'Incluir plugins',
672
-	'plugin_titre_installation' => 'Instalação do plugin @plugin@',
673
-	'plugin_titre_modifier' => 'Meus plugins',
674
-	'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.',
675
-	'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.',
676
-	'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.',
677
-	'plugin_zip_active' => 'Continue para o ativar',
678
-	'plugin_zip_adresse' => 'Indique abaixo o endereço de um arquivo zip de plugin a ser transferido, ou ainda o endereço de uma lista de plugins.',
679
-	'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista',
680
-	'plugin_zip_content' => 'Ele contém os arquivos a seguir (@taille@),<br />prontos para serem instalados no diretório <code>@rep@</code>',
681
-	'plugin_zip_installe_finie' => 'O arquivo @zip@ foi descompactado e instalado.',
682
-	'plugin_zip_installe_rep_finie' => 'O arquivo @zip@ foi descompactado e instalado no diretório @rep@',
683
-	'plugin_zip_installer' => 'Você pode, agora, instalá-lo.',
684
-	'plugin_zip_telecharge' => 'O arquivo @zip@ foi transferido',
685
-	'plugins_actif_aucun' => 'Nenhum plugin ativado.',
686
-	'plugins_actif_un' => 'Um plugin ativado.',
687
-	'plugins_actifs' => '@count@ plugins ativados.',
688
-	'plugins_actifs_liste' => 'Ativos',
689
-	'plugins_compte' => '@count@ plugins',
690
-	'plugins_disponible_un' => 'Um plugin disponível.',
691
-	'plugins_disponibles' => '@count@ plugins disponiveis.',
692
-	'plugins_erreur' => 'Erro nos plugins: @plugins@',
693
-	'plugins_liste' => 'Lista dos plugins',
694
-	'plugins_liste_dist' => 'Plugins bloqueados',
695
-	'plugins_recents' => 'Plugins recentes.',
696
-	'plugins_tous_liste' => 'Todos',
697
-	'plugins_vue_hierarchie' => 'Hierarquia',
698
-	'plugins_vue_liste' => 'Lista',
699
-	'protocole_ldap' => 'Versão do protocolo:',
624
+    // P
625
+    'page_pas_proxy' => 'Esta página não deve passar pelo proxy',
626
+    'pas_de_proxy_pour' => 'Se necessário, indique as máquinas ou domínios para os quais este proxy não se aplica (por exemplo: @exemple@)',
627
+    'phpinfo' => 'Configuração PHP',
628
+    'plugin_charge_paquet' => 'Carregamento do pacote @name@',
629
+    'plugin_charger' => 'Transferir',
630
+    'plugin_erreur_charger' => 'erro: não foi possível carregar @zip@',
631
+    'plugin_erreur_droit1' => 'O diretório <code>@dest@</code> não está acessível para escrita.',
632
+    'plugin_erreur_droit2' => 'Por favor, verifique os direitos deste diretório (e criá-lo, caso não exista), ou instalar os arquivos por FTP.',
633
+    'plugin_erreur_zip' => 'falha pclzip: erro @status@',
634
+    'plugin_etat_developpement' => 'em desenvolvimento',
635
+    'plugin_etat_experimental' => 'experimental',
636
+    'plugin_etat_stable' => 'estável',
637
+    'plugin_etat_test' => 'em teste',
638
+    'plugin_impossible_activer' => 'Não foi possível ativar o plugin @plugin@',
639
+    'plugin_info_automatique1' => 'Se você deseja autorizar a instalaçào automática dos plugins, por favor:',
640
+    'plugin_info_automatique1_lib' => 'Se você deseja autorizar a instalação automática desta biblioteca, por favor:',
641
+    'plugin_info_automatique2' => 'crie um diretório <code>@rep@</code> ;',
642
+    'plugin_info_automatique3' => 'verifique se o servidor está autorizado a escrever neste diretório',
643
+    'plugin_info_automatique_creer' => 'a ser criado na raiz do site.',
644
+    'plugin_info_automatique_exemples' => 'exemplos:',
645
+    'plugin_info_automatique_ftp' => 'Você pode instalar os plugins, por FTP, no diretório <tt>@rep@</tt>',
646
+    'plugin_info_automatique_lib' => 'Alguns plugins precisam também poder transferir arquivos para o diretório <code>lib/</code>, a ser criado, caso não exista, na raiz do site.',
647
+    'plugin_info_automatique_liste' => 'Suas listas de plugins:',
648
+    'plugin_info_automatique_liste_officielle' => 'os plugins oficiais',
649
+    'plugin_info_automatique_liste_update' => 'Atualizar as listas',
650
+    'plugin_info_automatique_ou' => 'ou...',
651
+    'plugin_info_automatique_select' => 'Selecione abaixo um plugin: O SPIP o transferirá e o instalará no diretório <code>@rep@</code>; se o plugin já existir, será atualizado.',
652
+    'plugin_info_credit' => 'Créditos',
653
+    'plugin_info_erreur_xml' => 'A declaração deste plugin está incorreta',
654
+    'plugin_info_install_ok' => 'Instalação bem sucedida',
655
+    'plugin_info_necessite' => 'Requer:',
656
+    'plugin_info_non_compatible_spip' => 'Este plugin não é compatível com esta versão do SPIP',
657
+    'plugin_info_plugins_dist_1' => 'Os plugins abaixo são carregados e ativados no diretório @plugins_dist@.',
658
+    'plugin_info_plugins_dist_2' => 'Eles não são desativáveis.',
659
+    'plugin_info_telecharger' => 'transferir de @url@ e instalar em @rep@',
660
+    'plugin_info_upgrade_ok' => 'Atualização bem sucedida',
661
+    'plugin_librairies_installees' => 'Bibliotecas instaladas',
662
+    'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ na versão @version@.',
663
+    'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@',
664
+    'plugin_necessite_lib' => 'Este plugin precisa da biblioteca @lib@',
665
+    'plugin_necessite_php' => 'Requer @plugin@ na versão @version@.',
666
+    'plugin_necessite_plugin' => 'Precisa do plugin @plugin@, na versão @version@.',
667
+    'plugin_necessite_plugin_sans_version' => 'Precisa do plugin @plugin@',
668
+    'plugin_necessite_spip' => 'É necessário o SPIP na versão @version@, pelo menos.',
669
+    'plugin_source' => 'fonte: ',
670
+    'plugin_titre_automatique' => 'Instalação automática',
671
+    'plugin_titre_automatique_ajouter' => 'Incluir plugins',
672
+    'plugin_titre_installation' => 'Instalação do plugin @plugin@',
673
+    'plugin_titre_modifier' => 'Meus plugins',
674
+    'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.',
675
+    'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.',
676
+    'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.',
677
+    'plugin_zip_active' => 'Continue para o ativar',
678
+    'plugin_zip_adresse' => 'Indique abaixo o endereço de um arquivo zip de plugin a ser transferido, ou ainda o endereço de uma lista de plugins.',
679
+    'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista',
680
+    'plugin_zip_content' => 'Ele contém os arquivos a seguir (@taille@),<br />prontos para serem instalados no diretório <code>@rep@</code>',
681
+    'plugin_zip_installe_finie' => 'O arquivo @zip@ foi descompactado e instalado.',
682
+    'plugin_zip_installe_rep_finie' => 'O arquivo @zip@ foi descompactado e instalado no diretório @rep@',
683
+    'plugin_zip_installer' => 'Você pode, agora, instalá-lo.',
684
+    'plugin_zip_telecharge' => 'O arquivo @zip@ foi transferido',
685
+    'plugins_actif_aucun' => 'Nenhum plugin ativado.',
686
+    'plugins_actif_un' => 'Um plugin ativado.',
687
+    'plugins_actifs' => '@count@ plugins ativados.',
688
+    'plugins_actifs_liste' => 'Ativos',
689
+    'plugins_compte' => '@count@ plugins',
690
+    'plugins_disponible_un' => 'Um plugin disponível.',
691
+    'plugins_disponibles' => '@count@ plugins disponiveis.',
692
+    'plugins_erreur' => 'Erro nos plugins: @plugins@',
693
+    'plugins_liste' => 'Lista dos plugins',
694
+    'plugins_liste_dist' => 'Plugins bloqueados',
695
+    'plugins_recents' => 'Plugins recentes.',
696
+    'plugins_tous_liste' => 'Todos',
697
+    'plugins_vue_hierarchie' => 'Hierarquia',
698
+    'plugins_vue_liste' => 'Lista',
699
+    'protocole_ldap' => 'Versão do protocolo:',
700 700
 
701
-	// Q
702
-	'queue_args_fonction_label' => 'Argumentos passados à função @fonction@',
703
-	'queue_args_voir' => 'Ver os argumentos',
704
-	'queue_executer_maintenant' => 'Executar agora',
705
-	'queue_fonction_label' => 'Função',
706
-	'queue_info_purger' => 'Você pode excluir todas as tarefas de fundo em espera e reinicializar a lista com as tarefas periódicas',
707
-	'queue_liens_label' => 'Links',
708
-	'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera',
709
-	'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s',
710
-	'queue_next_job_scheduled' => 'Próxima tarefa',
711
-	'queue_no_job_in_queue' => 'Nenhum tarefa em espera',
712
-	'queue_one_job_in_queue' => '1 tarefa em espera',
713
-	'queue_priorite_tache' => 'prioridade',
714
-	'queue_purger_queue' => 'Reiniciar a lista de tarefas',
715
-	'queue_statut_en_cours' => 'Em curso',
716
-	'queue_titre' => 'Tarefas de fundo',
701
+    // Q
702
+    'queue_args_fonction_label' => 'Argumentos passados à função @fonction@',
703
+    'queue_args_voir' => 'Ver os argumentos',
704
+    'queue_executer_maintenant' => 'Executar agora',
705
+    'queue_fonction_label' => 'Função',
706
+    'queue_info_purger' => 'Você pode excluir todas as tarefas de fundo em espera e reinicializar a lista com as tarefas periódicas',
707
+    'queue_liens_label' => 'Links',
708
+    'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera',
709
+    'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s',
710
+    'queue_next_job_scheduled' => 'Próxima tarefa',
711
+    'queue_no_job_in_queue' => 'Nenhum tarefa em espera',
712
+    'queue_one_job_in_queue' => '1 tarefa em espera',
713
+    'queue_priorite_tache' => 'prioridade',
714
+    'queue_purger_queue' => 'Reiniciar a lista de tarefas',
715
+    'queue_statut_en_cours' => 'Em curso',
716
+    'queue_titre' => 'Tarefas de fundo',
717 717
 
718
-	// R
719
-	'repertoire_plugins' => 'Diretório:',
720
-	'required' => '(obrigatório)',
718
+    // R
719
+    'repertoire_plugins' => 'Diretório:',
720
+    'required' => '(obrigatório)',
721 721
 
722
-	// S
723
-	'sans_heure' => 'sem hora',
724
-	'statut_admin_restreint' => '(admin limitado)',
725
-	'statut_webmestre' => 'webmaster',
722
+    // S
723
+    'sans_heure' => 'sem hora',
724
+    'statut_admin_restreint' => '(admin limitado)',
725
+    'statut_webmestre' => 'webmaster',
726 726
 
727
-	// T
728
-	'tache_cron_asap' => 'Tarefa CRON @function@ (ASAP)',
729
-	'tache_cron_secondes' => 'Tarefa CRON @function@ (a cada @nb@ s)',
730
-	'taille_cache_image' => 'As imagens calculadas automaticamente pelo SPIP (ícones de documentos, títulos apresentados sob a forma gráfica, funções matemáticas em formato TeX...) ocupam, no diretório @dir@, um total de @taille@.',
731
-	'taille_cache_moins_de' => 'O tamanho do cache é menor do que @octets@.',
732
-	'taille_cache_octets' => 'O tamanho atual do cache é de cerca de @octets@.',
733
-	'taille_cache_vide' => 'O cache está vazio.',
734
-	'taille_repertoire_cache' => 'Tamanho do diretório cache',
735
-	'text_article_propose_publication' => 'Matéria proposta para publicação.',
736
-	'texte_acces_ldap_anonyme_1' => 'Alguns servidores LDAP não aceitam nenhum acesso anônimo. Neste caso, é necessário especificar um identificador de acesso inicial de modo a poder, em seguida, pesquisar as informações no diretório. Na maior parte dos casos, entretanto, os campos a seguir poderão ser deixados em branco.',
737
-	'texte_admin_effacer_01' => 'Este comando apaga <i>todo</i> o conteúdo da base de dados,incluindo <i>todos</i> os acessos dos redatores e administradores. Após executá-lo, você deverá reinstalar o SPIP para recriar uma nova base de dados bem como um acesso inicial de administrador.',
738
-	'texte_adresse_annuaire_1' => '(Se o seu diretório está instalado na mesma máquina que este website, trata-se provavelmente de «localhost».)',
739
-	'texte_ajout_auteur' => 'O autor a seguir foi incluído na matéria:',
740
-	'texte_annuaire_ldap_1' => 'Se você tem acesso a um diretório LDAP, você poderá utilizá-lo para importar automaticamente os usuários para o SPIP.',
741
-	'texte_article_statut' => 'Esta matéria está:',
742
-	'texte_article_virtuel' => 'Matéria virtual',
743
-	'texte_article_virtuel_reference' => '<b>Matéria virtual:</b> matéria referenciada no seu site SPIP, mas redirecionada para um outro URL. Para cancelar o redirecionamento, apague o URL abaixo.',
744
-	'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"',
745
-	'texte_auteur_messagerie' => 'Este site pode monitorar permanentemente a lista de editores conectados, permitindo-lhe trocar mensagens em tempo real. Você pode decidir não aparecer nessa lista (ficando "invisível" para os outros usuários).',
746
-	'texte_auteurs' => 'OS AUTORES',
747
-	'texte_choix_base_1' => 'Escolha a sua base:',
748
-	'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.',
749
-	'texte_choix_base_3' => '<b>Escolha</b> abaixo a que lhe foi atribuída pelo seu serviço de hospedagem:',
750
-	'texte_choix_table_prefix' => 'Prefixo das tabelas:',
751
-	'texte_compte_element' => '@count@ elemento',
752
-	'texte_compte_elements' => '@count@ elementos',
753
-	'texte_conflit_edition_correction' => 'Por favor, controle abaixo as diferenças entre as duas versões do texto; você pode também copiar as suas modificações e depois recomeçar.',
754
-	'texte_connexion_mysql' => 'Consulte as informações fornecidas pelo seu serviço de hospedagem: nelas, você deverá encontrar o servidor de base de dados fornecido e os seus dados de conexão ao servidor SQL.',
755
-	'texte_contenu_article' => '(Conteúdo da matéria em poucas palavras.)',
756
-	'texte_contenu_articles' => 'De acordo com o layout adotado pelo seu site, você poderá decidir se certos elementos das matérias serão utilizados. Use a listagem abaixo para indicar quais elementos estão disponíveis.',
757
-	'texte_crash_base' => 'Se a sua base de dados se corrompeu, você poderá tentar uma reparação automática.',
758
-	'texte_creer_rubrique' => 'Antes de poder escrever matérias, você precisa criar uma seção.',
759
-	'texte_date_creation_article' => 'DATA DE CRIAÇÃO DA MATÉRIA:',
760
-	'texte_date_creation_objet' => 'Data de criação:', # on ajoute le &quot;:&quot;
761
-	'texte_date_publication_anterieure' => 'Data de redação anterior:',
762
-	'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redação anterior.',
763
-	'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:',
764
-	'texte_date_publication_objet' => 'Data de publicação online:',
765
-	'texte_definir_comme_traduction_rubrique' => 'Esta seção é uma tradução da seção número:',
766
-	'texte_descriptif_rapide' => 'Descrição rápida',
767
-	'texte_effacer_base' => 'Apagar a base de dados do SPIP',
768
-	'texte_effacer_statistiques' => 'Apagar as estatísticas',
769
-	'texte_en_cours_validation' => 'Os conteúdos abaixo estão propostos para publicação.',
770
-	'texte_enrichir_mise_a_jour' => 'Você pode enriquecer a diagramação do seu texto usando «atalhos tipográficos».',
771
-	'texte_fichier_authent' => '<b>O SPIP pode criar os arquivos especiais  <tt>.htpasswd</tt> e <tt>.htpasswd-admin</tt> no diretório @dossier@?</b><p>
727
+    // T
728
+    'tache_cron_asap' => 'Tarefa CRON @function@ (ASAP)',
729
+    'tache_cron_secondes' => 'Tarefa CRON @function@ (a cada @nb@ s)',
730
+    'taille_cache_image' => 'As imagens calculadas automaticamente pelo SPIP (ícones de documentos, títulos apresentados sob a forma gráfica, funções matemáticas em formato TeX...) ocupam, no diretório @dir@, um total de @taille@.',
731
+    'taille_cache_moins_de' => 'O tamanho do cache é menor do que @octets@.',
732
+    'taille_cache_octets' => 'O tamanho atual do cache é de cerca de @octets@.',
733
+    'taille_cache_vide' => 'O cache está vazio.',
734
+    'taille_repertoire_cache' => 'Tamanho do diretório cache',
735
+    'text_article_propose_publication' => 'Matéria proposta para publicação.',
736
+    'texte_acces_ldap_anonyme_1' => 'Alguns servidores LDAP não aceitam nenhum acesso anônimo. Neste caso, é necessário especificar um identificador de acesso inicial de modo a poder, em seguida, pesquisar as informações no diretório. Na maior parte dos casos, entretanto, os campos a seguir poderão ser deixados em branco.',
737
+    'texte_admin_effacer_01' => 'Este comando apaga <i>todo</i> o conteúdo da base de dados,incluindo <i>todos</i> os acessos dos redatores e administradores. Após executá-lo, você deverá reinstalar o SPIP para recriar uma nova base de dados bem como um acesso inicial de administrador.',
738
+    'texte_adresse_annuaire_1' => '(Se o seu diretório está instalado na mesma máquina que este website, trata-se provavelmente de «localhost».)',
739
+    'texte_ajout_auteur' => 'O autor a seguir foi incluído na matéria:',
740
+    'texte_annuaire_ldap_1' => 'Se você tem acesso a um diretório LDAP, você poderá utilizá-lo para importar automaticamente os usuários para o SPIP.',
741
+    'texte_article_statut' => 'Esta matéria está:',
742
+    'texte_article_virtuel' => 'Matéria virtual',
743
+    'texte_article_virtuel_reference' => '<b>Matéria virtual:</b> matéria referenciada no seu site SPIP, mas redirecionada para um outro URL. Para cancelar o redirecionamento, apague o URL abaixo.',
744
+    'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"',
745
+    'texte_auteur_messagerie' => 'Este site pode monitorar permanentemente a lista de editores conectados, permitindo-lhe trocar mensagens em tempo real. Você pode decidir não aparecer nessa lista (ficando "invisível" para os outros usuários).',
746
+    'texte_auteurs' => 'OS AUTORES',
747
+    'texte_choix_base_1' => 'Escolha a sua base:',
748
+    'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.',
749
+    'texte_choix_base_3' => '<b>Escolha</b> abaixo a que lhe foi atribuída pelo seu serviço de hospedagem:',
750
+    'texte_choix_table_prefix' => 'Prefixo das tabelas:',
751
+    'texte_compte_element' => '@count@ elemento',
752
+    'texte_compte_elements' => '@count@ elementos',
753
+    'texte_conflit_edition_correction' => 'Por favor, controle abaixo as diferenças entre as duas versões do texto; você pode também copiar as suas modificações e depois recomeçar.',
754
+    'texte_connexion_mysql' => 'Consulte as informações fornecidas pelo seu serviço de hospedagem: nelas, você deverá encontrar o servidor de base de dados fornecido e os seus dados de conexão ao servidor SQL.',
755
+    'texte_contenu_article' => '(Conteúdo da matéria em poucas palavras.)',
756
+    'texte_contenu_articles' => 'De acordo com o layout adotado pelo seu site, você poderá decidir se certos elementos das matérias serão utilizados. Use a listagem abaixo para indicar quais elementos estão disponíveis.',
757
+    'texte_crash_base' => 'Se a sua base de dados se corrompeu, você poderá tentar uma reparação automática.',
758
+    'texte_creer_rubrique' => 'Antes de poder escrever matérias, você precisa criar uma seção.',
759
+    'texte_date_creation_article' => 'DATA DE CRIAÇÃO DA MATÉRIA:',
760
+    'texte_date_creation_objet' => 'Data de criação:', # on ajoute le &quot;:&quot;
761
+    'texte_date_publication_anterieure' => 'Data de redação anterior:',
762
+    'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redação anterior.',
763
+    'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:',
764
+    'texte_date_publication_objet' => 'Data de publicação online:',
765
+    'texte_definir_comme_traduction_rubrique' => 'Esta seção é uma tradução da seção número:',
766
+    'texte_descriptif_rapide' => 'Descrição rápida',
767
+    'texte_effacer_base' => 'Apagar a base de dados do SPIP',
768
+    'texte_effacer_statistiques' => 'Apagar as estatísticas',
769
+    'texte_en_cours_validation' => 'Os conteúdos abaixo estão propostos para publicação.',
770
+    'texte_enrichir_mise_a_jour' => 'Você pode enriquecer a diagramação do seu texto usando «atalhos tipográficos».',
771
+    'texte_fichier_authent' => '<b>O SPIP pode criar os arquivos especiais  <tt>.htpasswd</tt> e <tt>.htpasswd-admin</tt> no diretório @dossier@?</b><p>
772 772
 Estes arquivos podem servir para restringir o acesso aos autores e administradores em outras áreas do seu site (programas externos de estatísticas, por exemplo).</p><p>
773 773
 Se eles não forem úteis, você poderá deixar esta opção com o seu valor padrão (sem criar os arquivos).</p>',
774
-	'texte_informations_personnelles_1' => 'O sistema vai criar agora um acesso personalizado ao site.',
775
-	'texte_informations_personnelles_2' => '(Nota: trata-se de uma reinstalação, se o seu acesso funciona corretamente, você pode',
776
-	'texte_introductif_article' => '(Texto introdutório da matéria.)',
777
-	'texte_jeu_caractere' => 'É aconselhável usar no seu site o alfabeto universal (<tt>utf-8</tt>): ele permite a exibição de textos em todos os idiomas, e não tem problemas de compatibilidade com os navegadores modernos.',
778
-	'texte_jeu_caractere_3' => 'O seu site está configurado atualmente com o conjunto de caracteres:',
779
-	'texte_jeu_caractere_4' => 'Se isso não corresponde à realidade dos seus dados (por ex., em seguimento a um restauro da base de dados), ou se <em>você lançou este site</em> e deseja utilizar um outro conjunto de caracteres, por favor, indique-o aqui:',
780
-	'texte_login_ldap_1' => '(Deixe em branco para acesso anônimo, ou informe o caminho completo, por exemplo «<tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt>».)',
781
-	'texte_login_precaution' => 'Atenção! Este é o login com o qual você está conectado agora. Use este formulário com cautela...',
782
-	'texte_messagerie_agenda' => 'As mensagens internas permitem que os redatores se comuniquem entre si, diretamente da área privada do site. Elas estão associadas a uma agenda.',
783
-	'texte_mise_a_niveau_base_1' => 'Você acabou de atualizar os arquivos do SPIP.
774
+    'texte_informations_personnelles_1' => 'O sistema vai criar agora um acesso personalizado ao site.',
775
+    'texte_informations_personnelles_2' => '(Nota: trata-se de uma reinstalação, se o seu acesso funciona corretamente, você pode',
776
+    'texte_introductif_article' => '(Texto introdutório da matéria.)',
777
+    'texte_jeu_caractere' => 'É aconselhável usar no seu site o alfabeto universal (<tt>utf-8</tt>): ele permite a exibição de textos em todos os idiomas, e não tem problemas de compatibilidade com os navegadores modernos.',
778
+    'texte_jeu_caractere_3' => 'O seu site está configurado atualmente com o conjunto de caracteres:',
779
+    'texte_jeu_caractere_4' => 'Se isso não corresponde à realidade dos seus dados (por ex., em seguimento a um restauro da base de dados), ou se <em>você lançou este site</em> e deseja utilizar um outro conjunto de caracteres, por favor, indique-o aqui:',
780
+    'texte_login_ldap_1' => '(Deixe em branco para acesso anônimo, ou informe o caminho completo, por exemplo «<tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt>».)',
781
+    'texte_login_precaution' => 'Atenção! Este é o login com o qual você está conectado agora. Use este formulário com cautela...',
782
+    'texte_messagerie_agenda' => 'As mensagens internas permitem que os redatores se comuniquem entre si, diretamente da área privada do site. Elas estão associadas a uma agenda.',
783
+    'texte_mise_a_niveau_base_1' => 'Você acabou de atualizar os arquivos do SPIP.
784 784
 Agora é necessário atualizar a base de dados do site.',
785
-	'texte_modifier_article' => 'Editar a matéria:',
786
-	'texte_multilinguisme' => 'Se você deseja gerar objetos em diversos idiomas, com uma navegação complexa, você pode incluir um menu de seleção de idioma nesses objetos, de acordo com a estrutura do seu site.',
787
-	'texte_multilinguisme_trad' => 'Você pode, igualmente, ativar um sistema de gerenciamento de links entre as diferentes traduções em certos objetos.',
788
-	'texte_non_compresse' => '<i>não compactado</i> (seu servidor não suporta esta funcionalidade)',
789
-	'texte_nouvelle_version_spip_1' => 'Você instalou uma nova versão do SPIP.',
790
-	'texte_nouvelle_version_spip_2' => 'Esta nova versão precisa de uma atualização mais completa do que o normal. Se você é o webmaster do site, por favor, apague o arquivo @connect@ e retome a instalação de forma a incluir os seus parâmetros de conexão à base de dados.<p> (NB.: se você não se lembra dos seus parâmetros de conexão, consulte o arquivo @connect@ antes de apagá-lo...)</p>',
791
-	'texte_operation_echec' => 'Volte à página anterior, escolha uma outra base de dados ou crie uma nova. Verifique as informações fornecidas pelo seu serviço de hospedagem.',
792
-	'texte_plus_trois_car' => 'mais de 3 caracteres',
793
-	'texte_plusieurs_articles' => 'Demasiados autores encontrados para "@cherche_auteur@":',
794
-	'texte_port_annuaire' => '(O valor padrão indicado é geralmente conveniente.)',
795
-	'texte_presente_plugin' => 'Esta página lista os plugins disponíveis para o site. Você pode ativar os plugins necessários marcando a opção correspondente.',
796
-	'texte_proposer_publication' => 'Assim que a sua matéria estiver pronta, você pode propor a sua publicação.',
797
-	'texte_proxy' => 'Em alguns casos (intranet, redes protegidas...), os sites remotos (documentação do SPIP, sites sindicados etc.) só estarão acessíveis através de um <i>proxy HTTP</i>. Nesse caso, informe abaixo o endereço, no formato @[email protected], você pode deixar este campo vazio.',
798
-	'texte_publication_articles_post_dates' => 'Que comportamento o SPIP deve adotar face às matérias em que a data de publicação está pré-datada?',
799
-	'texte_rappel_selection_champs' => '[Não se esqueça de selecionar corretamente este campo.]',
800
-	'texte_recalcul_page' => 'Se você quiser recalcular uma única página, passe para a área pública e clique no botão «atualizar».',
801
-	'texte_recuperer_base' => 'Reparar a base de dados',
802
-	'texte_reference_mais_redirige' => 'matéria referenciada no seu site em  SPIP, mas redirecionada para outro URL.',
803
-	'texte_requetes_echouent' => '<b>Já que certas solicitações SQL falharam sistematicamente e sem razão aparente, é possível que a causa esteja na base de dados em si.</b><p>
785
+    'texte_modifier_article' => 'Editar a matéria:',
786
+    'texte_multilinguisme' => 'Se você deseja gerar objetos em diversos idiomas, com uma navegação complexa, você pode incluir um menu de seleção de idioma nesses objetos, de acordo com a estrutura do seu site.',
787
+    'texte_multilinguisme_trad' => 'Você pode, igualmente, ativar um sistema de gerenciamento de links entre as diferentes traduções em certos objetos.',
788
+    'texte_non_compresse' => '<i>não compactado</i> (seu servidor não suporta esta funcionalidade)',
789
+    'texte_nouvelle_version_spip_1' => 'Você instalou uma nova versão do SPIP.',
790
+    'texte_nouvelle_version_spip_2' => 'Esta nova versão precisa de uma atualização mais completa do que o normal. Se você é o webmaster do site, por favor, apague o arquivo @connect@ e retome a instalação de forma a incluir os seus parâmetros de conexão à base de dados.<p> (NB.: se você não se lembra dos seus parâmetros de conexão, consulte o arquivo @connect@ antes de apagá-lo...)</p>',
791
+    'texte_operation_echec' => 'Volte à página anterior, escolha uma outra base de dados ou crie uma nova. Verifique as informações fornecidas pelo seu serviço de hospedagem.',
792
+    'texte_plus_trois_car' => 'mais de 3 caracteres',
793
+    'texte_plusieurs_articles' => 'Demasiados autores encontrados para "@cherche_auteur@":',
794
+    'texte_port_annuaire' => '(O valor padrão indicado é geralmente conveniente.)',
795
+    'texte_presente_plugin' => 'Esta página lista os plugins disponíveis para o site. Você pode ativar os plugins necessários marcando a opção correspondente.',
796
+    'texte_proposer_publication' => 'Assim que a sua matéria estiver pronta, você pode propor a sua publicação.',
797
+    'texte_proxy' => 'Em alguns casos (intranet, redes protegidas...), os sites remotos (documentação do SPIP, sites sindicados etc.) só estarão acessíveis através de um <i>proxy HTTP</i>. Nesse caso, informe abaixo o endereço, no formato @[email protected], você pode deixar este campo vazio.',
798
+    'texte_publication_articles_post_dates' => 'Que comportamento o SPIP deve adotar face às matérias em que a data de publicação está pré-datada?',
799
+    'texte_rappel_selection_champs' => '[Não se esqueça de selecionar corretamente este campo.]',
800
+    'texte_recalcul_page' => 'Se você quiser recalcular uma única página, passe para a área pública e clique no botão «atualizar».',
801
+    'texte_recuperer_base' => 'Reparar a base de dados',
802
+    'texte_reference_mais_redirige' => 'matéria referenciada no seu site em  SPIP, mas redirecionada para outro URL.',
803
+    'texte_requetes_echouent' => '<b>Já que certas solicitações SQL falharam sistematicamente e sem razão aparente, é possível que a causa esteja na base de dados em si.</b><p>
804 804
 O seu servidor SQL dispõe de uma funcionalidade de reparação das suas tabelas quando elas são danificadas por acidente. Você poderá tentar esta reparação; em caso de falha, conserve uma cópia da mensagem de erro, que poderá conter indícios do que não está funcionando...</p><p>
805 805
 Se o problema persistir, contate o seu serviço de hospedagem.</p>',
806
-	'texte_selection_langue_principale' => 'Você pode escolher abaixo o «idioma principal» do site. esta escolha não o obriga - felizmente! - a escrever as suas matérias no idioma selecionado, mas permite determinar:
806
+    'texte_selection_langue_principale' => 'Você pode escolher abaixo o «idioma principal» do site. esta escolha não o obriga - felizmente! - a escrever as suas matérias no idioma selecionado, mas permite determinar:
807 807
  <ul><li>o formato padrão das datas no site público;</li>
808 808
  <li>a natureza do motor tipográfico que o SPIP deverá usar para a composição dos textos;</li>
809 809
  <li>o idioma usado nos formulários do site público;</li>
810 810
  <li>o idioma padrão exibido na área privada.</li></ul>',
811
-	'texte_sous_titre' => 'Subtítulo',
812
-	'texte_statistiques_visites' => '(barras escuras:  domingo / curva escura: evolução da média)',
813
-	'texte_statut_attente_validation' => 'aguardando validação',
814
-	'texte_statut_publies' => 'publicadas online',
815
-	'texte_statut_refuses' => 'recusadas',
816
-	'texte_suppression_fichiers' => 'Use este comando para excluir todos os arquivos que constam do cache do SPIP. Isto permite, por exemplo, forçar a reconstrução de todas as páginas, caso você tenha feito alterações importantes no layout ou na estrutura do site.',
817
-	'texte_sur_titre' => 'Sobretítulo',
818
-	'texte_table_ok' => ': esta tabela está OK.',
819
-	'texte_tentative_recuperation' => 'Tentativa de reparação',
820
-	'texte_tenter_reparation' => 'Tentar uma reparação da base de dados',
821
-	'texte_test_proxy' => 'Para testar este proxy, informe aqui o endereço de um website que você deseje testar.',
822
-	'texte_titre_02' => 'Título:',
823
-	'texte_titre_obligatoire' => '<b>Título</b> [obrigatório]',
824
-	'texte_travail_article' => '@nom_auteur_modif@ trabalhou nesta matéria há @date_diff@ minutos',
825
-	'texte_travail_collaboratif' => 'Se é frequente acontecer de mais de um redator trabalhar em uma mesma matéria, o sistema pode exibir as matérias recentemente "abertas", de modo a evitar modificações concorrentes. Esta opção está desativada por padrão, para evitar a exibição de mensagens de aviso desnecessárias.',
826
-	'texte_vide' => 'vazia',
827
-	'texte_vider_cache' => 'Esvaziar o cache',
828
-	'titre_admin_tech' => 'Manutenção técnica',
829
-	'titre_admin_vider' => 'Manutenção técnica',
830
-	'titre_ajouter_un_auteur' => 'Incluir um autor',
831
-	'titre_ajouter_un_mot' => 'Incluir uma palavra-chave',
832
-	'titre_cadre_afficher_article' => 'Exibir as matérias',
833
-	'titre_cadre_afficher_traductions' => 'Exibir o status das traduções para os idiomas a seguir:',
834
-	'titre_cadre_ajouter_auteur' => 'INCLUIR UM AUTOR:',
835
-	'titre_cadre_interieur_rubrique' => 'Na seção',
836
-	'titre_cadre_numero_auteur' => 'AUTOR NÚMERO',
837
-	'titre_cadre_numero_objet' => '@objet@ NÚMERO:',
838
-	'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [obrigatório]<br />',
839
-	'titre_config_contenu_notifications' => 'Notificações',
840
-	'titre_config_contenu_prive' => 'Na área privada',
841
-	'titre_config_contenu_public' => 'No site público',
842
-	'titre_config_fonctions' => 'Configuração do site',
843
-	'titre_config_langage' => 'Configurar o idioma',
844
-	'titre_configuration' => 'Configuração do site',
845
-	'titre_configurer_preferences' => 'Configurar as suas preferências',
846
-	'titre_configurer_preferences_menus' => 'Configurar as suas preferências de menus',
847
-	'titre_conflit_edition' => 'Conflito durante a edição',
848
-	'titre_connexion_ldap' => 'Opções: <b>Sua conexão LDAP</b>',
849
-	'titre_groupe_mots' => 'GRUPO DE PALAVRAS-CHAVE:',
850
-	'titre_identite_site' => 'Identidade do site',
851
-	'titre_langue_article' => 'Idioma da matéria',
852
-	'titre_langue_rubrique' => 'Idioma da seção',
853
-	'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DA MATÉRIA',
854
-	'titre_les_articles' => 'AS MATÉRIAS',
855
-	'titre_messagerie_agenda' => 'Mensagens internas e agenda',
856
-	'titre_naviguer_dans_le_site' => 'Navegar no site...',
857
-	'titre_nouvelle_rubrique' => 'Nova seção',
858
-	'titre_numero_rubrique' => 'SEÇÃO NÚMERO:',
859
-	'titre_page_articles_edit' => 'Editar: @titre@',
860
-	'titre_page_articles_page' => 'As matérias',
861
-	'titre_page_articles_tous' => 'Todo o site',
862
-	'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@',
863
-	'titre_page_config_contenu' => 'Configuração do site',
864
-	'titre_page_delete_all' => 'supressão total e irreversível',
865
-	'titre_page_recherche' => 'Resultados da busca por @recherche@',
866
-	'titre_page_statistiques_referers' => 'Estatísticas (links de entrada)',
867
-	'titre_page_upgrade' => 'Atualização do SPIP',
868
-	'titre_preference_menus_favoris' => 'Menus favoritos',
869
-	'titre_publication_articles_post_dates' => 'Publicação de matérias pós-datadas',
870
-	'titre_reparation' => 'Reparação',
871
-	'titre_suivi_petition' => 'Acompanhamento das petições',
872
-	'tls_ldap' => 'Transport Layer Security:',
873
-	'trad_article_traduction' => 'Todas as versões desta matéria:',
874
-	'trad_delier' => 'Desvincular destas traduções',
875
-	'trad_lier' => 'Esta matéria é uma tradução da matéria número:',
876
-	'trad_new' => 'Escrever uma nova tradução',
811
+    'texte_sous_titre' => 'Subtítulo',
812
+    'texte_statistiques_visites' => '(barras escuras:  domingo / curva escura: evolução da média)',
813
+    'texte_statut_attente_validation' => 'aguardando validação',
814
+    'texte_statut_publies' => 'publicadas online',
815
+    'texte_statut_refuses' => 'recusadas',
816
+    'texte_suppression_fichiers' => 'Use este comando para excluir todos os arquivos que constam do cache do SPIP. Isto permite, por exemplo, forçar a reconstrução de todas as páginas, caso você tenha feito alterações importantes no layout ou na estrutura do site.',
817
+    'texte_sur_titre' => 'Sobretítulo',
818
+    'texte_table_ok' => ': esta tabela está OK.',
819
+    'texte_tentative_recuperation' => 'Tentativa de reparação',
820
+    'texte_tenter_reparation' => 'Tentar uma reparação da base de dados',
821
+    'texte_test_proxy' => 'Para testar este proxy, informe aqui o endereço de um website que você deseje testar.',
822
+    'texte_titre_02' => 'Título:',
823
+    'texte_titre_obligatoire' => '<b>Título</b> [obrigatório]',
824
+    'texte_travail_article' => '@nom_auteur_modif@ trabalhou nesta matéria há @date_diff@ minutos',
825
+    'texte_travail_collaboratif' => 'Se é frequente acontecer de mais de um redator trabalhar em uma mesma matéria, o sistema pode exibir as matérias recentemente "abertas", de modo a evitar modificações concorrentes. Esta opção está desativada por padrão, para evitar a exibição de mensagens de aviso desnecessárias.',
826
+    'texte_vide' => 'vazia',
827
+    'texte_vider_cache' => 'Esvaziar o cache',
828
+    'titre_admin_tech' => 'Manutenção técnica',
829
+    'titre_admin_vider' => 'Manutenção técnica',
830
+    'titre_ajouter_un_auteur' => 'Incluir um autor',
831
+    'titre_ajouter_un_mot' => 'Incluir uma palavra-chave',
832
+    'titre_cadre_afficher_article' => 'Exibir as matérias',
833
+    'titre_cadre_afficher_traductions' => 'Exibir o status das traduções para os idiomas a seguir:',
834
+    'titre_cadre_ajouter_auteur' => 'INCLUIR UM AUTOR:',
835
+    'titre_cadre_interieur_rubrique' => 'Na seção',
836
+    'titre_cadre_numero_auteur' => 'AUTOR NÚMERO',
837
+    'titre_cadre_numero_objet' => '@objet@ NÚMERO:',
838
+    'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [obrigatório]<br />',
839
+    'titre_config_contenu_notifications' => 'Notificações',
840
+    'titre_config_contenu_prive' => 'Na área privada',
841
+    'titre_config_contenu_public' => 'No site público',
842
+    'titre_config_fonctions' => 'Configuração do site',
843
+    'titre_config_langage' => 'Configurar o idioma',
844
+    'titre_configuration' => 'Configuração do site',
845
+    'titre_configurer_preferences' => 'Configurar as suas preferências',
846
+    'titre_configurer_preferences_menus' => 'Configurar as suas preferências de menus',
847
+    'titre_conflit_edition' => 'Conflito durante a edição',
848
+    'titre_connexion_ldap' => 'Opções: <b>Sua conexão LDAP</b>',
849
+    'titre_groupe_mots' => 'GRUPO DE PALAVRAS-CHAVE:',
850
+    'titre_identite_site' => 'Identidade do site',
851
+    'titre_langue_article' => 'Idioma da matéria',
852
+    'titre_langue_rubrique' => 'Idioma da seção',
853
+    'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DA MATÉRIA',
854
+    'titre_les_articles' => 'AS MATÉRIAS',
855
+    'titre_messagerie_agenda' => 'Mensagens internas e agenda',
856
+    'titre_naviguer_dans_le_site' => 'Navegar no site...',
857
+    'titre_nouvelle_rubrique' => 'Nova seção',
858
+    'titre_numero_rubrique' => 'SEÇÃO NÚMERO:',
859
+    'titre_page_articles_edit' => 'Editar: @titre@',
860
+    'titre_page_articles_page' => 'As matérias',
861
+    'titre_page_articles_tous' => 'Todo o site',
862
+    'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@',
863
+    'titre_page_config_contenu' => 'Configuração do site',
864
+    'titre_page_delete_all' => 'supressão total e irreversível',
865
+    'titre_page_recherche' => 'Resultados da busca por @recherche@',
866
+    'titre_page_statistiques_referers' => 'Estatísticas (links de entrada)',
867
+    'titre_page_upgrade' => 'Atualização do SPIP',
868
+    'titre_preference_menus_favoris' => 'Menus favoritos',
869
+    'titre_publication_articles_post_dates' => 'Publicação de matérias pós-datadas',
870
+    'titre_reparation' => 'Reparação',
871
+    'titre_suivi_petition' => 'Acompanhamento das petições',
872
+    'tls_ldap' => 'Transport Layer Security:',
873
+    'trad_article_traduction' => 'Todas as versões desta matéria:',
874
+    'trad_delier' => 'Desvincular destas traduções',
875
+    'trad_lier' => 'Esta matéria é uma tradução da matéria número:',
876
+    'trad_new' => 'Escrever uma nova tradução',
877 877
 
878
-	// U
879
-	'utf8_convert_erreur_orig' => 'Erro: o conjunto de caracteres @charset@ não é suportado.',
878
+    // U
879
+    'utf8_convert_erreur_orig' => 'Erro: o conjunto de caracteres @charset@ não é suportado.',
880 880
 
881
-	// V
882
-	'version' => 'Versão:',
881
+    // V
882
+    'version' => 'Versão:',
883 883
 ];
Please login to merge, or discard this patch.
ecrire/inc/charsets.php 2 patches
Indentation   +632 added lines, -632 removed lines patch added patch discarded remove patch
@@ -21,7 +21,7 @@  discard block
 block discarded – undo
21 21
 
22 22
 // securité
23 23
 if (!defined('_ECRIRE_INC_VERSION')) {
24
-	return;
24
+    return;
25 25
 }
26 26
 
27 27
 // se faciliter la lecture du charset
@@ -31,19 +31,19 @@  discard block
 block discarded – undo
31 31
  * Initialisation
32 32
  */
33 33
 function init_charset(): void {
34
-	// Initialisation
35
-	$GLOBALS['CHARSET'] = [];
36
-
37
-	// noter a l'occasion dans la meta pcre_u notre capacite a utiliser le flag /u
38
-	// dans les preg_replace pour ne pas casser certaines lettres accentuees :
39
-	// en utf-8 chr(195).chr(160) = a` alors qu'en iso-latin chr(160) = nbsp
40
-	if (
41
-		!isset($GLOBALS['meta']['pcre_u'])
42
-		|| isset($_GET['var_mode']) && !isset($_GET['var_profile'])
43
-	) {
44
-		include_spip('inc/meta');
45
-		ecrire_meta('pcre_u', (lire_config('charset', _DEFAULT_CHARSET) === 'utf-8') ? 'u' : '');
46
-	}
34
+    // Initialisation
35
+    $GLOBALS['CHARSET'] = [];
36
+
37
+    // noter a l'occasion dans la meta pcre_u notre capacite a utiliser le flag /u
38
+    // dans les preg_replace pour ne pas casser certaines lettres accentuees :
39
+    // en utf-8 chr(195).chr(160) = a` alors qu'en iso-latin chr(160) = nbsp
40
+    if (
41
+        !isset($GLOBALS['meta']['pcre_u'])
42
+        || isset($_GET['var_mode']) && !isset($_GET['var_profile'])
43
+    ) {
44
+        include_spip('inc/meta');
45
+        ecrire_meta('pcre_u', (lire_config('charset', _DEFAULT_CHARSET) === 'utf-8') ? 'u' : '');
46
+    }
47 47
 }
48 48
 
49 49
 // TODO: code d’exécution en dehors du fichier.
@@ -64,39 +64,39 @@  discard block
 block discarded – undo
64 64
  *     - false si le charset n'est pas décrit dans le répertoire charsets/
65 65
  **/
66 66
 function load_charset($charset = 'AUTO') {
67
-	if ($charset == 'AUTO') {
68
-		$charset = $GLOBALS['meta']['charset'];
69
-	}
70
-	$charset = trim(strtolower((string) $charset));
71
-	if (isset($GLOBALS['CHARSET'][$charset])) {
72
-		return $charset;
73
-	}
74
-
75
-	if ($charset == 'utf-8') {
76
-		$GLOBALS['CHARSET'][$charset] = [];
77
-
78
-		return $charset;
79
-	}
80
-
81
-	// Quelques synonymes
82
-	if ($charset === '') {
83
-		$charset = 'iso-8859-1';
84
-	} elseif ($charset === 'windows-1250') {
85
-		$charset = 'cp1250';
86
-	} elseif ($charset === 'windows-1251') {
87
-		$charset = 'cp1251';
88
-	} elseif ($charset === 'windows-1256') {
89
-		$charset = 'cp1256';
90
-	}
91
-
92
-	if (find_in_path($charset . '.php', 'charsets/', true)) {
93
-		return $charset;
94
-	} else {
95
-		spip_log("Erreur: pas de fichier de conversion 'charsets/$charset'");
96
-		$GLOBALS['CHARSET'][$charset] = [];
97
-
98
-		return false;
99
-	}
67
+    if ($charset == 'AUTO') {
68
+        $charset = $GLOBALS['meta']['charset'];
69
+    }
70
+    $charset = trim(strtolower((string) $charset));
71
+    if (isset($GLOBALS['CHARSET'][$charset])) {
72
+        return $charset;
73
+    }
74
+
75
+    if ($charset == 'utf-8') {
76
+        $GLOBALS['CHARSET'][$charset] = [];
77
+
78
+        return $charset;
79
+    }
80
+
81
+    // Quelques synonymes
82
+    if ($charset === '') {
83
+        $charset = 'iso-8859-1';
84
+    } elseif ($charset === 'windows-1250') {
85
+        $charset = 'cp1250';
86
+    } elseif ($charset === 'windows-1251') {
87
+        $charset = 'cp1251';
88
+    } elseif ($charset === 'windows-1256') {
89
+        $charset = 'cp1256';
90
+    }
91
+
92
+    if (find_in_path($charset . '.php', 'charsets/', true)) {
93
+        return $charset;
94
+    } else {
95
+        spip_log("Erreur: pas de fichier de conversion 'charsets/$charset'");
96
+        $GLOBALS['CHARSET'][$charset] = [];
97
+
98
+        return false;
99
+    }
100 100
 }
101 101
 
102 102
 
@@ -109,19 +109,19 @@  discard block
 block discarded – undo
109 109
  *     true si notre charset est utilisable par mb_strsing
110 110
  **/
111 111
 function init_mb_string(): bool {
112
-	static $mb;
113
-
114
-	// verifier que le charset interne est connu de mb_string
115
-	if (!$mb) {
116
-		if (mb_detect_order(lire_config('charset', _DEFAULT_CHARSET))) {
117
-			mb_internal_encoding('utf-8');
118
-			$mb = 1;
119
-		} else {
120
-			$mb = -1;
121
-		}
122
-	}
123
-
124
-	return ($mb === 1);
112
+    static $mb;
113
+
114
+    // verifier que le charset interne est connu de mb_string
115
+    if (!$mb) {
116
+        if (mb_detect_order(lire_config('charset', _DEFAULT_CHARSET))) {
117
+            mb_internal_encoding('utf-8');
118
+            $mb = 1;
119
+        } else {
120
+            $mb = -1;
121
+        }
122
+    }
123
+
124
+    return ($mb === 1);
125 125
 }
126 126
 
127 127
 /**
@@ -136,17 +136,17 @@  discard block
 block discarded – undo
136 136
  *     true si iconv fonctionne correctement
137 137
  **/
138 138
 function test_iconv(): bool {
139
-	static $iconv_ok;
139
+    static $iconv_ok;
140 140
 
141
-	if (!$iconv_ok) {
142
-		if (!function_exists('iconv')) {
143
-			$iconv_ok = -1;
144
-		} else {
145
-			$iconv_ok = utf_32_to_unicode(@iconv('utf-8', 'utf-32', 'chaine de test')) === 'chaine de test' ? 1 : -1;
146
-		}
147
-	}
141
+    if (!$iconv_ok) {
142
+        if (!function_exists('iconv')) {
143
+            $iconv_ok = -1;
144
+        } else {
145
+            $iconv_ok = utf_32_to_unicode(@iconv('utf-8', 'utf-32', 'chaine de test')) === 'chaine de test' ? 1 : -1;
146
+        }
147
+    }
148 148
 
149
-	return ($iconv_ok === 1);
149
+    return ($iconv_ok === 1);
150 150
 }
151 151
 
152 152
 /**
@@ -166,75 +166,75 @@  discard block
 block discarded – undo
166 166
  *     texte corrigé
167 167
  **/
168 168
 function corriger_caracteres_windows($texte, $charset = 'AUTO', $charset_cible = 'unicode') {
169
-	static $trans;
170
-
171
-	if (is_array($texte)) {
172
-		return array_map('corriger_caracteres_windows', $texte);
173
-	}
174
-
175
-	if ($charset == 'AUTO') {
176
-		$charset = lire_config('charset', _DEFAULT_CHARSET);
177
-	}
178
-	if ($charset == 'utf-8') {
179
-		$p = chr(194);
180
-		if (!str_contains($texte, $p)) {
181
-			return $texte;
182
-		}
183
-	} else {
184
-		if ($charset == 'iso-8859-1') {
185
-			$p = '';
186
-		} else {
187
-			return $texte;
188
-		}
189
-	}
190
-
191
-	if (!isset($trans[$charset][$charset_cible])) {
192
-		$trans[$charset][$charset_cible] = [
193
-			$p . chr(128) => '&#8364;',
194
-			$p . chr(129) => ' ', # pas affecte
195
-			$p . chr(130) => '&#8218;',
196
-			$p . chr(131) => '&#402;',
197
-			$p . chr(132) => '&#8222;',
198
-			$p . chr(133) => '&#8230;',
199
-			$p . chr(134) => '&#8224;',
200
-			$p . chr(135) => '&#8225;',
201
-			$p . chr(136) => '&#710;',
202
-			$p . chr(137) => '&#8240;',
203
-			$p . chr(138) => '&#352;',
204
-			$p . chr(139) => '&#8249;',
205
-			$p . chr(140) => '&#338;',
206
-			$p . chr(141) => ' ', # pas affecte
207
-			$p . chr(142) => '&#381;',
208
-			$p . chr(143) => ' ', # pas affecte
209
-			$p . chr(144) => ' ', # pas affecte
210
-			$p . chr(145) => '&#8216;',
211
-			$p . chr(146) => '&#8217;',
212
-			$p . chr(147) => '&#8220;',
213
-			$p . chr(148) => '&#8221;',
214
-			$p . chr(149) => '&#8226;',
215
-			$p . chr(150) => '&#8211;',
216
-			$p . chr(151) => '&#8212;',
217
-			$p . chr(152) => '&#732;',
218
-			$p . chr(153) => '&#8482;',
219
-			$p . chr(154) => '&#353;',
220
-			$p . chr(155) => '&#8250;',
221
-			$p . chr(156) => '&#339;',
222
-			$p . chr(157) => ' ', # pas affecte
223
-			$p . chr(158) => '&#382;',
224
-			$p . chr(159) => '&#376;',
225
-		];
226
-		if ($charset_cible != 'unicode') {
227
-			foreach ($trans[$charset][$charset_cible] as $k => $c) {
228
-				$trans[$charset][$charset_cible][$k] = unicode2charset($c, $charset_cible);
229
-			}
230
-		}
231
-	}
232
-
233
-	return @str_replace(
234
-		array_keys($trans[$charset][$charset_cible]),
235
-		array_values($trans[$charset][$charset_cible]),
236
-		$texte
237
-	);
169
+    static $trans;
170
+
171
+    if (is_array($texte)) {
172
+        return array_map('corriger_caracteres_windows', $texte);
173
+    }
174
+
175
+    if ($charset == 'AUTO') {
176
+        $charset = lire_config('charset', _DEFAULT_CHARSET);
177
+    }
178
+    if ($charset == 'utf-8') {
179
+        $p = chr(194);
180
+        if (!str_contains($texte, $p)) {
181
+            return $texte;
182
+        }
183
+    } else {
184
+        if ($charset == 'iso-8859-1') {
185
+            $p = '';
186
+        } else {
187
+            return $texte;
188
+        }
189
+    }
190
+
191
+    if (!isset($trans[$charset][$charset_cible])) {
192
+        $trans[$charset][$charset_cible] = [
193
+            $p . chr(128) => '&#8364;',
194
+            $p . chr(129) => ' ', # pas affecte
195
+            $p . chr(130) => '&#8218;',
196
+            $p . chr(131) => '&#402;',
197
+            $p . chr(132) => '&#8222;',
198
+            $p . chr(133) => '&#8230;',
199
+            $p . chr(134) => '&#8224;',
200
+            $p . chr(135) => '&#8225;',
201
+            $p . chr(136) => '&#710;',
202
+            $p . chr(137) => '&#8240;',
203
+            $p . chr(138) => '&#352;',
204
+            $p . chr(139) => '&#8249;',
205
+            $p . chr(140) => '&#338;',
206
+            $p . chr(141) => ' ', # pas affecte
207
+            $p . chr(142) => '&#381;',
208
+            $p . chr(143) => ' ', # pas affecte
209
+            $p . chr(144) => ' ', # pas affecte
210
+            $p . chr(145) => '&#8216;',
211
+            $p . chr(146) => '&#8217;',
212
+            $p . chr(147) => '&#8220;',
213
+            $p . chr(148) => '&#8221;',
214
+            $p . chr(149) => '&#8226;',
215
+            $p . chr(150) => '&#8211;',
216
+            $p . chr(151) => '&#8212;',
217
+            $p . chr(152) => '&#732;',
218
+            $p . chr(153) => '&#8482;',
219
+            $p . chr(154) => '&#353;',
220
+            $p . chr(155) => '&#8250;',
221
+            $p . chr(156) => '&#339;',
222
+            $p . chr(157) => ' ', # pas affecte
223
+            $p . chr(158) => '&#382;',
224
+            $p . chr(159) => '&#376;',
225
+        ];
226
+        if ($charset_cible != 'unicode') {
227
+            foreach ($trans[$charset][$charset_cible] as $k => $c) {
228
+                $trans[$charset][$charset_cible][$k] = unicode2charset($c, $charset_cible);
229
+            }
230
+        }
231
+    }
232
+
233
+    return @str_replace(
234
+        array_keys($trans[$charset][$charset_cible]),
235
+        array_values($trans[$charset][$charset_cible]),
236
+        $texte
237
+    );
238 238
 }
239 239
 
240 240
 
@@ -251,31 +251,31 @@  discard block
 block discarded – undo
251 251
  *     texte converti
252 252
  **/
253 253
 function html2unicode(string $texte, bool $secure = false): string {
254
-	static $trans = [];
255
-
256
-	if ($texte === null || $texte === '') {
257
-		return '';
258
-	}
259
-	if (!str_contains($texte, '&')) {
260
-		return $texte;
261
-	}
262
-
263
-	if (!$trans) {
264
-		load_charset('html');
265
-		foreach ($GLOBALS['CHARSET']['html'] as $key => $val) {
266
-			$trans["&$key;"] = $val;
267
-		}
268
-	}
269
-
270
-	$texte = str_replace(array_keys($trans), array_values($trans), $texte);
271
-	if (!$secure) {
272
-		$texte = str_replace(
273
-			['&amp;', '&quot;', '&lt;', '&gt;'],
274
-			['&', '"', '<', '>'],
275
-			$texte
276
-		);
277
-	}
278
-	return $texte;
254
+    static $trans = [];
255
+
256
+    if ($texte === null || $texte === '') {
257
+        return '';
258
+    }
259
+    if (!str_contains($texte, '&')) {
260
+        return $texte;
261
+    }
262
+
263
+    if (!$trans) {
264
+        load_charset('html');
265
+        foreach ($GLOBALS['CHARSET']['html'] as $key => $val) {
266
+            $trans["&$key;"] = $val;
267
+        }
268
+    }
269
+
270
+    $texte = str_replace(array_keys($trans), array_values($trans), $texte);
271
+    if (!$secure) {
272
+        $texte = str_replace(
273
+            ['&amp;', '&quot;', '&lt;', '&gt;'],
274
+            ['&', '"', '<', '>'],
275
+            $texte
276
+        );
277
+    }
278
+    return $texte;
279 279
 }
280 280
 
281 281
 
@@ -290,16 +290,16 @@  discard block
 block discarded – undo
290 290
  *     texte converti
291 291
  **/
292 292
 function mathml2unicode($texte) {
293
-	static $trans;
294
-	if (!$trans) {
295
-		load_charset('mathml');
293
+    static $trans;
294
+    if (!$trans) {
295
+        load_charset('mathml');
296 296
 
297
-		foreach ($GLOBALS['CHARSET']['mathml'] as $key => $val) {
298
-			$trans["&$key;"] = $val;
299
-		}
300
-	}
297
+        foreach ($GLOBALS['CHARSET']['mathml'] as $key => $val) {
298
+            $trans["&$key;"] = $val;
299
+        }
300
+    }
301 301
 
302
-	return str_replace(array_keys($trans), array_values($trans), $texte);
302
+    return str_replace(array_keys($trans), array_values($trans), $texte);
303 303
 }
304 304
 
305 305
 
@@ -321,74 +321,74 @@  discard block
 block discarded – undo
321 321
  *     texte converti en unicode
322 322
  **/
323 323
 function charset2unicode(?string $texte, string $charset = 'AUTO' /* $forcer: obsolete*/) {
324
-	static $trans;
325
-
326
-	if ($texte === null || $texte === '') {
327
-		return '';
328
-	}
329
-
330
-	if ($charset === 'AUTO') {
331
-		$charset = lire_config('charset', _DEFAULT_CHARSET);
332
-	}
333
-
334
-	if ($charset === '') {
335
-		$charset = 'iso-8859-1';
336
-	}
337
-	$charset = strtolower((string) $charset);
338
-
339
-	switch ($charset) {
340
-		case 'utf-8':
341
-		case 'utf8':
342
-			return utf_8_to_unicode($texte);
343
-
344
-		case 'iso-8859-1':
345
-			$texte = corriger_caracteres_windows($texte, 'iso-8859-1');
346
-		// pas de break; ici, on suit sur default:
347
-
348
-		default:
349
-			// mbstring presente ?
350
-			if (init_mb_string()) {
351
-				$order = mb_detect_order();
352
-				try {
353
-					# mb_string connait-il $charset?
354
-					if ($order && mb_detect_order($charset)) {
355
-						$s = mb_convert_encoding($texte, 'utf-8', $charset);
356
-						if ($s && $s != $texte) {
357
-							return utf_8_to_unicode($s);
358
-						}
359
-					}
360
-				} catch (\Error) {
361
-					// Le charset n'existe probablement pas
362
-				} finally {
363
-					mb_detect_order($order); # remettre comme precedemment
364
-				}
365
-			}
366
-
367
-			// Sinon, peut-etre connaissons-nous ce charset ?
368
-			if (!isset($trans[$charset]) && (($cset = load_charset($charset)) && is_array($GLOBALS['CHARSET'][$cset]))) {
369
-				foreach ($GLOBALS['CHARSET'][$cset] as $key => $val) {
370
-					$trans[$charset][chr($key)] = '&#' . $val . ';';
371
-				}
372
-			}
373
-			if (isset($trans[$charset]) && (is_countable($trans[$charset]) ? count($trans[$charset]) : 0)) {
374
-				return str_replace(array_keys($trans[$charset]), array_values($trans[$charset]), $texte);
375
-			}
376
-
377
-			// Sinon demander a iconv (malgre le fait qu'il coupe quand un
378
-			// caractere n'appartient pas au charset, mais c'est un probleme
379
-			// surtout en utf-8, gere ci-dessus)
380
-			if (test_iconv()) {
381
-				$s = iconv($charset, 'utf-32le', $texte);
382
-				if ($s) {
383
-					return utf_32_to_unicode($s);
384
-				}
385
-			}
386
-
387
-			// Au pire ne rien faire
388
-			spip_log("erreur charset '$charset' non supporte");
389
-
390
-			return $texte;
391
-	}
324
+    static $trans;
325
+
326
+    if ($texte === null || $texte === '') {
327
+        return '';
328
+    }
329
+
330
+    if ($charset === 'AUTO') {
331
+        $charset = lire_config('charset', _DEFAULT_CHARSET);
332
+    }
333
+
334
+    if ($charset === '') {
335
+        $charset = 'iso-8859-1';
336
+    }
337
+    $charset = strtolower((string) $charset);
338
+
339
+    switch ($charset) {
340
+        case 'utf-8':
341
+        case 'utf8':
342
+            return utf_8_to_unicode($texte);
343
+
344
+        case 'iso-8859-1':
345
+            $texte = corriger_caracteres_windows($texte, 'iso-8859-1');
346
+        // pas de break; ici, on suit sur default:
347
+
348
+        default:
349
+            // mbstring presente ?
350
+            if (init_mb_string()) {
351
+                $order = mb_detect_order();
352
+                try {
353
+                    # mb_string connait-il $charset?
354
+                    if ($order && mb_detect_order($charset)) {
355
+                        $s = mb_convert_encoding($texte, 'utf-8', $charset);
356
+                        if ($s && $s != $texte) {
357
+                            return utf_8_to_unicode($s);
358
+                        }
359
+                    }
360
+                } catch (\Error) {
361
+                    // Le charset n'existe probablement pas
362
+                } finally {
363
+                    mb_detect_order($order); # remettre comme precedemment
364
+                }
365
+            }
366
+
367
+            // Sinon, peut-etre connaissons-nous ce charset ?
368
+            if (!isset($trans[$charset]) && (($cset = load_charset($charset)) && is_array($GLOBALS['CHARSET'][$cset]))) {
369
+                foreach ($GLOBALS['CHARSET'][$cset] as $key => $val) {
370
+                    $trans[$charset][chr($key)] = '&#' . $val . ';';
371
+                }
372
+            }
373
+            if (isset($trans[$charset]) && (is_countable($trans[$charset]) ? count($trans[$charset]) : 0)) {
374
+                return str_replace(array_keys($trans[$charset]), array_values($trans[$charset]), $texte);
375
+            }
376
+
377
+            // Sinon demander a iconv (malgre le fait qu'il coupe quand un
378
+            // caractere n'appartient pas au charset, mais c'est un probleme
379
+            // surtout en utf-8, gere ci-dessus)
380
+            if (test_iconv()) {
381
+                $s = iconv($charset, 'utf-32le', $texte);
382
+                if ($s) {
383
+                    return utf_32_to_unicode($s);
384
+                }
385
+            }
386
+
387
+            // Au pire ne rien faire
388
+            spip_log("erreur charset '$charset' non supporte");
389
+
390
+            return $texte;
391
+    }
392 392
 }
393 393
 
394 394
 
@@ -407,42 +407,42 @@  discard block
 block discarded – undo
407 407
  *     texte transformé dans le charset souhaité
408 408
  **/
409 409
 function unicode2charset($texte, $charset = 'AUTO') {
410
-	static $CHARSET_REVERSE = [];
411
-	static $trans = [];
412
-
413
-	if ($charset == 'AUTO') {
414
-		$charset = lire_config('charset', _DEFAULT_CHARSET);
415
-	}
416
-
417
-	switch ($charset) {
418
-		case 'utf-8':
419
-			return unicode_to_utf_8($texte);
420
-
421
-		default:
422
-			$charset = load_charset($charset);
423
-
424
-			if (empty($CHARSET_REVERSE[$charset])) {
425
-				$CHARSET_REVERSE[$charset] = array_flip($GLOBALS['CHARSET'][$charset]);
426
-			}
427
-
428
-			if (!isset($trans[$charset])) {
429
-				$trans[$charset] = [];
430
-				$t = &$trans[$charset];
431
-				for ($e = 128; $e < 255; $e++) {
432
-					$h = dechex($e);
433
-					if ($s = isset($CHARSET_REVERSE[$charset][$e])) {
434
-						$s = $CHARSET_REVERSE[$charset][$e];
435
-						$t['&#' . $e . ';'] = $t['&#0' . $e . ';'] = $t['&#00' . $e . ';'] = chr($s);
436
-						$t['&#x' . $h . ';'] = $t['&#x0' . $h . ';'] = $t['&#x00' . $h . ';'] = chr($s);
437
-					} else {
438
-						$t['&#' . $e . ';'] = $t['&#0' . $e . ';'] = $t['&#00' . $e . ';'] = chr($e);
439
-						$t['&#x' . $h . ';'] = $t['&#x0' . $h . ';'] = $t['&#x00' . $h . ';'] = chr($e);
440
-					}
441
-				}
442
-			}
443
-
444
-			return str_replace(array_keys($trans[$charset]), array_values($trans[$charset]), $texte);
445
-	}
410
+    static $CHARSET_REVERSE = [];
411
+    static $trans = [];
412
+
413
+    if ($charset == 'AUTO') {
414
+        $charset = lire_config('charset', _DEFAULT_CHARSET);
415
+    }
416
+
417
+    switch ($charset) {
418
+        case 'utf-8':
419
+            return unicode_to_utf_8($texte);
420
+
421
+        default:
422
+            $charset = load_charset($charset);
423
+
424
+            if (empty($CHARSET_REVERSE[$charset])) {
425
+                $CHARSET_REVERSE[$charset] = array_flip($GLOBALS['CHARSET'][$charset]);
426
+            }
427
+
428
+            if (!isset($trans[$charset])) {
429
+                $trans[$charset] = [];
430
+                $t = &$trans[$charset];
431
+                for ($e = 128; $e < 255; $e++) {
432
+                    $h = dechex($e);
433
+                    if ($s = isset($CHARSET_REVERSE[$charset][$e])) {
434
+                        $s = $CHARSET_REVERSE[$charset][$e];
435
+                        $t['&#' . $e . ';'] = $t['&#0' . $e . ';'] = $t['&#00' . $e . ';'] = chr($s);
436
+                        $t['&#x' . $h . ';'] = $t['&#x0' . $h . ';'] = $t['&#x00' . $h . ';'] = chr($s);
437
+                    } else {
438
+                        $t['&#' . $e . ';'] = $t['&#0' . $e . ';'] = $t['&#00' . $e . ';'] = chr($e);
439
+                        $t['&#x' . $h . ';'] = $t['&#x0' . $h . ';'] = $t['&#x00' . $h . ';'] = chr($e);
440
+                    }
441
+                }
442
+            }
443
+
444
+            return str_replace(array_keys($trans[$charset]), array_values($trans[$charset]), $texte);
445
+    }
446 446
 }
447 447
 
448 448
 
@@ -460,39 +460,39 @@  discard block
 block discarded – undo
460 460
  *     texte transformé dans le charset site
461 461
  **/
462 462
 function importer_charset($texte, $charset = 'AUTO') {
463
-	$s = null;
464
-	static $trans = [];
465
-	// on traite le cas le plus frequent iso-8859-1 vers utf directement pour aller plus vite !
466
-	if (($charset == 'iso-8859-1') && ($GLOBALS['meta']['charset'] == 'utf-8')) {
467
-		$texte = corriger_caracteres_windows($texte, 'iso-8859-1', $GLOBALS['meta']['charset']);
468
-		if (init_mb_string()) {
469
-			if (
470
-				($order = mb_detect_order())
471
-				&& mb_detect_order($charset)
472
-			) {
473
-				$s = mb_convert_encoding($texte, 'utf-8', $charset);
474
-			}
475
-			mb_detect_order($order); # remettre comme precedemment
476
-			return $s;
477
-		}
478
-		// Sinon, peut-etre connaissons-nous ce charset ?
479
-		if (
480
-			!isset($trans[$charset])
481
-			&& (($cset = load_charset($charset))
482
-			&& is_array($GLOBALS['CHARSET'][$cset]))
483
-		) {
484
-			foreach ($GLOBALS['CHARSET'][$cset] as $key => $val) {
485
-				$trans[$charset][chr($key)] = unicode2charset('&#' . $val . ';');
486
-			}
487
-		}
488
-		if (is_countable($trans[$charset]) ? count($trans[$charset]) : 0) {
489
-			return str_replace(array_keys($trans[$charset]), array_values($trans[$charset]), $texte);
490
-		}
491
-
492
-		return $texte;
493
-	}
494
-
495
-	return unicode2charset(charset2unicode($texte, $charset));
463
+    $s = null;
464
+    static $trans = [];
465
+    // on traite le cas le plus frequent iso-8859-1 vers utf directement pour aller plus vite !
466
+    if (($charset == 'iso-8859-1') && ($GLOBALS['meta']['charset'] == 'utf-8')) {
467
+        $texte = corriger_caracteres_windows($texte, 'iso-8859-1', $GLOBALS['meta']['charset']);
468
+        if (init_mb_string()) {
469
+            if (
470
+                ($order = mb_detect_order())
471
+                && mb_detect_order($charset)
472
+            ) {
473
+                $s = mb_convert_encoding($texte, 'utf-8', $charset);
474
+            }
475
+            mb_detect_order($order); # remettre comme precedemment
476
+            return $s;
477
+        }
478
+        // Sinon, peut-etre connaissons-nous ce charset ?
479
+        if (
480
+            !isset($trans[$charset])
481
+            && (($cset = load_charset($charset))
482
+            && is_array($GLOBALS['CHARSET'][$cset]))
483
+        ) {
484
+            foreach ($GLOBALS['CHARSET'][$cset] as $key => $val) {
485
+                $trans[$charset][chr($key)] = unicode2charset('&#' . $val . ';');
486
+            }
487
+        }
488
+        if (is_countable($trans[$charset]) ? count($trans[$charset]) : 0) {
489
+            return str_replace(array_keys($trans[$charset]), array_values($trans[$charset]), $texte);
490
+        }
491
+
492
+        return $texte;
493
+    }
494
+
495
+    return unicode2charset(charset2unicode($texte, $charset));
496 496
 }
497 497
 
498 498
 
@@ -508,92 +508,92 @@  discard block
 block discarded – undo
508 508
  **/
509 509
 function utf_8_to_unicode($source) {
510 510
 
511
-	// mb_string : methode rapide
512
-	if (init_mb_string()) {
513
-		$convmap = [0x7F, 0xFFFFFF, 0x0, 0xFFFFFF];
514
-
515
-		return mb_encode_numericentity($source, $convmap, 'UTF-8');
516
-	}
517
-
518
-	// Sinon methode pas a pas
519
-	static $decrement;
520
-	static $shift;
521
-
522
-	// Cf. php.net, par Ronen. Adapte pour compatibilite < php4
523
-	if (!is_array($decrement)) {
524
-		// array used to figure what number to decrement from character order value
525
-		// according to number of characters used to map unicode to ascii by utf-8
526
-		$decrement[4] = 240;
527
-		$decrement[3] = 224;
528
-		$decrement[2] = 192;
529
-		$decrement[1] = 0;
530
-		// the number of bits to shift each charNum by
531
-		$shift[1][0] = 0;
532
-		$shift[2][0] = 6;
533
-		$shift[2][1] = 0;
534
-		$shift[3][0] = 12;
535
-		$shift[3][1] = 6;
536
-		$shift[3][2] = 0;
537
-		$shift[4][0] = 18;
538
-		$shift[4][1] = 12;
539
-		$shift[4][2] = 6;
540
-		$shift[4][3] = 0;
541
-	}
542
-
543
-	$pos = 0;
544
-	$len = strlen($source);
545
-	$encodedString = '';
546
-	while ($pos < $len) {
547
-		$char = '';
548
-		$ischar = false;
549
-		$asciiPos = ord(substr($source, $pos, 1));
550
-		if (($asciiPos >= 240) && ($asciiPos <= 255)) {
551
-			// 4 chars representing one unicode character
552
-			$thisLetter = substr($source, $pos, 4);
553
-			$pos += 4;
554
-		} else {
555
-			if (($asciiPos >= 224) && ($asciiPos <= 239)) {
556
-				// 3 chars representing one unicode character
557
-				$thisLetter = substr($source, $pos, 3);
558
-				$pos += 3;
559
-			} else {
560
-				if (($asciiPos >= 192) && ($asciiPos <= 223)) {
561
-					// 2 chars representing one unicode character
562
-					$thisLetter = substr($source, $pos, 2);
563
-					$pos += 2;
564
-				} else {
565
-					// 1 char (lower ascii)
566
-					$thisLetter = substr($source, $pos, 1);
567
-					$pos += 1;
568
-					$char = $thisLetter;
569
-					$ischar = true;
570
-				}
571
-			}
572
-		}
573
-
574
-		if ($ischar) {
575
-			$encodedString .= $char;
576
-		} else {  // process the string representing the letter to a unicode entity
577
-			$thisLen = strlen($thisLetter);
578
-			$thisPos = 0;
579
-			$decimalCode = 0;
580
-			while ($thisPos < $thisLen) {
581
-				$thisCharOrd = ord(substr($thisLetter, $thisPos, 1));
582
-				if ($thisPos == 0) {
583
-					$charNum = (int) ($thisCharOrd - $decrement[$thisLen]);
584
-					$decimalCode += ($charNum << $shift[$thisLen][$thisPos]);
585
-				} else {
586
-					$charNum = (int) ($thisCharOrd - 128);
587
-					$decimalCode += ($charNum << $shift[$thisLen][$thisPos]);
588
-				}
589
-				$thisPos++;
590
-			}
591
-			$encodedLetter = '&#' . preg_replace('/^0+/', '', $decimalCode) . ';';
592
-			$encodedString .= $encodedLetter;
593
-		}
594
-	}
595
-
596
-	return $encodedString;
511
+    // mb_string : methode rapide
512
+    if (init_mb_string()) {
513
+        $convmap = [0x7F, 0xFFFFFF, 0x0, 0xFFFFFF];
514
+
515
+        return mb_encode_numericentity($source, $convmap, 'UTF-8');
516
+    }
517
+
518
+    // Sinon methode pas a pas
519
+    static $decrement;
520
+    static $shift;
521
+
522
+    // Cf. php.net, par Ronen. Adapte pour compatibilite < php4
523
+    if (!is_array($decrement)) {
524
+        // array used to figure what number to decrement from character order value
525
+        // according to number of characters used to map unicode to ascii by utf-8
526
+        $decrement[4] = 240;
527
+        $decrement[3] = 224;
528
+        $decrement[2] = 192;
529
+        $decrement[1] = 0;
530
+        // the number of bits to shift each charNum by
531
+        $shift[1][0] = 0;
532
+        $shift[2][0] = 6;
533
+        $shift[2][1] = 0;
534
+        $shift[3][0] = 12;
535
+        $shift[3][1] = 6;
536
+        $shift[3][2] = 0;
537
+        $shift[4][0] = 18;
538
+        $shift[4][1] = 12;
539
+        $shift[4][2] = 6;
540
+        $shift[4][3] = 0;
541
+    }
542
+
543
+    $pos = 0;
544
+    $len = strlen($source);
545
+    $encodedString = '';
546
+    while ($pos < $len) {
547
+        $char = '';
548
+        $ischar = false;
549
+        $asciiPos = ord(substr($source, $pos, 1));
550
+        if (($asciiPos >= 240) && ($asciiPos <= 255)) {
551
+            // 4 chars representing one unicode character
552
+            $thisLetter = substr($source, $pos, 4);
553
+            $pos += 4;
554
+        } else {
555
+            if (($asciiPos >= 224) && ($asciiPos <= 239)) {
556
+                // 3 chars representing one unicode character
557
+                $thisLetter = substr($source, $pos, 3);
558
+                $pos += 3;
559
+            } else {
560
+                if (($asciiPos >= 192) && ($asciiPos <= 223)) {
561
+                    // 2 chars representing one unicode character
562
+                    $thisLetter = substr($source, $pos, 2);
563
+                    $pos += 2;
564
+                } else {
565
+                    // 1 char (lower ascii)
566
+                    $thisLetter = substr($source, $pos, 1);
567
+                    $pos += 1;
568
+                    $char = $thisLetter;
569
+                    $ischar = true;
570
+                }
571
+            }
572
+        }
573
+
574
+        if ($ischar) {
575
+            $encodedString .= $char;
576
+        } else {  // process the string representing the letter to a unicode entity
577
+            $thisLen = strlen($thisLetter);
578
+            $thisPos = 0;
579
+            $decimalCode = 0;
580
+            while ($thisPos < $thisLen) {
581
+                $thisCharOrd = ord(substr($thisLetter, $thisPos, 1));
582
+                if ($thisPos == 0) {
583
+                    $charNum = (int) ($thisCharOrd - $decrement[$thisLen]);
584
+                    $decimalCode += ($charNum << $shift[$thisLen][$thisPos]);
585
+                } else {
586
+                    $charNum = (int) ($thisCharOrd - 128);
587
+                    $decimalCode += ($charNum << $shift[$thisLen][$thisPos]);
588
+                }
589
+                $thisPos++;
590
+            }
591
+            $encodedLetter = '&#' . preg_replace('/^0+/', '', $decimalCode) . ';';
592
+            $encodedString .= $encodedLetter;
593
+        }
594
+    }
595
+
596
+    return $encodedString;
597 597
 }
598 598
 
599 599
 /**
@@ -612,32 +612,32 @@  discard block
 block discarded – undo
612 612
  **/
613 613
 function utf_32_to_unicode($source) {
614 614
 
615
-	// mb_string : methode rapide
616
-	if (init_mb_string()) {
617
-		$convmap = [0x7F, 0xFFFFFF, 0x0, 0xFFFFFF];
618
-		$source = mb_encode_numericentity($source, $convmap, 'UTF-32LE');
619
-
620
-		return str_replace(chr(0), '', $source);
621
-	}
622
-
623
-	// Sinon methode lente
624
-	$texte = '';
625
-	while ($source) {
626
-		$words = unpack('V*', substr($source, 0, 1024));
627
-		$source = substr($source, 1024);
628
-		foreach ($words as $word) {
629
-			if ($word < 128) {
630
-				$texte .= chr($word);
631
-			} // ignorer le BOM - http://www.unicode.org/faq/utf_bom.html
632
-			else {
633
-				if ($word != 65279) {
634
-					$texte .= '&#' . $word . ';';
635
-				}
636
-			}
637
-		}
638
-	}
639
-
640
-	return $texte;
615
+    // mb_string : methode rapide
616
+    if (init_mb_string()) {
617
+        $convmap = [0x7F, 0xFFFFFF, 0x0, 0xFFFFFF];
618
+        $source = mb_encode_numericentity($source, $convmap, 'UTF-32LE');
619
+
620
+        return str_replace(chr(0), '', $source);
621
+    }
622
+
623
+    // Sinon methode lente
624
+    $texte = '';
625
+    while ($source) {
626
+        $words = unpack('V*', substr($source, 0, 1024));
627
+        $source = substr($source, 1024);
628
+        foreach ($words as $word) {
629
+            if ($word < 128) {
630
+                $texte .= chr($word);
631
+            } // ignorer le BOM - http://www.unicode.org/faq/utf_bom.html
632
+            else {
633
+                if ($word != 65279) {
634
+                    $texte .= '&#' . $word . ';';
635
+                }
636
+            }
637
+        }
638
+    }
639
+
640
+    return $texte;
641 641
 }
642 642
 
643 643
 
@@ -654,21 +654,21 @@  discard block
 block discarded – undo
654 654
  *    Caractère utf8 si trouvé, '' sinon
655 655
  **/
656 656
 function caractere_utf_8($num) {
657
-	$num = (int) $num;
658
-	if ($num < 128) {
659
-		return chr($num);
660
-	}
661
-	if ($num < 2048) {
662
-		return chr(($num >> 6) + 192) . chr(($num & 63) + 128);
663
-	}
664
-	if ($num < 65536) {
665
-		return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
666
-	}
667
-	if ($num < 1_114_112) {
668
-		return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
669
-	}
670
-
671
-	return '';
657
+    $num = (int) $num;
658
+    if ($num < 128) {
659
+        return chr($num);
660
+    }
661
+    if ($num < 2048) {
662
+        return chr(($num >> 6) + 192) . chr(($num & 63) + 128);
663
+    }
664
+    if ($num < 65536) {
665
+        return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
666
+    }
667
+    if ($num < 1_114_112) {
668
+        return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
669
+    }
670
+
671
+    return '';
672 672
 }
673 673
 
674 674
 /**
@@ -681,42 +681,42 @@  discard block
 block discarded – undo
681 681
  **/
682 682
 function unicode_to_utf_8($texte) {
683 683
 
684
-	// 1. Entites &#128; et suivantes
685
-	$vu = [];
686
-	if (
687
-		preg_match_all(
688
-			',&#0*([1-9]\d\d+);,S',
689
-			$texte,
690
-			$regs,
691
-			PREG_SET_ORDER
692
-		)
693
-	) {
694
-		foreach ($regs as $reg) {
695
-			if ($reg[1] > 127 && !isset($vu[$reg[0]])) {
696
-				$vu[$reg[0]] = caractere_utf_8($reg[1]);
697
-			}
698
-		}
699
-	}
700
-	//$texte = str_replace(array_keys($vu), array_values($vu), $texte);
701
-
702
-	// 2. Entites > &#xFF;
703
-	//$vu = array();
704
-	if (
705
-		preg_match_all(
706
-			',&#x0*([1-9a-f][0-9a-f][0-9a-f]+);,iS',
707
-			$texte,
708
-			$regs,
709
-			PREG_SET_ORDER
710
-		)
711
-	) {
712
-		foreach ($regs as $reg) {
713
-			if (!isset($vu[$reg[0]])) {
714
-				$vu[$reg[0]] = caractere_utf_8(hexdec($reg[1]));
715
-			}
716
-		}
717
-	}
718
-
719
-	return str_replace(array_keys($vu), array_values($vu), $texte);
684
+    // 1. Entites &#128; et suivantes
685
+    $vu = [];
686
+    if (
687
+        preg_match_all(
688
+            ',&#0*([1-9]\d\d+);,S',
689
+            $texte,
690
+            $regs,
691
+            PREG_SET_ORDER
692
+        )
693
+    ) {
694
+        foreach ($regs as $reg) {
695
+            if ($reg[1] > 127 && !isset($vu[$reg[0]])) {
696
+                $vu[$reg[0]] = caractere_utf_8($reg[1]);
697
+            }
698
+        }
699
+    }
700
+    //$texte = str_replace(array_keys($vu), array_values($vu), $texte);
701
+
702
+    // 2. Entites > &#xFF;
703
+    //$vu = array();
704
+    if (
705
+        preg_match_all(
706
+            ',&#x0*([1-9a-f][0-9a-f][0-9a-f]+);,iS',
707
+            $texte,
708
+            $regs,
709
+            PREG_SET_ORDER
710
+        )
711
+    ) {
712
+        foreach ($regs as $reg) {
713
+            if (!isset($vu[$reg[0]])) {
714
+                $vu[$reg[0]] = caractere_utf_8(hexdec($reg[1]));
715
+            }
716
+        }
717
+    }
718
+
719
+    return str_replace(array_keys($vu), array_values($vu), $texte);
720 720
 }
721 721
 
722 722
 /**
@@ -728,15 +728,15 @@  discard block
 block discarded – undo
728 728
  *     texte converti
729 729
  **/
730 730
 function unicode_to_javascript($texte) {
731
-	$vu = [];
732
-	while (preg_match(',&#0*(\d+);,S', $texte, $regs) && !isset($vu[$regs[1]])) {
733
-		$num = $regs[1];
734
-		$vu[$num] = true;
735
-		$s = '\u' . sprintf('%04x', $num);
736
-		$texte = str_replace($regs[0], $s, $texte);
737
-	}
738
-
739
-	return $texte;
731
+    $vu = [];
732
+    while (preg_match(',&#0*(\d+);,S', $texte, $regs) && !isset($vu[$regs[1]])) {
733
+        $num = $regs[1];
734
+        $vu[$num] = true;
735
+        $s = '\u' . sprintf('%04x', $num);
736
+        $texte = str_replace($regs[0], $s, $texte);
737
+    }
738
+
739
+    return $texte;
740 740
 }
741 741
 
742 742
 /**
@@ -748,11 +748,11 @@  discard block
 block discarded – undo
748 748
  *     texte converti
749 749
  **/
750 750
 function javascript_to_unicode($texte) {
751
-	while (preg_match(',%u([0-9A-F][0-9A-F][0-9A-F][0-9A-F]),', $texte, $regs)) {
752
-		$texte = str_replace($regs[0], '&#' . hexdec($regs[1]) . ';', $texte);
753
-	}
751
+    while (preg_match(',%u([0-9A-F][0-9A-F][0-9A-F][0-9A-F]),', $texte, $regs)) {
752
+        $texte = str_replace($regs[0], '&#' . hexdec($regs[1]) . ';', $texte);
753
+    }
754 754
 
755
-	return $texte;
755
+    return $texte;
756 756
 }
757 757
 
758 758
 /**
@@ -764,11 +764,11 @@  discard block
 block discarded – undo
764 764
  *     texte converti
765 765
  **/
766 766
 function javascript_to_binary($texte) {
767
-	while (preg_match(',%([0-9A-F][0-9A-F]),', $texte, $regs)) {
768
-		$texte = str_replace($regs[0], chr(hexdec($regs[1])), $texte);
769
-	}
767
+    while (preg_match(',%([0-9A-F][0-9A-F]),', $texte, $regs)) {
768
+        $texte = str_replace($regs[0], chr(hexdec($regs[1])), $texte);
769
+    }
770 770
 
771
-	return $texte;
771
+    return $texte;
772 772
 }
773 773
 
774 774
 
@@ -786,26 +786,26 @@  discard block
 block discarded – undo
786 786
  * @return string
787 787
  */
788 788
 function translitteration_rapide(?string $texte, string $charset = 'AUTO', string $complexe = ''): string {
789
-	static $trans = [];
790
-	if ($charset == 'AUTO') {
791
-		$charset = $GLOBALS['meta']['charset'];
792
-	}
793
-	if ($texte === null || $texte === '') {
794
-		return '';
795
-	}
796
-
797
-	$table_translit = 'translit' . $complexe;
798
-
799
-	// 2. Translitterer grace a la table predefinie
800
-	if (!isset($trans[$complexe])) {
801
-		$trans[$complexe] = [];
802
-		load_charset($table_translit);
803
-		foreach ($GLOBALS['CHARSET'][$table_translit] as $key => $val) {
804
-			$trans[$complexe][caractere_utf_8($key)] = $val;
805
-		}
806
-	}
807
-
808
-	return str_replace(array_keys($trans[$complexe]), array_values($trans[$complexe]), $texte);
789
+    static $trans = [];
790
+    if ($charset == 'AUTO') {
791
+        $charset = $GLOBALS['meta']['charset'];
792
+    }
793
+    if ($texte === null || $texte === '') {
794
+        return '';
795
+    }
796
+
797
+    $table_translit = 'translit' . $complexe;
798
+
799
+    // 2. Translitterer grace a la table predefinie
800
+    if (!isset($trans[$complexe])) {
801
+        $trans[$complexe] = [];
802
+        load_charset($table_translit);
803
+        foreach ($GLOBALS['CHARSET'][$table_translit] as $key => $val) {
804
+            $trans[$complexe][caractere_utf_8($key)] = $val;
805
+        }
806
+    }
807
+
808
+    return str_replace(array_keys($trans[$complexe]), array_values($trans[$complexe]), $texte);
809 809
 }
810 810
 
811 811
 /**
@@ -828,18 +828,18 @@  discard block
 block discarded – undo
828 828
  * @return string
829 829
  */
830 830
 function translitteration(?string $texte, string $charset = 'AUTO', string $complexe = ''): string {
831
-	if ($texte === null || $texte === '') {
832
-		return '';
833
-	}
831
+    if ($texte === null || $texte === '') {
832
+        return '';
833
+    }
834 834
 
835
-	// 0. Supprimer les caracteres illegaux
836
-	include_spip('inc/filtres');
837
-	$texte = corriger_caracteres($texte);
835
+    // 0. Supprimer les caracteres illegaux
836
+    include_spip('inc/filtres');
837
+    $texte = corriger_caracteres($texte);
838 838
 
839
-	// 1. Passer le charset et les &eacute en utf-8
840
-	$texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset)));
839
+    // 1. Passer le charset et les &eacute en utf-8
840
+    $texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset)));
841 841
 
842
-	return translitteration_rapide($texte, $charset, $complexe);
842
+    return translitteration_rapide($texte, $charset, $complexe);
843 843
 }
844 844
 
845 845
 /**
@@ -854,17 +854,17 @@  discard block
 block discarded – undo
854 854
  * @return string
855 855
  */
856 856
 function translitteration_complexe(?string $texte, bool $chiffres = false): string {
857
-	$texte = translitteration($texte, 'AUTO', 'complexe');
857
+    $texte = translitteration($texte, 'AUTO', 'complexe');
858 858
 
859
-	if ($chiffres) {
860
-		$texte = preg_replace_callback(
861
-			"/[aeiuoyd]['`?~.^+(-]{1,2}/S",
862
-			fn($m) => translitteration_chiffree($m[0]),
863
-			$texte
864
-		);
865
-	}
859
+    if ($chiffres) {
860
+        $texte = preg_replace_callback(
861
+            "/[aeiuoyd]['`?~.^+(-]{1,2}/S",
862
+            fn($m) => translitteration_chiffree($m[0]),
863
+            $texte
864
+        );
865
+    }
866 866
 
867
-	return $texte;
867
+    return $texte;
868 868
 }
869 869
 
870 870
 /**
@@ -876,7 +876,7 @@  discard block
 block discarded – undo
876 876
  * @return string
877 877
  */
878 878
 function translitteration_chiffree(string $car): string {
879
-	return strtr($car, "'`?~.^+(-", '123456789');
879
+    return strtr($car, "'`?~.^+(-", '123456789');
880 880
 }
881 881
 
882 882
 
@@ -889,7 +889,7 @@  discard block
 block discarded – undo
889 889
  *    true s'il a un BOM
890 890
  **/
891 891
 function bom_utf8($texte): bool {
892
-	return (substr($texte, 0, 3) === chr(0xEF) . chr(0xBB) . chr(0xBF));
892
+    return (substr($texte, 0, 3) === chr(0xEF) . chr(0xBB) . chr(0xBF));
893 893
 }
894 894
 
895 895
 /**
@@ -906,21 +906,21 @@  discard block
 block discarded – undo
906 906
  *     true si c'est le cas
907 907
  **/
908 908
 function is_utf8($string): bool {
909
-	return !strlen(
910
-		preg_replace(
911
-			',[\x09\x0A\x0D\x20-\x7E]'            # ASCII
912
-			. '|[\xC2-\xDF][\x80-\xBF]'             # non-overlong 2-byte
913
-			. '|\xE0[\xA0-\xBF][\x80-\xBF]'         # excluding overlongs
914
-			. '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}'  # straight 3-byte
915
-			. '|\xED[\x80-\x9F][\x80-\xBF]'         # excluding surrogates
916
-			. '|\xF0[\x90-\xBF][\x80-\xBF]{2}'      # planes 1-3
917
-			. '|[\xF1-\xF3][\x80-\xBF]{3}'          # planes 4-15
918
-			. '|\xF4[\x80-\x8F][\x80-\xBF]{2}'      # plane 16
919
-			. ',sS',
920
-			'',
921
-			$string
922
-		)
923
-	);
909
+    return !strlen(
910
+        preg_replace(
911
+            ',[\x09\x0A\x0D\x20-\x7E]'            # ASCII
912
+            . '|[\xC2-\xDF][\x80-\xBF]'             # non-overlong 2-byte
913
+            . '|\xE0[\xA0-\xBF][\x80-\xBF]'         # excluding overlongs
914
+            . '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}'  # straight 3-byte
915
+            . '|\xED[\x80-\x9F][\x80-\xBF]'         # excluding surrogates
916
+            . '|\xF0[\x90-\xBF][\x80-\xBF]{2}'      # planes 1-3
917
+            . '|[\xF1-\xF3][\x80-\xBF]{3}'          # planes 4-15
918
+            . '|\xF4[\x80-\x8F][\x80-\xBF]{2}'      # plane 16
919
+            . ',sS',
920
+            '',
921
+            $string
922
+        )
923
+    );
924 924
 }
925 925
 
926 926
 /**
@@ -932,13 +932,13 @@  discard block
 block discarded – undo
932 932
  *     true si c'est le cas
933 933
  **/
934 934
 function is_ascii($string): bool {
935
-	return !strlen(
936
-		preg_replace(
937
-			',[\x09\x0A\x0D\x20-\x7E],sS',
938
-			'',
939
-			$string
940
-		)
941
-	);
935
+    return !strlen(
936
+        preg_replace(
937
+            ',[\x09\x0A\x0D\x20-\x7E],sS',
938
+            '',
939
+            $string
940
+        )
941
+    );
942 942
 }
943 943
 
944 944
 /**
@@ -957,50 +957,50 @@  discard block
 block discarded – undo
957 957
  **/
958 958
 function transcoder_page($texte, $headers = ''): string {
959 959
 
960
-	// Si tout est < 128 pas la peine d'aller plus loin
961
-	if (is_ascii($texte)) {
962
-		#spip_log('charset: ascii');
963
-		return $texte;
964
-	}
965
-
966
-	if (bom_utf8($texte)) {
967
-		// Reconnaitre le BOM utf-8 (0xEFBBBF)
968
-		$charset = 'utf-8';
969
-		$texte = substr($texte, 3);
970
-	} elseif (preg_match(',<[?]xml[^>]*encoding[^>]*=[^>]*([-_a-z0-9]+?),UimsS', $texte, $regs)) {
971
-		// charset precise par le contenu (xml)
972
-		$charset = trim(strtolower($regs[1]));
973
-	} elseif (
974
-		// charset precise par le contenu (html)
975
-		preg_match(',<(meta|html|body)[^>]*charset[^>]*=[^>]*([#-_a-z0-9]+?),UimsS', $texte, $regs)
976
-		# eviter toute balise SPIP tel que #CHARSET ou #CONFIG d'un squelette
977
-
978
-		&& !str_contains($regs[2], '#')
979
-		&& ($tmp = trim(strtolower($regs[2])))
980
-	) {
981
-		$charset = $tmp;
982
-	} elseif (preg_match(',charset=([-_a-z0-9]+),i', $headers, $regs)) {
983
-		// charset de la reponse http
984
-		$charset = trim(strtolower($regs[1]));
985
-	} else {
986
-		$charset = '';
987
-	}
988
-
989
-
990
-	// normaliser les noms du shif-jis japonais
991
-	if (preg_match(',^(x|shift)[_-]s?jis$,i', $charset)) {
992
-		$charset = 'shift-jis';
993
-	}
994
-
995
-	if ($charset) {
996
-		spip_log("charset: $charset");
997
-	} else {
998
-		// valeur par defaut
999
-		$charset = is_utf8($texte) ? 'utf-8' : 'iso-8859-1';
1000
-		spip_log("charset probable: $charset");
1001
-	}
1002
-
1003
-	return importer_charset($texte, $charset);
960
+    // Si tout est < 128 pas la peine d'aller plus loin
961
+    if (is_ascii($texte)) {
962
+        #spip_log('charset: ascii');
963
+        return $texte;
964
+    }
965
+
966
+    if (bom_utf8($texte)) {
967
+        // Reconnaitre le BOM utf-8 (0xEFBBBF)
968
+        $charset = 'utf-8';
969
+        $texte = substr($texte, 3);
970
+    } elseif (preg_match(',<[?]xml[^>]*encoding[^>]*=[^>]*([-_a-z0-9]+?),UimsS', $texte, $regs)) {
971
+        // charset precise par le contenu (xml)
972
+        $charset = trim(strtolower($regs[1]));
973
+    } elseif (
974
+        // charset precise par le contenu (html)
975
+        preg_match(',<(meta|html|body)[^>]*charset[^>]*=[^>]*([#-_a-z0-9]+?),UimsS', $texte, $regs)
976
+        # eviter toute balise SPIP tel que #CHARSET ou #CONFIG d'un squelette
977
+
978
+        && !str_contains($regs[2], '#')
979
+        && ($tmp = trim(strtolower($regs[2])))
980
+    ) {
981
+        $charset = $tmp;
982
+    } elseif (preg_match(',charset=([-_a-z0-9]+),i', $headers, $regs)) {
983
+        // charset de la reponse http
984
+        $charset = trim(strtolower($regs[1]));
985
+    } else {
986
+        $charset = '';
987
+    }
988
+
989
+
990
+    // normaliser les noms du shif-jis japonais
991
+    if (preg_match(',^(x|shift)[_-]s?jis$,i', $charset)) {
992
+        $charset = 'shift-jis';
993
+    }
994
+
995
+    if ($charset) {
996
+        spip_log("charset: $charset");
997
+    } else {
998
+        // valeur par defaut
999
+        $charset = is_utf8($texte) ? 'utf-8' : 'iso-8859-1';
1000
+        spip_log("charset probable: $charset");
1001
+    }
1002
+
1003
+    return importer_charset($texte, $charset);
1004 1004
 }
1005 1005
 
1006 1006
 
@@ -1024,19 +1024,19 @@  discard block
 block discarded – undo
1024 1024
  *     Le texte coupé
1025 1025
  **/
1026 1026
 function spip_substr($c, $start = 0, $length = null) {
1027
-	if ($GLOBALS['meta']['charset'] !== 'utf-8') {
1028
-		if ($length) {
1029
-			return substr($c, $start, $length);
1030
-		} else {
1031
-			return substr($c, $start);
1032
-		}
1033
-	}
1034
-
1035
-	if ($length) {
1036
-		return mb_substr($c, $start, $length);
1037
-	} else {
1038
-		return mb_substr($c, $start);
1039
-	}
1027
+    if ($GLOBALS['meta']['charset'] !== 'utf-8') {
1028
+        if ($length) {
1029
+            return substr($c, $start, $length);
1030
+        } else {
1031
+            return substr($c, $start);
1032
+        }
1033
+    }
1034
+
1035
+    if ($length) {
1036
+        return mb_substr($c, $start, $length);
1037
+    } else {
1038
+        return mb_substr($c, $start);
1039
+    }
1040 1040
 }
1041 1041
 
1042 1042
 /**
@@ -1050,13 +1050,13 @@  discard block
 block discarded – undo
1050 1050
  *     La chaîne avec une majuscule sur le premier mot
1051 1051
  */
1052 1052
 function spip_ucfirst($c) {
1053
-	if ($GLOBALS['meta']['charset'] !== 'utf-8') {
1054
-		return ucfirst($c);
1055
-	}
1053
+    if ($GLOBALS['meta']['charset'] !== 'utf-8') {
1054
+        return ucfirst($c);
1055
+    }
1056 1056
 
1057
-	$lettre1 = mb_strtoupper(spip_substr($c, 0, 1));
1057
+    $lettre1 = mb_strtoupper(spip_substr($c, 0, 1));
1058 1058
 
1059
-	return $lettre1 . spip_substr($c, 1);
1059
+    return $lettre1 . spip_substr($c, 1);
1060 1060
 }
1061 1061
 
1062 1062
 /**
@@ -1070,11 +1070,11 @@  discard block
 block discarded – undo
1070 1070
  *     La chaîne en minuscules
1071 1071
  */
1072 1072
 function spip_strtolower($c) {
1073
-	if ($GLOBALS['meta']['charset'] !== 'utf-8') {
1074
-		return strtolower($c);
1075
-	}
1073
+    if ($GLOBALS['meta']['charset'] !== 'utf-8') {
1074
+        return strtolower($c);
1075
+    }
1076 1076
 
1077
-	return mb_strtolower($c);
1077
+    return mb_strtolower($c);
1078 1078
 }
1079 1079
 
1080 1080
 /**
@@ -1088,15 +1088,15 @@  discard block
 block discarded – undo
1088 1088
  *     Longueur de la chaîne
1089 1089
  */
1090 1090
 function spip_strlen($c) {
1091
-	// On transforme les sauts de ligne pour ne pas compter deux caractères
1092
-	$c = str_replace("\r\n", "\n", $c);
1091
+    // On transforme les sauts de ligne pour ne pas compter deux caractères
1092
+    $c = str_replace("\r\n", "\n", $c);
1093 1093
 
1094
-	// Si ce n'est pas utf-8, utiliser strlen
1095
-	if ($GLOBALS['meta']['charset'] !== 'utf-8') {
1096
-		return strlen($c);
1097
-	}
1094
+    // Si ce n'est pas utf-8, utiliser strlen
1095
+    if ($GLOBALS['meta']['charset'] !== 'utf-8') {
1096
+        return strlen($c);
1097
+    }
1098 1098
 
1099
-	return mb_strlen($c);
1099
+    return mb_strlen($c);
1100 1100
 }
1101 1101
 
1102 1102
 /**
@@ -1111,17 +1111,17 @@  discard block
 block discarded – undo
1111 1111
  *     en unicode : &#128169;
1112 1112
  */
1113 1113
 function utf8_noplanes($x): string {
1114
-	$regexp_utf8_4bytes = '/(
1114
+    $regexp_utf8_4bytes = '/(
1115 1115
       \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
1116 1116
    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
1117 1117
    |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
1118 1118
 )/xS';
1119
-	if (preg_match_all($regexp_utf8_4bytes, $x, $z, PREG_PATTERN_ORDER)) {
1120
-		foreach ($z[0] as $k) {
1121
-			$ku = utf_8_to_unicode($k);
1122
-			$x = str_replace($k, $ku, $x);
1123
-		}
1124
-	}
1125
-
1126
-	return $x;
1119
+    if (preg_match_all($regexp_utf8_4bytes, $x, $z, PREG_PATTERN_ORDER)) {
1120
+        foreach ($z[0] as $k) {
1121
+            $ku = utf_8_to_unicode($k);
1122
+            $x = str_replace($k, $ku, $x);
1123
+        }
1124
+    }
1125
+
1126
+    return $x;
1127 1127
 }
Please login to merge, or discard this patch.
Spacing   +49 added lines, -49 removed lines patch added patch discarded remove patch
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
 		$charset = 'cp1256';
90 90
 	}
91 91
 
92
-	if (find_in_path($charset . '.php', 'charsets/', true)) {
92
+	if (find_in_path($charset.'.php', 'charsets/', true)) {
93 93
 		return $charset;
94 94
 	} else {
95 95
 		spip_log("Erreur: pas de fichier de conversion 'charsets/$charset'");
@@ -190,38 +190,38 @@  discard block
 block discarded – undo
190 190
 
191 191
 	if (!isset($trans[$charset][$charset_cible])) {
192 192
 		$trans[$charset][$charset_cible] = [
193
-			$p . chr(128) => '&#8364;',
194
-			$p . chr(129) => ' ', # pas affecte
195
-			$p . chr(130) => '&#8218;',
196
-			$p . chr(131) => '&#402;',
197
-			$p . chr(132) => '&#8222;',
198
-			$p . chr(133) => '&#8230;',
199
-			$p . chr(134) => '&#8224;',
200
-			$p . chr(135) => '&#8225;',
201
-			$p . chr(136) => '&#710;',
202
-			$p . chr(137) => '&#8240;',
203
-			$p . chr(138) => '&#352;',
204
-			$p . chr(139) => '&#8249;',
205
-			$p . chr(140) => '&#338;',
206
-			$p . chr(141) => ' ', # pas affecte
207
-			$p . chr(142) => '&#381;',
208
-			$p . chr(143) => ' ', # pas affecte
209
-			$p . chr(144) => ' ', # pas affecte
210
-			$p . chr(145) => '&#8216;',
211
-			$p . chr(146) => '&#8217;',
212
-			$p . chr(147) => '&#8220;',
213
-			$p . chr(148) => '&#8221;',
214
-			$p . chr(149) => '&#8226;',
215
-			$p . chr(150) => '&#8211;',
216
-			$p . chr(151) => '&#8212;',
217
-			$p . chr(152) => '&#732;',
218
-			$p . chr(153) => '&#8482;',
219
-			$p . chr(154) => '&#353;',
220
-			$p . chr(155) => '&#8250;',
221
-			$p . chr(156) => '&#339;',
222
-			$p . chr(157) => ' ', # pas affecte
223
-			$p . chr(158) => '&#382;',
224
-			$p . chr(159) => '&#376;',
193
+			$p.chr(128) => '&#8364;',
194
+			$p.chr(129) => ' ', # pas affecte
195
+			$p.chr(130) => '&#8218;',
196
+			$p.chr(131) => '&#402;',
197
+			$p.chr(132) => '&#8222;',
198
+			$p.chr(133) => '&#8230;',
199
+			$p.chr(134) => '&#8224;',
200
+			$p.chr(135) => '&#8225;',
201
+			$p.chr(136) => '&#710;',
202
+			$p.chr(137) => '&#8240;',
203
+			$p.chr(138) => '&#352;',
204
+			$p.chr(139) => '&#8249;',
205
+			$p.chr(140) => '&#338;',
206
+			$p.chr(141) => ' ', # pas affecte
207
+			$p.chr(142) => '&#381;',
208
+			$p.chr(143) => ' ', # pas affecte
209
+			$p.chr(144) => ' ', # pas affecte
210
+			$p.chr(145) => '&#8216;',
211
+			$p.chr(146) => '&#8217;',
212
+			$p.chr(147) => '&#8220;',
213
+			$p.chr(148) => '&#8221;',
214
+			$p.chr(149) => '&#8226;',
215
+			$p.chr(150) => '&#8211;',
216
+			$p.chr(151) => '&#8212;',
217
+			$p.chr(152) => '&#732;',
218
+			$p.chr(153) => '&#8482;',
219
+			$p.chr(154) => '&#353;',
220
+			$p.chr(155) => '&#8250;',
221
+			$p.chr(156) => '&#339;',
222
+			$p.chr(157) => ' ', # pas affecte
223
+			$p.chr(158) => '&#382;',
224
+			$p.chr(159) => '&#376;',
225 225
 		];
226 226
 		if ($charset_cible != 'unicode') {
227 227
 			foreach ($trans[$charset][$charset_cible] as $k => $c) {
@@ -367,7 +367,7 @@  discard block
 block discarded – undo
367 367
 			// Sinon, peut-etre connaissons-nous ce charset ?
368 368
 			if (!isset($trans[$charset]) && (($cset = load_charset($charset)) && is_array($GLOBALS['CHARSET'][$cset]))) {
369 369
 				foreach ($GLOBALS['CHARSET'][$cset] as $key => $val) {
370
-					$trans[$charset][chr($key)] = '&#' . $val . ';';
370
+					$trans[$charset][chr($key)] = '&#'.$val.';';
371 371
 				}
372 372
 			}
373 373
 			if (isset($trans[$charset]) && (is_countable($trans[$charset]) ? count($trans[$charset]) : 0)) {
@@ -432,11 +432,11 @@  discard block
 block discarded – undo
432 432
 					$h = dechex($e);
433 433
 					if ($s = isset($CHARSET_REVERSE[$charset][$e])) {
434 434
 						$s = $CHARSET_REVERSE[$charset][$e];
435
-						$t['&#' . $e . ';'] = $t['&#0' . $e . ';'] = $t['&#00' . $e . ';'] = chr($s);
436
-						$t['&#x' . $h . ';'] = $t['&#x0' . $h . ';'] = $t['&#x00' . $h . ';'] = chr($s);
435
+						$t['&#'.$e.';'] = $t['&#0'.$e.';'] = $t['&#00'.$e.';'] = chr($s);
436
+						$t['&#x'.$h.';'] = $t['&#x0'.$h.';'] = $t['&#x00'.$h.';'] = chr($s);
437 437
 					} else {
438
-						$t['&#' . $e . ';'] = $t['&#0' . $e . ';'] = $t['&#00' . $e . ';'] = chr($e);
439
-						$t['&#x' . $h . ';'] = $t['&#x0' . $h . ';'] = $t['&#x00' . $h . ';'] = chr($e);
438
+						$t['&#'.$e.';'] = $t['&#0'.$e.';'] = $t['&#00'.$e.';'] = chr($e);
439
+						$t['&#x'.$h.';'] = $t['&#x0'.$h.';'] = $t['&#x00'.$h.';'] = chr($e);
440 440
 					}
441 441
 				}
442 442
 			}
@@ -482,7 +482,7 @@  discard block
 block discarded – undo
482 482
 			&& is_array($GLOBALS['CHARSET'][$cset]))
483 483
 		) {
484 484
 			foreach ($GLOBALS['CHARSET'][$cset] as $key => $val) {
485
-				$trans[$charset][chr($key)] = unicode2charset('&#' . $val . ';');
485
+				$trans[$charset][chr($key)] = unicode2charset('&#'.$val.';');
486 486
 			}
487 487
 		}
488 488
 		if (is_countable($trans[$charset]) ? count($trans[$charset]) : 0) {
@@ -588,7 +588,7 @@  discard block
 block discarded – undo
588 588
 				}
589 589
 				$thisPos++;
590 590
 			}
591
-			$encodedLetter = '&#' . preg_replace('/^0+/', '', $decimalCode) . ';';
591
+			$encodedLetter = '&#'.preg_replace('/^0+/', '', $decimalCode).';';
592 592
 			$encodedString .= $encodedLetter;
593 593
 		}
594 594
 	}
@@ -631,7 +631,7 @@  discard block
 block discarded – undo
631 631
 			} // ignorer le BOM - http://www.unicode.org/faq/utf_bom.html
632 632
 			else {
633 633
 				if ($word != 65279) {
634
-					$texte .= '&#' . $word . ';';
634
+					$texte .= '&#'.$word.';';
635 635
 				}
636 636
 			}
637 637
 		}
@@ -659,13 +659,13 @@  discard block
 block discarded – undo
659 659
 		return chr($num);
660 660
 	}
661 661
 	if ($num < 2048) {
662
-		return chr(($num >> 6) + 192) . chr(($num & 63) + 128);
662
+		return chr(($num >> 6) + 192).chr(($num & 63) + 128);
663 663
 	}
664 664
 	if ($num < 65536) {
665
-		return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
665
+		return chr(($num >> 12) + 224).chr((($num >> 6) & 63) + 128).chr(($num & 63) + 128);
666 666
 	}
667 667
 	if ($num < 1_114_112) {
668
-		return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
668
+		return chr(($num >> 18) + 240).chr((($num >> 12) & 63) + 128).chr((($num >> 6) & 63) + 128).chr(($num & 63) + 128);
669 669
 	}
670 670
 
671 671
 	return '';
@@ -732,7 +732,7 @@  discard block
 block discarded – undo
732 732
 	while (preg_match(',&#0*(\d+);,S', $texte, $regs) && !isset($vu[$regs[1]])) {
733 733
 		$num = $regs[1];
734 734
 		$vu[$num] = true;
735
-		$s = '\u' . sprintf('%04x', $num);
735
+		$s = '\u'.sprintf('%04x', $num);
736 736
 		$texte = str_replace($regs[0], $s, $texte);
737 737
 	}
738 738
 
@@ -749,7 +749,7 @@  discard block
 block discarded – undo
749 749
  **/
750 750
 function javascript_to_unicode($texte) {
751 751
 	while (preg_match(',%u([0-9A-F][0-9A-F][0-9A-F][0-9A-F]),', $texte, $regs)) {
752
-		$texte = str_replace($regs[0], '&#' . hexdec($regs[1]) . ';', $texte);
752
+		$texte = str_replace($regs[0], '&#'.hexdec($regs[1]).';', $texte);
753 753
 	}
754 754
 
755 755
 	return $texte;
@@ -794,7 +794,7 @@  discard block
 block discarded – undo
794 794
 		return '';
795 795
 	}
796 796
 
797
-	$table_translit = 'translit' . $complexe;
797
+	$table_translit = 'translit'.$complexe;
798 798
 
799 799
 	// 2. Translitterer grace a la table predefinie
800 800
 	if (!isset($trans[$complexe])) {
@@ -889,7 +889,7 @@  discard block
 block discarded – undo
889 889
  *    true s'il a un BOM
890 890
  **/
891 891
 function bom_utf8($texte): bool {
892
-	return (substr($texte, 0, 3) === chr(0xEF) . chr(0xBB) . chr(0xBF));
892
+	return (substr($texte, 0, 3) === chr(0xEF).chr(0xBB).chr(0xBF));
893 893
 }
894 894
 
895 895
 /**
@@ -1056,7 +1056,7 @@  discard block
 block discarded – undo
1056 1056
 
1057 1057
 	$lettre1 = mb_strtoupper(spip_substr($c, 0, 1));
1058 1058
 
1059
-	return $lettre1 . spip_substr($c, 1);
1059
+	return $lettre1.spip_substr($c, 1);
1060 1060
 }
1061 1061
 
1062 1062
 /**
Please login to merge, or discard this patch.
ecrire/tests/Texte/LiensTest.php 2 patches
Indentation   +198 added lines, -198 removed lines patch added patch discarded remove patch
@@ -13,202 +13,202 @@
 block discarded – undo
13 13
 
14 14
 class LiensTest extends TestCase
15 15
 {
16
-	public static function setUpBeforeClass(): void {
17
-		include_spip('inc/texte');
18
-		include_spip('inc/lang');
19
-	}
20
-
21
-	public function testLiensHrefLangAutomatique() {
22
-		$article = sql_fetsel(
23
-			['id_article', 'lang'],
24
-			'spip_articles',
25
-			[
26
-				'statut = ' . sql_quote('publie'),
27
-				'lang != ' . sql_quote('')
28
-			],
29
-			limit: '0,1',
30
-		);
31
-
32
-		$id_article = $article['id_article'];
33
-		$lang = $article['lang'];
34
-
35
-		// on se met dans une autre langue que celle de l'article
36
-		lang_select($lang === 'eo' ? 'fa' : 'eo');
37
-
38
-		$case = '[->' . $id_article . ']';
39
-		$propre = propre($case);
40
-		$this->assertEquals(
41
-			$lang,
42
-			extraire_attribut($propre, 'hreflang'),
43
-			sprintf('hreflang automatique errone dans "%s". Propre: "%s"', $case, $propre)
44
-		);
45
-	}
46
-
47
-	#[DataProvider('providerLiensClassCss')]
48
-	public function testLiensClassCss(string $table, ?string $short, bool $in) {
49
-		$id = sql_getfetsel(id_table_objet($table), $table, "statut='publie'", limit: '0,1');
50
-		$type = objet_type($table);
51
-		if (!$id) {
52
-			$this->markTestSkipped(sprintf('Necessite un·e %s publié', $type));
53
-		}
54
-		$cases = ["[->$type{$id}]"];
55
-		if ($short) {
56
-			$cases[] = "[->$short{$id}]";
57
-		}
58
-		foreach ($cases as $case) {
59
-			$propre = propre($case);
60
-			$classes = extraire_attribut($propre, 'class');
61
-			$err = sprintf('Classe CSS "%s" errone dans "%s". Propre: "%s"', (string) $classes, $case, $propre);
62
-			$this->assertNotNull($classes, $err);
63
-			if ($in) {
64
-				$this->assertStringContainsString('spip_in', $classes, $err);
65
-				$this->assertStringNotContainsString('spip_out', $classes, $err);
66
-			} else {
67
-				$this->assertStringContainsString('spip_out', $classes, $err);
68
-				$this->assertStringNotContainsString('spip_in', $classes, $err);
69
-			}
70
-		}
71
-	}
72
-
73
-	public static function providerLiensClassCss(): array {
74
-		return [
75
-			'article' => [
76
-				'table' => 'spip_articles',
77
-				'short' => 'art',
78
-				'in' => true
79
-			],
80
-			'rubrique' => [
81
-				'table' => 'spip_rubriques',
82
-				'short' => 'rub',
83
-				'in' => true
84
-			],
85
-			'site' => [
86
-				'table' => 'spip_syndic',
87
-				'short' => null,
88
-				'in' => false
89
-			],
90
-		];
91
-	}
92
-
93
-	#[DataProvider('providerLiens')]
94
-	public function testLiens($case, $url, $hreflang, $title, $text) {
95
-		lang_select('eo');
96
-		$propre = propre($case);
97
-		$this->assertEquals(
98
-			$url,
99
-			extraire_attribut($propre, 'href'),
100
-			sprintf('URL mal extraite de "%s". Propre: "%s"', $case, $propre)
101
-		);
102
-		$this->assertEquals(
103
-			$hreflang,
104
-			extraire_attribut($propre, 'hreflang'),
105
-			sprintf('Hreflang erroné dans "%s". Propre: "%s"', $case, $propre)
106
-		);
107
-		$this->assertEquals(
108
-			$title,
109
-			extraire_attribut($propre, 'title'),
110
-			sprintf('Title erroné dans "%s". Propre: "%s"', $case, $propre)
111
-		);
112
-		$this->assertEquals(
113
-			$text,
114
-			supprimer_tags($propre),
115
-			sprintf('Texte du lien abîmé dans "%s". Propre: "%s"', $case, $propre)
116
-		);
117
-	}
118
-
119
-	public static function providerLiens(): array {
120
-		return [
121
-			'hreflang incorrect spécifié ignoré' => [
122
-				'case' => '[bla {blabla}->url]',
123
-				'url' => 'url',
124
-				'hreflang' => null,
125
-				'title' => null,
126
-				'text' => 'bla blabla'
127
-			],
128
-			'hreflang correct spécifié pris en compte' => [
129
-				'case' => '[bla{en}->url]',
130
-				'url' => 'url',
131
-				'hreflang' => 'en',
132
-				'title' => null,
133
-				'text' => 'bla'
134
-			],
135
-			'title spécifié pris en compte' => [
136
-				'case' => '[bla|bulle de savon{eo}->url]',
137
-				'url' => 'url',
138
-				'hreflang' => 'eo',
139
-				'title' => 'bulle de savon',
140
-				'text' => 'bla'
141
-			],
142
-			'title comme une langue devient hreflang aussi' => [
143
-				'case' => '[bla|fa->url]',
144
-				'url' => 'url',
145
-				'hreflang' => 'fa',
146
-				'title' => 'fa',
147
-				'text' => 'bla'
148
-			],
149
-			'title autre qu’une langue ne contamine pas hreflang' => [
150
-				'case' => '[bla|bulle de savon->url]',
151
-				'url' => 'url',
152
-				'hreflang' => null,
153
-				'title' => 'bulle de savon',
154
-				'text' => 'bla'
155
-			],
156
-			'multi dans liens' => [
157
-				'case' => '[<multi>[fr]X[eo]Y[fa]Z</multi>->url]',
158
-				'url' => 'url',
159
-				'hreflang' => null,
160
-				'title' => null,
161
-				'text' => 'Y'
162
-			],
163
-		];
164
-	}
165
-
166
-	#[DataProvider('providerLiensAutomatiques')]
167
-	public function testLiensAutomatiques($case, $url) {
168
-		$propre = propre($case);
169
-		$this->assertEquals(
170
-			$url,
171
-			extraire_attribut(extraire_balise($propre, 'a'), 'href'),
172
-			sprintf('Erreur lien dans "%s". Propre: "%s"', $case, $propre)
173
-		);
174
-	}
175
-
176
-	public static function providerLiensAutomatiques(): array {
177
-		return [
178
-			'sans protocole' => [
179
-				'case' => 'un superbe www.monsite.tld, pas mal',
180
-				'url' => 'http://www.monsite.tld',
181
-			],
182
-			'protocole http' => [
183
-				'case' => 'un superbe http://www.monsite.tld, pas mal',
184
-				'url' => 'http://www.monsite.tld',
185
-			],
186
-			'protocole https' => [
187
-				'case' => 'un superbe https://www.monsite.tld, pas mal',
188
-				'url' => 'https://www.monsite.tld',
189
-			],
190
-		];
191
-	}
192
-
193
-	public function testLiensAvecAncre() {
194
-		$case = '[uneancre<-] a [->www.monsite.tld]';
195
-		$url = 'http://www.monsite.tld';
196
-		$propre = propre($case);
197
-		$this->assertEquals(
198
-			$url,
199
-			extraire_attribut(extraire_balises($propre, 'a')[1], 'href'),
200
-			sprintf('Erreur lien dans "%s". Propre: "%s"', $case, $propre)
201
-		);
202
-	}
203
-
204
-	public function testLienModele() {
205
-		$case = '<flv|url=http://rezo.net/>';
206
-		$propre = propre($case);
207
-		$expected = '<p><tt>&lt;flv|url=http://rezo.net/&gt;</tt></p>';
208
-		$this->assertEquals(
209
-			$expected,
210
-			$propre,
211
-			sprintf('Erreur lien dans "%s". Propre: "%s"', $case, $propre)
212
-		);
213
-	}
16
+    public static function setUpBeforeClass(): void {
17
+        include_spip('inc/texte');
18
+        include_spip('inc/lang');
19
+    }
20
+
21
+    public function testLiensHrefLangAutomatique() {
22
+        $article = sql_fetsel(
23
+            ['id_article', 'lang'],
24
+            'spip_articles',
25
+            [
26
+                'statut = ' . sql_quote('publie'),
27
+                'lang != ' . sql_quote('')
28
+            ],
29
+            limit: '0,1',
30
+        );
31
+
32
+        $id_article = $article['id_article'];
33
+        $lang = $article['lang'];
34
+
35
+        // on se met dans une autre langue que celle de l'article
36
+        lang_select($lang === 'eo' ? 'fa' : 'eo');
37
+
38
+        $case = '[->' . $id_article . ']';
39
+        $propre = propre($case);
40
+        $this->assertEquals(
41
+            $lang,
42
+            extraire_attribut($propre, 'hreflang'),
43
+            sprintf('hreflang automatique errone dans "%s". Propre: "%s"', $case, $propre)
44
+        );
45
+    }
46
+
47
+    #[DataProvider('providerLiensClassCss')]
48
+    public function testLiensClassCss(string $table, ?string $short, bool $in) {
49
+        $id = sql_getfetsel(id_table_objet($table), $table, "statut='publie'", limit: '0,1');
50
+        $type = objet_type($table);
51
+        if (!$id) {
52
+            $this->markTestSkipped(sprintf('Necessite un·e %s publié', $type));
53
+        }
54
+        $cases = ["[->$type{$id}]"];
55
+        if ($short) {
56
+            $cases[] = "[->$short{$id}]";
57
+        }
58
+        foreach ($cases as $case) {
59
+            $propre = propre($case);
60
+            $classes = extraire_attribut($propre, 'class');
61
+            $err = sprintf('Classe CSS "%s" errone dans "%s". Propre: "%s"', (string) $classes, $case, $propre);
62
+            $this->assertNotNull($classes, $err);
63
+            if ($in) {
64
+                $this->assertStringContainsString('spip_in', $classes, $err);
65
+                $this->assertStringNotContainsString('spip_out', $classes, $err);
66
+            } else {
67
+                $this->assertStringContainsString('spip_out', $classes, $err);
68
+                $this->assertStringNotContainsString('spip_in', $classes, $err);
69
+            }
70
+        }
71
+    }
72
+
73
+    public static function providerLiensClassCss(): array {
74
+        return [
75
+            'article' => [
76
+                'table' => 'spip_articles',
77
+                'short' => 'art',
78
+                'in' => true
79
+            ],
80
+            'rubrique' => [
81
+                'table' => 'spip_rubriques',
82
+                'short' => 'rub',
83
+                'in' => true
84
+            ],
85
+            'site' => [
86
+                'table' => 'spip_syndic',
87
+                'short' => null,
88
+                'in' => false
89
+            ],
90
+        ];
91
+    }
92
+
93
+    #[DataProvider('providerLiens')]
94
+    public function testLiens($case, $url, $hreflang, $title, $text) {
95
+        lang_select('eo');
96
+        $propre = propre($case);
97
+        $this->assertEquals(
98
+            $url,
99
+            extraire_attribut($propre, 'href'),
100
+            sprintf('URL mal extraite de "%s". Propre: "%s"', $case, $propre)
101
+        );
102
+        $this->assertEquals(
103
+            $hreflang,
104
+            extraire_attribut($propre, 'hreflang'),
105
+            sprintf('Hreflang erroné dans "%s". Propre: "%s"', $case, $propre)
106
+        );
107
+        $this->assertEquals(
108
+            $title,
109
+            extraire_attribut($propre, 'title'),
110
+            sprintf('Title erroné dans "%s". Propre: "%s"', $case, $propre)
111
+        );
112
+        $this->assertEquals(
113
+            $text,
114
+            supprimer_tags($propre),
115
+            sprintf('Texte du lien abîmé dans "%s". Propre: "%s"', $case, $propre)
116
+        );
117
+    }
118
+
119
+    public static function providerLiens(): array {
120
+        return [
121
+            'hreflang incorrect spécifié ignoré' => [
122
+                'case' => '[bla {blabla}->url]',
123
+                'url' => 'url',
124
+                'hreflang' => null,
125
+                'title' => null,
126
+                'text' => 'bla blabla'
127
+            ],
128
+            'hreflang correct spécifié pris en compte' => [
129
+                'case' => '[bla{en}->url]',
130
+                'url' => 'url',
131
+                'hreflang' => 'en',
132
+                'title' => null,
133
+                'text' => 'bla'
134
+            ],
135
+            'title spécifié pris en compte' => [
136
+                'case' => '[bla|bulle de savon{eo}->url]',
137
+                'url' => 'url',
138
+                'hreflang' => 'eo',
139
+                'title' => 'bulle de savon',
140
+                'text' => 'bla'
141
+            ],
142
+            'title comme une langue devient hreflang aussi' => [
143
+                'case' => '[bla|fa->url]',
144
+                'url' => 'url',
145
+                'hreflang' => 'fa',
146
+                'title' => 'fa',
147
+                'text' => 'bla'
148
+            ],
149
+            'title autre qu’une langue ne contamine pas hreflang' => [
150
+                'case' => '[bla|bulle de savon->url]',
151
+                'url' => 'url',
152
+                'hreflang' => null,
153
+                'title' => 'bulle de savon',
154
+                'text' => 'bla'
155
+            ],
156
+            'multi dans liens' => [
157
+                'case' => '[<multi>[fr]X[eo]Y[fa]Z</multi>->url]',
158
+                'url' => 'url',
159
+                'hreflang' => null,
160
+                'title' => null,
161
+                'text' => 'Y'
162
+            ],
163
+        ];
164
+    }
165
+
166
+    #[DataProvider('providerLiensAutomatiques')]
167
+    public function testLiensAutomatiques($case, $url) {
168
+        $propre = propre($case);
169
+        $this->assertEquals(
170
+            $url,
171
+            extraire_attribut(extraire_balise($propre, 'a'), 'href'),
172
+            sprintf('Erreur lien dans "%s". Propre: "%s"', $case, $propre)
173
+        );
174
+    }
175
+
176
+    public static function providerLiensAutomatiques(): array {
177
+        return [
178
+            'sans protocole' => [
179
+                'case' => 'un superbe www.monsite.tld, pas mal',
180
+                'url' => 'http://www.monsite.tld',
181
+            ],
182
+            'protocole http' => [
183
+                'case' => 'un superbe http://www.monsite.tld, pas mal',
184
+                'url' => 'http://www.monsite.tld',
185
+            ],
186
+            'protocole https' => [
187
+                'case' => 'un superbe https://www.monsite.tld, pas mal',
188
+                'url' => 'https://www.monsite.tld',
189
+            ],
190
+        ];
191
+    }
192
+
193
+    public function testLiensAvecAncre() {
194
+        $case = '[uneancre<-] a [->www.monsite.tld]';
195
+        $url = 'http://www.monsite.tld';
196
+        $propre = propre($case);
197
+        $this->assertEquals(
198
+            $url,
199
+            extraire_attribut(extraire_balises($propre, 'a')[1], 'href'),
200
+            sprintf('Erreur lien dans "%s". Propre: "%s"', $case, $propre)
201
+        );
202
+    }
203
+
204
+    public function testLienModele() {
205
+        $case = '<flv|url=http://rezo.net/>';
206
+        $propre = propre($case);
207
+        $expected = '<p><tt>&lt;flv|url=http://rezo.net/&gt;</tt></p>';
208
+        $this->assertEquals(
209
+            $expected,
210
+            $propre,
211
+            sprintf('Erreur lien dans "%s". Propre: "%s"', $case, $propre)
212
+        );
213
+    }
214 214
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -23,8 +23,8 @@  discard block
 block discarded – undo
23 23
 			['id_article', 'lang'],
24 24
 			'spip_articles',
25 25
 			[
26
-				'statut = ' . sql_quote('publie'),
27
-				'lang != ' . sql_quote('')
26
+				'statut = '.sql_quote('publie'),
27
+				'lang != '.sql_quote('')
28 28
 			],
29 29
 			limit: '0,1',
30 30
 		);
@@ -35,7 +35,7 @@  discard block
 block discarded – undo
35 35
 		// on se met dans une autre langue que celle de l'article
36 36
 		lang_select($lang === 'eo' ? 'fa' : 'eo');
37 37
 
38
-		$case = '[->' . $id_article . ']';
38
+		$case = '[->'.$id_article.']';
39 39
 		$propre = propre($case);
40 40
 		$this->assertEquals(
41 41
 			$lang,
@@ -46,7 +46,7 @@  discard block
 block discarded – undo
46 46
 
47 47
 	#[DataProvider('providerLiensClassCss')]
48 48
 	public function testLiensClassCss(string $table, ?string $short, bool $in) {
49
-		$id = sql_getfetsel(id_table_objet($table), $table, "statut='publie'", limit: '0,1');
49
+		$id = sql_getfetsel(id_table_objet($table), $table, "statut='publie'", limit : '0,1');
50 50
 		$type = objet_type($table);
51 51
 		if (!$id) {
52 52
 			$this->markTestSkipped(sprintf('Necessite un·e %s publié', $type));
Please login to merge, or discard this patch.
ecrire/public/assembler.php 2 patches
Spacing   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -33,7 +33,7 @@  discard block
 block discarded – undo
33 33
 
34 34
 	$GLOBALS['contexte'] = calculer_contexte();
35 35
 	$page = ['contexte_implicite' => calculer_contexte_implicite()];
36
-	$page['contexte_implicite']['cache'] = $fond . preg_replace(
36
+	$page['contexte_implicite']['cache'] = $fond.preg_replace(
37 37
 		',\.[a-zA-Z0-9]*$,',
38 38
 		'',
39 39
 		preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
@@ -133,7 +133,7 @@  discard block
 block discarded – undo
133 133
 			if ($page === '') {
134 134
 				$erreur = _T(
135 135
 					'info_erreur_squelette2',
136
-					['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
136
+					['fichier' => spip_htmlspecialchars($fond).'.'._EXTENSION_SQUELETTES]
137 137
 				);
138 138
 				erreur_squelette($erreur);
139 139
 				// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
@@ -174,7 +174,7 @@  discard block
 block discarded – undo
174 174
 	if (
175 175
 		$lastmodified && !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && !isset($page['entetes']['Last-Modified'])
176 176
 	) {
177
-		$page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
177
+		$page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified).' GMT';
178 178
 	}
179 179
 
180 180
 	// fermer la connexion apres les headers si requete HEAD
@@ -206,7 +206,7 @@  discard block
 block discarded – undo
206 206
 		if (!defined('_CONTEXTE_IGNORE_LISTE_VARIABLES')) {
207 207
 			nettoyer_uri_var('');
208 208
 		}
209
-		$preg_ignore_variables = '/(' . implode('|',_CONTEXTE_IGNORE_LISTE_VARIABLES) . ')/';
209
+		$preg_ignore_variables = '/('.implode('|', _CONTEXTE_IGNORE_LISTE_VARIABLES).')/';
210 210
 	}
211 211
 
212 212
 	$contexte = [];
@@ -247,7 +247,7 @@  discard block
 block discarded – undo
247 247
 		'spip_version_code' => $GLOBALS['spip_version_code'],
248 248
 	];
249 249
 	if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
250
-		$contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
250
+		$contexte_implicite['host'] .= '|'.$_SERVER['HTTP_X_FORWARDED_HOST'];
251 251
 	}
252 252
 
253 253
 	return $contexte_implicite;
@@ -582,7 +582,7 @@  discard block
 block discarded – undo
582 582
 			}
583 583
 		}
584 584
 		if (is_null($id)) {
585
-			$msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
585
+			$msg = "modeles/$modele : "._T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
586 586
 			erreur_squelette($msg);
587 587
 			// on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
588 588
 			$id = 0;
@@ -625,7 +625,7 @@  discard block
 block discarded – undo
625 625
 		}
626 626
 
627 627
 		if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
628
-			if (!trouve_modele($fond = ($type . '_' . $soustype))) {
628
+			if (!trouve_modele($fond = ($type.'_'.$soustype))) {
629 629
 				$fond = '';
630 630
 				$class = $soustype;
631 631
 			}
@@ -640,7 +640,7 @@  discard block
 block discarded – undo
640 640
 		$compteur--;
641 641
 		return false;
642 642
 	}
643
-	$fond = 'modeles/' . $fond;
643
+	$fond = 'modeles/'.$fond;
644 644
 	// Creer le contexte
645 645
 	$contexte = $env;
646 646
 	// securiser le contexte des modèles : tout ce qui arrive de _request() doit être sanitizé
@@ -650,7 +650,7 @@  discard block
 block discarded – undo
650 650
 			if (is_scalar($v)) {
651 651
 				$v = spip_securise_valeur_env_modele($v);
652 652
 			} else {
653
-				array_walk_recursive($v, function (&$value, $index) {
653
+				array_walk_recursive($v, function(&$value, $index) {
654 654
 					$value = spip_securise_valeur_env_modele($value);
655 655
 				});
656 656
 			}
@@ -695,7 +695,7 @@  discard block
 block discarded – undo
695 695
 	// sinon, s'il y a un lien, on l'ajoute classiquement
696 696
 	if (
697 697
 		strstr(
698
-			' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
698
+			' '.($classes = extraire_attribut($retour, 'class')).' ',
699 699
 			'spip_lien_ok'
700 700
 		)
701 701
 	) {
@@ -706,7 +706,7 @@  discard block
 block discarded – undo
706 706
 		);
707 707
 	} else {
708 708
 		if ($lien) {
709
-			$retour = '<a href="' . $lien['href'] . '" class="' . $lien['class'] . '">' . $retour . '</a>';
709
+			$retour = '<a href="'.$lien['href'].'" class="'.$lien['class'].'">'.$retour.'</a>';
710 710
 		}
711 711
 	}
712 712
 
@@ -731,7 +731,7 @@  discard block
 block discarded – undo
731 731
 	if (is_numeric($valeur) || is_bool($valeur) || is_null($valeur)) {
732 732
 		return $valeur;
733 733
 	}
734
-	$valeur = (string)$valeur;
734
+	$valeur = (string) $valeur;
735 735
 	if (str_starts_with($valeur, '@') && is_numeric(substr($valeur, 1))) {
736 736
 		return $valeur;
737 737
 	}
@@ -751,7 +751,7 @@  discard block
 block discarded – undo
751 751
 		return $page;
752 752
 	}
753 753
 	// eval $page et affecte $res
754
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
754
+	include _ROOT_RESTREINT.'public/evaluer_page.php';
755 755
 
756 756
 	// Lever un drapeau (global) si le fond utilise #SESSION
757 757
 	// a destination de public/parametrer
@@ -819,16 +819,16 @@  discard block
 block discarded – undo
819 819
 			if (($pos = strpos($head, '<head>')) !== false) {
820 820
 				$head = substr_replace($head, $base, $pos + 6, 0);
821 821
 			} elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
822
-				$head = str_replace($r[0], $r[0] . $base, $head);
822
+				$head = str_replace($r[0], $r[0].$base, $head);
823 823
 			}
824
-			$texte = $head . substr($texte, $poshead);
824
+			$texte = $head.substr($texte, $poshead);
825 825
 		}
826 826
 		if ($href_base) {
827 827
 			// gerer les ancres
828 828
 			$base = $_SERVER['REQUEST_URI'];
829 829
 			// pas de guillemets ni < dans l'URL qu'on insere dans le HTML
830 830
 			if (str_contains($base, "'") || str_contains($base, '"') || str_contains($base, '<')) {
831
-				$base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
831
+				$base = str_replace(["'", '"', '<'], ['%27', '%22', '%3C'], $base);
832 832
 			}
833 833
 			if (str_contains($texte, "href='#")) {
834 834
 				$texte = str_replace("href='#", "href='$base#", $texte);
Please login to merge, or discard this patch.
Indentation   +664 added lines, -664 removed lines patch added patch discarded remove patch
@@ -19,170 +19,170 @@  discard block
 block discarded – undo
19 19
  **/
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 function assembler($fond, string $connect = '') {
26 26
 
27
-	$cache_key = null;
28
-	$lastmodified = null;
29
-	$res = null;
30
-	// flag_preserver est modifie ici, et utilise en globale
31
-	// use_cache sert a informer le bouton d'admin pr savoir s'il met un *
32
-	// contexte est utilise en globale dans le formulaire d'admin
33
-
34
-	$GLOBALS['contexte'] = calculer_contexte();
35
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
36
-	$page['contexte_implicite']['cache'] = $fond . preg_replace(
37
-		',\.[a-zA-Z0-9]*$,',
38
-		'',
39
-		preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
40
-	);
41
-	// Cette fonction est utilisee deux fois
42
-	$cacher = charger_fonction('cacher', 'public', true);
43
-	// Les quatre derniers parametres sont modifies par la fonction:
44
-	// emplacement, validite, et, s'il est valide, contenu & age
45
-	if ($cacher) {
46
-		$res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $cache_key, $page, $lastmodified);
47
-	} else {
48
-		$GLOBALS['use_cache'] = -1;
49
-	}
50
-	// Si un resultat est retourne, c'est un message d'impossibilite
51
-	if ($res) {
52
-		return ['texte' => $res];
53
-	}
54
-
55
-	if (!$cache_key || !$lastmodified) {
56
-		$lastmodified = time();
57
-	}
58
-
59
-	$headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
60
-	$calculer_page = true;
61
-
62
-	// Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
63
-	// une perennite valide a meme reponse qu'une requete HEAD (par defaut les
64
-	// pages sont dynamiques)
65
-	if (
66
-		isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
67
-		&& (!defined('_VAR_MODE') || !_VAR_MODE)
68
-		&& $cache_key && isset($page['entetes'])
69
-		&& isset($page['entetes']['Cache-Control'])
70
-		&& strstr($page['entetes']['Cache-Control'], 'max-age=')
71
-		&& !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
72
-	) {
73
-		$since = preg_replace(
74
-			'/;.*/',
75
-			'',
76
-			$_SERVER['HTTP_IF_MODIFIED_SINCE']
77
-		);
78
-		$since = str_replace('GMT', '', $since);
79
-		if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
80
-			$page['status'] = 304;
81
-			$headers_only = true;
82
-			$calculer_page = false;
83
-		}
84
-	}
85
-
86
-	// Si requete HEAD ou Last-modified compatible, ignorer le texte
87
-	// et pas de content-type (pour contrer le bouton admin de inc-public)
88
-	if (!$calculer_page) {
89
-		$page['texte'] = '';
90
-	} else {
91
-		// si la page est prise dans le cache
92
-		if (!$GLOBALS['use_cache']) {
93
-			// Informer les boutons d'admin du contexte
94
-			// (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
95
-			$GLOBALS['contexte'] = $page['contexte'];
96
-
97
-			// vider les globales url propres qui ne doivent plus etre utilisees en cas
98
-			// d'inversion url => objet
99
-			// plus necessaire si on utilise bien la fonction urls_decoder_url
100
-			#unset($_SERVER['REDIRECT_url_propre']);
101
-			#unset($_ENV['url_propre']);
102
-		} else {
103
-			// Compat ascendante :
104
-			// 1. $contexte est global
105
-			// (a evacuer car urls_decoder_url gere ce probleme ?)
106
-			// et calculer la page
107
-			if (!test_espace_prive()) {
108
-				include_spip('inc/urls');
109
-				[$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url(
110
-					nettoyer_uri(),
111
-					$fond,
112
-					$GLOBALS['contexte'],
113
-					true
114
-				);
115
-			}
116
-			// squelette par defaut
117
-			if (!strlen($fond ?? '')) {
118
-				$fond = 'sommaire';
119
-			}
120
-
121
-			// produire la page : peut mettre a jour $lastmodified
122
-			$produire_page = charger_fonction('produire_page', 'public');
123
-			$page = $produire_page(
124
-				$fond,
125
-				$GLOBALS['contexte'],
126
-				$GLOBALS['use_cache'],
127
-				$cache_key,
128
-				null,
129
-				$page,
130
-				$lastmodified,
131
-				$connect
132
-			);
133
-			if ($page === '') {
134
-				$erreur = _T(
135
-					'info_erreur_squelette2',
136
-					['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
137
-				);
138
-				erreur_squelette($erreur);
139
-				// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
140
-				$page = ['texte' => '', 'erreur' => $erreur];
141
-			}
142
-		}
143
-
144
-		if ($page && $cache_key) {
145
-			$page['cache'] = $cache_key;
146
-		}
147
-
148
-		auto_content_type($page);
149
-
150
-		$GLOBALS['flag_preserver'] |= headers_sent();
151
-
152
-		// Definir les entetes si ce n'est fait
153
-		if (!$GLOBALS['flag_preserver']) {
154
-			// Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
155
-			if (
156
-				trim($page['texte']) === ''
157
-				&& _VAR_MODE !== 'debug'
158
-				&& !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
159
-			) {
160
-				$GLOBALS['contexte']['fond_erreur'] = $fond;
161
-				$page = message_page_indisponible($page, $GLOBALS['contexte']);
162
-			}
163
-			// pas de cache client en mode 'observation'
164
-			if (defined('_VAR_MODE') && _VAR_MODE) {
165
-				$page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
166
-				$page['entetes']['Pragma'] = 'no-cache';
167
-			}
168
-		}
169
-	}
170
-
171
-	// Entete Last-Modified:
172
-	// eviter d'etre incoherent en envoyant un lastmodified identique
173
-	// a celui qu'on a refuse d'honorer plus haut (cf. #655)
174
-	if (
175
-		$lastmodified && !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && !isset($page['entetes']['Last-Modified'])
176
-	) {
177
-		$page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
178
-	}
179
-
180
-	// fermer la connexion apres les headers si requete HEAD
181
-	if ($headers_only) {
182
-		$page['entetes']['Connection'] = 'close';
183
-	}
184
-
185
-	return $page;
27
+    $cache_key = null;
28
+    $lastmodified = null;
29
+    $res = null;
30
+    // flag_preserver est modifie ici, et utilise en globale
31
+    // use_cache sert a informer le bouton d'admin pr savoir s'il met un *
32
+    // contexte est utilise en globale dans le formulaire d'admin
33
+
34
+    $GLOBALS['contexte'] = calculer_contexte();
35
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
36
+    $page['contexte_implicite']['cache'] = $fond . preg_replace(
37
+        ',\.[a-zA-Z0-9]*$,',
38
+        '',
39
+        preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
40
+    );
41
+    // Cette fonction est utilisee deux fois
42
+    $cacher = charger_fonction('cacher', 'public', true);
43
+    // Les quatre derniers parametres sont modifies par la fonction:
44
+    // emplacement, validite, et, s'il est valide, contenu & age
45
+    if ($cacher) {
46
+        $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $cache_key, $page, $lastmodified);
47
+    } else {
48
+        $GLOBALS['use_cache'] = -1;
49
+    }
50
+    // Si un resultat est retourne, c'est un message d'impossibilite
51
+    if ($res) {
52
+        return ['texte' => $res];
53
+    }
54
+
55
+    if (!$cache_key || !$lastmodified) {
56
+        $lastmodified = time();
57
+    }
58
+
59
+    $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
60
+    $calculer_page = true;
61
+
62
+    // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
63
+    // une perennite valide a meme reponse qu'une requete HEAD (par defaut les
64
+    // pages sont dynamiques)
65
+    if (
66
+        isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
67
+        && (!defined('_VAR_MODE') || !_VAR_MODE)
68
+        && $cache_key && isset($page['entetes'])
69
+        && isset($page['entetes']['Cache-Control'])
70
+        && strstr($page['entetes']['Cache-Control'], 'max-age=')
71
+        && !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
72
+    ) {
73
+        $since = preg_replace(
74
+            '/;.*/',
75
+            '',
76
+            $_SERVER['HTTP_IF_MODIFIED_SINCE']
77
+        );
78
+        $since = str_replace('GMT', '', $since);
79
+        if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
80
+            $page['status'] = 304;
81
+            $headers_only = true;
82
+            $calculer_page = false;
83
+        }
84
+    }
85
+
86
+    // Si requete HEAD ou Last-modified compatible, ignorer le texte
87
+    // et pas de content-type (pour contrer le bouton admin de inc-public)
88
+    if (!$calculer_page) {
89
+        $page['texte'] = '';
90
+    } else {
91
+        // si la page est prise dans le cache
92
+        if (!$GLOBALS['use_cache']) {
93
+            // Informer les boutons d'admin du contexte
94
+            // (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
95
+            $GLOBALS['contexte'] = $page['contexte'];
96
+
97
+            // vider les globales url propres qui ne doivent plus etre utilisees en cas
98
+            // d'inversion url => objet
99
+            // plus necessaire si on utilise bien la fonction urls_decoder_url
100
+            #unset($_SERVER['REDIRECT_url_propre']);
101
+            #unset($_ENV['url_propre']);
102
+        } else {
103
+            // Compat ascendante :
104
+            // 1. $contexte est global
105
+            // (a evacuer car urls_decoder_url gere ce probleme ?)
106
+            // et calculer la page
107
+            if (!test_espace_prive()) {
108
+                include_spip('inc/urls');
109
+                [$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url(
110
+                    nettoyer_uri(),
111
+                    $fond,
112
+                    $GLOBALS['contexte'],
113
+                    true
114
+                );
115
+            }
116
+            // squelette par defaut
117
+            if (!strlen($fond ?? '')) {
118
+                $fond = 'sommaire';
119
+            }
120
+
121
+            // produire la page : peut mettre a jour $lastmodified
122
+            $produire_page = charger_fonction('produire_page', 'public');
123
+            $page = $produire_page(
124
+                $fond,
125
+                $GLOBALS['contexte'],
126
+                $GLOBALS['use_cache'],
127
+                $cache_key,
128
+                null,
129
+                $page,
130
+                $lastmodified,
131
+                $connect
132
+            );
133
+            if ($page === '') {
134
+                $erreur = _T(
135
+                    'info_erreur_squelette2',
136
+                    ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
137
+                );
138
+                erreur_squelette($erreur);
139
+                // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
140
+                $page = ['texte' => '', 'erreur' => $erreur];
141
+            }
142
+        }
143
+
144
+        if ($page && $cache_key) {
145
+            $page['cache'] = $cache_key;
146
+        }
147
+
148
+        auto_content_type($page);
149
+
150
+        $GLOBALS['flag_preserver'] |= headers_sent();
151
+
152
+        // Definir les entetes si ce n'est fait
153
+        if (!$GLOBALS['flag_preserver']) {
154
+            // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
155
+            if (
156
+                trim($page['texte']) === ''
157
+                && _VAR_MODE !== 'debug'
158
+                && !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
159
+            ) {
160
+                $GLOBALS['contexte']['fond_erreur'] = $fond;
161
+                $page = message_page_indisponible($page, $GLOBALS['contexte']);
162
+            }
163
+            // pas de cache client en mode 'observation'
164
+            if (defined('_VAR_MODE') && _VAR_MODE) {
165
+                $page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
166
+                $page['entetes']['Pragma'] = 'no-cache';
167
+            }
168
+        }
169
+    }
170
+
171
+    // Entete Last-Modified:
172
+    // eviter d'etre incoherent en envoyant un lastmodified identique
173
+    // a celui qu'on a refuse d'honorer plus haut (cf. #655)
174
+    if (
175
+        $lastmodified && !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && !isset($page['entetes']['Last-Modified'])
176
+    ) {
177
+        $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
178
+    }
179
+
180
+    // fermer la connexion apres les headers si requete HEAD
181
+    if ($headers_only) {
182
+        $page['entetes']['Connection'] = 'close';
183
+    }
184
+
185
+    return $page;
186 186
 }
187 187
 
188 188
 /**
@@ -201,27 +201,27 @@  discard block
 block discarded – undo
201 201
  * @return array Un tableau du contexte de la page
202 202
  */
203 203
 function calculer_contexte() {
204
-	static $preg_ignore_variables;
205
-	if (empty($preg_ignore_variables)) {
206
-		if (!defined('_CONTEXTE_IGNORE_LISTE_VARIABLES')) {
207
-			nettoyer_uri_var('');
208
-		}
209
-		$preg_ignore_variables = '/(' . implode('|',_CONTEXTE_IGNORE_LISTE_VARIABLES) . ')/';
210
-	}
211
-
212
-	$contexte = [];
213
-	foreach ($_GET as $var => $val) {
214
-		if (!preg_match($preg_ignore_variables, $var)) {
215
-			$contexte[$var] = $val;
216
-		}
217
-	}
218
-	foreach ($_POST as $var => $val) {
219
-		if (!preg_match($preg_ignore_variables, $var)) {
220
-			$contexte[$var] = $val;
221
-		}
222
-	}
223
-
224
-	return $contexte;
204
+    static $preg_ignore_variables;
205
+    if (empty($preg_ignore_variables)) {
206
+        if (!defined('_CONTEXTE_IGNORE_LISTE_VARIABLES')) {
207
+            nettoyer_uri_var('');
208
+        }
209
+        $preg_ignore_variables = '/(' . implode('|',_CONTEXTE_IGNORE_LISTE_VARIABLES) . ')/';
210
+    }
211
+
212
+    $contexte = [];
213
+    foreach ($_GET as $var => $val) {
214
+        if (!preg_match($preg_ignore_variables, $var)) {
215
+            $contexte[$var] = $val;
216
+        }
217
+    }
218
+    foreach ($_POST as $var => $val) {
219
+        if (!preg_match($preg_ignore_variables, $var)) {
220
+            $contexte[$var] = $val;
221
+        }
222
+    }
223
+
224
+    return $contexte;
225 225
 }
226 226
 
227 227
 /**
@@ -232,25 +232,25 @@  discard block
 block discarded – undo
232 232
  * @return array
233 233
  */
234 234
 function calculer_contexte_implicite() {
235
-	static $notes = null;
236
-	if (is_null($notes)) {
237
-		$notes = charger_fonction('notes', 'inc', true);
238
-	}
239
-	$contexte_implicite = [
240
-		'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
241
-		'host' => ($_SERVER['HTTP_HOST'] ?? null),
242
-		'https' => ($_SERVER['HTTPS'] ?? ''),
243
-		'espace' => test_espace_prive(),
244
-		'marqueur' => ($GLOBALS['marqueur'] ?? ''),
245
-		'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''),
246
-		'notes' => $notes ? $notes('', 'contexter_cache') : '',
247
-		'spip_version_code' => $GLOBALS['spip_version_code'],
248
-	];
249
-	if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
250
-		$contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
251
-	}
252
-
253
-	return $contexte_implicite;
235
+    static $notes = null;
236
+    if (is_null($notes)) {
237
+        $notes = charger_fonction('notes', 'inc', true);
238
+    }
239
+    $contexte_implicite = [
240
+        'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
241
+        'host' => ($_SERVER['HTTP_HOST'] ?? null),
242
+        'https' => ($_SERVER['HTTPS'] ?? ''),
243
+        'espace' => test_espace_prive(),
244
+        'marqueur' => ($GLOBALS['marqueur'] ?? ''),
245
+        'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''),
246
+        'notes' => $notes ? $notes('', 'contexter_cache') : '',
247
+        'spip_version_code' => $GLOBALS['spip_version_code'],
248
+    ];
249
+    if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
250
+        $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
251
+    }
252
+
253
+    return $contexte_implicite;
254 254
 }
255 255
 
256 256
 //
@@ -259,56 +259,56 @@  discard block
 block discarded – undo
259 259
 
260 260
 function auto_content_type($page) {
261 261
 
262
-	if (!isset($GLOBALS['flag_preserver'])) {
263
-		$GLOBALS['flag_preserver'] = ($page && preg_match(
264
-			'/header\s*\(\s*.content\-type:/isx',
265
-			$page['texte']
266
-		) || (isset($page['entetes']['Content-Type'])));
267
-	}
262
+    if (!isset($GLOBALS['flag_preserver'])) {
263
+        $GLOBALS['flag_preserver'] = ($page && preg_match(
264
+            '/header\s*\(\s*.content\-type:/isx',
265
+            $page['texte']
266
+        ) || (isset($page['entetes']['Content-Type'])));
267
+    }
268 268
 }
269 269
 
270 270
 function inclure_page($fond, $contexte, string $connect = '') {
271
-	$use_cache = null;
272
-	$cache_key = null;
273
-	$lastinclude = null;
274
-	$res = null;
275
-	static $cacher, $produire_page;
276
-
277
-	// enlever le fond de contexte inclus car sinon il prend la main
278
-	// dans les sous inclusions -> boucle infinie d'inclusion identique
279
-	// (cette precaution n'est probablement plus utile)
280
-	unset($contexte['fond']);
281
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
282
-	$page['contexte_implicite']['cache'] = $fond;
283
-	if (is_null($cacher)) {
284
-		$cacher = charger_fonction('cacher', 'public', true);
285
-	}
286
-	// Les quatre derniers parametres sont modifies par la fonction:
287
-	// emplacement, validite, et, s'il est valide, contenu & age
288
-	if ($cacher) {
289
-		$res = $cacher($contexte, $use_cache, $cache_key, $page, $lastinclude);
290
-	} else {
291
-		$use_cache = -1;
292
-	}
293
-
294
-	// $res = message d'erreur : on sort de la
295
-	if ($res) {
296
-		return ['texte' => $res];
297
-	}
298
-
299
-	// Si use_cache ne vaut pas 0, la page doit etre calculee
300
-	// produire la page : peut mettre a jour $lastinclude
301
-	// le contexte_cache envoye a cacher() a ete conserve et est passe a produire
302
-	if ($use_cache) {
303
-		if (is_null($produire_page)) {
304
-			$produire_page = charger_fonction('produire_page', 'public');
305
-		}
306
-		$page = $produire_page($fond, $contexte, $use_cache, $cache_key, $contexte, $page, $lastinclude, $connect);
307
-	}
308
-	// dans tous les cas, mettre a jour $GLOBALS['lastmodified']
309
-	$GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude);
310
-
311
-	return $page;
271
+    $use_cache = null;
272
+    $cache_key = null;
273
+    $lastinclude = null;
274
+    $res = null;
275
+    static $cacher, $produire_page;
276
+
277
+    // enlever le fond de contexte inclus car sinon il prend la main
278
+    // dans les sous inclusions -> boucle infinie d'inclusion identique
279
+    // (cette precaution n'est probablement plus utile)
280
+    unset($contexte['fond']);
281
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
282
+    $page['contexte_implicite']['cache'] = $fond;
283
+    if (is_null($cacher)) {
284
+        $cacher = charger_fonction('cacher', 'public', true);
285
+    }
286
+    // Les quatre derniers parametres sont modifies par la fonction:
287
+    // emplacement, validite, et, s'il est valide, contenu & age
288
+    if ($cacher) {
289
+        $res = $cacher($contexte, $use_cache, $cache_key, $page, $lastinclude);
290
+    } else {
291
+        $use_cache = -1;
292
+    }
293
+
294
+    // $res = message d'erreur : on sort de la
295
+    if ($res) {
296
+        return ['texte' => $res];
297
+    }
298
+
299
+    // Si use_cache ne vaut pas 0, la page doit etre calculee
300
+    // produire la page : peut mettre a jour $lastinclude
301
+    // le contexte_cache envoye a cacher() a ete conserve et est passe a produire
302
+    if ($use_cache) {
303
+        if (is_null($produire_page)) {
304
+            $produire_page = charger_fonction('produire_page', 'public');
305
+        }
306
+        $page = $produire_page($fond, $contexte, $use_cache, $cache_key, $contexte, $page, $lastinclude, $connect);
307
+    }
308
+    // dans tous les cas, mettre a jour $GLOBALS['lastmodified']
309
+    $GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude);
310
+
311
+    return $page;
312 312
 }
313 313
 
314 314
 /**
@@ -326,41 +326,41 @@  discard block
 block discarded – undo
326 326
  * @return array
327 327
  */
328 328
 function public_produire_page_dist(
329
-	$fond,
330
-	$contexte,
331
-	$use_cache,
332
-	$cache_key,
333
-	$contexte_cache,
334
-	&$page,
335
-	&$lastinclude,
336
-	$connect = ''
329
+    $fond,
330
+    $contexte,
331
+    $use_cache,
332
+    $cache_key,
333
+    $contexte_cache,
334
+    &$page,
335
+    &$lastinclude,
336
+    $connect = ''
337 337
 ) {
338
-	static $parametrer, $cacher;
339
-	if (!$parametrer) {
340
-		$parametrer = charger_fonction('parametrer', 'public');
341
-	}
342
-	$page = $parametrer($fond, $contexte, $cache_key, $connect);
343
-	// et on l'enregistre sur le disque
344
-	if (
345
-		$cache_key
346
-		&& $use_cache > -1
347
-		&& is_array($page)
348
-		&& count($page)
349
-		&& isset($page['entetes']['X-Spip-Cache'])
350
-		&& $page['entetes']['X-Spip-Cache'] > 0
351
-	) {
352
-		if (is_null($cacher)) {
353
-			$cacher = charger_fonction('cacher', 'public', true);
354
-		}
355
-		$lastinclude = time();
356
-		if ($cacher) {
357
-			$cacher($contexte_cache, $use_cache, $cache_key, $page, $lastinclude);
358
-		} else {
359
-			$use_cache = -1;
360
-		}
361
-	}
362
-
363
-	return $page;
338
+    static $parametrer, $cacher;
339
+    if (!$parametrer) {
340
+        $parametrer = charger_fonction('parametrer', 'public');
341
+    }
342
+    $page = $parametrer($fond, $contexte, $cache_key, $connect);
343
+    // et on l'enregistre sur le disque
344
+    if (
345
+        $cache_key
346
+        && $use_cache > -1
347
+        && is_array($page)
348
+        && count($page)
349
+        && isset($page['entetes']['X-Spip-Cache'])
350
+        && $page['entetes']['X-Spip-Cache'] > 0
351
+    ) {
352
+        if (is_null($cacher)) {
353
+            $cacher = charger_fonction('cacher', 'public', true);
354
+        }
355
+        $lastinclude = time();
356
+        if ($cacher) {
357
+            $cacher($contexte_cache, $use_cache, $cache_key, $page, $lastinclude);
358
+        } else {
359
+            $use_cache = -1;
360
+        }
361
+    }
362
+
363
+    return $page;
364 364
 }
365 365
 
366 366
 // Fonction inseree par le compilateur dans le code compile.
@@ -374,14 +374,14 @@  discard block
 block discarded – undo
374 374
 // 4: langue
375 375
 
376 376
 function inserer_balise_dynamique($contexte_exec, $contexte_compil) {
377
-	arguments_balise_dyn_depuis_modele(null, 'reset');
378
-
379
-	if (!is_array($contexte_exec)) {
380
-		echo $contexte_exec;
381
-	} // message d'erreur etc
382
-	else {
383
-		inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
384
-	}
377
+    arguments_balise_dyn_depuis_modele(null, 'reset');
378
+
379
+    if (!is_array($contexte_exec)) {
380
+        echo $contexte_exec;
381
+    } // message d'erreur etc
382
+    else {
383
+        inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
384
+    }
385 385
 }
386 386
 
387 387
 /**
@@ -394,101 +394,101 @@  discard block
 block discarded – undo
394 394
  * @return string|void
395 395
  */
396 396
 function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = []) {
397
-	if (is_array($texte)) {
398
-		[$fond, $delainc, $contexte_inclus] = $texte;
399
-
400
-		// delais a l'ancienne, c'est pratiquement mort
401
-		$d = $GLOBALS['delais'] ?? null;
402
-		$GLOBALS['delais'] = $delainc;
403
-
404
-		$page = recuperer_fond(
405
-			$fond,
406
-			$contexte_inclus,
407
-			['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
408
-		);
409
-
410
-		$texte = $page['texte'];
411
-
412
-		$GLOBALS['delais'] = $d;
413
-		// Faire remonter les entetes
414
-		if (
415
-			isset($page['entetes'])
416
-			&& is_array($page['entetes'])
417
-		) {
418
-			// mais pas toutes
419
-			unset($page['entetes']['X-Spip-Cache']);
420
-			unset($page['entetes']['Content-Type']);
421
-			if (isset($GLOBALS['page']) && is_array($GLOBALS['page'])) {
422
-				if (!is_array($GLOBALS['page']['entetes'])) {
423
-					$GLOBALS['page']['entetes'] = [];
424
-				}
425
-				$GLOBALS['page']['entetes'] =
426
-					array_merge($GLOBALS['page']['entetes'], $page['entetes']);
427
-			}
428
-		}
429
-		// _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
430
-		if (
431
-			isset($page['contexte']['_pipelines'])
432
-			&& is_array($page['contexte']['_pipelines'])
433
-			&& count($page['contexte']['_pipelines'])
434
-		) {
435
-			foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
436
-				$args['contexte'] = $page['contexte'];
437
-				unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
438
-				$texte = pipeline(
439
-					$pipe,
440
-					[
441
-						'data' => $texte,
442
-						'args' => $args
443
-					]
444
-				);
445
-			}
446
-		}
447
-	}
448
-
449
-	if (defined('_VAR_MODE') && _VAR_MODE == 'debug') {
450
-		// compatibilite : avant on donnait le numero de ligne ou rien.
451
-		$ligne = intval($contexte_compil[3] ?? $contexte_compil);
452
-		$GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
453
-	}
454
-	if ($echo) {
455
-		echo $texte;
456
-	} else {
457
-		return $texte;
458
-	}
397
+    if (is_array($texte)) {
398
+        [$fond, $delainc, $contexte_inclus] = $texte;
399
+
400
+        // delais a l'ancienne, c'est pratiquement mort
401
+        $d = $GLOBALS['delais'] ?? null;
402
+        $GLOBALS['delais'] = $delainc;
403
+
404
+        $page = recuperer_fond(
405
+            $fond,
406
+            $contexte_inclus,
407
+            ['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
408
+        );
409
+
410
+        $texte = $page['texte'];
411
+
412
+        $GLOBALS['delais'] = $d;
413
+        // Faire remonter les entetes
414
+        if (
415
+            isset($page['entetes'])
416
+            && is_array($page['entetes'])
417
+        ) {
418
+            // mais pas toutes
419
+            unset($page['entetes']['X-Spip-Cache']);
420
+            unset($page['entetes']['Content-Type']);
421
+            if (isset($GLOBALS['page']) && is_array($GLOBALS['page'])) {
422
+                if (!is_array($GLOBALS['page']['entetes'])) {
423
+                    $GLOBALS['page']['entetes'] = [];
424
+                }
425
+                $GLOBALS['page']['entetes'] =
426
+                    array_merge($GLOBALS['page']['entetes'], $page['entetes']);
427
+            }
428
+        }
429
+        // _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
430
+        if (
431
+            isset($page['contexte']['_pipelines'])
432
+            && is_array($page['contexte']['_pipelines'])
433
+            && count($page['contexte']['_pipelines'])
434
+        ) {
435
+            foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
436
+                $args['contexte'] = $page['contexte'];
437
+                unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
438
+                $texte = pipeline(
439
+                    $pipe,
440
+                    [
441
+                        'data' => $texte,
442
+                        'args' => $args
443
+                    ]
444
+                );
445
+            }
446
+        }
447
+    }
448
+
449
+    if (defined('_VAR_MODE') && _VAR_MODE == 'debug') {
450
+        // compatibilite : avant on donnait le numero de ligne ou rien.
451
+        $ligne = intval($contexte_compil[3] ?? $contexte_compil);
452
+        $GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
453
+    }
454
+    if ($echo) {
455
+        echo $texte;
456
+    } else {
457
+        return $texte;
458
+    }
459 459
 }
460 460
 
461 461
 function message_page_indisponible($page, $contexte) {
462
-	static $deja = false;
463
-	if ($deja) {
464
-		return 'erreur';
465
-	}
466
-	$codes = [
467
-		'404' => '404 Not Found',
468
-		'503' => '503 Service Unavailable',
469
-	];
470
-
471
-	$contexte['status'] = ($page !== false) ? '404' : '503';
472
-	$contexte['code'] = $codes[$contexte['status']];
473
-	$contexte['fond'] = '404'; // gere les 2 erreurs
474
-	if (!isset($contexte['lang'])) {
475
-		include_spip('inc/lang');
476
-		$contexte['lang'] = $GLOBALS['spip_lang'];
477
-	}
478
-
479
-	$deja = true;
480
-	// passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
481
-	// ex restriction d'acces => 401
482
-	$contexte = pipeline('page_indisponible', $contexte);
483
-
484
-	// produire la page d'erreur
485
-	$page = inclure_page($contexte['fond'], $contexte);
486
-	if (!$page) {
487
-		$page = inclure_page('404', $contexte);
488
-	}
489
-	$page['status'] = $contexte['status'];
490
-
491
-	return $page;
462
+    static $deja = false;
463
+    if ($deja) {
464
+        return 'erreur';
465
+    }
466
+    $codes = [
467
+        '404' => '404 Not Found',
468
+        '503' => '503 Service Unavailable',
469
+    ];
470
+
471
+    $contexte['status'] = ($page !== false) ? '404' : '503';
472
+    $contexte['code'] = $codes[$contexte['status']];
473
+    $contexte['fond'] = '404'; // gere les 2 erreurs
474
+    if (!isset($contexte['lang'])) {
475
+        include_spip('inc/lang');
476
+        $contexte['lang'] = $GLOBALS['spip_lang'];
477
+    }
478
+
479
+    $deja = true;
480
+    // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
481
+    // ex restriction d'acces => 401
482
+    $contexte = pipeline('page_indisponible', $contexte);
483
+
484
+    // produire la page d'erreur
485
+    $page = inclure_page($contexte['fond'], $contexte);
486
+    if (!$page) {
487
+        $page = inclure_page('404', $contexte);
488
+    }
489
+    $page['status'] = $contexte['status'];
490
+
491
+    return $page;
492 492
 }
493 493
 
494 494
 /**
@@ -500,44 +500,44 @@  discard block
 block discarded – undo
500 500
  * @return mixed
501 501
  */
502 502
 function arguments_balise_dyn_depuis_modele($arg, $operation = 'set') {
503
-	static $balise_dyn_appellee_par_modele = null;
504
-	switch ($operation) {
505
-		case 'read':
506
-			return $balise_dyn_appellee_par_modele;
507
-		case 'reset':
508
-			$balise_dyn_appellee_par_modele = null;
509
-			return null;
510
-		case 'set':
511
-		default:
512
-			$balise_dyn_appellee_par_modele = $arg;
513
-			return $arg;
514
-	}
503
+    static $balise_dyn_appellee_par_modele = null;
504
+    switch ($operation) {
505
+        case 'read':
506
+            return $balise_dyn_appellee_par_modele;
507
+        case 'reset':
508
+            $balise_dyn_appellee_par_modele = null;
509
+            return null;
510
+        case 'set':
511
+        default:
512
+            $balise_dyn_appellee_par_modele = $arg;
513
+            return $arg;
514
+    }
515 515
 }
516 516
 
517 517
 // temporairement ici : a mettre dans le futur inc/modeles
518 518
 // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array()
519 519
 function creer_contexte_de_modele($args) {
520
-	$contexte = [];
521
-	foreach ($args as $var => $val) {
522
-		if (is_int($var)) { // argument pas formate
523
-			if (in_array($val, ['left', 'right', 'center'])) {
524
-				$var = 'align';
525
-				$contexte[$var] = $val;
526
-			} else {
527
-				$args = explode('=', $val);
528
-				if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
529
-				$contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
530
-				} else // notation abregee
531
-				{
532
-					$contexte[trim($val)] = trim($val);
533
-				}
534
-			}
535
-		} else {
536
-			$contexte[$var] = $val;
537
-		}
538
-	}
539
-
540
-	return $contexte;
520
+    $contexte = [];
521
+    foreach ($args as $var => $val) {
522
+        if (is_int($var)) { // argument pas formate
523
+            if (in_array($val, ['left', 'right', 'center'])) {
524
+                $var = 'align';
525
+                $contexte[$var] = $val;
526
+            } else {
527
+                $args = explode('=', $val);
528
+                if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
529
+                $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
530
+                } else // notation abregee
531
+                {
532
+                    $contexte[trim($val)] = trim($val);
533
+                }
534
+            }
535
+        } else {
536
+            $contexte[$var] = $val;
537
+        }
538
+    }
539
+
540
+    return $contexte;
541 541
 }
542 542
 
543 543
 /**
@@ -552,45 +552,45 @@  discard block
 block discarded – undo
552 552
  * @return string
553 553
  */
554 554
 function styliser_modele($modele, $id, $contexte = null) {
555
-	static $styliseurs = null;
556
-	if (is_null($styliseurs)) {
557
-		$tables_objet = lister_tables_objets_sql();
558
-		foreach ($tables_objet as $table => $desc) {
559
-			if (
560
-				isset($desc['modeles'])
561
-				&& $desc['modeles']
562
-				&& isset($desc['modeles_styliser'])
563
-				&& $desc['modeles_styliser']
564
-				&& function_exists($desc['modeles_styliser'])
565
-			) {
566
-				$primary = id_table_objet($table);
567
-				foreach ($desc['modeles'] as $m) {
568
-					$styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
569
-				}
570
-			}
571
-		}
572
-	}
573
-
574
-	if (isset($styliseurs[$modele])) {
575
-		$styliseur = $styliseurs[$modele]['callback'];
576
-		$primary = $styliseurs[$modele]['primary'];
577
-		if (is_null($id) && $contexte) {
578
-			if (isset($contexte['id'])) {
579
-				$id = $contexte['id'];
580
-			} elseif (isset($contexte[$primary])) {
581
-				$id = $contexte[$primary];
582
-			}
583
-		}
584
-		if (is_null($id)) {
585
-			$msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
586
-			erreur_squelette($msg);
587
-			// on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
588
-			$id = 0;
589
-		}
590
-		$modele = $styliseur($modele, $id);
591
-	}
592
-
593
-	return $modele;
555
+    static $styliseurs = null;
556
+    if (is_null($styliseurs)) {
557
+        $tables_objet = lister_tables_objets_sql();
558
+        foreach ($tables_objet as $table => $desc) {
559
+            if (
560
+                isset($desc['modeles'])
561
+                && $desc['modeles']
562
+                && isset($desc['modeles_styliser'])
563
+                && $desc['modeles_styliser']
564
+                && function_exists($desc['modeles_styliser'])
565
+            ) {
566
+                $primary = id_table_objet($table);
567
+                foreach ($desc['modeles'] as $m) {
568
+                    $styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
569
+                }
570
+            }
571
+        }
572
+    }
573
+
574
+    if (isset($styliseurs[$modele])) {
575
+        $styliseur = $styliseurs[$modele]['callback'];
576
+        $primary = $styliseurs[$modele]['primary'];
577
+        if (is_null($id) && $contexte) {
578
+            if (isset($contexte['id'])) {
579
+                $id = $contexte['id'];
580
+            } elseif (isset($contexte[$primary])) {
581
+                $id = $contexte[$primary];
582
+            }
583
+        }
584
+        if (is_null($id)) {
585
+            $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
586
+            erreur_squelette($msg);
587
+            // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
588
+            $id = 0;
589
+        }
590
+        $modele = $styliseur($modele, $id);
591
+    }
592
+
593
+    return $modele;
594 594
 }
595 595
 
596 596
 /**
@@ -605,116 +605,116 @@  discard block
 block discarded – undo
605 605
  */
606 606
 function inclure_modele($type, $id, $params, $lien, string $connect = '', $env = []) {
607 607
 
608
-	static $compteur;
609
-	if (++$compteur > 10) {
610
-		return '';
611
-	} # ne pas boucler indefiniment
612
-
613
-	$type = strtolower($type);
614
-	$type = styliser_modele($type, $id);
615
-
616
-	$fond = $class = '';
617
-
618
-	$params = array_filter(explode('|', $params));
619
-	if ($params) {
620
-		$soustype = current($params);
621
-		$soustype = strtolower(trim($soustype));
622
-		if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
623
-			$soustype = next($params);
624
-			$soustype = strtolower($soustype);
625
-		}
626
-
627
-		if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
628
-			if (!trouve_modele($fond = ($type . '_' . $soustype))) {
629
-				$fond = '';
630
-				$class = $soustype;
631
-			}
632
-			// enlever le sous type des params
633
-			$params = array_diff($params, [$soustype]);
634
-		}
635
-	}
636
-
637
-	// Si ca marche pas en precisant le sous-type, prendre le type
638
-	if (!$fond && !trouve_modele($fond = $type)) {
639
-		spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
640
-		$compteur--;
641
-		return false;
642
-	}
643
-	$fond = 'modeles/' . $fond;
644
-	// Creer le contexte
645
-	$contexte = $env;
646
-	// securiser le contexte des modèles : tout ce qui arrive de _request() doit être sanitizé
647
-	foreach ($contexte as $k => &$v) {
648
-		if (!is_null(_request($k)) && (!is_scalar($v) || (_request($k) === $v))) {
649
-			include_spip('inc/texte_mini');
650
-			if (is_scalar($v)) {
651
-				$v = spip_securise_valeur_env_modele($v);
652
-			} else {
653
-				array_walk_recursive($v, function (&$value, $index) {
654
-					$value = spip_securise_valeur_env_modele($value);
655
-				});
656
-			}
657
-		}
658
-	}
659
-
660
-	$contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
661
-
662
-	// Le numero du modele est mis dans l'environnement
663
-	// d'une part sous l'identifiant "id"
664
-	// et d'autre part sous l'identifiant de la cle primaire
665
-	// par la fonction id_table_objet,
666
-	// (<article1> =>> article =>> id_article =>> id_article=1)
667
-	$_id = id_table_objet($type);
668
-	$contexte['id'] = $contexte[$_id] = $id;
669
-
670
-	if (isset($class)) {
671
-		$contexte['class'] = $class;
672
-	}
673
-
674
-	// Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
675
-	if ($lien) {
676
-		# un eventuel guillemet (") sera reechappe par #ENV
677
-		$contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
678
-		$contexte['lien_class'] = $lien['class'];
679
-		$contexte['lien_mime'] = $lien['mime'];
680
-		$contexte['lien_title'] = $lien['title'];
681
-		$contexte['lien_hreflang'] = $lien['hreflang'];
682
-	}
683
-
684
-	// Traiter les parametres
685
-	// par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
686
-	$arg_list = creer_contexte_de_modele($params);
687
-	$contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
688
-	$contexte = array_merge($contexte, $arg_list);
689
-
690
-	// Appliquer le modele avec le contexte
691
-	$retour = recuperer_fond($fond, $contexte, [], $connect);
692
-
693
-	// Regarder si le modele tient compte des liens (il *doit* alors indiquer
694
-	// spip_lien_ok dans les classes de son conteneur de premier niveau ;
695
-	// sinon, s'il y a un lien, on l'ajoute classiquement
696
-	if (
697
-		strstr(
698
-			' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
699
-			'spip_lien_ok'
700
-		)
701
-	) {
702
-		$retour = inserer_attribut(
703
-			$retour,
704
-			'class',
705
-			trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
706
-		);
707
-	} else {
708
-		if ($lien) {
709
-			$retour = '<a href="' . $lien['href'] . '" class="' . $lien['class'] . '">' . $retour . '</a>';
710
-		}
711
-	}
712
-
713
-	$compteur--;
714
-
715
-	return (isset($arg_list['ajax']) && $arg_list['ajax'] == 'ajax')
716
-		? encoder_contexte_ajax($contexte, '', $retour)
717
-		: $retour;
608
+    static $compteur;
609
+    if (++$compteur > 10) {
610
+        return '';
611
+    } # ne pas boucler indefiniment
612
+
613
+    $type = strtolower($type);
614
+    $type = styliser_modele($type, $id);
615
+
616
+    $fond = $class = '';
617
+
618
+    $params = array_filter(explode('|', $params));
619
+    if ($params) {
620
+        $soustype = current($params);
621
+        $soustype = strtolower(trim($soustype));
622
+        if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
623
+            $soustype = next($params);
624
+            $soustype = strtolower($soustype);
625
+        }
626
+
627
+        if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
628
+            if (!trouve_modele($fond = ($type . '_' . $soustype))) {
629
+                $fond = '';
630
+                $class = $soustype;
631
+            }
632
+            // enlever le sous type des params
633
+            $params = array_diff($params, [$soustype]);
634
+        }
635
+    }
636
+
637
+    // Si ca marche pas en precisant le sous-type, prendre le type
638
+    if (!$fond && !trouve_modele($fond = $type)) {
639
+        spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
640
+        $compteur--;
641
+        return false;
642
+    }
643
+    $fond = 'modeles/' . $fond;
644
+    // Creer le contexte
645
+    $contexte = $env;
646
+    // securiser le contexte des modèles : tout ce qui arrive de _request() doit être sanitizé
647
+    foreach ($contexte as $k => &$v) {
648
+        if (!is_null(_request($k)) && (!is_scalar($v) || (_request($k) === $v))) {
649
+            include_spip('inc/texte_mini');
650
+            if (is_scalar($v)) {
651
+                $v = spip_securise_valeur_env_modele($v);
652
+            } else {
653
+                array_walk_recursive($v, function (&$value, $index) {
654
+                    $value = spip_securise_valeur_env_modele($value);
655
+                });
656
+            }
657
+        }
658
+    }
659
+
660
+    $contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
661
+
662
+    // Le numero du modele est mis dans l'environnement
663
+    // d'une part sous l'identifiant "id"
664
+    // et d'autre part sous l'identifiant de la cle primaire
665
+    // par la fonction id_table_objet,
666
+    // (<article1> =>> article =>> id_article =>> id_article=1)
667
+    $_id = id_table_objet($type);
668
+    $contexte['id'] = $contexte[$_id] = $id;
669
+
670
+    if (isset($class)) {
671
+        $contexte['class'] = $class;
672
+    }
673
+
674
+    // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
675
+    if ($lien) {
676
+        # un eventuel guillemet (") sera reechappe par #ENV
677
+        $contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
678
+        $contexte['lien_class'] = $lien['class'];
679
+        $contexte['lien_mime'] = $lien['mime'];
680
+        $contexte['lien_title'] = $lien['title'];
681
+        $contexte['lien_hreflang'] = $lien['hreflang'];
682
+    }
683
+
684
+    // Traiter les parametres
685
+    // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
686
+    $arg_list = creer_contexte_de_modele($params);
687
+    $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
688
+    $contexte = array_merge($contexte, $arg_list);
689
+
690
+    // Appliquer le modele avec le contexte
691
+    $retour = recuperer_fond($fond, $contexte, [], $connect);
692
+
693
+    // Regarder si le modele tient compte des liens (il *doit* alors indiquer
694
+    // spip_lien_ok dans les classes de son conteneur de premier niveau ;
695
+    // sinon, s'il y a un lien, on l'ajoute classiquement
696
+    if (
697
+        strstr(
698
+            ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
699
+            'spip_lien_ok'
700
+        )
701
+    ) {
702
+        $retour = inserer_attribut(
703
+            $retour,
704
+            'class',
705
+            trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
706
+        );
707
+    } else {
708
+        if ($lien) {
709
+            $retour = '<a href="' . $lien['href'] . '" class="' . $lien['class'] . '">' . $retour . '</a>';
710
+        }
711
+    }
712
+
713
+    $compteur--;
714
+
715
+    return (isset($arg_list['ajax']) && $arg_list['ajax'] == 'ajax')
716
+        ? encoder_contexte_ajax($contexte, '', $retour)
717
+        : $retour;
718 718
 }
719 719
 
720 720
 /**
@@ -728,15 +728,15 @@  discard block
 block discarded – undo
728 728
  * @return array|float|int|mixed|string|string[]|null
729 729
  */
730 730
 function spip_securise_valeur_env_modele($valeur) {
731
-	if (is_numeric($valeur) || is_bool($valeur) || is_null($valeur)) {
732
-		return $valeur;
733
-	}
734
-	$valeur = (string)$valeur;
735
-	if (str_starts_with($valeur, '@') && is_numeric(substr($valeur, 1))) {
736
-		return $valeur;
737
-	}
738
-	// on laisse passer que les \w, les espaces et les -, le reste est supprimé
739
-	return preg_replace(",[^\w\s-],", "", $valeur);
731
+    if (is_numeric($valeur) || is_bool($valeur) || is_null($valeur)) {
732
+        return $valeur;
733
+    }
734
+    $valeur = (string)$valeur;
735
+    if (str_starts_with($valeur, '@') && is_numeric(substr($valeur, 1))) {
736
+        return $valeur;
737
+    }
738
+    // on laisse passer que les \w, les espaces et les -, le reste est supprimé
739
+    return preg_replace(",[^\w\s-],", "", $valeur);
740 740
 }
741 741
 
742 742
 // Un inclure_page qui marche aussi pour l'espace prive
@@ -745,99 +745,99 @@  discard block
 block discarded – undo
745 745
 // 	recuperer_fond($fond,$contexte,array('raw'=>true))
746 746
 function evaluer_fond($fond, $contexte = [], string $connect = '') {
747 747
 
748
-	$page = inclure_page($fond, $contexte, $connect);
749
-
750
-	if (!$page) {
751
-		return $page;
752
-	}
753
-	// eval $page et affecte $res
754
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
755
-
756
-	// Lever un drapeau (global) si le fond utilise #SESSION
757
-	// a destination de public/parametrer
758
-	// pour remonter vers les inclusions appelantes
759
-	// il faut bien lever ce drapeau apres avoir evalue le fond
760
-	// pour ne pas faire descendre le flag vers les inclusions appelees
761
-	if (
762
-		isset($page['invalideurs'])
763
-		&& isset($page['invalideurs']['session'])
764
-	) {
765
-		$GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
766
-	}
767
-
768
-	return $page;
748
+    $page = inclure_page($fond, $contexte, $connect);
749
+
750
+    if (!$page) {
751
+        return $page;
752
+    }
753
+    // eval $page et affecte $res
754
+    include _ROOT_RESTREINT . 'public/evaluer_page.php';
755
+
756
+    // Lever un drapeau (global) si le fond utilise #SESSION
757
+    // a destination de public/parametrer
758
+    // pour remonter vers les inclusions appelantes
759
+    // il faut bien lever ce drapeau apres avoir evalue le fond
760
+    // pour ne pas faire descendre le flag vers les inclusions appelees
761
+    if (
762
+        isset($page['invalideurs'])
763
+        && isset($page['invalideurs']['session'])
764
+    ) {
765
+        $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
766
+    }
767
+
768
+    return $page;
769 769
 }
770 770
 
771 771
 
772 772
 function page_base_href(&$texte) {
773
-	static $set_html_base = null;
774
-	if (is_null($set_html_base)) {
775
-		if (!defined('_SET_HTML_BASE')) {
776
-			// si la profondeur est superieure a 1
777
-			// est que ce n'est pas une url page ni une url action
778
-			// activer par defaut
779
-			$set_html_base =
780
-				$GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
781
-				&& _request(_SPIP_PAGE) !== 'login'
782
-				&& !_request('action');
783
-		} else {
784
-			$set_html_base = _SET_HTML_BASE;
785
-		}
786
-	}
787
-
788
-	if (
789
-		$set_html_base
790
-		&& isset($GLOBALS['html'])
791
-		&& $GLOBALS['html']
792
-		&& $GLOBALS['profondeur_url'] > 0
793
-		&& ($poshead = strpos($texte, '</head>')) !== false
794
-	) {
795
-		$head = substr($texte, 0, $poshead);
796
-		$insert = false;
797
-		$href_base = false;
798
-		if (!str_contains($head, '<base')) {
799
-			$insert = true;
800
-		} else {
801
-			// si aucun <base ...> n'a de href il faut en inserer un
802
-			// sinon juste re-ecrire les ancres si besoin
803
-			$insert = true;
804
-			include_spip('inc/filtres');
805
-			$bases = extraire_balises($head, 'base');
806
-			foreach ($bases as $base) {
807
-				if ($href_base = extraire_attribut($base, 'href')) {
808
-					$insert = false;
809
-					break;
810
-				}
811
-			}
812
-		}
813
-
814
-		if ($insert) {
815
-			include_spip('inc/filtres_mini');
816
-			// ajouter un base qui reglera tous les liens relatifs
817
-			$href_base = url_absolue('./');
818
-			$base = "\n<base href=\"$href_base\" />";
819
-			if (($pos = strpos($head, '<head>')) !== false) {
820
-				$head = substr_replace($head, $base, $pos + 6, 0);
821
-			} elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
822
-				$head = str_replace($r[0], $r[0] . $base, $head);
823
-			}
824
-			$texte = $head . substr($texte, $poshead);
825
-		}
826
-		if ($href_base) {
827
-			// gerer les ancres
828
-			$base = $_SERVER['REQUEST_URI'];
829
-			// pas de guillemets ni < dans l'URL qu'on insere dans le HTML
830
-			if (str_contains($base, "'") || str_contains($base, '"') || str_contains($base, '<')) {
831
-				$base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
832
-			}
833
-			if (str_contains($texte, "href='#")) {
834
-				$texte = str_replace("href='#", "href='$base#", $texte);
835
-			}
836
-			if (str_contains($texte, 'href="#')) {
837
-				$texte = str_replace('href="#', "href=\"$base#", $texte);
838
-			}
839
-		}
840
-	}
773
+    static $set_html_base = null;
774
+    if (is_null($set_html_base)) {
775
+        if (!defined('_SET_HTML_BASE')) {
776
+            // si la profondeur est superieure a 1
777
+            // est que ce n'est pas une url page ni une url action
778
+            // activer par defaut
779
+            $set_html_base =
780
+                $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
781
+                && _request(_SPIP_PAGE) !== 'login'
782
+                && !_request('action');
783
+        } else {
784
+            $set_html_base = _SET_HTML_BASE;
785
+        }
786
+    }
787
+
788
+    if (
789
+        $set_html_base
790
+        && isset($GLOBALS['html'])
791
+        && $GLOBALS['html']
792
+        && $GLOBALS['profondeur_url'] > 0
793
+        && ($poshead = strpos($texte, '</head>')) !== false
794
+    ) {
795
+        $head = substr($texte, 0, $poshead);
796
+        $insert = false;
797
+        $href_base = false;
798
+        if (!str_contains($head, '<base')) {
799
+            $insert = true;
800
+        } else {
801
+            // si aucun <base ...> n'a de href il faut en inserer un
802
+            // sinon juste re-ecrire les ancres si besoin
803
+            $insert = true;
804
+            include_spip('inc/filtres');
805
+            $bases = extraire_balises($head, 'base');
806
+            foreach ($bases as $base) {
807
+                if ($href_base = extraire_attribut($base, 'href')) {
808
+                    $insert = false;
809
+                    break;
810
+                }
811
+            }
812
+        }
813
+
814
+        if ($insert) {
815
+            include_spip('inc/filtres_mini');
816
+            // ajouter un base qui reglera tous les liens relatifs
817
+            $href_base = url_absolue('./');
818
+            $base = "\n<base href=\"$href_base\" />";
819
+            if (($pos = strpos($head, '<head>')) !== false) {
820
+                $head = substr_replace($head, $base, $pos + 6, 0);
821
+            } elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
822
+                $head = str_replace($r[0], $r[0] . $base, $head);
823
+            }
824
+            $texte = $head . substr($texte, $poshead);
825
+        }
826
+        if ($href_base) {
827
+            // gerer les ancres
828
+            $base = $_SERVER['REQUEST_URI'];
829
+            // pas de guillemets ni < dans l'URL qu'on insere dans le HTML
830
+            if (str_contains($base, "'") || str_contains($base, '"') || str_contains($base, '<')) {
831
+                $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
832
+            }
833
+            if (str_contains($texte, "href='#")) {
834
+                $texte = str_replace("href='#", "href='$base#", $texte);
835
+            }
836
+            if (str_contains($texte, 'href="#')) {
837
+                $texte = str_replace('href="#', "href=\"$base#", $texte);
838
+            }
839
+        }
840
+    }
841 841
 }
842 842
 
843 843
 
@@ -847,7 +847,7 @@  discard block
 block discarded – undo
847 847
  * Ceux spécifiques à SPIP commencent par X-Spip
848 848
  */
849 849
 function envoyer_entetes($entetes) {
850
-	foreach ($entetes as $k => $v) {
851
-		@header(strlen((string) $v) ? "$k: $v" : $k);
852
-	}
850
+    foreach ($entetes as $k => $v) {
851
+        @header(strlen((string) $v) ? "$k: $v" : $k);
852
+    }
853 853
 }
Please login to merge, or discard this patch.
ecrire/inc_version.php 2 patches
Indentation   +65 added lines, -65 removed lines patch added patch discarded remove patch
@@ -18,17 +18,17 @@  discard block
 block discarded – undo
18 18
  **/
19 19
 
20 20
 if (defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 require_once __DIR__ . '/bootstrap/config/initial.php';
25 25
 
26 26
 // inclure l'ecran de securite si il n'a pas été inclus en prepend php
27 27
 if (
28
-	!defined('_ECRAN_SECURITE')
29
-	&& @file_exists($f = _ROOT_RACINE . _NOM_PERMANENTS_INACCESSIBLES . 'ecran_securite.php')
28
+    !defined('_ECRAN_SECURITE')
29
+    && @file_exists($f = _ROOT_RACINE . _NOM_PERMANENTS_INACCESSIBLES . 'ecran_securite.php')
30 30
 ) {
31
-	include $f;
31
+    include $f;
32 32
 }
33 33
 
34 34
 // et on peut lancer l'autoloader
@@ -75,12 +75,12 @@  discard block
 block discarded – undo
75 75
 // Definition personnelles eventuelles
76 76
 
77 77
 if (_FILE_OPTIONS) {
78
-	include_once _FILE_OPTIONS;
78
+    include_once _FILE_OPTIONS;
79 79
 }
80 80
 
81 81
 if (!defined('SPIP_ERREUR_REPORT')) {
82
-	/** Masquer les warning */
83
-	define('SPIP_ERREUR_REPORT', E_ALL ^ E_NOTICE ^ E_DEPRECATED);
82
+    /** Masquer les warning */
83
+    define('SPIP_ERREUR_REPORT', E_ALL ^ E_NOTICE ^ E_DEPRECATED);
84 84
 }
85 85
 
86 86
 ErrorHandler::setup(SPIP_ERREUR_REPORT);
@@ -94,10 +94,10 @@  discard block
 block discarded – undo
94 94
 // ===> on execute en neutralisant les messages d'erreur
95 95
 
96 96
 spip_initialisation_core(
97
-	(_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
98
-	(_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
99
-	(_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
100
-	(_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
97
+    (_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
98
+    (_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
99
+    (_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
100
+    (_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
101 101
 );
102 102
 
103 103
 // chargement des plugins : doit arriver en dernier
@@ -106,72 +106,72 @@  discard block
 block discarded – undo
106 106
 // donc il faut avoir tout fini ici avant de charger les plugins
107 107
 
108 108
 if (@is_readable(_CACHE_PLUGINS_OPT) && @is_readable(_CACHE_PLUGINS_PATH)) {
109
-	// chargement optimise precompile
110
-	include_once(_CACHE_PLUGINS_OPT);
109
+    // chargement optimise precompile
110
+    include_once(_CACHE_PLUGINS_OPT);
111 111
 } else {
112
-	spip_initialisation_suite();
113
-	include_spip('inc/plugin');
114
-	// generer les fichiers php precompiles
115
-	// de chargement des plugins et des pipelines
116
-	actualise_plugins_actifs();
112
+    spip_initialisation_suite();
113
+    include_spip('inc/plugin');
114
+    // generer les fichiers php precompiles
115
+    // de chargement des plugins et des pipelines
116
+    actualise_plugins_actifs();
117 117
 }
118 118
 
119 119
 // Initialisations non critiques surchargeables par les plugins
120 120
 spip_initialisation_suite();
121 121
 
122 122
 if (!defined('_LOG_FILTRE_GRAVITE')) {
123
-	/** niveau maxi d'enregistrement des logs */
124
-	define('_LOG_FILTRE_GRAVITE', _LOG_INFO_IMPORTANTE);
123
+    /** niveau maxi d'enregistrement des logs */
124
+    define('_LOG_FILTRE_GRAVITE', _LOG_INFO_IMPORTANTE);
125 125
 }
126 126
 
127 127
 if (!defined('_OUTILS_DEVELOPPEURS')) {
128
-	/** Activer des outils pour développeurs ? */
129
-	define('_OUTILS_DEVELOPPEURS', false);
128
+    /** Activer des outils pour développeurs ? */
129
+    define('_OUTILS_DEVELOPPEURS', false);
130 130
 }
131 131
 
132 132
 // charger systematiquement inc/autoriser dans l'espace restreint
133 133
 if (test_espace_prive()) {
134
-	include_spip('inc/autoriser');
134
+    include_spip('inc/autoriser');
135 135
 }
136 136
 
137 137
 //
138 138
 // Installer Spip si pas installe... sauf si justement on est en train
139 139
 //
140 140
 if (
141
-	!(_FILE_CONNECT
142
-	|| autoriser_sans_cookie(_request('exec'))
143
-	|| _request('action') == 'cookie'
144
-	|| _request('action') == 'converser'
145
-	|| _request('action') == 'test_dirs')
141
+    !(_FILE_CONNECT
142
+    || autoriser_sans_cookie(_request('exec'))
143
+    || _request('action') == 'cookie'
144
+    || _request('action') == 'converser'
145
+    || _request('action') == 'test_dirs')
146 146
 ) {
147
-	// Si on peut installer, on lance illico
148
-	if (test_espace_prive()) {
149
-		include_spip('inc/headers');
150
-		redirige_url_ecrire('install');
151
-	} else {
152
-		// Si on est dans le site public, dire que qq s'en occupe
153
-		include_spip('inc/lang');
154
-		utiliser_langue_visiteur();
155
-		include_spip('inc/minipres');
156
-		echo minipres(_T('info_travaux_titre'), "<p style='text-align: center;'>" . _T('info_travaux_texte') . '</p>', ['status' => 503]);
157
-		exit;
158
-	}
159
-	// autrement c'est une install ad hoc (spikini...), on sait pas faire
147
+    // Si on peut installer, on lance illico
148
+    if (test_espace_prive()) {
149
+        include_spip('inc/headers');
150
+        redirige_url_ecrire('install');
151
+    } else {
152
+        // Si on est dans le site public, dire que qq s'en occupe
153
+        include_spip('inc/lang');
154
+        utiliser_langue_visiteur();
155
+        include_spip('inc/minipres');
156
+        echo minipres(_T('info_travaux_titre'), "<p style='text-align: center;'>" . _T('info_travaux_texte') . '</p>', ['status' => 503]);
157
+        exit;
158
+    }
159
+    // autrement c'est une install ad hoc (spikini...), on sait pas faire
160 160
 }
161 161
 
162 162
 // memoriser un tri sessionne eventuel
163 163
 if (
164
-	isset($_REQUEST['var_memotri'])
165
-	&& ($t = $_REQUEST['var_memotri'])
166
-	&& (str_starts_with((string) $t, 'trisession') || str_starts_with((string) $t, 'senssession'))
164
+    isset($_REQUEST['var_memotri'])
165
+    && ($t = $_REQUEST['var_memotri'])
166
+    && (str_starts_with((string) $t, 'trisession') || str_starts_with((string) $t, 'senssession'))
167 167
 ) {
168
-	if (!function_exists('session_set')) {
169
-		include_spip('inc/session');
170
-	}
171
-	$t = preg_replace(',\W,', '_', (string) $t);
172
-	if ($v = _request($t)) {
173
-		session_set($t, $v);
174
-	}
168
+    if (!function_exists('session_set')) {
169
+        include_spip('inc/session');
170
+    }
171
+    $t = preg_replace(',\W,', '_', (string) $t);
172
+    if ($v = _request($t)) {
173
+        session_set($t, $v);
174
+    }
175 175
 }
176 176
 
177 177
 /**
@@ -181,22 +181,22 @@  discard block
 block discarded – undo
181 181
  * La globale $spip_header_silencieux permet de rendre le header minimal pour raisons de securite
182 182
  */
183 183
 if (!defined('_HEADER_COMPOSED_BY')) {
184
-	define('_HEADER_COMPOSED_BY', 'Composed-By: SPIP');
184
+    define('_HEADER_COMPOSED_BY', 'Composed-By: SPIP');
185 185
 }
186 186
 if (!headers_sent() && _HEADER_COMPOSED_BY) {
187
-	if (!defined('_HEADER_VARY')) {
188
-		define('_HEADER_VARY', 'Vary: Cookie, Accept-Encoding');
189
-	}
190
-	if (_HEADER_VARY) {
191
-		header(_HEADER_VARY);
192
-	}
193
-	if (!isset($GLOBALS['spip_header_silencieux']) || !$GLOBALS['spip_header_silencieux']) {
194
-		include_spip('inc/filtres_mini');
195
-		header(_HEADER_COMPOSED_BY . " $spip_version_affichee @ www.spip.net + " . url_absolue(_DIR_VAR . 'config.txt'));
196
-	} else {
197
-		// header minimal
198
-		header(_HEADER_COMPOSED_BY . ' @ www.spip.net');
199
-	}
187
+    if (!defined('_HEADER_VARY')) {
188
+        define('_HEADER_VARY', 'Vary: Cookie, Accept-Encoding');
189
+    }
190
+    if (_HEADER_VARY) {
191
+        header(_HEADER_VARY);
192
+    }
193
+    if (!isset($GLOBALS['spip_header_silencieux']) || !$GLOBALS['spip_header_silencieux']) {
194
+        include_spip('inc/filtres_mini');
195
+        header(_HEADER_COMPOSED_BY . " $spip_version_affichee @ www.spip.net + " . url_absolue(_DIR_VAR . 'config.txt'));
196
+    } else {
197
+        // header minimal
198
+        header(_HEADER_COMPOSED_BY . ' @ www.spip.net');
199
+    }
200 200
 }
201 201
 
202 202
 $methode = ($_SERVER['REQUEST_METHOD'] ?? ((php_sapi_name() == 'cli') ? 'cli' : ''));
Please login to merge, or discard this patch.
Spacing   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -21,22 +21,22 @@  discard block
 block discarded – undo
21 21
 	return;
22 22
 }
23 23
 
24
-require_once __DIR__ . '/bootstrap/config/initial.php';
24
+require_once __DIR__.'/bootstrap/config/initial.php';
25 25
 
26 26
 // inclure l'ecran de securite si il n'a pas été inclus en prepend php
27 27
 if (
28 28
 	!defined('_ECRAN_SECURITE')
29
-	&& @file_exists($f = _ROOT_RACINE . _NOM_PERMANENTS_INACCESSIBLES . 'ecran_securite.php')
29
+	&& @file_exists($f = _ROOT_RACINE._NOM_PERMANENTS_INACCESSIBLES.'ecran_securite.php')
30 30
 ) {
31 31
 	include $f;
32 32
 }
33 33
 
34 34
 // et on peut lancer l'autoloader
35
-require_once dirname(__DIR__) . '/vendor/autoload.php';
35
+require_once dirname(__DIR__).'/vendor/autoload.php';
36 36
 
37
-require_once __DIR__ . '/bootstrap/config/globals.php';
38
-require_once __DIR__ . '/bootstrap/proxy.php';
39
-require_once __DIR__ . '/bootstrap/mitigation.php';
37
+require_once __DIR__.'/bootstrap/config/globals.php';
38
+require_once __DIR__.'/bootstrap/proxy.php';
39
+require_once __DIR__.'/bootstrap/mitigation.php';
40 40
 
41 41
 // numero de branche, utilise par les plugins
42 42
 // pour specifier les versions de SPIP necessaires
@@ -70,7 +70,7 @@  discard block
 block discarded – undo
70 70
 //
71 71
 // Charger les fonctions liees aux serveurs Http et Sql.
72 72
 //
73
-require_once __DIR__ . '/bootstrap/functions.php';
73
+require_once __DIR__.'/bootstrap/functions.php';
74 74
 
75 75
 // Definition personnelles eventuelles
76 76
 
@@ -94,10 +94,10 @@  discard block
 block discarded – undo
94 94
 // ===> on execute en neutralisant les messages d'erreur
95 95
 
96 96
 spip_initialisation_core(
97
-	(_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
98
-	(_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
99
-	(_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
100
-	(_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
97
+	(_DIR_RACINE._NOM_PERMANENTS_INACCESSIBLES),
98
+	(_DIR_RACINE._NOM_PERMANENTS_ACCESSIBLES),
99
+	(_DIR_RACINE._NOM_TEMPORAIRES_INACCESSIBLES),
100
+	(_DIR_RACINE._NOM_TEMPORAIRES_ACCESSIBLES)
101 101
 );
102 102
 
103 103
 // chargement des plugins : doit arriver en dernier
@@ -153,7 +153,7 @@  discard block
 block discarded – undo
153 153
 		include_spip('inc/lang');
154 154
 		utiliser_langue_visiteur();
155 155
 		include_spip('inc/minipres');
156
-		echo minipres(_T('info_travaux_titre'), "<p style='text-align: center;'>" . _T('info_travaux_texte') . '</p>', ['status' => 503]);
156
+		echo minipres(_T('info_travaux_titre'), "<p style='text-align: center;'>"._T('info_travaux_texte').'</p>', ['status' => 503]);
157 157
 		exit;
158 158
 	}
159 159
 	// autrement c'est une install ad hoc (spikini...), on sait pas faire
@@ -192,12 +192,12 @@  discard block
 block discarded – undo
192 192
 	}
193 193
 	if (!isset($GLOBALS['spip_header_silencieux']) || !$GLOBALS['spip_header_silencieux']) {
194 194
 		include_spip('inc/filtres_mini');
195
-		header(_HEADER_COMPOSED_BY . " $spip_version_affichee @ www.spip.net + " . url_absolue(_DIR_VAR . 'config.txt'));
195
+		header(_HEADER_COMPOSED_BY." $spip_version_affichee @ www.spip.net + ".url_absolue(_DIR_VAR.'config.txt'));
196 196
 	} else {
197 197
 		// header minimal
198
-		header(_HEADER_COMPOSED_BY . ' @ www.spip.net');
198
+		header(_HEADER_COMPOSED_BY.' @ www.spip.net');
199 199
 	}
200 200
 }
201 201
 
202 202
 $methode = ($_SERVER['REQUEST_METHOD'] ?? ((php_sapi_name() == 'cli') ? 'cli' : ''));
203
-spip_log($methode . ' ' . self() . ' - ' . _FILE_CONNECT, _LOG_DEBUG);
203
+spip_log($methode.' '.self().' - '._FILE_CONNECT, _LOG_DEBUG);
Please login to merge, or discard this patch.
ecrire/bootstrap/config/globals.php 2 patches
Indentation   +68 added lines, -68 removed lines patch added patch discarded remove patch
@@ -5,63 +5,63 @@  discard block
 block discarded – undo
5 5
  */
6 6
 
7 7
 global
8
-	$auteur_session,
9
-	$connect_id_rubrique,
10
-	$connect_statut,
11
-	$connect_toutes_rubriques,
12
-	$controler_dates_rss,
13
-	$cookie_prefix,
14
-	$debut_date_publication,
15
-	$derniere_modif_invalide,
16
-	$dossier_squelettes,
17
-	$exceptions_des_tables,
18
-	$filtrer_javascript,
19
-	$formats_logos,
20
-	$hash_recherche_strict,
21
-	$hash_recherche,
22
-	$help_server,
23
-	$home_server,
24
-	$ignore_auth_http,
25
-	$ignore_remote_user,
26
-	$ip,
27
-	$ldap_present,
28
-	$liste_des_authentifications,
29
-	$liste_des_etats,
30
-	$liste_des_statuts,
31
-	$meta,
32
-	$mysql_rappel_connexion,
33
-	$mysql_rappel_nom_base,
34
-	$nombre_de_logs,
35
-	$path_sig,
36
-	$path_files,
37
-	$plugins,
38
-	$puce,
39
-	$source_vignettes,
40
-	$spip_matrice,
41
-	$spip_pipeline,
42
-	$spip_sql_version,
43
-	$spip_version_affichee,
44
-	$spip_version_base,
45
-	$spip_version_branche,
46
-	$spip_version_code,
47
-	$surcharges,
48
-	$table_date,
49
-	$table_des_tables,
50
-	$table_prefix,
51
-	$table_primary,
52
-	$table_titre,
53
-	$tables_auxiliaires,
54
-	$tables_jointures,
55
-	$tables_principales,
56
-	$taille_des_logs,
57
-	$test_i18n,
58
-	$tex_server,
59
-	$traiter_math,
60
-	$type_urls,
61
-	$url_glossaire_externe,
62
-	$visiteur_session,
63
-	$xhtml,
64
-	$xml_indent;
8
+    $auteur_session,
9
+    $connect_id_rubrique,
10
+    $connect_statut,
11
+    $connect_toutes_rubriques,
12
+    $controler_dates_rss,
13
+    $cookie_prefix,
14
+    $debut_date_publication,
15
+    $derniere_modif_invalide,
16
+    $dossier_squelettes,
17
+    $exceptions_des_tables,
18
+    $filtrer_javascript,
19
+    $formats_logos,
20
+    $hash_recherche_strict,
21
+    $hash_recherche,
22
+    $help_server,
23
+    $home_server,
24
+    $ignore_auth_http,
25
+    $ignore_remote_user,
26
+    $ip,
27
+    $ldap_present,
28
+    $liste_des_authentifications,
29
+    $liste_des_etats,
30
+    $liste_des_statuts,
31
+    $meta,
32
+    $mysql_rappel_connexion,
33
+    $mysql_rappel_nom_base,
34
+    $nombre_de_logs,
35
+    $path_sig,
36
+    $path_files,
37
+    $plugins,
38
+    $puce,
39
+    $source_vignettes,
40
+    $spip_matrice,
41
+    $spip_pipeline,
42
+    $spip_sql_version,
43
+    $spip_version_affichee,
44
+    $spip_version_base,
45
+    $spip_version_branche,
46
+    $spip_version_code,
47
+    $surcharges,
48
+    $table_date,
49
+    $table_des_tables,
50
+    $table_prefix,
51
+    $table_primary,
52
+    $table_titre,
53
+    $tables_auxiliaires,
54
+    $tables_jointures,
55
+    $tables_principales,
56
+    $taille_des_logs,
57
+    $test_i18n,
58
+    $tex_server,
59
+    $traiter_math,
60
+    $type_urls,
61
+    $url_glossaire_externe,
62
+    $visiteur_session,
63
+    $xhtml,
64
+    $xml_indent;
65 65
 
66 66
 # comment on logge, defaut 4 tmp/spip.log de 100k, 0 ou 0 suppriment le log
67 67
 $nombre_de_logs = 4;
@@ -181,24 +181,24 @@  discard block
 block discarded – undo
181 181
 
182 182
 // Liste des statuts.
183 183
 $liste_des_statuts = [
184
-	'info_administrateurs' => '0minirezo',
185
-	'info_redacteurs' => '1comite',
186
-	'info_visiteurs' => '6forum',
187
-	'texte_statut_poubelle' => '5poubelle'
184
+    'info_administrateurs' => '0minirezo',
185
+    'info_redacteurs' => '1comite',
186
+    'info_visiteurs' => '6forum',
187
+    'texte_statut_poubelle' => '5poubelle'
188 188
 ];
189 189
 
190 190
 $liste_des_etats = [
191
-	'texte_statut_en_cours_redaction' => 'prepa',
192
-	'texte_statut_propose_evaluation' => 'prop',
193
-	'texte_statut_publie' => 'publie',
194
-	'texte_statut_poubelle' => 'poubelle',
195
-	'texte_statut_refuse' => 'refuse'
191
+    'texte_statut_en_cours_redaction' => 'prepa',
192
+    'texte_statut_propose_evaluation' => 'prop',
193
+    'texte_statut_publie' => 'publie',
194
+    'texte_statut_poubelle' => 'poubelle',
195
+    'texte_statut_refuse' => 'refuse'
196 196
 ];
197 197
 
198 198
 // liste des methodes d'authentifications
199 199
 $liste_des_authentifications = [
200
-	'spip' => 'spip',
201
-	'ldap' => 'ldap'
200
+    'spip' => 'spip',
201
+    'ldap' => 'ldap'
202 202
 ];
203 203
 
204 204
 // Experimental : pour supprimer systematiquement l'affichage des numeros
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -164,7 +164,7 @@
 block discarded – undo
164 164
 # la matrice standard (fichiers definissant les fonctions a inclure)
165 165
 $spip_matrice = [];
166 166
 # les plugins a activer
167
-$plugins = [];  // voir le contenu du repertoire /plugins/
167
+$plugins = []; // voir le contenu du repertoire /plugins/
168 168
 # les surcharges de include_spip()
169 169
 $surcharges = []; // format 'inc_truc' => '/plugins/chose/inc_truc2.php'
170 170
 
Please login to merge, or discard this patch.