Completed
Push — master ( 81ee9f...4ab7e7 )
by cam
01:09
created
ecrire/src/Admin/Bouton.php 1 patch
Indentation   +52 added lines, -52 removed lines patch added patch discarded remove patch
@@ -7,57 +7,57 @@
 block discarded – undo
7 7
  * privée ou dans un de ses sous menus
8 8
  */
9 9
 class Bouton {
10
-	/** L'icone à mettre dans le bouton */
11
-	public string $icone;
12
-
13
-	/** Le nom de l'entrée d'i18n associé */
14
-	public string $libelle;
15
-
16
-	/** @var null|string L'URL de la page (null => ?exec=nom) */
17
-	public $url = null;
18
-
19
-	/** @var null|string|array Arguments supplementaires de l'URL */
20
-	public $urlArg = null;
21
-
22
-	/** @var null|string URL du javascript */
23
-	public $url2 = null;
24
-
25
-	/** @var null|string Pour ouvrir dans une fenetre a part */
26
-	public $target = null;
27
-
28
-	/** Sous-barre de boutons / onglets */
29
-	public array $sousmenu = [];
30
-
31
-	/** Position dans le menu */
32
-	public int $position = 0;
33
-
34
-	/** Entrée favorite (sa position dans les favoris) ? */
35
-	public int $favori = 0;
36
-
37
-
38
-	/**
39
-	 * Définit un bouton
40
-	 *
41
-	 * @param string $icone
42
-	 *    L'icone à mettre dans le bouton
43
-	 * @param string $libelle
44
-	 *    Le nom de l'entrée i18n associé
45
-	 * @param null|string $url
46
-	 *    L'URL de la page
47
-	 * @param null|string|array $urlArg
48
-	 *    Arguments supplémentaires de l'URL
49
-	 * @param null|string $url2
50
-	 *    URL du javascript
51
-	 * @param null|mixed $target
52
-	 *    Pour ouvrir une fenêtre à part
53
-	 */
54
-	public function __construct($icone, $libelle, $url = null, $urlArg = null, $url2 = null, $target = null) {
55
-		$this->icone = $icone;
56
-		$this->libelle = $libelle;
57
-		$this->url = $url;
58
-		$this->urlArg = $urlArg;
59
-		$this->url2 = $url2;
60
-		$this->target = $target;
61
-	}
10
+    /** L'icone à mettre dans le bouton */
11
+    public string $icone;
12
+
13
+    /** Le nom de l'entrée d'i18n associé */
14
+    public string $libelle;
15
+
16
+    /** @var null|string L'URL de la page (null => ?exec=nom) */
17
+    public $url = null;
18
+
19
+    /** @var null|string|array Arguments supplementaires de l'URL */
20
+    public $urlArg = null;
21
+
22
+    /** @var null|string URL du javascript */
23
+    public $url2 = null;
24
+
25
+    /** @var null|string Pour ouvrir dans une fenetre a part */
26
+    public $target = null;
27
+
28
+    /** Sous-barre de boutons / onglets */
29
+    public array $sousmenu = [];
30
+
31
+    /** Position dans le menu */
32
+    public int $position = 0;
33
+
34
+    /** Entrée favorite (sa position dans les favoris) ? */
35
+    public int $favori = 0;
36
+
37
+
38
+    /**
39
+     * Définit un bouton
40
+     *
41
+     * @param string $icone
42
+     *    L'icone à mettre dans le bouton
43
+     * @param string $libelle
44
+     *    Le nom de l'entrée i18n associé
45
+     * @param null|string $url
46
+     *    L'URL de la page
47
+     * @param null|string|array $urlArg
48
+     *    Arguments supplémentaires de l'URL
49
+     * @param null|string $url2
50
+     *    URL du javascript
51
+     * @param null|mixed $target
52
+     *    Pour ouvrir une fenêtre à part
53
+     */
54
+    public function __construct($icone, $libelle, $url = null, $urlArg = null, $url2 = null, $target = null) {
55
+        $this->icone = $icone;
56
+        $this->libelle = $libelle;
57
+        $this->url = $url;
58
+        $this->urlArg = $urlArg;
59
+        $this->url2 = $url2;
60
+        $this->target = $target;
61
+    }
62 62
 }
63 63
 
Please login to merge, or discard this patch.
ecrire/src/I18n/Description.php 1 patch
Indentation   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -3,16 +3,16 @@
 block discarded – undo
3 3
 namespace Spip\I18n;
4 4
 
5 5
 class Description {
6
-	/** @var string code de langue (hors module) */
7
-	public $code;
8
-	/** @var string nom du module de langue */
9
-	public $module;
10
-	/** @var string langue de la traduction */
11
-	public $langue;
12
-	/** @var string traduction */
13
-	public $texte;
14
-	/** @var string var mode particulier appliqué ? */
15
-	public $mode;
16
-	/** @var bool Corrections des textes appliqué ? */
17
-	public $corrections = false;
6
+    /** @var string code de langue (hors module) */
7
+    public $code;
8
+    /** @var string nom du module de langue */
9
+    public $module;
10
+    /** @var string langue de la traduction */
11
+    public $langue;
12
+    /** @var string traduction */
13
+    public $texte;
14
+    /** @var string var mode particulier appliqué ? */
15
+    public $mode;
16
+    /** @var bool Corrections des textes appliqué ? */
17
+    public $corrections = false;
18 18
 }
Please login to merge, or discard this patch.
ecrire/inc/presentation_mini.php 1 patch
Indentation   +136 added lines, -136 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Affichage
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -25,7 +25,7 @@  discard block
 block discarded – undo
25 25
  * @return string Code HTML
26 26
  */
27 27
 function debut_grand_cadre() {
28
- return "\n<div class = 'table_page'>\n";
28
+    return "\n<div class = 'table_page'>\n";
29 29
 }
30 30
 
31 31
 /**
@@ -34,7 +34,7 @@  discard block
 block discarded – undo
34 34
  * @return string Code HTML
35 35
  */
36 36
 function fin_grand_cadre() {
37
- return "\n</div>";
37
+    return "\n</div>";
38 38
 }
39 39
 
40 40
 // Debut de la colonne de gauche
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
  * @return string Code HTML
50 50
  */
51 51
 function debut_gauche() {
52
-	return "<div id = 'conteneur' class = ''>\n<div id = 'navigation' class = 'lat' role = 'contentinfo'>\n";
52
+    return "<div id = 'conteneur' class = ''>\n<div id = 'navigation' class = 'lat' role = 'contentinfo'>\n";
53 53
 }
54 54
 
55 55
 /**
@@ -58,7 +58,7 @@  discard block
 block discarded – undo
58 58
  * @return string Code HTML
59 59
  */
60 60
 function fin_gauche() {
61
- return "</div></div><br class = 'nettoyeur' />";
61
+    return "</div></div><br class = 'nettoyeur' />";
62 62
 }
63 63
 
64 64
 /**
@@ -67,13 +67,13 @@  discard block
 block discarded – undo
67 67
  * @return string Code HTML
68 68
  */
69 69
 function creer_colonne_droite() {
70
-	static $deja_colonne_droite;
71
-	if ($deja_colonne_droite) {
72
-		return '';
73
-	}
74
-	$deja_colonne_droite = true;
70
+    static $deja_colonne_droite;
71
+    if ($deja_colonne_droite) {
72
+        return '';
73
+    }
74
+    $deja_colonne_droite = true;
75 75
 
76
-	return "\n</div><div id='extra' class='lat' role='complementary'>";
76
+    return "\n</div><div id='extra' class='lat' role='complementary'>";
77 77
 }
78 78
 
79 79
 /**
@@ -82,10 +82,10 @@  discard block
 block discarded – undo
82 82
  * @return string Code HTML
83 83
  */
84 84
 function debut_droite() {
85
-	return liste_objets_bloques(_request('exec'))
86
-	. creer_colonne_droite()
87
-	. '</div>'
88
-	. "\n<div id='contenu'>";
85
+    return liste_objets_bloques(_request('exec'))
86
+    . creer_colonne_droite()
87
+    . '</div>'
88
+    . "\n<div id='contenu'>";
89 89
 }
90 90
 
91 91
 /**
@@ -107,32 +107,32 @@  discard block
 block discarded – undo
107 107
  *     Code HTML
108 108
  **/
109 109
 function liste_objets_bloques($exec, $contexte = [], $auteur = null): string {
110
-	$res = '';
111
-	include_spip('inc/config');
112
-	if (lire_config('articles_modif', 'non') !== 'non') {
113
-		include_spip('inc/drapeau_edition');
114
-		if (is_null($auteur)) {
115
-			$auteur = $GLOBALS['visiteur_session'];
116
-		}
117
-		if (
118
-			$en_cours = trouver_objet_exec($exec)
119
-			and $en_cours['edition']
120
-			and $type = $en_cours['type']
121
-			and ((isset($contexte[$en_cours['id_table_objet']]) and $id = $contexte[$en_cours['id_table_objet']])
122
-				or $id = _request($en_cours['id_table_objet']))
123
-		) {
124
-			// marquer le fait que l'objet est ouvert en edition par toto
125
-			// a telle date ; une alerte sera donnee aux autres redacteurs
126
-			signale_edition($id, $auteur, $type);
127
-		}
128
-
129
-		$objets_ouverts = liste_drapeau_edition($auteur['id_auteur']);
130
-		if (count($objets_ouverts)) {
131
-			$res .= recuperer_fond('prive/objets/liste/objets-en-edition', [], ['ajax' => true]);
132
-		}
133
-	}
134
-
135
-	return $res;
110
+    $res = '';
111
+    include_spip('inc/config');
112
+    if (lire_config('articles_modif', 'non') !== 'non') {
113
+        include_spip('inc/drapeau_edition');
114
+        if (is_null($auteur)) {
115
+            $auteur = $GLOBALS['visiteur_session'];
116
+        }
117
+        if (
118
+            $en_cours = trouver_objet_exec($exec)
119
+            and $en_cours['edition']
120
+            and $type = $en_cours['type']
121
+            and ((isset($contexte[$en_cours['id_table_objet']]) and $id = $contexte[$en_cours['id_table_objet']])
122
+                or $id = _request($en_cours['id_table_objet']))
123
+        ) {
124
+            // marquer le fait que l'objet est ouvert en edition par toto
125
+            // a telle date ; une alerte sera donnee aux autres redacteurs
126
+            signale_edition($id, $auteur, $type);
127
+        }
128
+
129
+        $objets_ouverts = liste_drapeau_edition($auteur['id_auteur']);
130
+        if (count($objets_ouverts)) {
131
+            $res .= recuperer_fond('prive/objets/liste/objets-en-edition', [], ['ajax' => true]);
132
+        }
133
+    }
134
+
135
+    return $res;
136 136
 }
137 137
 
138 138
 
@@ -146,20 +146,20 @@  discard block
 block discarded – undo
146 146
  * @return string Code HTML
147 147
  **/
148 148
 function fin_page() {
149
-	include_spip('inc/pipelines');
150
-	// avec &var_profile=1 on a le tableau de mesures SQL
151
-	$debug = ((_request('exec') !== 'valider_xml')
152
-		and ((_request('var_mode') == 'debug')
153
-			or (isset($GLOBALS['tableau_des_temps']) and $GLOBALS['tableau_des_temps'])
154
-			and isset($_COOKIE['spip_admin'])));
155
-	$t = '</div><div id="pied"><div class="largeur">'
156
-		. recuperer_fond('prive/squelettes/inclure/pied')
157
-		. '</div>'
158
-		. '</div></div>' // cf. div#page et div.largeur ouvertes dans conmmencer_page()
159
-		. ($debug ? erreur_squelette() : '')
160
-		. "</body></html>\n";
161
-
162
-	return f_queue($t);
149
+    include_spip('inc/pipelines');
150
+    // avec &var_profile=1 on a le tableau de mesures SQL
151
+    $debug = ((_request('exec') !== 'valider_xml')
152
+        and ((_request('var_mode') == 'debug')
153
+            or (isset($GLOBALS['tableau_des_temps']) and $GLOBALS['tableau_des_temps'])
154
+            and isset($_COOKIE['spip_admin'])));
155
+    $t = '</div><div id="pied"><div class="largeur">'
156
+        . recuperer_fond('prive/squelettes/inclure/pied')
157
+        . '</div>'
158
+        . '</div></div>' // cf. div#page et div.largeur ouvertes dans conmmencer_page()
159
+        . ($debug ? erreur_squelette() : '')
160
+        . "</body></html>\n";
161
+
162
+    return f_queue($t);
163 163
 }
164 164
 
165 165
 /**
@@ -174,22 +174,22 @@  discard block
 block discarded – undo
174 174
  * @return string Code HTML
175 175
  **/
176 176
 function html_tests_js() {
177
-	if (_SPIP_AJAX and !defined('_TESTER_NOSCRIPT')) {
178
-		// pour le pied de page (deja defini si on est validation XML)
179
-		define(
180
-			'_TESTER_NOSCRIPT',
181
-			"<noscript>\n<div style='display:none;'><img src='"
182
-			. generer_url_ecrire('test_ajax', 'js=-1')
183
-			. "' width='1' height='1' alt='' /></div></noscript>\n"
184
-		);
185
-	}
186
-
187
-	$rejouer = '';
188
-	if (defined('_SESSION_REJOUER')) {
189
-		$rejouer = (_SESSION_REJOUER === true) ? rejouer_session() : _SESSION_REJOUER;
190
-	}
191
-
192
-	return $rejouer . (defined('_TESTER_NOSCRIPT') ? _TESTER_NOSCRIPT : '');
177
+    if (_SPIP_AJAX and !defined('_TESTER_NOSCRIPT')) {
178
+        // pour le pied de page (deja defini si on est validation XML)
179
+        define(
180
+            '_TESTER_NOSCRIPT',
181
+            "<noscript>\n<div style='display:none;'><img src='"
182
+            . generer_url_ecrire('test_ajax', 'js=-1')
183
+            . "' width='1' height='1' alt='' /></div></noscript>\n"
184
+        );
185
+    }
186
+
187
+    $rejouer = '';
188
+    if (defined('_SESSION_REJOUER')) {
189
+        $rejouer = (_SESSION_REJOUER === true) ? rejouer_session() : _SESSION_REJOUER;
190
+    }
191
+
192
+    return $rejouer . (defined('_TESTER_NOSCRIPT') ? _TESTER_NOSCRIPT : '');
193 193
 }
194 194
 
195 195
 /**
@@ -199,25 +199,25 @@  discard block
 block discarded – undo
199 199
  **/
200 200
 function info_maj_spip() {
201 201
 
202
-	$maj = $GLOBALS['meta']['info_maj_spip'] ?? null;
203
-	if (!$maj) {
204
-		return '';
205
-	}
202
+    $maj = $GLOBALS['meta']['info_maj_spip'] ?? null;
203
+    if (!$maj) {
204
+        return '';
205
+    }
206 206
 
207
-	$maj = explode('|', $maj);
208
-	// c'est une ancienne notif, on a fait la maj depuis !
209
-	if ($GLOBALS['spip_version_branche'] !== reset($maj)) {
210
-		return '';
211
-	}
207
+    $maj = explode('|', $maj);
208
+    // c'est une ancienne notif, on a fait la maj depuis !
209
+    if ($GLOBALS['spip_version_branche'] !== reset($maj)) {
210
+        return '';
211
+    }
212 212
 
213
-	if (!autoriser('webmestre')) {
214
-		return '';
215
-	}
213
+    if (!autoriser('webmestre')) {
214
+        return '';
215
+    }
216 216
 
217
-	array_shift($maj);
218
-	$maj = implode('|', $maj);
217
+    array_shift($maj);
218
+    $maj = implode('|', $maj);
219 219
 
220
-	return "$maj<br />";
220
+    return "$maj<br />";
221 221
 }
222 222
 
223 223
 /**
@@ -228,43 +228,43 @@  discard block
 block discarded – undo
228 228
  **/
229 229
 function info_copyright() {
230 230
 
231
-	$version = $GLOBALS['spip_version_affichee'];
232
-
233
-	//
234
-	// Mention, le cas echeant, de la revision SVN courante
235
-	//
236
-	if ($vcs = version_vcs_courante(_DIR_RACINE, true)) {
237
-		if ($vcs['vcs'] === 'GIT') {
238
-			$url = 'https://git.spip.net/spip/spip/commit/' . $vcs['commit'];
239
-		} elseif ($vcs['vcs'] === 'SVN') {
240
-			$url = 'https://core.spip.net/projects/spip/repository/revisions/' . $vcs['commit'];
241
-		} else {
242
-			$url = '';
243
-		}
244
-		// affichage "GIT [master: abcdef]"
245
-		$commit = $vcs['commit_short'] ?? $vcs['commit'];
246
-		if ($url) {
247
-			$commit = "<a href=\"$url\" target=\"_blank\" rel=\"noopener noreferrer\">$commit</a>";
248
-		}
249
-		if ($vcs['branch']) {
250
-			$commit = $vcs['branch'] . ': ' . $commit;
251
-		}
252
-		$version .= " {$vcs['vcs']} [$commit]";
253
-	}
254
-
255
-	// et la version de l'ecran de securite
256
-	$secu = defined('_ECRAN_SECURITE')
257
-		? '<br />' . _T('ecran_securite', ['version' => _ECRAN_SECURITE])
258
-		: '';
259
-
260
-	return _T(
261
-		'info_copyright',
262
-		[
263
-			'spip' => "<b>SPIP $version</b> ",
264
-			'lien_gpl' => '<a href="https://www.gnu.org/licenses/gpl-3.0.html">' . _T('info_copyright_gpl') . '</a>'
265
-		]
266
-	)
267
-	. $secu;
231
+    $version = $GLOBALS['spip_version_affichee'];
232
+
233
+    //
234
+    // Mention, le cas echeant, de la revision SVN courante
235
+    //
236
+    if ($vcs = version_vcs_courante(_DIR_RACINE, true)) {
237
+        if ($vcs['vcs'] === 'GIT') {
238
+            $url = 'https://git.spip.net/spip/spip/commit/' . $vcs['commit'];
239
+        } elseif ($vcs['vcs'] === 'SVN') {
240
+            $url = 'https://core.spip.net/projects/spip/repository/revisions/' . $vcs['commit'];
241
+        } else {
242
+            $url = '';
243
+        }
244
+        // affichage "GIT [master: abcdef]"
245
+        $commit = $vcs['commit_short'] ?? $vcs['commit'];
246
+        if ($url) {
247
+            $commit = "<a href=\"$url\" target=\"_blank\" rel=\"noopener noreferrer\">$commit</a>";
248
+        }
249
+        if ($vcs['branch']) {
250
+            $commit = $vcs['branch'] . ': ' . $commit;
251
+        }
252
+        $version .= " {$vcs['vcs']} [$commit]";
253
+    }
254
+
255
+    // et la version de l'ecran de securite
256
+    $secu = defined('_ECRAN_SECURITE')
257
+        ? '<br />' . _T('ecran_securite', ['version' => _ECRAN_SECURITE])
258
+        : '';
259
+
260
+    return _T(
261
+        'info_copyright',
262
+        [
263
+            'spip' => "<b>SPIP $version</b> ",
264
+            'lien_gpl' => '<a href="https://www.gnu.org/licenses/gpl-3.0.html">' . _T('info_copyright_gpl') . '</a>'
265
+        ]
266
+    )
267
+    . $secu;
268 268
 }
269 269
 
270 270
 /**
@@ -279,17 +279,17 @@  discard block
 block discarded – undo
279 279
  * @return string             Code HTML
280 280
  **/
281 281
 function formulaire_recherche($page, $complement = '') {
282
-	$recherche = _request('recherche');
283
-	$recherche_aff = entites_html($recherche);
284
-	if (!strlen($recherche)) {
285
-		$recherche_aff = _T('info_rechercher');
286
-		$onfocus = " onfocus=\"this.value='';\"";
287
-	} else {
288
-		$onfocus = '';
289
-	}
290
-
291
-	$form = '<input type="text" size="10" value="' . $recherche_aff . '" name="recherche" class="recherche" accesskey="r"' . $onfocus . ' />';
292
-	$form .= "<input type='image' src='" . chemin_image('rechercher-20.png') . "' name='submit' class='submit' alt='" . _T('info_rechercher') . "' />";
293
-
294
-	return "<div class='spip_recherche'>" . generer_form_ecrire($page, $form . $complement, " method='get'") . '</div>';
282
+    $recherche = _request('recherche');
283
+    $recherche_aff = entites_html($recherche);
284
+    if (!strlen($recherche)) {
285
+        $recherche_aff = _T('info_rechercher');
286
+        $onfocus = " onfocus=\"this.value='';\"";
287
+    } else {
288
+        $onfocus = '';
289
+    }
290
+
291
+    $form = '<input type="text" size="10" value="' . $recherche_aff . '" name="recherche" class="recherche" accesskey="r"' . $onfocus . ' />';
292
+    $form .= "<input type='image' src='" . chemin_image('rechercher-20.png') . "' name='submit' class='submit' alt='" . _T('info_rechercher') . "' />";
293
+
294
+    return "<div class='spip_recherche'>" . generer_form_ecrire($page, $form . $complement, " method='get'") . '</div>';
295 295
 }
Please login to merge, or discard this patch.
ecrire/inc/headers.php 1 patch
Indentation   +136 added lines, -136 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 
@@ -38,133 +38,133 @@  discard block
 block discarded – undo
38 38
  * @param int $status Code de redirection (301 ou 302)
39 39
  **/
40 40
 function redirige_par_entete($url, $equiv = '', $status = 302) {
41
-	if (!in_array($status, [301, 302])) {
42
-		$status = 302;
43
-	}
44
-
45
-	$url = trim(strtr($url, "\n\r", '  '));
46
-	# si l'url de redirection est relative, on la passe en absolue
47
-	if (!preg_match(',^(\w+:)?//,', $url)) {
48
-		include_spip('inc/filtres_mini');
49
-		$url = url_absolue($url);
50
-	}
51
-
52
-	if (defined('_AJAX') and _AJAX) {
53
-		$url = parametre_url($url, 'var_ajax_redir', 1, '&');
54
-	}
55
-
56
-	// ne pas laisser passer n'importe quoi dans l'url
57
-	$url = str_replace(['<', '"'], ['&lt;', '&quot;'], $url);
58
-	$url = str_replace(["\r", "\n", ' '], ['%0D', '%0A', '%20'], $url);
59
-	while (strpos($url, '%0A') !== false) {
60
-		$url = str_replace('%0A', '', $url);
61
-	}
62
-	// interdire les url inline avec des pseudo-protocoles :
63
-	if (
64
-		(preg_match(',data:,i', $url) and preg_match('/base64\s*,/i', $url))
65
-		or preg_match(',(javascript|mailto):,i', $url)
66
-	) {
67
-		$url = './';
68
-	}
69
-
70
-	// Il n'y a que sous Apache que setcookie puis redirection fonctionne
71
-	include_spip('inc/cookie');
72
-	if (!defined('_SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE')) {
73
-		define('_SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE', '^(Apache|Cherokee|nginx)');
74
-	}
75
-	if (!defined('_SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE')) {
76
-		define('_SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE', 'Apache|Cherokee|nginx');
77
-	}
78
-	if (
79
-		(!$equiv and !spip_cookie_envoye()) or (
80
-			   (!empty($_SERVER['SERVER_SOFTWARE'])
81
-				   and _SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE
82
-				   and preg_match('/' . _SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE . '/i', $_SERVER['SERVER_SOFTWARE']))
83
-			or (!empty($_SERVER['SERVER_SIGNATURE'])
84
-				   and _SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE
85
-				   and preg_match('/' . _SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE . '/i', $_SERVER['SERVER_SIGNATURE']))
86
-			or function_exists('apache_getenv')
87
-			or defined('_SERVER_APACHE')
88
-		)
89
-	) {
90
-		@header('Location: ' . $url);
91
-		$equiv = '';
92
-	} else {
93
-		@header('Refresh: 0; url=' . $url);
94
-		if (isset($GLOBALS['meta']['charset'])) {
95
-			@header('Content-Type: text/html; charset=' . $GLOBALS['meta']['charset']);
96
-		}
97
-		$equiv = "<meta http-equiv='Refresh' content='0; url=$url'>";
98
-	}
99
-	include_spip('inc/lang');
100
-	if ($status != 302) {
101
-		http_response_code($status);
102
-	}
103
-	echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">', "\n",
104
-	html_lang_attributes(), '
41
+    if (!in_array($status, [301, 302])) {
42
+        $status = 302;
43
+    }
44
+
45
+    $url = trim(strtr($url, "\n\r", '  '));
46
+    # si l'url de redirection est relative, on la passe en absolue
47
+    if (!preg_match(',^(\w+:)?//,', $url)) {
48
+        include_spip('inc/filtres_mini');
49
+        $url = url_absolue($url);
50
+    }
51
+
52
+    if (defined('_AJAX') and _AJAX) {
53
+        $url = parametre_url($url, 'var_ajax_redir', 1, '&');
54
+    }
55
+
56
+    // ne pas laisser passer n'importe quoi dans l'url
57
+    $url = str_replace(['<', '"'], ['&lt;', '&quot;'], $url);
58
+    $url = str_replace(["\r", "\n", ' '], ['%0D', '%0A', '%20'], $url);
59
+    while (strpos($url, '%0A') !== false) {
60
+        $url = str_replace('%0A', '', $url);
61
+    }
62
+    // interdire les url inline avec des pseudo-protocoles :
63
+    if (
64
+        (preg_match(',data:,i', $url) and preg_match('/base64\s*,/i', $url))
65
+        or preg_match(',(javascript|mailto):,i', $url)
66
+    ) {
67
+        $url = './';
68
+    }
69
+
70
+    // Il n'y a que sous Apache que setcookie puis redirection fonctionne
71
+    include_spip('inc/cookie');
72
+    if (!defined('_SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE')) {
73
+        define('_SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE', '^(Apache|Cherokee|nginx)');
74
+    }
75
+    if (!defined('_SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE')) {
76
+        define('_SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE', 'Apache|Cherokee|nginx');
77
+    }
78
+    if (
79
+        (!$equiv and !spip_cookie_envoye()) or (
80
+                (!empty($_SERVER['SERVER_SOFTWARE'])
81
+                   and _SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE
82
+                   and preg_match('/' . _SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE . '/i', $_SERVER['SERVER_SOFTWARE']))
83
+            or (!empty($_SERVER['SERVER_SIGNATURE'])
84
+                   and _SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE
85
+                   and preg_match('/' . _SERVEUR_SIGNATURE_ACCEPTE_LOCATION_APRES_COOKIE . '/i', $_SERVER['SERVER_SIGNATURE']))
86
+            or function_exists('apache_getenv')
87
+            or defined('_SERVER_APACHE')
88
+        )
89
+    ) {
90
+        @header('Location: ' . $url);
91
+        $equiv = '';
92
+    } else {
93
+        @header('Refresh: 0; url=' . $url);
94
+        if (isset($GLOBALS['meta']['charset'])) {
95
+            @header('Content-Type: text/html; charset=' . $GLOBALS['meta']['charset']);
96
+        }
97
+        $equiv = "<meta http-equiv='Refresh' content='0; url=$url'>";
98
+    }
99
+    include_spip('inc/lang');
100
+    if ($status != 302) {
101
+        http_response_code($status);
102
+    }
103
+    echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">', "\n",
104
+    html_lang_attributes(), '
105 105
 <head>',
106
-	$equiv, '
106
+    $equiv, '
107 107
 <title>HTTP ' . $status . '</title>
108 108
 ' . ((isset($GLOBALS['meta']['charset'])) ? '<meta http-equiv="Content-Type" content="text/html;charset=' . $GLOBALS['meta']['charset'] . '">' : '') . '
109 109
 </head>
110 110
 <body>
111 111
 <h1>HTTP ' . $status . '</h1>
112 112
 <a href="',
113
-	quote_amp($url),
114
-	'">',
115
-	_T('navigateur_pas_redirige'),
116
-	'</a></body></html>';
113
+    quote_amp($url),
114
+    '">',
115
+    _T('navigateur_pas_redirige'),
116
+    '</a></body></html>';
117 117
 
118
-	spip_log("redirige $status: $url");
118
+    spip_log("redirige $status: $url");
119 119
 
120
-	exit;
120
+    exit;
121 121
 }
122 122
 
123 123
 function redirige_formulaire($url, $equiv = '', $format = 'message') {
124
-	if (
125
-		!_AJAX
126
-		and !headers_sent()
127
-		and !_request('var_ajax')
128
-	) {
129
-		redirige_par_entete(str_replace('&amp;', '&', $url), $equiv);
130
-	} // si c'est une ancre, fixer simplement le window.location.hash
131
-	elseif ($format == 'ajaxform' and preg_match(',^#[0-9a-z\-_]+$,i', $url)) {
132
-		return [
133
-			// on renvoie un lien masque qui sera traite par ajaxCallback.js
134
-			"<a href='$url' name='ajax_ancre' style='display:none;'>anchor</a>",
135
-			// et rien dans le message ok
136
-			''
137
-		];
138
-	} else {
139
-		// ne pas laisser passer n'importe quoi dans l'url
140
-		$url = str_replace(['<', '"'], ['&lt;', '&quot;'], $url);
141
-
142
-		$url = strtr($url, "\n\r", '  ');
143
-		# en theorie on devrait faire ca tout le temps, mais quand la chaine
144
-		# commence par ? c'est imperatif, sinon l'url finale n'est pas la bonne
145
-		if ($url[0] == '?') {
146
-			$url = url_de_base() . $url;
147
-		}
148
-		$url = str_replace('&amp;', '&', $url);
149
-		spip_log("redirige formulaire ajax: $url");
150
-		include_spip('inc/filtres');
151
-		if ($format == 'ajaxform') {
152
-			return [
153
-				// on renvoie un lien masque qui sera traite par ajaxCallback.js
154
-				'<a href="' . quote_amp($url) . '" name="ajax_redirect"  style="display:none;">' . _T('navigateur_pas_redirige') . '</a>',
155
-				// et un message au cas ou
156
-				'<br /><a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>'
157
-			];
158
-		} else // format message texte, tout en js inline
159
-		{
160
-			return
161
-				// ie poste les formulaires dans une iframe, il faut donc rediriger son parent
162
-				"<script type='text/javascript'>if (parent.window){parent.window.document.location.replace(\"$url\");} else {document.location.replace(\"$url\");}</script>"
163
-				. http_img_pack('loader.svg', '', " class='loader'")
164
-				. '<br />'
165
-				. '<a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>';
166
-		}
167
-	}
124
+    if (
125
+        !_AJAX
126
+        and !headers_sent()
127
+        and !_request('var_ajax')
128
+    ) {
129
+        redirige_par_entete(str_replace('&amp;', '&', $url), $equiv);
130
+    } // si c'est une ancre, fixer simplement le window.location.hash
131
+    elseif ($format == 'ajaxform' and preg_match(',^#[0-9a-z\-_]+$,i', $url)) {
132
+        return [
133
+            // on renvoie un lien masque qui sera traite par ajaxCallback.js
134
+            "<a href='$url' name='ajax_ancre' style='display:none;'>anchor</a>",
135
+            // et rien dans le message ok
136
+            ''
137
+        ];
138
+    } else {
139
+        // ne pas laisser passer n'importe quoi dans l'url
140
+        $url = str_replace(['<', '"'], ['&lt;', '&quot;'], $url);
141
+
142
+        $url = strtr($url, "\n\r", '  ');
143
+        # en theorie on devrait faire ca tout le temps, mais quand la chaine
144
+        # commence par ? c'est imperatif, sinon l'url finale n'est pas la bonne
145
+        if ($url[0] == '?') {
146
+            $url = url_de_base() . $url;
147
+        }
148
+        $url = str_replace('&amp;', '&', $url);
149
+        spip_log("redirige formulaire ajax: $url");
150
+        include_spip('inc/filtres');
151
+        if ($format == 'ajaxform') {
152
+            return [
153
+                // on renvoie un lien masque qui sera traite par ajaxCallback.js
154
+                '<a href="' . quote_amp($url) . '" name="ajax_redirect"  style="display:none;">' . _T('navigateur_pas_redirige') . '</a>',
155
+                // et un message au cas ou
156
+                '<br /><a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>'
157
+            ];
158
+        } else // format message texte, tout en js inline
159
+        {
160
+            return
161
+                // ie poste les formulaires dans une iframe, il faut donc rediriger son parent
162
+                "<script type='text/javascript'>if (parent.window){parent.window.document.location.replace(\"$url\");} else {document.location.replace(\"$url\");}</script>"
163
+                . http_img_pack('loader.svg', '', " class='loader'")
164
+                . '<br />'
165
+                . '<a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>';
166
+        }
167
+    }
168 168
 }
169 169
 
170 170
 /**
@@ -185,7 +185,7 @@  discard block
 block discarded – undo
185 185
  * @return void
186 186
  **/
187 187
 function redirige_url_ecrire($script = '', $args = '', $equiv = '') {
188
-	return redirige_par_entete(generer_url_ecrire($script, $args, true), $equiv);
188
+    return redirige_par_entete(generer_url_ecrire($script, $args, true), $equiv);
189 189
 }
190 190
 /**
191 191
  * Renvoie au client le header HTTP avec le message correspondant au code indiqué.
@@ -200,27 +200,27 @@  discard block
 block discarded – undo
200 200
  *     Code d'erreur
201 201
  **/
202 202
 function http_status($status) {
203
-	http_response_code($status);
203
+    http_response_code($status);
204 204
 }
205 205
 
206 206
 // Retourne ce qui va bien pour que le navigateur ne mette pas la page en cache
207 207
 function http_no_cache() {
208
-	if (headers_sent()) {
209
-		spip_log('http_no_cache arrive trop tard');
210
-
211
-		return;
212
-	}
213
-	$charset = empty($GLOBALS['meta']['charset']) ? 'utf-8' : $GLOBALS['meta']['charset'];
214
-
215
-	// selon http://developer.apple.com/internet/safari/faq.html#anchor5
216
-	// il faudrait aussi pour Safari
217
-	// header("Cache-Control: post-check=0, pre-check=0", false)
218
-	// mais ca ne respecte pas
219
-	// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
220
-
221
-	header("Content-Type: text/html; charset=$charset");
222
-	header('Expires: 0');
223
-	header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
224
-	header('Cache-Control: no-cache, must-revalidate');
225
-	header('Pragma: no-cache');
208
+    if (headers_sent()) {
209
+        spip_log('http_no_cache arrive trop tard');
210
+
211
+        return;
212
+    }
213
+    $charset = empty($GLOBALS['meta']['charset']) ? 'utf-8' : $GLOBALS['meta']['charset'];
214
+
215
+    // selon http://developer.apple.com/internet/safari/faq.html#anchor5
216
+    // il faudrait aussi pour Safari
217
+    // header("Cache-Control: post-check=0, pre-check=0", false)
218
+    // mais ca ne respecte pas
219
+    // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
220
+
221
+    header("Content-Type: text/html; charset=$charset");
222
+    header('Expires: 0');
223
+    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
224
+    header('Cache-Control: no-cache, must-revalidate');
225
+    header('Pragma: no-cache');
226 226
 }
Please login to merge, or discard this patch.
ecrire/public/aiguiller.php 1 patch
Indentation   +289 added lines, -289 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 /**
@@ -19,158 +19,158 @@  discard block
 block discarded – undo
19 19
  * @return string
20 20
  */
21 21
 function securiser_redirect_action($redirect) {
22
-	$redirect ??= '';
23
-	// cas d'un double urlencode : si un urldecode de l'url n'est pas secure, on retient ca comme redirect
24
-	if (strpos($redirect, '%') !== false) {
25
-		$r2 = urldecode($redirect);
26
-		if (($r3 = securiser_redirect_action($r2)) !== $r2) {
27
-			return $r3;
28
-		}
29
-	}
30
-	if (
31
-		(tester_url_absolue($redirect) or preg_match(',^\w+:,', trim($redirect)))
32
-		and !defined('_AUTORISER_ACTION_ABS_REDIRECT')
33
-	) {
34
-		// si l'url est une url du site, on la laisse passer sans rien faire
35
-		// c'est encore le plus simple
36
-		$base = $GLOBALS['meta']['adresse_site'] . '/';
37
-		if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
38
-			return $redirect;
39
-		}
40
-		$base = url_de_base();
41
-		if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
42
-			return $redirect;
43
-		}
22
+    $redirect ??= '';
23
+    // cas d'un double urlencode : si un urldecode de l'url n'est pas secure, on retient ca comme redirect
24
+    if (strpos($redirect, '%') !== false) {
25
+        $r2 = urldecode($redirect);
26
+        if (($r3 = securiser_redirect_action($r2)) !== $r2) {
27
+            return $r3;
28
+        }
29
+    }
30
+    if (
31
+        (tester_url_absolue($redirect) or preg_match(',^\w+:,', trim($redirect)))
32
+        and !defined('_AUTORISER_ACTION_ABS_REDIRECT')
33
+    ) {
34
+        // si l'url est une url du site, on la laisse passer sans rien faire
35
+        // c'est encore le plus simple
36
+        $base = $GLOBALS['meta']['adresse_site'] . '/';
37
+        if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
38
+            return $redirect;
39
+        }
40
+        $base = url_de_base();
41
+        if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
42
+            return $redirect;
43
+        }
44 44
 
45
-		return '';
46
-	}
45
+        return '';
46
+    }
47 47
 
48
-	return $redirect;
48
+    return $redirect;
49 49
 }
50 50
 
