@@ -7,57 +7,57 @@ |
||
| 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 | |
@@ -3,16 +3,16 @@ |
||
| 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 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 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 |
||
| 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(['<', '"'], ['<', '"'], $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(['<', '"'], ['<', '"'], $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('&', '&', $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(['<', '"'], ['<', '"'], $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('&', '&', $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('&', '&', $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(['<', '"'], ['<', '"'], $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('&', '&', $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 |
||
| 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 |
||
| 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 | } |
@@ -11,7 +11,7 @@ discard block |
||
| 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 |
||
| 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('&', '&', $url); // les redirections se font en &, pas en en & |
|
| 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('&', '&', $url); // les redirections se font en &, pas en en & |
|
| 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(['<', '"', "'"], ['<', '"', ''], $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(['<', '"', "'"], ['<', '"', ''], $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 |
||
| 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 | } |
@@ -11,7 +11,7 @@ discard block |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 | } |
@@ -20,178 +20,178 @@ discard block |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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('"', '"', $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('"', '"', $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 |
||
| 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 | } |
@@ -19,7 +19,7 @@ discard block |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 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 | } |
@@ -4,879 +4,879 @@ |
||
| 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' => '<plugin> 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' => '<plugin> 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 ":" |
|
| 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 ":" |
|
| 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 | ); |