51 51
 function traiter_appels_actions() {
52
-	// cas de l'appel qui renvoie une redirection (302) ou rien (204)
53
-	if ($action = _request('action')) {
54
-		include_spip('base/abstract_sql'); // chargement systematique pour les actions
55
-		include_spip('inc/autoriser');
56
-		include_spip('inc/headers');
57
-		include_spip('inc/actions');
58
-		// des actions peuvent appeler _T
59
-		if (!isset($GLOBALS['spip_lang'])) {
60
-			include_spip('inc/lang');
61
-			utiliser_langue_visiteur();
62
-		}
63
-		// si l'action est provoque par un hit {ajax}
64
-		// il faut transmettre l'env ajax au redirect
65
-		// on le met avant dans la query string au cas ou l'action fait elle meme sa redirection
66
-		if (
67
-			($v = _request('var_ajax'))
68
-			and ($v !== 'form')
69
-			and ($args = _request('var_ajax_env'))
70
-			and ($url = _request('redirect'))
71
-		) {
72
-			$url = parametre_url($url, 'var_ajax', $v, '&');
73
-			$url = parametre_url($url, 'var_ajax_env', $args, '&');
74
-			set_request('redirect', $url);
75
-		} else {
76
-			if (_request('redirect')) {
77
-				set_request('redirect', securiser_redirect_action(_request('redirect')));
78
-			}
79
-		}
80
-		$var_f = charger_fonction($action, 'action');
81
-		$var_f();
82
-		if (!isset($GLOBALS['redirect'])) {
83
-			$GLOBALS['redirect'] = _request('redirect') ?? '';
84
-			if ($_SERVER['REQUEST_METHOD'] === 'POST') {
85
-				$GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
86
-			}
87
-			$GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
88
-		}
89
-		if ($url = $GLOBALS['redirect']) {
90
-			// si l'action est provoque par un hit {ajax}
91
-			// il faut transmettre l'env ajax au redirect
92
-			// qui a pu etre defini par l'action
93
-			if (
94
-				($v = _request('var_ajax'))
95
-				and ($v !== 'form')
96
-				and ($args = _request('var_ajax_env'))
97
-			) {
98
-				$url = parametre_url($url, 'var_ajax', $v, '&');
99
-				$url = parametre_url($url, 'var_ajax_env', $args, '&');
100
-				// passer l'ancre en variable pour pouvoir la gerer cote serveur
101
-				$url = preg_replace(',#([^#&?]+)$,', "&var_ajax_ancre=\\1", $url);
102
-			}
103
-			$url = str_replace('&amp;', '&', $url); // les redirections se font en &, pas en en &amp;
104
-			redirige_par_entete($url);
105
-		}
52
+    // cas de l'appel qui renvoie une redirection (302) ou rien (204)
53
+    if ($action = _request('action')) {
54
+        include_spip('base/abstract_sql'); // chargement systematique pour les actions
55
+        include_spip('inc/autoriser');
56
+        include_spip('inc/headers');
57
+        include_spip('inc/actions');
58
+        // des actions peuvent appeler _T
59
+        if (!isset($GLOBALS['spip_lang'])) {
60
+            include_spip('inc/lang');
61
+            utiliser_langue_visiteur();
62
+        }
63
+        // si l'action est provoque par un hit {ajax}
64
+        // il faut transmettre l'env ajax au redirect
65
+        // on le met avant dans la query string au cas ou l'action fait elle meme sa redirection
66
+        if (
67
+            ($v = _request('var_ajax'))
68
+            and ($v !== 'form')
69
+            and ($args = _request('var_ajax_env'))
70
+            and ($url = _request('redirect'))
71
+        ) {
72
+            $url = parametre_url($url, 'var_ajax', $v, '&');
73
+            $url = parametre_url($url, 'var_ajax_env', $args, '&');
74
+            set_request('redirect', $url);
75
+        } else {
76
+            if (_request('redirect')) {
77
+                set_request('redirect', securiser_redirect_action(_request('redirect')));
78
+            }
79
+        }
80
+        $var_f = charger_fonction($action, 'action');
81
+        $var_f();
82
+        if (!isset($GLOBALS['redirect'])) {
83
+            $GLOBALS['redirect'] = _request('redirect') ?? '';
84
+            if ($_SERVER['REQUEST_METHOD'] === 'POST') {
85
+                $GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
86
+            }
87
+            $GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
88
+        }
89
+        if ($url = $GLOBALS['redirect']) {
90
+            // si l'action est provoque par un hit {ajax}
91
+            // il faut transmettre l'env ajax au redirect
92
+            // qui a pu etre defini par l'action
93
+            if (
94
+                ($v = _request('var_ajax'))
95
+                and ($v !== 'form')
96
+                and ($args = _request('var_ajax_env'))
97
+            ) {
98
+                $url = parametre_url($url, 'var_ajax', $v, '&');
99
+                $url = parametre_url($url, 'var_ajax_env', $args, '&');
100
+                // passer l'ancre en variable pour pouvoir la gerer cote serveur
101
+                $url = preg_replace(',#([^#&?]+)$,', "&var_ajax_ancre=\\1", $url);
102
+            }
103
+            $url = str_replace('&amp;', '&', $url); // les redirections se font en &, pas en en &amp;
104
+            redirige_par_entete($url);
105
+        }
106 106
 
107
-		// attention : avec zlib.output_compression=1 on a vu des cas de ob_get_length() qui renvoi 0
108
-		// et du coup en renvoi un status 204 a tort (vu sur le menu rubriques notamment)
109
-		if (
110
-			!headers_sent()
111
-			and !ob_get_length()
112
-		) {
113
-			http_response_code(204);
114
-		} // No Content
115
-		return true;
116
-	}
107
+        // attention : avec zlib.output_compression=1 on a vu des cas de ob_get_length() qui renvoi 0
108
+        // et du coup en renvoi un status 204 a tort (vu sur le menu rubriques notamment)
109
+        if (
110
+            !headers_sent()
111
+            and !ob_get_length()
112
+        ) {
113
+            http_response_code(204);
114
+        } // No Content
115
+        return true;
116
+    }
117 117
 
118
-	return false;
118
+    return false;
119 119
 }
120 120
 
121 121
 
122 122
 function refuser_traiter_formulaire_ajax() {
123
-	if (
124
-		$v = _request('var_ajax')
125
-		and $v == 'form'
126
-		and $form = _request('formulaire_action')
127
-		and $args = _request('formulaire_action_args')
128
-		and decoder_contexte_ajax($args, $form) !== false
129
-	) {
130
-		// on est bien dans le contexte de traitement d'un formulaire en ajax
131
-		// mais traiter ne veut pas
132
-		// on le dit a la page qui va resumbit
133
-		// sans ajax
134
-		include_spip('inc/actions');
135
-		ajax_retour('noajax', false);
136
-		exit;
137
-	}
123
+    if (
124
+        $v = _request('var_ajax')
125
+        and $v == 'form'
126
+        and $form = _request('formulaire_action')
127
+        and $args = _request('formulaire_action_args')
128
+        and decoder_contexte_ajax($args, $form) !== false
129
+    ) {
130
+        // on est bien dans le contexte de traitement d'un formulaire en ajax
131
+        // mais traiter ne veut pas
132
+        // on le dit a la page qui va resumbit
133
+        // sans ajax
134
+        include_spip('inc/actions');
135
+        ajax_retour('noajax', false);
136
+        exit;
137
+    }
138 138
 }
139 139
 
140 140
 function traiter_appels_inclusions_ajax() {
141
-	// traiter les appels de bloc ajax (ex: pagination)
142
-	if (
143
-		$v = _request('var_ajax')
144
-		and $v !== 'form'
145
-		and $args = _request('var_ajax_env')
146
-	) {
147
-		include_spip('inc/filtres');
148
-		include_spip('inc/actions');
149
-		if (
150
-			$args = decoder_contexte_ajax($args)
151
-			and $fond = $args['fond']
152
-		) {
153
-			include_spip('public/assembler');
154
-			$contexte = calculer_contexte();
155
-			$contexte = array_merge($args, $contexte);
156
-			$page = recuperer_fond($fond, $contexte, ['trim' => false]);
157
-			$texte = $page;
158
-			if ($ancre = _request('var_ajax_ancre')) {
159
-				// pas n'importe quoi quand meme dans la variable !
160
-				$ancre = str_replace(['<', '"', "'"], ['&lt;', '&quot;', ''], $ancre);
161
-				$texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>" . $texte;
162
-			}
163
-		} else {
164
-			include_spip('inc/headers');
165
-			http_response_code(400);
166
-			$texte = _L('signature ajax bloc incorrecte');
167
-		}
168
-		ajax_retour($texte, false);
141
+    // traiter les appels de bloc ajax (ex: pagination)
142
+    if (
143
+        $v = _request('var_ajax')
144
+        and $v !== 'form'
145
+        and $args = _request('var_ajax_env')
146
+    ) {
147
+        include_spip('inc/filtres');
148
+        include_spip('inc/actions');
149
+        if (
150
+            $args = decoder_contexte_ajax($args)
151
+            and $fond = $args['fond']
152
+        ) {
153
+            include_spip('public/assembler');
154
+            $contexte = calculer_contexte();
155
+            $contexte = array_merge($args, $contexte);
156
+            $page = recuperer_fond($fond, $contexte, ['trim' => false]);
157
+            $texte = $page;
158
+            if ($ancre = _request('var_ajax_ancre')) {
159
+                // pas n'importe quoi quand meme dans la variable !
160
+                $ancre = str_replace(['<', '"', "'"], ['&lt;', '&quot;', ''], $ancre);
161
+                $texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>" . $texte;
162
+            }
163
+        } else {
164
+            include_spip('inc/headers');
165
+            http_response_code(400);
166
+            $texte = _L('signature ajax bloc incorrecte');
167
+        }
168
+        ajax_retour($texte, false);
169 169
 
170
-		return true; // on a fini le hit
171
-	}
170
+        return true; // on a fini le hit
171
+    }
172 172
 
173
-	return false;
173
+    return false;
174 174
 }
175 175
 
176 176
 // au 1er appel, traite les formulaires dynamiques charger/verifier/traiter
@@ -178,172 +178,172 @@  discard block
 block discarded – undo
178 178
 // Le 1er renvoie True si il faut faire exit a la sortie
179 179
 
180 180
 function traiter_formulaires_dynamiques($get = false) {
181
-	static $post = [];
182
-	static $done = false;
181
+    static $post = [];
182
+    static $done = false;
183 183
 
184
-	if ($get) {
185
-		return $post;
186
-	}
187
-	if ($done) {
188
-		return false;
189
-	}
190
-	$done = true;
184
+    if ($get) {
185
+        return $post;
186
+    }
187
+    if ($done) {
188
+        return false;
189
+    }
190
+    $done = true;
191 191
 
192
-	if (
193
-		!($form = _request('formulaire_action')
194
-		and $args = _request('formulaire_action_args'))
195
-	) {
196
-		return false;
197
-	} // le hit peut continuer normalement
192
+    if (
193
+        !($form = _request('formulaire_action')
194
+        and $args = _request('formulaire_action_args'))
195
+    ) {
196
+        return false;
197
+    } // le hit peut continuer normalement
198 198
 
199
-	// verifier que le post est licite (du meme auteur ou d'une session anonyme)
200
-	$sign = _request('formulaire_action_sign');
201
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
202
-		if (empty($sign)) {
203
-			spip_log("signature ajax form incorrecte : $form (formulaire non signe mais on a une session)", 'formulaires' . _LOG_ERREUR);
204
-			return false;
205
-		}
206
-		$securiser_action = charger_fonction('securiser_action', 'inc');
207
-		$secu = $securiser_action($form, $args, '', -1);
208
-		if ($sign !== $secu['hash']) {
209
-			spip_log("signature ajax form incorrecte : $form (formulaire signe mais ne correspond pas a la session)", 'formulaires' . _LOG_ERREUR);
210
-			return false;
211
-		}
212
-	}
213
-	else {
214
-		if (!empty($sign)) {
215
-			spip_log("signature ajax form incorrecte : $form (formulaire signe mais pas de session)", 'formulaires' . _LOG_ERREUR);
216
-			return false;
217
-		}
218
-	}
199
+    // verifier que le post est licite (du meme auteur ou d'une session anonyme)
200
+    $sign = _request('formulaire_action_sign');
201
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
202
+        if (empty($sign)) {
203
+            spip_log("signature ajax form incorrecte : $form (formulaire non signe mais on a une session)", 'formulaires' . _LOG_ERREUR);
204
+            return false;
205
+        }
206
+        $securiser_action = charger_fonction('securiser_action', 'inc');
207
+        $secu = $securiser_action($form, $args, '', -1);
208
+        if ($sign !== $secu['hash']) {
209
+            spip_log("signature ajax form incorrecte : $form (formulaire signe mais ne correspond pas a la session)", 'formulaires' . _LOG_ERREUR);
210
+            return false;
211
+        }
212
+    }
213
+    else {
214
+        if (!empty($sign)) {
215
+            spip_log("signature ajax form incorrecte : $form (formulaire signe mais pas de session)", 'formulaires' . _LOG_ERREUR);
216
+            return false;
217
+        }
218
+    }
219 219
 
220
-	include_spip('inc/filtres');
221
-	if (($args = decoder_contexte_ajax($args, $form)) === false) {
222
-		spip_log("signature ajax form incorrecte : $form (encodage corrompu)", 'formulaires' . _LOG_ERREUR);
220
+    include_spip('inc/filtres');
221
+    if (($args = decoder_contexte_ajax($args, $form)) === false) {
222
+        spip_log("signature ajax form incorrecte : $form (encodage corrompu)", 'formulaires' . _LOG_ERREUR);
223 223
 
224
-		return false; // continuons le hit comme si de rien etait
225
-	} else {
226
-		include_spip('inc/lang');
227
-		// sauvegarder la lang en cours
228
-		$old_lang = $GLOBALS['spip_lang'];
229
-		// changer la langue avec celle qui a cours dans le formulaire
230
-		// on la depile de $args car c'est un argument implicite masque
231
-		changer_langue(array_shift($args));
224
+        return false; // continuons le hit comme si de rien etait
225
+    } else {
226
+        include_spip('inc/lang');
227
+        // sauvegarder la lang en cours
228
+        $old_lang = $GLOBALS['spip_lang'];
229
+        // changer la langue avec celle qui a cours dans le formulaire
230
+        // on la depile de $args car c'est un argument implicite masque
231
+        changer_langue(array_shift($args));
232 232
 
233 233
 
234
-		// inclure mes_fonctions et autres filtres avant verifier/traiter
235
-		include_fichiers_fonctions();
236
-		// ainsi que l'API SQL bien utile dans verifier/traiter
237
-		include_spip('base/abstract_sql');
234
+        // inclure mes_fonctions et autres filtres avant verifier/traiter
235
+        include_fichiers_fonctions();
236
+        // ainsi que l'API SQL bien utile dans verifier/traiter
237
+        include_spip('base/abstract_sql');
238 238
 
239
-		/**
240
-		 * Pipeline exécuté lors de la soumission d'un formulaire,
241
-		 * mais avant l'appel de la fonction de vérification.
242
-		 */
243
-		pipeline(
244
-			'formulaire_receptionner',
245
-			[
246
-				'args' => ['form' => $form, 'args' => $args],
247
-				'data' => null,
248
-			]
249
-		);
239
+        /**
240
+         * Pipeline exécuté lors de la soumission d'un formulaire,
241
+         * mais avant l'appel de la fonction de vérification.
242
+         */
243
+        pipeline(
244
+            'formulaire_receptionner',
245
+            [
246
+                'args' => ['form' => $form, 'args' => $args],
247
+                'data' => null,
248
+            ]
249
+        );
250 250
 
251
-		$verifier = charger_fonction('verifier', "formulaires/$form/", true);
252
-		$post["erreurs_$form"] = pipeline(
253
-			'formulaire_verifier',
254
-			[
255
-				'args' => ['form' => $form, 'args' => $args],
256
-				'data' => $verifier ? $verifier(...$args) : []
257
-			]
258
-		);
259
-		// prise en charge CVT multi etape si besoin
260
-		if (_request('cvtm_prev_post')) {
261
-			include_spip('inc/cvt_multietapes');
262
-			$post["erreurs_$form"] = cvtmulti_formulaire_verifier_etapes(
263
-				['form' => $form, 'args' => $args],
264
-				$post["erreurs_$form"]
265
-			);
266
-		}
251
+        $verifier = charger_fonction('verifier', "formulaires/$form/", true);
252
+        $post["erreurs_$form"] = pipeline(
253
+            'formulaire_verifier',
254
+            [
255
+                'args' => ['form' => $form, 'args' => $args],
256
+                'data' => $verifier ? $verifier(...$args) : []
257
+            ]
258
+        );
259
+        // prise en charge CVT multi etape si besoin
260
+        if (_request('cvtm_prev_post')) {
261
+            include_spip('inc/cvt_multietapes');
262
+            $post["erreurs_$form"] = cvtmulti_formulaire_verifier_etapes(
263
+                ['form' => $form, 'args' => $args],
264
+                $post["erreurs_$form"]
265
+            );
266
+        }
267 267
 
268
-		// accessibilite : si des erreurs mais pas de message general l'ajouter
269
-		if ((isset($post["erreurs_$form"]) and is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0) and !isset($post["erreurs_$form"]['message_erreur'])) {
270
-			$post["erreurs_$form"]['message_erreur'] = singulier_ou_pluriel(
271
-				is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0,
272
-				'avis_1_erreur_saisie',
273
-				'avis_nb_erreurs_saisie'
274
-			);
275
-		}
268
+        // accessibilite : si des erreurs mais pas de message general l'ajouter
269
+        if ((isset($post["erreurs_$form"]) and is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0) and !isset($post["erreurs_$form"]['message_erreur'])) {
270
+            $post["erreurs_$form"]['message_erreur'] = singulier_ou_pluriel(
271
+                is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0,
272
+                'avis_1_erreur_saisie',
273
+                'avis_nb_erreurs_saisie'
274
+            );
275
+        }
276 276
 
277
-		// si on ne demandait qu'une verif json
278
-		if (_request('formulaire_action_verifier_json')) {
279
-			include_spip('inc/json');
280
-			include_spip('inc/actions');
281
-			ajax_retour(json_encode($post["erreurs_$form"], JSON_THROW_ON_ERROR), 'text/plain');
277
+        // si on ne demandait qu'une verif json
278
+        if (_request('formulaire_action_verifier_json')) {
279
+            include_spip('inc/json');
280
+            include_spip('inc/actions');
281
+            ajax_retour(json_encode($post["erreurs_$form"], JSON_THROW_ON_ERROR), 'text/plain');
282 282
 
283
-			return true; // on a fini le hit
284
-		}
285
-		$retour = '';
286
-		if (isset($post["erreurs_$form"]) and ((is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0) == 0)) {
287
-			$rev = '';
288
-			if ($traiter = charger_fonction('traiter', "formulaires/$form/", true)) {
289
-				$rev = $traiter(...$args);
290
-			}
283
+            return true; // on a fini le hit
284
+        }
285
+        $retour = '';
286
+        if (isset($post["erreurs_$form"]) and ((is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0) == 0)) {
287
+            $rev = '';
288
+            if ($traiter = charger_fonction('traiter', "formulaires/$form/", true)) {
289
+                $rev = $traiter(...$args);
290
+            }
291 291
 
292
-			$rev = pipeline(
293
-				'formulaire_traiter',
294
-				[
295
-					'args' => ['form' => $form, 'args' => $args],
296
-					'data' => $rev
297
-				]
298
-			);
299
-			// le retour de traiter est
300
-			// un tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx)
301
-			// il permet le pipelinage, en particulier
302
-			// en y passant l'id de l'objet cree/modifie
303
-			// si message_erreur est present, on considere que le traitement a echoue
304
-			$post["message_ok_$form"] = '';
305
-			// on peut avoir message_ok et message_erreur
306
-			if (isset($rev['message_ok'])) {
307
-				$post["message_ok_$form"] = $rev['message_ok'];
308
-			}
292
+            $rev = pipeline(
293
+                'formulaire_traiter',
294
+                [
295
+                    'args' => ['form' => $form, 'args' => $args],
296
+                    'data' => $rev
297
+                ]
298
+            );
299
+            // le retour de traiter est
300
+            // un tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx)
301
+            // il permet le pipelinage, en particulier
302
+            // en y passant l'id de l'objet cree/modifie
303
+            // si message_erreur est present, on considere que le traitement a echoue
304
+            $post["message_ok_$form"] = '';
305
+            // on peut avoir message_ok et message_erreur
306
+            if (isset($rev['message_ok'])) {
307
+                $post["message_ok_$form"] = $rev['message_ok'];
308
+            }
309 309
 
310
-			// verifier si traiter n'a pas echoue avec une erreur :
311
-			if (isset($rev['message_erreur'])) {
312
-				$post["erreurs_$form"]['message_erreur'] = $rev['message_erreur'];
313
-				// si il y a une erreur on ne redirige pas
314
-			} else {
315
-				// sinon faire ce qu'il faut :
316
-				if (isset($rev['editable'])) {
317
-					$post["editable_$form"] = $rev['editable'];
318
-				}
319
-				// si une redirection est demandee, appeler redirigae_formulaire qui choisira
320
-				// le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue)
321
-				if (isset($rev['redirect']) and $rev['redirect']) {
322
-					include_spip('inc/headers');
323
-					[$masque, $message] = redirige_formulaire($rev['redirect'], '', 'ajaxform');
324
-					$post["message_ok_$form"] .= $message;
325
-					$retour .= $masque;
326
-				}
327
-			}
328
-		}
329
-		// si le formulaire a ete soumis en ajax, on le renvoie direct !
330
-		if (_request('var_ajax')) {
331
-			if (find_in_path('formulaire_.php', 'balise/', true)) {
332
-				include_spip('inc/actions');
333
-				include_spip('public/assembler');
334
-				$retour .= inclure_balise_dynamique(balise_formulaire__dyn($form, ...$args), false);
335
-				// on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7
336
-				// sans cela le formulaire n'est pas actif apres le hit ajax
337
-				// la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe
338
-				$retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>" . $retour;
339
-				ajax_retour($retour, false);
310
+            // verifier si traiter n'a pas echoue avec une erreur :
311
+            if (isset($rev['message_erreur'])) {
312
+                $post["erreurs_$form"]['message_erreur'] = $rev['message_erreur'];
313
+                // si il y a une erreur on ne redirige pas
314
+            } else {
315
+                // sinon faire ce qu'il faut :
316
+                if (isset($rev['editable'])) {
317
+                    $post["editable_$form"] = $rev['editable'];
318
+                }
319
+                // si une redirection est demandee, appeler redirigae_formulaire qui choisira
320
+                // le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue)
321
+                if (isset($rev['redirect']) and $rev['redirect']) {
322
+                    include_spip('inc/headers');
323
+                    [$masque, $message] = redirige_formulaire($rev['redirect'], '', 'ajaxform');
324
+                    $post["message_ok_$form"] .= $message;
325
+                    $retour .= $masque;
326
+                }
327
+            }
328
+        }
329
+        // si le formulaire a ete soumis en ajax, on le renvoie direct !
330
+        if (_request('var_ajax')) {
331
+            if (find_in_path('formulaire_.php', 'balise/', true)) {
332
+                include_spip('inc/actions');
333
+                include_spip('public/assembler');
334
+                $retour .= inclure_balise_dynamique(balise_formulaire__dyn($form, ...$args), false);
335
+                // on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7
336
+                // sans cela le formulaire n'est pas actif apres le hit ajax
337
+                // la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe
338
+                $retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>" . $retour;
339
+                ajax_retour($retour, false);
340 340
 
341
-				return true; // on a fini le hit
342
-			}
343
-		}
344
-		// restaurer la lang en cours
345
-		changer_langue($old_lang);
346
-	}
341
+                return true; // on a fini le hit
342
+            }
343
+        }
344
+        // restaurer la lang en cours
345
+        changer_langue($old_lang);
346
+    }
347 347
 
348
-	return false; // le hit peut continuer normalement
348
+    return false; // le hit peut continuer normalement
349 349
 }
Please login to merge, or discard this patch.
ecrire/public/cacher.php 1 patch
Indentation   +321 added lines, -321 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 /**
@@ -25,9 +25,9 @@  discard block
 block discarded – undo
25 25
  * @return string
26 26
  */
27 27
 function generer_nom_fichier_cache($contexte, $page) {
28
-	$u = md5(var_export([$contexte, $page], true));
28
+    $u = md5(var_export([$contexte, $page], true));
29 29
 
30
-	return $u . '.cache';
30
+    return $u . '.cache';
31 31
 }
32 32
 
33 33
 /**
@@ -43,26 +43,26 @@  discard block
 block discarded – undo
43 43
  * @return string
44 44
  */
45 45
 function cache_chemin_fichier($nom_cache, $ecrire = false) {
46
-	static $l1, $l2;
47
-	if (is_null($l1)) {
48
-		$length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
49
-		$l1 = intval(floor($length / 2));
50
-		$l2 = $length - $l1;
51
-	}
52
-	$d = substr($nom_cache, 0, $l1);
53
-	$u = substr($nom_cache, $l1, $l2);
54
-
55
-	if ($ecrire) {
56
-		$rep = sous_repertoire(_DIR_CACHE, '', false, true);
57
-		$rep = sous_repertoire($rep, 'calcul/', false, true);
58
-		$rep = sous_repertoire($rep, $d, false, true);
59
-	}
60
-	else {
61
-		// en lecture on essaye pas de creer les repertoires, on va au plus vite
62
-		$rep = _DIR_CACHE . "calcul/$d/";
63
-	}
64
-
65
-	return $rep . $u . '.cache';
46
+    static $l1, $l2;
47
+    if (is_null($l1)) {
48
+        $length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
49
+        $l1 = intval(floor($length / 2));
50
+        $l2 = $length - $l1;
51
+    }
52
+    $d = substr($nom_cache, 0, $l1);
53
+    $u = substr($nom_cache, $l1, $l2);
54
+
55
+    if ($ecrire) {
56
+        $rep = sous_repertoire(_DIR_CACHE, '', false, true);
57
+        $rep = sous_repertoire($rep, 'calcul/', false, true);
58
+        $rep = sous_repertoire($rep, $d, false, true);
59
+    }
60
+    else {
61
+        // en lecture on essaye pas de creer les repertoires, on va au plus vite
62
+        $rep = _DIR_CACHE . "calcul/$d/";
63
+    }
64
+
65
+    return $rep . $u . '.cache';
66 66
 }
67 67
 
68 68
 /**
@@ -73,7 +73,7 @@  discard block
 block discarded – undo
73 73
  * @return bool
74 74
  */
75 75
 function ecrire_cache($nom_cache, $valeur) {
76
-	return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur]));
76
+    return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur]));
77 77
 }
78 78
 
79 79
 /**
@@ -83,38 +83,38 @@  discard block
 block discarded – undo
83 83
  * @return mixed
84 84
  */
85 85
 function lire_cache($nom_cache) {
86
-	$tmp = [];
87
-	if (
88
-		file_exists($f = cache_chemin_fichier($nom_cache))
89
-		and lire_fichier($f, $tmp)
90
-		and $tmp = unserialize($tmp)
91
-		and $tmp['nom_cache'] == $nom_cache
92
-		and isset($tmp['valeur'])
93
-	) {
94
-		return $tmp['valeur'];
95
-	}
96
-
97
-	return false;
86
+    $tmp = [];
87
+    if (
88
+        file_exists($f = cache_chemin_fichier($nom_cache))
89
+        and lire_fichier($f, $tmp)
90
+        and $tmp = unserialize($tmp)
91
+        and $tmp['nom_cache'] == $nom_cache
92
+        and isset($tmp['valeur'])
93
+    ) {
94
+        return $tmp['valeur'];
95
+    }
96
+
97
+    return false;
98 98
 }
99 99
 
100 100
 // Parano : on signe le cache, afin d'interdire un hack d'injection
101 101
 // dans notre memcache
102 102
 function cache_signature(&$page) {
103
-	if (!isset($GLOBALS['meta']['cache_signature'])) {
104
-		include_spip('inc/acces');
105
-		include_spip('auth/sha256.inc');
106
-		ecrire_meta(
107
-			'cache_signature',
108
-			spip_sha256(
109
-				$_SERVER['DOCUMENT_ROOT']
110
-				. ($_SERVER['SERVER_SIGNATURE'] ?? '')
111
-				. creer_uniqid()
112
-			),
113
-			'non'
114
-		);
115
-	}
116
-
117
-	return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']);
103
+    if (!isset($GLOBALS['meta']['cache_signature'])) {
104
+        include_spip('inc/acces');
105
+        include_spip('auth/sha256.inc');
106
+        ecrire_meta(
107
+            'cache_signature',
108
+            spip_sha256(
109
+                $_SERVER['DOCUMENT_ROOT']
110
+                . ($_SERVER['SERVER_SIGNATURE'] ?? '')
111
+                . creer_uniqid()
112
+            ),
113
+            'non'
114
+        );
115
+    }
116
+
117
+    return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']);
118 118
 }
119 119
 
120 120
 /**
@@ -127,14 +127,14 @@  discard block
 block discarded – undo
127 127
  * @return array
128 128
  */
129 129
 function gzip_page($page) {
130
-	if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) {
131
-		$page['gz'] = true;
132
-		$page['texte'] = gzcompress($page['texte']);
133
-	} else {
134
-		$page['gz'] = false;
135
-	}
136
-
137
-	return $page;
130
+    if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) {
131
+        $page['gz'] = true;
132
+        $page['texte'] = gzcompress($page['texte']);
133
+    } else {
134
+        $page['gz'] = false;
135
+    }
136
+
137
+    return $page;
138 138
 }
139 139
 
140 140
 /**
@@ -147,10 +147,10 @@  discard block
 block discarded – undo
147 147
  * @return void
148 148
  */
149 149
 function gunzip_page(&$page) {
150
-	if ($page['gz']) {
151
-		$page['texte'] = gzuncompress($page['texte']);
152
-		$page['gz'] = false; // ne pas gzuncompress deux fois une meme page
153
-	}
150
+    if ($page['gz']) {
151
+        $page['texte'] = gzuncompress($page['texte']);
152
+        $page['gz'] = false; // ne pas gzuncompress deux fois une meme page
153
+    }
154 154
 }
155 155
 
156 156
 /**
@@ -165,72 +165,72 @@  discard block
 block discarded – undo
165 165
  * -1 si il faut calculer sans stocker en cache
166 166
  */
167 167
 function cache_valide(&$page, $date) {
168
-	$now = $_SERVER['REQUEST_TIME'];
169
-
170
-	// Apparition d'un nouvel article post-date ?
171
-	if (
172
-		isset($GLOBALS['meta']['post_dates'])
173
-		and $GLOBALS['meta']['post_dates'] == 'non'
174
-		and isset($GLOBALS['meta']['date_prochain_postdate'])
175
-		and $now > $GLOBALS['meta']['date_prochain_postdate']
176
-	) {
177
-		spip_log('Un article post-date invalide le cache');
178
-		include_spip('inc/rubriques');
179
-		calculer_prochain_postdate(true);
180
-	}
181
-
182
-	if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) {
183
-		return -1;
184
-	}
185
-	if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
186
-		return -1;
187
-	}
188
-	if (defined('_NO_CACHE')) {
189
-		return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE;
190
-	}
191
-
192
-	// pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
193
-	if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) {
194
-		return _IS_BOT ? -1 : 1;
195
-	}
196
-
197
-	// controle de la signature
198
-	if ($page['sig'] !== cache_signature($page)) {
199
-		return _IS_BOT ? -1 : 1;
200
-	}
201
-
202
-	// #CACHE{n,statique} => on n'invalide pas avec derniere_modif
203
-	// cf. ecrire/public/balises.php, balise_CACHE_dist()
204
-	if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') {
205
-		// Cache invalide par la meta 'derniere_modif'
206
-		// sauf pour les bots, qui utilisent toujours le cache
207
-		if (
208
-			!_IS_BOT
209
-			and $GLOBALS['derniere_modif_invalide']
210
-			and isset($GLOBALS['meta']['derniere_modif'])
211
-			and $date < $GLOBALS['meta']['derniere_modif']
212
-		) {
213
-			return 1;
214
-		}
215
-	}
216
-
217
-	// Sinon comparer l'age du fichier a sa duree de cache
218
-	$duree = intval($page['entetes']['X-Spip-Cache']);
219
-	$cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
220
-	if ($duree == 0) {  #CACHE{0}
221
-	return -1;
222
-	} // sauf pour les bots, qui utilisent toujours le cache
223
-	else {
224
-		if (
225
-			(!_IS_BOT and $date + $duree < $now)
226
-			# le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots
227
-			or $date < $cache_mark
228
-		) {
229
-			return _IS_BOT ? -1 : 1;
230
-		} else {
231
-			return 0;
232
-		}
233
-	}
168
+    $now = $_SERVER['REQUEST_TIME'];
169
+
170
+    // Apparition d'un nouvel article post-date ?
171
+    if (
172
+        isset($GLOBALS['meta']['post_dates'])
173
+        and $GLOBALS['meta']['post_dates'] == 'non'
174
+        and isset($GLOBALS['meta']['date_prochain_postdate'])
175
+        and $now > $GLOBALS['meta']['date_prochain_postdate']
176
+    ) {
177
+        spip_log('Un article post-date invalide le cache');
178
+        include_spip('inc/rubriques');
179
+        calculer_prochain_postdate(true);
180
+    }
181
+
182
+    if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) {
183
+        return -1;
184
+    }
185
+    if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
186
+        return -1;
187
+    }
188
+    if (defined('_NO_CACHE')) {
189
+        return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE;
190
+    }
191
+
192
+    // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
193
+    if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) {
194
+        return _IS_BOT ? -1 : 1;
195
+    }
196
+
197
+    // controle de la signature
198
+    if ($page['sig'] !== cache_signature($page)) {
199
+        return _IS_BOT ? -1 : 1;
200
+    }
201
+
202
+    // #CACHE{n,statique} => on n'invalide pas avec derniere_modif
203
+    // cf. ecrire/public/balises.php, balise_CACHE_dist()
204
+    if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') {
205
+        // Cache invalide par la meta 'derniere_modif'
206
+        // sauf pour les bots, qui utilisent toujours le cache
207
+        if (
208
+            !_IS_BOT
209
+            and $GLOBALS['derniere_modif_invalide']
210
+            and isset($GLOBALS['meta']['derniere_modif'])
211
+            and $date < $GLOBALS['meta']['derniere_modif']
212
+        ) {
213
+            return 1;
214
+        }
215
+    }
216
+
217
+    // Sinon comparer l'age du fichier a sa duree de cache
218
+    $duree = intval($page['entetes']['X-Spip-Cache']);
219
+    $cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
220
+    if ($duree == 0) {  #CACHE{0}
221
+    return -1;
222
+    } // sauf pour les bots, qui utilisent toujours le cache
223
+    else {
224
+        if (
225
+            (!_IS_BOT and $date + $duree < $now)
226
+            # le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots
227
+            or $date < $cache_mark
228
+        ) {
229
+            return _IS_BOT ? -1 : 1;
230
+        } else {
231
+            return 0;
232
+        }
233
+    }
234 234
 }
235 235
 
236 236
 /**
@@ -243,59 +243,59 @@  discard block
 block discarded – undo
243 243
  */
244 244
 function creer_cache(&$page, &$chemin_cache) {
245 245
 
246
-	// Ne rien faire si on est en preview, debug, ou si une erreur
247
-	// grave s'est presentee (compilation du squelette, MySQL, etc)
248
-	// le cas var_nocache ne devrait jamais arriver ici (securite)
249
-	// le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
250
-	if (
251
-		(defined('_VAR_NOCACHE') and _VAR_NOCACHE)
252
-		or defined('spip_interdire_cache')
253
-	) {
254
-		return;
255
-	}
256
-
257
-	// Si la page c1234 a un invalideur de session 'zz', sauver dans
258
-	// 'tmp/cache/MD5(chemin_cache)_zz'
259
-	if (
260
-		isset($page['invalideurs'])
261
-		and isset($page['invalideurs']['session'])
262
-	) {
263
-		// on verifie que le contenu du chemin cache indique seulement
264
-		// "cache sessionne" ; sa date indique la date de validite
265
-		// des caches sessionnes
266
-		if (!$tmp = lire_cache($chemin_cache)) {
267
-			spip_log('Creation cache sessionne ' . $chemin_cache);
268
-			$tmp = [
269
-				'invalideurs' => ['session' => ''],
270
-				'lastmodified' => $_SERVER['REQUEST_TIME']
271
-			];
272
-			ecrire_cache($chemin_cache, $tmp);
273
-		}
274
-		$chemin_cache = generer_nom_fichier_cache(
275
-			['chemin_cache' => $chemin_cache],
276
-			['session' => $page['invalideurs']['session']]
277
-		);
278
-	}
279
-
280
-	// ajouter la date de production dans le cache lui meme
281
-	// (qui contient deja sa duree de validite)
282
-	$page['lastmodified'] = $_SERVER['REQUEST_TIME'];
283
-
284
-	// compresser le contenu si besoin
285
-	$pagez = gzip_page($page);
286
-
287
-	// signer le contenu
288
-	$pagez['sig'] = cache_signature($pagez);
289
-
290
-	// l'enregistrer, compresse ou non...
291
-	$ok = ecrire_cache($chemin_cache, $pagez);
292
-
293
-	spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour "
294
-		. $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
295
-
296
-	// Inserer ses invalideurs
297
-	include_spip('inc/invalideur');
298
-	maj_invalideurs($chemin_cache, $page);
246
+    // Ne rien faire si on est en preview, debug, ou si une erreur
247
+    // grave s'est presentee (compilation du squelette, MySQL, etc)
248
+    // le cas var_nocache ne devrait jamais arriver ici (securite)
249
+    // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
250
+    if (
251
+        (defined('_VAR_NOCACHE') and _VAR_NOCACHE)
252
+        or defined('spip_interdire_cache')
253
+    ) {
254
+        return;
255
+    }
256
+
257
+    // Si la page c1234 a un invalideur de session 'zz', sauver dans
258
+    // 'tmp/cache/MD5(chemin_cache)_zz'
259
+    if (
260
+        isset($page['invalideurs'])
261
+        and isset($page['invalideurs']['session'])
262
+    ) {
263
+        // on verifie que le contenu du chemin cache indique seulement
264
+        // "cache sessionne" ; sa date indique la date de validite
265
+        // des caches sessionnes
266
+        if (!$tmp = lire_cache($chemin_cache)) {
267
+            spip_log('Creation cache sessionne ' . $chemin_cache);
268
+            $tmp = [
269
+                'invalideurs' => ['session' => ''],
270
+                'lastmodified' => $_SERVER['REQUEST_TIME']
271
+            ];
272
+            ecrire_cache($chemin_cache, $tmp);
273
+        }
274
+        $chemin_cache = generer_nom_fichier_cache(
275
+            ['chemin_cache' => $chemin_cache],
276
+            ['session' => $page['invalideurs']['session']]
277
+        );
278
+    }
279
+
280
+    // ajouter la date de production dans le cache lui meme
281
+    // (qui contient deja sa duree de validite)
282
+    $page['lastmodified'] = $_SERVER['REQUEST_TIME'];
283
+
284
+    // compresser le contenu si besoin
285
+    $pagez = gzip_page($page);
286
+
287
+    // signer le contenu
288
+    $pagez['sig'] = cache_signature($pagez);
289
+
290
+    // l'enregistrer, compresse ou non...
291
+    $ok = ecrire_cache($chemin_cache, $pagez);
292
+
293
+    spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour "
294
+        . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
295
+
296
+    // Inserer ses invalideurs
297
+    include_spip('inc/invalideur');
298
+    maj_invalideurs($chemin_cache, $page);
299 299
 }
300 300
 
301 301
 
@@ -308,15 +308,15 @@  discard block
 block discarded – undo
308 308
  * @return void
309 309
  */
310 310
 function nettoyer_petit_cache($prefix, $duree = 300) {
311
-	// determiner le repertoire a purger : 'tmp/CACHE/rech/'
312
-	$dircache = sous_repertoire(_DIR_CACHE, $prefix);
313
-	if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) {
314
-		foreach (preg_files($dircache, '[.]txt$') as $f) {
315
-			if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) {
316
-				spip_unlink($f);
317
-			}
318
-		}
319
-	}
311
+    // determiner le repertoire a purger : 'tmp/CACHE/rech/'
312
+    $dircache = sous_repertoire(_DIR_CACHE, $prefix);
313
+    if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) {
314
+        foreach (preg_files($dircache, '[.]txt$') as $f) {
315
+            if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) {
316
+                spip_unlink($f);
317
+            }
318
+        }
319
+    }
320 320
 }
321 321
 
322 322
 
@@ -344,134 +344,134 @@  discard block
 block discarded – undo
344 344
  */
345 345
 function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) {
346 346
 
347
-	# fonction de cache minimale : dire "non on ne met rien en cache"
348
-	# $use_cache = -1; return;
349
-
350
-	// Second appel, destine a l'enregistrement du cache sur le disque
351
-	if (isset($chemin_cache)) {
352
-		creer_cache($page, $chemin_cache);
353
-		return;
354
-	}
355
-
356
-	// Toute la suite correspond au premier appel
357
-	$contexte_implicite = $page['contexte_implicite'];
358
-
359
-	// Cas ignorant le cache car completement dynamique
360
-	if (
361
-		(!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST')
362
-		or _request('connect')
363
-	) {
364
-		$use_cache = -1;
365
-		$lastmodified = 0;
366
-		$chemin_cache = '';
367
-		$page = [];
368
-
369
-		return;
370
-	}
371
-
372
-	// Controler l'existence d'un cache nous correspondant
373
-	$chemin_cache = generer_nom_fichier_cache($contexte, $page);
374
-	$lastmodified = 0;
375
-
376
-	// charger le cache s'il existe (et si il a bien le bon hash = anticollision)
377
-	if (!$page = lire_cache($chemin_cache)) {
378
-		$page = [];
379
-	}
380
-
381
-	// s'il est sessionne, charger celui correspondant a notre session
382
-	if (
383
-		isset($page['invalideurs'])
384
-		and isset($page['invalideurs']['session'])
385
-	) {
386
-		$chemin_cache_session = generer_nom_fichier_cache(
387
-			['chemin_cache' => $chemin_cache],
388
-			['session' => spip_session()]
389
-		);
390
-		if (
391
-			$page_session = lire_cache($chemin_cache_session)
392
-			and $page_session['lastmodified'] >= $page['lastmodified']
393
-		) {
394
-			$page = $page_session;
395
-		} else {
396
-			$page = [];
397
-		}
398
-	}
399
-
400
-
401
-	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
402
-	if (isset($GLOBALS['meta']['invalider'])) {
403
-		// ne le faire que si la base est disponible
404
-		if (spip_connect()) {
405
-			include_spip('inc/invalideur');
406
-			retire_caches($chemin_cache); # API invalideur inutile
407
-			supprimer_fichier(_DIR_CACHE . $chemin_cache);
408
-			if (isset($chemin_cache_session) and $chemin_cache_session) {
409
-				supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
410
-			}
411
-		}
412
-	}
413
-
414
-	// Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
415
-	// on supprime le cache
416
-	if (
417
-		defined('_VAR_MODE') &&
418
-		_VAR_MODE &&
419
-		(isset($_COOKIE['spip_session']) ||
420
-			isset($_COOKIE['spip_admin']) ||
421
-			@file_exists(_ACCESS_FILE_NAME))
422
-	) {
423
-		$page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
424
-		include_spip('inc/invalideur');
425
-		retire_caches($chemin_cache); # API invalideur inutile
426
-		supprimer_fichier(_DIR_CACHE . $chemin_cache);
427
-		if (isset($chemin_cache_session) and $chemin_cache_session) {
428
-			supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
429
-		}
430
-	}
431
-
432
-	// $delais par defaut
433
-	// pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
434
-	// qui sont a cache nul par defaut
435
-	if (!isset($GLOBALS['delais'])) {
436
-		if (!defined('_DUREE_CACHE_DEFAUT')) {
437
-			define('_DUREE_CACHE_DEFAUT', 24 * 3600);
438
-		}
439
-		$GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
440
-	}
441
-
442
-	// determiner la validite de la page
443
-	if ($page) {
444
-		$use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
445
-		// le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
446
-		// par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
447
-		$page['contexte_implicite'] = $contexte_implicite;
448
-		if (!$use_cache) {
449
-			// $page est un cache utilisable
450
-			gunzip_page($page);
451
-
452
-			return;
453
-		}
454
-	} else {
455
-		$page = ['contexte_implicite' => $contexte_implicite];
456
-		$use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
457
-	}
458
-
459
-	// Si pas valide mais pas de connexion a la base, le garder quand meme
460
-	if (!spip_connect()) {
461
-		if (isset($page['texte'])) {
462
-			gunzip_page($page);
463
-			$use_cache = 0;
464
-		} else {
465
-			spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
466
-			include_spip('inc/minipres');
467
-
468
-			return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
469
-		}
470
-	}
471
-
472
-	if ($use_cache < 0) {
473
-		$chemin_cache = '';
474
-	}
475
-
476
-	return;
347
+    # fonction de cache minimale : dire "non on ne met rien en cache"
348
+    # $use_cache = -1; return;
349
+
350
+    // Second appel, destine a l'enregistrement du cache sur le disque
351
+    if (isset($chemin_cache)) {
352
+        creer_cache($page, $chemin_cache);
353
+        return;
354
+    }
355
+
356
+    // Toute la suite correspond au premier appel
357
+    $contexte_implicite = $page['contexte_implicite'];
358
+
359
+    // Cas ignorant le cache car completement dynamique
360
+    if (
361
+        (!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST')
362
+        or _request('connect')
363
+    ) {
364
+        $use_cache = -1;
365
+        $lastmodified = 0;
366
+        $chemin_cache = '';
367
+        $page = [];
368
+
369
+        return;
370
+    }
371
+
372
+    // Controler l'existence d'un cache nous correspondant
373
+    $chemin_cache = generer_nom_fichier_cache($contexte, $page);
374
+    $lastmodified = 0;
375
+
376
+    // charger le cache s'il existe (et si il a bien le bon hash = anticollision)
377
+    if (!$page = lire_cache($chemin_cache)) {
378
+        $page = [];
379
+    }
380
+
381
+    // s'il est sessionne, charger celui correspondant a notre session
382
+    if (
383
+        isset($page['invalideurs'])
384
+        and isset($page['invalideurs']['session'])
385
+    ) {
386
+        $chemin_cache_session = generer_nom_fichier_cache(
387
+            ['chemin_cache' => $chemin_cache],
388
+            ['session' => spip_session()]
389
+        );
390
+        if (
391
+            $page_session = lire_cache($chemin_cache_session)
392
+            and $page_session['lastmodified'] >= $page['lastmodified']
393
+        ) {
394
+            $page = $page_session;
395
+        } else {
396
+            $page = [];
397
+        }
398
+    }
399
+
400
+
401
+    // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
402
+    if (isset($GLOBALS['meta']['invalider'])) {
403
+        // ne le faire que si la base est disponible
404
+        if (spip_connect()) {
405
+            include_spip('inc/invalideur');
406
+            retire_caches($chemin_cache); # API invalideur inutile
407
+            supprimer_fichier(_DIR_CACHE . $chemin_cache);
408
+            if (isset($chemin_cache_session) and $chemin_cache_session) {
409
+                supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
410
+            }
411
+        }
412
+    }
413
+
414
+    // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
415
+    // on supprime le cache
416
+    if (
417
+        defined('_VAR_MODE') &&
418
+        _VAR_MODE &&
419
+        (isset($_COOKIE['spip_session']) ||
420
+            isset($_COOKIE['spip_admin']) ||
421
+            @file_exists(_ACCESS_FILE_NAME))
422
+    ) {
423
+        $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
424
+        include_spip('inc/invalideur');
425
+        retire_caches($chemin_cache); # API invalideur inutile
426
+        supprimer_fichier(_DIR_CACHE . $chemin_cache);
427
+        if (isset($chemin_cache_session) and $chemin_cache_session) {
428
+            supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
429
+        }
430
+    }
431
+
432
+    // $delais par defaut
433
+    // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
434
+    // qui sont a cache nul par defaut
435
+    if (!isset($GLOBALS['delais'])) {
436
+        if (!defined('_DUREE_CACHE_DEFAUT')) {
437
+            define('_DUREE_CACHE_DEFAUT', 24 * 3600);
438
+        }
439
+        $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
440
+    }
441
+
442
+    // determiner la validite de la page
443
+    if ($page) {
444
+        $use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
445
+        // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
446
+        // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
447
+        $page['contexte_implicite'] = $contexte_implicite;
448
+        if (!$use_cache) {
449
+            // $page est un cache utilisable
450
+            gunzip_page($page);
451
+
452
+            return;
453
+        }
454
+    } else {
455
+        $page = ['contexte_implicite' => $contexte_implicite];
456
+        $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
457
+    }
458
+
459
+    // Si pas valide mais pas de connexion a la base, le garder quand meme
460
+    if (!spip_connect()) {
461
+        if (isset($page['texte'])) {
462
+            gunzip_page($page);
463
+            $use_cache = 0;
464
+        } else {
465
+            spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
466
+            include_spip('inc/minipres');
467
+
468
+            return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
469
+        }
470
+    }
471
+
472
+    if ($use_cache < 0) {
473
+        $chemin_cache = '';
474
+    }
475
+
476
+    return;
477 477
 }
Please login to merge, or discard this patch.
ecrire/public/assembler.php 1 patch
Indentation   +633 added lines, -633 removed lines patch added patch discarded remove patch
@@ -20,178 +20,178 @@  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
 // En cas de modification, il faut aussi actualiser la regexp de nettoyer_uri_var() dans inc/utils.php
27 27
 if (!defined('_CONTEXTE_IGNORE_VARIABLES')) {
28
-	define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
28
+    define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
29 29
 }
30 30
 
31 31
 function assembler($fond, string $connect = '') {
32 32
 
33
-	$chemin_cache = null;
34
-	$lastmodified = null;
35
-	$res = null;
36
-	// flag_preserver est modifie ici, et utilise en globale
37
-	// use_cache sert a informer le bouton d'admin pr savoir s'il met un *
38
-	// contexte est utilise en globale dans le formulaire d'admin
39
-
40
-	$GLOBALS['contexte'] = calculer_contexte();
41
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
42
-	$page['contexte_implicite']['cache'] = $fond . preg_replace(
43
-		',\.[a-zA-Z0-9]*$,',
44
-		'',
45
-		preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
46
-	);
47
-	// Cette fonction est utilisee deux fois
48
-	$cacher = charger_fonction('cacher', 'public', true);
49
-	// Les quatre derniers parametres sont modifies par la fonction:
50
-	// emplacement, validite, et, s'il est valide, contenu & age
51
-	if ($cacher) {
52
-		$res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
53
-	} else {
54
-		$GLOBALS['use_cache'] = -1;
55
-	}
56
-	// Si un resultat est retourne, c'est un message d'impossibilite
57
-	if ($res) {
58
-		return ['texte' => $res];
59
-	}
60
-
61
-	if (!$chemin_cache || !$lastmodified) {
62
-		$lastmodified = time();
63
-	}
64
-
65
-	$headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
66
-	$calculer_page = true;
67
-
68
-	// Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
69
-	// une perennite valide a meme reponse qu'une requete HEAD (par defaut les
70
-	// pages sont dynamiques)
71
-	if (
72
-		isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
73
-		and (!defined('_VAR_MODE') or !_VAR_MODE)
74
-		and $chemin_cache
75
-		and isset($page['entetes'])
76
-		and isset($page['entetes']['Cache-Control'])
77
-		and strstr($page['entetes']['Cache-Control'], 'max-age=')
78
-		and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
79
-	) {
80
-		$since = preg_replace(
81
-			'/;.*/',
82
-			'',
83
-			$_SERVER['HTTP_IF_MODIFIED_SINCE']
84
-		);
85
-		$since = str_replace('GMT', '', $since);
86
-		if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
87
-			$page['status'] = 304;
88
-			$headers_only = true;
89
-			$calculer_page = false;
90
-		}
91
-	}
92
-
93
-	// Si requete HEAD ou Last-modified compatible, ignorer le texte
94
-	// et pas de content-type (pour contrer le bouton admin de inc-public)
95
-	if (!$calculer_page) {
96
-		$page['texte'] = '';
97
-	} else {
98
-		// si la page est prise dans le cache
99
-		if (!$GLOBALS['use_cache']) {
100
-			// Informer les boutons d'admin du contexte
101
-			// (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
102
-			$GLOBALS['contexte'] = $page['contexte'];
103
-
104
-			// vider les globales url propres qui ne doivent plus etre utilisees en cas
105
-			// d'inversion url => objet
106
-			// plus necessaire si on utilise bien la fonction urls_decoder_url
107
-			#unset($_SERVER['REDIRECT_url_propre']);
108
-			#unset($_ENV['url_propre']);
109
-		} else {
110
-			// Compat ascendante :
111
-			// 1. $contexte est global
112
-			// (a evacuer car urls_decoder_url gere ce probleme ?)
113
-			// et calculer la page
114
-			if (!test_espace_prive()) {
115
-				include_spip('inc/urls');
116
-				[$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url(
117
-					nettoyer_uri(),
118
-					$fond,
119
-					$GLOBALS['contexte'],
120
-					true
121
-				);
122
-			}
123
-			// squelette par defaut
124
-			if (!strlen($fond ?? '')) {
125
-				$fond = 'sommaire';
126
-			}
127
-
128
-			// produire la page : peut mettre a jour $lastmodified
129
-			$produire_page = charger_fonction('produire_page', 'public');
130
-			$page = $produire_page(
131
-				$fond,
132
-				$GLOBALS['contexte'],
133
-				$GLOBALS['use_cache'],
134
-				$chemin_cache,
135
-				null,
136
-				$page,
137
-				$lastmodified,
138
-				$connect
139
-			);
140
-			if ($page === '') {
141
-				$erreur = _T(
142
-					'info_erreur_squelette2',
143
-					['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
144
-				);
145
-				erreur_squelette($erreur);
146
-				// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
147
-				$page = ['texte' => '', 'erreur' => $erreur];
148
-			}
149
-		}
150
-
151
-		if ($page and $chemin_cache) {
152
-			$page['cache'] = $chemin_cache;
153
-		}
154
-
155
-		auto_content_type($page);
156
-
157
-		$GLOBALS['flag_preserver'] |= headers_sent();
158
-
159
-		// Definir les entetes si ce n'est fait
160
-		if (!$GLOBALS['flag_preserver']) {
161
-			// Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
162
-			if (
163
-				trim($page['texte']) === ''
164
-				and _VAR_MODE !== 'debug'
165
-				and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
166
-			) {
167
-				$GLOBALS['contexte']['fond_erreur'] = $fond;
168
-				$page = message_page_indisponible($page, $GLOBALS['contexte']);
169
-			}
170
-			// pas de cache client en mode 'observation'
171
-			if (defined('_VAR_MODE') and _VAR_MODE) {
172
-				$page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
173
-				$page['entetes']['Pragma'] = 'no-cache';
174
-			}
175
-		}
176
-	}
177
-
178
-	// Entete Last-Modified:
179
-	// eviter d'etre incoherent en envoyant un lastmodified identique
180
-	// a celui qu'on a refuse d'honorer plus haut (cf. #655)
181
-	if (
182
-		$lastmodified
183
-		and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
184
-		and !isset($page['entetes']['Last-Modified'])
185
-	) {
186
-		$page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
187
-	}
188
-
189
-	// fermer la connexion apres les headers si requete HEAD
190
-	if ($headers_only) {
191
-		$page['entetes']['Connection'] = 'close';
192
-	}
193
-
194
-	return $page;
33
+    $chemin_cache = null;
34
+    $lastmodified = null;
35
+    $res = null;
36
+    // flag_preserver est modifie ici, et utilise en globale
37
+    // use_cache sert a informer le bouton d'admin pr savoir s'il met un *
38
+    // contexte est utilise en globale dans le formulaire d'admin
39
+
40
+    $GLOBALS['contexte'] = calculer_contexte();
41
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
42
+    $page['contexte_implicite']['cache'] = $fond . preg_replace(
43
+        ',\.[a-zA-Z0-9]*$,',
44
+        '',
45
+        preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
46
+    );
47
+    // Cette fonction est utilisee deux fois
48
+    $cacher = charger_fonction('cacher', 'public', true);
49
+    // Les quatre derniers parametres sont modifies par la fonction:
50
+    // emplacement, validite, et, s'il est valide, contenu & age
51
+    if ($cacher) {
52
+        $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
53
+    } else {
54
+        $GLOBALS['use_cache'] = -1;
55
+    }
56
+    // Si un resultat est retourne, c'est un message d'impossibilite
57
+    if ($res) {
58
+        return ['texte' => $res];
59
+    }
60
+
61
+    if (!$chemin_cache || !$lastmodified) {
62
+        $lastmodified = time();
63
+    }
64
+
65
+    $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
66
+    $calculer_page = true;
67
+
68
+    // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
69
+    // une perennite valide a meme reponse qu'une requete HEAD (par defaut les
70
+    // pages sont dynamiques)
71
+    if (
72
+        isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
73
+        and (!defined('_VAR_MODE') or !_VAR_MODE)
74
+        and $chemin_cache
75
+        and isset($page['entetes'])
76
+        and isset($page['entetes']['Cache-Control'])
77
+        and strstr($page['entetes']['Cache-Control'], 'max-age=')
78
+        and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
79
+    ) {
80
+        $since = preg_replace(
81
+            '/;.*/',
82
+            '',
83
+            $_SERVER['HTTP_IF_MODIFIED_SINCE']
84
+        );
85
+        $since = str_replace('GMT', '', $since);
86
+        if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
87
+            $page['status'] = 304;
88
+            $headers_only = true;
89
+            $calculer_page = false;
90
+        }
91
+    }
92
+
93
+    // Si requete HEAD ou Last-modified compatible, ignorer le texte
94
+    // et pas de content-type (pour contrer le bouton admin de inc-public)
95
+    if (!$calculer_page) {
96
+        $page['texte'] = '';
97
+    } else {
98
+        // si la page est prise dans le cache
99
+        if (!$GLOBALS['use_cache']) {
100
+            // Informer les boutons d'admin du contexte
101
+            // (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
102
+            $GLOBALS['contexte'] = $page['contexte'];
103
+
104
+            // vider les globales url propres qui ne doivent plus etre utilisees en cas
105
+            // d'inversion url => objet
106
+            // plus necessaire si on utilise bien la fonction urls_decoder_url
107
+            #unset($_SERVER['REDIRECT_url_propre']);
108
+            #unset($_ENV['url_propre']);
109
+        } else {
110
+            // Compat ascendante :
111
+            // 1. $contexte est global
112
+            // (a evacuer car urls_decoder_url gere ce probleme ?)
113
+            // et calculer la page
114
+            if (!test_espace_prive()) {
115
+                include_spip('inc/urls');
116
+                [$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url(
117
+                    nettoyer_uri(),
118
+                    $fond,
119
+                    $GLOBALS['contexte'],
120
+                    true
121
+                );
122
+            }
123
+            // squelette par defaut
124
+            if (!strlen($fond ?? '')) {
125
+                $fond = 'sommaire';
126
+            }
127
+
128
+            // produire la page : peut mettre a jour $lastmodified
129
+            $produire_page = charger_fonction('produire_page', 'public');
130
+            $page = $produire_page(
131
+                $fond,
132
+                $GLOBALS['contexte'],
133
+                $GLOBALS['use_cache'],
134
+                $chemin_cache,
135
+                null,
136
+                $page,
137
+                $lastmodified,
138
+                $connect
139
+            );
140
+            if ($page === '') {
141
+                $erreur = _T(
142
+                    'info_erreur_squelette2',
143
+                    ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
144
+                );
145
+                erreur_squelette($erreur);
146
+                // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
147
+                $page = ['texte' => '', 'erreur' => $erreur];
148
+            }
149
+        }
150
+
151
+        if ($page and $chemin_cache) {
152
+            $page['cache'] = $chemin_cache;
153
+        }
154
+
155
+        auto_content_type($page);
156
+
157
+        $GLOBALS['flag_preserver'] |= headers_sent();
158
+
159
+        // Definir les entetes si ce n'est fait
160
+        if (!$GLOBALS['flag_preserver']) {
161
+            // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
162
+            if (
163
+                trim($page['texte']) === ''
164
+                and _VAR_MODE !== 'debug'
165
+                and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
166
+            ) {
167
+                $GLOBALS['contexte']['fond_erreur'] = $fond;
168
+                $page = message_page_indisponible($page, $GLOBALS['contexte']);
169
+            }
170
+            // pas de cache client en mode 'observation'
171
+            if (defined('_VAR_MODE') and _VAR_MODE) {
172
+                $page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
173
+                $page['entetes']['Pragma'] = 'no-cache';
174
+            }
175
+        }
176
+    }
177
+
178
+    // Entete Last-Modified:
179
+    // eviter d'etre incoherent en envoyant un lastmodified identique
180
+    // a celui qu'on a refuse d'honorer plus haut (cf. #655)
181
+    if (
182
+        $lastmodified
183
+        and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
184
+        and !isset($page['entetes']['Last-Modified'])
185
+    ) {
186
+        $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
187
+    }
188
+
189
+    // fermer la connexion apres les headers si requete HEAD
190
+    if ($headers_only) {
191
+        $page['entetes']['Connection'] = 'close';
192
+    }
193
+
194
+    return $page;
195 195
 }
196 196
 
197 197
 /**
@@ -208,19 +208,19 @@  discard block
 block discarded – undo
208 208
  */
209 209
 function calculer_contexte() {
210 210
 
211
-	$contexte = [];
212
-	foreach ($_GET as $var => $val) {
213
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
214
-			$contexte[$var] = $val;
215
-		}
216
-	}
217
-	foreach ($_POST as $var => $val) {
218
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
219
-			$contexte[$var] = $val;
220
-		}
221
-	}
222
-
223
-	return $contexte;
211
+    $contexte = [];
212
+    foreach ($_GET as $var => $val) {
213
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
214
+            $contexte[$var] = $val;
215
+        }
216
+    }
217
+    foreach ($_POST as $var => $val) {
218
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
219
+            $contexte[$var] = $val;
220
+        }
221
+    }
222
+
223
+    return $contexte;
224 224
 }
225 225
 
226 226
 /**
@@ -231,25 +231,25 @@  discard block
 block discarded – undo
231 231
  * @return array
232 232
  */
233 233
 function calculer_contexte_implicite() {
234
-	static $notes = null;
235
-	if (is_null($notes)) {
236
-		$notes = charger_fonction('notes', 'inc', true);
237
-	}
238
-	$contexte_implicite = [
239
-		'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
240
-		'host' => ($_SERVER['HTTP_HOST'] ?? null),
241
-		'https' => ($_SERVER['HTTPS'] ?? ''),
242
-		'espace' => test_espace_prive(),
243
-		'marqueur' => ($GLOBALS['marqueur'] ?? ''),
244
-		'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''),
245
-		'notes' => $notes ? $notes('', 'contexter_cache') : '',
246
-		'spip_version_code' => $GLOBALS['spip_version_code'],
247
-	];
248
-	if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
249
-		$contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
250
-	}
251
-
252
-	return $contexte_implicite;
234
+    static $notes = null;
235
+    if (is_null($notes)) {
236
+        $notes = charger_fonction('notes', 'inc', true);
237
+    }
238
+    $contexte_implicite = [
239
+        'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
240
+        'host' => ($_SERVER['HTTP_HOST'] ?? null),
241
+        'https' => ($_SERVER['HTTPS'] ?? ''),
242
+        'espace' => test_espace_prive(),
243
+        'marqueur' => ($GLOBALS['marqueur'] ?? ''),
244
+        'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''),
245
+        'notes' => $notes ? $notes('', 'contexter_cache') : '',
246
+        'spip_version_code' => $GLOBALS['spip_version_code'],
247
+    ];
248
+    if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
249
+        $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
250
+    }
251
+
252
+    return $contexte_implicite;
253 253
 }
254 254
 
255 255
 //
@@ -258,55 +258,55 @@  discard block
 block discarded – undo
258 258
 
259 259
 function auto_content_type($page) {
260 260
 
261
-	if (!isset($GLOBALS['flag_preserver'])) {
262
-		$GLOBALS['flag_preserver'] = ($page && preg_match(
263
-			'/header\s*\(\s*.content\-type:/isx',
264
-			$page['texte']
265
-		) || (isset($page['entetes']['Content-Type'])));
266
-	}
261
+    if (!isset($GLOBALS['flag_preserver'])) {
262
+        $GLOBALS['flag_preserver'] = ($page && preg_match(
263
+            '/header\s*\(\s*.content\-type:/isx',
264
+            $page['texte']
265
+        ) || (isset($page['entetes']['Content-Type'])));
266
+    }
267 267
 }
268 268
 
269 269
 function inclure_page($fond, $contexte, string $connect = '') {
270
-	$use_cache = null;
271
-	$chemin_cache = null;
272
-	$lastinclude = null;
273
-	$res = null;
274
-	static $cacher, $produire_page;
275
-
276
-	// enlever le fond de contexte inclus car sinon il prend la main
277
-	// dans les sous inclusions -> boucle infinie d'inclusion identique
278
-	// (cette precaution n'est probablement plus utile)
279
-	unset($contexte['fond']);
280
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
281
-	$page['contexte_implicite']['cache'] = $fond;
282
-	if (is_null($cacher)) {
283
-		$cacher = charger_fonction('cacher', 'public', true);
284
-	}
285
-	// Les quatre derniers parametres sont modifies par la fonction:
286
-	// emplacement, validite, et, s'il est valide, contenu & age
287
-	if ($cacher) {
288
-		$res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
289
-	} else {
290
-		$use_cache = -1;
291
-	}
292
-	// $res = message d'erreur : on sort de la
293
-	if ($res) {
294
-		return ['texte' => $res];
295
-	}
296
-
297
-	// Si use_cache ne vaut pas 0, la page doit etre calculee
298
-	// produire la page : peut mettre a jour $lastinclude
299
-	// le contexte_cache envoye a cacher() a ete conserve et est passe a produire
300
-	if ($use_cache) {
301
-		if (is_null($produire_page)) {
302
-			$produire_page = charger_fonction('produire_page', 'public');
303
-		}
304
-		$page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
305
-	}
306
-	// dans tous les cas, mettre a jour $GLOBALS['lastmodified']
307
-	$GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude);
308
-
309
-	return $page;
270
+    $use_cache = null;
271
+    $chemin_cache = null;
272
+    $lastinclude = null;
273
+    $res = null;
274
+    static $cacher, $produire_page;
275
+
276
+    // enlever le fond de contexte inclus car sinon il prend la main
277
+    // dans les sous inclusions -> boucle infinie d'inclusion identique
278
+    // (cette precaution n'est probablement plus utile)
279
+    unset($contexte['fond']);
280
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
281
+    $page['contexte_implicite']['cache'] = $fond;
282
+    if (is_null($cacher)) {
283
+        $cacher = charger_fonction('cacher', 'public', true);
284
+    }
285
+    // Les quatre derniers parametres sont modifies par la fonction:
286
+    // emplacement, validite, et, s'il est valide, contenu & age
287
+    if ($cacher) {
288
+        $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
289
+    } else {
290
+        $use_cache = -1;
291
+    }
292
+    // $res = message d'erreur : on sort de la
293
+    if ($res) {
294
+        return ['texte' => $res];
295
+    }
296
+
297
+    // Si use_cache ne vaut pas 0, la page doit etre calculee
298
+    // produire la page : peut mettre a jour $lastinclude
299
+    // le contexte_cache envoye a cacher() a ete conserve et est passe a produire
300
+    if ($use_cache) {
301
+        if (is_null($produire_page)) {
302
+            $produire_page = charger_fonction('produire_page', 'public');
303
+        }
304
+        $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
305
+    }
306
+    // dans tous les cas, mettre a jour $GLOBALS['lastmodified']
307
+    $GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude);
308
+
309
+    return $page;
310 310
 }
311 311
 
312 312
 /**
@@ -324,41 +324,41 @@  discard block
 block discarded – undo
324 324
  * @return array
325 325
  */
326 326
 function public_produire_page_dist(
327
-	$fond,
328
-	$contexte,
329
-	$use_cache,
330
-	$chemin_cache,
331
-	$contexte_cache,
332
-	&$page,
333
-	&$lastinclude,
334
-	$connect = ''
327
+    $fond,
328
+    $contexte,
329
+    $use_cache,
330
+    $chemin_cache,
331
+    $contexte_cache,
332
+    &$page,
333
+    &$lastinclude,
334
+    $connect = ''
335 335
 ) {
336
-	static $parametrer, $cacher;
337
-	if (!$parametrer) {
338
-		$parametrer = charger_fonction('parametrer', 'public');
339
-	}
340
-	$page = $parametrer($fond, $contexte, $chemin_cache, $connect);
341
-	// et on l'enregistre sur le disque
342
-	if (
343
-		$chemin_cache
344
-		and $use_cache > -1
345
-		and is_array($page)
346
-		and count($page)
347
-		and isset($page['entetes']['X-Spip-Cache'])
348
-		and $page['entetes']['X-Spip-Cache'] > 0
349
-	) {
350
-		if (is_null($cacher)) {
351
-			$cacher = charger_fonction('cacher', 'public', true);
352
-		}
353
-		$lastinclude = time();
354
-		if ($cacher) {
355
-			$cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
356
-		} else {
357
-			$use_cache = -1;
358
-		}
359
-	}
360
-
361
-	return $page;
336
+    static $parametrer, $cacher;
337
+    if (!$parametrer) {
338
+        $parametrer = charger_fonction('parametrer', 'public');
339
+    }
340
+    $page = $parametrer($fond, $contexte, $chemin_cache, $connect);
341
+    // et on l'enregistre sur le disque
342
+    if (
343
+        $chemin_cache
344
+        and $use_cache > -1
345
+        and is_array($page)
346
+        and count($page)
347
+        and isset($page['entetes']['X-Spip-Cache'])
348
+        and $page['entetes']['X-Spip-Cache'] > 0
349
+    ) {
350
+        if (is_null($cacher)) {
351
+            $cacher = charger_fonction('cacher', 'public', true);
352
+        }
353
+        $lastinclude = time();
354
+        if ($cacher) {
355
+            $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
356
+        } else {
357
+            $use_cache = -1;
358
+        }
359
+    }
360
+
361
+    return $page;
362 362
 }
363 363
 
364 364
 // Fonction inseree par le compilateur dans le code compile.
@@ -372,14 +372,14 @@  discard block
 block discarded – undo
372 372
 // 4: langue
373 373
 
374 374
 function inserer_balise_dynamique($contexte_exec, $contexte_compil) {
375
-	arguments_balise_dyn_depuis_modele(null, 'reset');
376
-
377
-	if (!is_array($contexte_exec)) {
378
-		echo $contexte_exec;
379
-	} // message d'erreur etc
380
-	else {
381
-		inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
382
-	}
375
+    arguments_balise_dyn_depuis_modele(null, 'reset');
376
+
377
+    if (!is_array($contexte_exec)) {
378
+        echo $contexte_exec;
379
+    } // message d'erreur etc
380
+    else {
381
+        inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
382
+    }
383 383
 }
384 384
 
385 385
 /**
@@ -392,101 +392,101 @@  discard block
 block discarded – undo
392 392
  * @return string|void
393 393
  */
394 394
 function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = []) {
395
-	if (is_array($texte)) {
396
-		[$fond, $delainc, $contexte_inclus] = $texte;
397
-
398
-		// delais a l'ancienne, c'est pratiquement mort
399
-		$d = $GLOBALS['delais'] ?? null;
400
-		$GLOBALS['delais'] = $delainc;
401
-
402
-		$page = recuperer_fond(
403
-			$fond,
404
-			$contexte_inclus,
405
-			['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
406
-		);
407
-
408
-		$texte = $page['texte'];
409
-
410
-		$GLOBALS['delais'] = $d;
411
-		// Faire remonter les entetes
412
-		if (
413
-			isset($page['entetes'])
414
-			and is_array($page['entetes'])
415
-		) {
416
-			// mais pas toutes
417
-			unset($page['entetes']['X-Spip-Cache']);
418
-			unset($page['entetes']['Content-Type']);
419
-			if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) {
420
-				if (!is_array($GLOBALS['page']['entetes'])) {
421
-					$GLOBALS['page']['entetes'] = [];
422
-				}
423
-				$GLOBALS['page']['entetes'] =
424
-					array_merge($GLOBALS['page']['entetes'], $page['entetes']);
425
-			}
426
-		}
427
-		// _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
428
-		if (
429
-			isset($page['contexte']['_pipelines'])
430
-			and is_array($page['contexte']['_pipelines'])
431
-			and count($page['contexte']['_pipelines'])
432
-		) {
433
-			foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
434
-				$args['contexte'] = $page['contexte'];
435
-				unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
436
-				$texte = pipeline(
437
-					$pipe,
438
-					[
439
-						'data' => $texte,
440
-						'args' => $args
441
-					]
442
-				);
443
-			}
444
-		}
445
-	}
446
-
447
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
448
-		// compatibilite : avant on donnait le numero de ligne ou rien.
449
-		$ligne = intval($contexte_compil[3] ?? $contexte_compil);
450
-		$GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
451
-	}
452
-	if ($echo) {
453
-		echo $texte;
454
-	} else {
455
-		return $texte;
456
-	}
395
+    if (is_array($texte)) {
396
+        [$fond, $delainc, $contexte_inclus] = $texte;
397
+
398
+        // delais a l'ancienne, c'est pratiquement mort
399
+        $d = $GLOBALS['delais'] ?? null;
400
+        $GLOBALS['delais'] = $delainc;
401
+
402
+        $page = recuperer_fond(
403
+            $fond,
404
+            $contexte_inclus,
405
+            ['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
406
+        );
407
+
408
+        $texte = $page['texte'];
409
+
410
+        $GLOBALS['delais'] = $d;
411
+        // Faire remonter les entetes
412
+        if (
413
+            isset($page['entetes'])
414
+            and is_array($page['entetes'])
415
+        ) {
416
+            // mais pas toutes
417
+            unset($page['entetes']['X-Spip-Cache']);
418
+            unset($page['entetes']['Content-Type']);
419
+            if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) {
420
+                if (!is_array($GLOBALS['page']['entetes'])) {
421
+                    $GLOBALS['page']['entetes'] = [];
422
+                }
423
+                $GLOBALS['page']['entetes'] =
424
+                    array_merge($GLOBALS['page']['entetes'], $page['entetes']);
425
+            }
426
+        }
427
+        // _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
428
+        if (
429
+            isset($page['contexte']['_pipelines'])
430
+            and is_array($page['contexte']['_pipelines'])
431
+            and count($page['contexte']['_pipelines'])
432
+        ) {
433
+            foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
434
+                $args['contexte'] = $page['contexte'];
435
+                unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
436
+                $texte = pipeline(
437
+                    $pipe,
438
+                    [
439
+                        'data' => $texte,
440
+                        'args' => $args
441
+                    ]
442
+                );
443
+            }
444
+        }
445
+    }
446
+
447
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
448
+        // compatibilite : avant on donnait le numero de ligne ou rien.
449
+        $ligne = intval($contexte_compil[3] ?? $contexte_compil);
450
+        $GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
451
+    }
452
+    if ($echo) {
453
+        echo $texte;
454
+    } else {
455
+        return $texte;
456
+    }
457 457
 }
458 458
 
459 459
 function message_page_indisponible($page, $contexte) {
460
-	static $deja = false;
461
-	if ($deja) {
462
-		return 'erreur';
463
-	}
464
-	$codes = [
465
-		'404' => '404 Not Found',
466
-		'503' => '503 Service Unavailable',
467
-	];
468
-
469
-	$contexte['status'] = ($page !== false) ? '404' : '503';
470
-	$contexte['code'] = $codes[$contexte['status']];
471
-	$contexte['fond'] = '404'; // gere les 2 erreurs
472
-	if (!isset($contexte['lang'])) {
473
-		include_spip('inc/lang');
474
-		$contexte['lang'] = $GLOBALS['spip_lang'];
475
-	}
476
-
477
-	$deja = true;
478
-	// passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
479
-	// ex restriction d'acces => 401
480
-	$contexte = pipeline('page_indisponible', $contexte);
481
-
482
-	// produire la page d'erreur
483
-	$page = inclure_page($contexte['fond'], $contexte);
484
-	if (!$page) {
485
-		$page = inclure_page('404', $contexte);
486
-	}
487
-	$page['status'] = $contexte['status'];
488
-
489
-	return $page;
460
+    static $deja = false;
461
+    if ($deja) {
462
+        return 'erreur';
463
+    }
464
+    $codes = [
465
+        '404' => '404 Not Found',
466
+        '503' => '503 Service Unavailable',
467
+    ];
468
+
469
+    $contexte['status'] = ($page !== false) ? '404' : '503';
470
+    $contexte['code'] = $codes[$contexte['status']];
471
+    $contexte['fond'] = '404'; // gere les 2 erreurs
472
+    if (!isset($contexte['lang'])) {
473
+        include_spip('inc/lang');
474
+        $contexte['lang'] = $GLOBALS['spip_lang'];
475
+    }
476
+
477
+    $deja = true;
478
+    // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
479
+    // ex restriction d'acces => 401
480
+    $contexte = pipeline('page_indisponible', $contexte);
481
+
482
+    // produire la page d'erreur
483
+    $page = inclure_page($contexte['fond'], $contexte);
484
+    if (!$page) {
485
+        $page = inclure_page('404', $contexte);
486
+    }
487
+    $page['status'] = $contexte['status'];
488
+
489
+    return $page;
490 490
 }
491 491
 
492 492
 /**
@@ -498,44 +498,44 @@  discard block
 block discarded – undo
498 498
  * @return mixed
499 499
  */
500 500
 function arguments_balise_dyn_depuis_modele($arg, $operation = 'set') {
501
-	static $balise_dyn_appellee_par_modele = null;
502
-	switch ($operation) {
503
-		case 'read':
504
-			return $balise_dyn_appellee_par_modele;
505
-		case 'reset':
506
-			$balise_dyn_appellee_par_modele = null;
507
-			return null;
508
-		case 'set':
509
-		default:
510
-			$balise_dyn_appellee_par_modele = $arg;
511
-			return $arg;
512
-	}
501
+    static $balise_dyn_appellee_par_modele = null;
502
+    switch ($operation) {
503
+        case 'read':
504
+            return $balise_dyn_appellee_par_modele;
505
+        case 'reset':
506
+            $balise_dyn_appellee_par_modele = null;
507
+            return null;
508
+        case 'set':
509
+        default:
510
+            $balise_dyn_appellee_par_modele = $arg;
511
+            return $arg;
512
+    }
513 513
 }
514 514
 
515 515
 // temporairement ici : a mettre dans le futur inc/modeles
516 516
 // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array()
517 517
 function creer_contexte_de_modele($args) {
518
-	$contexte = [];
519
-	foreach ($args as $var => $val) {
520
-		if (is_int($var)) { // argument pas formate
521
-			if (in_array($val, ['left', 'right', 'center'])) {
522
-				$var = 'align';
523
-				$contexte[$var] = $val;
524
-			} else {
525
-				$args = explode('=', $val);
526
-				if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
527
-				$contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
528
-				} else // notation abregee
529
-				{
530
-					$contexte[trim($val)] = trim($val);
531
-				}
532
-			}
533
-		} else {
534
-			$contexte[$var] = $val;
535
-		}
536
-	}
537
-
538
-	return $contexte;
518
+    $contexte = [];
519
+    foreach ($args as $var => $val) {
520
+        if (is_int($var)) { // argument pas formate
521
+            if (in_array($val, ['left', 'right', 'center'])) {
522
+                $var = 'align';
523
+                $contexte[$var] = $val;
524
+            } else {
525
+                $args = explode('=', $val);
526
+                if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
527
+                $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
528
+                } else // notation abregee
529
+                {
530
+                    $contexte[trim($val)] = trim($val);
531
+                }
532
+            }
533
+        } else {
534
+            $contexte[$var] = $val;
535
+        }
536
+    }
537
+
538
+    return $contexte;
539 539
 }
540 540
 
541 541
 /**
@@ -550,43 +550,43 @@  discard block
 block discarded – undo
550 550
  * @return string
551 551
  */
552 552
 function styliser_modele($modele, $id, $contexte = null) {
553
-	static $styliseurs = null;
554
-	if (is_null($styliseurs)) {
555
-		$tables_objet = lister_tables_objets_sql();
556
-		foreach ($tables_objet as $table => $desc) {
557
-			if (
558
-				isset($desc['modeles']) and $desc['modeles']
559
-				and isset($desc['modeles_styliser']) and $desc['modeles_styliser']
560
-				and function_exists($desc['modeles_styliser'])
561
-			) {
562
-				$primary = id_table_objet($table);
563
-				foreach ($desc['modeles'] as $m) {
564
-					$styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
565
-				}
566
-			}
567
-		}
568
-	}
569
-
570
-	if (isset($styliseurs[$modele])) {
571
-		$styliseur = $styliseurs[$modele]['callback'];
572
-		$primary = $styliseurs[$modele]['primary'];
573
-		if (is_null($id) and $contexte) {
574
-			if (isset($contexte['id'])) {
575
-				$id = $contexte['id'];
576
-			} elseif (isset($contexte[$primary])) {
577
-				$id = $contexte[$primary];
578
-			}
579
-		}
580
-		if (is_null($id)) {
581
-			$msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
582
-			erreur_squelette($msg);
583
-			// on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
584
-			$id = 0;
585
-		}
586
-		$modele = $styliseur($modele, $id);
587
-	}
588
-
589
-	return $modele;
553
+    static $styliseurs = null;
554
+    if (is_null($styliseurs)) {
555
+        $tables_objet = lister_tables_objets_sql();
556
+        foreach ($tables_objet as $table => $desc) {
557
+            if (
558
+                isset($desc['modeles']) and $desc['modeles']
559
+                and isset($desc['modeles_styliser']) and $desc['modeles_styliser']
560
+                and function_exists($desc['modeles_styliser'])
561
+            ) {
562
+                $primary = id_table_objet($table);
563
+                foreach ($desc['modeles'] as $m) {
564
+                    $styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
565
+                }
566
+            }
567
+        }
568
+    }
569
+
570
+    if (isset($styliseurs[$modele])) {
571
+        $styliseur = $styliseurs[$modele]['callback'];
572
+        $primary = $styliseurs[$modele]['primary'];
573
+        if (is_null($id) and $contexte) {
574
+            if (isset($contexte['id'])) {
575
+                $id = $contexte['id'];
576
+            } elseif (isset($contexte[$primary])) {
577
+                $id = $contexte[$primary];
578
+            }
579
+        }
580
+        if (is_null($id)) {
581
+            $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
582
+            erreur_squelette($msg);
583
+            // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
584
+            $id = 0;
585
+        }
586
+        $modele = $styliseur($modele, $id);
587
+    }
588
+
589
+    return $modele;
590 590
 }
591 591
 
592 592
 /**
@@ -603,102 +603,102 @@  discard block
 block discarded – undo
603 603
  */
604 604
 function inclure_modele($type, $id, $params, $lien, string $connect = '', $env = []) {
605 605
 
606
-	static $compteur;
607
-	if (++$compteur > 10) {
608
-		return '';
609
-	} # ne pas boucler indefiniment
610
-
611
-	$type = strtolower($type);
612
-	$type = styliser_modele($type, $id);
613
-
614
-	$fond = $class = '';
615
-
616
-	$params = array_filter(explode('|', $params));
617
-	if ($params) {
618
-		$soustype = current($params);
619
-		$soustype = strtolower(trim($soustype));
620
-		if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
621
-			$soustype = next($params);
622
-			$soustype = strtolower($soustype);
623
-		}
624
-
625
-		if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
626
-			if (!trouve_modele($fond = ($type . '_' . $soustype))) {
627
-				$fond = '';
628
-				$class = $soustype;
629
-			}
630
-			// enlever le sous type des params
631
-			$params = array_diff($params, [$soustype]);
632
-		}
633
-	}
634
-
635
-	// Si ca marche pas en precisant le sous-type, prendre le type
636
-	if (!$fond and !trouve_modele($fond = $type)) {
637
-		spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
638
-
639
-		return false;
640
-	}
641
-	$fond = 'modeles/' . $fond;
642
-	// Creer le contexte
643
-	$contexte = $env;
644
-	$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
645
-
646
-	// Le numero du modele est mis dans l'environnement
647
-	// d'une part sous l'identifiant "id"
648
-	// et d'autre part sous l'identifiant de la cle primaire
649
-	// par la fonction id_table_objet,
650
-	// (<article1> =>> article =>> id_article =>> id_article=1)
651
-	$_id = id_table_objet($type);
652
-	$contexte['id'] = $contexte[$_id] = $id;
653
-
654
-	if (isset($class)) {
655
-		$contexte['class'] = $class;
656
-	}
657
-
658
-	// Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
659
-	if ($lien) {
660
-		# un eventuel guillemet (") sera reechappe par #ENV
661
-		$contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
662
-		$contexte['lien_class'] = $lien['class'];
663
-		$contexte['lien_mime'] = $lien['mime'];
664
-		$contexte['lien_title'] = $lien['title'];
665
-		$contexte['lien_hreflang'] = $lien['hreflang'];
666
-	}
667
-
668
-	// Traiter les parametres
669
-	// par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
670
-	$arg_list = creer_contexte_de_modele($params);
671
-	$contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
672
-	$contexte = array_merge($contexte, $arg_list);
673
-
674
-	// Appliquer le modele avec le contexte
675
-	$retour = recuperer_fond($fond, $contexte, [], $connect);
676
-
677
-	// Regarder si le modele tient compte des liens (il *doit* alors indiquer
678
-	// spip_lien_ok dans les classes de son conteneur de premier niveau ;
679
-	// sinon, s'il y a un lien, on l'ajoute classiquement
680
-	if (
681
-		strstr(
682
-			' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
683
-			'spip_lien_ok'
684
-		)
685
-	) {
686
-		$retour = inserer_attribut(
687
-			$retour,
688
-			'class',
689
-			trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
690
-		);
691
-	} else {
692
-		if ($lien) {
693
-			$retour = "<a href=\"" . $lien['href'] . "\" class=\"" . $lien['class'] . "\">" . $retour . '</a>';
694
-		}
695
-	}
696
-
697
-	$compteur--;
698
-
699
-	return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax')
700
-		? encoder_contexte_ajax($contexte, '', $retour)
701
-		: $retour;
606
+    static $compteur;
607
+    if (++$compteur > 10) {
608
+        return '';
609
+    } # ne pas boucler indefiniment
610
+
611
+    $type = strtolower($type);
612
+    $type = styliser_modele($type, $id);
613
+
614
+    $fond = $class = '';
615
+
616
+    $params = array_filter(explode('|', $params));
617
+    if ($params) {
618
+        $soustype = current($params);
619
+        $soustype = strtolower(trim($soustype));
620
+        if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
621
+            $soustype = next($params);
622
+            $soustype = strtolower($soustype);
623
+        }
624
+
625
+        if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
626
+            if (!trouve_modele($fond = ($type . '_' . $soustype))) {
627
+                $fond = '';
628
+                $class = $soustype;
629
+            }
630
+            // enlever le sous type des params
631
+            $params = array_diff($params, [$soustype]);
632
+        }
633
+    }
634
+
635
+    // Si ca marche pas en precisant le sous-type, prendre le type
636
+    if (!$fond and !trouve_modele($fond = $type)) {
637
+        spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
638
+
639
+        return false;
640
+    }
641
+    $fond = 'modeles/' . $fond;
642
+    // Creer le contexte
643
+    $contexte = $env;
644
+    $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
645
+
646
+    // Le numero du modele est mis dans l'environnement
647
+    // d'une part sous l'identifiant "id"
648
+    // et d'autre part sous l'identifiant de la cle primaire
649
+    // par la fonction id_table_objet,
650
+    // (<article1> =>> article =>> id_article =>> id_article=1)
651
+    $_id = id_table_objet($type);
652
+    $contexte['id'] = $contexte[$_id] = $id;
653
+
654
+    if (isset($class)) {
655
+        $contexte['class'] = $class;
656
+    }
657
+
658
+    // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
659
+    if ($lien) {
660
+        # un eventuel guillemet (") sera reechappe par #ENV
661
+        $contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
662
+        $contexte['lien_class'] = $lien['class'];
663
+        $contexte['lien_mime'] = $lien['mime'];
664
+        $contexte['lien_title'] = $lien['title'];
665
+        $contexte['lien_hreflang'] = $lien['hreflang'];
666
+    }
667
+
668
+    // Traiter les parametres
669
+    // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
670
+    $arg_list = creer_contexte_de_modele($params);
671
+    $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
672
+    $contexte = array_merge($contexte, $arg_list);
673
+
674
+    // Appliquer le modele avec le contexte
675
+    $retour = recuperer_fond($fond, $contexte, [], $connect);
676
+
677
+    // Regarder si le modele tient compte des liens (il *doit* alors indiquer
678
+    // spip_lien_ok dans les classes de son conteneur de premier niveau ;
679
+    // sinon, s'il y a un lien, on l'ajoute classiquement
680
+    if (
681
+        strstr(
682
+            ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
683
+            'spip_lien_ok'
684
+        )
685
+    ) {
686
+        $retour = inserer_attribut(
687
+            $retour,
688
+            'class',
689
+            trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
690
+        );
691
+    } else {
692
+        if ($lien) {
693
+            $retour = "<a href=\"" . $lien['href'] . "\" class=\"" . $lien['class'] . "\">" . $retour . '</a>';
694
+        }
695
+    }
696
+
697
+    $compteur--;
698
+
699
+    return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax')
700
+        ? encoder_contexte_ajax($contexte, '', $retour)
701
+        : $retour;
702 702
 }
703 703
 
704 704
 // Un inclure_page qui marche aussi pour l'espace prive
@@ -707,105 +707,105 @@  discard block
 block discarded – undo
707 707
 // 	recuperer_fond($fond,$contexte,array('raw'=>true))
708 708
 function evaluer_fond($fond, $contexte = [], string $connect = '') {
709 709
 
710
-	$page = inclure_page($fond, $contexte, $connect);
711
-
712
-	if (!$page) {
713
-		return $page;
714
-	}
715
-	// eval $page et affecte $res
716
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
717
-
718
-	// Lever un drapeau (global) si le fond utilise #SESSION
719
-	// a destination de public/parametrer
720
-	// pour remonter vers les inclusions appelantes
721
-	// il faut bien lever ce drapeau apres avoir evalue le fond
722
-	// pour ne pas faire descendre le flag vers les inclusions appelees
723
-	if (
724
-		isset($page['invalideurs'])
725
-		and isset($page['invalideurs']['session'])
726
-	) {
727
-		$GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
728
-	}
729
-
730
-	return $page;
710
+    $page = inclure_page($fond, $contexte, $connect);
711
+
712
+    if (!$page) {
713
+        return $page;
714
+    }
715
+    // eval $page et affecte $res
716
+    include _ROOT_RESTREINT . 'public/evaluer_page.php';
717
+
718
+    // Lever un drapeau (global) si le fond utilise #SESSION
719
+    // a destination de public/parametrer
720
+    // pour remonter vers les inclusions appelantes
721
+    // il faut bien lever ce drapeau apres avoir evalue le fond
722
+    // pour ne pas faire descendre le flag vers les inclusions appelees
723
+    if (
724
+        isset($page['invalideurs'])
725
+        and isset($page['invalideurs']['session'])
726
+    ) {
727
+        $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
728
+    }
729
+
730
+    return $page;
731 731
 }
732 732
 
733 733
 
734 734
 function page_base_href(&$texte) {
735
-	static $set_html_base = null;
736
-	if (is_null($set_html_base)) {
737
-		if (!defined('_SET_HTML_BASE')) {
738
-			// si la profondeur est superieure a 1
739
-			// est que ce n'est pas une url page ni une url action
740
-			// activer par defaut
741
-		$set_html_base = ((
742
-				$GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
743
-				and _request(_SPIP_PAGE) !== 'login'
744
-				and !_request('action')) ? true : false);
745
-		} else {
746
-			$set_html_base = _SET_HTML_BASE;
747
-		}
748
-	}
749
-
750
-	if (
751
-		$set_html_base
752
-		and isset($GLOBALS['html']) and $GLOBALS['html']
753
-		and $GLOBALS['profondeur_url'] > 0
754
-		and ($poshead = strpos($texte, '</head>')) !== false
755
-	) {
756
-		$head = substr($texte, 0, $poshead);
757
-		$insert = false;
758
-		$href_base = false;
759
-		if (strpos($head, '<base') === false) {
760
-			$insert = true;
761
-		} else {
762
-			// si aucun <base ...> n'a de href il faut en inserer un
763
-			// sinon juste re-ecrire les ancres si besoin
764
-			$insert = true;
765
-			include_spip('inc/filtres');
766
-			$bases = extraire_balises($head, 'base');
767
-			foreach ($bases as $base) {
768
-				if ($href_base = extraire_attribut($base, 'href')) {
769
-					$insert = false;
770
-					break;
771
-				}
772
-			}
773
-		}
774
-
775
-		if ($insert) {
776
-			include_spip('inc/filtres_mini');
777
-			// ajouter un base qui reglera tous les liens relatifs
778
-			$href_base = url_absolue('./');
779
-			$base = "\n<base href=\"$href_base\" />";
780
-			if (($pos = strpos($head, '<head>')) !== false) {
781
-				$head = substr_replace($head, $base, $pos + 6, 0);
782
-			} elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
783
-				$head = str_replace($r[0], $r[0] . $base, $head);
784
-			}
785
-			$texte = $head . substr($texte, $poshead);
786
-		}
787
-		if ($href_base) {
788
-			// gerer les ancres
789
-			$base = $_SERVER['REQUEST_URI'];
790
-			// pas de guillemets ni < dans l'URL qu'on insere dans le HTML
791
-			if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) {
792
-				$base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
793
-			}
794
-			if (strpos($texte, "href='#") !== false) {
795
-				$texte = str_replace("href='#", "href='$base#", $texte);
796
-			}
797
-			if (strpos($texte, 'href="#') !== false) {
798
-				$texte = str_replace('href="#', "href=\"$base#", $texte);
799
-			}
800
-		}
801
-	}
735
+    static $set_html_base = null;
736
+    if (is_null($set_html_base)) {
737
+        if (!defined('_SET_HTML_BASE')) {
738
+            // si la profondeur est superieure a 1
739
+            // est que ce n'est pas une url page ni une url action
740
+            // activer par defaut
741
+        $set_html_base = ((
742
+                $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
743
+                and _request(_SPIP_PAGE) !== 'login'
744
+                and !_request('action')) ? true : false);
745
+        } else {
746
+            $set_html_base = _SET_HTML_BASE;
747
+        }
748
+    }
749
+
750
+    if (
751
+        $set_html_base
752
+        and isset($GLOBALS['html']) and $GLOBALS['html']
753
+        and $GLOBALS['profondeur_url'] > 0
754
+        and ($poshead = strpos($texte, '</head>')) !== false
755
+    ) {
756
+        $head = substr($texte, 0, $poshead);
757
+        $insert = false;
758
+        $href_base = false;
759
+        if (strpos($head, '<base') === false) {
760
+            $insert = true;
761
+        } else {
762
+            // si aucun <base ...> n'a de href il faut en inserer un
763
+            // sinon juste re-ecrire les ancres si besoin
764
+            $insert = true;
765
+            include_spip('inc/filtres');
766
+            $bases = extraire_balises($head, 'base');
767
+            foreach ($bases as $base) {
768
+                if ($href_base = extraire_attribut($base, 'href')) {
769
+                    $insert = false;
770
+                    break;
771
+                }
772
+            }
773
+        }
774
+
775
+        if ($insert) {
776
+            include_spip('inc/filtres_mini');
777
+            // ajouter un base qui reglera tous les liens relatifs
778
+            $href_base = url_absolue('./');
779
+            $base = "\n<base href=\"$href_base\" />";
780
+            if (($pos = strpos($head, '<head>')) !== false) {
781
+                $head = substr_replace($head, $base, $pos + 6, 0);
782
+            } elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
783
+                $head = str_replace($r[0], $r[0] . $base, $head);
784
+            }
785
+            $texte = $head . substr($texte, $poshead);
786
+        }
787
+        if ($href_base) {
788
+            // gerer les ancres
789
+            $base = $_SERVER['REQUEST_URI'];
790
+            // pas de guillemets ni < dans l'URL qu'on insere dans le HTML
791
+            if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) {
792
+                $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
793
+            }
794
+            if (strpos($texte, "href='#") !== false) {
795
+                $texte = str_replace("href='#", "href='$base#", $texte);
796
+            }
797
+            if (strpos($texte, 'href="#') !== false) {
798
+                $texte = str_replace('href="#', "href=\"$base#", $texte);
799
+            }
800
+        }
801
+    }
802 802
 }
803 803
 
804 804
 
805 805
 // Envoyer les entetes, en retenant ceux qui sont a usage interne
806 806
 // et demarrent par X-Spip-...
807 807
 function envoyer_entetes($entetes) {
808
-	foreach ($entetes as $k => $v) { #	if (strncmp($k, 'X-Spip-', 7))
809
-	@header(strlen($v) ? "$k: $v" : $k);
810
-	}
808
+    foreach ($entetes as $k => $v) { #	if (strncmp($k, 'X-Spip-', 7))
809
+    @header(strlen($v) ? "$k: $v" : $k);
810
+    }
811 811
 }
Please login to merge, or discard this patch.
ecrire/inc/rubriques.php 1 patch
Indentation   +621 added lines, -621 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  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
 
@@ -55,65 +55,65 @@  discard block
 block discarded – undo
55 55
  * @return void
56 56
  **/
57 57
 function calculer_rubriques_if($id_rubrique, $modifs, $infos = [], $postdate = false) {
58
-	$statuts_publies = null;
59
-	$neuf = false;
60
-
61
-	// Compat avec l'ancienne signature
62
-	if (is_string($infos)) {
63
-		$infos = ['statut_ancien' => $infos];
64
-	}
65
-	if (!isset($infos['statut_ancien'])) {
66
-		$infos['statut_ancien'] = '';
67
-	}
68
-
69
-	// On recherche quels statuts tester
70
-	if (
71
-		isset($infos['objet'])
72
-		and include_spip('inc/filtres')
73
-		and $declaration_statut = objet_info($infos['objet'], 'statut')
74
-		and is_array($declaration_statut)
75
-	) {
76
-		foreach ($declaration_statut as $champ_statut) {
77
-			if ($champ_statut['champ'] == 'statut') {
78
-				$statuts_publies = array_map('trim', explode(',', $champ_statut['publie']));
79
-				break; // stop on a trouvé le bon champ
80
-			}
81
-		}
82
-	} else {
83
-		$statuts_publies = ['publie'];
84
-	}
85
-
86
-	if (in_array($infos['statut_ancien'], $statuts_publies)) {
87
-		if (
88
-			isset($modifs['statut'])
89
-			or isset($modifs['id_rubrique'])
90
-			or ($postdate and strtotime($postdate) > time())
91
-		) {
92
-			$neuf |= depublier_branche_rubrique_if($id_rubrique);
93
-		}
94
-		// ne publier que si c'est pas un postdate, ou si la date n'est pas dans le futur
95
-		if ($postdate) {
96
-			calculer_prochain_postdate(true);
97
-			$neuf |= (strtotime($postdate) <= time()); // par securite
98
-		} elseif (isset($modifs['id_rubrique'])) {
99
-			$neuf |= publier_branche_rubrique($modifs['id_rubrique']);
100
-		}
101
-	} elseif (isset($modifs['statut']) and in_array($modifs['statut'], $statuts_publies)) {
102
-		if ($postdate) {
103
-			calculer_prochain_postdate(true);
104
-			$neuf |= (strtotime($postdate) <= time()); // par securite
105
-		} else {
106
-			$neuf |= publier_branche_rubrique($id_rubrique);
107
-		}
108
-	}
109
-
110
-	if ($neuf) {
111
-		// Sauver la date de la derniere mise a jour (pour menu_rubriques)
112
-		ecrire_meta('date_calcul_rubriques', date('U'));
113
-	}
114
-
115
-	$langues = calculer_langues_utilisees();
116
-	ecrire_meta('langues_utilisees', $langues);
58
+    $statuts_publies = null;
59
+    $neuf = false;
60
+
61
+    // Compat avec l'ancienne signature
62
+    if (is_string($infos)) {
63
+        $infos = ['statut_ancien' => $infos];
64
+    }
65
+    if (!isset($infos['statut_ancien'])) {
66
+        $infos['statut_ancien'] = '';
67
+    }
68
+
69
+    // On recherche quels statuts tester
70
+    if (
71
+        isset($infos['objet'])
72
+        and include_spip('inc/filtres')
73
+        and $declaration_statut = objet_info($infos['objet'], 'statut')
74
+        and is_array($declaration_statut)
75
+    ) {
76
+        foreach ($declaration_statut as $champ_statut) {
77
+            if ($champ_statut['champ'] == 'statut') {
78
+                $statuts_publies = array_map('trim', explode(',', $champ_statut['publie']));
79
+                break; // stop on a trouvé le bon champ
80
+            }
81
+        }
82
+    } else {
83
+        $statuts_publies = ['publie'];
84
+    }
85
+
86
+    if (in_array($infos['statut_ancien'], $statuts_publies)) {
87
+        if (
88
+            isset($modifs['statut'])
89
+            or isset($modifs['id_rubrique'])
90
+            or ($postdate and strtotime($postdate) > time())
91
+        ) {
92
+            $neuf |= depublier_branche_rubrique_if($id_rubrique);
93
+        }
94
+        // ne publier que si c'est pas un postdate, ou si la date n'est pas dans le futur
95
+        if ($postdate) {
96
+            calculer_prochain_postdate(true);
97
+            $neuf |= (strtotime($postdate) <= time()); // par securite
98
+        } elseif (isset($modifs['id_rubrique'])) {
99
+            $neuf |= publier_branche_rubrique($modifs['id_rubrique']);
100
+        }
101
+    } elseif (isset($modifs['statut']) and in_array($modifs['statut'], $statuts_publies)) {
102
+        if ($postdate) {
103
+            calculer_prochain_postdate(true);
104
+            $neuf |= (strtotime($postdate) <= time()); // par securite
105
+        } else {
106
+            $neuf |= publier_branche_rubrique($id_rubrique);
107
+        }
108
+    }
109
+
110
+    if ($neuf) {
111
+        // Sauver la date de la derniere mise a jour (pour menu_rubriques)
112
+        ecrire_meta('date_calcul_rubriques', date('U'));
113
+    }
114
+
115
+    $langues = calculer_langues_utilisees();
116
+    ecrire_meta('langues_utilisees', $langues);
117 117
 }
118 118
 
119 119
 
@@ -131,22 +131,22 @@  discard block
 block discarded – undo
131 131
  *     true si le statut change effectivement
132 132
  */
133 133
 function publier_branche_rubrique($id_rubrique) {
134
-	$id_pred = $id_rubrique;
135
-	while (true) {
136
-		sql_updateq(
137
-			'spip_rubriques',
138
-			['statut' => 'publie', 'date' => date('Y-m-d H:i:s')],
139
-			'id_rubrique=' . intval($id_rubrique)
140
-		);
141
-		$id_parent = sql_getfetsel('id_parent', 'spip_rubriques AS R', 'R.id_rubrique=' . intval($id_rubrique));
142
-		if (!$id_parent) {
143
-			break;
144
-		}
145
-		$id_rubrique = $id_parent;
146
-	}
134
+    $id_pred = $id_rubrique;
135
+    while (true) {
136
+        sql_updateq(
137
+            'spip_rubriques',
138
+            ['statut' => 'publie', 'date' => date('Y-m-d H:i:s')],
139
+            'id_rubrique=' . intval($id_rubrique)
140
+        );
141
+        $id_parent = sql_getfetsel('id_parent', 'spip_rubriques AS R', 'R.id_rubrique=' . intval($id_rubrique));
142
+        if (!$id_parent) {
143
+            break;
144
+        }
145
+        $id_rubrique = $id_parent;
146
+    }
147 147
 
148 148
 #	spip_log(" publier_branche_rubrique($id_rubrique $id_pred");
149
-	return $id_pred != $id_rubrique;
149
+    return $id_pred != $id_rubrique;
150 150
 }
151 151
 
152 152
 /**
@@ -164,20 +164,20 @@  discard block
 block discarded – undo
164 164
  *     true si le statut change effectivement
165 165
  */
166 166
 function depublier_branche_rubrique_if($id_rubrique) {
167
-	$date = date('Y-m-d H:i:s'); // figer la date
168
-
169
-	#	spip_log("depublier_branche_rubrique($id_rubrique ?");
170
-	$id_pred = $id_rubrique;
171
-	while ($id_pred) {
172
-		if (!depublier_rubrique_if($id_pred, $date)) {
173
-			return $id_pred != $id_rubrique;
174
-		}
175
-		// passer au parent si on a depublie
176
-		$r = sql_fetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id_pred));
177
-		$id_pred = $r['id_parent'];
178
-	}
179
-
180
-	return $id_pred != $id_rubrique;
167
+    $date = date('Y-m-d H:i:s'); // figer la date
168
+
169
+    #	spip_log("depublier_branche_rubrique($id_rubrique ?");
170
+    $id_pred = $id_rubrique;
171
+    while ($id_pred) {
172
+        if (!depublier_rubrique_if($id_pred, $date)) {
173
+            return $id_pred != $id_rubrique;
174
+        }
175
+        // passer au parent si on a depublie
176
+        $r = sql_fetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id_pred));
177
+        $id_pred = $r['id_parent'];
178
+    }
179
+
180
+    return $id_pred != $id_rubrique;
181 181
 }
182 182
 
183 183
 /**
@@ -194,61 +194,61 @@  discard block
 block discarded – undo
194 194
  *    true si la rubrique a été dépubliée
195 195
  */
196 196
 function depublier_rubrique_if($id_rubrique, $date = null) {
197
-	if (is_null($date)) {
198
-		$date = date('Y-m-d H:i:s');
199
-	}
200
-	$postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
201
-		' AND date <= ' . sql_quote($date) : '';
202
-
203
-	if (!$id_rubrique = intval($id_rubrique)) {
204
-		return false;
205
-	}
206
-
207
-	// verifier qu'elle existe et est bien publiee
208
-	$r = sql_fetsel('id_rubrique,statut', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
209
-	if (!$r or $r['statut'] !== 'publie') {
210
-		return false;
211
-	}
212
-
213
-	// On met le nombre de chaque type d'enfants dans un tableau
214
-	// Le type de l'objet est au pluriel
215
-	$compte = [
216
-		'articles' => sql_countsel(
217
-			'spip_articles',
218
-			'id_rubrique=' . intval($id_rubrique) . " AND statut='publie'$postdates"
219
-		),
220
-		'rubriques' => sql_countsel('spip_rubriques', 'id_parent=' . intval($id_rubrique) . " AND statut='publie'"),
221
-		'documents' => sql_countsel(
222
-			'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document',
223
-			'L.id_objet=' . intval($id_rubrique) . " AND L.objet='rubrique' and D.mode NOT IN('logoon', 'logooff') "
224
-		)
225
-	];
226
-
227
-	// On passe le tableau des comptes dans un pipeline pour que les plugins puissent ajouter (ou retirer) des enfants
228
-	$compte = pipeline(
229
-		'objet_compte_enfants',
230
-		[
231
-			'args' => [
232
-				'objet' => 'rubrique',
233
-				'id_objet' => $id_rubrique,
234
-				'statut' => 'publie',
235
-				'date' => $date
236
-			],
237
-			'data' => $compte
238
-		]
239
-	);
240
-
241
-	// S'il y a au moins un enfant de n'importe quoi, on ne dépublie pas
242
-	foreach ($compte as $objet => $n) {
243
-		if ($n) {
244
-			return false;
245
-		}
246
-	}
247
-
248
-	sql_updateq('spip_rubriques', ['statut' => 'prepa'], 'id_rubrique=' . intval($id_rubrique));
197
+    if (is_null($date)) {
198
+        $date = date('Y-m-d H:i:s');
199
+    }
200
+    $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
201
+        ' AND date <= ' . sql_quote($date) : '';
202
+
203
+    if (!$id_rubrique = intval($id_rubrique)) {
204
+        return false;
205
+    }
206
+
207
+    // verifier qu'elle existe et est bien publiee
208
+    $r = sql_fetsel('id_rubrique,statut', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
209
+    if (!$r or $r['statut'] !== 'publie') {
210
+        return false;
211
+    }
212
+
213
+    // On met le nombre de chaque type d'enfants dans un tableau
214
+    // Le type de l'objet est au pluriel
215
+    $compte = [
216
+        'articles' => sql_countsel(
217
+            'spip_articles',
218
+            'id_rubrique=' . intval($id_rubrique) . " AND statut='publie'$postdates"
219
+        ),
220
+        'rubriques' => sql_countsel('spip_rubriques', 'id_parent=' . intval($id_rubrique) . " AND statut='publie'"),
221
+        'documents' => sql_countsel(
222
+            'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document',
223
+            'L.id_objet=' . intval($id_rubrique) . " AND L.objet='rubrique' and D.mode NOT IN('logoon', 'logooff') "
224
+        )
225
+    ];
226
+
227
+    // On passe le tableau des comptes dans un pipeline pour que les plugins puissent ajouter (ou retirer) des enfants
228
+    $compte = pipeline(
229
+        'objet_compte_enfants',
230
+        [
231
+            'args' => [
232
+                'objet' => 'rubrique',
233
+                'id_objet' => $id_rubrique,
234
+                'statut' => 'publie',
235
+                'date' => $date
236
+            ],
237
+            'data' => $compte
238
+        ]
239
+    );
240
+
241
+    // S'il y a au moins un enfant de n'importe quoi, on ne dépublie pas
242
+    foreach ($compte as $objet => $n) {
243
+        if ($n) {
244
+            return false;
245
+        }
246
+    }
247
+
248
+    sql_updateq('spip_rubriques', ['statut' => 'prepa'], 'id_rubrique=' . intval($id_rubrique));
249 249
 
250 250
 #		spip_log("depublier_rubrique $id_pred");
251
-	return true;
251
+    return true;
252 252
 }
253 253
 
254 254
 
@@ -271,18 +271,18 @@  discard block
 block discarded – undo
271 271
  **/
272 272
 function calculer_rubriques() {
273 273
 
274
-	calculer_rubriques_publiees();
274
+    calculer_rubriques_publiees();
275 275
 
276
-	// Apres chaque (de)publication
277
-	// recalculer les langues utilisees sur le site
278
-	$langues = calculer_langues_utilisees();
279
-	ecrire_meta('langues_utilisees', $langues);
276
+    // Apres chaque (de)publication
277
+    // recalculer les langues utilisees sur le site
278
+    $langues = calculer_langues_utilisees();
279
+    ecrire_meta('langues_utilisees', $langues);
280 280
 
281
-	// Sauver la date de la derniere mise a jour (pour menu_rubriques)
282
-	ecrire_meta('date_calcul_rubriques', date('U'));
281
+    // Sauver la date de la derniere mise a jour (pour menu_rubriques)
282
+    ecrire_meta('date_calcul_rubriques', date('U'));
283 283
 
284
-	// on calcule la date du prochain article post-date
285
-	calculer_prochain_postdate();
284
+    // on calcule la date du prochain article post-date
285
+    calculer_prochain_postdate();
286 286
 }
287 287
 
288 288
 
@@ -299,61 +299,61 @@  discard block
 block discarded – undo
299 299
  **/
300 300
 function calculer_rubriques_publiees() {
301 301
 
302
-	// Mettre les compteurs a zero
303
-	sql_updateq('spip_rubriques', ['date_tmp' => '0000-00-00 00:00:00', 'statut_tmp' => 'prepa']);
304
-
305
-	//
306
-	// Publier et dater les rubriques qui ont un article publie
307
-	//
308
-
309
-	// Afficher les articles post-dates ?
310
-	$postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
311
-		'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : '';
312
-
313
-	$r = sql_select(
314
-		'R.id_rubrique AS id, max(A.date) AS date_h',
315
-		'spip_rubriques AS R JOIN spip_articles AS A ON R.id_rubrique = A.id_rubrique',
316
-		"A.date>R.date_tmp AND A.statut='publie' $postdates ",
317
-		'R.id_rubrique'
318
-	);
319
-	while ($row = sql_fetch($r)) {
320
-		sql_updateq(
321
-			'spip_rubriques',
322
-			['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']],
323
-			'id_rubrique=' . intval($row['id'])
324
-		);
325
-	}
326
-
327
-	// point d'entree pour permettre a des plugins de gerer le statut
328
-	// autrement (par ex: toute rubrique est publiee des sa creation)
329
-	// Ce pipeline fait ce qu'il veut, mais s'il touche aux statuts/dates
330
-	// c'est statut_tmp/date_tmp qu'il doit modifier
331
-	// [C'est un trigger... a renommer en trig_calculer_rubriques ?]
332
-	pipeline('calculer_rubriques', null);
333
-
334
-
335
-	// Les rubriques qui ont une rubrique fille plus recente
336
-	// on tourne tant que les donnees remontent vers la racine.
337
-	do {
338
-		$continuer = false;
339
-		$r = sql_select(
340
-			'R.id_rubrique AS id, max(SR.date_tmp) AS date_h',
341
-			'spip_rubriques AS R JOIN spip_rubriques AS SR ON R.id_rubrique = SR.id_parent',
342
-			"(SR.date_tmp>R.date_tmp OR R.statut_tmp<>'publie') AND SR.statut_tmp='publie' ",
343
-			'R.id_rubrique'
344
-		);
345
-		while ($row = sql_fetch($r)) {
346
-			sql_updateq(
347
-				'spip_rubriques',
348
-				['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']],
349
-				'id_rubrique=' . intval($row['id'])
350
-			);
351
-			$continuer = true;
352
-		}
353
-	} while ($continuer);
354
-
355
-	// Enregistrement des modifs
356
-	sql_update('spip_rubriques', ['date' => 'date_tmp', 'statut' => 'statut_tmp']);
302
+    // Mettre les compteurs a zero
303
+    sql_updateq('spip_rubriques', ['date_tmp' => '0000-00-00 00:00:00', 'statut_tmp' => 'prepa']);
304
+
305
+    //
306
+    // Publier et dater les rubriques qui ont un article publie
307
+    //
308
+
309
+    // Afficher les articles post-dates ?
310
+    $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
311
+        'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : '';
312
+
313
+    $r = sql_select(
314
+        'R.id_rubrique AS id, max(A.date) AS date_h',
315
+        'spip_rubriques AS R JOIN spip_articles AS A ON R.id_rubrique = A.id_rubrique',
316
+        "A.date>R.date_tmp AND A.statut='publie' $postdates ",
317
+        'R.id_rubrique'
318
+    );
319
+    while ($row = sql_fetch($r)) {
320
+        sql_updateq(
321
+            'spip_rubriques',
322
+            ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']],
323
+            'id_rubrique=' . intval($row['id'])
324
+        );
325
+    }
326
+
327
+    // point d'entree pour permettre a des plugins de gerer le statut
328
+    // autrement (par ex: toute rubrique est publiee des sa creation)
329
+    // Ce pipeline fait ce qu'il veut, mais s'il touche aux statuts/dates
330
+    // c'est statut_tmp/date_tmp qu'il doit modifier
331
+    // [C'est un trigger... a renommer en trig_calculer_rubriques ?]
332
+    pipeline('calculer_rubriques', null);
333
+
334
+
335
+    // Les rubriques qui ont une rubrique fille plus recente
336
+    // on tourne tant que les donnees remontent vers la racine.
337
+    do {
338
+        $continuer = false;
339
+        $r = sql_select(
340
+            'R.id_rubrique AS id, max(SR.date_tmp) AS date_h',
341
+            'spip_rubriques AS R JOIN spip_rubriques AS SR ON R.id_rubrique = SR.id_parent',
342
+            "(SR.date_tmp>R.date_tmp OR R.statut_tmp<>'publie') AND SR.statut_tmp='publie' ",
343
+            'R.id_rubrique'
344
+        );
345
+        while ($row = sql_fetch($r)) {
346
+            sql_updateq(
347
+                'spip_rubriques',
348
+                ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']],
349
+                'id_rubrique=' . intval($row['id'])
350
+            );
351
+            $continuer = true;
352
+        }
353
+    } while ($continuer);
354
+
355
+    // Enregistrement des modifs
356
+    sql_update('spip_rubriques', ['date' => 'date_tmp', 'statut' => 'statut_tmp']);
357 357
 }
358 358
 
359 359
 /**
@@ -368,123 +368,123 @@  discard block
 block discarded – undo
368 368
  * @return void
369 369
  **/
370 370
 function propager_les_secteurs() {
371
-	// Profondeur 0
372
-	// Toutes les rubriques racines sont de profondeur 0
373
-	// et fixer les id_secteur des rubriques racines
374
-	sql_update('spip_rubriques', ['id_secteur' => 'id_rubrique', 'profondeur' => 0], 'id_parent=0');
375
-	// Toute rubrique non racine est de profondeur >0
376
-	sql_updateq('spip_rubriques', ['profondeur' => 1], 'id_parent<>0 AND profondeur=0');
377
-
378
-	// securite : pas plus d'iteration que de rubriques dans la base
379
-	$maxiter = sql_countsel('spip_rubriques');
380
-
381
-	// reparer les rubriques qui n'ont pas l'id_secteur de leur parent
382
-	// on fait profondeur par profondeur
383
-
384
-	$prof = 0;
385
-	do {
386
-		$continuer = false;
387
-
388
-		// Par recursivite : si toutes les rubriques de profondeur $prof sont bonnes
389
-		// on fixe le profondeur $prof+1
390
-
391
-		// Toutes les rubriques dont le parent est de profondeur $prof ont une profondeur $prof+1
392
-		// on teste A.profondeur > $prof+1 car :
393
-		// - toutes les rubriques de profondeur 0 à $prof sont bonnes
394
-		// - si A.profondeur = $prof+1 c'est bon
395
-		// - cela nous protege de la boucle infinie en cas de reference circulaire dans les rubriques
396
-		$maxiter2 = $maxiter;
397
-		while (
398
-			$maxiter2--
399
-			and $rows = sql_allfetsel(
400
-				'A.id_rubrique AS id, R.id_secteur AS id_secteur, R.profondeur+1 as profondeur',
401
-				'spip_rubriques AS A JOIN spip_rubriques AS R ON A.id_parent = R.id_rubrique',
402
-				'R.profondeur=' . intval($prof) . ' AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)',
403
-				'',
404
-				'R.id_secteur',
405
-				'0,100'
406
-			)
407
-		) {
408
-			$id_secteur = null;
409
-			$ids = [];
410
-			while ($row = array_shift($rows)) {
411
-				if ($row['id_secteur'] !== $id_secteur) {
412
-					if (count($ids)) {
413
-						sql_updateq(
414
-							'spip_rubriques',
415
-							['id_secteur' => $id_secteur, 'profondeur' => $prof + 1],
416
-							sql_in('id_rubrique', $ids)
417
-						);
418
-					}
419
-					$id_secteur = $row['id_secteur'];
420
-					$ids = [];
421
-				}
422
-				$ids[] = $row['id'];
423
-			}
424
-			if (count($ids)) {
425
-				sql_updateq(
426
-					'spip_rubriques',
427
-					['id_secteur' => $id_secteur, 'profondeur' => $prof + 1],
428
-					sql_in('id_rubrique', $ids)
429
-				);
430
-			}
431
-		}
432
-
433
-
434
-		// Toutes les rubriques de profondeur $prof+1 qui n'ont pas un parent de profondeur $prof sont decalees
435
-		$maxiter2 = $maxiter;
436
-		while (
437
-			$maxiter2--
438
-			and $rows = sql_allfetsel(
439
-				'id_rubrique as id',
440
-				'spip_rubriques',
441
-				'profondeur=' . intval($prof + 1) . ' AND id_parent NOT IN (' . sql_get_select(
442
-					'zzz.id_rubrique',
443
-					'spip_rubriques AS zzz',
444
-					'zzz.profondeur=' . intval($prof)
445
-				) . ')',
446
-				'',
447
-				'',
448
-				'0,100'
449
-			)
450
-		) {
451
-			$rows = array_column($rows, 'id');
452
-			sql_updateq('spip_rubriques', ['profondeur' => $prof + 2], sql_in('id_rubrique', $rows));
453
-		}
454
-
455
-		// ici on a fini de valider $prof+1, toutes les rubriques de prondeur 0 a $prof+1 sont OK
456
-		// si pas de rubrique a profondeur $prof+1 pas la peine de continuer
457
-		// si il reste des rubriques non vues, c'est une branche morte ou reference circulaire (base foireuse)
458
-		// on arrete les frais
459
-		if (sql_countsel('spip_rubriques', 'profondeur=' . intval($prof + 1))) {
460
-			$prof++;
461
-			$continuer = true;
462
-		}
463
-	} while ($continuer and $maxiter--);
464
-
465
-	// loger si la table des rubriques semble foireuse
466
-	// et mettre un id_secteur=0 sur ces rubriques pour eviter toute selection par les boucles
467
-	if (sql_countsel('spip_rubriques', 'profondeur>' . intval($prof + 1))) {
468
-		spip_log(
469
-			'Les rubriques de profondeur>' . ($prof + 1) . ' semblent suspectes (branches morte ou reference circulaire dans les parents)',
470
-			_LOG_CRITIQUE
471
-		);
472
-		sql_update('spip_rubriques', ['id_secteur' => 0], 'profondeur>' . intval($prof + 1));
473
-	}
474
-
475
-	// reparer les articles
476
-	$r = sql_select(
477
-		'A.id_article AS id, R.id_secteur AS secteur',
478
-		'spip_articles AS A, spip_rubriques AS R',
479
-		'A.id_rubrique = R.id_rubrique AND A.id_secteur <> R.id_secteur'
480
-	);
481
-
482
-	while ($row = sql_fetch($r)) {
483
-		sql_update('spip_articles', ['id_secteur' => $row['secteur']], 'id_article=' . intval($row['id']));
484
-	}
485
-
486
-	// avertir les plugins qui peuvent faire leur mises a jour egalement
487
-	pipeline('trig_propager_les_secteurs', '');
371
+    // Profondeur 0
372
+    // Toutes les rubriques racines sont de profondeur 0
373
+    // et fixer les id_secteur des rubriques racines
374
+    sql_update('spip_rubriques', ['id_secteur' => 'id_rubrique', 'profondeur' => 0], 'id_parent=0');
375
+    // Toute rubrique non racine est de profondeur >0
376
+    sql_updateq('spip_rubriques', ['profondeur' => 1], 'id_parent<>0 AND profondeur=0');
377
+
378
+    // securite : pas plus d'iteration que de rubriques dans la base
379
+    $maxiter = sql_countsel('spip_rubriques');
380
+
381
+    // reparer les rubriques qui n'ont pas l'id_secteur de leur parent
382
+    // on fait profondeur par profondeur
383
+
384
+    $prof = 0;
385
+    do {
386
+        $continuer = false;
387
+
388
+        // Par recursivite : si toutes les rubriques de profondeur $prof sont bonnes
389
+        // on fixe le profondeur $prof+1
390
+
391
+        // Toutes les rubriques dont le parent est de profondeur $prof ont une profondeur $prof+1
392
+        // on teste A.profondeur > $prof+1 car :
393
+        // - toutes les rubriques de profondeur 0 à $prof sont bonnes
394
+        // - si A.profondeur = $prof+1 c'est bon
395
+        // - cela nous protege de la boucle infinie en cas de reference circulaire dans les rubriques
396
+        $maxiter2 = $maxiter;
397
+        while (
398
+            $maxiter2--
399
+            and $rows = sql_allfetsel(
400
+                'A.id_rubrique AS id, R.id_secteur AS id_secteur, R.profondeur+1 as profondeur',
401
+                'spip_rubriques AS A JOIN spip_rubriques AS R ON A.id_parent = R.id_rubrique',
402
+                'R.profondeur=' . intval($prof) . ' AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)',
403
+                '',
404
+                'R.id_secteur',
405
+                '0,100'
406
+            )
407
+        ) {
408
+            $id_secteur = null;
409
+            $ids = [];
410
+            while ($row = array_shift($rows)) {
411
+                if ($row['id_secteur'] !== $id_secteur) {
412
+                    if (count($ids)) {
413
+                        sql_updateq(
414
+                            'spip_rubriques',
415
+                            ['id_secteur' => $id_secteur, 'profondeur' => $prof + 1],
416
+                            sql_in('id_rubrique', $ids)
417
+                        );
418
+                    }
419
+                    $id_secteur = $row['id_secteur'];
420
+                    $ids = [];
421
+                }
422
+                $ids[] = $row['id'];
423
+            }
424
+            if (count($ids)) {
425
+                sql_updateq(
426
+                    'spip_rubriques',
427
+                    ['id_secteur' => $id_secteur, 'profondeur' => $prof + 1],
428
+                    sql_in('id_rubrique', $ids)
429
+                );
430
+            }
431
+        }
432
+
433
+
434
+        // Toutes les rubriques de profondeur $prof+1 qui n'ont pas un parent de profondeur $prof sont decalees
435
+        $maxiter2 = $maxiter;
436
+        while (
437
+            $maxiter2--
438
+            and $rows = sql_allfetsel(
439
+                'id_rubrique as id',
440
+                'spip_rubriques',
441
+                'profondeur=' . intval($prof + 1) . ' AND id_parent NOT IN (' . sql_get_select(
442
+                    'zzz.id_rubrique',
443
+                    'spip_rubriques AS zzz',
444
+                    'zzz.profondeur=' . intval($prof)
445
+                ) . ')',
446
+                '',
447
+                '',
448
+                '0,100'
449
+            )
450
+        ) {
451
+            $rows = array_column($rows, 'id');
452
+            sql_updateq('spip_rubriques', ['profondeur' => $prof + 2], sql_in('id_rubrique', $rows));
453
+        }
454
+
455
+        // ici on a fini de valider $prof+1, toutes les rubriques de prondeur 0 a $prof+1 sont OK
456
+        // si pas de rubrique a profondeur $prof+1 pas la peine de continuer
457
+        // si il reste des rubriques non vues, c'est une branche morte ou reference circulaire (base foireuse)
458
+        // on arrete les frais
459
+        if (sql_countsel('spip_rubriques', 'profondeur=' . intval($prof + 1))) {
460
+            $prof++;
461
+            $continuer = true;
462
+        }
463
+    } while ($continuer and $maxiter--);
464
+
465
+    // loger si la table des rubriques semble foireuse
466
+    // et mettre un id_secteur=0 sur ces rubriques pour eviter toute selection par les boucles
467
+    if (sql_countsel('spip_rubriques', 'profondeur>' . intval($prof + 1))) {
468
+        spip_log(
469
+            'Les rubriques de profondeur>' . ($prof + 1) . ' semblent suspectes (branches morte ou reference circulaire dans les parents)',
470
+            _LOG_CRITIQUE
471
+        );
472
+        sql_update('spip_rubriques', ['id_secteur' => 0], 'profondeur>' . intval($prof + 1));
473
+    }
474
+
475
+    // reparer les articles
476
+    $r = sql_select(
477
+        'A.id_article AS id, R.id_secteur AS secteur',
478
+        'spip_articles AS A, spip_rubriques AS R',
479
+        'A.id_rubrique = R.id_rubrique AND A.id_secteur <> R.id_secteur'
480
+    );
481
+
482
+    while ($row = sql_fetch($r)) {
483
+        sql_update('spip_articles', ['id_secteur' => $row['secteur']], 'id_article=' . intval($row['id']));
484
+    }
485
+
486
+    // avertir les plugins qui peuvent faire leur mises a jour egalement
487
+    pipeline('trig_propager_les_secteurs', '');
488 488
 }
489 489
 
490 490
 
@@ -499,23 +499,23 @@  discard block
 block discarded – undo
499 499
  *     true si un changement a eu lieu
500 500
  **/
501 501
 function calculer_langues_rubriques_etape() {
502
-	$s = sql_select(
503
-		'A.id_rubrique AS id_rubrique, R.lang AS lang',
504
-		'spip_rubriques AS A, spip_rubriques AS R',
505
-		"A.id_parent = R.id_rubrique AND A.langue_choisie != 'oui' AND R.lang<>'' AND R.lang<>A.lang"
506
-	);
507
-
508
-	$t = false;
509
-	while ($row = sql_fetch($s)) {
510
-		$id_rubrique = $row['id_rubrique'];
511
-		$t = sql_updateq(
512
-			'spip_rubriques',
513
-			['lang' => $row['lang'], 'langue_choisie' => 'non'],
514
-			'id_rubrique=' . intval($id_rubrique)
515
-		);
516
-	}
517
-
518
-	return $t;
502
+    $s = sql_select(
503
+        'A.id_rubrique AS id_rubrique, R.lang AS lang',
504
+        'spip_rubriques AS A, spip_rubriques AS R',
505
+        "A.id_parent = R.id_rubrique AND A.langue_choisie != 'oui' AND R.lang<>'' AND R.lang<>A.lang"
506
+    );
507
+
508
+    $t = false;
509
+    while ($row = sql_fetch($s)) {
510
+        $id_rubrique = $row['id_rubrique'];
511
+        $t = sql_updateq(
512
+            'spip_rubriques',
513
+            ['lang' => $row['lang'], 'langue_choisie' => 'non'],
514
+            'id_rubrique=' . intval($id_rubrique)
515
+        );
516
+    }
517
+
518
+    return $t;
519 519
 }
520 520
 
521 521
 /**
@@ -535,38 +535,38 @@  discard block
 block discarded – undo
535 535
  **/
536 536
 function calculer_langues_rubriques() {
537 537
 
538
-	// rubriques (recursivite)
539
-	sql_updateq(
540
-		'spip_rubriques',
541
-		['lang' => $GLOBALS['meta']['langue_site'], 'langue_choisie' => 'non'],
542
-		"id_parent=0 AND langue_choisie != 'oui'"
543
-	);
544
-	while (calculer_langues_rubriques_etape()) {
545
-		;
546
-	}
547
-
548
-	// articles
549
-	$s = sql_select(
550
-		'A.id_article AS id_article, R.lang AS lang',
551
-		'spip_articles AS A, spip_rubriques AS R',
552
-		"A.id_rubrique = R.id_rubrique AND A.langue_choisie != 'oui' AND (length(A.lang)=0 OR length(R.lang)>0) AND R.lang<>A.lang"
553
-	);
554
-	while ($row = sql_fetch($s)) {
555
-		$id_article = $row['id_article'];
556
-		sql_updateq(
557
-			'spip_articles',
558
-			['lang' => $row['lang'], 'langue_choisie' => 'non'],
559
-			'id_article=' . intval($id_article)
560
-		);
561
-	}
562
-
563
-	if ($GLOBALS['meta']['multi_rubriques'] == 'oui') {
564
-		$langues = calculer_langues_utilisees();
565
-		ecrire_meta('langues_utilisees', $langues);
566
-	}
567
-
568
-	// avertir les plugins qui peuvent faire leur mises a jour egalement
569
-	pipeline('trig_calculer_langues_rubriques', '');
538
+    // rubriques (recursivite)
539
+    sql_updateq(
540
+        'spip_rubriques',
541
+        ['lang' => $GLOBALS['meta']['langue_site'], 'langue_choisie' => 'non'],
542
+        "id_parent=0 AND langue_choisie != 'oui'"
543
+    );
544
+    while (calculer_langues_rubriques_etape()) {
545
+        ;
546
+    }
547
+
548
+    // articles
549
+    $s = sql_select(
550
+        'A.id_article AS id_article, R.lang AS lang',
551
+        'spip_articles AS A, spip_rubriques AS R',
552
+        "A.id_rubrique = R.id_rubrique AND A.langue_choisie != 'oui' AND (length(A.lang)=0 OR length(R.lang)>0) AND R.lang<>A.lang"
553
+    );
554
+    while ($row = sql_fetch($s)) {
555
+        $id_article = $row['id_article'];
556
+        sql_updateq(
557
+            'spip_articles',
558
+            ['lang' => $row['lang'], 'langue_choisie' => 'non'],
559
+            'id_article=' . intval($id_article)
560
+        );
561
+    }
562
+
563
+    if ($GLOBALS['meta']['multi_rubriques'] == 'oui') {
564
+        $langues = calculer_langues_utilisees();
565
+        ecrire_meta('langues_utilisees', $langues);
566
+    }
567
+
568
+    // avertir les plugins qui peuvent faire leur mises a jour egalement
569
+    pipeline('trig_calculer_langues_rubriques', '');
570 570
 }
571 571
 
572 572
 
@@ -583,80 +583,80 @@  discard block
 block discarded – undo
583 583
  *    Liste des langues utilisées séparées par des virgules
584 584
  **/
585 585
 function calculer_langues_utilisees($serveur = '') {
586
-	include_spip('public/interfaces');
587
-	include_spip('public/compiler');
588
-	include_spip('public/composer');
589
-	include_spip('public/phraser_html');
590
-	$langues = [];
591
-
592
-	$langues[$GLOBALS['meta']['langue_site']] = 1;
593
-
594
-	include_spip('base/objets');
595
-	$tables = lister_tables_objets_sql();
596
-	$trouver_table = charger_fonction('trouver_table', 'base');
597
-
598
-	foreach (array_keys($tables) as $t) {
599
-		$desc = $trouver_table($t, $serveur);
600
-		// c'est une table avec des langues
601
-		if (
602
-			$desc['exist']
603
-			and isset($desc['field']['lang'])
604
-			and isset($desc['field']['langue_choisie'])
605
-		) {
606
-			$boucle = new Boucle();
607
-			$boucle->show = $desc;
608
-			$boucle->nom = 'calculer_langues_utilisees';
609
-			$boucle->id_boucle = $desc['table_objet'];
610
-			$boucle->id_table = $desc['table_objet'];
611
-			$boucle->primary = $desc['key']['PRIMARY KEY'] ?? '';
612
-			$boucle->sql_serveur = $serveur;
613
-			$boucle->select[] = 'DISTINCT lang';
614
-			$boucle->from[$desc['table_objet']] = $t;
615
-			$boucle->separateur[] = ',';
616
-			$boucle->return = '$Pile[$SP][\'lang\']';
617
-			$boucle->iterateur = 'sql';
618
-
619
-			$boucle->descr['nom'] = 'calculer_langues_utilisees'; // eviter notice php
620
-			$boucle->descr['sourcefile'] = 'internal';
621
-			$boucle->descr['gram'] = 'html';
622
-
623
-			$boucle = pipeline('pre_boucle', $boucle);
624
-
625
-			if (
626
-				isset($desc['statut'])
627
-				and $desc['statut']
628
-			) {
629
-				$boucles = [
630
-					'calculer_langues_utilisees' => $boucle,
631
-				];
632
-				// generer un nom de fonction "anonyme" unique
633
-				do {
634
-					$functionname = 'f_calculer_langues_utilisees_' . $boucle->id_table . '_' . time() . '_' . random_int(0, mt_getrandmax());
635
-				} while (function_exists($functionname));
636
-				$code = calculer_boucle('calculer_langues_utilisees', $boucles);
637
-				$code = '$SP=0; $command=array();$command["connect"] = $connect = "' . $serveur . '"; $Pile=array(0=>array());' . "\n" . $code;
638
-				$code = 'function ' . $functionname . '(){' . $code . '};$res = ' . $functionname . '();';
639
-				$res = '';
640
-				eval($code);
641
-				$res = explode(',', $res);
642
-				foreach ($res as $lang) {
643
-					$langues[$lang] = 1;
644
-				}
645
-			} else {
646
-				$res = sql_select(implode(',', $boucle->select), $boucle->from);
647
-				while ($row = sql_fetch($res)) {
648
-					$langues[$row['lang']] = 1;
649
-				}
650
-			}
651
-		}
652
-	}
653
-
654
-	$langues = array_filter(array_keys($langues));
655
-	sort($langues);
656
-	$langues = join(',', $langues);
657
-	spip_log("langues utilisees: $langues");
658
-
659
-	return $langues;
586
+    include_spip('public/interfaces');
587
+    include_spip('public/compiler');
588
+    include_spip('public/composer');
589
+    include_spip('public/phraser_html');
590
+    $langues = [];
591
+
592
+    $langues[$GLOBALS['meta']['langue_site']] = 1;
593
+
594
+    include_spip('base/objets');
595
+    $tables = lister_tables_objets_sql();
596
+    $trouver_table = charger_fonction('trouver_table', 'base');
597
+
598
+    foreach (array_keys($tables) as $t) {
599
+        $desc = $trouver_table($t, $serveur);
600
+        // c'est une table avec des langues
601
+        if (
602
+            $desc['exist']
603
+            and isset($desc['field']['lang'])
604
+            and isset($desc['field']['langue_choisie'])
605
+        ) {
606
+            $boucle = new Boucle();
607
+            $boucle->show = $desc;
608
+            $boucle->nom = 'calculer_langues_utilisees';
609
+            $boucle->id_boucle = $desc['table_objet'];
610
+            $boucle->id_table = $desc['table_objet'];
611
+            $boucle->primary = $desc['key']['PRIMARY KEY'] ?? '';
612
+            $boucle->sql_serveur = $serveur;
613
+            $boucle->select[] = 'DISTINCT lang';
614
+            $boucle->from[$desc['table_objet']] = $t;
615
+            $boucle->separateur[] = ',';
616
+            $boucle->return = '$Pile[$SP][\'lang\']';
617
+            $boucle->iterateur = 'sql';
618
+
619
+            $boucle->descr['nom'] = 'calculer_langues_utilisees'; // eviter notice php
620
+            $boucle->descr['sourcefile'] = 'internal';
621
+            $boucle->descr['gram'] = 'html';
622
+
623
+            $boucle = pipeline('pre_boucle', $boucle);
624
+
625
+            if (
626
+                isset($desc['statut'])
627
+                and $desc['statut']
628
+            ) {
629
+                $boucles = [
630
+                    'calculer_langues_utilisees' => $boucle,
631
+                ];
632
+                // generer un nom de fonction "anonyme" unique
633
+                do {
634
+                    $functionname = 'f_calculer_langues_utilisees_' . $boucle->id_table . '_' . time() . '_' . random_int(0, mt_getrandmax());
635
+                } while (function_exists($functionname));
636
+                $code = calculer_boucle('calculer_langues_utilisees', $boucles);
637
+                $code = '$SP=0; $command=array();$command["connect"] = $connect = "' . $serveur . '"; $Pile=array(0=>array());' . "\n" . $code;
638
+                $code = 'function ' . $functionname . '(){' . $code . '};$res = ' . $functionname . '();';
639
+                $res = '';
640
+                eval($code);
641
+                $res = explode(',', $res);
642
+                foreach ($res as $lang) {
643
+                    $langues[$lang] = 1;
644
+                }
645
+            } else {
646
+                $res = sql_select(implode(',', $boucle->select), $boucle->from);
647
+                while ($row = sql_fetch($res)) {
648
+                    $langues[$row['lang']] = 1;
649
+                }
650
+            }
651
+        }
652
+    }
653
+
654
+    $langues = array_filter(array_keys($langues));
655
+    sort($langues);
656
+    $langues = join(',', $langues);
657
+    spip_log("langues utilisees: $langues");
658
+
659
+    return $langues;
660 660
 }
661 661
 
662 662
 /**
@@ -673,9 +673,9 @@  discard block
 block discarded – undo
673 673
  *     incluant les rubriques noeuds et toutes leurs descendances
674 674
  */
675 675
 function calcul_branche_in($id) {
676
-	$calcul_branche_in = charger_fonction('calcul_branche_in', 'inc');
676
+    $calcul_branche_in = charger_fonction('calcul_branche_in', 'inc');
677 677
 
678
-	return $calcul_branche_in($id);
678
+    return $calcul_branche_in($id);
679 679
 }
680 680
 
681 681
 /**
@@ -693,9 +693,9 @@  discard block
 block discarded – undo
693 693
  *     incluant les rubriques transmises et toutes leurs parentées
694 694
  */
695 695
 function calcul_hierarchie_in($id, $tout = true) {
696
-	$calcul_hierarchie_in = charger_fonction('calcul_hierarchie_in', 'inc');
696
+    $calcul_hierarchie_in = charger_fonction('calcul_hierarchie_in', 'inc');
697 697
 
698
-	return $calcul_hierarchie_in($id, $tout);
698
+    return $calcul_hierarchie_in($id, $tout);
699 699
 }
700 700
 
701 701
 
@@ -716,40 +716,40 @@  discard block
 block discarded – undo
716 716
  *     incluant les rubriques noeuds et toutes leurs descendances
717 717
  */
718 718
 function inc_calcul_branche_in_dist($id) {
719
-	static $b = [];
720
-
721
-	// normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN
722
-	if (!is_array($id)) {
723
-		$id = explode(',', $id);
724
-	}
725
-	$id = join(',', array_map('intval', $id));
726
-	if (isset($b[$id])) {
727
-		return $b[$id];
728
-	}
729
-
730
-	// Notre branche commence par la rubrique de depart
731
-	$branche = $r = $id;
732
-
733
-	// On ajoute une generation (les filles de la generation precedente)
734
-	// jusqu'a epuisement, en se protegeant des references circulaires
735
-	$maxiter = 10000;
736
-	while (
737
-		$maxiter-- and $filles = sql_allfetsel(
738
-			'id_rubrique',
739
-			'spip_rubriques',
740
-			sql_in('id_parent', $r) . ' AND ' . sql_in('id_rubrique', $r, 'NOT')
741
-		)
742
-	) {
743
-		$r = join(',', array_column($filles, 'id_rubrique'));
744
-		$branche .= ',' . $r;
745
-	}
746
-
747
-	# securite pour ne pas plomber la conso memoire sur les sites prolifiques
748
-	if (strlen($branche) < 10000) {
749
-		$b[$id] = $branche;
750
-	}
751
-
752
-	return $branche;
719
+    static $b = [];
720
+
721
+    // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN
722
+    if (!is_array($id)) {
723
+        $id = explode(',', $id);
724
+    }
725
+    $id = join(',', array_map('intval', $id));
726
+    if (isset($b[$id])) {
727
+        return $b[$id];
728
+    }
729
+
730
+    // Notre branche commence par la rubrique de depart
731
+    $branche = $r = $id;
732
+
733
+    // On ajoute une generation (les filles de la generation precedente)
734
+    // jusqu'a epuisement, en se protegeant des references circulaires
735
+    $maxiter = 10000;
736
+    while (
737
+        $maxiter-- and $filles = sql_allfetsel(
738
+            'id_rubrique',
739
+            'spip_rubriques',
740
+            sql_in('id_parent', $r) . ' AND ' . sql_in('id_rubrique', $r, 'NOT')
741
+        )
742
+    ) {
743
+        $r = join(',', array_column($filles, 'id_rubrique'));
744
+        $branche .= ',' . $r;
745
+    }
746
+
747
+    # securite pour ne pas plomber la conso memoire sur les sites prolifiques
748
+    if (strlen($branche) < 10000) {
749
+        $b[$id] = $branche;
750
+    }
751
+
752
+    return $branche;
753 753
 }
754 754
 
755 755
 
@@ -771,45 +771,45 @@  discard block
 block discarded – undo
771 771
  *     incluant les rubriques transmises et toutes leurs parentées
772 772
  */
773 773
 function inc_calcul_hierarchie_in_dist($id, $tout = true) {
774
-	static $b = [];
775
-
776
-	// normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN
777
-	if (!is_array($id)) {
778
-		$id = explode(',', $id);
779
-	}
780
-	$id = join(',', array_map('intval', $id));
781
-
782
-	if (isset($b[$id])) {
783
-		// Notre branche commence par la rubrique de depart si $tout=true
784
-		return $tout ? (strlen($b[$id]) ? $b[$id] . ",$id" : $id) : $b[$id];
785
-	}
786
-
787
-	$hier = '';
788
-
789
-	// On ajoute une generation (les filles de la generation precedente)
790
-	// jusqu'a epuisement, en se protegeant des references circulaires
791
-	$ids_nouveaux_parents = $id;
792
-	$maxiter = 10000;
793
-	while (
794
-		$maxiter-- and $parents = sql_allfetsel(
795
-			'id_parent',
796
-			'spip_rubriques',
797
-			sql_in('id_rubrique', $ids_nouveaux_parents) . ' AND ' . sql_in('id_parent', $hier, 'NOT')
798
-		)
799
-	) {
800
-		$ids_nouveaux_parents = join(',', array_column($parents, 'id_parent'));
801
-		$hier = $ids_nouveaux_parents . (strlen($hier) ? ',' . $hier : '');
802
-	}
803
-
804
-	# securite pour ne pas plomber la conso memoire sur les sites prolifiques
805
-	if (strlen($hier) < 10000) {
806
-		$b[$id] = $hier;
807
-	}
808
-
809
-	// Notre branche commence par la rubrique de depart si $tout=true
810
-	$hier = $tout ? (strlen($hier) ? "$hier,$id" : $id) : $hier;
811
-
812
-	return $hier;
774
+    static $b = [];
775
+
776
+    // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN
777
+    if (!is_array($id)) {
778
+        $id = explode(',', $id);
779
+    }
780
+    $id = join(',', array_map('intval', $id));
781
+
782
+    if (isset($b[$id])) {
783
+        // Notre branche commence par la rubrique de depart si $tout=true
784
+        return $tout ? (strlen($b[$id]) ? $b[$id] . ",$id" : $id) : $b[$id];
785
+    }
786
+
787
+    $hier = '';
788
+
789
+    // On ajoute une generation (les filles de la generation precedente)
790
+    // jusqu'a epuisement, en se protegeant des references circulaires
791
+    $ids_nouveaux_parents = $id;
792
+    $maxiter = 10000;
793
+    while (
794
+        $maxiter-- and $parents = sql_allfetsel(
795
+            'id_parent',
796
+            'spip_rubriques',
797
+            sql_in('id_rubrique', $ids_nouveaux_parents) . ' AND ' . sql_in('id_parent', $hier, 'NOT')
798
+        )
799
+    ) {
800
+        $ids_nouveaux_parents = join(',', array_column($parents, 'id_parent'));
801
+        $hier = $ids_nouveaux_parents . (strlen($hier) ? ',' . $hier : '');
802
+    }
803
+
804
+    # securite pour ne pas plomber la conso memoire sur les sites prolifiques
805
+    if (strlen($hier) < 10000) {
806
+        $b[$id] = $hier;
807
+    }
808
+
809
+    // Notre branche commence par la rubrique de depart si $tout=true
810
+    $hier = $tout ? (strlen($hier) ? "$hier,$id" : $id) : $hier;
811
+
812
+    return $hier;
813 813
 }
814 814
 
815 815
 
@@ -827,47 +827,47 @@  discard block
 block discarded – undo
827 827
  * @return void
828 828
  **/
829 829
 function calculer_prochain_postdate($check = false) {
830
-	include_spip('base/abstract_sql');
831
-	if ($check) {
832
-		$postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
833
-			'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : '';
834
-
835
-		$r = sql_select(
836
-			'DISTINCT A.id_rubrique AS id',
837
-			'spip_articles AS A LEFT JOIN spip_rubriques AS R ON A.id_rubrique=R.id_rubrique',
838
-			"R.statut != 'publie' AND A.statut='publie'$postdates"
839
-		);
840
-		while ($row = sql_fetch($r)) {
841
-			publier_branche_rubrique($row['id']);
842
-		}
843
-
844
-		pipeline('trig_calculer_prochain_postdate', '');
845
-	}
846
-
847
-	$t = sql_fetsel(
848
-		'date',
849
-		'spip_articles',
850
-		"statut='publie' AND date > " . sql_quote(date('Y-m-d H:i:s')),
851
-		'',
852
-		'date',
853
-		'1'
854
-	);
855
-
856
-	if ($t) {
857
-		$t = $t['date'];
858
-		if (
859
-			!isset($GLOBALS['meta']['date_prochain_postdate'])
860
-			or $t <> $GLOBALS['meta']['date_prochain_postdate']
861
-		) {
862
-			ecrire_meta('date_prochain_postdate', strtotime($t));
863
-			ecrire_meta('derniere_modif', time());
864
-		}
865
-	} else {
866
-		effacer_meta('date_prochain_postdate');
867
-		ecrire_meta('derniere_modif', time());
868
-	}
869
-
870
-	spip_log("prochain postdate: $t");
830
+    include_spip('base/abstract_sql');
831
+    if ($check) {
832
+        $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
833
+            'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : '';
834
+
835
+        $r = sql_select(
836
+            'DISTINCT A.id_rubrique AS id',
837
+            'spip_articles AS A LEFT JOIN spip_rubriques AS R ON A.id_rubrique=R.id_rubrique',
838
+            "R.statut != 'publie' AND A.statut='publie'$postdates"
839
+        );
840
+        while ($row = sql_fetch($r)) {
841
+            publier_branche_rubrique($row['id']);
842
+        }
843
+
844
+        pipeline('trig_calculer_prochain_postdate', '');
845
+    }
846
+
847
+    $t = sql_fetsel(
848
+        'date',
849
+        'spip_articles',
850
+        "statut='publie' AND date > " . sql_quote(date('Y-m-d H:i:s')),
851
+        '',
852
+        'date',
853
+        '1'
854
+    );
855
+
856
+    if ($t) {
857
+        $t = $t['date'];
858
+        if (
859
+            !isset($GLOBALS['meta']['date_prochain_postdate'])
860
+            or $t <> $GLOBALS['meta']['date_prochain_postdate']
861
+        ) {
862
+            ecrire_meta('date_prochain_postdate', strtotime($t));
863
+            ecrire_meta('derniere_modif', time());
864
+        }
865
+    } else {
866
+        effacer_meta('date_prochain_postdate');
867
+        ecrire_meta('derniere_modif', time());
868
+    }
869
+
870
+    spip_log("prochain postdate: $t");
871 871
 }
872 872
 
873 873
 /**
@@ -892,62 +892,62 @@  discard block
 block discarded – undo
892 892
  */
893 893
 function creer_rubrique_nommee($titre, $id_parent = 0, $serveur = '') {
894 894
 
895
-	// eclater l'arborescence demandee
896
-	// echapper les </multi> et autres balises fermantes html
897
-	$titre = preg_replace(',</([a-z][^>]*)>,ims', "<@\\1>", $titre);
898
-	$arbo = explode('/', preg_replace(',^/,', '', $titre));
899
-	include_spip('base/abstract_sql');
900
-	foreach ($arbo as $titre) {
901
-		// retablir les </multi> et autres balises fermantes html
902
-		$titre = preg_replace(',<@([a-z][^>]*)>,ims', "</\\1>", $titre);
903
-		$r = sql_getfetsel(
904
-			'id_rubrique',
905
-			'spip_rubriques',
906
-			'titre = ' . sql_quote($titre) . ' AND id_parent=' . intval($id_parent),
907
-			$groupby = [],
908
-			$orderby = [],
909
-			$limit = '',
910
-			$having = [],
911
-			$serveur
912
-		);
913
-		if ($r !== null) {
914
-			$id_parent = $r;
915
-		} else {
916
-			$id_rubrique = sql_insertq('spip_rubriques', [
917
-					'titre' => $titre,
918
-					'id_parent' => $id_parent,
919
-					'statut' => 'prepa'
920
-				], $desc = [], $serveur);
921
-			if ($id_parent > 0) {
922
-				$data = sql_fetsel(
923
-					'id_secteur,lang',
924
-					'spip_rubriques',
925
-					"id_rubrique=$id_parent",
926
-					$groupby = [],
927
-					$orderby = [],
928
-					$limit = '',
929
-					$having = [],
930
-					$serveur
931
-				);
932
-				$id_secteur = $data['id_secteur'];
933
-				$lang = $data['lang'];
934
-			} else {
935
-				$id_secteur = $id_rubrique;
936
-				$lang = $GLOBALS['meta']['langue_site'];
937
-			}
938
-
939
-			sql_updateq(
940
-				'spip_rubriques',
941
-				['id_secteur' => $id_secteur, 'lang' => $lang],
942
-				'id_rubrique=' . intval($id_rubrique),
943
-				[],
944
-				$serveur
945
-			);
946
-
947
-			// pour la recursion
948
-			$id_parent = $id_rubrique;
949
-		}
950
-	}
951
-
952
-	return intval($id_parent);
895
+    // eclater l'arborescence demandee
896
+    // echapper les </multi> et autres balises fermantes html
897
+    $titre = preg_replace(',</([a-z][^>]*)>,ims', "<@\\1>", $titre);
898
+    $arbo = explode('/', preg_replace(',^/,', '', $titre));
899
+    include_spip('base/abstract_sql');
900
+    foreach ($arbo as $titre) {
901
+        // retablir les </multi> et autres balises fermantes html
902
+        $titre = preg_replace(',<@([a-z][^>]*)>,ims', "</\\1>", $titre);
903
+        $r = sql_getfetsel(
904
+            'id_rubrique',
905
+            'spip_rubriques',
906
+            'titre = ' . sql_quote($titre) . ' AND id_parent=' . intval($id_parent),
907
+            $groupby = [],
908
+            $orderby = [],
909
+            $limit = '',
910
+            $having = [],
911
+            $serveur
912
+        );
913
+        if ($r !== null) {
914
+            $id_parent = $r;
915
+        } else {
916
+            $id_rubrique = sql_insertq('spip_rubriques', [
917
+                    'titre' => $titre,
918
+                    'id_parent' => $id_parent,
919
+                    'statut' => 'prepa'
920
+                ], $desc = [], $serveur);
921
+            if ($id_parent > 0) {
922
+                $data = sql_fetsel(
923
+                    'id_secteur,lang',
924
+                    'spip_rubriques',
925
+                    "id_rubrique=$id_parent",
926
+                    $groupby = [],
927
+                    $orderby = [],
928
+                    $limit = '',
929
+                    $having = [],
930
+                    $serveur
931
+                );
932
+                $id_secteur = $data['id_secteur'];
933
+                $lang = $data['lang'];
934
+            } else {
935
+                $id_secteur = $id_rubrique;
936
+                $lang = $GLOBALS['meta']['langue_site'];
937
+            }
938
+
939
+            sql_updateq(
940
+                'spip_rubriques',
941
+                ['id_secteur' => $id_secteur, 'lang' => $lang],
942
+                'id_rubrique=' . intval($id_rubrique),
943
+                [],
944
+                $serveur
945
+            );
946
+
947
+            // pour la recursion
948
+            $id_parent = $id_rubrique;
949
+        }
950
+    }
951
+
952
+    return intval($id_parent);
953 953
 }
Please login to merge, or discard this patch.
ecrire/lang/ecrire_pt_br.php 1 patch
Indentation   +839 added lines, -839 removed lines patch added patch discarded remove patch
@@ -4,879 +4,879 @@
 block discarded – undo
4 4
 // ** ne pas modifier le fichier **
5 5
 
6 6
 if (!defined('_ECRIRE_INC_VERSION')) {
7
-	return;
7
+    return;
8 8
 }
9 9
 
10 10
 $GLOBALS[$GLOBALS['idx_lang']] = array(
11 11
 
12
-	// A
13
-	'activer_plugin' => 'Ativar o plugin',
14
-	'affichage' => 'Exibição',
15
-	'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.',
16
-	'annuler_recherche' => 'Cancelar a busca',
17
-	'auteur' => 'Autor:',
18
-	'avis_acces_interdit' => 'Acesso negado.',
19
-	'avis_acces_interdit_prive' => 'Você não está autorizado a acessar a página <b>@exec@</b>.',
20
-	'avis_article_modifie' => 'Atenção, @nom_auteur_modif@ editou esta matéria há @date_diff@ minutos',
21
-	'avis_aucun_resultat' => 'Nenhum resultado.',
22
-	'avis_base_inaccessible' => 'Não foi possível conectar com a base de dados @base@.',
23
-	'avis_chemin_invalide_1' => 'O caminho que você escolheu',
24
-	'avis_chemin_invalide_2' => 'não parece válido. Por favor, volte à página anterior e verifique as informações fornecidas.',
25
-	'avis_connexion_echec_1' => 'A conexão com a base de dados falhou.',
26
-	'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
27
-	'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.',
28
-	'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.',
29
-	'avis_connexion_erreur_fichier_cle_manquant_1' => 'A instalação deve ser realizada por um webmaster com um backup das chaves e sua senha.',
30
-	'avis_connexion_erreur_fichier_cle_manquant_2' => 'A instalação deve ser feita por um webmaster com um backup das chaves',
31
-	'avis_connexion_erreur_nom_base' => 'O nome da base só pode conter letras, números e traços',
32
-	'avis_connexion_ldap_echec_1' => 'A conexão ao servidor LDAP falhou.',
33
-	'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
34
-	'avis_connexion_ldap_echec_3' => 'Opcionalmente, não use o suporte LDAP para importar os usuários.',
35
-	'avis_deplacement_rubrique' => 'Atenção! Esta seção contém @contient_breves@ nota@scb@: se você a transferir, por favor, marque este quadrado.',
36
-	'avis_erreur_connexion_mysql' => 'Erro de conexão SQL',
37
-	'avis_erreur_creation_compte' => 'Erro durante a inicialização da conta',
38
-	'avis_espace_interdit' => '<b>Área interdita</b> <div>O SPIP já está instalado.</div>',
39
-	'avis_lecture_noms_bases_1' => 'O programa de instalação não pôde ler os nomes das bases de dados instaladas.',
40
-	'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).',
41
-	'avis_lecture_noms_bases_3' => 'No segundo caso, é provável que uma base de dados com o nome do seu login possa ser utilizada:',
42
-	'avis_non_acces_page' => 'Você não tem acesso a esta página.',
43
-	'avis_operation_echec' => 'A operação falhou.',
44
-	'avis_operation_impossible' => 'Operação impossível',
45
-	'avis_suppression_base' => 'ATENÇÃO, a supressão dos dados é irreversível',
12
+    // A
13
+    'activer_plugin' => 'Ativar o plugin',
14
+    'affichage' => 'Exibição',
15
+    'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.',
16
+    'annuler_recherche' => 'Cancelar a busca',
17
+    'auteur' => 'Autor:',
18
+    'avis_acces_interdit' => 'Acesso negado.',
19
+    'avis_acces_interdit_prive' => 'Você não está autorizado a acessar a página <b>@exec@</b>.',
20
+    'avis_article_modifie' => 'Atenção, @nom_auteur_modif@ editou esta matéria há @date_diff@ minutos',
21
+    'avis_aucun_resultat' => 'Nenhum resultado.',
22
+    'avis_base_inaccessible' => 'Não foi possível conectar com a base de dados @base@.',
23
+    'avis_chemin_invalide_1' => 'O caminho que você escolheu',
24
+    'avis_chemin_invalide_2' => 'não parece válido. Por favor, volte à página anterior e verifique as informações fornecidas.',
25
+    'avis_connexion_echec_1' => 'A conexão com a base de dados falhou.',
26
+    'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
27
+    '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.',
28
+    'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.',
29
+    'avis_connexion_erreur_fichier_cle_manquant_1' => 'A instalação deve ser realizada por um webmaster com um backup das chaves e sua senha.',
30
+    'avis_connexion_erreur_fichier_cle_manquant_2' => 'A instalação deve ser feita por um webmaster com um backup das chaves',
31
+    'avis_connexion_erreur_nom_base' => 'O nome da base só pode conter letras, números e traços',
32
+    'avis_connexion_ldap_echec_1' => 'A conexão ao servidor LDAP falhou.',
33
+    'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
34
+    'avis_connexion_ldap_echec_3' => 'Opcionalmente, não use o suporte LDAP para importar os usuários.',
35
+    'avis_deplacement_rubrique' => 'Atenção! Esta seção contém @contient_breves@ nota@scb@: se você a transferir, por favor, marque este quadrado.',
36
+    'avis_erreur_connexion_mysql' => 'Erro de conexão SQL',
37
+    'avis_erreur_creation_compte' => 'Erro durante a inicialização da conta',
38
+    'avis_espace_interdit' => '<b>Área interdita</b> <div>O SPIP já está instalado.</div>',
39
+    'avis_lecture_noms_bases_1' => 'O programa de instalação não pôde ler os nomes das bases de dados instaladas.',
40
+    '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).',
41
+    'avis_lecture_noms_bases_3' => 'No segundo caso, é provável que uma base de dados com o nome do seu login possa ser utilizada:',
42
+    'avis_non_acces_page' => 'Você não tem acesso a esta página.',
43
+    'avis_operation_echec' => 'A operação falhou.',
44
+    'avis_operation_impossible' => 'Operação impossível',
45
+    'avis_suppression_base' => 'ATENÇÃO, a supressão dos dados é irreversível',
46 46
 
47
-	// B
48
-	'bouton_acces_ldap' => 'Incluir o acesso ao LDAP',
49
-	'bouton_ajouter' => 'Incluir',
50
-	'bouton_annuler' => 'Anular',
51
-	'bouton_cache_activer' => 'Reativar o cache',
52
-	'bouton_cache_desactiver' => 'Desativar temporariamente o cache',
53
-	'bouton_demande_publication' => 'Solicitar a publicação desta matéria',
54
-	'bouton_desactive_tout' => 'Desativar tudo',
55
-	'bouton_desinstaller' => 'Desinstalar',
56
-	'bouton_effacer_tout' => 'Apagar TUDO',
57
-	'bouton_envoyer_message' => 'Mensagem definitiva: enviar',
58
-	'bouton_fermer' => 'Fechar',
59
-	'bouton_mettre_a_jour_base' => 'Atualizar a base de dados',
60
-	'bouton_modifier' => 'Alterar',
61
-	'bouton_radio_afficher' => 'Exibir',
62
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Exibir nas listas de redatores conectados',
63
-	'bouton_radio_envoi_annonces_adresse' => 'Enviar os avisos para o endereço:',
64
-	'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista de novidades',
65
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não exibir na lista de redatores',
66
-	'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar os avisos editoriais',
67
-	'bouton_redirection' => 'REDIRECIONAMENTO',
68
-	'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Reiniciar aos valores padrão',
69
-	'bouton_relancer_inscription' => 'Reiniciar o registro',
70
-	'bouton_relancer_inscriptions' => 'Reiniciar os registros',
71
-	'bouton_relancer_installation' => 'Reiniciar a instalação',
72
-	'bouton_reset_password' => 'Criar uma nova senha e enviá-la por e-mail',
73
-	'bouton_suivant' => 'Avançar',
74
-	'bouton_tenter_recuperation' => 'Tentar uma reparação',
75
-	'bouton_test_proxy' => 'Testar o proxy',
76
-	'bouton_vider_cache' => 'Limpar o cache',
47
+    // B
48
+    'bouton_acces_ldap' => 'Incluir o acesso ao LDAP',
49
+    'bouton_ajouter' => 'Incluir',
50
+    'bouton_annuler' => 'Anular',
51
+    'bouton_cache_activer' => 'Reativar o cache',
52
+    'bouton_cache_desactiver' => 'Desativar temporariamente o cache',
53
+    'bouton_demande_publication' => 'Solicitar a publicação desta matéria',
54
+    'bouton_desactive_tout' => 'Desativar tudo',
55
+    'bouton_desinstaller' => 'Desinstalar',
56
+    'bouton_effacer_tout' => 'Apagar TUDO',
57
+    'bouton_envoyer_message' => 'Mensagem definitiva: enviar',
58
+    'bouton_fermer' => 'Fechar',
59
+    'bouton_mettre_a_jour_base' => 'Atualizar a base de dados',
60
+    'bouton_modifier' => 'Alterar',
61
+    'bouton_radio_afficher' => 'Exibir',
62
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Exibir nas listas de redatores conectados',
63
+    'bouton_radio_envoi_annonces_adresse' => 'Enviar os avisos para o endereço:',
64
+    'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista de novidades',
65
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não exibir na lista de redatores',
66
+    'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar os avisos editoriais',
67
+    'bouton_redirection' => 'REDIRECIONAMENTO',
68
+    'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Reiniciar aos valores padrão',
69
+    'bouton_relancer_inscription' => 'Reiniciar o registro',
70
+    'bouton_relancer_inscriptions' => 'Reiniciar os registros',
71
+    'bouton_relancer_installation' => 'Reiniciar a instalação',
72
+    'bouton_reset_password' => 'Criar uma nova senha e enviá-la por e-mail',
73
+    'bouton_suivant' => 'Avançar',
74
+    'bouton_tenter_recuperation' => 'Tentar uma reparação',
75
+    'bouton_test_proxy' => 'Testar o proxy',
76
+    'bouton_vider_cache' => 'Limpar o cache',
77 77
 
78
-	// C
79
-	'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.',
80
-	'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.',
81
-	'config_activer_champs' => 'Ativar os campos a seguir',
82
-	'config_choix_base_sup' => 'indicar uma base neste servidor',
83
-	'config_erreur_base_sup' => 'O SPIP não tem acesso à lista de bases acessíveis',
84
-	'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.',
85
-	'config_info_base_sup_disponibles' => 'Bases suplementares já consultáveis:',
86
-	'config_info_enregistree' => 'A nova configuração foi gravada',
87
-	'config_info_logos' => 'Cada elemento do site pode ter um ícone, bem como um ícone de «mouseOver»',
88
-	'config_info_logos_utiliser' => 'Usar os ícones',
89
-	'config_info_logos_utiliser_non' => 'Não usar o ícones',
90
-	'config_info_logos_utiliser_survol' => 'Usar os ícones de mouseOver',
91
-	'config_info_logos_utiliser_survol_non' => 'Não usar os ícones de mouseOver',
92
-	'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.',
93
-	'config_redirection' => 'Matérias virtuais',
94
-	'config_titre_base_sup' => 'Configuração de uma base suplementar',
95
-	'config_titre_base_sup_choix' => 'Escolha uma base suplementar',
96
-	'connexion_ldap' => 'Conexão:',
97
-	'creer_et_associer_un_auteur' => 'Criar e vincular um autor',
78
+    // C
79
+    'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.',
80
+    '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.',
81
+    'config_activer_champs' => 'Ativar os campos a seguir',
82
+    'config_choix_base_sup' => 'indicar uma base neste servidor',
83
+    'config_erreur_base_sup' => 'O SPIP não tem acesso à lista de bases acessíveis',
84
+    '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.',
85
+    'config_info_base_sup_disponibles' => 'Bases suplementares já consultáveis:',
86
+    'config_info_enregistree' => 'A nova configuração foi gravada',
87
+    'config_info_logos' => 'Cada elemento do site pode ter um ícone, bem como um ícone de «mouseOver»',
88
+    'config_info_logos_utiliser' => 'Usar os ícones',
89
+    'config_info_logos_utiliser_non' => 'Não usar o ícones',
90
+    'config_info_logos_utiliser_survol' => 'Usar os ícones de mouseOver',
91
+    'config_info_logos_utiliser_survol_non' => 'Não usar os ícones de mouseOver',
92
+    '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.',
93
+    'config_redirection' => 'Matérias virtuais',
94
+    'config_titre_base_sup' => 'Configuração de uma base suplementar',
95
+    'config_titre_base_sup_choix' => 'Escolha uma base suplementar',
96
+    'connexion_ldap' => 'Conexão:',
97
+    'creer_et_associer_un_auteur' => 'Criar e vincular um autor',
98 98
 
99
-	// D
100
-	'date_mot_heures' => 'horas',
99
+    // D
100
+    'date_mot_heures' => 'horas',
101 101
 
102
-	// E
103
-	'ecran_connexion_couleur_principale' => 'Cor principal',
104
-	'ecran_connexion_image_fond' => 'Imagem de fundo',
105
-	'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)',
106
-	'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão',
107
-	'ecran_connexion_titre' => 'Tela de conexão',
108
-	'ecran_securite' => ' + tela de segurança @version@',
109
-	'email' => 'e-mail',
110
-	'email_2' => 'e-mail:',
111
-	'en_savoir_plus' => 'Saiba mais',
112
-	'entree_adresse_annuaire' => 'Endereço do catálogo',
113
-	'entree_adresse_email' => 'Seu endereço de e-mail',
114
-	'entree_adresse_email_2' => 'Endereço de e-mail',
115
-	'entree_base_donnee_1' => 'Endereço da base de dados',
116
-	'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.)',
117
-	'entree_biographie' => 'Biografia curta em poucas palavras.',
118
-	'entree_chemin_acces' => '<b>Informe</b> o caminho de acesso:',
119
-	'entree_cle_pgp' => 'Sua chave PGP',
120
-	'entree_cle_pgp_2' => 'Chave PGP',
121
-	'entree_contenu_rubrique' => '(Conteúdo da seção em poucas palavras.)',
122
-	'entree_identifiants_connexion' => 'Seus dados de conexão...',
123
-	'entree_identifiants_connexion_2' => 'Dados de conexão',
124
-	'entree_informations_connexion_ldap' => 'Informe neste formulário os dados de conexão ao seu catálogo LDAP.
102
+    // E
103
+    'ecran_connexion_couleur_principale' => 'Cor principal',
104
+    'ecran_connexion_image_fond' => 'Imagem de fundo',
105
+    'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)',
106
+    'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão',
107
+    'ecran_connexion_titre' => 'Tela de conexão',
108
+    'ecran_securite' => ' + tela de segurança @version@',
109
+    'email' => 'e-mail',
110
+    'email_2' => 'e-mail:',
111
+    'en_savoir_plus' => 'Saiba mais',
112
+    'entree_adresse_annuaire' => 'Endereço do catálogo',
113
+    'entree_adresse_email' => 'Seu endereço de e-mail',
114
+    'entree_adresse_email_2' => 'Endereço de e-mail',
115
+    'entree_base_donnee_1' => 'Endereço da base de dados',
116
+    '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.)',
117
+    'entree_biographie' => 'Biografia curta em poucas palavras.',
118
+    'entree_chemin_acces' => '<b>Informe</b> o caminho de acesso:',
119
+    'entree_cle_pgp' => 'Sua chave PGP',
120
+    'entree_cle_pgp_2' => 'Chave PGP',
121
+    'entree_contenu_rubrique' => '(Conteúdo da seção em poucas palavras.)',
122
+    'entree_identifiants_connexion' => 'Seus dados de conexão...',
123
+    'entree_identifiants_connexion_2' => 'Dados de conexão',
124
+    'entree_informations_connexion_ldap' => 'Informe neste formulário os dados de conexão ao seu catálogo LDAP.
125 125
 Estas informações deverão ser fornecidas pelo administrador do sistema ou da rede.',
126
-	'entree_infos_perso' => 'Quem é você?',
127
-	'entree_infos_perso_2' => 'Quem é o autor?',
128
-	'entree_interieur_rubrique' => 'No interior da seção:',
129
-	'entree_liens_sites' => '<b>Link hipertexto</b> (referência, site a visitar...)',
130
-	'entree_login' => 'Seu login',
131
-	'entree_login_connexion_1' => 'O login de conexão',
132
-	'entree_login_connexion_2' => '(Frequentemente corresponde ao seu login para acesso por FTP; às vezes pode ser deixado em branco)',
133
-	'entree_mot_passe' => 'Sua senha',
134
-	'entree_mot_passe_1' => 'A senha de conexão',
135
-	'entree_mot_passe_2' => '(Frequentemente corresponde à sua senha para acesso por FTP; às vezes pode ser deixado em branco)',
136
-	'entree_nom_fichier' => 'Por favor, informe o nome do arquivo @texte_compresse@:',
137
-	'entree_nom_pseudo' => 'Seu nome ou apelido',
138
-	'entree_nom_pseudo_1' => '(Seu nome ou apelido)',
139
-	'entree_nom_pseudo_2' => 'Nome ou apelido',
140
-	'entree_nom_site' => 'O nome do seu site',
141
-	'entree_nom_site_2' => 'Nome do site do autor',
142
-	'entree_nouveau_passe' => 'Nova senha',
143
-	'entree_passe_ldap' => 'Senha',
144
-	'entree_port_annuaire' => 'O número da porta do catálogo',
145
-	'entree_signature' => 'Assinatura',
146
-	'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />',
147
-	'entree_url' => 'O endereço (URL) do seu site',
148
-	'entree_url_2' => 'Endereço (URL) do site',
149
-	'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome',
150
-	'erreur_contenu_suspect' => 'Texto escapado',
151
-	'erreur_email_deja_existant' => 'Esse endereço de email já está em uso.',
152
-	'erreur_nom_connect_incorrect' => 'Este nome de servidor não é autorizado',
153
-	'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ faltando no tag @balise@.',
154
-	'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, você pode desativá-lo.',
155
-	'erreur_plugin_fichier_absent' => 'Arquivo ausente',
156
-	'erreur_plugin_fichier_def_absent' => 'Arquivo de definição ausente',
157
-	'erreur_plugin_nom_fonction_interdit' => 'Nome de função não permitido',
158
-	'erreur_plugin_nom_manquant' => 'Nome do plugin ausente',
159
-	'erreur_plugin_prefix_manquant' => 'Área de nomeação do plugin não definida',
160
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; ausente no arquivo de definição',
161
-	'erreur_plugin_version_manquant' => 'Versão do plugin ausente',
162
-	'erreur_type_fichier' => 'Tipo de arquivo incorreto',
126
+    'entree_infos_perso' => 'Quem é você?',
127
+    'entree_infos_perso_2' => 'Quem é o autor?',
128
+    'entree_interieur_rubrique' => 'No interior da seção:',
129
+    'entree_liens_sites' => '<b>Link hipertexto</b> (referência, site a visitar...)',
130
+    'entree_login' => 'Seu login',
131
+    'entree_login_connexion_1' => 'O login de conexão',
132
+    'entree_login_connexion_2' => '(Frequentemente corresponde ao seu login para acesso por FTP; às vezes pode ser deixado em branco)',
133
+    'entree_mot_passe' => 'Sua senha',
134
+    'entree_mot_passe_1' => 'A senha de conexão',
135
+    'entree_mot_passe_2' => '(Frequentemente corresponde à sua senha para acesso por FTP; às vezes pode ser deixado em branco)',
136
+    'entree_nom_fichier' => 'Por favor, informe o nome do arquivo @texte_compresse@:',
137
+    'entree_nom_pseudo' => 'Seu nome ou apelido',
138
+    'entree_nom_pseudo_1' => '(Seu nome ou apelido)',
139
+    'entree_nom_pseudo_2' => 'Nome ou apelido',
140
+    'entree_nom_site' => 'O nome do seu site',
141
+    'entree_nom_site_2' => 'Nome do site do autor',
142
+    'entree_nouveau_passe' => 'Nova senha',
143
+    'entree_passe_ldap' => 'Senha',
144
+    'entree_port_annuaire' => 'O número da porta do catálogo',
145
+    'entree_signature' => 'Assinatura',
146
+    'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />',
147
+    'entree_url' => 'O endereço (URL) do seu site',
148
+    'entree_url_2' => 'Endereço (URL) do site',
149
+    'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome',
150
+    'erreur_contenu_suspect' => 'Texto escapado',
151
+    'erreur_email_deja_existant' => 'Esse endereço de email já está em uso.',
152
+    'erreur_nom_connect_incorrect' => 'Este nome de servidor não é autorizado',
153
+    'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ faltando no tag @balise@.',
154
+    'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, você pode desativá-lo.',
155
+    'erreur_plugin_fichier_absent' => 'Arquivo ausente',
156
+    'erreur_plugin_fichier_def_absent' => 'Arquivo de definição ausente',
157
+    'erreur_plugin_nom_fonction_interdit' => 'Nome de função não permitido',
158
+    'erreur_plugin_nom_manquant' => 'Nome do plugin ausente',
159
+    'erreur_plugin_prefix_manquant' => 'Área de nomeação do plugin não definida',
160
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; ausente no arquivo de definição',
161
+    'erreur_plugin_version_manquant' => 'Versão do plugin ausente',
162
+    'erreur_type_fichier' => 'Tipo de arquivo incorreto',
163 163
 
164
-	// H
165
-	'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@.',
166
-	'htaccess_inoperant' => 'htaccess inoperante',
164
+    // H
165
+    '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@.',
166
+    'htaccess_inoperant' => 'htaccess inoperante',
167 167
 
168
-	// I
169
-	'ical_info1' => 'Esta página apresenta diversos métodos para se manter a par da atividade deste site.',
170
-	'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>.',
171
-	'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.',
172
-	'ical_methode_http' => 'Transferência',
173
-	'ical_methode_webcal' => 'Sincronização (webcal://)',
174
-	'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...).',
175
-	'ical_texte_public' => 'Este calendário permite-lhe acompanhar a atividade pública deste site (matérias e notas publicadas).',
176
-	'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).',
177
-	'ical_titre_js' => 'Javascript',
178
-	'ical_titre_mailing' => 'Mailing-list',
179
-	'ical_titre_rss' => 'Arquivos de sindicação',
180
-	'icone_accueil' => 'Página Inicial',
181
-	'icone_activer_cookie' => 'Ativar o coockie de correspondência',
182
-	'icone_activite' => 'Atividade',
183
-	'icone_admin_plugin' => 'Gerenciamento dos plugins',
184
-	'icone_administration' => 'Manutenção',
185
-	'icone_afficher_auteurs' => 'Exibir os autores',
186
-	'icone_afficher_visiteurs' => 'Exibir os visitantes',
187
-	'icone_arret_discussion' => 'Não participar mais desta discussão',
188
-	'icone_calendrier' => 'Calendário',
189
-	'icone_configuration' => 'Configuração',
190
-	'icone_creer_auteur' => 'Criar um novo autor e vinculá-lo a esta matéria',
191
-	'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a esta matéria',
192
-	'icone_creer_rubrique_2' => 'Criar uma nova seção',
193
-	'icone_developpement' => 'Desenvolvimento',
194
-	'icone_edition' => 'Edição',
195
-	'icone_ma_langue' => 'Meu idioma',
196
-	'icone_mes_infos' => 'Minhas informações',
197
-	'icone_mes_preferences' => 'Minhas preferências',
198
-	'icone_modifier_article' => 'Editar esta matéria',
199
-	'icone_modifier_rubrique' => 'Editar esta seção',
200
-	'icone_publication' => 'Publicação',
201
-	'icone_relancer_signataire' => 'Reconfirmar o assinante',
202
-	'icone_retour' => 'Voltar',
203
-	'icone_retour_article' => 'Voltar para a matéria',
204
-	'icone_squelette' => 'Templates',
205
-	'icone_suivi_publication' => 'Acompanhamento da publicação',
206
-	'icone_supprimer_cookie' => 'Excluir o cookie de correspondência',
207
-	'icone_supprimer_rubrique' => 'Excluir esta seção',
208
-	'icone_supprimer_signature' => 'Excluir esta assinatura',
209
-	'icone_valider_signature' => 'Validar esta assinatura',
210
-	'image_administrer_rubrique' => 'Você pode administrar esta seção',
211
-	'impossible_modifier_login_auteur' => 'Não foi possível alterar o login.',
212
-	'impossible_modifier_pass_auteur' => 'Não foi possível alterar a senha.',
213
-	'info_1_article' => '1 matéria',
214
-	'info_1_auteur' => '1 autor',
215
-	'info_1_message' => '1 mensagem',
216
-	'info_1_mot_cle' => '1 palavra-chave',
217
-	'info_1_rubrique' => '1 seção',
218
-	'info_1_visiteur' => '1 visitante',
219
-	'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.',
220
-	'info_activer_menu_developpement' => 'Exibir o menu Desenvolvimento',
221
-	'info_admin_etre_webmestre' => 'Me conceder direitos de webmaster',
222
-	'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>',
223
-	'info_admin_statuer_webmestre' => 'Dar a este administrador os direitos de webmaster',
224
-	'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>',
225
-	'info_administrateur' => 'Administrador',
226
-	'info_administrateur_1' => 'Administrador',
227
-	'info_administrateur_2' => 'do site (<i>use com cuidado</i>)',
228
-	'info_administrateur_site_01' => 'Se você é administrador do site, por favor,',
229
-	'info_administrateur_site_02' => 'clique neste link',
230
-	'info_administrateurs' => 'Administradores',
231
-	'info_administrer_rubrique' => 'Você pode administrar esta seção',
232
-	'info_adresse' => 'no endereço:',
233
-	'info_adresse_desinscription' => 'Endereço da desinscrição:',
234
-	'info_adresse_url' => 'Endereço (URL) do site público',
235
-	'info_afficher_par_nb' => 'Exibir por',
236
-	'info_aide_en_ligne' => 'Ajuda online SPIP',
237
-	'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.',
238
-	'info_ajouter_rubrique' => 'Incluir outra seção para administrar:',
239
-	'info_annonce_nouveautes' => 'Aviso das novidades',
240
-	'info_article' => 'matéria',
241
-	'info_article_2' => 'matérias',
242
-	'info_article_a_paraitre' => 'As matérias pós-datadas para exibição',
243
-	'info_articles_02' => 'matérias',
244
-	'info_articles_2' => 'Matérias',
245
-	'info_articles_auteur' => 'As matérias deste autor',
246
-	'info_articles_miens' => 'Minhas matérias',
247
-	'info_articles_tous' => 'Todas as matérias',
248
-	'info_articles_trouves' => 'Matérias encontradas',
249
-	'info_attente_validation' => 'Suas matérias aguardando validação',
250
-	'info_aucun_article' => 'Nenhuma matéria',
251
-	'info_aucun_auteur' => 'Nenhum autor',
252
-	'info_aucun_message' => 'Nenhuma mensagem',
253
-	'info_aucun_rubrique' => 'Nenhuma seção',
254
-	'info_aujourdhui' => 'Hoje:',
255
-	'info_auteur_gere_rubriques' => 'Este autor gerencia as seções a seguir:',
256
-	'info_auteur_gere_toutes_rubriques' => 'Este autor gerencia <b>todas as seções</b>',
257
-	'info_auteur_gere_toutes_rubriques_2' => 'Eu gerencio <b>todas as seções</b>',
258
-	'info_auteurs' => 'Os autores',
259
-	'info_auteurs_par_tri' => 'Autores@partri@',
260
-	'info_auteurs_trouves' => 'Autores encontrados',
261
-	'info_authentification_externe' => 'Autenticação externa',
262
-	'info_avertissement' => 'Aviso',
263
-	'info_barre_outils' => 'com sua barra de ferramentas?',
264
-	'info_base_installee' => 'A estrutura da sua base de dados foi instalada.',
265
-	'info_bio' => 'Biografia',
266
-	'info_cache_desactive' => 'O cache está temporariamente desativado.',
267
-	'info_chapeau' => 'Introdução',
268
-	'info_chapeau_2' => 'Introdução:',
269
-	'info_chemin_acces_1' => 'Opções: <b>Caminho de acesso no diretório</b>',
270
-	'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.',
271
-	'info_chemin_acces_annuaire' => 'Opções: <b>Caminho de acesso no diretório</b>',
272
-	'info_choix_base' => 'Terceiro passo:',
273
-	'info_classement_1' => '<sup><u>o</u></sup> em @liste@',
274
-	'info_classement_2' => '<sup><u>a</u></sup> em @liste@',
275
-	'info_code_acces' => 'Não se esqueça dos seus dados de conexão!',
276
-	'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>):',
277
-	'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.',
278
-	'info_confirmer_passe' => 'Confirmar a nova senha:',
279
-	'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.',
280
-	'info_conflit_edition_differences' => 'Diferenças:',
281
-	'info_conflit_edition_version_enregistree' => 'A versão gravada:',
282
-	'info_conflit_edition_votre_version' => 'A sua versão:',
283
-	'info_connexion_base' => 'Teste de conexão com a base',
284
-	'info_connexion_base_donnee' => 'Conexão à sua base de dados',
285
-	'info_connexion_ldap_ok' => '<b>A conexão LDAP foi efetuada.</b><p>Você pode passar para o próximo passo.</p>',
286
-	'info_connexion_mysql' => 'Sua conexão SQL',
287
-	'info_connexion_ok' => 'A conexão foi obtida.',
288
-	'info_contact' => 'Contato',
289
-	'info_contenu_articles' => 'Conteúdo das matérias',
290
-	'info_contributions' => 'Contribuições',
291
-	'info_creation_paragraphe' => 'Para criar parágrafos, basta deixar linhas em branco.',
292
-	'info_creation_rubrique' => 'Antes de poder escrever matérias, você deve criar, pelo menos, uma seção.<br />',
293
-	'info_creation_tables' => 'Criação das tabelas da base',
294
-	'info_creer_base' => '<b>Criar</b> uma nova base de dados:',
295
-	'info_dans_rubrique' => 'Na seção:',
296
-	'info_date_publication_anterieure' => 'Data de redação anterior:',
297
-	'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SITE:',
298
-	'info_derniere_etape' => 'Terminou!',
299
-	'info_descriptif' => 'Descrição:',
300
-	'info_desinstaller_plugin' => 'exclui os dados e desativa o plugin',
301
-	'info_discussion_cours' => 'Discussões em andamento',
302
-	'info_ecrire_article' => 'Antes de poder escrever matérias, você precisa criar pelo menos uma seção.',
303
-	'info_email_envoi' => 'Endereço de e-mail de envio (opcional)',
304
-	'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):',
305
-	'info_email_webmestre' => 'Endereço de e-mail do webmaster',
306
-	'info_envoi_email_automatique' => 'Envio automático de e-mails',
307
-	'info_envoyer_maintenant' => 'Enviar agora',
308
-	'info_etape_suivante' => 'Avançar para a próxima etapa',
309
-	'info_etape_suivante_1' => 'Você pode passar para a próxima etapa.',
310
-	'info_etape_suivante_2' => 'Você pode passar para a próxima etapa.',
311
-	'info_exceptions_proxy' => 'Exceções para o proxy',
312
-	'info_exportation_base' => 'exportação da base para @archive@',
313
-	'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.',
314
-	'info_fichiers_authent' => 'Arquivos de autenticação «.htpasswd»',
315
-	'info_forums_abo_invites' => 'O seu site comporta fóruns por assinatura; os visitantes são convidados a se registrar no site público.',
316
-	'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>',
317
-	'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>',
318
-	'info_gauche_auteurs' => 'Aqui, você encontra todos os autores do site.
168
+    // I
169
+    'ical_info1' => 'Esta página apresenta diversos métodos para se manter a par da atividade deste site.',
170
+    '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>.',
171
+    '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.',
172
+    'ical_methode_http' => 'Transferência',
173
+    'ical_methode_webcal' => 'Sincronização (webcal://)',
174
+    '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...).',
175
+    'ical_texte_public' => 'Este calendário permite-lhe acompanhar a atividade pública deste site (matérias e notas publicadas).',
176
+    '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).',
177
+    'ical_titre_js' => 'Javascript',
178
+    'ical_titre_mailing' => 'Mailing-list',
179
+    'ical_titre_rss' => 'Arquivos de sindicação',
180
+    'icone_accueil' => 'Página Inicial',
181
+    'icone_activer_cookie' => 'Ativar o coockie de correspondência',
182
+    'icone_activite' => 'Atividade',
183
+    'icone_admin_plugin' => 'Gerenciamento dos plugins',
184
+    'icone_administration' => 'Manutenção',
185
+    'icone_afficher_auteurs' => 'Exibir os autores',
186
+    'icone_afficher_visiteurs' => 'Exibir os visitantes',
187
+    'icone_arret_discussion' => 'Não participar mais desta discussão',
188
+    'icone_calendrier' => 'Calendário',
189
+    'icone_configuration' => 'Configuração',
190
+    'icone_creer_auteur' => 'Criar um novo autor e vinculá-lo a esta matéria',
191
+    'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a esta matéria',
192
+    'icone_creer_rubrique_2' => 'Criar uma nova seção',
193
+    'icone_developpement' => 'Desenvolvimento',
194
+    'icone_edition' => 'Edição',
195
+    'icone_ma_langue' => 'Meu idioma',
196
+    'icone_mes_infos' => 'Minhas informações',
197
+    'icone_mes_preferences' => 'Minhas preferências',
198
+    'icone_modifier_article' => 'Editar esta matéria',
199
+    'icone_modifier_rubrique' => 'Editar esta seção',
200
+    'icone_publication' => 'Publicação',
201
+    'icone_relancer_signataire' => 'Reconfirmar o assinante',
202
+    'icone_retour' => 'Voltar',
203
+    'icone_retour_article' => 'Voltar para a matéria',
204
+    'icone_squelette' => 'Templates',
205
+    'icone_suivi_publication' => 'Acompanhamento da publicação',
206
+    'icone_supprimer_cookie' => 'Excluir o cookie de correspondência',
207
+    'icone_supprimer_rubrique' => 'Excluir esta seção',
208
+    'icone_supprimer_signature' => 'Excluir esta assinatura',
209
+    'icone_valider_signature' => 'Validar esta assinatura',
210
+    'image_administrer_rubrique' => 'Você pode administrar esta seção',
211
+    'impossible_modifier_login_auteur' => 'Não foi possível alterar o login.',
212
+    'impossible_modifier_pass_auteur' => 'Não foi possível alterar a senha.',
213
+    'info_1_article' => '1 matéria',
214
+    'info_1_auteur' => '1 autor',
215
+    'info_1_message' => '1 mensagem',
216
+    'info_1_mot_cle' => '1 palavra-chave',
217
+    'info_1_rubrique' => '1 seção',
218
+    'info_1_visiteur' => '1 visitante',
219
+    '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.',
220
+    'info_activer_menu_developpement' => 'Exibir o menu Desenvolvimento',
221
+    'info_admin_etre_webmestre' => 'Me conceder direitos de webmaster',
222
+    'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>',
223
+    'info_admin_statuer_webmestre' => 'Dar a este administrador os direitos de webmaster',
224
+    'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>',
225
+    'info_administrateur' => 'Administrador',
226
+    'info_administrateur_1' => 'Administrador',
227
+    'info_administrateur_2' => 'do site (<i>use com cuidado</i>)',
228
+    'info_administrateur_site_01' => 'Se você é administrador do site, por favor,',
229
+    'info_administrateur_site_02' => 'clique neste link',
230
+    'info_administrateurs' => 'Administradores',
231
+    'info_administrer_rubrique' => 'Você pode administrar esta seção',
232
+    'info_adresse' => 'no endereço:',
233
+    'info_adresse_desinscription' => 'Endereço da desinscrição:',
234
+    'info_adresse_url' => 'Endereço (URL) do site público',
235
+    'info_afficher_par_nb' => 'Exibir por',
236
+    'info_aide_en_ligne' => 'Ajuda online SPIP',
237
+    '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.',
238
+    'info_ajouter_rubrique' => 'Incluir outra seção para administrar:',
239
+    'info_annonce_nouveautes' => 'Aviso das novidades',
240
+    'info_article' => 'matéria',
241
+    'info_article_2' => 'matérias',
242
+    'info_article_a_paraitre' => 'As matérias pós-datadas para exibição',
243
+    'info_articles_02' => 'matérias',
244
+    'info_articles_2' => 'Matérias',
245
+    'info_articles_auteur' => 'As matérias deste autor',
246
+    'info_articles_miens' => 'Minhas matérias',
247
+    'info_articles_tous' => 'Todas as matérias',
248
+    'info_articles_trouves' => 'Matérias encontradas',
249
+    'info_attente_validation' => 'Suas matérias aguardando validação',
250
+    'info_aucun_article' => 'Nenhuma matéria',
251
+    'info_aucun_auteur' => 'Nenhum autor',
252
+    'info_aucun_message' => 'Nenhuma mensagem',
253
+    'info_aucun_rubrique' => 'Nenhuma seção',
254
+    'info_aujourdhui' => 'Hoje:',
255
+    'info_auteur_gere_rubriques' => 'Este autor gerencia as seções a seguir:',
256
+    'info_auteur_gere_toutes_rubriques' => 'Este autor gerencia <b>todas as seções</b>',
257
+    'info_auteur_gere_toutes_rubriques_2' => 'Eu gerencio <b>todas as seções</b>',
258
+    'info_auteurs' => 'Os autores',
259
+    'info_auteurs_par_tri' => 'Autores@partri@',
260
+    'info_auteurs_trouves' => 'Autores encontrados',
261
+    'info_authentification_externe' => 'Autenticação externa',
262
+    'info_avertissement' => 'Aviso',
263
+    'info_barre_outils' => 'com sua barra de ferramentas?',
264
+    'info_base_installee' => 'A estrutura da sua base de dados foi instalada.',
265
+    'info_bio' => 'Biografia',
266
+    'info_cache_desactive' => 'O cache está temporariamente desativado.',
267
+    'info_chapeau' => 'Introdução',
268
+    'info_chapeau_2' => 'Introdução:',
269
+    'info_chemin_acces_1' => 'Opções: <b>Caminho de acesso no diretório</b>',
270
+    '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.',
271
+    'info_chemin_acces_annuaire' => 'Opções: <b>Caminho de acesso no diretório</b>',
272
+    'info_choix_base' => 'Terceiro passo:',
273
+    'info_classement_1' => '<sup><u>o</u></sup> em @liste@',
274
+    'info_classement_2' => '<sup><u>a</u></sup> em @liste@',
275
+    'info_code_acces' => 'Não se esqueça dos seus dados de conexão!',
276
+    '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>):',
277
+    '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.',
278
+    'info_confirmer_passe' => 'Confirmar a nova senha:',
279
+    '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.',
280
+    'info_conflit_edition_differences' => 'Diferenças:',
281
+    'info_conflit_edition_version_enregistree' => 'A versão gravada:',
282
+    'info_conflit_edition_votre_version' => 'A sua versão:',
283
+    'info_connexion_base' => 'Teste de conexão com a base',
284
+    'info_connexion_base_donnee' => 'Conexão à sua base de dados',
285
+    'info_connexion_ldap_ok' => '<b>A conexão LDAP foi efetuada.</b><p>Você pode passar para o próximo passo.</p>',
286
+    'info_connexion_mysql' => 'Sua conexão SQL',
287
+    'info_connexion_ok' => 'A conexão foi obtida.',
288
+    'info_contact' => 'Contato',
289
+    'info_contenu_articles' => 'Conteúdo das matérias',
290
+    'info_contributions' => 'Contribuições',
291
+    'info_creation_paragraphe' => 'Para criar parágrafos, basta deixar linhas em branco.',
292
+    'info_creation_rubrique' => 'Antes de poder escrever matérias, você deve criar, pelo menos, uma seção.<br />',
293
+    'info_creation_tables' => 'Criação das tabelas da base',
294
+    'info_creer_base' => '<b>Criar</b> uma nova base de dados:',
295
+    'info_dans_rubrique' => 'Na seção:',
296
+    'info_date_publication_anterieure' => 'Data de redação anterior:',
297
+    'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SITE:',
298
+    'info_derniere_etape' => 'Terminou!',
299
+    'info_descriptif' => 'Descrição:',
300
+    'info_desinstaller_plugin' => 'exclui os dados e desativa o plugin',
301
+    'info_discussion_cours' => 'Discussões em andamento',
302
+    'info_ecrire_article' => 'Antes de poder escrever matérias, você precisa criar pelo menos uma seção.',
303
+    'info_email_envoi' => 'Endereço de e-mail de envio (opcional)',
304
+    '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):',
305
+    'info_email_webmestre' => 'Endereço de e-mail do webmaster',
306
+    'info_envoi_email_automatique' => 'Envio automático de e-mails',
307
+    'info_envoyer_maintenant' => 'Enviar agora',
308
+    'info_etape_suivante' => 'Avançar para a próxima etapa',
309
+    'info_etape_suivante_1' => 'Você pode passar para a próxima etapa.',
310
+    'info_etape_suivante_2' => 'Você pode passar para a próxima etapa.',
311
+    'info_exceptions_proxy' => 'Exceções para o proxy',
312
+    'info_exportation_base' => 'exportação da base para @archive@',
313
+    '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.',
314
+    'info_fichiers_authent' => 'Arquivos de autenticação «.htpasswd»',
315
+    'info_forums_abo_invites' => 'O seu site comporta fóruns por assinatura; os visitantes são convidados a se registrar no site público.',
316
+    '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>',
317
+    '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>',
318
+    'info_gauche_auteurs' => 'Aqui, você encontra todos os autores do site.
319 319
 Os status dos autores é indicado pela côr dos ícones (administrador = verde; redator = amarelo).',
320
-	'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao site, são indicados por um ícone azul;
320
+    'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao site, são indicados por um ícone azul;
321 321
 os autores excluídos por um ícone cinza.',
322
-	'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).',
323
-	'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.',
324
-	'info_gauche_visiteurs_enregistres' => 'Você encontrará aqui os visitantes registrados na área pública do site (fóruns por assinatura).',
325
-	'info_generation_miniatures_images' => 'Geração de miniaturas das imagens',
326
-	'info_gerer_trad_objets' => '@objets@ : gerenciar os links de tradução',
327
-	'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.',
328
-	'info_hier' => 'ontem:',
329
-	'info_identification_publique' => 'Sua identificação pública...',
330
-	'info_image_process' => 'Por favor, selecione o melhor método de criação dos ícones, clicando na imagem correspondente.',
331
-	'info_image_process2' => 'Se nenhuma imagem está sendo exibida, o servidor que hospeda o seu site não foi configurado para utilizar essas ferramentas. Se você deseja usar essas funções, contate o responsável técnico e solicite as extensões «GD» ou «Imagick».',
332
-	'info_images_auto' => 'Imagens calculadas automaticamente',
333
-	'info_informations_personnelles' => 'Informações pessoais',
334
-	'info_inscription' => 'Inscrição online',
335
-	'info_inscription_automatique' => 'Inscrição automática de novos redatores',
336
-	'info_jeu_caractere' => 'Conjunto de caracteres do site',
337
-	'info_jours' => 'dias',
338
-	'info_laisser_champs_vides' => 'deixar estes campos vazios)',
339
-	'info_langues' => 'Idiomas do site',
340
-	'info_ldap_ok' => 'A autenticação LDAP está instalada.',
341
-	'info_lien_hypertexte' => 'Link hipertexto:',
342
-	'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada',
343
-	'info_liste_redacteurs_connectes' => 'Lista de redatores conectados',
344
-	'info_login_existant' => 'Este login já está cadastrado.',
345
-	'info_login_trop_court' => 'Login muito curto.',
346
-	'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.',
347
-	'info_logos' => 'Os ícones',
348
-	'info_maximum' => 'máximo:',
349
-	'info_meme_rubrique' => 'Na mesma seção',
350
-	'info_message_en_redaction' => 'Suas mensagens em fase de redação',
351
-	'info_message_technique' => 'Mensagem técnica:',
352
-	'info_messagerie_interne' => 'Mensageria interna',
353
-	'info_mise_a_niveau_base' => 'atualização da sua base SQL',
354
-	'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.}}',
355
-	'info_modification_enregistree' => 'Sua alteração foi gravada',
356
-	'info_modifier_auteur' => 'Editar o autor:',
357
-	'info_modifier_rubrique' => 'Editar a seção:',
358
-	'info_modifier_titre' => 'Editar: @titre@',
359
-	'info_mon_site_spip' => 'Meu site SPIP',
360
-	'info_moyenne' => 'média:',
361
-	'info_multi_cet_article' => 'Idioma desta matéria:',
362
-	'info_multi_langues_choisies' => 'Por favor, selecione a seguir os idiomas à disposição dos redatores do seu site.
322
+    '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).',
323
+    '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.',
324
+    'info_gauche_visiteurs_enregistres' => 'Você encontrará aqui os visitantes registrados na área pública do site (fóruns por assinatura).',
325
+    'info_generation_miniatures_images' => 'Geração de miniaturas das imagens',
326
+    'info_gerer_trad_objets' => '@objets@ : gerenciar os links de tradução',
327
+    '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.',
328
+    'info_hier' => 'ontem:',
329
+    'info_identification_publique' => 'Sua identificação pública...',
330
+    'info_image_process' => 'Por favor, selecione o melhor método de criação dos ícones, clicando na imagem correspondente.',
331
+    'info_image_process2' => 'Se nenhuma imagem está sendo exibida, o servidor que hospeda o seu site não foi configurado para utilizar essas ferramentas. Se você deseja usar essas funções, contate o responsável técnico e solicite as extensões «GD» ou «Imagick».',
332
+    'info_images_auto' => 'Imagens calculadas automaticamente',
333
+    'info_informations_personnelles' => 'Informações pessoais',
334
+    'info_inscription' => 'Inscrição online',
335
+    'info_inscription_automatique' => 'Inscrição automática de novos redatores',
336
+    'info_jeu_caractere' => 'Conjunto de caracteres do site',
337
+    'info_jours' => 'dias',
338
+    'info_laisser_champs_vides' => 'deixar estes campos vazios)',
339
+    'info_langues' => 'Idiomas do site',
340
+    'info_ldap_ok' => 'A autenticação LDAP está instalada.',
341
+    'info_lien_hypertexte' => 'Link hipertexto:',
342
+    'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada',
343
+    'info_liste_redacteurs_connectes' => 'Lista de redatores conectados',
344
+    'info_login_existant' => 'Este login já está cadastrado.',
345
+    'info_login_trop_court' => 'Login muito curto.',
346
+    'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.',
347
+    'info_logos' => 'Os ícones',
348
+    'info_maximum' => 'máximo:',
349
+    'info_meme_rubrique' => 'Na mesma seção',
350
+    'info_message_en_redaction' => 'Suas mensagens em fase de redação',
351
+    'info_message_technique' => 'Mensagem técnica:',
352
+    'info_messagerie_interne' => 'Mensageria interna',
353
+    'info_mise_a_niveau_base' => 'atualização da sua base SQL',
354
+    '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.}}',
355
+    'info_modification_enregistree' => 'Sua alteração foi gravada',
356
+    'info_modifier_auteur' => 'Editar o autor:',
357
+    'info_modifier_rubrique' => 'Editar a seção:',
358
+    'info_modifier_titre' => 'Editar: @titre@',
359
+    'info_mon_site_spip' => 'Meu site SPIP',
360
+    'info_moyenne' => 'média:',
361
+    'info_multi_cet_article' => 'Idioma desta matéria:',
362
+    'info_multi_langues_choisies' => 'Por favor, selecione a seguir os idiomas à disposição dos redatores do seu site.
363 363
 Os idiomas já utilizados no site (no topo da lista) não podem ser desativados.',
364
-	'info_multi_objets' => '@objets@ : ativar o menu de idioma',
365
-	'info_multi_secteurs' => '... apenas para as seções situadas na raiz?',
366
-	'info_nb_articles' => '@nb@ matérias',
367
-	'info_nb_auteurs' => '@nb@ autores',
368
-	'info_nb_messages' => '@nb@ mensagens',
369
-	'info_nb_mots_cles' => '@nb@ palavras-chave',
370
-	'info_nb_rubriques' => '@nb@ seções',
371
-	'info_nb_visiteurs' => '@nb@ visitantes',
372
-	'info_nom' => 'Nome',
373
-	'info_nom_destinataire' => 'Nome do destinatário',
374
-	'info_nom_pas_conforme' => 'tags HTML não são permitidas',
375
-	'info_nom_site' => 'Nome do seu site',
376
-	'info_nombre_articles' => '@nb_articles@ matérias,',
377
-	'info_nombre_rubriques' => '@nb_rubriques@ seções,',
378
-	'info_nombre_sites' => '@nb_sites@ sites,',
379
-	'info_non_deplacer' => 'Não mover...',
380
-	'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).',
381
-	'info_non_envoi_liste_nouveautes' => 'Não enviar a lista de novidades',
382
-	'info_non_modifiable' => 'não pode ser modificado',
383
-	'info_non_suppression_mot_cle' => 'Eu não quero excluir esta palavra-chave.',
384
-	'info_notes' => 'Observações',
385
-	'info_nouvel_article' => 'Nova matéria',
386
-	'info_nouvelle_traduction' => 'Nova tradução:',
387
-	'info_numero_article' => 'MATÉRIA NÚMERO:',
388
-	'info_obligatoire_02' => '(obrigatório)',
389
-	'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do site público',
390
-	'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição dos visitantes',
391
-	'info_options_avancees' => 'OPÇÕES AVANÇADAS',
392
-	'info_ou' => 'ou...',
393
-	'info_page_interdite' => 'Página não autorizada',
394
-	'info_par_nom' => 'por nome',
395
-	'info_par_nombre_article' => 'por número de matérias',
396
-	'info_par_statut' => 'por status',
397
-	'info_par_tri' => '’(por @tri@)’',
398
-	'info_passe_trop_court' => 'Senha muito curta.',
399
-	'info_passe_trop_court_car_pluriel' => 'A senha deve conter pelo menos @nb@ caracteres.',
400
-	'info_passes_identiques' => 'As duas senhas não são idênticas.',
401
-	'info_plus_cinq_car' => 'mais de 5 caracteres',
402
-	'info_plus_cinq_car_2' => '(Mais de 5 caracteres)',
403
-	'info_plus_trois_car' => '(Mais de 3 caracteres)',
404
-	'info_popularite' => 'popularidade: @popularite@; visitas: @visites@',
405
-	'info_post_scriptum' => 'Rodapé',
406
-	'info_post_scriptum_2' => 'Rodapé:',
407
-	'info_pour' => 'para',
408
-	'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?',
409
-	'info_procedez_par_etape' => 'proceder passo-a-passo',
410
-	'info_procedure_maj_version' => 'o procedimento de atualização deve ser rodado para adaptar a base de dados à nova versão do SPIP.',
411
-	'info_proxy_ok' => 'Teste do proxy bem sucedido',
412
-	'info_ps' => 'P.S.',
413
-	'info_publier' => 'publicar',
414
-	'info_publies' => 'Suas matérias publicadas online',
415
-	'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:',
416
-	'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>',
417
-	'info_qui_edite' => '@nom_auteur_modif@ trabalhou neste conteúdo há @date_diff@ minutos',
418
-	'info_racine_site' => 'Raiz do site',
419
-	'info_recharger_page' => 'Por favor, atualize esta página em alguns instantes.',
420
-	'info_recherche_auteur_zero' => 'Nenhum resultado para «@cherche_auteur@».',
421
-	'info_recommencer' => 'Por favor, recomece.',
422
-	'info_redacteur_1' => 'Redator',
423
-	'info_redacteur_2' => 'com acesso à área privada (<i>recomendado</i>)',
424
-	'info_redacteurs' => 'Redatores',
425
-	'info_redaction_en_cours' => 'EM FASE DE REDAÇÃO',
426
-	'info_redirection' => 'Redirecionamento',
427
-	'info_redirection_activee' => 'O redirecionamento foi ativado.',
428
-	'info_redirection_boucle' => 'Você tentou redirecionar a matéria para ela mesma.',
429
-	'info_redirection_desactivee' => 'O redirecionamento foi excluído.',
430
-	'info_refuses' => 'Suas matérias recusadas',
431
-	'info_reglage_ldap' => 'Opções: <b>Configuração da importação LDAP</b>',
432
-	'info_renvoi_article' => '<b>Redirecionamento.</b> Esta matéria redireciona para a página:',
433
-	'info_reserve_admin' => 'Apenas os administradores podem alterar este endereço.',
434
-	'info_restreindre_rubrique' => 'Restringir o gerenciamento à seção:',
435
-	'info_resultat_recherche' => 'Resultados da busca:',
436
-	'info_rubriques' => 'Seções',
437
-	'info_rubriques_02' => 'seções',
438
-	'info_rubriques_trouvees' => 'Seções encontradas',
439
-	'info_sans_titre' => 'Sem título',
440
-	'info_selection_chemin_acces' => '<b>Selecione</b> a seguir o caminho para acessar o diretório:',
441
-	'info_signatures' => 'assinaturas',
442
-	'info_site' => 'Site',
443
-	'info_site_2' => 'site:',
444
-	'info_site_min' => 'site',
445
-	'info_site_reference_2' => 'Site referenciado',
446
-	'info_site_web' => 'Website:',
447
-	'info_sites' => 'sites',
448
-	'info_sites_lies_mot' => 'Os sites referenciados vinculados a esta palavra-chave',
449
-	'info_sites_proxy' => 'Utilizar um proxy',
450
-	'info_sites_trouves' => 'Sites encontrados',
451
-	'info_sous_titre' => 'Subtítulo:',
452
-	'info_statut_administrateur' => 'Administrador',
453
-	'info_statut_auteur' => 'Status deste autor:',
454
-	'info_statut_auteur_2' => 'Eu sou',
455
-	'info_statut_auteur_a_confirmer' => 'Inscrição a confirmar',
456
-	'info_statut_auteur_autre' => 'Outro status:',
457
-	'info_statut_redacteur' => 'Redator',
458
-	'info_statut_utilisateurs_1' => 'Status padrão dos usuários importados',
459
-	'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.',
460
-	'info_suivi_activite' => 'Acompanhamento da atividade editorial',
461
-	'info_surtitre' => 'Sobretítulo:',
462
-	'info_syndication_integrale_1' => 'O seu site propõe arquivos de sindicação (ver «<a href="@url@">@titre@</a>»).',
463
-	'info_syndication_integrale_2' => 'Você deseja transmitir as matérias integralmente, ou difundir apenas um resumo de algumas centenas de caracteres?',
464
-	'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.',
465
-	'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.',
466
-	'info_taille_maximale_vignette' => 'Tamanho máximo dos ícones gerados pelo sistema:',
467
-	'info_terminer_installation' => 'Você pode agora terminar o procedimento de instalação padrão.',
468
-	'info_texte' => 'Texto',
469
-	'info_texte_explicatif' => 'Texto explicativo',
470
-	'info_texte_long' => '(o texto é longo: ele aparecerá em diversas partes que serão recombinadas após validação.)',
471
-	'info_texte_message' => 'Texto da sua mensagem',
472
-	'info_texte_message_02' => 'Texto da mensagem',
473
-	'info_titre' => 'Título:',
474
-	'info_total' => 'total:',
475
-	'info_tous_articles_en_redaction' => 'Todas as matérias em fase de redação',
476
-	'info_tous_articles_presents' => 'Todas as matérias publicadas nesta seção',
477
-	'info_tous_articles_refuses' => 'Todas as matérias recusadas',
478
-	'info_tous_les' => 'todos os:',
479
-	'info_tout_site' => 'Todo o site',
480
-	'info_tout_site2' => 'A matéria não foi traduzida para este idioma.',
481
-	'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.',
482
-	'info_tout_site4' => 'A matéria foi traduzida para este idioma e a tradução está em dia.',
483
-	'info_tout_site5' => 'Matéria original.',
484
-	'info_tout_site6' => '<b>Atenção:</b> apenas as matérias originais estão exibidas.
364
+    'info_multi_objets' => '@objets@ : ativar o menu de idioma',
365
+    'info_multi_secteurs' => '... apenas para as seções situadas na raiz?',
366
+    'info_nb_articles' => '@nb@ matérias',
367
+    'info_nb_auteurs' => '@nb@ autores',
368
+    'info_nb_messages' => '@nb@ mensagens',
369
+    'info_nb_mots_cles' => '@nb@ palavras-chave',
370
+    'info_nb_rubriques' => '@nb@ seções',
371
+    'info_nb_visiteurs' => '@nb@ visitantes',
372
+    'info_nom' => 'Nome',
373
+    'info_nom_destinataire' => 'Nome do destinatário',
374
+    'info_nom_pas_conforme' => 'tags HTML não são permitidas',
375
+    'info_nom_site' => 'Nome do seu site',
376
+    'info_nombre_articles' => '@nb_articles@ matérias,',
377
+    'info_nombre_rubriques' => '@nb_rubriques@ seções,',
378
+    'info_nombre_sites' => '@nb_sites@ sites,',
379
+    'info_non_deplacer' => 'Não mover...',
380
+    '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).',
381
+    'info_non_envoi_liste_nouveautes' => 'Não enviar a lista de novidades',
382
+    'info_non_modifiable' => 'não pode ser modificado',
383
+    'info_non_suppression_mot_cle' => 'Eu não quero excluir esta palavra-chave.',
384
+    'info_notes' => 'Observações',
385
+    'info_nouvel_article' => 'Nova matéria',
386
+    'info_nouvelle_traduction' => 'Nova tradução:',
387
+    'info_numero_article' => 'MATÉRIA NÚMERO:',
388
+    'info_obligatoire_02' => '(obrigatório)',
389
+    'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do site público',
390
+    'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição dos visitantes',
391
+    'info_options_avancees' => 'OPÇÕES AVANÇADAS',
392
+    'info_ou' => 'ou...',
393
+    'info_page_interdite' => 'Página não autorizada',
394
+    'info_par_nom' => 'por nome',
395
+    'info_par_nombre_article' => 'por número de matérias',
396
+    'info_par_statut' => 'por status',
397
+    'info_par_tri' => '’(por @tri@)’',
398
+    'info_passe_trop_court' => 'Senha muito curta.',
399
+    'info_passe_trop_court_car_pluriel' => 'A senha deve conter pelo menos @nb@ caracteres.',
400
+    'info_passes_identiques' => 'As duas senhas não são idênticas.',
401
+    'info_plus_cinq_car' => 'mais de 5 caracteres',
402
+    'info_plus_cinq_car_2' => '(Mais de 5 caracteres)',
403
+    'info_plus_trois_car' => '(Mais de 3 caracteres)',
404
+    'info_popularite' => 'popularidade: @popularite@; visitas: @visites@',
405
+    'info_post_scriptum' => 'Rodapé',
406
+    'info_post_scriptum_2' => 'Rodapé:',
407
+    'info_pour' => 'para',
408
+    '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?',
409
+    'info_procedez_par_etape' => 'proceder passo-a-passo',
410
+    'info_procedure_maj_version' => 'o procedimento de atualização deve ser rodado para adaptar a base de dados à nova versão do SPIP.',
411
+    'info_proxy_ok' => 'Teste do proxy bem sucedido',
412
+    'info_ps' => 'P.S.',
413
+    'info_publier' => 'publicar',
414
+    'info_publies' => 'Suas matérias publicadas online',
415
+    '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:',
416
+    '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>',
417
+    'info_qui_edite' => '@nom_auteur_modif@ trabalhou neste conteúdo há @date_diff@ minutos',
418
+    'info_racine_site' => 'Raiz do site',
419
+    'info_recharger_page' => 'Por favor, atualize esta página em alguns instantes.',
420
+    'info_recherche_auteur_zero' => 'Nenhum resultado para «@cherche_auteur@».',
421
+    'info_recommencer' => 'Por favor, recomece.',
422
+    'info_redacteur_1' => 'Redator',
423
+    'info_redacteur_2' => 'com acesso à área privada (<i>recomendado</i>)',
424
+    'info_redacteurs' => 'Redatores',
425
+    'info_redaction_en_cours' => 'EM FASE DE REDAÇÃO',
426
+    'info_redirection' => 'Redirecionamento',
427
+    'info_redirection_activee' => 'O redirecionamento foi ativado.',
428
+    'info_redirection_boucle' => 'Você tentou redirecionar a matéria para ela mesma.',
429
+    'info_redirection_desactivee' => 'O redirecionamento foi excluído.',
430
+    'info_refuses' => 'Suas matérias recusadas',
431
+    'info_reglage_ldap' => 'Opções: <b>Configuração da importação LDAP</b>',
432
+    'info_renvoi_article' => '<b>Redirecionamento.</b> Esta matéria redireciona para a página:',
433
+    'info_reserve_admin' => 'Apenas os administradores podem alterar este endereço.',
434
+    'info_restreindre_rubrique' => 'Restringir o gerenciamento à seção:',
435
+    'info_resultat_recherche' => 'Resultados da busca:',
436
+    'info_rubriques' => 'Seções',
437
+    'info_rubriques_02' => 'seções',
438
+    'info_rubriques_trouvees' => 'Seções encontradas',
439
+    'info_sans_titre' => 'Sem título',
440
+    'info_selection_chemin_acces' => '<b>Selecione</b> a seguir o caminho para acessar o diretório:',
441
+    'info_signatures' => 'assinaturas',
442
+    'info_site' => 'Site',
443
+    'info_site_2' => 'site:',
444
+    'info_site_min' => 'site',
445
+    'info_site_reference_2' => 'Site referenciado',
446
+    'info_site_web' => 'Website:',
447
+    'info_sites' => 'sites',
448
+    'info_sites_lies_mot' => 'Os sites referenciados vinculados a esta palavra-chave',
449
+    'info_sites_proxy' => 'Utilizar um proxy',
450
+    'info_sites_trouves' => 'Sites encontrados',
451
+    'info_sous_titre' => 'Subtítulo:',
452
+    'info_statut_administrateur' => 'Administrador',
453
+    'info_statut_auteur' => 'Status deste autor:',
454
+    'info_statut_auteur_2' => 'Eu sou',
455
+    'info_statut_auteur_a_confirmer' => 'Inscrição a confirmar',
456
+    'info_statut_auteur_autre' => 'Outro status:',
457
+    'info_statut_redacteur' => 'Redator',
458
+    'info_statut_utilisateurs_1' => 'Status padrão dos usuários importados',
459
+    '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.',
460
+    'info_suivi_activite' => 'Acompanhamento da atividade editorial',
461
+    'info_surtitre' => 'Sobretítulo:',
462
+    'info_syndication_integrale_1' => 'O seu site propõe arquivos de sindicação (ver «<a href="@url@">@titre@</a>»).',
463
+    'info_syndication_integrale_2' => 'Você deseja transmitir as matérias integralmente, ou difundir apenas um resumo de algumas centenas de caracteres?',
464
+    '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.',
465
+    '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.',
466
+    'info_taille_maximale_vignette' => 'Tamanho máximo dos ícones gerados pelo sistema:',
467
+    'info_terminer_installation' => 'Você pode agora terminar o procedimento de instalação padrão.',
468
+    'info_texte' => 'Texto',
469
+    'info_texte_explicatif' => 'Texto explicativo',
470
+    'info_texte_long' => '(o texto é longo: ele aparecerá em diversas partes que serão recombinadas após validação.)',
471
+    'info_texte_message' => 'Texto da sua mensagem',
472
+    'info_texte_message_02' => 'Texto da mensagem',
473
+    'info_titre' => 'Título:',
474
+    'info_total' => 'total:',
475
+    'info_tous_articles_en_redaction' => 'Todas as matérias em fase de redação',
476
+    'info_tous_articles_presents' => 'Todas as matérias publicadas nesta seção',
477
+    'info_tous_articles_refuses' => 'Todas as matérias recusadas',
478
+    'info_tous_les' => 'todos os:',
479
+    'info_tout_site' => 'Todo o site',
480
+    'info_tout_site2' => 'A matéria não foi traduzida para este idioma.',
481
+    '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.',
482
+    'info_tout_site4' => 'A matéria foi traduzida para este idioma e a tradução está em dia.',
483
+    'info_tout_site5' => 'Matéria original.',
484
+    'info_tout_site6' => '<b>Atenção:</b> apenas as matérias originais estão exibidas.
485 485
 As traduções estão associadas ao original, numa côr que indica o seu status:',
486
-	'info_traductions' => 'Traduções',
487
-	'info_travail_colaboratif' => 'Trabalho colaborativo nas matérias',
488
-	'info_un_article' => 'uma matéria,',
489
-	'info_un_site' => 'um site,',
490
-	'info_une_rubrique' => 'uma seção,',
491
-	'info_une_rubrique_02' => '1 seção',
492
-	'info_url' => 'URL:',
493
-	'info_url_proxy' => 'URL do proxy',
494
-	'info_url_proxy_pas_conforme' => 'O URL do proxy não é válido.',
495
-	'info_url_site_pas_conforme' => 'O URL do site não é válido.',
496
-	'info_url_test_proxy' => 'URL de teste',
497
-	'info_urlref' => 'Link hipertexto:',
498
-	'info_utilisation_spip' => 'Você pode agora começar a utilizar o sistema de publicação assistida...',
499
-	'info_visites_par_mois' => 'Exibir por mês:',
500
-	'info_visiteur_1' => 'Visitante',
501
-	'info_visiteur_2' => 'do site público',
502
-	'info_visiteurs' => 'Visitantes',
503
-	'info_visiteurs_02' => 'Visitantes do site público',
504
-	'info_webmestre_forces' => 'Os webmasters são definidos em <tt>@file_options@</tt>.',
505
-	'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem:',
506
-	'install_connect_ok' => 'A nova base de dados foi corretamente declarada sob o nome de servidor @connect@.',
507
-	'install_echec_annonce' => 'A instalação irá, provavelmente, falhar, ou levar a um site que não funciona...',
508
-	'install_extension_mbstring' => 'O SPIP não funciona com:',
509
-	'install_extension_php_obligatoire' => 'O SPIP exige a extensão php:',
510
-	'install_login_base_hebergeur' => 'Login de conexão atribuído pelo serviço de hospedagem:',
511
-	'install_nom_base_hebergeur' => 'Nome da base atribuído pelo serviço de hospedagem:',
512
-	'install_pas_table' => 'Base atualmente sem tabelas',
513
-	'install_pass_base_hebergeur' => 'Senha de conexão atribuída pelo serviço de hospedagem',
514
-	'install_php_extension' => 'As extensões a seguir estão faltando: @extensions@',
515
-	'install_php_version' => 'PHP versão @version@ é insuficiente (mínimo = @minimum@)',
516
-	'install_php_version_max' => 'A versão @version@ do PHP é muito recente (máximo = @maximum@)',
517
-	'install_select_langue' => 'Escolha um idioma e clique no botão «avançar» para iniciar o procedimento de instalação.',
518
-	'install_select_type_db' => 'Indicar o tipo de base de dados:',
519
-	'install_select_type_mysql' => 'MySQL',
520
-	'install_select_type_pg' => 'PostgreSQL',
521
-	'install_select_type_sqlite2' => 'SQLite 2',
522
-	'install_select_type_sqlite3' => 'SQLite 3',
523
-	'install_serveur_hebergeur' => 'Servidor de base de dados atribuído pelo serviço de hospedagem',
524
-	'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:',
525
-	'install_tables_base' => 'Tabelas da base',
526
-	'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (a mais comum), e <b>SQLite</b>.',
527
-	'install_types_db_connus_avertissement' => 'O suporte ao <b>PostgreSQL</b> é também proposto a título experimental',
528
-	'instituer_erreur_statut_a_change' => 'O status já foi alterado',
529
-	'instituer_erreur_statut_non_autorise' => 'Você não pode escolher este status',
530
-	'intem_redacteur' => 'redator',
531
-	'intitule_licence' => 'Licença',
532
-	'item_accepter_inscriptions' => 'Aceitar as inscrições',
533
-	'item_activer_messages_avertissement' => 'Ativar as mensagens de aviso',
534
-	'item_administrateur_2' => 'administrador',
535
-	'item_afficher_calendrier' => 'Exibir no calendário',
536
-	'item_autoriser_syndication_integrale' => 'Difundir a íntegra das matérias nos arquivos de sindicação',
537
-	'item_choix_administrateurs' => 'os administradores',
538
-	'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.',
539
-	'item_choix_non_generation_miniature' => 'Não gerar as miniaturas das imagens.',
540
-	'item_choix_redacteurs' => 'os redatores',
541
-	'item_choix_visiteurs' => 'os visitantes do site público',
542
-	'item_creer_fichiers_authent' => 'Criar os arquivos .htpasswd',
543
-	'item_login' => 'Login',
544
-	'item_messagerie_agenda' => 'Ativar as mesagens internas e a agenda',
545
-	'item_mots_cles_association_articles' => 'às matérias',
546
-	'item_mots_cles_association_rubriques' => 'às seções',
547
-	'item_mots_cles_association_sites' => 'aos sites referenciados ou sindicados.',
548
-	'item_non' => 'Não',
549
-	'item_non_accepter_inscriptions' => 'Não aceitar inscrições',
550
-	'item_non_activer_messages_avertissement' => 'Sem mensagens de aviso',
551
-	'item_non_afficher_calendrier' => 'Não exibir no calendário',
552
-	'item_non_autoriser_syndication_integrale' => 'Difundir apenas um resumo',
553
-	'item_non_creer_fichiers_authent' => 'Não criar os arquivos',
554
-	'item_non_messagerie_agenda' => 'Desativar as mensagens internas e a agenda',
555
-	'item_non_publier_articles' => 'Não publicar as matérias antes da data de publicação fixada.',
556
-	'item_nouvel_auteur' => 'Novo autor',
557
-	'item_nouvelle_rubrique' => 'Nova seção',
558
-	'item_oui' => 'Sim',
559
-	'item_publier_articles' => 'Publicar as matérias seja qual for a sua data de publicação.',
560
-	'item_reponse_article' => 'Resposta à matéria',
561
-	'item_visiteur' => 'Visitante',
486
+    'info_traductions' => 'Traduções',
487
+    'info_travail_colaboratif' => 'Trabalho colaborativo nas matérias',
488
+    'info_un_article' => 'uma matéria,',
489
+    'info_un_site' => 'um site,',
490
+    'info_une_rubrique' => 'uma seção,',
491
+    'info_une_rubrique_02' => '1 seção',
492
+    'info_url' => 'URL:',
493
+    'info_url_proxy' => 'URL do proxy',
494
+    'info_url_proxy_pas_conforme' => 'O URL do proxy não é válido.',
495
+    'info_url_site_pas_conforme' => 'O URL do site não é válido.',
496
+    'info_url_test_proxy' => 'URL de teste',
497
+    'info_urlref' => 'Link hipertexto:',
498
+    'info_utilisation_spip' => 'Você pode agora começar a utilizar o sistema de publicação assistida...',
499
+    'info_visites_par_mois' => 'Exibir por mês:',
500
+    'info_visiteur_1' => 'Visitante',
501
+    'info_visiteur_2' => 'do site público',
502
+    'info_visiteurs' => 'Visitantes',
503
+    'info_visiteurs_02' => 'Visitantes do site público',
504
+    'info_webmestre_forces' => 'Os webmasters são definidos em <tt>@file_options@</tt>.',
505
+    'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem:',
506
+    'install_connect_ok' => 'A nova base de dados foi corretamente declarada sob o nome de servidor @connect@.',
507
+    'install_echec_annonce' => 'A instalação irá, provavelmente, falhar, ou levar a um site que não funciona...',
508
+    'install_extension_mbstring' => 'O SPIP não funciona com:',
509
+    'install_extension_php_obligatoire' => 'O SPIP exige a extensão php:',
510
+    'install_login_base_hebergeur' => 'Login de conexão atribuído pelo serviço de hospedagem:',
511
+    'install_nom_base_hebergeur' => 'Nome da base atribuído pelo serviço de hospedagem:',
512
+    'install_pas_table' => 'Base atualmente sem tabelas',
513
+    'install_pass_base_hebergeur' => 'Senha de conexão atribuída pelo serviço de hospedagem',
514
+    'install_php_extension' => 'As extensões a seguir estão faltando: @extensions@',
515
+    'install_php_version' => 'PHP versão @version@ é insuficiente (mínimo = @minimum@)',
516
+    'install_php_version_max' => 'A versão @version@ do PHP é muito recente (máximo = @maximum@)',
517
+    'install_select_langue' => 'Escolha um idioma e clique no botão «avançar» para iniciar o procedimento de instalação.',
518
+    'install_select_type_db' => 'Indicar o tipo de base de dados:',
519
+    'install_select_type_mysql' => 'MySQL',
520
+    'install_select_type_pg' => 'PostgreSQL',
521
+    'install_select_type_sqlite2' => 'SQLite 2',
522
+    'install_select_type_sqlite3' => 'SQLite 3',
523
+    'install_serveur_hebergeur' => 'Servidor de base de dados atribuído pelo serviço de hospedagem',
524
+    'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:',
525
+    'install_tables_base' => 'Tabelas da base',
526
+    'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (a mais comum), e <b>SQLite</b>.',
527
+    'install_types_db_connus_avertissement' => 'O suporte ao <b>PostgreSQL</b> é também proposto a título experimental',
528
+    'instituer_erreur_statut_a_change' => 'O status já foi alterado',
529
+    'instituer_erreur_statut_non_autorise' => 'Você não pode escolher este status',
530
+    'intem_redacteur' => 'redator',
531
+    'intitule_licence' => 'Licença',
532
+    'item_accepter_inscriptions' => 'Aceitar as inscrições',
533
+    'item_activer_messages_avertissement' => 'Ativar as mensagens de aviso',
534
+    'item_administrateur_2' => 'administrador',
535
+    'item_afficher_calendrier' => 'Exibir no calendário',
536
+    'item_autoriser_syndication_integrale' => 'Difundir a íntegra das matérias nos arquivos de sindicação',
537
+    'item_choix_administrateurs' => 'os administradores',
538
+    'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.',
539
+    'item_choix_non_generation_miniature' => 'Não gerar as miniaturas das imagens.',
540
+    'item_choix_redacteurs' => 'os redatores',
541
+    'item_choix_visiteurs' => 'os visitantes do site público',
542
+    'item_creer_fichiers_authent' => 'Criar os arquivos .htpasswd',
543
+    'item_login' => 'Login',
544
+    'item_messagerie_agenda' => 'Ativar as mesagens internas e a agenda',
545
+    'item_mots_cles_association_articles' => 'às matérias',
546
+    'item_mots_cles_association_rubriques' => 'às seções',
547
+    'item_mots_cles_association_sites' => 'aos sites referenciados ou sindicados.',
548
+    'item_non' => 'Não',
549
+    'item_non_accepter_inscriptions' => 'Não aceitar inscrições',
550
+    'item_non_activer_messages_avertissement' => 'Sem mensagens de aviso',
551
+    'item_non_afficher_calendrier' => 'Não exibir no calendário',
552
+    'item_non_autoriser_syndication_integrale' => 'Difundir apenas um resumo',
553
+    'item_non_creer_fichiers_authent' => 'Não criar os arquivos',
554
+    'item_non_messagerie_agenda' => 'Desativar as mensagens internas e a agenda',
555
+    'item_non_publier_articles' => 'Não publicar as matérias antes da data de publicação fixada.',
556
+    'item_nouvel_auteur' => 'Novo autor',
557
+    'item_nouvelle_rubrique' => 'Nova seção',
558
+    'item_oui' => 'Sim',
559
+    'item_publier_articles' => 'Publicar as matérias seja qual for a sua data de publicação.',
560
+    'item_reponse_article' => 'Resposta à matéria',
561
+    'item_visiteur' => 'Visitante',
562 562
 
563
-	// J
564
-	'jour_non_connu_nc' => 'n.c.',
563
+    // J
564
+    'jour_non_connu_nc' => 'n.c.',
565 565
 
566
-	// L
567
-	'label_bando_outils' => 'Barra de ferramentas',
568
-	'label_bando_outils_afficher' => 'Exibir as ferramentas',
569
-	'label_bando_outils_masquer' => 'Esconder as ferramentas',
570
-	'label_choix_langue' => 'Escolha o seu idioma',
571
-	'label_langue' => 'Idioma',
572
-	'label_nom_fichier_connect' => 'Informe o nome usado por este servidor',
573
-	'label_slogan_site' => 'Slogan do site',
574
-	'label_taille_ecran' => 'Largura da tela',
575
-	'label_texte_et_icones_navigation' => 'Menu de navegação',
576
-	'label_texte_et_icones_page' => 'Exibição na página',
577
-	'ldap_correspondance' => 'herança do campo @champ@',
578
-	'ldap_correspondance_1' => 'Herança dos campos LDAP',
579
-	'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.',
580
-	'lien_ajouter_auteur' => 'Incluir este autor',
581
-	'lien_ajouter_une_rubrique' => 'Incluir esta seção',
582
-	'lien_email' => 'e-mail',
583
-	'lien_nom_site' => 'NOME DO SITE:',
584
-	'lien_rapide_contenu' => 'Ir para o conteúdo',
585
-	'lien_rapide_navigation' => 'Ir para a navegação',
586
-	'lien_rapide_recherche' => 'Ir para a busca',
587
-	'lien_retirer_auteur' => 'Retirar o autor',
588
-	'lien_retirer_rubrique' => 'Excluir a seção',
589
-	'lien_retirer_tous_auteurs' => 'Retirar todos os autores',
590
-	'lien_retirer_toutes_rubriques' => 'Retirar todas as seções',
591
-	'lien_site' => 'site',
592
-	'lien_tout_decocher' => 'Desmarcar tudo',
593
-	'lien_tout_deplier' => 'Expandir tudo',
594
-	'lien_tout_replier' => 'Retrair tudo',
595
-	'lien_tout_supprimer' => 'Excluir tudo',
596
-	'lien_trier_nom' => 'Ordenar pelo nome',
597
-	'lien_trier_nombre_articles' => 'Ordenar por número de matérias',
598
-	'lien_trier_statut' => 'Ordenar pelo status',
599
-	'lien_voir_en_ligne' => 'VER ONLINE:',
600
-	'logo_article' => 'Ícone da matéria',
601
-	'logo_auteur' => 'Ícone do autor',
602
-	'logo_rubrique' => 'Ícone da seção',
603
-	'logo_site' => 'Ícone deste site',
604
-	'logo_standard_rubrique' => 'Ícone padrão das seções',
605
-	'logo_survol' => 'Ícone para mouseOver',
566
+    // L
567
+    'label_bando_outils' => 'Barra de ferramentas',
568
+    'label_bando_outils_afficher' => 'Exibir as ferramentas',
569
+    'label_bando_outils_masquer' => 'Esconder as ferramentas',
570
+    'label_choix_langue' => 'Escolha o seu idioma',
571
+    'label_langue' => 'Idioma',
572
+    'label_nom_fichier_connect' => 'Informe o nome usado por este servidor',
573
+    'label_slogan_site' => 'Slogan do site',
574
+    'label_taille_ecran' => 'Largura da tela',
575
+    'label_texte_et_icones_navigation' => 'Menu de navegação',
576
+    'label_texte_et_icones_page' => 'Exibição na página',
577
+    'ldap_correspondance' => 'herança do campo @champ@',
578
+    'ldap_correspondance_1' => 'Herança dos campos LDAP',
579
+    '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.',
580
+    'lien_ajouter_auteur' => 'Incluir este autor',
581
+    'lien_ajouter_une_rubrique' => 'Incluir esta seção',
582
+    'lien_email' => 'e-mail',
583
+    'lien_nom_site' => 'NOME DO SITE:',
584
+    'lien_rapide_contenu' => 'Ir para o conteúdo',
585
+    'lien_rapide_navigation' => 'Ir para a navegação',
586
+    'lien_rapide_recherche' => 'Ir para a busca',
587
+    'lien_retirer_auteur' => 'Retirar o autor',
588
+    'lien_retirer_rubrique' => 'Excluir a seção',
589
+    'lien_retirer_tous_auteurs' => 'Retirar todos os autores',
590
+    'lien_retirer_toutes_rubriques' => 'Retirar todas as seções',
591
+    'lien_site' => 'site',
592
+    'lien_tout_decocher' => 'Desmarcar tudo',
593
+    'lien_tout_deplier' => 'Expandir tudo',
594
+    'lien_tout_replier' => 'Retrair tudo',
595
+    'lien_tout_supprimer' => 'Excluir tudo',
596
+    'lien_trier_nom' => 'Ordenar pelo nome',
597
+    'lien_trier_nombre_articles' => 'Ordenar por número de matérias',
598
+    'lien_trier_statut' => 'Ordenar pelo status',
599
+    'lien_voir_en_ligne' => 'VER ONLINE:',
600
+    'logo_article' => 'Ícone da matéria',
601
+    'logo_auteur' => 'Ícone do autor',
602
+    'logo_rubrique' => 'Ícone da seção',
603
+    'logo_site' => 'Ícone deste site',
604
+    'logo_standard_rubrique' => 'Ícone padrão das seções',
605
+    'logo_survol' => 'Ícone para mouseOver',
606 606
 
607
-	// M
608
-	'menu_aide_installation_choix_base' => 'Seleção da sua base',
609
-	'module_fichier_langue' => 'Arquivo de idioma',
610
-	'module_raccourci' => 'Atalho',
611
-	'module_texte_affiche' => 'Texto exibido',
612
-	'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.',
613
-	'module_texte_traduction' => 'O arquivo de idioma «@module@» está disponível em:',
614
-	'mois_non_connu' => 'desconhecido',
607
+    // M
608
+    'menu_aide_installation_choix_base' => 'Seleção da sua base',
609
+    'module_fichier_langue' => 'Arquivo de idioma',
610
+    'module_raccourci' => 'Atalho',
611
+    'module_texte_affiche' => 'Texto exibido',
612
+    '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.',
613
+    'module_texte_traduction' => 'O arquivo de idioma «@module@» está disponível em:',
614
+    'mois_non_connu' => 'desconhecido',
615 615
 
616
-	// N
617
-	'nouvelle_version_spip' => 'A versão @version@ do SPIP está disponível',
618
-	'nouvelle_version_spip_majeure' => 'Uma nova versão SPIP @version@ está disponível',
616
+    // N
617
+    'nouvelle_version_spip' => 'A versão @version@ do SPIP está disponível',
618
+    'nouvelle_version_spip_majeure' => 'Uma nova versão SPIP @version@ está disponível',
619 619
 
620
-	// O
621
-	'onglet_contenu' => 'Conteúdo',
622
-	'onglet_declarer_une_autre_base' => 'Configurar outra base',
623
-	'onglet_discuter' => 'Discutir',
624
-	'onglet_interactivite' => 'Interatividade',
625
-	'onglet_proprietes' => 'Propriedades',
626
-	'onglet_repartition_actuelle' => 'atualmente',
627
-	'onglet_sous_rubriques' => 'Subseções',
620
+    // O
621
+    'onglet_contenu' => 'Conteúdo',
622
+    'onglet_declarer_une_autre_base' => 'Configurar outra base',
623
+    'onglet_discuter' => 'Discutir',
624
+    'onglet_interactivite' => 'Interatividade',
625
+    'onglet_proprietes' => 'Propriedades',
626
+    'onglet_repartition_actuelle' => 'atualmente',
627
+    'onglet_sous_rubriques' => 'Subseções',
628 628
 
629
-	// P
630
-	'page_pas_proxy' => 'Esta página não deve passar pelo proxy',
631
-	'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@)',
632
-	'phpinfo' => 'Configuração PHP',
633
-	'plugin_charge_paquet' => 'Carregamento do pacote @name@',
634
-	'plugin_charger' => 'Transferir',
635
-	'plugin_erreur_charger' => 'erro: não foi possível carregar @zip@',
636
-	'plugin_erreur_droit1' => 'O diretório <code>@dest@</code> não está acessível para escrita.',
637
-	'plugin_erreur_droit2' => 'Por favor, verifique os direitos deste diretório (e criá-lo, caso não exista), ou instalar os arquivos por FTP.',
638
-	'plugin_erreur_zip' => 'falha pclzip: erro @status@',
639
-	'plugin_etat_developpement' => 'em desenvolvimento',
640
-	'plugin_etat_experimental' => 'experimental',
641
-	'plugin_etat_stable' => 'estável',
642
-	'plugin_etat_test' => 'em teste',
643
-	'plugin_impossible_activer' => 'Não foi possível ativar o plugin @plugin@',
644
-	'plugin_info_automatique1' => 'Se você deseja autorizar a instalaçào automática dos plugins, por favor:',
645
-	'plugin_info_automatique1_lib' => 'Se você deseja autorizar a instalação automática desta biblioteca, por favor:',
646
-	'plugin_info_automatique2' => 'crie um diretório <code>@rep@</code> ;',
647
-	'plugin_info_automatique3' => 'verifique se o servidor está autorizado a escrever neste diretório',
648
-	'plugin_info_automatique_creer' => 'a ser criado na raiz do site.',
649
-	'plugin_info_automatique_exemples' => 'exemplos:',
650
-	'plugin_info_automatique_ftp' => 'Você pode instalar os plugins, por FTP, no diretório <tt>@rep@</tt>',
651
-	'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.',
652
-	'plugin_info_automatique_liste' => 'Suas listas de plugins:',
653
-	'plugin_info_automatique_liste_officielle' => 'os plugins oficiais',
654
-	'plugin_info_automatique_liste_update' => 'Atualizar as listas',
655
-	'plugin_info_automatique_ou' => 'ou...',
656
-	'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.',
657
-	'plugin_info_credit' => 'Créditos',
658
-	'plugin_info_erreur_xml' => 'A declaração deste plugin está incorreta',
659
-	'plugin_info_install_ok' => 'Instalação bem sucedida',
660
-	'plugin_info_necessite' => 'Requer:',
661
-	'plugin_info_non_compatible_spip' => 'Este plugin não é compatível com esta versão do SPIP',
662
-	'plugin_info_plugins_dist_1' => 'Os plugins abaixo são carregados e ativados no diretório @plugins_dist@.',
663
-	'plugin_info_plugins_dist_2' => 'Eles não são desativáveis.',
664
-	'plugin_info_telecharger' => 'transferir de @url@ e instalar em @rep@',
665
-	'plugin_info_upgrade_ok' => 'Atualização bem sucedida',
666
-	'plugin_librairies_installees' => 'Bibliotecas instaladas',
667
-	'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ na versão @version@.',
668
-	'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@',
669
-	'plugin_necessite_lib' => 'Este plugin precisa da biblioteca @lib@',
670
-	'plugin_necessite_php' => 'Requer @plugin@ na versão @version@.',
671
-	'plugin_necessite_plugin' => 'Precisa do plugin @plugin@, na versão @version@.',
672
-	'plugin_necessite_plugin_sans_version' => 'Precisa do plugin @plugin@',
673
-	'plugin_necessite_spip' => 'É necessário o SPIP na versão @version@, pelo menos.',
674
-	'plugin_source' => 'fonte: ',
675
-	'plugin_titre_automatique' => 'Instalação automática',
676
-	'plugin_titre_automatique_ajouter' => 'Incluir plugins',
677
-	'plugin_titre_installation' => 'Instalação do plugin @plugin@',
678
-	'plugin_titre_modifier' => 'Meus plugins',
679
-	'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.',
680
-	'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.',
681
-	'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.',
682
-	'plugin_zip_active' => 'Continue para o ativar',
683
-	'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.',
684
-	'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista',
685
-	'plugin_zip_content' => 'Ele contém os arquivos a seguir (@taille@),<br />prontos para serem instalados no diretório <code>@rep@</code>',
686
-	'plugin_zip_installe_finie' => 'O arquivo @zip@ foi descompactado e instalado.',
687
-	'plugin_zip_installe_rep_finie' => 'O arquivo @zip@ foi descompactado e instalado no diretório @rep@',
688
-	'plugin_zip_installer' => 'Você pode, agora, instalá-lo.',
689
-	'plugin_zip_telecharge' => 'O arquivo @zip@ foi transferido',
690
-	'plugins_actif_aucun' => 'Nenhum plugin ativado.',
691
-	'plugins_actif_un' => 'Um plugin ativado.',
692
-	'plugins_actifs' => '@count@ plugins ativados.',
693
-	'plugins_actifs_liste' => 'Ativos',
694
-	'plugins_compte' => '@count@ plugins',
695
-	'plugins_disponible_un' => 'Um plugin disponível.',
696
-	'plugins_disponibles' => '@count@ plugins disponiveis.',
697
-	'plugins_erreur' => 'Erro nos plugins: @plugins@',
698
-	'plugins_liste' => 'Lista dos plugins',
699
-	'plugins_liste_dist' => 'Plugins bloqueados',
700
-	'plugins_recents' => 'Plugins recentes.',
701
-	'plugins_tous_liste' => 'Todos',
702
-	'plugins_vue_hierarchie' => 'Hierarquia',
703
-	'plugins_vue_liste' => 'Lista',
704
-	'protocole_ldap' => 'Versão do protocolo:',
629
+    // P
630
+    'page_pas_proxy' => 'Esta página não deve passar pelo proxy',
631
+    '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@)',
632
+    'phpinfo' => 'Configuração PHP',
633
+    'plugin_charge_paquet' => 'Carregamento do pacote @name@',
634
+    'plugin_charger' => 'Transferir',
635
+    'plugin_erreur_charger' => 'erro: não foi possível carregar @zip@',
636
+    'plugin_erreur_droit1' => 'O diretório <code>@dest@</code> não está acessível para escrita.',
637
+    'plugin_erreur_droit2' => 'Por favor, verifique os direitos deste diretório (e criá-lo, caso não exista), ou instalar os arquivos por FTP.',
638
+    'plugin_erreur_zip' => 'falha pclzip: erro @status@',
639
+    'plugin_etat_developpement' => 'em desenvolvimento',
640
+    'plugin_etat_experimental' => 'experimental',
641
+    'plugin_etat_stable' => 'estável',
642
+    'plugin_etat_test' => 'em teste',
643
+    'plugin_impossible_activer' => 'Não foi possível ativar o plugin @plugin@',
644
+    'plugin_info_automatique1' => 'Se você deseja autorizar a instalaçào automática dos plugins, por favor:',
645
+    'plugin_info_automatique1_lib' => 'Se você deseja autorizar a instalação automática desta biblioteca, por favor:',
646
+    'plugin_info_automatique2' => 'crie um diretório <code>@rep@</code> ;',
647
+    'plugin_info_automatique3' => 'verifique se o servidor está autorizado a escrever neste diretório',
648
+    'plugin_info_automatique_creer' => 'a ser criado na raiz do site.',
649
+    'plugin_info_automatique_exemples' => 'exemplos:',
650
+    'plugin_info_automatique_ftp' => 'Você pode instalar os plugins, por FTP, no diretório <tt>@rep@</tt>',
651
+    '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.',
652
+    'plugin_info_automatique_liste' => 'Suas listas de plugins:',
653
+    'plugin_info_automatique_liste_officielle' => 'os plugins oficiais',
654
+    'plugin_info_automatique_liste_update' => 'Atualizar as listas',
655
+    'plugin_info_automatique_ou' => 'ou...',
656
+    '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.',
657
+    'plugin_info_credit' => 'Créditos',
658
+    'plugin_info_erreur_xml' => 'A declaração deste plugin está incorreta',
659
+    'plugin_info_install_ok' => 'Instalação bem sucedida',
660
+    'plugin_info_necessite' => 'Requer:',
661
+    'plugin_info_non_compatible_spip' => 'Este plugin não é compatível com esta versão do SPIP',
662
+    'plugin_info_plugins_dist_1' => 'Os plugins abaixo são carregados e ativados no diretório @plugins_dist@.',
663
+    'plugin_info_plugins_dist_2' => 'Eles não são desativáveis.',
664
+    'plugin_info_telecharger' => 'transferir de @url@ e instalar em @rep@',
665
+    'plugin_info_upgrade_ok' => 'Atualização bem sucedida',
666
+    'plugin_librairies_installees' => 'Bibliotecas instaladas',
667
+    'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ na versão @version@.',
668
+    'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@',
669
+    'plugin_necessite_lib' => 'Este plugin precisa da biblioteca @lib@',
670
+    'plugin_necessite_php' => 'Requer @plugin@ na versão @version@.',
671
+    'plugin_necessite_plugin' => 'Precisa do plugin @plugin@, na versão @version@.',
672
+    'plugin_necessite_plugin_sans_version' => 'Precisa do plugin @plugin@',
673
+    'plugin_necessite_spip' => 'É necessário o SPIP na versão @version@, pelo menos.',
674
+    'plugin_source' => 'fonte: ',
675
+    'plugin_titre_automatique' => 'Instalação automática',
676
+    'plugin_titre_automatique_ajouter' => 'Incluir plugins',
677
+    'plugin_titre_installation' => 'Instalação do plugin @plugin@',
678
+    'plugin_titre_modifier' => 'Meus plugins',
679
+    'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.',
680
+    'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.',
681
+    'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.',
682
+    'plugin_zip_active' => 'Continue para o ativar',
683
+    '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.',
684
+    'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista',
685
+    'plugin_zip_content' => 'Ele contém os arquivos a seguir (@taille@),<br />prontos para serem instalados no diretório <code>@rep@</code>',
686
+    'plugin_zip_installe_finie' => 'O arquivo @zip@ foi descompactado e instalado.',
687
+    'plugin_zip_installe_rep_finie' => 'O arquivo @zip@ foi descompactado e instalado no diretório @rep@',
688
+    'plugin_zip_installer' => 'Você pode, agora, instalá-lo.',
689
+    'plugin_zip_telecharge' => 'O arquivo @zip@ foi transferido',
690
+    'plugins_actif_aucun' => 'Nenhum plugin ativado.',
691
+    'plugins_actif_un' => 'Um plugin ativado.',
692
+    'plugins_actifs' => '@count@ plugins ativados.',
693
+    'plugins_actifs_liste' => 'Ativos',
694
+    'plugins_compte' => '@count@ plugins',
695
+    'plugins_disponible_un' => 'Um plugin disponível.',
696
+    'plugins_disponibles' => '@count@ plugins disponiveis.',
697
+    'plugins_erreur' => 'Erro nos plugins: @plugins@',
698
+    'plugins_liste' => 'Lista dos plugins',
699
+    'plugins_liste_dist' => 'Plugins bloqueados',
700
+    'plugins_recents' => 'Plugins recentes.',
701
+    'plugins_tous_liste' => 'Todos',
702
+    'plugins_vue_hierarchie' => 'Hierarquia',
703
+    'plugins_vue_liste' => 'Lista',
704
+    'protocole_ldap' => 'Versão do protocolo:',
705 705
 
706
-	// Q
707
-	'queue_executer_maintenant' => 'Executar agora',
708
-	'queue_info_purger' => 'Você pode excluir todas as tarefas de fundo em espera e reinicializar a lista com as tarefas periódicas',
709
-	'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera',
710
-	'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s',
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_titre' => 'Tarefas de fundo',
706
+    // Q
707
+    'queue_executer_maintenant' => 'Executar agora',
708
+    'queue_info_purger' => 'Você pode excluir todas as tarefas de fundo em espera e reinicializar a lista com as tarefas periódicas',
709
+    'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera',
710
+    'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s',
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_titre' => 'Tarefas de fundo',
716 716
 
717
-	// R
718
-	'repertoire_plugins' => 'Diretório:',
719
-	'required' => '(obrigatório)',
717
+    // R
718
+    'repertoire_plugins' => 'Diretório:',
719
+    'required' => '(obrigatório)',
720 720
 
721
-	// S
722
-	'sans_heure' => 'sem hora',
723
-	'statut_admin_restreint' => '(admin limitado)',
724
-	'statut_webmestre' => 'webmaster',
721
+    // S
722
+    'sans_heure' => 'sem hora',
723
+    'statut_admin_restreint' => '(admin limitado)',
724
+    'statut_webmestre' => 'webmaster',
725 725
 
726
-	// T
727
-	'tache_cron_asap' => 'Tarefa CRON @function@ (ASAP)',
728
-	'tache_cron_secondes' => 'Tarefa CRON @function@ (a cada @nb@ s)',
729
-	'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@.',
730
-	'taille_cache_moins_de' => 'O tamanho do cache é menor do que @octets@.',
731
-	'taille_cache_octets' => 'O tamanho atual do cache é de cerca de @octets@.',
732
-	'taille_cache_vide' => 'O cache está vazio.',
733
-	'taille_repertoire_cache' => 'Tamanho do diretório cache',
734
-	'text_article_propose_publication' => 'Matéria proposta para publicação.',
735
-	'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.',
736
-	'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.',
737
-	'texte_adresse_annuaire_1' => '(Se o seu diretório está instalado na mesma máquina que este website, trata-se provavelmente de «localhost».)',
738
-	'texte_ajout_auteur' => 'O autor a seguir foi incluído na matéria:',
739
-	'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.',
740
-	'texte_article_statut' => 'Esta matéria está:',
741
-	'texte_article_virtuel' => 'Matéria virtual',
742
-	'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.',
743
-	'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"',
744
-	'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).',
745
-	'texte_auteurs' => 'OS AUTORES',
746
-	'texte_choix_base_1' => 'Escolha a sua base:',
747
-	'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.',
748
-	'texte_choix_base_3' => '<b>Escolha</b> abaixo a que lhe foi atribuída pelo seu serviço de hospedagem:',
749
-	'texte_choix_table_prefix' => 'Prefixo das tabelas:',
750
-	'texte_compte_element' => '@count@ elemento',
751
-	'texte_compte_elements' => '@count@ elementos',
752
-	'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.',
753
-	'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.',
754
-	'texte_contenu_article' => '(Conteúdo da matéria em poucas palavras.)',
755
-	'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.',
756
-	'texte_crash_base' => 'Se a sua base de dados se corrompeu, você poderá tentar uma reparação automática.',
757
-	'texte_creer_rubrique' => 'Antes de poder escrever matérias, você precisa criar uma seção.',
758
-	'texte_date_creation_article' => 'DATA DE CRIAÇÃO DA MATÉRIA:',
759
-	'texte_date_creation_objet' => 'Data de criação:', # on ajoute le &quot;:&quot;
760
-	'texte_date_publication_anterieure' => 'Data de redação anterior:',
761
-	'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redação anterior.',
762
-	'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:',
763
-	'texte_date_publication_objet' => 'Data de publicação online:',
764
-	'texte_definir_comme_traduction_rubrique' => 'Esta seção é uma tradução da seção número:',
765
-	'texte_descriptif_rapide' => 'Descrição rápida',
766
-	'texte_effacer_base' => 'Apagar a base de dados do SPIP',
767
-	'texte_effacer_statistiques' => 'Apagar as estatísticas',
768
-	'texte_en_cours_validation' => 'Os conteúdos abaixo estão propostos para publicação.',
769
-	'texte_enrichir_mise_a_jour' => 'Você pode enriquecer a diagramação do seu texto usando «atalhos tipográficos».',
770
-	'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>
726
+    // T
727
+    'tache_cron_asap' => 'Tarefa CRON @function@ (ASAP)',
728
+    'tache_cron_secondes' => 'Tarefa CRON @function@ (a cada @nb@ s)',
729
+    '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@.',
730
+    'taille_cache_moins_de' => 'O tamanho do cache é menor do que @octets@.',
731
+    'taille_cache_octets' => 'O tamanho atual do cache é de cerca de @octets@.',
732
+    'taille_cache_vide' => 'O cache está vazio.',
733
+    'taille_repertoire_cache' => 'Tamanho do diretório cache',
734
+    'text_article_propose_publication' => 'Matéria proposta para publicação.',
735
+    '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.',
736
+    '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.',
737
+    'texte_adresse_annuaire_1' => '(Se o seu diretório está instalado na mesma máquina que este website, trata-se provavelmente de «localhost».)',
738
+    'texte_ajout_auteur' => 'O autor a seguir foi incluído na matéria:',
739
+    '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.',
740
+    'texte_article_statut' => 'Esta matéria está:',
741
+    'texte_article_virtuel' => 'Matéria virtual',
742
+    '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.',
743
+    'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"',
744
+    '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).',
745
+    'texte_auteurs' => 'OS AUTORES',
746
+    'texte_choix_base_1' => 'Escolha a sua base:',
747
+    'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.',
748
+    'texte_choix_base_3' => '<b>Escolha</b> abaixo a que lhe foi atribuída pelo seu serviço de hospedagem:',
749
+    'texte_choix_table_prefix' => 'Prefixo das tabelas:',
750
+    'texte_compte_element' => '@count@ elemento',
751
+    'texte_compte_elements' => '@count@ elementos',
752
+    '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.',
753
+    '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.',
754
+    'texte_contenu_article' => '(Conteúdo da matéria em poucas palavras.)',
755
+    '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.',
756
+    'texte_crash_base' => 'Se a sua base de dados se corrompeu, você poderá tentar uma reparação automática.',
757
+    'texte_creer_rubrique' => 'Antes de poder escrever matérias, você precisa criar uma seção.',
758
+    'texte_date_creation_article' => 'DATA DE CRIAÇÃO DA MATÉRIA:',
759
+    'texte_date_creation_objet' => 'Data de criação:', # on ajoute le &quot;:&quot;
760
+    'texte_date_publication_anterieure' => 'Data de redação anterior:',
761
+    'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redação anterior.',
762
+    'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:',
763
+    'texte_date_publication_objet' => 'Data de publicação online:',
764
+    'texte_definir_comme_traduction_rubrique' => 'Esta seção é uma tradução da seção número:',
765
+    'texte_descriptif_rapide' => 'Descrição rápida',
766
+    'texte_effacer_base' => 'Apagar a base de dados do SPIP',
767
+    'texte_effacer_statistiques' => 'Apagar as estatísticas',
768
+    'texte_en_cours_validation' => 'Os conteúdos abaixo estão propostos para publicação.',
769
+    'texte_enrichir_mise_a_jour' => 'Você pode enriquecer a diagramação do seu texto usando «atalhos tipográficos».',
770
+    '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>
771 771
 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>
772 772
 Se eles não forem úteis, você poderá deixar esta opção com o seu valor padrão (sem criar os arquivos).</p>',
773
-	'texte_informations_personnelles_1' => 'O sistema vai criar agora um acesso personalizado ao site.',
774
-	'texte_informations_personnelles_2' => '(Nota: trata-se de uma reinstalação, se o seu acesso funciona corretamente, você pode',
775
-	'texte_introductif_article' => '(Texto introdutório da matéria.)',
776
-	'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.',
777
-	'texte_jeu_caractere_3' => 'O seu site está configurado atualmente com o conjunto de caracteres:',
778
-	'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:',
779
-	'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>».)',
780
-	'texte_login_precaution' => 'Atenção! Este é o login com o qual você está conectado agora. Use este formulário com cautela...',
781
-	'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.',
782
-	'texte_mise_a_niveau_base_1' => 'Você acabou de atualizar os arquivos do SPIP.
773
+    'texte_informations_personnelles_1' => 'O sistema vai criar agora um acesso personalizado ao site.',
774
+    'texte_informations_personnelles_2' => '(Nota: trata-se de uma reinstalação, se o seu acesso funciona corretamente, você pode',
775
+    'texte_introductif_article' => '(Texto introdutório da matéria.)',
776
+    '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.',
777
+    'texte_jeu_caractere_3' => 'O seu site está configurado atualmente com o conjunto de caracteres:',
778
+    '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:',
779
+    '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>».)',
780
+    'texte_login_precaution' => 'Atenção! Este é o login com o qual você está conectado agora. Use este formulário com cautela...',
781
+    '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.',
782
+    'texte_mise_a_niveau_base_1' => 'Você acabou de atualizar os arquivos do SPIP.
783 783
 Agora é necessário atualizar a base de dados do site.',
784
-	'texte_modifier_article' => 'Editar a matéria:',
785
-	'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.',
786
-	'texte_multilinguisme_trad' => 'Você pode, igualmente, ativar um sistema de gerenciamento de links entre as diferentes traduções em certos objetos.',
787
-	'texte_non_compresse' => '<i>não compactado</i> (seu servidor não suporta esta funcionalidade)',
788
-	'texte_nouvelle_version_spip_1' => 'Você instalou uma nova versão do SPIP.',
789
-	'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>',
790
-	'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.',
791
-	'texte_plus_trois_car' => 'mais de 3 caracteres',
792
-	'texte_plusieurs_articles' => 'Demasiados autores encontrados para "@cherche_auteur@":',
793
-	'texte_port_annuaire' => '(O valor padrão indicado é geralmente conveniente.)',
794
-	'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.',
795
-	'texte_proposer_publication' => 'Assim que a sua matéria estiver pronta, você pode propor a sua publicação.',
796
-	'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.',
797
-	'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?',
798
-	'texte_rappel_selection_champs' => '[Não se esqueça de selecionar corretamente este campo.]',
799
-	'texte_recalcul_page' => 'Se você quiser recalcular uma única página, passe para a área pública e clique no botão «atualizar».',
800
-	'texte_recuperer_base' => 'Reparar a base de dados',
801
-	'texte_reference_mais_redirige' => 'matéria referenciada no seu site em  SPIP, mas redirecionada para outro URL.',
802
-	'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>
784
+    'texte_modifier_article' => 'Editar a matéria:',
785
+    '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.',
786
+    'texte_multilinguisme_trad' => 'Você pode, igualmente, ativar um sistema de gerenciamento de links entre as diferentes traduções em certos objetos.',
787
+    'texte_non_compresse' => '<i>não compactado</i> (seu servidor não suporta esta funcionalidade)',
788
+    'texte_nouvelle_version_spip_1' => 'Você instalou uma nova versão do SPIP.',
789
+    '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>',
790
+    '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.',
791
+    'texte_plus_trois_car' => 'mais de 3 caracteres',
792
+    'texte_plusieurs_articles' => 'Demasiados autores encontrados para "@cherche_auteur@":',
793
+    'texte_port_annuaire' => '(O valor padrão indicado é geralmente conveniente.)',
794
+    '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.',
795
+    'texte_proposer_publication' => 'Assim que a sua matéria estiver pronta, você pode propor a sua publicação.',
796
+    '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.',
797
+    '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?',
798
+    'texte_rappel_selection_champs' => '[Não se esqueça de selecionar corretamente este campo.]',
799
+    'texte_recalcul_page' => 'Se você quiser recalcular uma única página, passe para a área pública e clique no botão «atualizar».',
800
+    'texte_recuperer_base' => 'Reparar a base de dados',
801
+    'texte_reference_mais_redirige' => 'matéria referenciada no seu site em  SPIP, mas redirecionada para outro URL.',
802
+    '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>
803 803
 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>
804 804
 Se o problema persistir, contate o seu serviço de hospedagem.</p>',
805
-	'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:
805
+    '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 806
  <ul><li>o formato padrão das datas no site público;</li>
807 807
  <li>a natureza do motor tipográfico que o SPIP deverá usar para a composição dos textos;</li>
808 808
  <li>o idioma usado nos formulários do site público;</li>
809 809
  <li>o idioma padrão exibido na área privada.</li></ul>',
810
-	'texte_sous_titre' => 'Subtítulo',
811
-	'texte_statistiques_visites' => '(barras escuras:  domingo / curva escura: evolução da média)',
812
-	'texte_statut_attente_validation' => 'aguardando validação',
813
-	'texte_statut_publies' => 'publicadas online',
814
-	'texte_statut_refuses' => 'recusadas',
815
-	'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.',
816
-	'texte_sur_titre' => 'Sobretítulo',
817
-	'texte_table_ok' => ': esta tabela está OK.',
818
-	'texte_tentative_recuperation' => 'Tentativa de reparação',
819
-	'texte_tenter_reparation' => 'Tentar uma reparação da base de dados',
820
-	'texte_test_proxy' => 'Para testar este proxy, informe aqui o endereço de um website que você deseje testar.',
821
-	'texte_titre_02' => 'Título:',
822
-	'texte_titre_obligatoire' => '<b>Título</b> [obrigatório]',
823
-	'texte_travail_article' => '@nom_auteur_modif@ trabalhou nesta matéria há @date_diff@ minutos',
824
-	'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.',
825
-	'texte_vide' => 'vazia',
826
-	'texte_vider_cache' => 'Esvaziar o cache',
827
-	'titre_admin_tech' => 'Manutenção técnica',
828
-	'titre_admin_vider' => 'Manutenção técnica',
829
-	'titre_ajouter_un_auteur' => 'Incluir um autor',
830
-	'titre_ajouter_un_mot' => 'Incluir uma palavra-chave',
831
-	'titre_cadre_afficher_article' => 'Exibir as matérias',
832
-	'titre_cadre_afficher_traductions' => 'Exibir o status das traduções para os idiomas a seguir:',
833
-	'titre_cadre_ajouter_auteur' => 'INCLUIR UM AUTOR:',
834
-	'titre_cadre_interieur_rubrique' => 'Na seção',
835
-	'titre_cadre_numero_auteur' => 'AUTOR NÚMERO',
836
-	'titre_cadre_numero_objet' => '@objet@ NÚMERO:',
837
-	'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [obrigatório]<br />',
838
-	'titre_config_contenu_notifications' => 'Notificações',
839
-	'titre_config_contenu_prive' => 'Na área privada',
840
-	'titre_config_contenu_public' => 'No site público',
841
-	'titre_config_fonctions' => 'Configuração do site',
842
-	'titre_config_langage' => 'Configurar o idioma',
843
-	'titre_configuration' => 'Configuração do site',
844
-	'titre_configurer_preferences' => 'Configurar as suas preferências',
845
-	'titre_configurer_preferences_menus' => 'Configurar as suas preferências de menus',
846
-	'titre_conflit_edition' => 'Conflito durante a edição',
847
-	'titre_connexion_ldap' => 'Opções: <b>Sua conexão LDAP</b>',
848
-	'titre_groupe_mots' => 'GRUPO DE PALAVRAS-CHAVE:',
849
-	'titre_identite_site' => 'Identidade do site',
850
-	'titre_langue_article' => 'Idioma da matéria',
851
-	'titre_langue_rubrique' => 'Idioma da seção',
852
-	'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DA MATÉRIA',
853
-	'titre_les_articles' => 'AS MATÉRIAS',
854
-	'titre_messagerie_agenda' => 'Mensagens internas e agenda',
855
-	'titre_naviguer_dans_le_site' => 'Navegar no site...',
856
-	'titre_nouvelle_rubrique' => 'Nova seção',
857
-	'titre_numero_rubrique' => 'SEÇÃO NÚMERO:',
858
-	'titre_page_articles_edit' => 'Editar: @titre@',
859
-	'titre_page_articles_page' => 'As matérias',
860
-	'titre_page_articles_tous' => 'Todo o site',
861
-	'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@',
862
-	'titre_page_config_contenu' => 'Configuração do site',
863
-	'titre_page_delete_all' => 'supressão total e irreversível',
864
-	'titre_page_recherche' => 'Resultados da busca por @recherche@',
865
-	'titre_page_statistiques_referers' => 'Estatísticas (links de entrada)',
866
-	'titre_page_upgrade' => 'Atualização do SPIP',
867
-	'titre_preference_menus_favoris' => 'Menus favoritos',
868
-	'titre_publication_articles_post_dates' => 'Publicação de matérias pós-datadas',
869
-	'titre_reparation' => 'Reparação',
870
-	'titre_suivi_petition' => 'Acompanhamento das petições',
871
-	'tls_ldap' => 'Transport Layer Security:',
872
-	'trad_article_traduction' => 'Todas as versões desta matéria:',
873
-	'trad_delier' => 'Desvincular destas traduções',
874
-	'trad_lier' => 'Esta matéria é uma tradução da matéria número:',
875
-	'trad_new' => 'Escrever uma nova tradução',
810
+    'texte_sous_titre' => 'Subtítulo',
811
+    'texte_statistiques_visites' => '(barras escuras:  domingo / curva escura: evolução da média)',
812
+    'texte_statut_attente_validation' => 'aguardando validação',
813
+    'texte_statut_publies' => 'publicadas online',
814
+    'texte_statut_refuses' => 'recusadas',
815
+    '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.',
816
+    'texte_sur_titre' => 'Sobretítulo',
817
+    'texte_table_ok' => ': esta tabela está OK.',
818
+    'texte_tentative_recuperation' => 'Tentativa de reparação',
819
+    'texte_tenter_reparation' => 'Tentar uma reparação da base de dados',
820
+    'texte_test_proxy' => 'Para testar este proxy, informe aqui o endereço de um website que você deseje testar.',
821
+    'texte_titre_02' => 'Título:',
822
+    'texte_titre_obligatoire' => '<b>Título</b> [obrigatório]',
823
+    'texte_travail_article' => '@nom_auteur_modif@ trabalhou nesta matéria há @date_diff@ minutos',
824
+    '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.',
825
+    'texte_vide' => 'vazia',
826
+    'texte_vider_cache' => 'Esvaziar o cache',
827
+    'titre_admin_tech' => 'Manutenção técnica',
828
+    'titre_admin_vider' => 'Manutenção técnica',
829
+    'titre_ajouter_un_auteur' => 'Incluir um autor',
830
+    'titre_ajouter_un_mot' => 'Incluir uma palavra-chave',
831
+    'titre_cadre_afficher_article' => 'Exibir as matérias',
832
+    'titre_cadre_afficher_traductions' => 'Exibir o status das traduções para os idiomas a seguir:',
833
+    'titre_cadre_ajouter_auteur' => 'INCLUIR UM AUTOR:',
834
+    'titre_cadre_interieur_rubrique' => 'Na seção',
835
+    'titre_cadre_numero_auteur' => 'AUTOR NÚMERO',
836
+    'titre_cadre_numero_objet' => '@objet@ NÚMERO:',
837
+    'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [obrigatório]<br />',
838
+    'titre_config_contenu_notifications' => 'Notificações',
839
+    'titre_config_contenu_prive' => 'Na área privada',
840
+    'titre_config_contenu_public' => 'No site público',
841
+    'titre_config_fonctions' => 'Configuração do site',
842
+    'titre_config_langage' => 'Configurar o idioma',
843
+    'titre_configuration' => 'Configuração do site',
844
+    'titre_configurer_preferences' => 'Configurar as suas preferências',
845
+    'titre_configurer_preferences_menus' => 'Configurar as suas preferências de menus',
846
+    'titre_conflit_edition' => 'Conflito durante a edição',
847
+    'titre_connexion_ldap' => 'Opções: <b>Sua conexão LDAP</b>',
848
+    'titre_groupe_mots' => 'GRUPO DE PALAVRAS-CHAVE:',
849
+    'titre_identite_site' => 'Identidade do site',
850
+    'titre_langue_article' => 'Idioma da matéria',
851
+    'titre_langue_rubrique' => 'Idioma da seção',
852
+    'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DA MATÉRIA',
853
+    'titre_les_articles' => 'AS MATÉRIAS',
854
+    'titre_messagerie_agenda' => 'Mensagens internas e agenda',
855
+    'titre_naviguer_dans_le_site' => 'Navegar no site...',
856
+    'titre_nouvelle_rubrique' => 'Nova seção',
857
+    'titre_numero_rubrique' => 'SEÇÃO NÚMERO:',
858
+    'titre_page_articles_edit' => 'Editar: @titre@',
859
+    'titre_page_articles_page' => 'As matérias',
860
+    'titre_page_articles_tous' => 'Todo o site',
861
+    'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@',
862
+    'titre_page_config_contenu' => 'Configuração do site',
863
+    'titre_page_delete_all' => 'supressão total e irreversível',
864
+    'titre_page_recherche' => 'Resultados da busca por @recherche@',
865
+    'titre_page_statistiques_referers' => 'Estatísticas (links de entrada)',
866
+    'titre_page_upgrade' => 'Atualização do SPIP',
867
+    'titre_preference_menus_favoris' => 'Menus favoritos',
868
+    'titre_publication_articles_post_dates' => 'Publicação de matérias pós-datadas',
869
+    'titre_reparation' => 'Reparação',
870
+    'titre_suivi_petition' => 'Acompanhamento das petições',
871
+    'tls_ldap' => 'Transport Layer Security:',
872
+    'trad_article_traduction' => 'Todas as versões desta matéria:',
873
+    'trad_delier' => 'Desvincular destas traduções',
874
+    'trad_lier' => 'Esta matéria é uma tradução da matéria número:',
875
+    'trad_new' => 'Escrever uma nova tradução',
876 876
 
877
-	// U
878
-	'utf8_convert_erreur_orig' => 'Erro: o conjunto de caracteres @charset@ não é suportado.',
877
+    // U
878
+    'utf8_convert_erreur_orig' => 'Erro: o conjunto de caracteres @charset@ não é suportado.',
879 879
 
880
-	// V
881
-	'version' => 'Versão:'
880
+    // V
881
+    'version' => 'Versão:'
882 882
 );
Please login to merge, or discard this patch.