Completed
Push — master ( 1fe7c3...e997e0 )
by cam
02:01
created
ecrire/public/balises.php 1 patch
Indentation   +943 added lines, -943 removed lines patch added patch discarded remove patch
@@ -28,7 +28,7 @@  discard block
 block discarded – undo
28 28
  **/
29 29
 
30 30
 if (!defined('_ECRIRE_INC_VERSION')) {
31
-	return;
31
+    return;
32 32
 }
33 33
 
34 34
 /**
@@ -50,16 +50,16 @@  discard block
 block discarded – undo
50 50
  *     Code PHP si cet argument est présent, sinon null
51 51
  **/
52 52
 function interprete_argument_balise(int $n, Champ $p): ?string {
53
-	if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) {
54
-		return calculer_liste(
55
-			$p->param[0][$n],
56
-			$p->descr,
57
-			$p->boucles,
58
-			$p->id_boucle
59
-		);
60
-	} else {
61
-		return null;
62
-	}
53
+    if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) {
54
+        return calculer_liste(
55
+            $p->param[0][$n],
56
+            $p->descr,
57
+            $p->boucles,
58
+            $p->id_boucle
59
+        );
60
+    } else {
61
+        return null;
62
+    }
63 63
 }
64 64
 
65 65
 
@@ -79,10 +79,10 @@  discard block
 block discarded – undo
79 79
  *     Pile complétée par le code à générer
80 80
  **/
81 81
 function balise_NOM_SITE_SPIP_dist($p) {
82
-	$p->code = "\$GLOBALS['meta']['nom_site']";
82
+    $p->code = "\$GLOBALS['meta']['nom_site']";
83 83
 
84
-	#$p->interdire_scripts = true;
85
-	return $p;
84
+    #$p->interdire_scripts = true;
85
+    return $p;
86 86
 }
87 87
 
88 88
 /**
@@ -98,10 +98,10 @@  discard block
 block discarded – undo
98 98
  *     Pile complétée par le code à générer
99 99
  **/
100 100
 function balise_EMAIL_WEBMASTER_dist($p) {
101
-	$p->code = "\$GLOBALS['meta']['email_webmaster']";
101
+    $p->code = "\$GLOBALS['meta']['email_webmaster']";
102 102
 
103
-	#$p->interdire_scripts = true;
104
-	return $p;
103
+    #$p->interdire_scripts = true;
104
+    return $p;
105 105
 }
106 106
 
107 107
 /**
@@ -117,10 +117,10 @@  discard block
 block discarded – undo
117 117
  *     Pile complétée par le code à générer
118 118
  **/
119 119
 function balise_DESCRIPTIF_SITE_SPIP_dist($p) {
120
-	$p->code = "\$GLOBALS['meta']['descriptif_site']";
120
+    $p->code = "\$GLOBALS['meta']['descriptif_site']";
121 121
 
122
-	#$p->interdire_scripts = true;
123
-	return $p;
122
+    #$p->interdire_scripts = true;
123
+    return $p;
124 124
 }
125 125
 
126 126
 
@@ -141,10 +141,10 @@  discard block
 block discarded – undo
141 141
  *     Pile complétée par le code à générer
142 142
  **/
143 143
 function balise_CHARSET_dist($p) {
144
-	$p->code = "\$GLOBALS['meta']['charset']";
144
+    $p->code = "\$GLOBALS['meta']['charset']";
145 145
 
146
-	#$p->interdire_scripts = true;
147
-	return $p;
146
+    #$p->interdire_scripts = true;
147
+    return $p;
148 148
 }
149 149
 
150 150
 /**
@@ -169,11 +169,11 @@  discard block
 block discarded – undo
169 169
  *     Pile complétée par le code à générer
170 170
  **/
171 171
 function balise_LANG_LEFT_dist($p) {
172
-	$_lang = champ_sql('lang', $p);
173
-	$p->code = "lang_dir($_lang, 'left','right')";
174
-	$p->interdire_scripts = false;
172
+    $_lang = champ_sql('lang', $p);
173
+    $p->code = "lang_dir($_lang, 'left','right')";
174
+    $p->interdire_scripts = false;
175 175
 
176
-	return $p;
176
+    return $p;
177 177
 }
178 178
 
179 179
 /**
@@ -193,11 +193,11 @@  discard block
 block discarded – undo
193 193
  *     Pile complétée par le code à générer
194 194
  **/
195 195
 function balise_LANG_RIGHT_dist($p) {
196
-	$_lang = champ_sql('lang', $p);
197
-	$p->code = "lang_dir($_lang, 'right','left')";
198
-	$p->interdire_scripts = false;
196
+    $_lang = champ_sql('lang', $p);
197
+    $p->code = "lang_dir($_lang, 'right','left')";
198
+    $p->interdire_scripts = false;
199 199
 
200
-	return $p;
200
+    return $p;
201 201
 }
202 202
 
203 203
 /**
@@ -222,11 +222,11 @@  discard block
 block discarded – undo
222 222
  *     Pile complétée par le code à générer
223 223
  **/
224 224
 function balise_LANG_DIR_dist($p) {
225
-	$_lang = champ_sql('lang', $p);
226
-	$p->code = "lang_dir($_lang, 'ltr','rtl')";
227
-	$p->interdire_scripts = false;
225
+    $_lang = champ_sql('lang', $p);
226
+    $p->code = "lang_dir($_lang, 'ltr','rtl')";
227
+    $p->interdire_scripts = false;
228 228
 
229
-	return $p;
229
+    return $p;
230 230
 }
231 231
 
232 232
 
@@ -243,10 +243,10 @@  discard block
 block discarded – undo
243 243
  *     Pile complétée par le code à générer
244 244
  **/
245 245
 function balise_PUCE_dist($p) {
246
-	$p->code = 'definir_puce()';
247
-	$p->interdire_scripts = false;
246
+    $p->code = 'definir_puce()';
247
+    $p->interdire_scripts = false;
248 248
 
249
-	return $p;
249
+    return $p;
250 250
 }
251 251
 
252 252
 
@@ -270,9 +270,9 @@  discard block
 block discarded – undo
270 270
  *     Pile completée du code PHP d'exécution de la balise
271 271
  */
272 272
 function balise_DATE_dist($p) {
273
-	$p->code = champ_sql('date', $p);
273
+    $p->code = champ_sql('date', $p);
274 274
 
275
-	return $p;
275
+    return $p;
276 276
 }
277 277
 
278 278
 
@@ -292,10 +292,10 @@  discard block
 block discarded – undo
292 292
  *     Pile completée du code PHP d'exécution de la balise
293 293
  */
294 294
 function balise_DATE_REDAC_dist($p) {
295
-	$p->code = champ_sql('date_redac', $p);
296
-	$p->interdire_scripts = false;
295
+    $p->code = champ_sql('date_redac', $p);
296
+    $p->interdire_scripts = false;
297 297
 
298
-	return $p;
298
+    return $p;
299 299
 }
300 300
 
301 301
 /**
@@ -314,10 +314,10 @@  discard block
 block discarded – undo
314 314
  *     Pile completée du code PHP d'exécution de la balise
315 315
  */
316 316
 function balise_DATE_MODIF_dist($p) {
317
-	$p->code = champ_sql('date_modif', $p);
318
-	$p->interdire_scripts = false;
317
+    $p->code = champ_sql('date_modif', $p);
318
+    $p->interdire_scripts = false;
319 319
 
320
-	return $p;
320
+    return $p;
321 321
 }
322 322
 
323 323
 /**
@@ -335,13 +335,13 @@  discard block
 block discarded – undo
335 335
  *     Pile completée du code PHP d'exécution de la balise
336 336
  */
337 337
 function balise_DATE_NOUVEAUTES_dist($p) {
338
-	$p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
338
+    $p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
339 339
 	AND isset(\$GLOBALS['meta']['dernier_envoi_neuf'])) ?
340 340
 	\$GLOBALS['meta']['dernier_envoi_neuf'] :
341 341
 	\"'0000-00-00'\")";
342
-	$p->interdire_scripts = false;
342
+    $p->interdire_scripts = false;
343 343
 
344
-	return $p;
344
+    return $p;
345 345
 }
346 346
 
347 347
 
@@ -359,11 +359,11 @@  discard block
 block discarded – undo
359 359
  *     Pile completée du code PHP d'exécution de la balise
360 360
  */
361 361
 function balise_DOSSIER_SQUELETTE_dist($p) {
362
-	$code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
363
-	$p->code = "_DIR_RACINE . '$code'" .
364
-		$p->interdire_scripts = false;
362
+    $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
363
+    $p->code = "_DIR_RACINE . '$code'" .
364
+        $p->interdire_scripts = false;
365 365
 
366
-	return $p;
366
+    return $p;
367 367
 }
368 368
 
369 369
 /**
@@ -378,11 +378,11 @@  discard block
 block discarded – undo
378 378
  *     Pile completée du code PHP d'exécution de la balise
379 379
  */
380 380
 function balise_SQUELETTE_dist($p) {
381
-	$code = addslashes($p->descr['sourcefile']);
382
-	$p->code = "'$code'" .
383
-		$p->interdire_scripts = false;
381
+    $code = addslashes($p->descr['sourcefile']);
382
+    $p->code = "'$code'" .
383
+        $p->interdire_scripts = false;
384 384
 
385
-	return $p;
385
+    return $p;
386 386
 }
387 387
 
388 388
 /**
@@ -401,10 +401,10 @@  discard block
 block discarded – undo
401 401
  *     Pile completée du code PHP d'exécution de la balise
402 402
  */
403 403
 function balise_SPIP_VERSION_dist($p) {
404
-	$p->code = 'spip_version()';
405
-	$p->interdire_scripts = false;
404
+    $p->code = 'spip_version()';
405
+    $p->interdire_scripts = false;
406 406
 
407
-	return $p;
407
+    return $p;
408 408
 }
409 409
 
410 410
 
@@ -430,18 +430,18 @@  discard block
 block discarded – undo
430 430
  *     Pile complétée par le code à générer
431 431
  **/
432 432
 function balise_NOM_SITE_dist($p) {
433
-	if (!$p->etoile) {
434
-		$p->code = 'supprimer_numero(calculer_url(' .
435
-			champ_sql('url_site', $p) . ',' .
436
-			champ_sql('nom_site', $p) .
437
-			", 'titre', \$connect, false))";
438
-	} else {
439
-		$p->code = champ_sql('nom_site', $p);
440
-	}
433
+    if (!$p->etoile) {
434
+        $p->code = 'supprimer_numero(calculer_url(' .
435
+            champ_sql('url_site', $p) . ',' .
436
+            champ_sql('nom_site', $p) .
437
+            ", 'titre', \$connect, false))";
438
+    } else {
439
+        $p->code = champ_sql('nom_site', $p);
440
+    }
441 441
 
442
-	$p->interdire_scripts = true;
442
+    $p->interdire_scripts = true;
443 443
 
444
-	return $p;
444
+    return $p;
445 445
 }
446 446
 
447 447
 
@@ -458,11 +458,11 @@  discard block
 block discarded – undo
458 458
  *     Pile complétée par le code à générer
459 459
  **/
460 460
 function balise_NOTES_dist($p) {
461
-	// Recuperer les notes
462
-	$p->code = 'calculer_notes()';
461
+    // Recuperer les notes
462
+    $p->code = 'calculer_notes()';
463 463
 
464
-	#$p->interdire_scripts = true;
465
-	return $p;
464
+    #$p->interdire_scripts = true;
465
+    return $p;
466 466
 }
467 467
 
468 468
 
@@ -484,10 +484,10 @@  discard block
 block discarded – undo
484 484
  *     Pile complétée par le code à générer
485 485
  **/
486 486
 function balise_RECHERCHE_dist($p) {
487
-	$p->code = 'entites_html(_request("recherche"))';
488
-	$p->interdire_scripts = false;
487
+    $p->code = 'entites_html(_request("recherche"))';
488
+    $p->interdire_scripts = false;
489 489
 
490
-	return $p;
490
+    return $p;
491 491
 }
492 492
 
493 493
 
@@ -505,18 +505,18 @@  discard block
 block discarded – undo
505 505
  *     Pile complétée par le code à générer
506 506
  **/
507 507
 function balise_COMPTEUR_BOUCLE_dist($p) {
508
-	$b = index_boucle_mere($p);
509
-	if ($b === '') {
510
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
511
-		erreur_squelette($msg, $p);
512
-		return null;
513
-	} else {
514
-		$p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)";
515
-		$p->boucles[$b]->cptrows = true;
516
-		$p->interdire_scripts = false;
508
+    $b = index_boucle_mere($p);
509
+    if ($b === '') {
510
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
511
+        erreur_squelette($msg, $p);
512
+        return null;
513
+    } else {
514
+        $p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)";
515
+        $p->boucles[$b]->cptrows = true;
516
+        $p->interdire_scripts = false;
517 517
 
518
-		return $p;
519
-	}
518
+        return $p;
519
+    }
520 520
 }
521 521
 
522 522
 /**
@@ -534,17 +534,17 @@  discard block
 block discarded – undo
534 534
  *     Pile complétée par le code à générer
535 535
  **/
536 536
 function balise_TOTAL_BOUCLE_dist($p) {
537
-	$b = index_boucle_mere($p);
538
-	if ($b === '') {
539
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
540
-		erreur_squelette($msg, $p);
541
-	} else {
542
-		$p->code = "(\$Numrows['$b']['total'] ?? 0)";
543
-		$p->boucles[$b]->numrows = true;
544
-		$p->interdire_scripts = false;
545
-	}
537
+    $b = index_boucle_mere($p);
538
+    if ($b === '') {
539
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
540
+        erreur_squelette($msg, $p);
541
+    } else {
542
+        $p->code = "(\$Numrows['$b']['total'] ?? 0)";
543
+        $p->boucles[$b]->numrows = true;
544
+        $p->interdire_scripts = false;
545
+    }
546 546
 
547
-	return $p;
547
+    return $p;
548 548
 }
549 549
 
550 550
 
@@ -564,7 +564,7 @@  discard block
 block discarded – undo
564 564
  *     Pile complétée par le code à générer
565 565
  **/
566 566
 function balise_POINTS_dist($p) {
567
-	return rindex_pile($p, 'points', 'recherche');
567
+    return rindex_pile($p, 'points', 'recherche');
568 568
 }
569 569
 
570 570
 
@@ -585,12 +585,12 @@  discard block
 block discarded – undo
585 585
  *     Pile complétée par le code à générer
586 586
  **/
587 587
 function balise_POPULARITE_ABSOLUE_dist($p) {
588
-	$p->code = 'ceil(' .
589
-		champ_sql('popularite', $p) .
590
-		')';
591
-	$p->interdire_scripts = false;
588
+    $p->code = 'ceil(' .
589
+        champ_sql('popularite', $p) .
590
+        ')';
591
+    $p->interdire_scripts = false;
592 592
 
593
-	return $p;
593
+    return $p;
594 594
 }
595 595
 
596 596
 /**
@@ -610,10 +610,10 @@  discard block
 block discarded – undo
610 610
  *     Pile complétée par le code à générer
611 611
  **/
612 612
 function balise_POPULARITE_SITE_dist($p) {
613
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
614
-	$p->interdire_scripts = false;
613
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
614
+    $p->interdire_scripts = false;
615 615
 
616
-	return $p;
616
+    return $p;
617 617
 }
618 618
 
619 619
 /**
@@ -634,10 +634,10 @@  discard block
 block discarded – undo
634 634
  *     Pile complétée par le code à générer
635 635
  **/
636 636
 function balise_POPULARITE_MAX_dist($p) {
637
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
638
-	$p->interdire_scripts = false;
637
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
638
+    $p->interdire_scripts = false;
639 639
 
640
-	return $p;
640
+    return $p;
641 641
 }
642 642
 
643 643
 
@@ -663,15 +663,15 @@  discard block
 block discarded – undo
663 663
  *     Pile complétée par le code à générer
664 664
  **/
665 665
 function balise_VALEUR_dist($p) {
666
-	$b = $p->nom_boucle ?: $p->id_boucle;
667
-	$p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
666
+    $b = $p->nom_boucle ?: $p->id_boucle;
667
+    $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
668 668
 ;
669
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
670
-		$p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
671
-	}
672
-	$p->interdire_scripts = true;
669
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
670
+        $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
671
+    }
672
+    $p->interdire_scripts = true;
673 673
 
674
-	return $p;
674
+    return $p;
675 675
 }
676 676
 
677 677
 /**
@@ -700,16 +700,16 @@  discard block
 block discarded – undo
700 700
  *     Pile complétée par le code à générer
701 701
  **/
702 702
 function balise_EXPOSE_dist($p) {
703
-	$on = "'on'";
704
-	$off = "''";
705
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
706
-		$on = $v;
707
-		if (($v = interprete_argument_balise(2, $p)) !== null) {
708
-			$off = $v;
709
-		}
710
-	}
703
+    $on = "'on'";
704
+    $off = "''";
705
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
706
+        $on = $v;
707
+        if (($v = interprete_argument_balise(2, $p)) !== null) {
708
+            $off = $v;
709
+        }
710
+    }
711 711
 
712
-	return calculer_balise_expose($p, $on, $off);
712
+    return calculer_balise_expose($p, $on, $off);
713 713
 }
714 714
 
715 715
 /**
@@ -727,35 +727,35 @@  discard block
 block discarded – undo
727 727
  *     Pile complétée par le code à générer
728 728
  **/
729 729
 function calculer_balise_expose($p, $on, $off) {
730
-	$b = index_boucle($p);
731
-	if (empty($p->boucles[$b]->primary)) {
732
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
733
-		erreur_squelette($msg, $p);
734
-	} else {
735
-		$key = $p->boucles[$b]->primary;
736
-		$type = $p->boucles[$p->id_boucle]->primary;
737
-		$desc = $p->boucles[$b]->show;
738
-		$connect = sql_quote($p->boucles[$b]->sql_serveur);
730
+    $b = index_boucle($p);
731
+    if (empty($p->boucles[$b]->primary)) {
732
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
733
+        erreur_squelette($msg, $p);
734
+    } else {
735
+        $key = $p->boucles[$b]->primary;
736
+        $type = $p->boucles[$p->id_boucle]->primary;
737
+        $desc = $p->boucles[$b]->show;
738
+        $connect = sql_quote($p->boucles[$b]->sql_serveur);
739 739
 
740
-		// Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
741
-		$c = index_pile($p->id_boucle, $type, $p->boucles);
740
+        // Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
741
+        $c = index_pile($p->id_boucle, $type, $p->boucles);
742 742
 
743
-		if (isset($desc['field']['id_parent'])) {
744
-			$parent = 0; // pour if (!$parent) dans calculer_expose
745
-		} elseif (isset($desc['field']['id_rubrique'])) {
746
-			$parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
747
-		} elseif (isset($desc['field']['id_groupe'])) {
748
-			$parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
749
-		} else {
750
-			$parent = "''";
751
-		}
743
+        if (isset($desc['field']['id_parent'])) {
744
+            $parent = 0; // pour if (!$parent) dans calculer_expose
745
+        } elseif (isset($desc['field']['id_rubrique'])) {
746
+            $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
747
+        } elseif (isset($desc['field']['id_groupe'])) {
748
+            $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
749
+        } else {
750
+            $parent = "''";
751
+        }
752 752
 
753
-		$p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
754
-	}
753
+        $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
754
+    }
755 755
 
756
-	$p->interdire_scripts = false;
756
+    $p->interdire_scripts = false;
757 757
 
758
-	return $p;
758
+    return $p;
759 759
 }
760 760
 
761 761
 
@@ -796,46 +796,46 @@  discard block
 block discarded – undo
796 796
  **/
797 797
 function balise_INTRODUCTION_dist($p) {
798 798
 
799
-	$type_objet = $p->type_requete;
800
-	$cle_objet = id_table_objet($type_objet);
801
-	$_id_objet = champ_sql($cle_objet, $p);
802
-
803
-	// Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
804
-	// ainsi que le longueur d'introduction donnée dans la description de l'objet.
805
-	$_introduction_longueur = 'null';
806
-	$_ligne = 'array(';
807
-	$trouver_table = charger_fonction('trouver_table', 'base');
808
-	if ($desc = $trouver_table(table_objet_sql($type_objet))) {
809
-		if (isset($desc['field']['descriptif'])) {
810
-			$_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
811
-		}
812
-		if (isset($desc['field']['texte'])) {
813
-			$_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
814
-		}
815
-		if (isset($desc['field']['chapo'])) {
816
-			$_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
817
-		}
818
-		if (isset($desc['introduction_longueur'])) {
819
-			$_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
820
-		}
821
-	}
822
-	$_ligne .= ')';
823
-
824
-	// Récupérer la longueur et la suite passés en paramètres
825
-	$_longueur_ou_suite = 'null';
826
-	if (($v1 = interprete_argument_balise(1, $p)) !== null) {
827
-		$_longueur_ou_suite = $v1;
828
-	}
829
-	$_suite = 'null';
830
-	if (($v2 = interprete_argument_balise(2, $p)) !== null) {
831
-		$_suite = $v2;
832
-	}
833
-
834
-	$p->code = "generer_objet_introduction($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
835
-
836
-	#$p->interdire_scripts = true;
837
-	$p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
838
-	return $p;
799
+    $type_objet = $p->type_requete;
800
+    $cle_objet = id_table_objet($type_objet);
801
+    $_id_objet = champ_sql($cle_objet, $p);
802
+
803
+    // Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
804
+    // ainsi que le longueur d'introduction donnée dans la description de l'objet.
805
+    $_introduction_longueur = 'null';
806
+    $_ligne = 'array(';
807
+    $trouver_table = charger_fonction('trouver_table', 'base');
808
+    if ($desc = $trouver_table(table_objet_sql($type_objet))) {
809
+        if (isset($desc['field']['descriptif'])) {
810
+            $_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
811
+        }
812
+        if (isset($desc['field']['texte'])) {
813
+            $_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
814
+        }
815
+        if (isset($desc['field']['chapo'])) {
816
+            $_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
817
+        }
818
+        if (isset($desc['introduction_longueur'])) {
819
+            $_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
820
+        }
821
+    }
822
+    $_ligne .= ')';
823
+
824
+    // Récupérer la longueur et la suite passés en paramètres
825
+    $_longueur_ou_suite = 'null';
826
+    if (($v1 = interprete_argument_balise(1, $p)) !== null) {
827
+        $_longueur_ou_suite = $v1;
828
+    }
829
+    $_suite = 'null';
830
+    if (($v2 = interprete_argument_balise(2, $p)) !== null) {
831
+        $_suite = $v2;
832
+    }
833
+
834
+    $p->code = "generer_objet_introduction($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
835
+
836
+    #$p->interdire_scripts = true;
837
+    $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
838
+    return $p;
839 839
 }
840 840
 
841 841
 
@@ -855,15 +855,15 @@  discard block
 block discarded – undo
855 855
  *     Pile complétée par le code à générer
856 856
  **/
857 857
 function balise_LANG_dist($p) {
858
-	$_lang = champ_sql('lang', $p);
859
-	if (!$p->etoile) {
860
-		$p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
861
-	} else {
862
-		$p->code = "spip_htmlentities($_lang)";
863
-	}
864
-	$p->interdire_scripts = false;
858
+    $_lang = champ_sql('lang', $p);
859
+    if (!$p->etoile) {
860
+        $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
861
+    } else {
862
+        $p->code = "spip_htmlentities($_lang)";
863
+    }
864
+    $p->interdire_scripts = false;
865 865
 
866
-	return $p;
866
+    return $p;
867 867
 }
868 868
 
869 869
 /**
@@ -885,45 +885,45 @@  discard block
 block discarded – undo
885 885
  *     Pile complétée par le code à générer
886 886
  */
887 887
 function balise_LESAUTEURS_dist($p) {
888
-	// Cherche le champ 'lesauteurs' dans la pile
889
-	$_lesauteurs = champ_sql('lesauteurs', $p, '');
890
-
891
-	// Si le champ n'existe pas (cas de spip_articles), on applique
892
-	// le modele lesauteurs.html en passant id_article dans le contexte;
893
-	// dans le cas contraire on prend le champ 'lesauteurs'
894
-	// (cf extension sites/)
895
-	if ($_lesauteurs) {
896
-		$p->code = "safehtml($_lesauteurs)";
897
-		// $p->interdire_scripts = true;
898
-	} else {
899
-		if (!$p->id_boucle) {
900
-			$connect = '';
901
-			$objet = 'article';
902
-			$id_table_objet = 'id_article';
903
-		} else {
904
-			$b = $p->nom_boucle ?: $p->id_boucle;
905
-			$connect = $p->boucles[$b]->sql_serveur;
906
-			$type_boucle = $p->boucles[$b]->type_requete;
907
-			$objet = objet_type($type_boucle);
908
-			$id_table_objet = id_table_objet($type_boucle);
909
-		}
910
-		$c = memoriser_contexte_compil($p);
911
-
912
-		$p->code = sprintf(
913
-			CODE_RECUPERER_FOND,
914
-			"'modeles/lesauteurs'",
915
-			"array('objet'=>'" . $objet .
916
-			"','id_objet' => " . champ_sql($id_table_objet, $p) .
917
-			",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
918
-			($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
919
-			')',
920
-			"'trim'=>true, 'compil'=>array($c)",
921
-			_q($connect)
922
-		);
923
-		$p->interdire_scripts = false; // securite apposee par recuperer_fond()
924
-	}
925
-
926
-	return $p;
888
+    // Cherche le champ 'lesauteurs' dans la pile
889
+    $_lesauteurs = champ_sql('lesauteurs', $p, '');
890
+
891
+    // Si le champ n'existe pas (cas de spip_articles), on applique
892
+    // le modele lesauteurs.html en passant id_article dans le contexte;
893
+    // dans le cas contraire on prend le champ 'lesauteurs'
894
+    // (cf extension sites/)
895
+    if ($_lesauteurs) {
896
+        $p->code = "safehtml($_lesauteurs)";
897
+        // $p->interdire_scripts = true;
898
+    } else {
899
+        if (!$p->id_boucle) {
900
+            $connect = '';
901
+            $objet = 'article';
902
+            $id_table_objet = 'id_article';
903
+        } else {
904
+            $b = $p->nom_boucle ?: $p->id_boucle;
905
+            $connect = $p->boucles[$b]->sql_serveur;
906
+            $type_boucle = $p->boucles[$b]->type_requete;
907
+            $objet = objet_type($type_boucle);
908
+            $id_table_objet = id_table_objet($type_boucle);
909
+        }
910
+        $c = memoriser_contexte_compil($p);
911
+
912
+        $p->code = sprintf(
913
+            CODE_RECUPERER_FOND,
914
+            "'modeles/lesauteurs'",
915
+            "array('objet'=>'" . $objet .
916
+            "','id_objet' => " . champ_sql($id_table_objet, $p) .
917
+            ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
918
+            ($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
919
+            ')',
920
+            "'trim'=>true, 'compil'=>array($c)",
921
+            _q($connect)
922
+        );
923
+        $p->interdire_scripts = false; // securite apposee par recuperer_fond()
924
+    }
925
+
926
+    return $p;
927 927
 }
928 928
 
929 929
 
@@ -950,76 +950,76 @@  discard block
 block discarded – undo
950 950
  *     Pile complétée par le code à générer
951 951
  */
952 952
 function balise_RANG_dist($p) {
953
-	$b = index_boucle($p);
954
-	if ($b === '') {
955
-		$msg = [
956
-			'zbug_champ_hors_boucle',
957
-			['champ' => '#RANG']
958
-		];
959
-		erreur_squelette($msg, $p);
960
-	} else {
961
-		// chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
962
-		// dans la boucle immediatement englobante uniquement
963
-		// sinon on compose le champ calcule
964
-		$_rang = champ_sql('rang', $p, '', false);
965
-
966
-		// si pas trouve de champ sql rang :
967
-		if (!$_rang or $_rang == "''") {
968
-			$boucle = &$p->boucles[$b];
969
-
970
-			// on gere le cas ou #RANG est une extraction du numero dans le titre
971
-			$trouver_table = charger_fonction('trouver_table', 'base');
972
-			$desc = $trouver_table($boucle->id_table);
973
-			$_titre = ''; # où extraire le numero ?
974
-
975
-			if (isset($desc['titre'])) {
976
-				$t = $desc['titre'];
977
-				if (
978
-					// Soit on trouve avec la déclaration de la lang AVANT
979
-					preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
980
-					// Soit on prend depuis le début
981
-					or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
982
-				) {
983
-					$m = preg_replace(',as\s+titre$,i', '', $m[1]);
984
-					$m = trim($m);
985
-					if ($m != "''") {
986
-						if (!preg_match(',\W,', $m)) {
987
-							$m = $boucle->id_table . ".$m";
988
-						}
989
-
990
-						$m .= ' AS titre_rang';
991
-
992
-						$boucle->select[] = $m;
993
-						$_titre = '$Pile[$SP][\'titre_rang\']';
994
-					}
995
-				}
996
-			}
997
-
998
-			// si on n'a rien trouvé, on utilise le champ titre classique
999
-			if (!$_titre) {
1000
-				$_titre = champ_sql('titre', $p);
1001
-			}
1002
-
1003
-			// et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1004
-			// cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1005
-			$type_boucle = $boucle->type_requete;
1006
-			$objet = objet_type($type_boucle);
1007
-			$id_table_objet = id_table_objet($type_boucle);
1008
-			$_primary = champ_sql($id_table_objet, $p, '', false);
1009
-			$_env = '$Pile[0]';
1010
-
1011
-			if (!$_titre) {$_titre = "''";
1012
-			}
1013
-			if (!$_primary) {$_primary = "''";
1014
-			}
1015
-			$_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1016
-		}
1017
-
1018
-		$p->code = $_rang;
1019
-		$p->interdire_scripts = false;
1020
-	}
1021
-
1022
-	return $p;
953
+    $b = index_boucle($p);
954
+    if ($b === '') {
955
+        $msg = [
956
+            'zbug_champ_hors_boucle',
957
+            ['champ' => '#RANG']
958
+        ];
959
+        erreur_squelette($msg, $p);
960
+    } else {
961
+        // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
962
+        // dans la boucle immediatement englobante uniquement
963
+        // sinon on compose le champ calcule
964
+        $_rang = champ_sql('rang', $p, '', false);
965
+
966
+        // si pas trouve de champ sql rang :
967
+        if (!$_rang or $_rang == "''") {
968
+            $boucle = &$p->boucles[$b];
969
+
970
+            // on gere le cas ou #RANG est une extraction du numero dans le titre
971
+            $trouver_table = charger_fonction('trouver_table', 'base');
972
+            $desc = $trouver_table($boucle->id_table);
973
+            $_titre = ''; # où extraire le numero ?
974
+
975
+            if (isset($desc['titre'])) {
976
+                $t = $desc['titre'];
977
+                if (
978
+                    // Soit on trouve avec la déclaration de la lang AVANT
979
+                    preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
980
+                    // Soit on prend depuis le début
981
+                    or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
982
+                ) {
983
+                    $m = preg_replace(',as\s+titre$,i', '', $m[1]);
984
+                    $m = trim($m);
985
+                    if ($m != "''") {
986
+                        if (!preg_match(',\W,', $m)) {
987
+                            $m = $boucle->id_table . ".$m";
988
+                        }
989
+
990
+                        $m .= ' AS titre_rang';
991
+
992
+                        $boucle->select[] = $m;
993
+                        $_titre = '$Pile[$SP][\'titre_rang\']';
994
+                    }
995
+                }
996
+            }
997
+
998
+            // si on n'a rien trouvé, on utilise le champ titre classique
999
+            if (!$_titre) {
1000
+                $_titre = champ_sql('titre', $p);
1001
+            }
1002
+
1003
+            // et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1004
+            // cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1005
+            $type_boucle = $boucle->type_requete;
1006
+            $objet = objet_type($type_boucle);
1007
+            $id_table_objet = id_table_objet($type_boucle);
1008
+            $_primary = champ_sql($id_table_objet, $p, '', false);
1009
+            $_env = '$Pile[0]';
1010
+
1011
+            if (!$_titre) {$_titre = "''";
1012
+            }
1013
+            if (!$_primary) {$_primary = "''";
1014
+            }
1015
+            $_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1016
+        }
1017
+
1018
+        $p->code = $_rang;
1019
+        $p->interdire_scripts = false;
1020
+    }
1021
+
1022
+    return $p;
1023 1023
 }
1024 1024
 
1025 1025
 
@@ -1041,12 +1041,12 @@  discard block
 block discarded – undo
1041 1041
  *     Pile complétée par le code à générer
1042 1042
  **/
1043 1043
 function balise_POPULARITE_dist($p) {
1044
-	$_popularite = champ_sql('popularite', $p);
1045
-	$p->code = "(ceil(min(100, 100 * $_popularite
1044
+    $_popularite = champ_sql('popularite', $p);
1045
+    $p->code = "(ceil(min(100, 100 * $_popularite
1046 1046
 	/ max(1 , 0 + \$GLOBALS['meta']['popularite_max']))))";
1047
-	$p->interdire_scripts = false;
1047
+    $p->interdire_scripts = false;
1048 1048
 
1049
-	return $p;
1049
+    return $p;
1050 1050
 }
1051 1051
 
1052 1052
 /**
@@ -1057,8 +1057,8 @@  discard block
 block discarded – undo
1057 1057
  * l'absence peut-être due à une faute de frappe dans le contexte inclus.
1058 1058
  */
1059 1059
 define(
1060
-	'CODE_PAGINATION',
1061
-	'%s($Numrows["%s"]["grand_total"],
1060
+    'CODE_PAGINATION',
1061
+    '%s($Numrows["%s"]["grand_total"],
1062 1062
  		%s,
1063 1063
 		isset($Pile[0][%4$s])?$Pile[0][%4$s]:intval(_request(%4$s)),
1064 1064
 		%5$s, %6$s, %7$s, %8$s, array(%9$s))'
@@ -1095,75 +1095,75 @@  discard block
 block discarded – undo
1095 1095
  *     Pile complétée par le code à générer
1096 1096
  */
1097 1097
 function balise_PAGINATION_dist($p, $liste = 'true') {
1098
-	$b = index_boucle_mere($p);
1099
-
1100
-	// s'il n'y a pas de nom de boucle, on ne peut pas paginer
1101
-	if ($b === '') {
1102
-		$msg = [
1103
-			'zbug_champ_hors_boucle',
1104
-			['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1105
-		];
1106
-		erreur_squelette($msg, $p);
1107
-
1108
-		return $p;
1109
-	}
1110
-
1111
-	// s'il n'y a pas de mode_partie, c'est qu'on se trouve
1112
-	// dans un boucle recursive ou qu'on a oublie le critere {pagination}
1113
-	if (!$p->boucles[$b]->mode_partie) {
1114
-		if (!$p->boucles[$b]->table_optionnelle) {
1115
-			$msg = [
1116
-				'zbug_pagination_sans_critere',
1117
-				['champ' => '#PAGINATION']
1118
-			];
1119
-			erreur_squelette($msg, $p);
1120
-		}
1121
-
1122
-		return $p;
1123
-	}
1124
-
1125
-	// a priori true
1126
-	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1127
-	// si true, les arguments simples (sans truc=chose) vont degager
1128
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1129
-	if (is_countable($_contexte) ? count($_contexte) : 0) {
1130
-		$key = key($_contexte);
1131
-		if (is_numeric($key)) {
1132
-			array_shift($_contexte);
1133
-			$__modele = interprete_argument_balise(1, $p);
1134
-		}
1135
-	}
1136
-
1137
-	if (is_countable($_contexte) ? count($_contexte) : 0) {
1138
-		$code_contexte = implode(',', $_contexte);
1139
-	} else {
1140
-		$code_contexte = '';
1141
-	}
1142
-
1143
-	$connect = $p->boucles[$b]->sql_serveur;
1144
-	$pas = $p->boucles[$b]->total_parties;
1145
-	$f_pagination = chercher_filtre('pagination');
1146
-	$type = $p->boucles[$b]->modificateur['debut_nom'];
1147
-	$modif = ($type[0] !== "'") ? "'debut'.$type"
1148
-		: ("'debut" . substr($type, 1));
1149
-
1150
-	$p->code = sprintf(
1151
-		CODE_PAGINATION,
1152
-		$f_pagination,
1153
-		$b,
1154
-		$type,
1155
-		$modif,
1156
-		$pas,
1157
-		$liste,
1158
-		((isset($__modele) and $__modele) ? $__modele : "''"),
1159
-		_q($connect),
1160
-		$code_contexte
1161
-	);
1162
-
1163
-	$p->boucles[$b]->numrows = true;
1164
-	$p->interdire_scripts = false;
1165
-
1166
-	return $p;
1098
+    $b = index_boucle_mere($p);
1099
+
1100
+    // s'il n'y a pas de nom de boucle, on ne peut pas paginer
1101
+    if ($b === '') {
1102
+        $msg = [
1103
+            'zbug_champ_hors_boucle',
1104
+            ['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1105
+        ];
1106
+        erreur_squelette($msg, $p);
1107
+
1108
+        return $p;
1109
+    }
1110
+
1111
+    // s'il n'y a pas de mode_partie, c'est qu'on se trouve
1112
+    // dans un boucle recursive ou qu'on a oublie le critere {pagination}
1113
+    if (!$p->boucles[$b]->mode_partie) {
1114
+        if (!$p->boucles[$b]->table_optionnelle) {
1115
+            $msg = [
1116
+                'zbug_pagination_sans_critere',
1117
+                ['champ' => '#PAGINATION']
1118
+            ];
1119
+            erreur_squelette($msg, $p);
1120
+        }
1121
+
1122
+        return $p;
1123
+    }
1124
+
1125
+    // a priori true
1126
+    // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1127
+    // si true, les arguments simples (sans truc=chose) vont degager
1128
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1129
+    if (is_countable($_contexte) ? count($_contexte) : 0) {
1130
+        $key = key($_contexte);
1131
+        if (is_numeric($key)) {
1132
+            array_shift($_contexte);
1133
+            $__modele = interprete_argument_balise(1, $p);
1134
+        }
1135
+    }
1136
+
1137
+    if (is_countable($_contexte) ? count($_contexte) : 0) {
1138
+        $code_contexte = implode(',', $_contexte);
1139
+    } else {
1140
+        $code_contexte = '';
1141
+    }
1142
+
1143
+    $connect = $p->boucles[$b]->sql_serveur;
1144
+    $pas = $p->boucles[$b]->total_parties;
1145
+    $f_pagination = chercher_filtre('pagination');
1146
+    $type = $p->boucles[$b]->modificateur['debut_nom'];
1147
+    $modif = ($type[0] !== "'") ? "'debut'.$type"
1148
+        : ("'debut" . substr($type, 1));
1149
+
1150
+    $p->code = sprintf(
1151
+        CODE_PAGINATION,
1152
+        $f_pagination,
1153
+        $b,
1154
+        $type,
1155
+        $modif,
1156
+        $pas,
1157
+        $liste,
1158
+        ((isset($__modele) and $__modele) ? $__modele : "''"),
1159
+        _q($connect),
1160
+        $code_contexte
1161
+    );
1162
+
1163
+    $p->boucles[$b]->numrows = true;
1164
+    $p->interdire_scripts = false;
1165
+
1166
+    return $p;
1167 1167
 }
1168 1168
 
1169 1169
 
@@ -1190,11 +1190,11 @@  discard block
 block discarded – undo
1190 1190
  *     Pile complétée par le code à générer
1191 1191
  **/
1192 1192
 function balise_ANCRE_PAGINATION_dist($p) {
1193
-	if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1194
-		return $f($p, $liste = 'false');
1195
-	} else {
1196
-		return null;
1197
-	} // ou une erreur ?
1193
+    if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1194
+        return $f($p, $liste = 'false');
1195
+    } else {
1196
+        return null;
1197
+    } // ou une erreur ?
1198 1198
 }
1199 1199
 
1200 1200
 
@@ -1215,17 +1215,17 @@  discard block
 block discarded – undo
1215 1215
  *     Pile complétée par le code à générer
1216 1216
  **/
1217 1217
 function balise_GRAND_TOTAL_dist($p) {
1218
-	$b = index_boucle_mere($p);
1219
-	if ($b === '') {
1220
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1221
-		erreur_squelette($msg, $p);
1222
-	} else {
1223
-		$p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)";
1224
-		$p->boucles[$b]->numrows = true;
1225
-		$p->interdire_scripts = false;
1226
-	}
1218
+    $b = index_boucle_mere($p);
1219
+    if ($b === '') {
1220
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1221
+        erreur_squelette($msg, $p);
1222
+    } else {
1223
+        $p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)";
1224
+        $p->boucles[$b]->numrows = true;
1225
+        $p->interdire_scripts = false;
1226
+    }
1227 1227
 
1228
-	return $p;
1228
+    return $p;
1229 1229
 }
1230 1230
 
1231 1231
 
@@ -1253,10 +1253,10 @@  discard block
 block discarded – undo
1253 1253
  *     Pile complétée par le code à générer
1254 1254
  **/
1255 1255
 function balise_SELF_dist($p) {
1256
-	$p->code = 'self()';
1257
-	$p->interdire_scripts = false;
1256
+    $p->code = 'self()';
1257
+    $p->interdire_scripts = false;
1258 1258
 
1259
-	return $p;
1259
+    return $p;
1260 1260
 }
1261 1261
 
1262 1262
 
@@ -1283,17 +1283,17 @@  discard block
 block discarded – undo
1283 1283
  *     Pile complétée par le code à générer
1284 1284
  **/
1285 1285
 function balise_CHEMIN_dist($p) {
1286
-	$arg = interprete_argument_balise(1, $p);
1287
-	if (!$arg) {
1288
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1289
-		erreur_squelette($msg, $p);
1290
-	} else {
1291
-		$p->code = 'find_in_path((string)' . $arg . ')';
1292
-	}
1286
+    $arg = interprete_argument_balise(1, $p);
1287
+    if (!$arg) {
1288
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1289
+        erreur_squelette($msg, $p);
1290
+    } else {
1291
+        $p->code = 'find_in_path((string)' . $arg . ')';
1292
+    }
1293 1293
 
1294
-	$p->interdire_scripts = false;
1294
+    $p->interdire_scripts = false;
1295 1295
 
1296
-	return $p;
1296
+    return $p;
1297 1297
 }
1298 1298
 
1299 1299
 /**
@@ -1318,16 +1318,16 @@  discard block
 block discarded – undo
1318 1318
  *     Pile complétée par le code à générer
1319 1319
  **/
1320 1320
 function balise_CHEMIN_IMAGE_dist($p) {
1321
-	$arg = interprete_argument_balise(1, $p);
1322
-	if (!$arg) {
1323
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1324
-		erreur_squelette($msg, $p);
1325
-	} else {
1326
-		$p->code = 'chemin_image((string)' . $arg . ')';
1327
-	}
1321
+    $arg = interprete_argument_balise(1, $p);
1322
+    if (!$arg) {
1323
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1324
+        erreur_squelette($msg, $p);
1325
+    } else {
1326
+        $p->code = 'chemin_image((string)' . $arg . ')';
1327
+    }
1328 1328
 
1329
-	$p->interdire_scripts = false;
1330
-	return $p;
1329
+    $p->interdire_scripts = false;
1330
+    return $p;
1331 1331
 }
1332 1332
 
1333 1333
 
@@ -1365,36 +1365,36 @@  discard block
 block discarded – undo
1365 1365
  **/
1366 1366
 function balise_ENV_dist($p, $src = null) {
1367 1367
 
1368
-	// cle du tableau desiree
1369
-	$_nom = interprete_argument_balise(1, $p);
1370
-	// valeur par defaut
1371
-	$_sinon = interprete_argument_balise(2, $p);
1368
+    // cle du tableau desiree
1369
+    $_nom = interprete_argument_balise(1, $p);
1370
+    // valeur par defaut
1371
+    $_sinon = interprete_argument_balise(2, $p);
1372 1372
 
1373
-	// $src est un tableau de donnees sources eventuellement transmis
1374
-	// en absence, on utilise l'environnement du squelette $Pile[0]
1373
+    // $src est un tableau de donnees sources eventuellement transmis
1374
+    // en absence, on utilise l'environnement du squelette $Pile[0]
1375 1375
 
1376
-	if (!$_nom) {
1377
-		// cas de #ENV sans argument : on retourne le serialize() du tableau
1378
-		// une belle fonction [(#ENV|affiche_env)] serait pratique
1379
-		if ($src) {
1380
-			$p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1381
-		} else {
1382
-			$p->code = 'serialize($Pile[0]??[])';
1383
-		}
1384
-	} else {
1385
-		if (!$src) {
1386
-			$src = '$Pile[0]??[]';
1387
-		}
1388
-		if ($_sinon) {
1389
-			$p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1390
-		} else {
1391
-			$p->code = "table_valeur($src, (string)$_nom, null)";
1392
-		}
1393
-	}
1376
+    if (!$_nom) {
1377
+        // cas de #ENV sans argument : on retourne le serialize() du tableau
1378
+        // une belle fonction [(#ENV|affiche_env)] serait pratique
1379
+        if ($src) {
1380
+            $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1381
+        } else {
1382
+            $p->code = 'serialize($Pile[0]??[])';
1383
+        }
1384
+    } else {
1385
+        if (!$src) {
1386
+            $src = '$Pile[0]??[]';
1387
+        }
1388
+        if ($_sinon) {
1389
+            $p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1390
+        } else {
1391
+            $p->code = "table_valeur($src, (string)$_nom, null)";
1392
+        }
1393
+    }
1394 1394
 
1395
-	#$p->interdire_scripts = true;
1395
+    #$p->interdire_scripts = true;
1396 1396
 
1397
-	return $p;
1397
+    return $p;
1398 1398
 }
1399 1399
 
1400 1400
 /**
@@ -1424,16 +1424,16 @@  discard block
 block discarded – undo
1424 1424
  *     Pile completée du code PHP d'exécution de la balise
1425 1425
  */
1426 1426
 function balise_CONFIG_dist($p) {
1427
-	if (!$arg = interprete_argument_balise(1, $p)) {
1428
-		$arg = "''";
1429
-	}
1430
-	$_sinon = interprete_argument_balise(2, $p);
1431
-	$_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1427
+    if (!$arg = interprete_argument_balise(1, $p)) {
1428
+        $arg = "''";
1429
+    }
1430
+    $_sinon = interprete_argument_balise(2, $p);
1431
+    $_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1432 1432
 
1433
-	$p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1434
-		($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1433
+    $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1434
+        ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1435 1435
 
1436
-	return $p;
1436
+    return $p;
1437 1437
 }
1438 1438
 
1439 1439
 
@@ -1456,10 +1456,10 @@  discard block
 block discarded – undo
1456 1456
  *     Pile completée du code PHP d'exécution de la balise
1457 1457
  */
1458 1458
 function balise_CONNECT_dist($p) {
1459
-	$p->code = '($connect ? $connect : NULL)';
1460
-	$p->interdire_scripts = false;
1459
+    $p->code = '($connect ? $connect : NULL)';
1460
+    $p->interdire_scripts = false;
1461 1461
 
1462
-	return $p;
1462
+    return $p;
1463 1463
 }
1464 1464
 
1465 1465
 
@@ -1487,15 +1487,15 @@  discard block
 block discarded – undo
1487 1487
  *     Pile completée du code PHP d'exécution de la balise
1488 1488
  **/
1489 1489
 function balise_SESSION_dist($p) {
1490
-	$p->descr['session'] = true;
1490
+    $p->descr['session'] = true;
1491 1491
 
1492
-	$f = function_exists('balise_ENV')
1493
-		? 'balise_ENV'
1494
-		: 'balise_ENV_dist';
1492
+    $f = function_exists('balise_ENV')
1493
+        ? 'balise_ENV'
1494
+        : 'balise_ENV_dist';
1495 1495
 
1496
-	$p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1496
+    $p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1497 1497
 
1498
-	return $p;
1498
+    return $p;
1499 1499
 }
1500 1500
 
1501 1501
 
@@ -1518,18 +1518,18 @@  discard block
 block discarded – undo
1518 1518
  *     Pile completée du code PHP d'exécution de la balise
1519 1519
  **/
1520 1520
 function balise_SESSION_SET_dist($p) {
1521
-	$_nom = interprete_argument_balise(1, $p);
1522
-	$_val = interprete_argument_balise(2, $p);
1523
-	if (!$_nom or !$_val) {
1524
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1525
-		erreur_squelette($err_b_s_a, $p);
1526
-	} else {
1527
-		$p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1528
-	}
1521
+    $_nom = interprete_argument_balise(1, $p);
1522
+    $_val = interprete_argument_balise(2, $p);
1523
+    if (!$_nom or !$_val) {
1524
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1525
+        erreur_squelette($err_b_s_a, $p);
1526
+    } else {
1527
+        $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1528
+    }
1529 1529
 
1530
-	$p->interdire_scripts = false;
1530
+    $p->interdire_scripts = false;
1531 1531
 
1532
-	return $p;
1532
+    return $p;
1533 1533
 }
1534 1534
 
1535 1535
 
@@ -1560,30 +1560,30 @@  discard block
 block discarded – undo
1560 1560
  *     Pile completée du code PHP d'exécution de la balise
1561 1561
  **/
1562 1562
 function balise_EVAL_dist($p) {
1563
-	$php = interprete_argument_balise(1, $p);
1564
-	if ($php) {
1565
-		# optimisation sur les #EVAL{une expression sans #BALISE}
1566
-		# attention au commentaire "// x signes" qui precede
1567
-		if (
1568
-			preg_match(
1569
-				",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1570
-				$php,
1571
-				$r
1572
-			)
1573
-		) {
1574
-			$p->code = /* $r[1]. */
1575
-				'(' . $r[2] . ')';
1576
-		} else {
1577
-			$p->code = "eval('return '.$php.';')";
1578
-		}
1579
-	} else {
1580
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1581
-		erreur_squelette($msg, $p);
1582
-	}
1583
-
1584
-	#$p->interdire_scripts = true;
1585
-
1586
-	return $p;
1563
+    $php = interprete_argument_balise(1, $p);
1564
+    if ($php) {
1565
+        # optimisation sur les #EVAL{une expression sans #BALISE}
1566
+        # attention au commentaire "// x signes" qui precede
1567
+        if (
1568
+            preg_match(
1569
+                ",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1570
+                $php,
1571
+                $r
1572
+            )
1573
+        ) {
1574
+            $p->code = /* $r[1]. */
1575
+                '(' . $r[2] . ')';
1576
+        } else {
1577
+            $p->code = "eval('return '.$php.';')";
1578
+        }
1579
+    } else {
1580
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1581
+        erreur_squelette($msg, $p);
1582
+    }
1583
+
1584
+    #$p->interdire_scripts = true;
1585
+
1586
+    return $p;
1587 1587
 }
1588 1588
 
1589 1589
 
@@ -1613,19 +1613,19 @@  discard block
 block discarded – undo
1613 1613
  **/
1614 1614
 function balise_CHAMP_SQL_dist($p) {
1615 1615
 
1616
-	if (
1617
-		$p->param
1618
-		and isset($p->param[0][1][0])
1619
-		and $champ = ($p->param[0][1][0]->texte)
1620
-	) {
1621
-		$p->code = champ_sql($champ, $p);
1622
-	} else {
1623
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1624
-		erreur_squelette($err_b_s_a, $p);
1625
-	}
1616
+    if (
1617
+        $p->param
1618
+        and isset($p->param[0][1][0])
1619
+        and $champ = ($p->param[0][1][0]->texte)
1620
+    ) {
1621
+        $p->code = champ_sql($champ, $p);
1622
+    } else {
1623
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1624
+        erreur_squelette($err_b_s_a, $p);
1625
+    }
1626 1626
 
1627
-	#$p->interdire_scripts = true;
1628
-	return $p;
1627
+    #$p->interdire_scripts = true;
1628
+    return $p;
1629 1629
 }
1630 1630
 
1631 1631
 /**
@@ -1651,13 +1651,13 @@  discard block
 block discarded – undo
1651 1651
  *     Pile complétée par le code à générer
1652 1652
  **/
1653 1653
 function balise_VAL_dist($p) {
1654
-	$p->code = interprete_argument_balise(1, $p) ?? '';
1655
-	if (!strlen($p->code)) {
1656
-		$p->code = "''";
1657
-	}
1658
-	$p->interdire_scripts = false;
1654
+    $p->code = interprete_argument_balise(1, $p) ?? '';
1655
+    if (!strlen($p->code)) {
1656
+        $p->code = "''";
1657
+    }
1658
+    $p->interdire_scripts = false;
1659 1659
 
1660
-	return $p;
1660
+    return $p;
1661 1661
 }
1662 1662
 
1663 1663
 /**
@@ -1686,10 +1686,10 @@  discard block
 block discarded – undo
1686 1686
  *     Pile complétée par le code à générer
1687 1687
  **/
1688 1688
 function balise_REM_dist($p) {
1689
-	$p->code = "''";
1690
-	$p->interdire_scripts = false;
1689
+    $p->code = "''";
1690
+    $p->interdire_scripts = false;
1691 1691
 
1692
-	return $p;
1692
+    return $p;
1693 1693
 }
1694 1694
 
1695 1695
 /**
@@ -1699,10 +1699,10 @@  discard block
 block discarded – undo
1699 1699
  * @return mixed
1700 1700
  */
1701 1701
 function balise_NULL_dist($p) {
1702
-	$p->code = 'null';
1703
-	$p->interdire_scripts = false;
1702
+    $p->code = 'null';
1703
+    $p->interdire_scripts = false;
1704 1704
 
1705
-	return $p;
1705
+    return $p;
1706 1706
 }
1707 1707
 
1708 1708
 
@@ -1726,18 +1726,18 @@  discard block
 block discarded – undo
1726 1726
  **/
1727 1727
 function balise_HTTP_HEADER_dist($p) {
1728 1728
 
1729
-	$header = interprete_argument_balise(1, $p);
1730
-	if (!$header) {
1731
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1732
-		erreur_squelette($err_b_s_a, $p);
1733
-	} else {
1734
-		$p->code = "'<'.'?php header(' . _q("
1735
-			. $header
1736
-			. ") . '); ?'.'>'";
1737
-	}
1738
-	$p->interdire_scripts = false;
1729
+    $header = interprete_argument_balise(1, $p);
1730
+    if (!$header) {
1731
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1732
+        erreur_squelette($err_b_s_a, $p);
1733
+    } else {
1734
+        $p->code = "'<'.'?php header(' . _q("
1735
+            . $header
1736
+            . ") . '); ?'.'>'";
1737
+    }
1738
+    $p->interdire_scripts = false;
1739 1739
 
1740
-	return $p;
1740
+    return $p;
1741 1741
 }
1742 1742
 
1743 1743
 
@@ -1762,22 +1762,22 @@  discard block
 block discarded – undo
1762 1762
  *     Pile complétée par le code à générer
1763 1763
  **/
1764 1764
 function balise_FILTRE_dist($p) {
1765
-	if ($p->param) {
1766
-		$args = [];
1767
-		foreach ($p->param as $i => $ignore) {
1768
-			$args[] = interprete_argument_balise($i + 1, $p);
1769
-		}
1770
-		$p->code = "'<' . '"
1771
-			. '?php header("X-Spip-Filtre: \'.'
1772
-			. join('.\'|\'.', $args)
1773
-			. " . '\"); ?'.'>'";
1765
+    if ($p->param) {
1766
+        $args = [];
1767
+        foreach ($p->param as $i => $ignore) {
1768
+            $args[] = interprete_argument_balise($i + 1, $p);
1769
+        }
1770
+        $p->code = "'<' . '"
1771
+            . '?php header("X-Spip-Filtre: \'.'
1772
+            . join('.\'|\'.', $args)
1773
+            . " . '\"); ?'.'>'";
1774 1774
 
1775
-		$p->interdire_scripts = false;
1775
+        $p->interdire_scripts = false;
1776 1776
 
1777
-		return $p;
1778
-	}
1777
+        return $p;
1778
+    }
1779 1779
 
1780
-	return null;
1780
+    return null;
1781 1781
 }
1782 1782
 
1783 1783
 
@@ -1813,55 +1813,55 @@  discard block
 block discarded – undo
1813 1813
  **/
1814 1814
 function balise_CACHE_dist($p) {
1815 1815
 
1816
-	if ($p->param) {
1817
-		$duree = valeur_numerique($p->param[0][1][0]->texte);
1818
-
1819
-		// noter la duree du cache dans un entete proprietaire
1820
-
1821
-		$code = "'<'.'" . '?php header("X-Spip-Cache: '
1822
-			. $duree
1823
-			. '"); ?' . "'.'>'";
1824
-
1825
-		// Remplir le header Cache-Control
1826
-		// cas #CACHE{0}
1827
-		if ($duree == 0) {
1828
-			$code .= ".'<'.'"
1829
-				. '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1830
-				. "'.'><'.'"
1831
-				. '?php header("Pragma: no-cache"); ?'
1832
-				. "'.'>'";
1833
-		}
1834
-
1835
-		// recuperer les parametres suivants
1836
-		$i = 1;
1837
-		while (isset($p->param[0][++$i])) {
1838
-			$pa = ($p->param[0][$i][0]->texte);
1839
-
1840
-			if (
1841
-				$pa == 'cache-client'
1842
-				and $duree > 0
1843
-			) {
1844
-				$code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1845
-					. $duree
1846
-					. '"); ?' . "'.'>'";
1847
-				// il semble logique, si on cache-client, de ne pas invalider
1848
-				$pa = 'statique';
1849
-			}
1850
-
1851
-			if (
1852
-				$pa == 'statique'
1853
-				and $duree > 0
1854
-			) {
1855
-				$code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1856
-			}
1857
-		}
1858
-	} else {
1859
-		$code = "''";
1860
-	}
1861
-	$p->code = $code;
1862
-	$p->interdire_scripts = false;
1863
-
1864
-	return $p;
1816
+    if ($p->param) {
1817
+        $duree = valeur_numerique($p->param[0][1][0]->texte);
1818
+
1819
+        // noter la duree du cache dans un entete proprietaire
1820
+
1821
+        $code = "'<'.'" . '?php header("X-Spip-Cache: '
1822
+            . $duree
1823
+            . '"); ?' . "'.'>'";
1824
+
1825
+        // Remplir le header Cache-Control
1826
+        // cas #CACHE{0}
1827
+        if ($duree == 0) {
1828
+            $code .= ".'<'.'"
1829
+                . '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1830
+                . "'.'><'.'"
1831
+                . '?php header("Pragma: no-cache"); ?'
1832
+                . "'.'>'";
1833
+        }
1834
+
1835
+        // recuperer les parametres suivants
1836
+        $i = 1;
1837
+        while (isset($p->param[0][++$i])) {
1838
+            $pa = ($p->param[0][$i][0]->texte);
1839
+
1840
+            if (
1841
+                $pa == 'cache-client'
1842
+                and $duree > 0
1843
+            ) {
1844
+                $code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1845
+                    . $duree
1846
+                    . '"); ?' . "'.'>'";
1847
+                // il semble logique, si on cache-client, de ne pas invalider
1848
+                $pa = 'statique';
1849
+            }
1850
+
1851
+            if (
1852
+                $pa == 'statique'
1853
+                and $duree > 0
1854
+            ) {
1855
+                $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1856
+            }
1857
+        }
1858
+    } else {
1859
+        $code = "''";
1860
+    }
1861
+    $p->code = $code;
1862
+    $p->interdire_scripts = false;
1863
+
1864
+    return $p;
1865 1865
 }
1866 1866
 
1867 1867
 
@@ -1893,13 +1893,13 @@  discard block
 block discarded – undo
1893 1893
  *     Pile complétée par le code à générer
1894 1894
  */
1895 1895
 function balise_INSERT_HEAD_dist($p) {
1896
-	$p->code = "'<'.'"
1897
-		. '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1898
-		. "'.'>'";
1899
-	$p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1900
-	$p->interdire_scripts = false;
1896
+    $p->code = "'<'.'"
1897
+        . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1898
+        . "'.'>'";
1899
+    $p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1900
+    $p->interdire_scripts = false;
1901 1901
 
1902
-	return $p;
1902
+    return $p;
1903 1903
 }
1904 1904
 
1905 1905
 /**
@@ -1917,10 +1917,10 @@  discard block
 block discarded – undo
1917 1917
  *     Pile complétée par le code à générer
1918 1918
  */
1919 1919
 function balise_INSERT_HEAD_CSS_dist($p) {
1920
-	$p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1921
-	$p->interdire_scripts = false;
1920
+    $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1921
+    $p->interdire_scripts = false;
1922 1922
 
1923
-	return $p;
1923
+    return $p;
1924 1924
 }
1925 1925
 
1926 1926
 /**
@@ -1935,11 +1935,11 @@  discard block
 block discarded – undo
1935 1935
  *     Pile complétée par le code à générer
1936 1936
  **/
1937 1937
 function balise_INCLUDE_dist($p) {
1938
-	if (function_exists('balise_INCLURE')) {
1939
-		return balise_INCLURE($p);
1940
-	} else {
1941
-		return balise_INCLURE_dist($p);
1942
-	}
1938
+    if (function_exists('balise_INCLURE')) {
1939
+        return balise_INCLURE($p);
1940
+    } else {
1941
+        return balise_INCLURE_dist($p);
1942
+    }
1943 1943
 }
1944 1944
 
1945 1945
 /**
@@ -1973,66 +1973,66 @@  discard block
 block discarded – undo
1973 1973
  *     Pile complétée par le code à générer
1974 1974
  **/
1975 1975
 function balise_INCLURE_dist($p) {
1976
-	$id_boucle = $p->id_boucle;
1977
-	// la lang n'est pas passe de facon automatique par argumenter
1978
-	// mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1979
-	// en option
1980
-
1981
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1982
-
1983
-	// erreur de syntaxe = fond absent
1984
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1985
-	if (!$_contexte) {
1986
-		$_contexte = [];
1987
-	}
1988
-
1989
-	if (isset($_contexte['fond'])) {
1990
-		$f = $_contexte['fond'];
1991
-		// toujours vrai :
1992
-		if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1993
-			$f = $r[1];
1994
-			unset($_contexte['fond']);
1995
-		} else {
1996
-			spip_log('compilation de #INCLURE a revoir');
1997
-		}
1998
-
1999
-		// #INCLURE{doublons}
2000
-		if (isset($_contexte['doublons'])) {
2001
-			$_contexte['doublons'] = "'doublons' => \$doublons";
2002
-		}
2003
-
2004
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2005
-		$flag_env = false;
2006
-		if (isset($_contexte['env']) or isset($_contexte['self'])) {
2007
-			$flag_env = true;
2008
-			unset($_contexte['env']);
2009
-		}
2010
-
2011
-		$_options = [];
2012
-		if (isset($_contexte['ajax'])) {
2013
-			$_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2014
-			unset($_contexte['ajax']);
2015
-		}
2016
-		if ($p->etoile) {
2017
-			$_options[] = "'etoile'=>true";
2018
-		}
2019
-		$_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2020
-
2021
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2022
-		if ($flag_env) {
2023
-			$_l = "array_merge(\$Pile[0],$_l)";
2024
-		}
2025
-
2026
-		$p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''");
2027
-	} elseif (!isset($_contexte[1])) {
2028
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2029
-		erreur_squelette($msg, $p);
2030
-	} else {
2031
-		$p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2032
-	}
2033
-
2034
-	$p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2035
-	return $p;
1976
+    $id_boucle = $p->id_boucle;
1977
+    // la lang n'est pas passe de facon automatique par argumenter
1978
+    // mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1979
+    // en option
1980
+
1981
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1982
+
1983
+    // erreur de syntaxe = fond absent
1984
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1985
+    if (!$_contexte) {
1986
+        $_contexte = [];
1987
+    }
1988
+
1989
+    if (isset($_contexte['fond'])) {
1990
+        $f = $_contexte['fond'];
1991
+        // toujours vrai :
1992
+        if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1993
+            $f = $r[1];
1994
+            unset($_contexte['fond']);
1995
+        } else {
1996
+            spip_log('compilation de #INCLURE a revoir');
1997
+        }
1998
+
1999
+        // #INCLURE{doublons}
2000
+        if (isset($_contexte['doublons'])) {
2001
+            $_contexte['doublons'] = "'doublons' => \$doublons";
2002
+        }
2003
+
2004
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2005
+        $flag_env = false;
2006
+        if (isset($_contexte['env']) or isset($_contexte['self'])) {
2007
+            $flag_env = true;
2008
+            unset($_contexte['env']);
2009
+        }
2010
+
2011
+        $_options = [];
2012
+        if (isset($_contexte['ajax'])) {
2013
+            $_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2014
+            unset($_contexte['ajax']);
2015
+        }
2016
+        if ($p->etoile) {
2017
+            $_options[] = "'etoile'=>true";
2018
+        }
2019
+        $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2020
+
2021
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2022
+        if ($flag_env) {
2023
+            $_l = "array_merge(\$Pile[0],$_l)";
2024
+        }
2025
+
2026
+        $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''");
2027
+    } elseif (!isset($_contexte[1])) {
2028
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2029
+        erreur_squelette($msg, $p);
2030
+    } else {
2031
+        $p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2032
+    }
2033
+
2034
+    $p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2035
+    return $p;
2036 2036
 }
2037 2037
 
2038 2038
 
@@ -2060,69 +2060,69 @@  discard block
 block discarded – undo
2060 2060
  **/
2061 2061
 function balise_MODELE_dist($p) {
2062 2062
 
2063
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2064
-
2065
-	// erreur de syntaxe = fond absent
2066
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2067
-	if (!$_contexte) {
2068
-		$_contexte = [];
2069
-	}
2070
-
2071
-	if (!isset($_contexte[1])) {
2072
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2073
-		erreur_squelette($msg, $p);
2074
-	} else {
2075
-		$nom = $_contexte[1];
2076
-		unset($_contexte[1]);
2077
-
2078
-		if (preg_match("/^\s*'[^']*'/s", $nom)) {
2079
-			$nom = "'modeles/" . substr($nom, 1);
2080
-		} else {
2081
-			$nom = "'modeles/' . $nom";
2082
-		}
2083
-
2084
-		$flag_env = false;
2085
-		if (isset($_contexte['env'])) {
2086
-			$flag_env = true;
2087
-			unset($_contexte['env']);
2088
-		}
2089
-
2090
-		// Incoherence dans la syntaxe du contexte. A revoir.
2091
-		// Reserver la cle primaire de la boucle courante si elle existe
2092
-		if (isset($p->boucles[$p->id_boucle]->primary)) {
2093
-			$primary = $p->boucles[$p->id_boucle]->primary;
2094
-			if (!strpos($primary, ',')) {
2095
-				$id = champ_sql($primary, $p);
2096
-				$_contexte[] = "'$primary'=>" . $id;
2097
-				$_contexte[] = "'id'=>" . $id;
2098
-			}
2099
-		}
2100
-		$_contexte[] = "'recurs'=>(++\$recurs)";
2101
-		$connect = '';
2102
-		if (isset($p->boucles[$p->id_boucle])) {
2103
-			$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2104
-		}
2105
-
2106
-		$_options = memoriser_contexte_compil($p);
2107
-		$_options = "'compil'=>array($_options), 'trim'=>true";
2108
-		if (isset($_contexte['ajax'])) {
2109
-			$_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2110
-			unset($_contexte['ajax']);
2111
-		}
2112
-
2113
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2114
-		if ($flag_env) {
2115
-			$_l = "array_merge(\$Pile[0],$_l)";
2116
-		}
2117
-
2118
-		$page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2119
-
2120
-		$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2121
-
2122
-		$p->interdire_scripts = false; // securite assuree par le squelette
2123
-	}
2124
-
2125
-	return $p;
2063
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2064
+
2065
+    // erreur de syntaxe = fond absent
2066
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2067
+    if (!$_contexte) {
2068
+        $_contexte = [];
2069
+    }
2070
+
2071
+    if (!isset($_contexte[1])) {
2072
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2073
+        erreur_squelette($msg, $p);
2074
+    } else {
2075
+        $nom = $_contexte[1];
2076
+        unset($_contexte[1]);
2077
+
2078
+        if (preg_match("/^\s*'[^']*'/s", $nom)) {
2079
+            $nom = "'modeles/" . substr($nom, 1);
2080
+        } else {
2081
+            $nom = "'modeles/' . $nom";
2082
+        }
2083
+
2084
+        $flag_env = false;
2085
+        if (isset($_contexte['env'])) {
2086
+            $flag_env = true;
2087
+            unset($_contexte['env']);
2088
+        }
2089
+
2090
+        // Incoherence dans la syntaxe du contexte. A revoir.
2091
+        // Reserver la cle primaire de la boucle courante si elle existe
2092
+        if (isset($p->boucles[$p->id_boucle]->primary)) {
2093
+            $primary = $p->boucles[$p->id_boucle]->primary;
2094
+            if (!strpos($primary, ',')) {
2095
+                $id = champ_sql($primary, $p);
2096
+                $_contexte[] = "'$primary'=>" . $id;
2097
+                $_contexte[] = "'id'=>" . $id;
2098
+            }
2099
+        }
2100
+        $_contexte[] = "'recurs'=>(++\$recurs)";
2101
+        $connect = '';
2102
+        if (isset($p->boucles[$p->id_boucle])) {
2103
+            $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2104
+        }
2105
+
2106
+        $_options = memoriser_contexte_compil($p);
2107
+        $_options = "'compil'=>array($_options), 'trim'=>true";
2108
+        if (isset($_contexte['ajax'])) {
2109
+            $_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2110
+            unset($_contexte['ajax']);
2111
+        }
2112
+
2113
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2114
+        if ($flag_env) {
2115
+            $_l = "array_merge(\$Pile[0],$_l)";
2116
+        }
2117
+
2118
+        $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2119
+
2120
+        $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2121
+
2122
+        $p->interdire_scripts = false; // securite assuree par le squelette
2123
+    }
2124
+
2125
+    return $p;
2126 2126
 }
2127 2127
 
2128 2128
 
@@ -2146,21 +2146,21 @@  discard block
 block discarded – undo
2146 2146
  *     Pile complétée par le code à générer
2147 2147
  **/
2148 2148
 function balise_SET_dist($p) {
2149
-	$_nom = interprete_argument_balise(1, $p);
2150
-	$_val = interprete_argument_balise(2, $p);
2149
+    $_nom = interprete_argument_balise(1, $p);
2150
+    $_val = interprete_argument_balise(2, $p);
2151 2151
 
2152
-	if (!$_nom or !$_val) {
2153
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2154
-		erreur_squelette($err_b_s_a, $p);
2155
-	}
2156
-	// affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2157
-	// cf https://bugs.php.net/bug.php?id=65845
2158
-	else {
2159
-		$p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2160
-	}
2152
+    if (!$_nom or !$_val) {
2153
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2154
+        erreur_squelette($err_b_s_a, $p);
2155
+    }
2156
+    // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2157
+    // cf https://bugs.php.net/bug.php?id=65845
2158
+    else {
2159
+        $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2160
+    }
2161 2161
 
2162
-	$p->interdire_scripts = false; // la balise ne renvoie rien
2163
-	return $p;
2162
+    $p->interdire_scripts = false; // la balise ne renvoie rien
2163
+    return $p;
2164 2164
 }
2165 2165
 
2166 2166
 
@@ -2190,12 +2190,12 @@  discard block
 block discarded – undo
2190 2190
  *     Pile complétée par le code à générer
2191 2191
  **/
2192 2192
 function balise_GET_dist($p) {
2193
-	$p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2194
-	if (function_exists('balise_ENV')) {
2195
-		return balise_ENV($p, '$Pile["vars"]??[]');
2196
-	} else {
2197
-		return balise_ENV_dist($p, '$Pile["vars"]??[]');
2198
-	}
2193
+    $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2194
+    if (function_exists('balise_ENV')) {
2195
+        return balise_ENV($p, '$Pile["vars"]??[]');
2196
+    } else {
2197
+        return balise_ENV_dist($p, '$Pile["vars"]??[]');
2198
+    }
2199 2199
 }
2200 2200
 
2201 2201
 
@@ -2218,22 +2218,22 @@  discard block
 block discarded – undo
2218 2218
  *     Pile complétée par le code à générer
2219 2219
  **/
2220 2220
 function balise_DOUBLONS_dist($p) {
2221
-	if ($type = interprete_argument_balise(1, $p)) {
2222
-		if ($famille = interprete_argument_balise(2, $p)) {
2223
-			$type .= '.' . $famille;
2224
-		}
2225
-		$p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2226
-		if (!$p->etoile) {
2227
-			$p->code = 'array_filter(array_map("intval",explode(",",'
2228
-				. $p->code . ')))';
2229
-		}
2230
-	} else {
2231
-		$p->code = '$doublons';
2232
-	}
2221
+    if ($type = interprete_argument_balise(1, $p)) {
2222
+        if ($famille = interprete_argument_balise(2, $p)) {
2223
+            $type .= '.' . $famille;
2224
+        }
2225
+        $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2226
+        if (!$p->etoile) {
2227
+            $p->code = 'array_filter(array_map("intval",explode(",",'
2228
+                . $p->code . ')))';
2229
+        }
2230
+    } else {
2231
+        $p->code = '$doublons';
2232
+    }
2233 2233
 
2234
-	$p->interdire_scripts = false;
2234
+    $p->interdire_scripts = false;
2235 2235
 
2236
-	return $p;
2236
+    return $p;
2237 2237
 }
2238 2238
 
2239 2239
 
@@ -2256,18 +2256,18 @@  discard block
 block discarded – undo
2256 2256
  *     Pile complétée par le code à générer
2257 2257
  **/
2258 2258
 function balise_PIPELINE_dist($p) {
2259
-	$_pipe = interprete_argument_balise(1, $p);
2260
-	if (!$_pipe) {
2261
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2262
-		erreur_squelette($err_b_s_a, $p);
2263
-	} else {
2264
-		$_flux = interprete_argument_balise(2, $p);
2265
-		$_flux = $_flux ?: "''";
2266
-		$p->code = "pipeline( $_pipe , $_flux )";
2267
-		$p->interdire_scripts = false;
2268
-	}
2259
+    $_pipe = interprete_argument_balise(1, $p);
2260
+    if (!$_pipe) {
2261
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2262
+        erreur_squelette($err_b_s_a, $p);
2263
+    } else {
2264
+        $_flux = interprete_argument_balise(2, $p);
2265
+        $_flux = $_flux ?: "''";
2266
+        $p->code = "pipeline( $_pipe , $_flux )";
2267
+        $p->interdire_scripts = false;
2268
+    }
2269 2269
 
2270
-	return $p;
2270
+    return $p;
2271 2271
 }
2272 2272
 
2273 2273
 
@@ -2292,10 +2292,10 @@  discard block
 block discarded – undo
2292 2292
  *     Pile complétée par le code à générer
2293 2293
  **/
2294 2294
 function balise_EDIT_dist($p) {
2295
-	$p->code = "''";
2296
-	$p->interdire_scripts = false;
2295
+    $p->code = "''";
2296
+    $p->interdire_scripts = false;
2297 2297
 
2298
-	return $p;
2298
+    return $p;
2299 2299
 }
2300 2300
 
2301 2301
 
@@ -2318,11 +2318,11 @@  discard block
 block discarded – undo
2318 2318
  *     Pile complétée par le code à générer
2319 2319
  **/
2320 2320
 function balise_TOTAL_UNIQUE_dist($p) {
2321
-	$_famille = interprete_argument_balise(1, $p);
2322
-	$_famille = $_famille ?: "''";
2323
-	$p->code = "unique('', $_famille, true)";
2321
+    $_famille = interprete_argument_balise(1, $p);
2322
+    $_famille = $_famille ?: "''";
2323
+    $p->code = "unique('', $_famille, true)";
2324 2324
 
2325
-	return $p;
2325
+    return $p;
2326 2326
 }
2327 2327
 
2328 2328
 /**
@@ -2345,19 +2345,19 @@  discard block
 block discarded – undo
2345 2345
  *     Pile complétée par le code à générer
2346 2346
  **/
2347 2347
 function balise_ARRAY_dist($p) {
2348
-	$_code = [];
2349
-	$n = 1;
2350
-	do {
2351
-		$_key = interprete_argument_balise($n++, $p);
2352
-		$_val = interprete_argument_balise($n++, $p);
2353
-		if ($_key and $_val) {
2354
-			$_code[] = "$_key => $_val";
2355
-		}
2356
-	} while ($_key && $_val);
2357
-	$p->code = 'array(' . join(', ', $_code) . ')';
2358
-	$p->interdire_scripts = false;
2348
+    $_code = [];
2349
+    $n = 1;
2350
+    do {
2351
+        $_key = interprete_argument_balise($n++, $p);
2352
+        $_val = interprete_argument_balise($n++, $p);
2353
+        if ($_key and $_val) {
2354
+            $_code[] = "$_key => $_val";
2355
+        }
2356
+    } while ($_key && $_val);
2357
+    $p->code = 'array(' . join(', ', $_code) . ')';
2358
+    $p->interdire_scripts = false;
2359 2359
 
2360
-	return $p;
2360
+    return $p;
2361 2361
 }
2362 2362
 
2363 2363
 /**
@@ -2376,15 +2376,15 @@  discard block
 block discarded – undo
2376 2376
  *     Pile complétée par le code à générer
2377 2377
  */
2378 2378
 function balise_LISTE_dist($p) {
2379
-	$_code = [];
2380
-	$n = 1;
2381
-	while ($_val = interprete_argument_balise($n++, $p)) {
2382
-		$_code[] = $_val;
2383
-	}
2384
-	$p->code = 'array(' . join(', ', $_code) . ')';
2385
-	$p->interdire_scripts = false;
2379
+    $_code = [];
2380
+    $n = 1;
2381
+    while ($_val = interprete_argument_balise($n++, $p)) {
2382
+        $_code[] = $_val;
2383
+    }
2384
+    $p->code = 'array(' . join(', ', $_code) . ')';
2385
+    $p->interdire_scripts = false;
2386 2386
 
2387
-	return $p;
2387
+    return $p;
2388 2388
 }
2389 2389
 
2390 2390
 
@@ -2418,21 +2418,21 @@  discard block
 block discarded – undo
2418 2418
  *     Pile complétée par le code à générer
2419 2419
  **/
2420 2420
 function balise_AUTORISER_dist($p) {
2421
-	$_code = [];
2422
-	$p->descr['session'] = true; // faire un cache par session
2421
+    $_code = [];
2422
+    $p->descr['session'] = true; // faire un cache par session
2423 2423
 
2424
-	$n = 1;
2425
-	while ($_v = interprete_argument_balise($n++, $p)) {
2426
-		$_code[] = $_v;
2427
-	}
2424
+    $n = 1;
2425
+    while ($_v = interprete_argument_balise($n++, $p)) {
2426
+        $_code[] = $_v;
2427
+    }
2428 2428
 
2429
-	$p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2430
-		', ',
2431
-		$_code
2432
-	) . ')?" ":"")';
2433
-	$p->interdire_scripts = false;
2429
+    $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2430
+        ', ',
2431
+        $_code
2432
+    ) . ')?" ":"")';
2433
+    $p->interdire_scripts = false;
2434 2434
 
2435
-	return $p;
2435
+    return $p;
2436 2436
 }
2437 2437
 
2438 2438
 
@@ -2456,15 +2456,15 @@  discard block
 block discarded – undo
2456 2456
  *     Pile complétée par le code à générer
2457 2457
  **/
2458 2458
 function balise_PLUGIN_dist($p) {
2459
-	$plugin = interprete_argument_balise(1, $p);
2460
-	$plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2461
-	$type_info = interprete_argument_balise(2, $p);
2462
-	$type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2459
+    $plugin = interprete_argument_balise(1, $p);
2460
+    $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2461
+    $type_info = interprete_argument_balise(2, $p);
2462
+    $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2463 2463
 
2464
-	$f = chercher_filtre('info_plugin');
2465
-	$p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2464
+    $f = chercher_filtre('info_plugin');
2465
+    $p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2466 2466
 
2467
-	return $p;
2467
+    return $p;
2468 2468
 }
2469 2469
 
2470 2470
 /**
@@ -2485,9 +2485,9 @@  discard block
 block discarded – undo
2485 2485
  *     Pile complétée par le code à générer
2486 2486
  **/
2487 2487
 function balise_AIDER_dist($p) {
2488
-	$_motif = interprete_argument_balise(1, $p);
2489
-	$p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2490
-	return $p;
2488
+    $_motif = interprete_argument_balise(1, $p);
2489
+    $p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2490
+    return $p;
2491 2491
 }
2492 2492
 
2493 2493
 /**
@@ -2513,16 +2513,16 @@  discard block
 block discarded – undo
2513 2513
  *     Pile complétée par le code à générer
2514 2514
  **/
2515 2515
 function balise_ACTION_FORMULAIRE($p) {
2516
-	if (!$_url = interprete_argument_balise(1, $p)) {
2517
-		$_url = "(\$Pile[0]['action'] ?? '')";
2518
-	}
2519
-	if (!$_form = interprete_argument_balise(2, $p)) {
2520
-		$_form = "(\$Pile[0]['form'] ?? '')";
2521
-	}
2522
-
2523
-	// envoyer le nom du formulaire que l'on traite
2524
-	// transmettre les eventuels args de la balise formulaire
2525
-	$p->code = "	'<span class=\"form-hidden\">' .
2516
+    if (!$_url = interprete_argument_balise(1, $p)) {
2517
+        $_url = "(\$Pile[0]['action'] ?? '')";
2518
+    }
2519
+    if (!$_form = interprete_argument_balise(2, $p)) {
2520
+        $_form = "(\$Pile[0]['form'] ?? '')";
2521
+    }
2522
+
2523
+    // envoyer le nom du formulaire que l'on traite
2524
+    // transmettre les eventuels args de la balise formulaire
2525
+    $p->code = "	'<span class=\"form-hidden\">' .
2526 2526
 	form_hidden($_url) .
2527 2527
 	'<input name=\'formulaire_action\' type=\'hidden\'
2528 2528
 		value=\'' . $_form . '\' />' .
@@ -2533,9 +2533,9 @@  discard block
 block discarded – undo
2533 2533
 	(\$Pile[0]['_hidden'] ?? '') .
2534 2534
 	'</span>'";
2535 2535
 
2536
-	$p->interdire_scripts = false;
2536
+    $p->interdire_scripts = false;
2537 2537
 
2538
-	return $p;
2538
+    return $p;
2539 2539
 }
2540 2540
 
2541 2541
 
@@ -2576,25 +2576,25 @@  discard block
 block discarded – undo
2576 2576
  */
2577 2577
 function balise_BOUTON_ACTION_dist($p) {
2578 2578
 
2579
-	$args = [];
2580
-	for ($k = 1; $k <= 6; $k++) {
2581
-		$_a = interprete_argument_balise($k, $p);
2582
-		if (!$_a) {
2583
-			$_a = "''";
2584
-		}
2585
-		$args[] = $_a;
2586
-	}
2587
-	// supprimer les args vides
2588
-	while (end($args) == "''" and count($args) > 2) {
2589
-		array_pop($args);
2590
-	}
2591
-	$args = implode(',', $args);
2579
+    $args = [];
2580
+    for ($k = 1; $k <= 6; $k++) {
2581
+        $_a = interprete_argument_balise($k, $p);
2582
+        if (!$_a) {
2583
+            $_a = "''";
2584
+        }
2585
+        $args[] = $_a;
2586
+    }
2587
+    // supprimer les args vides
2588
+    while (end($args) == "''" and count($args) > 2) {
2589
+        array_pop($args);
2590
+    }
2591
+    $args = implode(',', $args);
2592 2592
 
2593
-	$bouton_action = chercher_filtre('bouton_action');
2594
-	$p->code = "$bouton_action($args)";
2595
-	$p->interdire_scripts = false;
2593
+    $bouton_action = chercher_filtre('bouton_action');
2594
+    $p->code = "$bouton_action($args)";
2595
+    $p->interdire_scripts = false;
2596 2596
 
2597
-	return $p;
2597
+    return $p;
2598 2598
 }
2599 2599
 
2600 2600
 
@@ -2613,10 +2613,10 @@  discard block
 block discarded – undo
2613 2613
  *     Pile complétée par le code à générer
2614 2614
  */
2615 2615
 function balise_SLOGAN_SITE_SPIP_dist($p) {
2616
-	$p->code = "\$GLOBALS['meta']['slogan_site']";
2616
+    $p->code = "\$GLOBALS['meta']['slogan_site']";
2617 2617
 
2618
-	#$p->interdire_scripts = true;
2619
-	return $p;
2618
+    #$p->interdire_scripts = true;
2619
+    return $p;
2620 2620
 }
2621 2621
 
2622 2622
 
@@ -2640,10 +2640,10 @@  discard block
 block discarded – undo
2640 2640
  *     Pile complétée par le code à générer
2641 2641
  */
2642 2642
 function balise_HTML5_dist($p) {
2643
-	$p->code = html5_permis() ? "' '" : "''";
2644
-	$p->interdire_scripts = false;
2643
+    $p->code = html5_permis() ? "' '" : "''";
2644
+    $p->interdire_scripts = false;
2645 2645
 
2646
-	return $p;
2646
+    return $p;
2647 2647
 }
2648 2648
 
2649 2649
 
@@ -2669,58 +2669,58 @@  discard block
 block discarded – undo
2669 2669
  *     Pile complétée par le code à générer
2670 2670
  */
2671 2671
 function balise_TRI_dist($p, $liste = 'true') {
2672
-	$b = index_boucle_mere($p);
2673
-	// s'il n'y a pas de nom de boucle, on ne peut pas trier
2674
-	if ($b === '') {
2675
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2676
-		erreur_squelette($msg, $p);
2677
-		$p->code = "''";
2672
+    $b = index_boucle_mere($p);
2673
+    // s'il n'y a pas de nom de boucle, on ne peut pas trier
2674
+    if ($b === '') {
2675
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2676
+        erreur_squelette($msg, $p);
2677
+        $p->code = "''";
2678 2678
 
2679
-		return $p;
2680
-	}
2681
-	$boucle = $p->boucles[$b];
2679
+        return $p;
2680
+    }
2681
+    $boucle = $p->boucles[$b];
2682 2682
 
2683
-	// s'il n'y a pas de tri_champ, c'est qu'on se trouve
2684
-	// dans un boucle recursive ou qu'on a oublie le critere {tri}
2685
-	if (!isset($boucle->modificateur['tri_champ'])) {
2686
-		$msg = ['zbug_champ_hors_critere', [
2687
-			'champ' => zbug_presenter_champ($p),
2688
-			'critere' => 'tri'
2689
-		]];
2690
-		erreur_squelette($msg, $p);
2691
-		$p->code = "''";
2683
+    // s'il n'y a pas de tri_champ, c'est qu'on se trouve
2684
+    // dans un boucle recursive ou qu'on a oublie le critere {tri}
2685
+    if (!isset($boucle->modificateur['tri_champ'])) {
2686
+        $msg = ['zbug_champ_hors_critere', [
2687
+            'champ' => zbug_presenter_champ($p),
2688
+            'critere' => 'tri'
2689
+        ]];
2690
+        erreur_squelette($msg, $p);
2691
+        $p->code = "''";
2692 2692
 
2693
-		return $p;
2694
-	}
2693
+        return $p;
2694
+    }
2695 2695
 
2696
-	// Différentes infos relatives au tri présentes dans les modificateurs
2697
-	$_tri_nom = $boucle->modificateur['tri_nom'] ; // nom du paramètre définissant le tri
2698
-	$_tri_champ = $boucle->modificateur['tri_champ']; // champ actuel utilisé le tri
2699
-	$_tri_sens = $boucle->modificateur['tri_sens']; // sens de tri actuel
2700
-	$_tri_liste_sens_defaut = $boucle->modificateur['tri_liste_sens_defaut']; // sens par défaut pour chaque champ
2696
+    // Différentes infos relatives au tri présentes dans les modificateurs
2697
+    $_tri_nom = $boucle->modificateur['tri_nom'] ; // nom du paramètre définissant le tri
2698
+    $_tri_champ = $boucle->modificateur['tri_champ']; // champ actuel utilisé le tri
2699
+    $_tri_sens = $boucle->modificateur['tri_sens']; // sens de tri actuel
2700
+    $_tri_liste_sens_defaut = $boucle->modificateur['tri_liste_sens_defaut']; // sens par défaut pour chaque champ
2701 2701
 
2702
-	$_champ_ou_sens = interprete_argument_balise(1, $p);
2703
-	// si pas de champ, renvoyer le critère de tri actuel
2704
-	if (!$_champ_ou_sens) {
2705
-		$p->code = $_tri_champ;
2702
+    $_champ_ou_sens = interprete_argument_balise(1, $p);
2703
+    // si pas de champ, renvoyer le critère de tri actuel
2704
+    if (!$_champ_ou_sens) {
2705
+        $p->code = $_tri_champ;
2706 2706
 
2707
-		return $p;
2708
-	}
2709
-	// forcer la jointure si besoin, et si le champ est statique
2710
-	if (preg_match(",^'([\w.]+)'$,i", $_champ_ou_sens, $m)) {
2711
-		index_pile($b, $m[1], $p->boucles, '', null, true, false);
2712
-	}
2707
+        return $p;
2708
+    }
2709
+    // forcer la jointure si besoin, et si le champ est statique
2710
+    if (preg_match(",^'([\w.]+)'$,i", $_champ_ou_sens, $m)) {
2711
+        index_pile($b, $m[1], $p->boucles, '', null, true, false);
2712
+    }
2713 2713
 
2714
-	$_libelle = interprete_argument_balise(2, $p);
2715
-	$_libelle = $_libelle ?: $_champ_ou_sens;
2714
+    $_libelle = interprete_argument_balise(2, $p);
2715
+    $_libelle = $_libelle ?: $_champ_ou_sens;
2716 2716
 
2717
-	$_class = interprete_argument_balise(3, $p) ?? "''";
2717
+    $_class = interprete_argument_balise(3, $p) ?? "''";
2718 2718
 
2719
-	$p->code = "calculer_balise_tri($_champ_ou_sens, $_libelle, $_class, $_tri_nom, $_tri_champ, $_tri_sens, $_tri_liste_sens_defaut)";
2719
+    $p->code = "calculer_balise_tri($_champ_ou_sens, $_libelle, $_class, $_tri_nom, $_tri_champ, $_tri_sens, $_tri_liste_sens_defaut)";
2720 2720
 
2721
-	$p->interdire_scripts = false;
2721
+    $p->interdire_scripts = false;
2722 2722
 
2723
-	return $p;
2723
+    return $p;
2724 2724
 }
2725 2725
 
2726 2726
 
@@ -2741,21 +2741,21 @@  discard block
 block discarded – undo
2741 2741
  *     Pile complétée par le code à générer
2742 2742
  */
2743 2743
 function balise_SAUTER_dist($p) {
2744
-	$id_boucle = $p->id_boucle;
2744
+    $id_boucle = $p->id_boucle;
2745 2745
 
2746
-	if (empty($p->boucles[$id_boucle])) {
2747
-		$msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2748
-		erreur_squelette($msg, $p);
2749
-	} else {
2750
-		$_saut = interprete_argument_balise(1, $p);
2751
-		$_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2752
-		$_total = "(\$Numrows['$id_boucle']['total'] ?? null)";
2746
+    if (empty($p->boucles[$id_boucle])) {
2747
+        $msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2748
+        erreur_squelette($msg, $p);
2749
+    } else {
2750
+        $_saut = interprete_argument_balise(1, $p);
2751
+        $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2752
+        $_total = "(\$Numrows['$id_boucle']['total'] ?? null)";
2753 2753
 
2754
-		$p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2755
-	}
2756
-	$p->interdire_scripts = false;
2754
+        $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2755
+    }
2756
+    $p->interdire_scripts = false;
2757 2757
 
2758
-	return $p;
2758
+    return $p;
2759 2759
 }
2760 2760
 
2761 2761
 
@@ -2777,22 +2777,22 @@  discard block
 block discarded – undo
2777 2777
  *     Pile complétée par le code à générer
2778 2778
  */
2779 2779
 function balise_PUBLIE_dist($p) {
2780
-	if (!$_type = interprete_argument_balise(1, $p)) {
2781
-		$_type = _q($p->type_requete);
2782
-		$_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2783
-	} else {
2784
-		$_id = interprete_argument_balise(2, $p);
2785
-	}
2780
+    if (!$_type = interprete_argument_balise(1, $p)) {
2781
+        $_type = _q($p->type_requete);
2782
+        $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2783
+    } else {
2784
+        $_id = interprete_argument_balise(2, $p);
2785
+    }
2786 2786
 
2787
-	$connect = '';
2788
-	if (isset($p->boucles[$p->id_boucle])) {
2789
-		$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2790
-	}
2787
+    $connect = '';
2788
+    if (isset($p->boucles[$p->id_boucle])) {
2789
+        $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2790
+    }
2791 2791
 
2792
-	$p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2793
-	$p->interdire_scripts = false;
2792
+    $p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2793
+    $p->interdire_scripts = false;
2794 2794
 
2795
-	return $p;
2795
+    return $p;
2796 2796
 }
2797 2797
 
2798 2798
 /**
@@ -2821,12 +2821,12 @@  discard block
 block discarded – undo
2821 2821
  *     Pile complétée par le code à générer
2822 2822
  */
2823 2823
 function balise_PRODUIRE_dist($p) {
2824
-	$balise_inclure = charger_fonction('INCLURE', 'balise');
2825
-	$p = $balise_inclure($p);
2824
+    $balise_inclure = charger_fonction('INCLURE', 'balise');
2825
+    $p = $balise_inclure($p);
2826 2826
 
2827
-	$p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2827
+    $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2828 2828
 
2829
-	return $p;
2829
+    return $p;
2830 2830
 }
2831 2831
 
2832 2832
 /**
@@ -2845,13 +2845,13 @@  discard block
 block discarded – undo
2845 2845
  *     Pile complétée par le code à générer
2846 2846
  */
2847 2847
 function balise_LARGEUR_ECRAN_dist($p) {
2848
-	$_class = interprete_argument_balise(1, $p);
2849
-	if (!$_class) {
2850
-		$_class = 'null';
2851
-	}
2852
-	$p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2848
+    $_class = interprete_argument_balise(1, $p);
2849
+    if (!$_class) {
2850
+        $_class = 'null';
2851
+    }
2852
+    $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2853 2853
 
2854
-	return $p;
2854
+    return $p;
2855 2855
 }
2856 2856
 
2857 2857
 
@@ -2867,14 +2867,14 @@  discard block
 block discarded – undo
2867 2867
  *     Pile complétée par le code à générer
2868 2868
  **/
2869 2869
 function balise_CONST_dist($p) {
2870
-	$_const = interprete_argument_balise(1, $p);
2871
-	if (!strlen($_const ?? '')) {
2872
-		$p->code = "''";
2873
-	}
2874
-	else {
2875
-		$p->code = "(defined($_const)?constant($_const):'')";
2876
-	}
2877
-	$p->interdire_scripts = false;
2878
-
2879
-	return $p;
2870
+    $_const = interprete_argument_balise(1, $p);
2871
+    if (!strlen($_const ?? '')) {
2872
+        $p->code = "''";
2873
+    }
2874
+    else {
2875
+        $p->code = "(defined($_const)?constant($_const):'')";
2876
+    }
2877
+    $p->interdire_scripts = false;
2878
+
2879
+    return $p;
2880 2880
 }
Please login to merge, or discard this patch.
ecrire/public/cacher.php 1 patch
Indentation   +321 added lines, -321 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 /**
@@ -25,9 +25,9 @@  discard block
 block discarded – undo
25 25
  * @return string
26 26
  */
27 27
 function generer_nom_fichier_cache($contexte, $page) {
28
-	$u = md5(var_export([$contexte, $page], true));
28
+    $u = md5(var_export([$contexte, $page], true));
29 29
 
30
-	return $u . '.cache';
30
+    return $u . '.cache';
31 31
 }
32 32
 
33 33
 /**
@@ -43,26 +43,26 @@  discard block
 block discarded – undo
43 43
  * @return string
44 44
  */
45 45
 function cache_chemin_fichier($nom_cache, $ecrire = false) {
46
-	static $l1, $l2;
47
-	if (is_null($l1)) {
48
-		$length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
49
-		$l1 = intval(floor($length / 2));
50
-		$l2 = $length - $l1;
51
-	}
52
-	$d = substr($nom_cache, 0, $l1);
53
-	$u = substr($nom_cache, $l1, $l2);
54
-
55
-	if ($ecrire) {
56
-		$rep = sous_repertoire(_DIR_CACHE, '', false, true);
57
-		$rep = sous_repertoire($rep, 'calcul/', false, true);
58
-		$rep = sous_repertoire($rep, $d, false, true);
59
-	}
60
-	else {
61
-		// en lecture on essaye pas de creer les repertoires, on va au plus vite
62
-		$rep = _DIR_CACHE . "calcul/$d/";
63
-	}
64
-
65
-	return $rep . $u . '.cache';
46
+    static $l1, $l2;
47
+    if (is_null($l1)) {
48
+        $length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
49
+        $l1 = intval(floor($length / 2));
50
+        $l2 = $length - $l1;
51
+    }
52
+    $d = substr($nom_cache, 0, $l1);
53
+    $u = substr($nom_cache, $l1, $l2);
54
+
55
+    if ($ecrire) {
56
+        $rep = sous_repertoire(_DIR_CACHE, '', false, true);
57
+        $rep = sous_repertoire($rep, 'calcul/', false, true);
58
+        $rep = sous_repertoire($rep, $d, false, true);
59
+    }
60
+    else {
61
+        // en lecture on essaye pas de creer les repertoires, on va au plus vite
62
+        $rep = _DIR_CACHE . "calcul/$d/";
63
+    }
64
+
65
+    return $rep . $u . '.cache';
66 66
 }
67 67
 
68 68
 /**
@@ -73,7 +73,7 @@  discard block
 block discarded – undo
73 73
  * @return bool
74 74
  */
75 75
 function ecrire_cache($nom_cache, $valeur) {
76
-	return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur]));
76
+    return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur]));
77 77
 }
78 78
 
79 79
 /**
@@ -83,38 +83,38 @@  discard block
 block discarded – undo
83 83
  * @return mixed
84 84
  */
85 85
 function lire_cache($nom_cache) {
86
-	$tmp = [];
87
-	if (
88
-		file_exists($f = cache_chemin_fichier($nom_cache))
89
-		and lire_fichier($f, $tmp)
90
-		and $tmp = unserialize($tmp)
91
-		and $tmp['nom_cache'] == $nom_cache
92
-		and isset($tmp['valeur'])
93
-	) {
94
-		return $tmp['valeur'];
95
-	}
96
-
97
-	return false;
86
+    $tmp = [];
87
+    if (
88
+        file_exists($f = cache_chemin_fichier($nom_cache))
89
+        and lire_fichier($f, $tmp)
90
+        and $tmp = unserialize($tmp)
91
+        and $tmp['nom_cache'] == $nom_cache
92
+        and isset($tmp['valeur'])
93
+    ) {
94
+        return $tmp['valeur'];
95
+    }
96
+
97
+    return false;
98 98
 }
99 99
 
100 100
 // Parano : on signe le cache, afin d'interdire un hack d'injection
101 101
 // dans notre memcache
102 102
 function cache_signature(&$page) {
103
-	if (!isset($GLOBALS['meta']['cache_signature'])) {
104
-		include_spip('inc/acces');
105
-		include_spip('auth/sha256.inc');
106
-		ecrire_meta(
107
-			'cache_signature',
108
-			spip_sha256(
109
-				$_SERVER['DOCUMENT_ROOT']
110
-				. ($_SERVER['SERVER_SIGNATURE'] ?? '')
111
-				. creer_uniqid()
112
-			),
113
-			'non'
114
-		);
115
-	}
116
-
117
-	return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']);
103
+    if (!isset($GLOBALS['meta']['cache_signature'])) {
104
+        include_spip('inc/acces');
105
+        include_spip('auth/sha256.inc');
106
+        ecrire_meta(
107
+            'cache_signature',
108
+            spip_sha256(
109
+                $_SERVER['DOCUMENT_ROOT']
110
+                . ($_SERVER['SERVER_SIGNATURE'] ?? '')
111
+                . creer_uniqid()
112
+            ),
113
+            'non'
114
+        );
115
+    }
116
+
117
+    return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']);
118 118
 }
119 119
 
120 120
 /**
@@ -127,14 +127,14 @@  discard block
 block discarded – undo
127 127
  * @return array
128 128
  */
129 129
 function gzip_page($page) {
130
-	if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) {
131
-		$page['gz'] = true;
132
-		$page['texte'] = gzcompress($page['texte']);
133
-	} else {
134
-		$page['gz'] = false;
135
-	}
136
-
137
-	return $page;
130
+    if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) {
131
+        $page['gz'] = true;
132
+        $page['texte'] = gzcompress($page['texte']);
133
+    } else {
134
+        $page['gz'] = false;
135
+    }
136
+
137
+    return $page;
138 138
 }
139 139
 
140 140
 /**
@@ -147,10 +147,10 @@  discard block
 block discarded – undo
147 147
  * @return void
148 148
  */
149 149
 function gunzip_page(&$page) {
150
-	if ($page['gz']) {
151
-		$page['texte'] = gzuncompress($page['texte']);
152
-		$page['gz'] = false; // ne pas gzuncompress deux fois une meme page
153
-	}
150
+    if ($page['gz']) {
151
+        $page['texte'] = gzuncompress($page['texte']);
152
+        $page['gz'] = false; // ne pas gzuncompress deux fois une meme page
153
+    }
154 154
 }
155 155
 
156 156
 /**
@@ -165,72 +165,72 @@  discard block
 block discarded – undo
165 165
  * -1 si il faut calculer sans stocker en cache
166 166
  */
167 167
 function cache_valide(&$page, $date) {
168
-	$now = $_SERVER['REQUEST_TIME'];
169
-
170
-	// Apparition d'un nouvel article post-date ?
171
-	if (
172
-		isset($GLOBALS['meta']['post_dates'])
173
-		and $GLOBALS['meta']['post_dates'] == 'non'
174
-		and isset($GLOBALS['meta']['date_prochain_postdate'])
175
-		and $now > $GLOBALS['meta']['date_prochain_postdate']
176
-	) {
177
-		spip_log('Un article post-date invalide le cache');
178
-		include_spip('inc/rubriques');
179
-		calculer_prochain_postdate(true);
180
-	}
181
-
182
-	if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) {
183
-		return -1;
184
-	}
185
-	if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
186
-		return -1;
187
-	}
188
-	if (defined('_NO_CACHE')) {
189
-		return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE;
190
-	}
191
-
192
-	// pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
193
-	if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) {
194
-		return _IS_BOT ? -1 : 1;
195
-	}
196
-
197
-	// controle de la signature
198
-	if ($page['sig'] !== cache_signature($page)) {
199
-		return _IS_BOT ? -1 : 1;
200
-	}
201
-
202
-	// #CACHE{n,statique} => on n'invalide pas avec derniere_modif
203
-	// cf. ecrire/public/balises.php, balise_CACHE_dist()
204
-	if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') {
205
-		// Cache invalide par la meta 'derniere_modif'
206
-		// sauf pour les bots, qui utilisent toujours le cache
207
-		if (
208
-			!_IS_BOT
209
-			and $GLOBALS['derniere_modif_invalide']
210
-			and isset($GLOBALS['meta']['derniere_modif'])
211
-			and $date < $GLOBALS['meta']['derniere_modif']
212
-		) {
213
-			return 1;
214
-		}
215
-	}
216
-
217
-	// Sinon comparer l'age du fichier a sa duree de cache
218
-	$duree = intval($page['entetes']['X-Spip-Cache']);
219
-	$cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
220
-	if ($duree == 0) {  #CACHE{0}
221
-	return -1;
222
-	} // sauf pour les bots, qui utilisent toujours le cache
223
-	else {
224
-		if (
225
-			(!_IS_BOT and $date + $duree < $now)
226
-			# le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots
227
-			or $date < $cache_mark
228
-		) {
229
-			return _IS_BOT ? -1 : 1;
230
-		} else {
231
-			return 0;
232
-		}
233
-	}
168
+    $now = $_SERVER['REQUEST_TIME'];
169
+
170
+    // Apparition d'un nouvel article post-date ?
171
+    if (
172
+        isset($GLOBALS['meta']['post_dates'])
173
+        and $GLOBALS['meta']['post_dates'] == 'non'
174
+        and isset($GLOBALS['meta']['date_prochain_postdate'])
175
+        and $now > $GLOBALS['meta']['date_prochain_postdate']
176
+    ) {
177
+        spip_log('Un article post-date invalide le cache');
178
+        include_spip('inc/rubriques');
179
+        calculer_prochain_postdate(true);
180
+    }
181
+
182
+    if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) {
183
+        return -1;
184
+    }
185
+    if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
186
+        return -1;
187
+    }
188
+    if (defined('_NO_CACHE')) {
189
+        return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE;
190
+    }
191
+
192
+    // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
193
+    if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) {
194
+        return _IS_BOT ? -1 : 1;
195
+    }
196
+
197
+    // controle de la signature
198
+    if ($page['sig'] !== cache_signature($page)) {
199
+        return _IS_BOT ? -1 : 1;
200
+    }
201
+
202
+    // #CACHE{n,statique} => on n'invalide pas avec derniere_modif
203
+    // cf. ecrire/public/balises.php, balise_CACHE_dist()
204
+    if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') {
205
+        // Cache invalide par la meta 'derniere_modif'
206
+        // sauf pour les bots, qui utilisent toujours le cache
207
+        if (
208
+            !_IS_BOT
209
+            and $GLOBALS['derniere_modif_invalide']
210
+            and isset($GLOBALS['meta']['derniere_modif'])
211
+            and $date < $GLOBALS['meta']['derniere_modif']
212
+        ) {
213
+            return 1;
214
+        }
215
+    }
216
+
217
+    // Sinon comparer l'age du fichier a sa duree de cache
218
+    $duree = intval($page['entetes']['X-Spip-Cache']);
219
+    $cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
220
+    if ($duree == 0) {  #CACHE{0}
221
+    return -1;
222
+    } // sauf pour les bots, qui utilisent toujours le cache
223
+    else {
224
+        if (
225
+            (!_IS_BOT and $date + $duree < $now)
226
+            # le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots
227
+            or $date < $cache_mark
228
+        ) {
229
+            return _IS_BOT ? -1 : 1;
230
+        } else {
231
+            return 0;
232
+        }
233
+    }
234 234
 }
235 235
 
236 236
 /**
@@ -243,59 +243,59 @@  discard block
 block discarded – undo
243 243
  */
244 244
 function creer_cache(&$page, &$chemin_cache) {
245 245
 
246
-	// Ne rien faire si on est en preview, debug, ou si une erreur
247
-	// grave s'est presentee (compilation du squelette, MySQL, etc)
248
-	// le cas var_nocache ne devrait jamais arriver ici (securite)
249
-	// le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
250
-	if (
251
-		(defined('_VAR_NOCACHE') and _VAR_NOCACHE)
252
-		or defined('spip_interdire_cache')
253
-	) {
254
-		return;
255
-	}
256
-
257
-	// Si la page c1234 a un invalideur de session 'zz', sauver dans
258
-	// 'tmp/cache/MD5(chemin_cache)_zz'
259
-	if (
260
-		isset($page['invalideurs'])
261
-		and isset($page['invalideurs']['session'])
262
-	) {
263
-		// on verifie que le contenu du chemin cache indique seulement
264
-		// "cache sessionne" ; sa date indique la date de validite
265
-		// des caches sessionnes
266
-		if (!$tmp = lire_cache($chemin_cache)) {
267
-			spip_log('Creation cache sessionne ' . $chemin_cache);
268
-			$tmp = [
269
-				'invalideurs' => ['session' => ''],
270
-				'lastmodified' => $_SERVER['REQUEST_TIME']
271
-			];
272
-			ecrire_cache($chemin_cache, $tmp);
273
-		}
274
-		$chemin_cache = generer_nom_fichier_cache(
275
-			['chemin_cache' => $chemin_cache],
276
-			['session' => $page['invalideurs']['session']]
277
-		);
278
-	}
279
-
280
-	// ajouter la date de production dans le cache lui meme
281
-	// (qui contient deja sa duree de validite)
282
-	$page['lastmodified'] = $_SERVER['REQUEST_TIME'];
283
-
284
-	// compresser le contenu si besoin
285
-	$pagez = gzip_page($page);
286
-
287
-	// signer le contenu
288
-	$pagez['sig'] = cache_signature($pagez);
289
-
290
-	// l'enregistrer, compresse ou non...
291
-	$ok = ecrire_cache($chemin_cache, $pagez);
292
-
293
-	spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour "
294
-		. $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
295
-
296
-	// Inserer ses invalideurs
297
-	include_spip('inc/invalideur');
298
-	maj_invalideurs($chemin_cache, $page);
246
+    // Ne rien faire si on est en preview, debug, ou si une erreur
247
+    // grave s'est presentee (compilation du squelette, MySQL, etc)
248
+    // le cas var_nocache ne devrait jamais arriver ici (securite)
249
+    // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
250
+    if (
251
+        (defined('_VAR_NOCACHE') and _VAR_NOCACHE)
252
+        or defined('spip_interdire_cache')
253
+    ) {
254
+        return;
255
+    }
256
+
257
+    // Si la page c1234 a un invalideur de session 'zz', sauver dans
258
+    // 'tmp/cache/MD5(chemin_cache)_zz'
259
+    if (
260
+        isset($page['invalideurs'])
261
+        and isset($page['invalideurs']['session'])
262
+    ) {
263
+        // on verifie que le contenu du chemin cache indique seulement
264
+        // "cache sessionne" ; sa date indique la date de validite
265
+        // des caches sessionnes
266
+        if (!$tmp = lire_cache($chemin_cache)) {
267
+            spip_log('Creation cache sessionne ' . $chemin_cache);
268
+            $tmp = [
269
+                'invalideurs' => ['session' => ''],
270
+                'lastmodified' => $_SERVER['REQUEST_TIME']
271
+            ];
272
+            ecrire_cache($chemin_cache, $tmp);
273
+        }
274
+        $chemin_cache = generer_nom_fichier_cache(
275
+            ['chemin_cache' => $chemin_cache],
276
+            ['session' => $page['invalideurs']['session']]
277
+        );
278
+    }
279
+
280
+    // ajouter la date de production dans le cache lui meme
281
+    // (qui contient deja sa duree de validite)
282
+    $page['lastmodified'] = $_SERVER['REQUEST_TIME'];
283
+
284
+    // compresser le contenu si besoin
285
+    $pagez = gzip_page($page);
286
+
287
+    // signer le contenu
288
+    $pagez['sig'] = cache_signature($pagez);
289
+
290
+    // l'enregistrer, compresse ou non...
291
+    $ok = ecrire_cache($chemin_cache, $pagez);
292
+
293
+    spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour "
294
+        . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
295
+
296
+    // Inserer ses invalideurs
297
+    include_spip('inc/invalideur');
298
+    maj_invalideurs($chemin_cache, $page);
299 299
 }
300 300
 
301 301
 
@@ -308,15 +308,15 @@  discard block
 block discarded – undo
308 308
  * @return void
309 309
  */
310 310
 function nettoyer_petit_cache($prefix, $duree = 300) {
311
-	// determiner le repertoire a purger : 'tmp/CACHE/rech/'
312
-	$dircache = sous_repertoire(_DIR_CACHE, $prefix);
313
-	if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) {
314
-		foreach (preg_files($dircache, '[.]txt$') as $f) {
315
-			if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) {
316
-				spip_unlink($f);
317
-			}
318
-		}
319
-	}
311
+    // determiner le repertoire a purger : 'tmp/CACHE/rech/'
312
+    $dircache = sous_repertoire(_DIR_CACHE, $prefix);
313
+    if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) {
314
+        foreach (preg_files($dircache, '[.]txt$') as $f) {
315
+            if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) {
316
+                spip_unlink($f);
317
+            }
318
+        }
319
+    }
320 320
 }
321 321
 
322 322
 
@@ -344,134 +344,134 @@  discard block
 block discarded – undo
344 344
  */
345 345
 function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) {
346 346
 
347
-	# fonction de cache minimale : dire "non on ne met rien en cache"
348
-	# $use_cache = -1; return;
349
-
350
-	// Second appel, destine a l'enregistrement du cache sur le disque
351
-	if (isset($chemin_cache)) {
352
-		creer_cache($page, $chemin_cache);
353
-		return;
354
-	}
355
-
356
-	// Toute la suite correspond au premier appel
357
-	$contexte_implicite = $page['contexte_implicite'];
358
-
359
-	// Cas ignorant le cache car completement dynamique
360
-	if (
361
-		(!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST')
362
-		or _request('connect')
363
-	) {
364
-		$use_cache = -1;
365
-		$lastmodified = 0;
366
-		$chemin_cache = '';
367
-		$page = [];
368
-
369
-		return;
370
-	}
371
-
372
-	// Controler l'existence d'un cache nous correspondant
373
-	$chemin_cache = generer_nom_fichier_cache($contexte, $page);
374
-	$lastmodified = 0;
375
-
376
-	// charger le cache s'il existe (et si il a bien le bon hash = anticollision)
377
-	if (!$page = lire_cache($chemin_cache)) {
378
-		$page = [];
379
-	}
380
-
381
-	// s'il est sessionne, charger celui correspondant a notre session
382
-	if (
383
-		isset($page['invalideurs'])
384
-		and isset($page['invalideurs']['session'])
385
-	) {
386
-		$chemin_cache_session = generer_nom_fichier_cache(
387
-			['chemin_cache' => $chemin_cache],
388
-			['session' => spip_session()]
389
-		);
390
-		if (
391
-			$page_session = lire_cache($chemin_cache_session)
392
-			and $page_session['lastmodified'] >= $page['lastmodified']
393
-		) {
394
-			$page = $page_session;
395
-		} else {
396
-			$page = [];
397
-		}
398
-	}
399
-
400
-
401
-	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
402
-	if (isset($GLOBALS['meta']['invalider'])) {
403
-		// ne le faire que si la base est disponible
404
-		if (spip_connect()) {
405
-			include_spip('inc/invalideur');
406
-			retire_caches($chemin_cache); # API invalideur inutile
407
-			supprimer_fichier(_DIR_CACHE . $chemin_cache);
408
-			if (isset($chemin_cache_session) and $chemin_cache_session) {
409
-				supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
410
-			}
411
-		}
412
-	}
413
-
414
-	// Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
415
-	// on supprime le cache
416
-	if (
417
-		defined('_VAR_MODE') &&
418
-		_VAR_MODE &&
419
-		(isset($_COOKIE['spip_session']) ||
420
-			isset($_COOKIE['spip_admin']) ||
421
-			@file_exists(_ACCESS_FILE_NAME))
422
-	) {
423
-		$page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
424
-		include_spip('inc/invalideur');
425
-		retire_caches($chemin_cache); # API invalideur inutile
426
-		supprimer_fichier(_DIR_CACHE . $chemin_cache);
427
-		if (isset($chemin_cache_session) and $chemin_cache_session) {
428
-			supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
429
-		}
430
-	}
431
-
432
-	// $delais par defaut
433
-	// pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
434
-	// qui sont a cache nul par defaut
435
-	if (!isset($GLOBALS['delais'])) {
436
-		if (!defined('_DUREE_CACHE_DEFAUT')) {
437
-			define('_DUREE_CACHE_DEFAUT', 24 * 3600);
438
-		}
439
-		$GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
440
-	}
441
-
442
-	// determiner la validite de la page
443
-	if ($page) {
444
-		$use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
445
-		// le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
446
-		// par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
447
-		$page['contexte_implicite'] = $contexte_implicite;
448
-		if (!$use_cache) {
449
-			// $page est un cache utilisable
450
-			gunzip_page($page);
451
-
452
-			return;
453
-		}
454
-	} else {
455
-		$page = ['contexte_implicite' => $contexte_implicite];
456
-		$use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
457
-	}
458
-
459
-	// Si pas valide mais pas de connexion a la base, le garder quand meme
460
-	if (!spip_connect()) {
461
-		if (isset($page['texte'])) {
462
-			gunzip_page($page);
463
-			$use_cache = 0;
464
-		} else {
465
-			spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
466
-			include_spip('inc/minipres');
467
-
468
-			return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
469
-		}
470
-	}
471
-
472
-	if ($use_cache < 0) {
473
-		$chemin_cache = '';
474
-	}
475
-
476
-	return;
347
+    # fonction de cache minimale : dire "non on ne met rien en cache"
348
+    # $use_cache = -1; return;
349
+
350
+    // Second appel, destine a l'enregistrement du cache sur le disque
351
+    if (isset($chemin_cache)) {
352
+        creer_cache($page, $chemin_cache);
353
+        return;
354
+    }
355
+
356
+    // Toute la suite correspond au premier appel
357
+    $contexte_implicite = $page['contexte_implicite'];
358
+
359
+    // Cas ignorant le cache car completement dynamique
360
+    if (
361
+        (!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST')
362
+        or _request('connect')
363
+    ) {
364
+        $use_cache = -1;
365
+        $lastmodified = 0;
366
+        $chemin_cache = '';
367
+        $page = [];
368
+
369
+        return;
370
+    }
371
+
372
+    // Controler l'existence d'un cache nous correspondant
373
+    $chemin_cache = generer_nom_fichier_cache($contexte, $page);
374
+    $lastmodified = 0;
375
+
376
+    // charger le cache s'il existe (et si il a bien le bon hash = anticollision)
377
+    if (!$page = lire_cache($chemin_cache)) {
378
+        $page = [];
379
+    }
380
+
381
+    // s'il est sessionne, charger celui correspondant a notre session
382
+    if (
383
+        isset($page['invalideurs'])
384
+        and isset($page['invalideurs']['session'])
385
+    ) {
386
+        $chemin_cache_session = generer_nom_fichier_cache(
387
+            ['chemin_cache' => $chemin_cache],
388
+            ['session' => spip_session()]
389
+        );
390
+        if (
391
+            $page_session = lire_cache($chemin_cache_session)
392
+            and $page_session['lastmodified'] >= $page['lastmodified']
393
+        ) {
394
+            $page = $page_session;
395
+        } else {
396
+            $page = [];
397
+        }
398
+    }
399
+
400
+
401
+    // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
402
+    if (isset($GLOBALS['meta']['invalider'])) {
403
+        // ne le faire que si la base est disponible
404
+        if (spip_connect()) {
405
+            include_spip('inc/invalideur');
406
+            retire_caches($chemin_cache); # API invalideur inutile
407
+            supprimer_fichier(_DIR_CACHE . $chemin_cache);
408
+            if (isset($chemin_cache_session) and $chemin_cache_session) {
409
+                supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
410
+            }
411
+        }
412
+    }
413
+
414
+    // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
415
+    // on supprime le cache
416
+    if (
417
+        defined('_VAR_MODE') &&
418
+        _VAR_MODE &&
419
+        (isset($_COOKIE['spip_session']) ||
420
+            isset($_COOKIE['spip_admin']) ||
421
+            @file_exists(_ACCESS_FILE_NAME))
422
+    ) {
423
+        $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
424
+        include_spip('inc/invalideur');
425
+        retire_caches($chemin_cache); # API invalideur inutile
426
+        supprimer_fichier(_DIR_CACHE . $chemin_cache);
427
+        if (isset($chemin_cache_session) and $chemin_cache_session) {
428
+            supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
429
+        }
430
+    }
431
+
432
+    // $delais par defaut
433
+    // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
434
+    // qui sont a cache nul par defaut
435
+    if (!isset($GLOBALS['delais'])) {
436
+        if (!defined('_DUREE_CACHE_DEFAUT')) {
437
+            define('_DUREE_CACHE_DEFAUT', 24 * 3600);
438
+        }
439
+        $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
440
+    }
441
+
442
+    // determiner la validite de la page
443
+    if ($page) {
444
+        $use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
445
+        // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
446
+        // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
447
+        $page['contexte_implicite'] = $contexte_implicite;
448
+        if (!$use_cache) {
449
+            // $page est un cache utilisable
450
+            gunzip_page($page);
451
+
452
+            return;
453
+        }
454
+    } else {
455
+        $page = ['contexte_implicite' => $contexte_implicite];
456
+        $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
457
+    }
458
+
459
+    // Si pas valide mais pas de connexion a la base, le garder quand meme
460
+    if (!spip_connect()) {
461
+        if (isset($page['texte'])) {
462
+            gunzip_page($page);
463
+            $use_cache = 0;
464
+        } else {
465
+            spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
466
+            include_spip('inc/minipres');
467
+
468
+            return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
469
+        }
470
+    }
471
+
472
+    if ($use_cache < 0) {
473
+        $chemin_cache = '';
474
+    }
475
+
476
+    return;
477 477
 }
Please login to merge, or discard this patch.
ecrire/public/assembler.php 1 patch
Indentation   +633 added lines, -633 removed lines patch added patch discarded remove patch
@@ -20,178 +20,178 @@  discard block
 block discarded – undo
20 20
  **/
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 // En cas de modification, il faut aussi actualiser la regexp de nettoyer_uri_var() dans inc/utils.php
27 27
 if (!defined('_CONTEXTE_IGNORE_VARIABLES')) {
28
-	define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
28
+    define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
29 29
 }
30 30
 
31 31
 function assembler($fond, string $connect = '') {
32 32
 
33
-	$chemin_cache = null;
34
-	$lastmodified = null;
35
-	$res = null;
36
-	// flag_preserver est modifie ici, et utilise en globale
37
-	// use_cache sert a informer le bouton d'admin pr savoir s'il met un *
38
-	// contexte est utilise en globale dans le formulaire d'admin
39
-
40
-	$GLOBALS['contexte'] = calculer_contexte();
41
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
42
-	$page['contexte_implicite']['cache'] = $fond . preg_replace(
43
-		',\.[a-zA-Z0-9]*$,',
44
-		'',
45
-		preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
46
-	);
47
-	// Cette fonction est utilisee deux fois
48
-	$cacher = charger_fonction('cacher', 'public', true);
49
-	// Les quatre derniers parametres sont modifies par la fonction:
50
-	// emplacement, validite, et, s'il est valide, contenu & age
51
-	if ($cacher) {
52
-		$res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
53
-	} else {
54
-		$GLOBALS['use_cache'] = -1;
55
-	}
56
-	// Si un resultat est retourne, c'est un message d'impossibilite
57
-	if ($res) {
58
-		return ['texte' => $res];
59
-	}
60
-
61
-	if (!$chemin_cache || !$lastmodified) {
62
-		$lastmodified = time();
63
-	}
64
-
65
-	$headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
66
-	$calculer_page = true;
67
-
68
-	// Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
69
-	// une perennite valide a meme reponse qu'une requete HEAD (par defaut les
70
-	// pages sont dynamiques)
71
-	if (
72
-		isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
73
-		and (!defined('_VAR_MODE') or !_VAR_MODE)
74
-		and $chemin_cache
75
-		and isset($page['entetes'])
76
-		and isset($page['entetes']['Cache-Control'])
77
-		and strstr($page['entetes']['Cache-Control'], 'max-age=')
78
-		and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
79
-	) {
80
-		$since = preg_replace(
81
-			'/;.*/',
82
-			'',
83
-			$_SERVER['HTTP_IF_MODIFIED_SINCE']
84
-		);
85
-		$since = str_replace('GMT', '', $since);
86
-		if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
87
-			$page['status'] = 304;
88
-			$headers_only = true;
89
-			$calculer_page = false;
90
-		}
91
-	}
92
-
93
-	// Si requete HEAD ou Last-modified compatible, ignorer le texte
94
-	// et pas de content-type (pour contrer le bouton admin de inc-public)
95
-	if (!$calculer_page) {
96
-		$page['texte'] = '';
97
-	} else {
98
-		// si la page est prise dans le cache
99
-		if (!$GLOBALS['use_cache']) {
100
-			// Informer les boutons d'admin du contexte
101
-			// (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
102
-			$GLOBALS['contexte'] = $page['contexte'];
103
-
104
-			// vider les globales url propres qui ne doivent plus etre utilisees en cas
105
-			// d'inversion url => objet
106
-			// plus necessaire si on utilise bien la fonction urls_decoder_url
107
-			#unset($_SERVER['REDIRECT_url_propre']);
108
-			#unset($_ENV['url_propre']);
109
-		} else {
110
-			// Compat ascendante :
111
-			// 1. $contexte est global
112
-			// (a evacuer car urls_decoder_url gere ce probleme ?)
113
-			// et calculer la page
114
-			if (!test_espace_prive()) {
115
-				include_spip('inc/urls');
116
-				[$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url(
117
-					nettoyer_uri(),
118
-					$fond,
119
-					$GLOBALS['contexte'],
120
-					true
121
-				);
122
-			}
123
-			// squelette par defaut
124
-			if (!strlen($fond ?? '')) {
125
-				$fond = 'sommaire';
126
-			}
127
-
128
-			// produire la page : peut mettre a jour $lastmodified
129
-			$produire_page = charger_fonction('produire_page', 'public');
130
-			$page = $produire_page(
131
-				$fond,
132
-				$GLOBALS['contexte'],
133
-				$GLOBALS['use_cache'],
134
-				$chemin_cache,
135
-				null,
136
-				$page,
137
-				$lastmodified,
138
-				$connect
139
-			);
140
-			if ($page === '') {
141
-				$erreur = _T(
142
-					'info_erreur_squelette2',
143
-					['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
144
-				);
145
-				erreur_squelette($erreur);
146
-				// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
147
-				$page = ['texte' => '', 'erreur' => $erreur];
148
-			}
149
-		}
150
-
151
-		if ($page and $chemin_cache) {
152
-			$page['cache'] = $chemin_cache;
153
-		}
154
-
155
-		auto_content_type($page);
156
-
157
-		$GLOBALS['flag_preserver'] |= headers_sent();
158
-
159
-		// Definir les entetes si ce n'est fait
160
-		if (!$GLOBALS['flag_preserver']) {
161
-			// Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
162
-			if (
163
-				trim($page['texte']) === ''
164
-				and _VAR_MODE !== 'debug'
165
-				and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
166
-			) {
167
-				$GLOBALS['contexte']['fond_erreur'] = $fond;
168
-				$page = message_page_indisponible($page, $GLOBALS['contexte']);
169
-			}
170
-			// pas de cache client en mode 'observation'
171
-			if (defined('_VAR_MODE') and _VAR_MODE) {
172
-				$page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
173
-				$page['entetes']['Pragma'] = 'no-cache';
174
-			}
175
-		}
176
-	}
177
-
178
-	// Entete Last-Modified:
179
-	// eviter d'etre incoherent en envoyant un lastmodified identique
180
-	// a celui qu'on a refuse d'honorer plus haut (cf. #655)
181
-	if (
182
-		$lastmodified
183
-		and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
184
-		and !isset($page['entetes']['Last-Modified'])
185
-	) {
186
-		$page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
187
-	}
188
-
189
-	// fermer la connexion apres les headers si requete HEAD
190
-	if ($headers_only) {
191
-		$page['entetes']['Connection'] = 'close';
192
-	}
193
-
194
-	return $page;
33
+    $chemin_cache = null;
34
+    $lastmodified = null;
35
+    $res = null;
36
+    // flag_preserver est modifie ici, et utilise en globale
37
+    // use_cache sert a informer le bouton d'admin pr savoir s'il met un *
38
+    // contexte est utilise en globale dans le formulaire d'admin
39
+
40
+    $GLOBALS['contexte'] = calculer_contexte();
41
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
42
+    $page['contexte_implicite']['cache'] = $fond . preg_replace(
43
+        ',\.[a-zA-Z0-9]*$,',
44
+        '',
45
+        preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
46
+    );
47
+    // Cette fonction est utilisee deux fois
48
+    $cacher = charger_fonction('cacher', 'public', true);
49
+    // Les quatre derniers parametres sont modifies par la fonction:
50
+    // emplacement, validite, et, s'il est valide, contenu & age
51
+    if ($cacher) {
52
+        $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
53
+    } else {
54
+        $GLOBALS['use_cache'] = -1;
55
+    }
56
+    // Si un resultat est retourne, c'est un message d'impossibilite
57
+    if ($res) {
58
+        return ['texte' => $res];
59
+    }
60
+
61
+    if (!$chemin_cache || !$lastmodified) {
62
+        $lastmodified = time();
63
+    }
64
+
65
+    $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
66
+    $calculer_page = true;
67
+
68
+    // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
69
+    // une perennite valide a meme reponse qu'une requete HEAD (par defaut les
70
+    // pages sont dynamiques)
71
+    if (
72
+        isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
73
+        and (!defined('_VAR_MODE') or !_VAR_MODE)
74
+        and $chemin_cache
75
+        and isset($page['entetes'])
76
+        and isset($page['entetes']['Cache-Control'])
77
+        and strstr($page['entetes']['Cache-Control'], 'max-age=')
78
+        and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
79
+    ) {
80
+        $since = preg_replace(
81
+            '/;.*/',
82
+            '',
83
+            $_SERVER['HTTP_IF_MODIFIED_SINCE']
84
+        );
85
+        $since = str_replace('GMT', '', $since);
86
+        if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
87
+            $page['status'] = 304;
88
+            $headers_only = true;
89
+            $calculer_page = false;
90
+        }
91
+    }
92
+
93
+    // Si requete HEAD ou Last-modified compatible, ignorer le texte
94
+    // et pas de content-type (pour contrer le bouton admin de inc-public)
95
+    if (!$calculer_page) {
96
+        $page['texte'] = '';
97
+    } else {
98
+        // si la page est prise dans le cache
99
+        if (!$GLOBALS['use_cache']) {
100
+            // Informer les boutons d'admin du contexte
101
+            // (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
102
+            $GLOBALS['contexte'] = $page['contexte'];
103
+
104
+            // vider les globales url propres qui ne doivent plus etre utilisees en cas
105
+            // d'inversion url => objet
106
+            // plus necessaire si on utilise bien la fonction urls_decoder_url
107
+            #unset($_SERVER['REDIRECT_url_propre']);
108
+            #unset($_ENV['url_propre']);
109
+        } else {
110
+            // Compat ascendante :
111
+            // 1. $contexte est global
112
+            // (a evacuer car urls_decoder_url gere ce probleme ?)
113
+            // et calculer la page
114
+            if (!test_espace_prive()) {
115
+                include_spip('inc/urls');
116
+                [$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url(
117
+                    nettoyer_uri(),
118
+                    $fond,
119
+                    $GLOBALS['contexte'],
120
+                    true
121
+                );
122
+            }
123
+            // squelette par defaut
124
+            if (!strlen($fond ?? '')) {
125
+                $fond = 'sommaire';
126
+            }
127
+
128
+            // produire la page : peut mettre a jour $lastmodified
129
+            $produire_page = charger_fonction('produire_page', 'public');
130
+            $page = $produire_page(
131
+                $fond,
132
+                $GLOBALS['contexte'],
133
+                $GLOBALS['use_cache'],
134
+                $chemin_cache,
135
+                null,
136
+                $page,
137
+                $lastmodified,
138
+                $connect
139
+            );
140
+            if ($page === '') {
141
+                $erreur = _T(
142
+                    'info_erreur_squelette2',
143
+                    ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
144
+                );
145
+                erreur_squelette($erreur);
146
+                // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
147
+                $page = ['texte' => '', 'erreur' => $erreur];
148
+            }
149
+        }
150
+
151
+        if ($page and $chemin_cache) {
152
+            $page['cache'] = $chemin_cache;
153
+        }
154
+
155
+        auto_content_type($page);
156
+
157
+        $GLOBALS['flag_preserver'] |= headers_sent();
158
+
159
+        // Definir les entetes si ce n'est fait
160
+        if (!$GLOBALS['flag_preserver']) {
161
+            // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
162
+            if (
163
+                trim($page['texte']) === ''
164
+                and _VAR_MODE !== 'debug'
165
+                and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
166
+            ) {
167
+                $GLOBALS['contexte']['fond_erreur'] = $fond;
168
+                $page = message_page_indisponible($page, $GLOBALS['contexte']);
169
+            }
170
+            // pas de cache client en mode 'observation'
171
+            if (defined('_VAR_MODE') and _VAR_MODE) {
172
+                $page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
173
+                $page['entetes']['Pragma'] = 'no-cache';
174
+            }
175
+        }
176
+    }
177
+
178
+    // Entete Last-Modified:
179
+    // eviter d'etre incoherent en envoyant un lastmodified identique
180
+    // a celui qu'on a refuse d'honorer plus haut (cf. #655)
181
+    if (
182
+        $lastmodified
183
+        and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
184
+        and !isset($page['entetes']['Last-Modified'])
185
+    ) {
186
+        $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
187
+    }
188
+
189
+    // fermer la connexion apres les headers si requete HEAD
190
+    if ($headers_only) {
191
+        $page['entetes']['Connection'] = 'close';
192
+    }
193
+
194
+    return $page;
195 195
 }
196 196
 
197 197
 /**
@@ -208,19 +208,19 @@  discard block
 block discarded – undo
208 208
  */
209 209
 function calculer_contexte() {
210 210
 
211
-	$contexte = [];
212
-	foreach ($_GET as $var => $val) {
213
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
214
-			$contexte[$var] = $val;
215
-		}
216
-	}
217
-	foreach ($_POST as $var => $val) {
218
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
219
-			$contexte[$var] = $val;
220
-		}
221
-	}
222
-
223
-	return $contexte;
211
+    $contexte = [];
212
+    foreach ($_GET as $var => $val) {
213
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
214
+            $contexte[$var] = $val;
215
+        }
216
+    }
217
+    foreach ($_POST as $var => $val) {
218
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
219
+            $contexte[$var] = $val;
220
+        }
221
+    }
222
+
223
+    return $contexte;
224 224
 }
225 225
 
226 226
 /**
@@ -231,25 +231,25 @@  discard block
 block discarded – undo
231 231
  * @return array
232 232
  */
233 233
 function calculer_contexte_implicite() {
234
-	static $notes = null;
235
-	if (is_null($notes)) {
236
-		$notes = charger_fonction('notes', 'inc', true);
237
-	}
238
-	$contexte_implicite = [
239
-		'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
240
-		'host' => ($_SERVER['HTTP_HOST'] ?? null),
241
-		'https' => ($_SERVER['HTTPS'] ?? ''),
242
-		'espace' => test_espace_prive(),
243
-		'marqueur' => ($GLOBALS['marqueur'] ?? ''),
244
-		'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''),
245
-		'notes' => $notes ? $notes('', 'contexter_cache') : '',
246
-		'spip_version_code' => $GLOBALS['spip_version_code'],
247
-	];
248
-	if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
249
-		$contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
250
-	}
251
-
252
-	return $contexte_implicite;
234
+    static $notes = null;
235
+    if (is_null($notes)) {
236
+        $notes = charger_fonction('notes', 'inc', true);
237
+    }
238
+    $contexte_implicite = [
239
+        'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
240
+        'host' => ($_SERVER['HTTP_HOST'] ?? null),
241
+        'https' => ($_SERVER['HTTPS'] ?? ''),
242
+        'espace' => test_espace_prive(),
243
+        'marqueur' => ($GLOBALS['marqueur'] ?? ''),
244
+        'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''),
245
+        'notes' => $notes ? $notes('', 'contexter_cache') : '',
246
+        'spip_version_code' => $GLOBALS['spip_version_code'],
247
+    ];
248
+    if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
249
+        $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
250
+    }
251
+
252
+    return $contexte_implicite;
253 253
 }
254 254
 
255 255
 //
@@ -258,55 +258,55 @@  discard block
 block discarded – undo
258 258
 
259 259
 function auto_content_type($page) {
260 260
 
261
-	if (!isset($GLOBALS['flag_preserver'])) {
262
-		$GLOBALS['flag_preserver'] = ($page && preg_match(
263
-			'/header\s*\(\s*.content\-type:/isx',
264
-			$page['texte']
265
-		) || (isset($page['entetes']['Content-Type'])));
266
-	}
261
+    if (!isset($GLOBALS['flag_preserver'])) {
262
+        $GLOBALS['flag_preserver'] = ($page && preg_match(
263
+            '/header\s*\(\s*.content\-type:/isx',
264
+            $page['texte']
265
+        ) || (isset($page['entetes']['Content-Type'])));
266
+    }
267 267
 }
268 268
 
269 269
 function inclure_page($fond, $contexte, string $connect = '') {
270
-	$use_cache = null;
271
-	$chemin_cache = null;
272
-	$lastinclude = null;
273
-	$res = null;
274
-	static $cacher, $produire_page;
275
-
276
-	// enlever le fond de contexte inclus car sinon il prend la main
277
-	// dans les sous inclusions -> boucle infinie d'inclusion identique
278
-	// (cette precaution n'est probablement plus utile)
279
-	unset($contexte['fond']);
280
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
281
-	$page['contexte_implicite']['cache'] = $fond;
282
-	if (is_null($cacher)) {
283
-		$cacher = charger_fonction('cacher', 'public', true);
284
-	}
285
-	// Les quatre derniers parametres sont modifies par la fonction:
286
-	// emplacement, validite, et, s'il est valide, contenu & age
287
-	if ($cacher) {
288
-		$res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
289
-	} else {
290
-		$use_cache = -1;
291
-	}
292
-	// $res = message d'erreur : on sort de la
293
-	if ($res) {
294
-		return ['texte' => $res];
295
-	}
296
-
297
-	// Si use_cache ne vaut pas 0, la page doit etre calculee
298
-	// produire la page : peut mettre a jour $lastinclude
299
-	// le contexte_cache envoye a cacher() a ete conserve et est passe a produire
300
-	if ($use_cache) {
301
-		if (is_null($produire_page)) {
302
-			$produire_page = charger_fonction('produire_page', 'public');
303
-		}
304
-		$page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
305
-	}
306
-	// dans tous les cas, mettre a jour $GLOBALS['lastmodified']
307
-	$GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude);
308
-
309
-	return $page;
270
+    $use_cache = null;
271
+    $chemin_cache = null;
272
+    $lastinclude = null;
273
+    $res = null;
274
+    static $cacher, $produire_page;
275
+
276
+    // enlever le fond de contexte inclus car sinon il prend la main
277
+    // dans les sous inclusions -> boucle infinie d'inclusion identique
278
+    // (cette precaution n'est probablement plus utile)
279
+    unset($contexte['fond']);
280
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
281
+    $page['contexte_implicite']['cache'] = $fond;
282
+    if (is_null($cacher)) {
283
+        $cacher = charger_fonction('cacher', 'public', true);
284
+    }
285
+    // Les quatre derniers parametres sont modifies par la fonction:
286
+    // emplacement, validite, et, s'il est valide, contenu & age
287
+    if ($cacher) {
288
+        $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
289
+    } else {
290
+        $use_cache = -1;
291
+    }
292
+    // $res = message d'erreur : on sort de la
293
+    if ($res) {
294
+        return ['texte' => $res];
295
+    }
296
+
297
+    // Si use_cache ne vaut pas 0, la page doit etre calculee
298
+    // produire la page : peut mettre a jour $lastinclude
299
+    // le contexte_cache envoye a cacher() a ete conserve et est passe a produire
300
+    if ($use_cache) {
301
+        if (is_null($produire_page)) {
302
+            $produire_page = charger_fonction('produire_page', 'public');
303
+        }
304
+        $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
305
+    }
306
+    // dans tous les cas, mettre a jour $GLOBALS['lastmodified']
307
+    $GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude);
308
+
309
+    return $page;
310 310
 }
311 311
 
312 312
 /**
@@ -324,41 +324,41 @@  discard block
 block discarded – undo
324 324
  * @return array
325 325
  */
326 326
 function public_produire_page_dist(
327
-	$fond,
328
-	$contexte,
329
-	$use_cache,
330
-	$chemin_cache,
331
-	$contexte_cache,
332
-	&$page,
333
-	&$lastinclude,
334
-	$connect = ''
327
+    $fond,
328
+    $contexte,
329
+    $use_cache,
330
+    $chemin_cache,
331
+    $contexte_cache,
332
+    &$page,
333
+    &$lastinclude,
334
+    $connect = ''
335 335
 ) {
336
-	static $parametrer, $cacher;
337
-	if (!$parametrer) {
338
-		$parametrer = charger_fonction('parametrer', 'public');
339
-	}
340
-	$page = $parametrer($fond, $contexte, $chemin_cache, $connect);
341
-	// et on l'enregistre sur le disque
342
-	if (
343
-		$chemin_cache
344
-		and $use_cache > -1
345
-		and is_array($page)
346
-		and count($page)
347
-		and isset($page['entetes']['X-Spip-Cache'])
348
-		and $page['entetes']['X-Spip-Cache'] > 0
349
-	) {
350
-		if (is_null($cacher)) {
351
-			$cacher = charger_fonction('cacher', 'public', true);
352
-		}
353
-		$lastinclude = time();
354
-		if ($cacher) {
355
-			$cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
356
-		} else {
357
-			$use_cache = -1;
358
-		}
359
-	}
360
-
361
-	return $page;
336
+    static $parametrer, $cacher;
337
+    if (!$parametrer) {
338
+        $parametrer = charger_fonction('parametrer', 'public');
339
+    }
340
+    $page = $parametrer($fond, $contexte, $chemin_cache, $connect);
341
+    // et on l'enregistre sur le disque
342
+    if (
343
+        $chemin_cache
344
+        and $use_cache > -1
345
+        and is_array($page)
346
+        and count($page)
347
+        and isset($page['entetes']['X-Spip-Cache'])
348
+        and $page['entetes']['X-Spip-Cache'] > 0
349
+    ) {
350
+        if (is_null($cacher)) {
351
+            $cacher = charger_fonction('cacher', 'public', true);
352
+        }
353
+        $lastinclude = time();
354
+        if ($cacher) {
355
+            $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
356
+        } else {
357
+            $use_cache = -1;
358
+        }
359
+    }
360
+
361
+    return $page;
362 362
 }
363 363
 
364 364
 // Fonction inseree par le compilateur dans le code compile.
@@ -372,14 +372,14 @@  discard block
 block discarded – undo
372 372
 // 4: langue
373 373
 
374 374
 function inserer_balise_dynamique($contexte_exec, $contexte_compil) {
375
-	arguments_balise_dyn_depuis_modele(null, 'reset');
376
-
377
-	if (!is_array($contexte_exec)) {
378
-		echo $contexte_exec;
379
-	} // message d'erreur etc
380
-	else {
381
-		inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
382
-	}
375
+    arguments_balise_dyn_depuis_modele(null, 'reset');
376
+
377
+    if (!is_array($contexte_exec)) {
378
+        echo $contexte_exec;
379
+    } // message d'erreur etc
380
+    else {
381
+        inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
382
+    }
383 383
 }
384 384
 
385 385
 /**
@@ -392,101 +392,101 @@  discard block
 block discarded – undo
392 392
  * @return string|void
393 393
  */
394 394
 function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = []) {
395
-	if (is_array($texte)) {
396
-		[$fond, $delainc, $contexte_inclus] = $texte;
397
-
398
-		// delais a l'ancienne, c'est pratiquement mort
399
-		$d = $GLOBALS['delais'] ?? null;
400
-		$GLOBALS['delais'] = $delainc;
401
-
402
-		$page = recuperer_fond(
403
-			$fond,
404
-			$contexte_inclus,
405
-			['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
406
-		);
407
-
408
-		$texte = $page['texte'];
409
-
410
-		$GLOBALS['delais'] = $d;
411
-		// Faire remonter les entetes
412
-		if (
413
-			isset($page['entetes'])
414
-			and is_array($page['entetes'])
415
-		) {
416
-			// mais pas toutes
417
-			unset($page['entetes']['X-Spip-Cache']);
418
-			unset($page['entetes']['Content-Type']);
419
-			if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) {
420
-				if (!is_array($GLOBALS['page']['entetes'])) {
421
-					$GLOBALS['page']['entetes'] = [];
422
-				}
423
-				$GLOBALS['page']['entetes'] =
424
-					array_merge($GLOBALS['page']['entetes'], $page['entetes']);
425
-			}
426
-		}
427
-		// _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
428
-		if (
429
-			isset($page['contexte']['_pipelines'])
430
-			and is_array($page['contexte']['_pipelines'])
431
-			and count($page['contexte']['_pipelines'])
432
-		) {
433
-			foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
434
-				$args['contexte'] = $page['contexte'];
435
-				unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
436
-				$texte = pipeline(
437
-					$pipe,
438
-					[
439
-						'data' => $texte,
440
-						'args' => $args
441
-					]
442
-				);
443
-			}
444
-		}
445
-	}
446
-
447
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
448
-		// compatibilite : avant on donnait le numero de ligne ou rien.
449
-		$ligne = intval($contexte_compil[3] ?? $contexte_compil);
450
-		$GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
451
-	}
452
-	if ($echo) {
453
-		echo $texte;
454
-	} else {
455
-		return $texte;
456
-	}
395
+    if (is_array($texte)) {
396
+        [$fond, $delainc, $contexte_inclus] = $texte;
397
+
398
+        // delais a l'ancienne, c'est pratiquement mort
399
+        $d = $GLOBALS['delais'] ?? null;
400
+        $GLOBALS['delais'] = $delainc;
401
+
402
+        $page = recuperer_fond(
403
+            $fond,
404
+            $contexte_inclus,
405
+            ['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
406
+        );
407
+
408
+        $texte = $page['texte'];
409
+
410
+        $GLOBALS['delais'] = $d;
411
+        // Faire remonter les entetes
412
+        if (
413
+            isset($page['entetes'])
414
+            and is_array($page['entetes'])
415
+        ) {
416
+            // mais pas toutes
417
+            unset($page['entetes']['X-Spip-Cache']);
418
+            unset($page['entetes']['Content-Type']);
419
+            if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) {
420
+                if (!is_array($GLOBALS['page']['entetes'])) {
421
+                    $GLOBALS['page']['entetes'] = [];
422
+                }
423
+                $GLOBALS['page']['entetes'] =
424
+                    array_merge($GLOBALS['page']['entetes'], $page['entetes']);
425
+            }
426
+        }
427
+        // _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
428
+        if (
429
+            isset($page['contexte']['_pipelines'])
430
+            and is_array($page['contexte']['_pipelines'])
431
+            and count($page['contexte']['_pipelines'])
432
+        ) {
433
+            foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
434
+                $args['contexte'] = $page['contexte'];
435
+                unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
436
+                $texte = pipeline(
437
+                    $pipe,
438
+                    [
439
+                        'data' => $texte,
440
+                        'args' => $args
441
+                    ]
442
+                );
443
+            }
444
+        }
445
+    }
446
+
447
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
448
+        // compatibilite : avant on donnait le numero de ligne ou rien.
449
+        $ligne = intval($contexte_compil[3] ?? $contexte_compil);
450
+        $GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
451
+    }
452
+    if ($echo) {
453
+        echo $texte;
454
+    } else {
455
+        return $texte;
456
+    }
457 457
 }
458 458
 
459 459
 function message_page_indisponible($page, $contexte) {
460
-	static $deja = false;
461
-	if ($deja) {
462
-		return 'erreur';
463
-	}
464
-	$codes = [
465
-		'404' => '404 Not Found',
466
-		'503' => '503 Service Unavailable',
467
-	];
468
-
469
-	$contexte['status'] = ($page !== false) ? '404' : '503';
470
-	$contexte['code'] = $codes[$contexte['status']];
471
-	$contexte['fond'] = '404'; // gere les 2 erreurs
472
-	if (!isset($contexte['lang'])) {
473
-		include_spip('inc/lang');
474
-		$contexte['lang'] = $GLOBALS['spip_lang'];
475
-	}
476
-
477
-	$deja = true;
478
-	// passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
479
-	// ex restriction d'acces => 401
480
-	$contexte = pipeline('page_indisponible', $contexte);
481
-
482
-	// produire la page d'erreur
483
-	$page = inclure_page($contexte['fond'], $contexte);
484
-	if (!$page) {
485
-		$page = inclure_page('404', $contexte);
486
-	}
487
-	$page['status'] = $contexte['status'];
488
-
489
-	return $page;
460
+    static $deja = false;
461
+    if ($deja) {
462
+        return 'erreur';
463
+    }
464
+    $codes = [
465
+        '404' => '404 Not Found',
466
+        '503' => '503 Service Unavailable',
467
+    ];
468
+
469
+    $contexte['status'] = ($page !== false) ? '404' : '503';
470
+    $contexte['code'] = $codes[$contexte['status']];
471
+    $contexte['fond'] = '404'; // gere les 2 erreurs
472
+    if (!isset($contexte['lang'])) {
473
+        include_spip('inc/lang');
474
+        $contexte['lang'] = $GLOBALS['spip_lang'];
475
+    }
476
+
477
+    $deja = true;
478
+    // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
479
+    // ex restriction d'acces => 401
480
+    $contexte = pipeline('page_indisponible', $contexte);
481
+
482
+    // produire la page d'erreur
483
+    $page = inclure_page($contexte['fond'], $contexte);
484
+    if (!$page) {
485
+        $page = inclure_page('404', $contexte);
486
+    }
487
+    $page['status'] = $contexte['status'];
488
+
489
+    return $page;
490 490
 }
491 491
 
492 492
 /**
@@ -498,44 +498,44 @@  discard block
 block discarded – undo
498 498
  * @return mixed
499 499
  */
500 500
 function arguments_balise_dyn_depuis_modele($arg, $operation = 'set') {
501
-	static $balise_dyn_appellee_par_modele = null;
502
-	switch ($operation) {
503
-		case 'read':
504
-			return $balise_dyn_appellee_par_modele;
505
-		case 'reset':
506
-			$balise_dyn_appellee_par_modele = null;
507
-			return null;
508
-		case 'set':
509
-		default:
510
-			$balise_dyn_appellee_par_modele = $arg;
511
-			return $arg;
512
-	}
501
+    static $balise_dyn_appellee_par_modele = null;
502
+    switch ($operation) {
503
+        case 'read':
504
+            return $balise_dyn_appellee_par_modele;
505
+        case 'reset':
506
+            $balise_dyn_appellee_par_modele = null;
507
+            return null;
508
+        case 'set':
509
+        default:
510
+            $balise_dyn_appellee_par_modele = $arg;
511
+            return $arg;
512
+    }
513 513
 }
514 514
 
515 515
 // temporairement ici : a mettre dans le futur inc/modeles
516 516
 // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array()
517 517
 function creer_contexte_de_modele($args) {
518
-	$contexte = [];
519
-	foreach ($args as $var => $val) {
520
-		if (is_int($var)) { // argument pas formate
521
-			if (in_array($val, ['left', 'right', 'center'])) {
522
-				$var = 'align';
523
-				$contexte[$var] = $val;
524
-			} else {
525
-				$args = explode('=', $val);
526
-				if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
527
-				$contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
528
-				} else // notation abregee
529
-				{
530
-					$contexte[trim($val)] = trim($val);
531
-				}
532
-			}
533
-		} else {
534
-			$contexte[$var] = $val;
535
-		}
536
-	}
537
-
538
-	return $contexte;
518
+    $contexte = [];
519
+    foreach ($args as $var => $val) {
520
+        if (is_int($var)) { // argument pas formate
521
+            if (in_array($val, ['left', 'right', 'center'])) {
522
+                $var = 'align';
523
+                $contexte[$var] = $val;
524
+            } else {
525
+                $args = explode('=', $val);
526
+                if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
527
+                $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
528
+                } else // notation abregee
529
+                {
530
+                    $contexte[trim($val)] = trim($val);
531
+                }
532
+            }
533
+        } else {
534
+            $contexte[$var] = $val;
535
+        }
536
+    }
537
+
538
+    return $contexte;
539 539
 }
540 540
 
541 541
 /**
@@ -550,43 +550,43 @@  discard block
 block discarded – undo
550 550
  * @return string
551 551
  */
552 552
 function styliser_modele($modele, $id, $contexte = null) {
553
-	static $styliseurs = null;
554
-	if (is_null($styliseurs)) {
555
-		$tables_objet = lister_tables_objets_sql();
556
-		foreach ($tables_objet as $table => $desc) {
557
-			if (
558
-				isset($desc['modeles']) and $desc['modeles']
559
-				and isset($desc['modeles_styliser']) and $desc['modeles_styliser']
560
-				and function_exists($desc['modeles_styliser'])
561
-			) {
562
-				$primary = id_table_objet($table);
563
-				foreach ($desc['modeles'] as $m) {
564
-					$styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
565
-				}
566
-			}
567
-		}
568
-	}
569
-
570
-	if (isset($styliseurs[$modele])) {
571
-		$styliseur = $styliseurs[$modele]['callback'];
572
-		$primary = $styliseurs[$modele]['primary'];
573
-		if (is_null($id) and $contexte) {
574
-			if (isset($contexte['id'])) {
575
-				$id = $contexte['id'];
576
-			} elseif (isset($contexte[$primary])) {
577
-				$id = $contexte[$primary];
578
-			}
579
-		}
580
-		if (is_null($id)) {
581
-			$msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
582
-			erreur_squelette($msg);
583
-			// on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
584
-			$id = 0;
585
-		}
586
-		$modele = $styliseur($modele, $id);
587
-	}
588
-
589
-	return $modele;
553
+    static $styliseurs = null;
554
+    if (is_null($styliseurs)) {
555
+        $tables_objet = lister_tables_objets_sql();
556
+        foreach ($tables_objet as $table => $desc) {
557
+            if (
558
+                isset($desc['modeles']) and $desc['modeles']
559
+                and isset($desc['modeles_styliser']) and $desc['modeles_styliser']
560
+                and function_exists($desc['modeles_styliser'])
561
+            ) {
562
+                $primary = id_table_objet($table);
563
+                foreach ($desc['modeles'] as $m) {
564
+                    $styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
565
+                }
566
+            }
567
+        }
568
+    }
569
+
570
+    if (isset($styliseurs[$modele])) {
571
+        $styliseur = $styliseurs[$modele]['callback'];
572
+        $primary = $styliseurs[$modele]['primary'];
573
+        if (is_null($id) and $contexte) {
574
+            if (isset($contexte['id'])) {
575
+                $id = $contexte['id'];
576
+            } elseif (isset($contexte[$primary])) {
577
+                $id = $contexte[$primary];
578
+            }
579
+        }
580
+        if (is_null($id)) {
581
+            $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
582
+            erreur_squelette($msg);
583
+            // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
584
+            $id = 0;
585
+        }
586
+        $modele = $styliseur($modele, $id);
587
+    }
588
+
589
+    return $modele;
590 590
 }
591 591
 
592 592
 /**
@@ -603,102 +603,102 @@  discard block
 block discarded – undo
603 603
  */
604 604
 function inclure_modele($type, $id, $params, $lien, string $connect = '', $env = []) {
605 605
 
606
-	static $compteur;
607
-	if (++$compteur > 10) {
608
-		return '';
609
-	} # ne pas boucler indefiniment
610
-
611
-	$type = strtolower($type);
612
-	$type = styliser_modele($type, $id);
613
-
614
-	$fond = $class = '';
615
-
616
-	$params = array_filter(explode('|', $params));
617
-	if ($params) {
618
-		$soustype = current($params);
619
-		$soustype = strtolower(trim($soustype));
620
-		if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
621
-			$soustype = next($params);
622
-			$soustype = strtolower($soustype);
623
-		}
624
-
625
-		if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
626
-			if (!trouve_modele($fond = ($type . '_' . $soustype))) {
627
-				$fond = '';
628
-				$class = $soustype;
629
-			}
630
-			// enlever le sous type des params
631
-			$params = array_diff($params, [$soustype]);
632
-		}
633
-	}
634
-
635
-	// Si ca marche pas en precisant le sous-type, prendre le type
636
-	if (!$fond and !trouve_modele($fond = $type)) {
637
-		spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
638
-
639
-		return false;
640
-	}
641
-	$fond = 'modeles/' . $fond;
642
-	// Creer le contexte
643
-	$contexte = $env;
644
-	$contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
645
-
646
-	// Le numero du modele est mis dans l'environnement
647
-	// d'une part sous l'identifiant "id"
648
-	// et d'autre part sous l'identifiant de la cle primaire
649
-	// par la fonction id_table_objet,
650
-	// (<article1> =>> article =>> id_article =>> id_article=1)
651
-	$_id = id_table_objet($type);
652
-	$contexte['id'] = $contexte[$_id] = $id;
653
-
654
-	if (isset($class)) {
655
-		$contexte['class'] = $class;
656
-	}
657
-
658
-	// Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
659
-	if ($lien) {
660
-		# un eventuel guillemet (") sera reechappe par #ENV
661
-		$contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
662
-		$contexte['lien_class'] = $lien['class'];
663
-		$contexte['lien_mime'] = $lien['mime'];
664
-		$contexte['lien_title'] = $lien['title'];
665
-		$contexte['lien_hreflang'] = $lien['hreflang'];
666
-	}
667
-
668
-	// Traiter les parametres
669
-	// par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
670
-	$arg_list = creer_contexte_de_modele($params);
671
-	$contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
672
-	$contexte = array_merge($contexte, $arg_list);
673
-
674
-	// Appliquer le modele avec le contexte
675
-	$retour = recuperer_fond($fond, $contexte, [], $connect);
676
-
677
-	// Regarder si le modele tient compte des liens (il *doit* alors indiquer
678
-	// spip_lien_ok dans les classes de son conteneur de premier niveau ;
679
-	// sinon, s'il y a un lien, on l'ajoute classiquement
680
-	if (
681
-		strstr(
682
-			' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
683
-			'spip_lien_ok'
684
-		)
685
-	) {
686
-		$retour = inserer_attribut(
687
-			$retour,
688
-			'class',
689
-			trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
690
-		);
691
-	} else {
692
-		if ($lien) {
693
-			$retour = "<a href=\"" . $lien['href'] . "\" class=\"" . $lien['class'] . "\">" . $retour . '</a>';
694
-		}
695
-	}
696
-
697
-	$compteur--;
698
-
699
-	return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax')
700
-		? encoder_contexte_ajax($contexte, '', $retour)
701
-		: $retour;
606
+    static $compteur;
607
+    if (++$compteur > 10) {
608
+        return '';
609
+    } # ne pas boucler indefiniment
610
+
611
+    $type = strtolower($type);
612
+    $type = styliser_modele($type, $id);
613
+
614
+    $fond = $class = '';
615
+
616
+    $params = array_filter(explode('|', $params));
617
+    if ($params) {
618
+        $soustype = current($params);
619
+        $soustype = strtolower(trim($soustype));
620
+        if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
621
+            $soustype = next($params);
622
+            $soustype = strtolower($soustype);
623
+        }
624
+
625
+        if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
626
+            if (!trouve_modele($fond = ($type . '_' . $soustype))) {
627
+                $fond = '';
628
+                $class = $soustype;
629
+            }
630
+            // enlever le sous type des params
631
+            $params = array_diff($params, [$soustype]);
632
+        }
633
+    }
634
+
635
+    // Si ca marche pas en precisant le sous-type, prendre le type
636
+    if (!$fond and !trouve_modele($fond = $type)) {
637
+        spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
638
+
639
+        return false;
640
+    }
641
+    $fond = 'modeles/' . $fond;
642
+    // Creer le contexte
643
+    $contexte = $env;
644
+    $contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
645
+
646
+    // Le numero du modele est mis dans l'environnement
647
+    // d'une part sous l'identifiant "id"
648
+    // et d'autre part sous l'identifiant de la cle primaire
649
+    // par la fonction id_table_objet,
650
+    // (<article1> =>> article =>> id_article =>> id_article=1)
651
+    $_id = id_table_objet($type);
652
+    $contexte['id'] = $contexte[$_id] = $id;
653
+
654
+    if (isset($class)) {
655
+        $contexte['class'] = $class;
656
+    }
657
+
658
+    // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
659
+    if ($lien) {
660
+        # un eventuel guillemet (") sera reechappe par #ENV
661
+        $contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
662
+        $contexte['lien_class'] = $lien['class'];
663
+        $contexte['lien_mime'] = $lien['mime'];
664
+        $contexte['lien_title'] = $lien['title'];
665
+        $contexte['lien_hreflang'] = $lien['hreflang'];
666
+    }
667
+
668
+    // Traiter les parametres
669
+    // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
670
+    $arg_list = creer_contexte_de_modele($params);
671
+    $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
672
+    $contexte = array_merge($contexte, $arg_list);
673
+
674
+    // Appliquer le modele avec le contexte
675
+    $retour = recuperer_fond($fond, $contexte, [], $connect);
676
+
677
+    // Regarder si le modele tient compte des liens (il *doit* alors indiquer
678
+    // spip_lien_ok dans les classes de son conteneur de premier niveau ;
679
+    // sinon, s'il y a un lien, on l'ajoute classiquement
680
+    if (
681
+        strstr(
682
+            ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
683
+            'spip_lien_ok'
684
+        )
685
+    ) {
686
+        $retour = inserer_attribut(
687
+            $retour,
688
+            'class',
689
+            trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
690
+        );
691
+    } else {
692
+        if ($lien) {
693
+            $retour = "<a href=\"" . $lien['href'] . "\" class=\"" . $lien['class'] . "\">" . $retour . '</a>';
694
+        }
695
+    }
696
+
697
+    $compteur--;
698
+
699
+    return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax')
700
+        ? encoder_contexte_ajax($contexte, '', $retour)
701
+        : $retour;
702 702
 }
703 703
 
704 704
 // Un inclure_page qui marche aussi pour l'espace prive
@@ -707,105 +707,105 @@  discard block
 block discarded – undo
707 707
 // 	recuperer_fond($fond,$contexte,array('raw'=>true))
708 708
 function evaluer_fond($fond, $contexte = [], string $connect = '') {
709 709
 
710
-	$page = inclure_page($fond, $contexte, $connect);
711
-
712
-	if (!$page) {
713
-		return $page;
714
-	}
715
-	// eval $page et affecte $res
716
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
717
-
718
-	// Lever un drapeau (global) si le fond utilise #SESSION
719
-	// a destination de public/parametrer
720
-	// pour remonter vers les inclusions appelantes
721
-	// il faut bien lever ce drapeau apres avoir evalue le fond
722
-	// pour ne pas faire descendre le flag vers les inclusions appelees
723
-	if (
724
-		isset($page['invalideurs'])
725
-		and isset($page['invalideurs']['session'])
726
-	) {
727
-		$GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
728
-	}
729
-
730
-	return $page;
710
+    $page = inclure_page($fond, $contexte, $connect);
711
+
712
+    if (!$page) {
713
+        return $page;
714
+    }
715
+    // eval $page et affecte $res
716
+    include _ROOT_RESTREINT . 'public/evaluer_page.php';
717
+
718
+    // Lever un drapeau (global) si le fond utilise #SESSION
719
+    // a destination de public/parametrer
720
+    // pour remonter vers les inclusions appelantes
721
+    // il faut bien lever ce drapeau apres avoir evalue le fond
722
+    // pour ne pas faire descendre le flag vers les inclusions appelees
723
+    if (
724
+        isset($page['invalideurs'])
725
+        and isset($page['invalideurs']['session'])
726
+    ) {
727
+        $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
728
+    }
729
+
730
+    return $page;
731 731
 }
732 732
 
733 733
 
734 734
 function page_base_href(&$texte) {
735
-	static $set_html_base = null;
736
-	if (is_null($set_html_base)) {
737
-		if (!defined('_SET_HTML_BASE')) {
738
-			// si la profondeur est superieure a 1
739
-			// est que ce n'est pas une url page ni une url action
740
-			// activer par defaut
741
-		$set_html_base = ((
742
-				$GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
743
-				and _request(_SPIP_PAGE) !== 'login'
744
-				and !_request('action')) ? true : false);
745
-		} else {
746
-			$set_html_base = _SET_HTML_BASE;
747
-		}
748
-	}
749
-
750
-	if (
751
-		$set_html_base
752
-		and isset($GLOBALS['html']) and $GLOBALS['html']
753
-		and $GLOBALS['profondeur_url'] > 0
754
-		and ($poshead = strpos($texte, '</head>')) !== false
755
-	) {
756
-		$head = substr($texte, 0, $poshead);
757
-		$insert = false;
758
-		$href_base = false;
759
-		if (strpos($head, '<base') === false) {
760
-			$insert = true;
761
-		} else {
762
-			// si aucun <base ...> n'a de href il faut en inserer un
763
-			// sinon juste re-ecrire les ancres si besoin
764
-			$insert = true;
765
-			include_spip('inc/filtres');
766
-			$bases = extraire_balises($head, 'base');
767
-			foreach ($bases as $base) {
768
-				if ($href_base = extraire_attribut($base, 'href')) {
769
-					$insert = false;
770
-					break;
771
-				}
772
-			}
773
-		}
774
-
775
-		if ($insert) {
776
-			include_spip('inc/filtres_mini');
777
-			// ajouter un base qui reglera tous les liens relatifs
778
-			$href_base = url_absolue('./');
779
-			$base = "\n<base href=\"$href_base\" />";
780
-			if (($pos = strpos($head, '<head>')) !== false) {
781
-				$head = substr_replace($head, $base, $pos + 6, 0);
782
-			} elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
783
-				$head = str_replace($r[0], $r[0] . $base, $head);
784
-			}
785
-			$texte = $head . substr($texte, $poshead);
786
-		}
787
-		if ($href_base) {
788
-			// gerer les ancres
789
-			$base = $_SERVER['REQUEST_URI'];
790
-			// pas de guillemets ni < dans l'URL qu'on insere dans le HTML
791
-			if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) {
792
-				$base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
793
-			}
794
-			if (strpos($texte, "href='#") !== false) {
795
-				$texte = str_replace("href='#", "href='$base#", $texte);
796
-			}
797
-			if (strpos($texte, 'href="#') !== false) {
798
-				$texte = str_replace('href="#', "href=\"$base#", $texte);
799
-			}
800
-		}
801
-	}
735
+    static $set_html_base = null;
736
+    if (is_null($set_html_base)) {
737
+        if (!defined('_SET_HTML_BASE')) {
738
+            // si la profondeur est superieure a 1
739
+            // est que ce n'est pas une url page ni une url action
740
+            // activer par defaut
741
+        $set_html_base = ((
742
+                $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
743
+                and _request(_SPIP_PAGE) !== 'login'
744
+                and !_request('action')) ? true : false);
745
+        } else {
746
+            $set_html_base = _SET_HTML_BASE;
747
+        }
748
+    }
749
+
750
+    if (
751
+        $set_html_base
752
+        and isset($GLOBALS['html']) and $GLOBALS['html']
753
+        and $GLOBALS['profondeur_url'] > 0
754
+        and ($poshead = strpos($texte, '</head>')) !== false
755
+    ) {
756
+        $head = substr($texte, 0, $poshead);
757
+        $insert = false;
758
+        $href_base = false;
759
+        if (strpos($head, '<base') === false) {
760
+            $insert = true;
761
+        } else {
762
+            // si aucun <base ...> n'a de href il faut en inserer un
763
+            // sinon juste re-ecrire les ancres si besoin
764
+            $insert = true;
765
+            include_spip('inc/filtres');
766
+            $bases = extraire_balises($head, 'base');
767
+            foreach ($bases as $base) {
768
+                if ($href_base = extraire_attribut($base, 'href')) {
769
+                    $insert = false;
770
+                    break;
771
+                }
772
+            }
773
+        }
774
+
775
+        if ($insert) {
776
+            include_spip('inc/filtres_mini');
777
+            // ajouter un base qui reglera tous les liens relatifs
778
+            $href_base = url_absolue('./');
779
+            $base = "\n<base href=\"$href_base\" />";
780
+            if (($pos = strpos($head, '<head>')) !== false) {
781
+                $head = substr_replace($head, $base, $pos + 6, 0);
782
+            } elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
783
+                $head = str_replace($r[0], $r[0] . $base, $head);
784
+            }
785
+            $texte = $head . substr($texte, $poshead);
786
+        }
787
+        if ($href_base) {
788
+            // gerer les ancres
789
+            $base = $_SERVER['REQUEST_URI'];
790
+            // pas de guillemets ni < dans l'URL qu'on insere dans le HTML
791
+            if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) {
792
+                $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
793
+            }
794
+            if (strpos($texte, "href='#") !== false) {
795
+                $texte = str_replace("href='#", "href='$base#", $texte);
796
+            }
797
+            if (strpos($texte, 'href="#') !== false) {
798
+                $texte = str_replace('href="#', "href=\"$base#", $texte);
799
+            }
800
+        }
801
+    }
802 802
 }
803 803
 
804 804
 
805 805
 // Envoyer les entetes, en retenant ceux qui sont a usage interne
806 806
 // et demarrent par X-Spip-...
807 807
 function envoyer_entetes($entetes) {
808
-	foreach ($entetes as $k => $v) { #	if (strncmp($k, 'X-Spip-', 7))
809
-	@header(strlen($v) ? "$k: $v" : $k);
810
-	}
808
+    foreach ($entetes as $k => $v) { #	if (strncmp($k, 'X-Spip-', 7))
809
+    @header(strlen($v) ? "$k: $v" : $k);
810
+    }
811 811
 }
Please login to merge, or discard this patch.
ecrire/public/criteres.php 1 patch
Indentation   +1718 added lines, -1718 removed lines patch added patch discarded remove patch
@@ -21,7 +21,7 @@  discard block
 block discarded – undo
21 21
  **/
22 22
 
23 23
 if (!defined('_ECRIRE_INC_VERSION')) {
24
-	return;
24
+    return;
25 25
 }
26 26
 
27 27
 /**
@@ -47,12 +47,12 @@  discard block
 block discarded – undo
47 47
  **/
48 48
 function critere_racine_dist($idb, &$boucles, $crit) {
49 49
 
50
-	$not = $crit->not;
51
-	$boucle = &$boucles[$idb];
52
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
50
+    $not = $crit->not;
51
+    $boucle = &$boucles[$idb];
52
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
53 53
 
54
-	$c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
55
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
54
+    $c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
55
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
56 56
 }
57 57
 
58 58
 
@@ -69,15 +69,15 @@  discard block
 block discarded – undo
69 69
  * @return void|array
70 70
  **/
71 71
 function critere_exclus_dist($idb, &$boucles, $crit) {
72
-	$not = $crit->not;
73
-	$boucle = &$boucles[$idb];
74
-	$id = $boucle->primary;
75
-
76
-	if ($not or !$id) {
77
-		return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]];
78
-	}
79
-	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
80
-	$boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
72
+    $not = $crit->not;
73
+    $boucle = &$boucles[$idb];
74
+    $id = $boucle->primary;
75
+
76
+    if ($not or !$id) {
77
+        return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]];
78
+    }
79
+    $arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
80
+    $boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
81 81
 }
82 82
 
83 83
 
@@ -97,73 +97,73 @@  discard block
 block discarded – undo
97 97
  * @return void|array
98 98
  **/
99 99
 function critere_doublons_dist($idb, &$boucles, $crit) {
100
-	$boucle = &$boucles[$idb];
101
-	$primary = $boucle->primary;
102
-
103
-	// la table nécessite une clé primaire, non composée
104
-	if (!$primary or strpos($primary, ',')) {
105
-		return ['zbug_doublon_sur_table_sans_cle_primaire'];
106
-	}
107
-
108
-	$not = ($crit->not ? '' : 'NOT');
109
-
110
-	// le doublon s'applique sur un type de boucle (article)
111
-	$nom = "'" . $boucle->type_requete . "'";
112
-
113
-	// compléter le nom avec un nom précisé {doublons nom}
114
-	// on obtient $nom = "'article' . 'nom'"
115
-	if (isset($crit->param[0])) {
116
-		$nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
117
-	}
118
-
119
-	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
120
-	$init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
121
-	$init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
122
-
123
-	// on crée un sql_in avec la clé primaire de la table
124
-	// et la collection des doublons déjà emmagasinés dans le tableau
125
-	// $doublons et son index, ici $nom
126
-
127
-	// debut du code "sql_in('articles.id_article', "
128
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
129
-	// lecture des données du doublon "$doublons[$doublon_index[] = "
130
-	// Attention : boucle->doublons désigne une variable qu'on affecte
131
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= '));
132
-
133
-	// le debut complet du code des doublons
134
-	$debut_doub = $debut_in . $debut_doub;
135
-
136
-	// nom du doublon "('article' . 'nom')]"
137
-	$fin_doub = "($nom)]";
138
-
139
-	// si on trouve un autre critère doublon,
140
-	// on fusionne pour avoir un seul IN, et on s'en va !
141
-	foreach ($boucle->where as $k => $w) {
142
-		if (strpos($w[0], $debut_doub) === 0) {
143
-			// fusionner le sql_in (du where)
144
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
145
-			// fusionner l'initialisation (du hash) pour faire plus joli
146
-			$x = strpos($boucle->hash, $init_comment);
147
-			$len = strlen($init_comment);
148
-			$boucle->hash =
149
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
150
-
151
-			return;
152
-		}
153
-	}
154
-
155
-	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
156
-	$boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
157
-
158
-	// déclarer le doublon s'il n'existe pas encore
159
-	$boucle->hash .= $init_comment . $init_code;
160
-
161
-
162
-	# la ligne suivante avait l'intention d'eviter une collecte deja faite
163
-	# mais elle fait planter une boucle a 2 critere doublons:
164
-	# {!doublons A}{doublons B}
165
-	# (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
166
-	#	if ($crit->not) $boucle->doublons = "";
100
+    $boucle = &$boucles[$idb];
101
+    $primary = $boucle->primary;
102
+
103
+    // la table nécessite une clé primaire, non composée
104
+    if (!$primary or strpos($primary, ',')) {
105
+        return ['zbug_doublon_sur_table_sans_cle_primaire'];
106
+    }
107
+
108
+    $not = ($crit->not ? '' : 'NOT');
109
+
110
+    // le doublon s'applique sur un type de boucle (article)
111
+    $nom = "'" . $boucle->type_requete . "'";
112
+
113
+    // compléter le nom avec un nom précisé {doublons nom}
114
+    // on obtient $nom = "'article' . 'nom'"
115
+    if (isset($crit->param[0])) {
116
+        $nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
117
+    }
118
+
119
+    // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
120
+    $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
121
+    $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
122
+
123
+    // on crée un sql_in avec la clé primaire de la table
124
+    // et la collection des doublons déjà emmagasinés dans le tableau
125
+    // $doublons et son index, ici $nom
126
+
127
+    // debut du code "sql_in('articles.id_article', "
128
+    $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
129
+    // lecture des données du doublon "$doublons[$doublon_index[] = "
130
+    // Attention : boucle->doublons désigne une variable qu'on affecte
131
+    $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= '));
132
+
133
+    // le debut complet du code des doublons
134
+    $debut_doub = $debut_in . $debut_doub;
135
+
136
+    // nom du doublon "('article' . 'nom')]"
137
+    $fin_doub = "($nom)]";
138
+
139
+    // si on trouve un autre critère doublon,
140
+    // on fusionne pour avoir un seul IN, et on s'en va !
141
+    foreach ($boucle->where as $k => $w) {
142
+        if (strpos($w[0], $debut_doub) === 0) {
143
+            // fusionner le sql_in (du where)
144
+            $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
145
+            // fusionner l'initialisation (du hash) pour faire plus joli
146
+            $x = strpos($boucle->hash, $init_comment);
147
+            $len = strlen($init_comment);
148
+            $boucle->hash =
149
+                substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
150
+
151
+            return;
152
+        }
153
+    }
154
+
155
+    // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
156
+    $boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
157
+
158
+    // déclarer le doublon s'il n'existe pas encore
159
+    $boucle->hash .= $init_comment . $init_code;
160
+
161
+
162
+    # la ligne suivante avait l'intention d'eviter une collecte deja faite
163
+    # mais elle fait planter une boucle a 2 critere doublons:
164
+    # {!doublons A}{doublons B}
165
+    # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
166
+    #	if ($crit->not) $boucle->doublons = "";
167 167
 }
168 168
 
169 169
 
@@ -184,14 +184,14 @@  discard block
 block discarded – undo
184 184
  * @return void
185 185
  **/
186 186
 function critere_lang_select_dist($idb, &$boucles, $crit) {
187
-	if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
188
-		$param = 'oui';
189
-	}
190
-	if ($crit->not) {
191
-		$param = ($param == 'oui') ? 'non' : 'oui';
192
-	}
193
-	$boucle = &$boucles[$idb];
194
-	$boucle->lang_select = $param;
187
+    if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
188
+        $param = 'oui';
189
+    }
190
+    if ($crit->not) {
191
+        $param = ($param == 'oui') ? 'non' : 'oui';
192
+    }
193
+    $boucle = &$boucles[$idb];
194
+    $boucle->lang_select = $param;
195 195
 }
196 196
 
197 197
 
@@ -213,15 +213,15 @@  discard block
 block discarded – undo
213 213
  * @return void
214 214
  **/
215 215
 function critere_debut_dist($idb, &$boucles, $crit) {
216
-	[$un, $deux] = $crit->param;
217
-	$un = $un[0]->texte;
218
-	$deux = $deux[0]->texte;
219
-	if ($deux) {
220
-		$boucles[$idb]->limit =
221
-			'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
222
-	} else {
223
-		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
224
-	}
216
+    [$un, $deux] = $crit->param;
217
+    $un = $un[0]->texte;
218
+    $deux = $deux[0]->texte;
219
+    if ($deux) {
220
+        $boucles[$idb]->limit =
221
+            'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
222
+    } else {
223
+        calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
224
+    }
225 225
 }
226 226
 
227 227
 
@@ -255,58 +255,58 @@  discard block
 block discarded – undo
255 255
  **/
256 256
 function critere_pagination_dist($idb, &$boucles, $crit) {
257 257
 
258
-	$boucle = &$boucles[$idb];
259
-	// definition de la taille de la page
260
-	$pas = !isset($crit->param[0][0]) ? "''"
261
-		: calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
262
-
263
-	if (!preg_match(_CODE_QUOTE, $pas, $r)) {
264
-		$pas = "((\$a = intval($pas)) ? \$a : 10)";
265
-	} else {
266
-		$r = intval($r[2]);
267
-		$pas = strval($r ?: 10);
268
-	}
269
-
270
-	// Calcul du nommage de la pagination si il existe.
271
-	// La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
272
-	// compatible avec l'ancienne car certains cas fonctionnent correctement
273
-	$type = "'$idb'";
274
-	// Calcul d'un nommage spécifique de la pagination si précisé.
275
-	// Syntaxe {pagination 20, nom}
276
-	if (isset($crit->param[0][1])) {
277
-		$type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
278
-	} // Ancienne syntaxe {pagination 20 nom} pour compatibilité
279
-	elseif (isset($crit->param[1][0])) {
280
-		$type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
281
-	}
282
-
283
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
284
-	$boucle->modificateur['debut_nom'] = $type;
285
-	$partie =
286
-		// tester si le numero de page demande est de la forme '@yyy'
287
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
288
-		. "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
289
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
290
-		. "\t\t" . '$iter->seek(0);' . "\n"
291
-		. "\t}\n"
292
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
293
-
294
-	$boucle->hash .= '
258
+    $boucle = &$boucles[$idb];
259
+    // definition de la taille de la page
260
+    $pas = !isset($crit->param[0][0]) ? "''"
261
+        : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
262
+
263
+    if (!preg_match(_CODE_QUOTE, $pas, $r)) {
264
+        $pas = "((\$a = intval($pas)) ? \$a : 10)";
265
+    } else {
266
+        $r = intval($r[2]);
267
+        $pas = strval($r ?: 10);
268
+    }
269
+
270
+    // Calcul du nommage de la pagination si il existe.
271
+    // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
272
+    // compatible avec l'ancienne car certains cas fonctionnent correctement
273
+    $type = "'$idb'";
274
+    // Calcul d'un nommage spécifique de la pagination si précisé.
275
+    // Syntaxe {pagination 20, nom}
276
+    if (isset($crit->param[0][1])) {
277
+        $type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
278
+    } // Ancienne syntaxe {pagination 20 nom} pour compatibilité
279
+    elseif (isset($crit->param[1][0])) {
280
+        $type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
281
+    }
282
+
283
+    $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
284
+    $boucle->modificateur['debut_nom'] = $type;
285
+    $partie =
286
+        // tester si le numero de page demande est de la forme '@yyy'
287
+        'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
288
+        . "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
289
+        . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
290
+        . "\t\t" . '$iter->seek(0);' . "\n"
291
+        . "\t}\n"
292
+        . "\t" . '$debut_boucle = intval($debut_boucle)';
293
+
294
+    $boucle->hash .= '
295 295
 	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
296 296
 
297
-	$boucle->total_parties = $pas;
298
-	calculer_parties($boucles, $idb, $partie, 'p+');
299
-	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
300
-	// sauf si pas de primaire, ou si primaire composee
301
-	// dans ce cas, on ne sait pas gerer une pagination indirecte
302
-	$t = $boucle->id_table . '.' . $boucle->primary;
303
-	if (
304
-		$boucle->primary
305
-		and !preg_match('/[,\s]/', $boucle->primary)
306
-		and !in_array($t, $boucle->select)
307
-	) {
308
-		$boucle->select[] = $t;
309
-	}
297
+    $boucle->total_parties = $pas;
298
+    calculer_parties($boucles, $idb, $partie, 'p+');
299
+    // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
300
+    // sauf si pas de primaire, ou si primaire composee
301
+    // dans ce cas, on ne sait pas gerer une pagination indirecte
302
+    $t = $boucle->id_table . '.' . $boucle->primary;
303
+    if (
304
+        $boucle->primary
305
+        and !preg_match('/[,\s]/', $boucle->primary)
306
+        and !in_array($t, $boucle->select)
307
+    ) {
308
+        $boucle->select[] = $t;
309
+    }
310 310
 }
311 311
 
312 312
 
@@ -328,24 +328,24 @@  discard block
 block discarded – undo
328 328
  **/
329 329
 function critere_recherche_dist($idb, &$boucles, $crit) {
330 330
 
331
-	$boucle = &$boucles[$idb];
331
+    $boucle = &$boucles[$idb];
332 332
 
333
-	if (!$boucle->primary or strpos($boucle->primary, ',')) {
334
-		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
333
+    if (!$boucle->primary or strpos($boucle->primary, ',')) {
334
+        erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
335 335
 
336
-		return;
337
-	}
336
+        return;
337
+    }
338 338
 
339
-	if (isset($crit->param[0])) {
340
-		$quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
-	} else {
342
-		$quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
-	}
339
+    if (isset($crit->param[0])) {
340
+        $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
+    } else {
342
+        $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
+    }
344 344
 
345
-	$_modificateur = var_export($boucle->modificateur, true);
346
-	$boucle->hash .= '
345
+    $_modificateur = var_export($boucle->modificateur, true);
346
+    $boucle->hash .= '
347 347
 	// RECHERCHE'
348
-		. ($crit->cond ? '
348
+        . ($crit->cond ? '
349 349
 	if (!strlen(' . $quoi . ')){
350 350
 		list($rech_select, $rech_where) = array("0 as points","");
351 351
 	} else' : '') . '
@@ -356,21 +356,21 @@  discard block
 block discarded – undo
356 356
 	';
357 357
 
358 358
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
360
-	if (!in_array($t, $boucles[$idb]->select)) {
361
-		$boucle->select[] = $t;
362
-	} # pour postgres, neuneu ici
363
-	// jointure uniquement sur le serveur principal
364
-	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
-	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
367
-		$boucle->from['resultats'] = 'spip_resultats';
368
-	}
369
-	$boucle->select[] = '$rech_select';
370
-	//$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
-
372
-	// et la recherche trouve
373
-	$boucle->where[] = '$rech_where?$rech_where:\'\'';
359
+    $t = $boucle->id_table . '.' . $boucle->primary;
360
+    if (!in_array($t, $boucles[$idb]->select)) {
361
+        $boucle->select[] = $t;
362
+    } # pour postgres, neuneu ici
363
+    // jointure uniquement sur le serveur principal
364
+    // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
+    if (!$boucle->sql_serveur) {
366
+        $boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
367
+        $boucle->from['resultats'] = 'spip_resultats';
368
+    }
369
+    $boucle->select[] = '$rech_select';
370
+    //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
+
372
+    // et la recherche trouve
373
+    $boucle->where[] = '$rech_where?$rech_where:\'\'';
374 374
 }
375 375
 
376 376
 /**
@@ -387,25 +387,25 @@  discard block
 block discarded – undo
387 387
  * @return void
388 388
  **/
389 389
 function critere_traduction_dist($idb, &$boucles, $crit) {
390
-	$boucle = &$boucles[$idb];
391
-	$prim = $boucle->primary;
392
-	$table = $boucle->id_table;
393
-	$arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
-	$dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
-	$boucle->where[] =
396
-		[
397
-			"'OR'",
398
-			[
399
-				"'AND'",
400
-				["'='", "'$table.id_trad'", 0],
401
-				["'='", "'$table.$prim'", $dprim]
402
-			],
403
-			[
404
-				"'AND'",
405
-				["'>'", "'$table.id_trad'", 0],
406
-				["'='", "'$table.id_trad'", $arg]
407
-			]
408
-		];
390
+    $boucle = &$boucles[$idb];
391
+    $prim = $boucle->primary;
392
+    $table = $boucle->id_table;
393
+    $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
+    $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
+    $boucle->where[] =
396
+        [
397
+            "'OR'",
398
+            [
399
+                "'AND'",
400
+                ["'='", "'$table.id_trad'", 0],
401
+                ["'='", "'$table.$prim'", $dprim]
402
+            ],
403
+            [
404
+                "'AND'",
405
+                ["'>'", "'$table.id_trad'", 0],
406
+                ["'='", "'$table.id_trad'", $arg]
407
+            ]
408
+        ];
409 409
 }
410 410
 
411 411
 
@@ -423,17 +423,17 @@  discard block
 block discarded – undo
423 423
  * @return void
424 424
  **/
425 425
 function critere_origine_traduction_dist($idb, &$boucles, $crit) {
426
-	$boucle = &$boucles[$idb];
427
-	$prim = $boucle->primary;
428
-	$table = $boucle->id_table;
429
-
430
-	$c =
431
-		[
432
-			"'OR'",
433
-			["'='", "'$table." . "id_trad'", "'$table.$prim'"],
434
-			["'='", "'$table.id_trad'", "'0'"]
435
-		];
436
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
426
+    $boucle = &$boucles[$idb];
427
+    $prim = $boucle->primary;
428
+    $table = $boucle->id_table;
429
+
430
+    $c =
431
+        [
432
+            "'OR'",
433
+            ["'='", "'$table." . "id_trad'", "'$table.$prim'"],
434
+            ["'='", "'$table.id_trad'", "'0'"]
435
+        ];
436
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
437 437
 }
438 438
 
439 439
 
@@ -450,17 +450,17 @@  discard block
 block discarded – undo
450 450
  **/
451 451
 function critere_meme_parent_dist($idb, &$boucles, $crit) {
452 452
 
453
-	$boucle = &$boucles[$idb];
454
-	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
456
-	$mparent = $boucle->id_table . '.' . $id_parent;
457
-
458
-	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
459
-		$boucle->where[] = ["'='", "'$mparent'", $arg];
460
-	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
461
-	else {
462
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]];
463
-	}
453
+    $boucle = &$boucles[$idb];
454
+    $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
456
+    $mparent = $boucle->id_table . '.' . $id_parent;
457
+
458
+    if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
459
+        $boucle->where[] = ["'='", "'$mparent'", $arg];
460
+    } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
461
+    else {
462
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]];
463
+    }
464 464
 }
465 465
 
466 466
 
@@ -491,37 +491,37 @@  discard block
 block discarded – undo
491 491
  **/
492 492
 function critere_branche_dist($idb, &$boucles, $crit) {
493 493
 
494
-	$not = $crit->not;
495
-	$boucle = &$boucles[$idb];
496
-	// prendre en priorite un identifiant en parametre {branche XX}
497
-	if (isset($crit->param[0])) {
498
-		$arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
499
-		// sinon on le prend chez une boucle parente
500
-	} else {
501
-		$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
502
-	}
503
-
504
-	//Trouver une jointure
505
-	$champ = 'id_rubrique';
506
-	$desc = $boucle->show;
507
-	//Seulement si necessaire
508
-	if (!array_key_exists($champ, $desc['field'])) {
509
-		$cle = trouver_jointure_champ($champ, $boucle);
510
-		$trouver_table = charger_fonction('trouver_table', 'base');
511
-		$desc = $trouver_table($boucle->from[$cle]);
512
-		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
513
-			$decompose = decompose_champ_id_objet($champ);
514
-			$champ = array_shift($decompose);
515
-			$boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
516
-		}
517
-	} else {
518
-		$cle = $boucle->id_table;
519
-	}
520
-
521
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
522
-		. ($not ? ", 'NOT'" : '') . ')';
523
-	$boucle->where[] = !$crit->cond ? $c :
524
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
494
+    $not = $crit->not;
495
+    $boucle = &$boucles[$idb];
496
+    // prendre en priorite un identifiant en parametre {branche XX}
497
+    if (isset($crit->param[0])) {
498
+        $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
499
+        // sinon on le prend chez une boucle parente
500
+    } else {
501
+        $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
502
+    }
503
+
504
+    //Trouver une jointure
505
+    $champ = 'id_rubrique';
506
+    $desc = $boucle->show;
507
+    //Seulement si necessaire
508
+    if (!array_key_exists($champ, $desc['field'])) {
509
+        $cle = trouver_jointure_champ($champ, $boucle);
510
+        $trouver_table = charger_fonction('trouver_table', 'base');
511
+        $desc = $trouver_table($boucle->from[$cle]);
512
+        if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
513
+            $decompose = decompose_champ_id_objet($champ);
514
+            $champ = array_shift($decompose);
515
+            $boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
516
+        }
517
+    } else {
518
+        $cle = $boucle->id_table;
519
+    }
520
+
521
+    $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
522
+        . ($not ? ", 'NOT'" : '') . ')';
523
+    $boucle->where[] = !$crit->cond ? $c :
524
+        ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
525 525
 }
526 526
 
527 527
 /**
@@ -537,15 +537,15 @@  discard block
 block discarded – undo
537 537
  **/
538 538
 function critere_logo_dist($idb, &$boucles, $crit) {
539 539
 
540
-	$boucle = &$boucles[$idb];
541
-	$not = ($crit->not ? 'NOT' : '');
542
-	$serveur = $boucle->sql_serveur;
540
+    $boucle = &$boucles[$idb];
541
+    $not = ($crit->not ? 'NOT' : '');
542
+    $serveur = $boucle->sql_serveur;
543 543
 
544
-	$c = "sql_in('" .
545
-		$boucle->id_table . '.' . $boucle->primary
546
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
544
+    $c = "sql_in('" .
545
+        $boucle->id_table . '.' . $boucle->primary
546
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
547 547
 
548
-	$boucle->where[] = $c;
548
+    $boucle->where[] = $c;
549 549
 }
550 550
 
551 551
 
@@ -567,31 +567,31 @@  discard block
 block discarded – undo
567 567
  * @return void|array
568 568
  **/
569 569
 function critere_fusion_dist($idb, &$boucles, $crit) {
570
-	if ($t = isset($crit->param[0])) {
571
-		$t = $crit->param[0];
572
-		if ($t[0]->type == 'texte') {
573
-			$t = $t[0]->texte;
574
-			if (preg_match('/^(.*)\.(.*)$/', $t, $r)) {
575
-				$t = table_objet_sql($r[1]);
576
-				$t = array_search($t, $boucles[$idb]->from);
577
-				if ($t) {
578
-					$t .= '.' . $r[2];
579
-				}
580
-			}
581
-		} else {
582
-			$t = '".'
583
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
584
-				. '."';
585
-		}
586
-	}
587
-	if ($t) {
588
-		$boucles[$idb]->group[] = $t;
589
-		if (!in_array($t, $boucles[$idb]->select)) {
590
-			$boucles[$idb]->select[] = $t;
591
-		}
592
-	} else {
593
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
594
-	}
570
+    if ($t = isset($crit->param[0])) {
571
+        $t = $crit->param[0];
572
+        if ($t[0]->type == 'texte') {
573
+            $t = $t[0]->texte;
574
+            if (preg_match('/^(.*)\.(.*)$/', $t, $r)) {
575
+                $t = table_objet_sql($r[1]);
576
+                $t = array_search($t, $boucles[$idb]->from);
577
+                if ($t) {
578
+                    $t .= '.' . $r[2];
579
+                }
580
+            }
581
+        } else {
582
+            $t = '".'
583
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
584
+                . '."';
585
+        }
586
+    }
587
+    if ($t) {
588
+        $boucles[$idb]->group[] = $t;
589
+        if (!in_array($t, $boucles[$idb]->select)) {
590
+            $boucles[$idb]->select[] = $t;
591
+        }
592
+    } else {
593
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
594
+    }
595 595
 }
596 596
 
597 597
 /**
@@ -611,7 +611,7 @@  discard block
 block discarded – undo
611 611
  * @return void
612 612
  **/
613 613
 function critere_fusion_supprimer_dist($idb, &$boucles, $crit) {
614
-	$boucles[$idb]->group = [];
614
+    $boucles[$idb]->group = [];
615 615
 }
616 616
 
617 617
 /**
@@ -648,44 +648,44 @@  discard block
 block discarded – undo
648 648
  * @param Critere $crit Paramètres du critère dans cette boucle
649 649
  */
650 650
 function critere_collecte_dist($idb, &$boucles, $crit) {
651
-	if (isset($crit->param[0])) {
652
-		$_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
653
-		$boucle = $boucles[$idb];
654
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
655
-		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
656
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
657
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
658
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
659
-			if (
660
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
661
-				or (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
662
-			) {
663
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
664
-			} else {
665
-				$boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
666
-			}
667
-		}
668
-	} else {
669
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
670
-	}
651
+    if (isset($crit->param[0])) {
652
+        $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
653
+        $boucle = $boucles[$idb];
654
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
655
+        $n = is_countable($boucle->order) ? count($boucle->order) : 0;
656
+        if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
657
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
658
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
659
+            if (
660
+                (false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
661
+                or (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
662
+            ) {
663
+                $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
664
+            } else {
665
+                $boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
666
+            }
667
+        }
668
+    } else {
669
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
670
+    }
671 671
 }
672 672
 
673 673
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
674
-	$boucle = $boucles[$idb];
675
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
676
-	$var = '$champs_' . $idb;
677
-	$desc = (strpos($boucle->in, (string) "static $var =") !== false);
678
-	if (!$desc) {
679
-		$desc = $boucle->show['field'];
680
-		$desc = implode(',', array_map('_q', array_keys($desc)));
681
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
682
-	}
683
-	if ($desc) {
684
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
685
-	}
686
-	$arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
687
-
688
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
674
+    $boucle = $boucles[$idb];
675
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
676
+    $var = '$champs_' . $idb;
677
+    $desc = (strpos($boucle->in, (string) "static $var =") !== false);
678
+    if (!$desc) {
679
+        $desc = $boucle->show['field'];
680
+        $desc = implode(',', array_map('_q', array_keys($desc)));
681
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
682
+    }
683
+    if ($desc) {
684
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
685
+    }
686
+    $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
687
+
688
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
689 689
 }
690 690
 
691 691
 /**
@@ -724,7 +724,7 @@  discard block
 block discarded – undo
724 724
  * @param Critere $crit Paramètres du critère dans cette boucle
725 725
  */
726 726
 function critere_par_dist($idb, &$boucles, $crit) {
727
-	return critere_parinverse($idb, $boucles, $crit);
727
+    return critere_parinverse($idb, $boucles, $crit);
728 728
 }
729 729
 
730 730
 /**
@@ -746,93 +746,93 @@  discard block
 block discarded – undo
746 746
  * @param Critere $crit Paramètres du critère dans cette boucle
747 747
  */
748 748
 function critere_parinverse($idb, &$boucles, $crit) {
749
-	$boucle = &$boucles[$idb];
750
-
751
-	$sens = $collecte = '';
752
-	if ($crit->not) {
753
-		$sens = " . ' DESC'";
754
-	}
755
-	if (isset($boucle->modificateur['collate'])) {
756
-		$collecte = ' . ' . $boucle->modificateur['collate'];
757
-	}
758
-
759
-	// Pour chaque paramètre du critère
760
-	foreach ($crit->param as $tri) {
761
-		$order = $fct = '';
762
-		// tris specifiés dynamiquement {par #ENV{tri}}
763
-		if ($tri[0]->type != 'texte') {
764
-			// calculer le order dynamique qui verifie les champs
765
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
766
-			// ajouter 'hasard' comme possibilité de tri dynamique
767
-			calculer_critere_par_hasard($idb, $boucles, $crit);
768
-		}
769
-		// tris textuels {par titre}
770
-		else {
771
-			$par = array_shift($tri);
772
-			$par = $par->texte;
773
-
774
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
775
-			if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) {
776
-				$expression = trim($m[1]);
777
-				$champ = trim($m[2]);
778
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
779
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
780
-				} else {
781
-					return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
782
-				}
783
-
784
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
785
-			} elseif ($boucle->type_requete == 'DATA' or preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
786
-				// {par FONCTION(champ)}
787
-				if (isset($match) and count($match) > 2) {
788
-					$par = substr($match[2], 1, -1);
789
-					$fct = $match[1];
790
-				}
791
-				// quelques cas spécifiques {par hasard}, {par date}
792
-				if ($par == 'hasard') {
793
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
794
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
795
-					$order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
796
-				} else {
797
-					// cas général {par champ}, {par table.champ}, ...
798
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
799
-				}
800
-			}
801
-
802
-			// on ne sait pas traiter…
803
-			else {
804
-				return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
805
-			}
806
-
807
-			// En cas d'erreur de squelette retournée par une fonction
808
-			if (is_array($order)) {
809
-				return $order;
810
-			}
811
-		}
812
-
813
-		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
814
-			$t = $m[1];
815
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
816
-				$boucle->select[] = $t;
817
-			}
818
-		} else {
819
-			$sens = '';
820
-		}
821
-
822
-		if ($fct) {
823
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
824
-				$order = "'$fct(" . $r[1] . ")'";
825
-			} else {
826
-				$order = "'$fct(' . $order . ')'";
827
-			}
828
-		}
829
-		$t = $order . $collecte . $sens;
830
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
831
-			$t = $r[1] . $r[2];
832
-		}
833
-
834
-		$boucle->order[] = $t;
835
-	}
749
+    $boucle = &$boucles[$idb];
750
+
751
+    $sens = $collecte = '';
752
+    if ($crit->not) {
753
+        $sens = " . ' DESC'";
754
+    }
755
+    if (isset($boucle->modificateur['collate'])) {
756
+        $collecte = ' . ' . $boucle->modificateur['collate'];
757
+    }
758
+
759
+    // Pour chaque paramètre du critère
760
+    foreach ($crit->param as $tri) {
761
+        $order = $fct = '';
762
+        // tris specifiés dynamiquement {par #ENV{tri}}
763
+        if ($tri[0]->type != 'texte') {
764
+            // calculer le order dynamique qui verifie les champs
765
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
766
+            // ajouter 'hasard' comme possibilité de tri dynamique
767
+            calculer_critere_par_hasard($idb, $boucles, $crit);
768
+        }
769
+        // tris textuels {par titre}
770
+        else {
771
+            $par = array_shift($tri);
772
+            $par = $par->texte;
773
+
774
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
775
+            if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) {
776
+                $expression = trim($m[1]);
777
+                $champ = trim($m[2]);
778
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
779
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
780
+                } else {
781
+                    return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
782
+                }
783
+
784
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
785
+            } elseif ($boucle->type_requete == 'DATA' or preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
786
+                // {par FONCTION(champ)}
787
+                if (isset($match) and count($match) > 2) {
788
+                    $par = substr($match[2], 1, -1);
789
+                    $fct = $match[1];
790
+                }
791
+                // quelques cas spécifiques {par hasard}, {par date}
792
+                if ($par == 'hasard') {
793
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
794
+                } elseif ($par == 'date' and !empty($boucle->show['date'])) {
795
+                    $order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
796
+                } else {
797
+                    // cas général {par champ}, {par table.champ}, ...
798
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
799
+                }
800
+            }
801
+
802
+            // on ne sait pas traiter…
803
+            else {
804
+                return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
805
+            }
806
+
807
+            // En cas d'erreur de squelette retournée par une fonction
808
+            if (is_array($order)) {
809
+                return $order;
810
+            }
811
+        }
812
+
813
+        if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
814
+            $t = $m[1];
815
+            if (strpos($t, '.') and !in_array($t, $boucle->select)) {
816
+                $boucle->select[] = $t;
817
+            }
818
+        } else {
819
+            $sens = '';
820
+        }
821
+
822
+        if ($fct) {
823
+            if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
824
+                $order = "'$fct(" . $r[1] . ")'";
825
+            } else {
826
+                $order = "'$fct(' . $order . ')'";
827
+            }
828
+        }
829
+        $t = $order . $collecte . $sens;
830
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
831
+            $t = $r[1] . $r[2];
832
+        }
833
+
834
+        $boucle->order[] = $t;
835
+    }
836 836
 }
837 837
 
838 838
 /**
@@ -846,13 +846,13 @@  discard block
 block discarded – undo
846 846
  * @return string Clause pour le Order by
847 847
  */
848 848
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
849
-	$boucle = &$boucles[$idb];
850
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
851
-	$parha = 'rand() AS hasard';
852
-	if (!in_array($parha, $boucle->select)) {
853
-		$boucle->select[] = $parha;
854
-	}
855
-	return "'hasard'";
849
+    $boucle = &$boucles[$idb];
850
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
851
+    $parha = 'rand() AS hasard';
852
+    if (!in_array($parha, $boucle->select)) {
853
+        $boucle->select[] = $parha;
854
+    }
855
+    return "'hasard'";
856 856
 }
857 857
 
858 858
 /**
@@ -876,24 +876,24 @@  discard block
 block discarded – undo
876 876
  * @return string|array Clause pour le Order by (array si erreur)
877 877
  */
878 878
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
879
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
880
-	if (is_array($_champ)) {
881
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
882
-	}
883
-	$boucle = &$boucles[$idb];
884
-	$texte = '0+' . $_champ;
885
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
886
-	if ($suite !== "''") {
887
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
888
-	}
889
-	$asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
890
-	$boucle->select[] = $texte . " AS $asnum";
891
-
892
-	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
893
-	$orderassinum = trim($orderassinum, "'");
894
-
895
-	$order = "'$orderassinum, $asnum'";
896
-	return $order;
879
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
880
+    if (is_array($_champ)) {
881
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
882
+    }
883
+    $boucle = &$boucles[$idb];
884
+    $texte = '0+' . $_champ;
885
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
886
+    if ($suite !== "''") {
887
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
888
+    }
889
+    $asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
890
+    $boucle->select[] = $texte . " AS $asnum";
891
+
892
+    $orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
893
+    $orderassinum = trim($orderassinum, "'");
894
+
895
+    $order = "'$orderassinum, $asnum'";
896
+    return $order;
897 897
 }
898 898
 
899 899
 /**
@@ -914,35 +914,35 @@  discard block
 block discarded – undo
914 914
  * @return string|array Clause pour le Order by (array si erreur)
915 915
  */
916 916
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
917
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
918
-	if (is_array($_champ)) {
919
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
920
-	}
921
-	$boucle = &$boucles[$idb];
922
-	$texte = '0+' . $_champ;
923
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
924
-	if ($suite !== "''") {
925
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
926
-	}
927
-
928
-	$as = false;
929
-	$select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
930
-	foreach ($boucle->select as $s) {
931
-		if (strpos($s, $select) === 0) {
932
-			$as = trim(substr($s, strlen($select)));
933
-			if (!preg_match(',\W,', $as)) {
934
-				break;
935
-			}
936
-			$as = false;
937
-		}
938
-	}
939
-
940
-	if (!$as) {
941
-		$as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
942
-		$boucle->select[] = $select . $as;
943
-	}
944
-	$order = "'$as'";
945
-	return $order;
917
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
918
+    if (is_array($_champ)) {
919
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
920
+    }
921
+    $boucle = &$boucles[$idb];
922
+    $texte = '0+' . $_champ;
923
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
924
+    if ($suite !== "''") {
925
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
926
+    }
927
+
928
+    $as = false;
929
+    $select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
930
+    foreach ($boucle->select as $s) {
931
+        if (strpos($s, $select) === 0) {
932
+            $as = trim(substr($s, strlen($select)));
933
+            if (!preg_match(',\W,', $as)) {
934
+                break;
935
+            }
936
+            $as = false;
937
+        }
938
+    }
939
+
940
+    if (!$as) {
941
+        $as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
942
+        $boucle->select[] = $select . $as;
943
+    }
944
+    $order = "'$as'";
945
+    return $order;
946 946
 }
947 947
 
948 948
 
@@ -962,14 +962,14 @@  discard block
 block discarded – undo
962 962
  * @return string|array Clause pour le Order by (array si erreur)
963 963
  */
964 964
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
965
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
966
-	if (is_array($_champ)) {
967
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
968
-	}
969
-	$boucle = &$boucles[$idb];
970
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
971
-	$order = "'multi'";
972
-	return $order;
965
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
966
+    if (is_array($_champ)) {
967
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
968
+    }
969
+    $boucle = &$boucles[$idb];
970
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
971
+    $order = "'multi'";
972
+    return $order;
973 973
 }
974 974
 
975 975
 /**
@@ -988,56 +988,56 @@  discard block
 block discarded – undo
988 988
  * @return array|string
989 989
  */
990 990
 function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) {
991
-	$boucle = &$boucles[$idb];
992
-	$desc = $boucle->show;
993
-
994
-	// le champ existe dans la table, pas de souci (le plus commun)
995
-	if (isset($desc['field'][$par])) {
996
-		$par = $boucle->id_table . '.' . $par;
997
-	}
998
-	// le champ est peut être une jointure
999
-	else {
1000
-		$table = $table_alias = false; // toutes les tables de jointure possibles
1001
-		$champ = $par;
1002
-
1003
-		// le champ demandé est une exception de jointure {par titre_mot}
1004
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1005
-			[$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par];
1006
-		} // la table de jointure est explicitement indiquée {par truc.muche}
1007
-		elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1008
-			[, $table, $champ] = $r;
1009
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1010
-			$table = table_objet_sql($table);
1011
-		}
1012
-
1013
-		// Si on connait la table d'arrivée, on la demande donc explicitement
1014
-		// Sinon on cherche le champ dans les tables possibles de jointures
1015
-		// Si la table est déjà dans le from, on la réutilise.
1016
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1017
-			$par = $infos['alias'] . '.' . $champ;
1018
-		} elseif (
1019
-			$boucle->jointures_explicites
1020
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1021
-		) {
1022
-			$par = $alias . '.' . $champ;
1023
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1024
-			$par = $alias . '.' . $champ;
1025
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1026
-		} elseif (
1027
-			$table_alias
1028
-			and isset($boucle->from[$table_alias])
1029
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1030
-		) {
1031
-			$par = $infos['alias'] . '.' . $champ;
1032
-		} elseif ($table) {
1033
-			// On avait table + champ, mais on ne les a pas trouvés
1034
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1035
-		} else {
1036
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1037
-		}
1038
-	}
1039
-
1040
-	return $raw ? $par : "'$par'";
991
+    $boucle = &$boucles[$idb];
992
+    $desc = $boucle->show;
993
+
994
+    // le champ existe dans la table, pas de souci (le plus commun)
995
+    if (isset($desc['field'][$par])) {
996
+        $par = $boucle->id_table . '.' . $par;
997
+    }
998
+    // le champ est peut être une jointure
999
+    else {
1000
+        $table = $table_alias = false; // toutes les tables de jointure possibles
1001
+        $champ = $par;
1002
+
1003
+        // le champ demandé est une exception de jointure {par titre_mot}
1004
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1005
+            [$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par];
1006
+        } // la table de jointure est explicitement indiquée {par truc.muche}
1007
+        elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1008
+            [, $table, $champ] = $r;
1009
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1010
+            $table = table_objet_sql($table);
1011
+        }
1012
+
1013
+        // Si on connait la table d'arrivée, on la demande donc explicitement
1014
+        // Sinon on cherche le champ dans les tables possibles de jointures
1015
+        // Si la table est déjà dans le from, on la réutilise.
1016
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1017
+            $par = $infos['alias'] . '.' . $champ;
1018
+        } elseif (
1019
+            $boucle->jointures_explicites
1020
+            and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1021
+        ) {
1022
+            $par = $alias . '.' . $champ;
1023
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1024
+            $par = $alias . '.' . $champ;
1025
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1026
+        } elseif (
1027
+            $table_alias
1028
+            and isset($boucle->from[$table_alias])
1029
+            and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1030
+        ) {
1031
+            $par = $infos['alias'] . '.' . $champ;
1032
+        } elseif ($table) {
1033
+            // On avait table + champ, mais on ne les a pas trouvés
1034
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1035
+        } else {
1036
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1037
+        }
1038
+    }
1039
+
1040
+    return $raw ? $par : "'$par'";
1041 1041
 }
1042 1042
 
1043 1043
 /**
@@ -1051,11 +1051,11 @@  discard block
 block discarded – undo
1051 1051
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1052 1052
  */
1053 1053
 function critere_par_joint($table, $champ, &$boucle) {
1054
-	$t = array_search($table, $boucle->from);
1055
-	if (!$t) {
1056
-		$t = trouver_jointure_champ($champ, $boucle);
1057
-	}
1058
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1054
+    $t = array_search($table, $boucle->from);
1055
+    if (!$t) {
1056
+        $t = trouver_jointure_champ($champ, $boucle);
1057
+    }
1058
+    return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1059 1059
 }
1060 1060
 
1061 1061
 /**
@@ -1080,33 +1080,33 @@  discard block
 block discarded – undo
1080 1080
  */
1081 1081
 function critere_inverse_dist($idb, &$boucles, $crit) {
1082 1082
 
1083
-	$boucle = &$boucles[$idb];
1084
-	// Classement par ordre inverse
1085
-	if ($crit->not) {
1086
-		critere_parinverse($idb, $boucles, $crit);
1087
-	} else {
1088
-		$order = "' DESC'";
1089
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1090
-		if (isset($crit->param[0])) {
1091
-			$critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1092
-			$order = "(($critere)?' DESC':'')";
1093
-		}
1094
-
1095
-		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
1096
-		if (!$n) {
1097
-			if (isset($boucle->default_order[0])) {
1098
-				$boucle->default_order[0] .= ' . " DESC"';
1099
-			} else {
1100
-				$boucle->default_order[] = ' DESC';
1101
-			}
1102
-		} else {
1103
-			$t = $boucle->order[$n - 1] . " . $order";
1104
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1105
-				$t = $r[1] . $r[2];
1106
-			}
1107
-			$boucle->order[$n - 1] = $t;
1108
-		}
1109
-	}
1083
+    $boucle = &$boucles[$idb];
1084
+    // Classement par ordre inverse
1085
+    if ($crit->not) {
1086
+        critere_parinverse($idb, $boucles, $crit);
1087
+    } else {
1088
+        $order = "' DESC'";
1089
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1090
+        if (isset($crit->param[0])) {
1091
+            $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1092
+            $order = "(($critere)?' DESC':'')";
1093
+        }
1094
+
1095
+        $n = is_countable($boucle->order) ? count($boucle->order) : 0;
1096
+        if (!$n) {
1097
+            if (isset($boucle->default_order[0])) {
1098
+                $boucle->default_order[0] .= ' . " DESC"';
1099
+            } else {
1100
+                $boucle->default_order[] = ' DESC';
1101
+            }
1102
+        } else {
1103
+            $t = $boucle->order[$n - 1] . " . $order";
1104
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1105
+                $t = $r[1] . $r[2];
1106
+            }
1107
+            $boucle->order[$n - 1] = $t;
1108
+        }
1109
+    }
1110 1110
 }
1111 1111
 
1112 1112
 /**
@@ -1118,139 +1118,139 @@  discard block
 block discarded – undo
1118 1118
  * @return void|array
1119 1119
  */
1120 1120
 function critere_par_ordre_liste_dist($idb, &$boucles, $crit) {
1121
-	$boucle = &$boucles[$idb];
1121
+    $boucle = &$boucles[$idb];
1122 1122
 
1123
-	$sens = $collecte = '';
1124
-	if ($crit->not) {
1125
-		$sens = " . ' DESC'";
1126
-	}
1123
+    $sens = $collecte = '';
1124
+    if ($crit->not) {
1125
+        $sens = " . ' DESC'";
1126
+    }
1127 1127
 
1128
-	$crit2 = clone $crit;
1129
-	$crit2->not = false;
1130
-	$crit2->param = [reset($crit->param)];
1131
-	$res = critere_parinverse($idb, $boucles, $crit2);
1128
+    $crit2 = clone $crit;
1129
+    $crit2->not = false;
1130
+    $crit2->param = [reset($crit->param)];
1131
+    $res = critere_parinverse($idb, $boucles, $crit2);
1132 1132
 
1133
-	// erreur ?
1134
-	if (is_array($res)) {
1135
-		return $res;
1136
-	}
1133
+    // erreur ?
1134
+    if (is_array($res)) {
1135
+        return $res;
1136
+    }
1137 1137
 
1138
-	$_order = array_pop($boucle->order);
1138
+    $_order = array_pop($boucle->order);
1139 1139
 
1140
-	$_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1140
+    $_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1141 1141
 
1142
-	$order = "'-FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste(array_reverse($_liste),'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1143
-	$boucle->order[] = $order;
1142
+    $order = "'-FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste(array_reverse($_liste),'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1143
+    $boucle->order[] = $order;
1144 1144
 }
1145 1145
 
1146 1146
 
1147 1147
 function critere_agenda_dist($idb, &$boucles, $crit) {
1148
-	$params = $crit->param;
1149
-
1150
-	if ((is_countable($params) ? count($params) : 0) < 1) {
1151
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1152
-	}
1153
-
1154
-	$boucle = &$boucles[$idb];
1155
-	$parent = $boucle->id_parent;
1156
-	$fields = $boucle->show['field'];
1157
-
1158
-	$date = array_shift($params);
1159
-	$type = array_shift($params);
1160
-
1161
-	// la valeur $type doit etre connue a la compilation
1162
-	// donc etre forcement reduite a un litteral unique dans le source
1163
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1164
-
1165
-	// La valeur date doit designer un champ de la table SQL.
1166
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1167
-	// sinon synthetiser le test de verif pour execution ulterieure
1168
-	// On prendra arbitrairement le premier champ si test negatif.
1169
-	if (((is_countable($date) ? count($date) : 0) == 1) and ($date[0]->type == 'texte')) {
1170
-		$date = $date[0]->texte;
1171
-		if (!isset($fields[$date])) {
1172
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1173
-		}
1174
-	} else {
1175
-		$a = calculer_liste($date, $idb, $boucles, $parent);
1176
-		$noms = array_keys($fields);
1177
-		$defaut = $noms[0];
1178
-		$noms = join(' ', $noms);
1179
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1180
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1181
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1182
-	}
1183
-	$annee = $params ? array_shift($params) : '';
1184
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1185
-		calculer_liste($annee, $idb, $boucles, $parent) .
1186
-		') ? $x : date("Y"))';
1187
-
1188
-	$mois = $params ? array_shift($params) : '';
1189
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1190
-		calculer_liste($mois, $idb, $boucles, $parent) .
1191
-		') ? $x : date("m"))';
1192
-
1193
-	$jour = $params ? array_shift($params) : '';
1194
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1195
-		calculer_liste($jour, $idb, $boucles, $parent) .
1196
-		') ? $x : date("d"))';
1197
-
1198
-	$annee2 = $params ? array_shift($params) : '';
1199
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1200
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1201
-		') ? $x : date("Y"))';
1202
-
1203
-	$mois2 = $params ? array_shift($params) : '';
1204
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1205
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1206
-		') ? $x : date("m"))';
1207
-
1208
-	$jour2 = $params ? array_shift($params) : '';
1209
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1210
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1211
-		') ? $x : date("d"))';
1212
-
1213
-	$date = $boucle->id_table . ".$date";
1214
-
1215
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1216
-	if ($type == 'jour') {
1217
-		$boucle->where[] = [
1218
-			"'='",
1219
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1220
-			("sql_quote($annee . $mois . $jour$quote_end)")
1221
-		];
1222
-	} elseif ($type == 'mois') {
1223
-		$boucle->where[] = [
1224
-			"'='",
1225
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1226
-			("sql_quote($annee . $mois$quote_end)")
1227
-		];
1228
-	} elseif ($type == 'semaine') {
1229
-		$boucle->where[] = [
1230
-			"'AND'",
1231
-			[
1232
-				"'>='",
1233
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1234
-				("date_debut_semaine($annee, $mois, $jour)")
1235
-			],
1236
-			[
1237
-				"'<='",
1238
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1239
-				("date_fin_semaine($annee, $mois, $jour)")
1240
-			]
1241
-		];
1242
-	} elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) {
1243
-		$boucle->where[] = [
1244
-			"'AND'",
1245
-			[
1246
-				"'>='",
1247
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1248
-				("sql_quote($annee . $mois . $jour$quote_end)")
1249
-			],
1250
-			["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1251
-		];
1252
-	}
1253
-	// sinon on prend tout
1148
+    $params = $crit->param;
1149
+
1150
+    if ((is_countable($params) ? count($params) : 0) < 1) {
1151
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1152
+    }
1153
+
1154
+    $boucle = &$boucles[$idb];
1155
+    $parent = $boucle->id_parent;
1156
+    $fields = $boucle->show['field'];
1157
+
1158
+    $date = array_shift($params);
1159
+    $type = array_shift($params);
1160
+
1161
+    // la valeur $type doit etre connue a la compilation
1162
+    // donc etre forcement reduite a un litteral unique dans le source
1163
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1164
+
1165
+    // La valeur date doit designer un champ de la table SQL.
1166
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1167
+    // sinon synthetiser le test de verif pour execution ulterieure
1168
+    // On prendra arbitrairement le premier champ si test negatif.
1169
+    if (((is_countable($date) ? count($date) : 0) == 1) and ($date[0]->type == 'texte')) {
1170
+        $date = $date[0]->texte;
1171
+        if (!isset($fields[$date])) {
1172
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1173
+        }
1174
+    } else {
1175
+        $a = calculer_liste($date, $idb, $boucles, $parent);
1176
+        $noms = array_keys($fields);
1177
+        $defaut = $noms[0];
1178
+        $noms = join(' ', $noms);
1179
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1180
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1181
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1182
+    }
1183
+    $annee = $params ? array_shift($params) : '';
1184
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1185
+        calculer_liste($annee, $idb, $boucles, $parent) .
1186
+        ') ? $x : date("Y"))';
1187
+
1188
+    $mois = $params ? array_shift($params) : '';
1189
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1190
+        calculer_liste($mois, $idb, $boucles, $parent) .
1191
+        ') ? $x : date("m"))';
1192
+
1193
+    $jour = $params ? array_shift($params) : '';
1194
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1195
+        calculer_liste($jour, $idb, $boucles, $parent) .
1196
+        ') ? $x : date("d"))';
1197
+
1198
+    $annee2 = $params ? array_shift($params) : '';
1199
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1200
+        calculer_liste($annee2, $idb, $boucles, $parent) .
1201
+        ') ? $x : date("Y"))';
1202
+
1203
+    $mois2 = $params ? array_shift($params) : '';
1204
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1205
+        calculer_liste($mois2, $idb, $boucles, $parent) .
1206
+        ') ? $x : date("m"))';
1207
+
1208
+    $jour2 = $params ? array_shift($params) : '';
1209
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1210
+        calculer_liste($jour2, $idb, $boucles, $parent) .
1211
+        ') ? $x : date("d"))';
1212
+
1213
+    $date = $boucle->id_table . ".$date";
1214
+
1215
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1216
+    if ($type == 'jour') {
1217
+        $boucle->where[] = [
1218
+            "'='",
1219
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1220
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1221
+        ];
1222
+    } elseif ($type == 'mois') {
1223
+        $boucle->where[] = [
1224
+            "'='",
1225
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1226
+            ("sql_quote($annee . $mois$quote_end)")
1227
+        ];
1228
+    } elseif ($type == 'semaine') {
1229
+        $boucle->where[] = [
1230
+            "'AND'",
1231
+            [
1232
+                "'>='",
1233
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1234
+                ("date_debut_semaine($annee, $mois, $jour)")
1235
+            ],
1236
+            [
1237
+                "'<='",
1238
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1239
+                ("date_fin_semaine($annee, $mois, $jour)")
1240
+            ]
1241
+        ];
1242
+    } elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) {
1243
+        $boucle->where[] = [
1244
+            "'AND'",
1245
+            [
1246
+                "'>='",
1247
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1248
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1249
+            ],
1250
+            ["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1251
+        ];
1252
+    }
1253
+    // sinon on prend tout
1254 1254
 }
1255 1255
 
1256 1256
 
@@ -1275,33 +1275,33 @@  discard block
 block discarded – undo
1275 1275
  * @return void
1276 1276
  **/
1277 1277
 function calculer_critere_parties($idb, &$boucles, $crit) {
1278
-	$boucle = &$boucles[$idb];
1279
-	$a1 = $crit->param[0];
1280
-	$a2 = $crit->param[1];
1281
-	$op = $crit->op;
1282
-
1283
-	[$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1);
1284
-	[$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1285
-
1286
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1287
-		$boucle->limit = $a11 . ',' . $a21;
1288
-	} else {
1289
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1290
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1291
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1292
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1293
-		$mode = (($op == '/') ? '/' :
1294
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1295
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1296
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') {
1297
-			$boucle->limit =
1298
-				(is_numeric($a11) ? "'$a11'" : $a11)
1299
-				. ".','."
1300
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1301
-		} else {
1302
-			calculer_parties($boucles, $idb, $partie, $mode);
1303
-		}
1304
-	}
1278
+    $boucle = &$boucles[$idb];
1279
+    $a1 = $crit->param[0];
1280
+    $a2 = $crit->param[1];
1281
+    $op = $crit->op;
1282
+
1283
+    [$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1);
1284
+    [$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1285
+
1286
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1287
+        $boucle->limit = $a11 . ',' . $a21;
1288
+    } else {
1289
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1290
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1291
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1292
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1293
+        $mode = (($op == '/') ? '/' :
1294
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1295
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1296
+        if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') {
1297
+            $boucle->limit =
1298
+                (is_numeric($a11) ? "'$a11'" : $a11)
1299
+                . ".','."
1300
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1301
+        } else {
1302
+            calculer_parties($boucles, $idb, $partie, $mode);
1303
+        }
1304
+    }
1305 1305
 }
1306 1306
 
1307 1307
 /**
@@ -1329,63 +1329,63 @@  discard block
 block discarded – undo
1329 1329
  * @return void
1330 1330
  **/
1331 1331
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1332
-	$total_parties = $boucles[$id_boucle]->total_parties;
1333
-
1334
-	preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1335
-	[, $op1, $op2] = array_pad($regs, 3, null);
1336
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1337
-	// {1/3}
1338
-	if ($op1 == '/') {
1339
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1340
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1341
-			"($total_parties ? $total_parties : 1)";
1342
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1343
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1344
-	} else {
1345
-		// cas {n-1,x}
1346
-		if ($op1 == '-') {
1347
-			$debut = "$nombre_boucle - $debut;";
1348
-		}
1349
-
1350
-		// cas {x,n-1}
1351
-		if ($op2 == '-') {
1352
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1353
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1354
-					($total_parties . ' - 1'));
1355
-		} else {
1356
-			// {x,1} ou {pagination}
1357
-			$fin = '$debut_boucle'
1358
-				. (is_numeric($total_parties) ?
1359
-					(($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1360
-					('+' . $total_parties . ' - 1'));
1361
-		}
1362
-
1363
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1364
-		if ($op1 == 'p') {
1365
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1366
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1367
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1368
-		}
1369
-	}
1370
-
1371
-	// Notes :
1372
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1373
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1374
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1375
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1376
-
1377
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1378
-		. '$debut_boucle = ' . $debut . ";\n	"
1379
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1380
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1381
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1382
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1383
-		. "\n\tif (\$debut_boucle>0"
1384
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1385
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1386
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1387
-
1388
-	$boucles[$id_boucle]->partie = "
1332
+    $total_parties = $boucles[$id_boucle]->total_parties;
1333
+
1334
+    preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1335
+    [, $op1, $op2] = array_pad($regs, 3, null);
1336
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1337
+    // {1/3}
1338
+    if ($op1 == '/') {
1339
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1340
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1341
+            "($total_parties ? $total_parties : 1)";
1342
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1343
+        $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1344
+    } else {
1345
+        // cas {n-1,x}
1346
+        if ($op1 == '-') {
1347
+            $debut = "$nombre_boucle - $debut;";
1348
+        }
1349
+
1350
+        // cas {x,n-1}
1351
+        if ($op2 == '-') {
1352
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1353
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1354
+                    ($total_parties . ' - 1'));
1355
+        } else {
1356
+            // {x,1} ou {pagination}
1357
+            $fin = '$debut_boucle'
1358
+                . (is_numeric($total_parties) ?
1359
+                    (($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1360
+                    ('+' . $total_parties . ' - 1'));
1361
+        }
1362
+
1363
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1364
+        if ($op1 == 'p') {
1365
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1366
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1367
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1368
+        }
1369
+    }
1370
+
1371
+    // Notes :
1372
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1373
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1374
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1375
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1376
+
1377
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1378
+        . '$debut_boucle = ' . $debut . ";\n	"
1379
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1380
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1381
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1382
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1383
+        . "\n\tif (\$debut_boucle>0"
1384
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1385
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1386
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1387
+
1388
+    $boucles[$id_boucle]->partie = "
1389 1389
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1390 1390
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1391 1391
 }
@@ -1402,26 +1402,26 @@  discard block
 block discarded – undo
1402 1402
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1403 1403
  **/
1404 1404
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1405
-	if ($param[0]->type != 'texte') {
1406
-		$a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1407
-		if (isset($param[1]->texte)) {
1408
-			preg_match(',^\s*(-([0-9]+))?\s*$,', $param[1]->texte, $m);
1409
-
1410
-			return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)];
1411
-		} else {
1412
-			return ["intval($a1)", 0];
1413
-		}
1414
-	} else {
1415
-		preg_match(',^\s*(([0-9]+)|n)\s*(-\s*([0-9]+)?\s*)?$,', $param[0]->texte, $m);
1416
-		$a1 = $m[1];
1417
-		if (empty($m[3])) {
1418
-			return [$a1, 0];
1419
-		} elseif (!empty($m[4])) {
1420
-			return [$a1, $m[4]];
1421
-		} else {
1422
-			return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1423
-		}
1424
-	}
1405
+    if ($param[0]->type != 'texte') {
1406
+        $a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1407
+        if (isset($param[1]->texte)) {
1408
+            preg_match(',^\s*(-([0-9]+))?\s*$,', $param[1]->texte, $m);
1409
+
1410
+            return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)];
1411
+        } else {
1412
+            return ["intval($a1)", 0];
1413
+        }
1414
+    } else {
1415
+        preg_match(',^\s*(([0-9]+)|n)\s*(-\s*([0-9]+)?\s*)?$,', $param[0]->texte, $m);
1416
+        $a1 = $m[1];
1417
+        if (empty($m[3])) {
1418
+            return [$a1, 0];
1419
+        } elseif (!empty($m[4])) {
1420
+            return [$a1, $m[4]];
1421
+        } else {
1422
+            return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1423
+        }
1424
+    }
1425 1425
 }
1426 1426
 
1427 1427
 
@@ -1448,47 +1448,47 @@  discard block
 block discarded – undo
1448 1448
  *     array : Erreur sur un des critères
1449 1449
  **/
1450 1450
 function calculer_criteres($idb, &$boucles) {
1451
-	$msg = '';
1452
-	$boucle = $boucles[$idb];
1453
-	$table = strtoupper($boucle->type_requete);
1454
-	$serveur = strtolower($boucle->sql_serveur);
1455
-
1456
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1457
-	// s'il y avait une erreur de syntaxe, propager cette info
1458
-	if (!is_array($boucle->criteres)) {
1459
-		return [];
1460
-	}
1461
-
1462
-	foreach ($boucle->criteres as $crit) {
1463
-		$critere = $crit->op;
1464
-		// critere personnalise ?
1465
-		if (
1466
-			(!$serveur or
1467
-				((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere))
1468
-					and (!function_exists($f = $f . '_dist'))
1469
-					and (!function_exists($f = 'critere_' . $serveur . '_' . $critere))
1470
-					and (!function_exists($f = $f . '_dist'))
1471
-				)
1472
-			)
1473
-			and (!function_exists($f = 'critere_' . $table . '_' . $critere))
1474
-			and (!function_exists($f = $f . '_dist'))
1475
-			and (!function_exists($f = 'critere_' . $critere))
1476
-			and (!function_exists($f = $f . '_dist'))
1477
-		) {
1478
-			// fonction critere standard
1479
-			$f = $defaut;
1480
-		}
1481
-		// compile le critere
1482
-		$res = $f($idb, $boucles, $crit);
1483
-
1484
-		// Gestion centralisee des erreurs pour pouvoir propager
1485
-		if (is_array($res)) {
1486
-			$msg = $res;
1487
-			erreur_squelette($msg, $boucle);
1488
-		}
1489
-	}
1490
-
1491
-	return $msg;
1451
+    $msg = '';
1452
+    $boucle = $boucles[$idb];
1453
+    $table = strtoupper($boucle->type_requete);
1454
+    $serveur = strtolower($boucle->sql_serveur);
1455
+
1456
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1457
+    // s'il y avait une erreur de syntaxe, propager cette info
1458
+    if (!is_array($boucle->criteres)) {
1459
+        return [];
1460
+    }
1461
+
1462
+    foreach ($boucle->criteres as $crit) {
1463
+        $critere = $crit->op;
1464
+        // critere personnalise ?
1465
+        if (
1466
+            (!$serveur or
1467
+                ((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere))
1468
+                    and (!function_exists($f = $f . '_dist'))
1469
+                    and (!function_exists($f = 'critere_' . $serveur . '_' . $critere))
1470
+                    and (!function_exists($f = $f . '_dist'))
1471
+                )
1472
+            )
1473
+            and (!function_exists($f = 'critere_' . $table . '_' . $critere))
1474
+            and (!function_exists($f = $f . '_dist'))
1475
+            and (!function_exists($f = 'critere_' . $critere))
1476
+            and (!function_exists($f = $f . '_dist'))
1477
+        ) {
1478
+            // fonction critere standard
1479
+            $f = $defaut;
1480
+        }
1481
+        // compile le critere
1482
+        $res = $f($idb, $boucles, $crit);
1483
+
1484
+        // Gestion centralisee des erreurs pour pouvoir propager
1485
+        if (is_array($res)) {
1486
+            $msg = $res;
1487
+            erreur_squelette($msg, $boucle);
1488
+        }
1489
+    }
1490
+
1491
+    return $msg;
1492 1492
 }
1493 1493
 
1494 1494
 /**
@@ -1503,11 +1503,11 @@  discard block
 block discarded – undo
1503 1503
  * @return string         Code compilé rééchappé
1504 1504
  */
1505 1505
 function kwote($lisp, $serveur = '', $type = '') {
1506
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1507
-		return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1508
-	} else {
1509
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1510
-	}
1506
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1507
+        return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1508
+    } else {
1509
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1510
+    }
1511 1511
 }
1512 1512
 
1513 1513
 
@@ -1526,81 +1526,81 @@  discard block
 block discarded – undo
1526 1526
  * @return void|array
1527 1527
  **/
1528 1528
 function critere_IN_dist($idb, &$boucles, $crit) {
1529
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1530
-	if (!$r) {
1531
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1532
-	}
1533
-	[$arg, $op, $val, $col, $where_complement] = $r;
1534
-
1535
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1536
-
1537
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1538
-	$where = $in;
1539
-	if ($crit->cond) {
1540
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1541
-		$where = ["'?'", $pred, $where, "''"];
1542
-		if ($where_complement) { // condition annexe du type "AND (objet='article')"
1543
-		$where_complement = ["'?'", $pred, $where_complement, "''"];
1544
-		}
1545
-	}
1546
-	if ($crit->exclus) {
1547
-		if (!preg_match(',^L[0-9]+[.],', $arg)) {
1548
-			$where = ["'NOT'", $where];
1549
-		} else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1550
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1551
-		{
1552
-			$where = [
1553
-				"'NOT'",
1554
-				[
1555
-					"'IN'",
1556
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1557
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1558
-				]
1559
-			];
1560
-		}
1561
-	}
1562
-
1563
-	$boucles[$idb]->where[] = $where;
1564
-	if ($where_complement) { // condition annexe du type "AND (objet='article')"
1565
-	$boucles[$idb]->where[] = $where_complement;
1566
-	}
1529
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1530
+    if (!$r) {
1531
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1532
+    }
1533
+    [$arg, $op, $val, $col, $where_complement] = $r;
1534
+
1535
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1536
+
1537
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1538
+    $where = $in;
1539
+    if ($crit->cond) {
1540
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1541
+        $where = ["'?'", $pred, $where, "''"];
1542
+        if ($where_complement) { // condition annexe du type "AND (objet='article')"
1543
+        $where_complement = ["'?'", $pred, $where_complement, "''"];
1544
+        }
1545
+    }
1546
+    if ($crit->exclus) {
1547
+        if (!preg_match(',^L[0-9]+[.],', $arg)) {
1548
+            $where = ["'NOT'", $where];
1549
+        } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1550
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1551
+        {
1552
+            $where = [
1553
+                "'NOT'",
1554
+                [
1555
+                    "'IN'",
1556
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1557
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1558
+                ]
1559
+            ];
1560
+        }
1561
+    }
1562
+
1563
+    $boucles[$idb]->where[] = $where;
1564
+    if ($where_complement) { // condition annexe du type "AND (objet='article')"
1565
+    $boucles[$idb]->where[] = $where_complement;
1566
+    }
1567 1567
 }
1568 1568
 
1569 1569
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1570
-	static $num = [];
1571
-	$descr = $boucles[$idb]->descr;
1572
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1573
-
1574
-	$var = '$in' . $cpt++;
1575
-	$x = "\n\t$var = array();";
1576
-	foreach ($val as $k => $v) {
1577
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1578
-			// optimiser le traitement des constantes
1579
-			if (is_numeric($r[2])) {
1580
-				$x .= "\n\t$var" . "[]= $r[2];";
1581
-			} else {
1582
-				$x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1583
-			}
1584
-		} else {
1585
-			// Pour permettre de passer des tableaux de valeurs
1586
-			// on repere l'utilisation brute de #ENV**{X},
1587
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1588
-			// et on deballe mais en rajoutant l'anti XSS
1589
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1590
-		}
1591
-	}
1592
-
1593
-	$boucles[$idb]->in .= $x;
1594
-
1595
-	// inserer le tri par defaut selon les ordres du IN ...
1596
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1597
-	// et que l'on limite donc strictement aux cas necessaires :
1598
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1599
-	if (!$crit2) {
1600
-		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1601
-	}
1602
-
1603
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1570
+    static $num = [];
1571
+    $descr = $boucles[$idb]->descr;
1572
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1573
+
1574
+    $var = '$in' . $cpt++;
1575
+    $x = "\n\t$var = array();";
1576
+    foreach ($val as $k => $v) {
1577
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1578
+            // optimiser le traitement des constantes
1579
+            if (is_numeric($r[2])) {
1580
+                $x .= "\n\t$var" . "[]= $r[2];";
1581
+            } else {
1582
+                $x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1583
+            }
1584
+        } else {
1585
+            // Pour permettre de passer des tableaux de valeurs
1586
+            // on repere l'utilisation brute de #ENV**{X},
1587
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1588
+            // et on deballe mais en rajoutant l'anti XSS
1589
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1590
+        }
1591
+    }
1592
+
1593
+    $boucles[$idb]->in .= $x;
1594
+
1595
+    // inserer le tri par defaut selon les ordres du IN ...
1596
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1597
+    // et que l'on limite donc strictement aux cas necessaires :
1598
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1599
+    if (!$crit2) {
1600
+        $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1601
+    }
1602
+
1603
+    return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1604 1604
 }
1605 1605
 
1606 1606
 /**
@@ -1616,22 +1616,22 @@  discard block
 block discarded – undo
1616 1616
  * @return void
1617 1617
  */
1618 1618
 function critere_where_dist($idb, &$boucles, $crit) {
1619
-	$boucle = &$boucles[$idb];
1620
-	if (isset($crit->param[0])) {
1621
-		$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1622
-	} else {
1623
-		$_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1624
-	}
1625
-
1626
-	if ($crit->cond) {
1627
-		$_where = "((\$zzw = $_where) ? \$zzw : '')";
1628
-	}
1629
-
1630
-	if ($crit->not) {
1631
-		$_where = "array('NOT',$_where)";
1632
-	}
1633
-
1634
-	$boucle->where[] = $_where;
1619
+    $boucle = &$boucles[$idb];
1620
+    if (isset($crit->param[0])) {
1621
+        $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1622
+    } else {
1623
+        $_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1624
+    }
1625
+
1626
+    if ($crit->cond) {
1627
+        $_where = "((\$zzw = $_where) ? \$zzw : '')";
1628
+    }
1629
+
1630
+    if ($crit->not) {
1631
+        $_where = "array('NOT',$_where)";
1632
+    }
1633
+
1634
+    $boucle->where[] = $_where;
1635 1635
 }
1636 1636
 
1637 1637
 /**
@@ -1659,31 +1659,31 @@  discard block
 block discarded – undo
1659 1659
  * @return void
1660 1660
  */
1661 1661
 function critere_id__dist($idb, &$boucles, $crit) {
1662
-	/** @var Boucle $boucle */
1663
-	$boucle = $boucles[$idb];
1664
-
1665
-	$champs = lister_champs_id_conditionnel(
1666
-		$boucle->show['table'],
1667
-		$boucle->show,
1668
-		$boucle->sql_serveur
1669
-	);
1670
-
1671
-	// ne pas tenir compte des critères identiques déjà présents.
1672
-	if (!empty($boucle->modificateur['criteres'])) {
1673
-		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1674
-	}
1675
-	// nous aider en mode debug.
1676
-	$boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1677
-	$boucle->modificateur['id_'] = $champs;
1678
-
1679
-	// créer un critère {id_xxx?} de chaque champ retenu
1680
-	foreach ($champs as $champ) {
1681
-		$critere_id_table = new Critere();
1682
-		$critere_id_table->op = $champ;
1683
-		$critere_id_table->cond = '?';
1684
-		$critere_id_table->ligne = $crit->ligne;
1685
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1686
-	}
1662
+    /** @var Boucle $boucle */
1663
+    $boucle = $boucles[$idb];
1664
+
1665
+    $champs = lister_champs_id_conditionnel(
1666
+        $boucle->show['table'],
1667
+        $boucle->show,
1668
+        $boucle->sql_serveur
1669
+    );
1670
+
1671
+    // ne pas tenir compte des critères identiques déjà présents.
1672
+    if (!empty($boucle->modificateur['criteres'])) {
1673
+        $champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1674
+    }
1675
+    // nous aider en mode debug.
1676
+    $boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1677
+    $boucle->modificateur['id_'] = $champs;
1678
+
1679
+    // créer un critère {id_xxx?} de chaque champ retenu
1680
+    foreach ($champs as $champ) {
1681
+        $critere_id_table = new Critere();
1682
+        $critere_id_table->op = $champ;
1683
+        $critere_id_table->cond = '?';
1684
+        $critere_id_table->ligne = $crit->ligne;
1685
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1686
+    }
1687 1687
 }
1688 1688
 
1689 1689
 /**
@@ -1703,75 +1703,75 @@  discard block
 block discarded – undo
1703 1703
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1704 1704
  */
1705 1705
 function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
1706
-	// calculer la description de la table
1707
-	if (!is_array($desc)) {
1708
-		$desc = description_table($table, $serveur);
1709
-	}
1710
-	if (!$desc) {
1711
-		return [];
1712
-	}
1713
-
1714
-	// Les champs id_xx de la table demandée
1715
-	$champs = array_filter(
1716
-		array_keys($desc['field']),
1717
-		fn($champ) => strpos($champ, 'id_') === 0 or (in_array($champ, ['objet']))
1718
-	);
1719
-
1720
-	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1721
-	if (
1722
-		in_array('id_rubrique', $champs)
1723
-		and !in_array('id_secteur', $champs)
1724
-	) {
1725
-		$champs[] = 'id_secteur';
1726
-	}
1727
-
1728
-	// On ne fera pas mieux pour les tables d’un autre serveur
1729
-	if ($serveur) {
1730
-		return $champs;
1731
-	}
1732
-
1733
-	$primary = false;
1734
-	$associable = false;
1735
-	include_spip('action/editer_liens');
1736
-
1737
-	if (isset($desc['type'])) {
1738
-		$primary = id_table_objet($desc['type']);
1739
-		$associable = objet_associable($desc['type']);
1740
-	}
1741
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1742
-		$associable = true;
1743
-	}
1744
-
1745
-	// liste de toutes les tables principales, sauf la notre
1746
-	$tables = lister_tables_objets_sql();
1747
-	unset($tables[$table]);
1748
-
1749
-	foreach ($tables as $_table => $_desc) {
1750
-		if (
1751
-			$associable
1752
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
1753
-			or objet_associable($_desc['type'])
1754
-		) {
1755
-			$champs[] = id_table_objet($_table);
1756
-		}
1757
-	}
1758
-	$champs = array_values(array_unique($champs));
1759
-
1760
-	// Exclusions de certains id
1761
-	$exclusions = pipeline(
1762
-		'exclure_id_conditionnel',
1763
-		[
1764
-			'args' => [
1765
-				'table' => $table,
1766
-				'id_table_objet' => $primary,
1767
-				'associable' => $associable,
1768
-			],
1769
-			'data' => [],
1770
-		]
1771
-	);
1772
-	$champs = array_diff($champs, $exclusions);
1773
-
1774
-	return $champs;
1706
+    // calculer la description de la table
1707
+    if (!is_array($desc)) {
1708
+        $desc = description_table($table, $serveur);
1709
+    }
1710
+    if (!$desc) {
1711
+        return [];
1712
+    }
1713
+
1714
+    // Les champs id_xx de la table demandée
1715
+    $champs = array_filter(
1716
+        array_keys($desc['field']),
1717
+        fn($champ) => strpos($champ, 'id_') === 0 or (in_array($champ, ['objet']))
1718
+    );
1719
+
1720
+    // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1721
+    if (
1722
+        in_array('id_rubrique', $champs)
1723
+        and !in_array('id_secteur', $champs)
1724
+    ) {
1725
+        $champs[] = 'id_secteur';
1726
+    }
1727
+
1728
+    // On ne fera pas mieux pour les tables d’un autre serveur
1729
+    if ($serveur) {
1730
+        return $champs;
1731
+    }
1732
+
1733
+    $primary = false;
1734
+    $associable = false;
1735
+    include_spip('action/editer_liens');
1736
+
1737
+    if (isset($desc['type'])) {
1738
+        $primary = id_table_objet($desc['type']);
1739
+        $associable = objet_associable($desc['type']);
1740
+    }
1741
+    if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1742
+        $associable = true;
1743
+    }
1744
+
1745
+    // liste de toutes les tables principales, sauf la notre
1746
+    $tables = lister_tables_objets_sql();
1747
+    unset($tables[$table]);
1748
+
1749
+    foreach ($tables as $_table => $_desc) {
1750
+        if (
1751
+            $associable
1752
+            or ($primary and in_array($primary, array_keys($_desc['field'])))
1753
+            or objet_associable($_desc['type'])
1754
+        ) {
1755
+            $champs[] = id_table_objet($_table);
1756
+        }
1757
+    }
1758
+    $champs = array_values(array_unique($champs));
1759
+
1760
+    // Exclusions de certains id
1761
+    $exclusions = pipeline(
1762
+        'exclure_id_conditionnel',
1763
+        [
1764
+            'args' => [
1765
+                'table' => $table,
1766
+                'id_table_objet' => $primary,
1767
+                'associable' => $associable,
1768
+            ],
1769
+            'data' => [],
1770
+        ]
1771
+    );
1772
+    $champs = array_diff($champs, $exclusions);
1773
+
1774
+    return $champs;
1775 1775
 }
1776 1776
 
1777 1777
 /**
@@ -1826,28 +1826,28 @@  discard block
 block discarded – undo
1826 1826
  * @return void
1827 1827
  */
1828 1828
 function critere_tri_dist($idb, &$boucles, $crit) {
1829
-	$boucle = &$boucles[$idb];
1830
-
1831
-	// definition du champ par defaut
1832
-	$_champ_defaut = !isset($crit->param[0][0]) ? "''"
1833
-		: calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
1834
-	$_liste_sens_defaut = !isset($crit->param[1][0]) ? '1'
1835
-		: calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
1836
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
1837
-		: calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent);
1838
-
1839
-	$_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1840
-
1841
-	$_sens_defaut = "(is_array(\$s=$_liste_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1842
-	$_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1843
-
1844
-	$boucle->modificateur['tri_champ'] = $_tri;
1845
-	$boucle->modificateur['tri_sens'] = $_sens;
1846
-	$boucle->modificateur['tri_liste_sens_defaut'] = $_liste_sens_defaut;
1847
-	$boucle->modificateur['tri_nom'] = $_variable;
1848
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1849
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1850
-	$boucle->hash .= "
1829
+    $boucle = &$boucles[$idb];
1830
+
1831
+    // definition du champ par defaut
1832
+    $_champ_defaut = !isset($crit->param[0][0]) ? "''"
1833
+        : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
1834
+    $_liste_sens_defaut = !isset($crit->param[1][0]) ? '1'
1835
+        : calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
1836
+    $_variable = !isset($crit->param[2][0]) ? "'$idb'"
1837
+        : calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent);
1838
+
1839
+    $_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1840
+
1841
+    $_sens_defaut = "(is_array(\$s=$_liste_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1842
+    $_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1843
+
1844
+    $boucle->modificateur['tri_champ'] = $_tri;
1845
+    $boucle->modificateur['tri_sens'] = $_sens;
1846
+    $boucle->modificateur['tri_liste_sens_defaut'] = $_liste_sens_defaut;
1847
+    $boucle->modificateur['tri_nom'] = $_variable;
1848
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1849
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1850
+    $boucle->hash .= "
1851 1851
 	\$senstri = '';
1852 1852
 	\$tri = $_tri;
1853 1853
 	if (\$tri){
@@ -1855,8 +1855,8 @@  discard block
 block discarded – undo
1855 1855
 		\$senstri = (\$senstri<0)?' DESC':'';
1856 1856
 	};
1857 1857
 	";
1858
-	$boucle->select[] = '".tri_champ_select($tri)."';
1859
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1858
+    $boucle->select[] = '".tri_champ_select($tri)."';
1859
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1860 1860
 }
1861 1861
 
1862 1862
 # criteres de comparaison
@@ -1873,21 +1873,21 @@  discard block
 block discarded – undo
1873 1873
  * @return void|array
1874 1874
  **/
1875 1875
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1876
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1877
-	if (($crit->op == ',') or ($crit->op == '/')) {
1878
-		calculer_critere_parties($idb, $boucles, $crit);
1879
-		return;
1880
-	}
1881
-
1882
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1883
-	if (!$r) {
1884
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1885
-		#	if (!$crit->cond) {
1886
-		return ['zbug_critere_inconnu', ['critere' => $crit->op]];
1887
-		#	}
1888
-	} else {
1889
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1890
-	}
1876
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1877
+    if (($crit->op == ',') or ($crit->op == '/')) {
1878
+        calculer_critere_parties($idb, $boucles, $crit);
1879
+        return;
1880
+    }
1881
+
1882
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1883
+    if (!$r) {
1884
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1885
+        #	if (!$crit->cond) {
1886
+        return ['zbug_critere_inconnu', ['critere' => $crit->op]];
1887
+        #	}
1888
+    } else {
1889
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1890
+    }
1891 1891
 }
1892 1892
 
1893 1893
 
@@ -1907,62 +1907,62 @@  discard block
 block discarded – undo
1907 1907
  * @return void
1908 1908
  **/
1909 1909
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1910
-	[$arg, $op, $val, $col, $where_complement] = $args;
1911
-
1912
-	$where = ["'$op'", "'$arg'", $val[0]];
1913
-
1914
-	// inserer la negation (cf !...)
1915
-
1916
-	if ($crit->not) {
1917
-		$where = ["'NOT'", $where];
1918
-	}
1919
-	if ($crit->exclus) {
1920
-		if (!preg_match(',^L[0-9]+[.],', $arg)) {
1921
-			$where = ["'NOT'", $where];
1922
-		} else {
1923
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1924
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1925
-			$where = [
1926
-				"'NOT'",
1927
-				[
1928
-					"'IN'",
1929
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1930
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1931
-				]
1932
-			];
1933
-		}
1934
-	}
1935
-
1936
-	// inserer la condition (cf {lang?})
1937
-	// traiter a part la date, elle est mise d'office par SPIP,
1938
-	if ($crit->cond) {
1939
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1940
-		if ($col === 'date' or $col === 'date_redac') {
1941
-			if ($pred === "\$Pile[0]['" . $col . "']") {
1942
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1943
-			}
1944
-		}
1945
-
1946
-		if ($op === '=' and !$crit->not) {
1947
-			$where = [
1948
-				"'?'",
1949
-				"(is_array($pred))",
1950
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
1951
-				$where
1952
-			];
1953
-		}
1954
-		$where = ["'?'", "!is_whereable($pred)", "''", $where];
1955
-		if ($where_complement) {
1956
-			// condition annexe du type "AND (objet='article')"
1957
-			$where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement];
1958
-		}
1959
-	}
1960
-
1961
-	$boucles[$idb]->where[] = $where;
1962
-	if ($where_complement) {
1963
-		// condition annexe du type "AND (objet='article')"
1964
-		$boucles[$idb]->where[] = $where_complement;
1965
-	}
1910
+    [$arg, $op, $val, $col, $where_complement] = $args;
1911
+
1912
+    $where = ["'$op'", "'$arg'", $val[0]];
1913
+
1914
+    // inserer la negation (cf !...)
1915
+
1916
+    if ($crit->not) {
1917
+        $where = ["'NOT'", $where];
1918
+    }
1919
+    if ($crit->exclus) {
1920
+        if (!preg_match(',^L[0-9]+[.],', $arg)) {
1921
+            $where = ["'NOT'", $where];
1922
+        } else {
1923
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1924
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1925
+            $where = [
1926
+                "'NOT'",
1927
+                [
1928
+                    "'IN'",
1929
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1930
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1931
+                ]
1932
+            ];
1933
+        }
1934
+    }
1935
+
1936
+    // inserer la condition (cf {lang?})
1937
+    // traiter a part la date, elle est mise d'office par SPIP,
1938
+    if ($crit->cond) {
1939
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1940
+        if ($col === 'date' or $col === 'date_redac') {
1941
+            if ($pred === "\$Pile[0]['" . $col . "']") {
1942
+                $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1943
+            }
1944
+        }
1945
+
1946
+        if ($op === '=' and !$crit->not) {
1947
+            $where = [
1948
+                "'?'",
1949
+                "(is_array($pred))",
1950
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
1951
+                $where
1952
+            ];
1953
+        }
1954
+        $where = ["'?'", "!is_whereable($pred)", "''", $where];
1955
+        if ($where_complement) {
1956
+            // condition annexe du type "AND (objet='article')"
1957
+            $where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement];
1958
+        }
1959
+    }
1960
+
1961
+    $boucles[$idb]->where[] = $where;
1962
+    if ($where_complement) {
1963
+        // condition annexe du type "AND (objet='article')"
1964
+        $boucles[$idb]->where[] = $where_complement;
1965
+    }
1966 1966
 }
1967 1967
 
1968 1968
 
@@ -2003,165 +2003,165 @@  discard block
 block discarded – undo
2003 2003
  **/
2004 2004
 function calculer_critere_infixe($idb, &$boucles, $crit) {
2005 2005
 
2006
-	$boucle = &$boucles[$idb];
2007
-	$type = $boucle->type_requete;
2008
-	$table = $boucle->id_table;
2009
-	$desc = $boucle->show;
2010
-	$col_vraie = null;
2011
-
2012
-	[$fct, $col, $op, $val, $args_sql] =
2013
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
2014
-
2015
-	$col_alias = $col;
2016
-	$where_complement = false;
2017
-
2018
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
2019
-	if ($col == 'id_enfant') {
2020
-		$col = $boucle->primary;
2021
-	}
2022
-
2023
-	// Cas particulier : id_parent => verifier les exceptions de tables
2024
-	if (
2025
-		(in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2026
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2027
-	) {
2028
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
2029
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2030
-	else {
2031
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2032
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
2033
-		}
2034
-
2035
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2036
-		// sauf si exception declaree : sauter cette etape
2037
-		else {
2038
-			if (
2039
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2040
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
2041
-				and count(trouver_champs_decomposes($col, $desc)) > 1
2042
-			) {
2043
-				$e = decompose_champ_id_objet($col);
2044
-				$col = array_shift($e);
2045
-				$where_complement = primary_doublee($e, $table);
2046
-			} // Cas particulier : expressions de date
2047
-			else {
2048
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2049
-					[$col, $col_vraie] = $c;
2050
-					$table = '';
2051
-				} // table explicitée {mots.titre}
2052
-				else {
2053
-					if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2054
-						[, $table, $col] = $r;
2055
-						$col_alias = $col;
2056
-
2057
-						$trouver_table = charger_fonction('trouver_table', 'base');
2058
-						if (
2059
-							$desc = $trouver_table($table, $boucle->sql_serveur)
2060
-							and isset($desc['field'][$col])
2061
-							and $cle = array_search($desc['table'], $boucle->from)
2062
-						) {
2063
-							$table = $cle;
2064
-						} else {
2065
-							$table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '='));
2066
-						}
2067
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2068
-						if (!$table) {
2069
-							return '';
2070
-						}
2071
-					}
2072
-					// si le champ n'est pas trouvé dans la table,
2073
-					// on cherche si une jointure peut l'obtenir
2074
-					elseif (@!array_key_exists($col, $desc['field'])) {
2075
-						// Champ joker * des iterateurs DATA qui accepte tout
2076
-						if (@array_key_exists('*', $desc['field'])) {
2077
-							$desc['field'][$col_vraie ?: $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2078
-						}
2079
-						else {
2080
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2081
-							if (!$r) {
2082
-								return '';
2083
-							}
2084
-							[$col, $col_alias, $table, $where_complement, $desc] = $r;
2085
-						}
2086
-					}
2087
-				}
2088
-			}
2089
-		}
2090
-	}
2091
-
2092
-	$col_vraie = ($col_vraie ?: $col);
2093
-	// Dans tous les cas,
2094
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2095
-	// et passer dans sql_quote avec le type si connu
2096
-	// et int sinon si la valeur est numerique
2097
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2098
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2099
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2100
-		$type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
2101
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2102
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2103
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2104
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2105
-		}
2106
-		// sinon expliciter les
2107
-		// sql_quote(truc) en sql_quote(truc,'',type)
2108
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2109
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2110
-		// sans toucher aux
2111
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2112
-		// sql_quote(truc,'','varchar')
2113
-		elseif (
2114
-			preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2115
-			// si pas deja un type
2116
-			and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2117
-		) {
2118
-			$r = $r[1]
2119
-				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2120
-				. ",'" . addslashes($type_cast_quote) . "'";
2121
-			$val[0] = "sql_quote($r)";
2122
-		}
2123
-		elseif (
2124
-			strpos($val[0], '@@defaultcast@@') !== false
2125
-			and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2126
-		) {
2127
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2128
-		}
2129
-	}
2130
-
2131
-	if (
2132
-		strpos($val[0], '@@defaultcast@@') !== false
2133
-		and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2134
-	) {
2135
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2136
-	}
2137
-
2138
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2139
-	// leurs requetes par defaut, notamment le champ statut
2140
-	// Ne pas confondre champs de la table principale et des jointures
2141
-	if ($table === $boucle->id_table) {
2142
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2143
-		if ($col_alias != $col_vraie) {
2144
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2145
-		}
2146
-	}
2147
-
2148
-	// inserer le nom de la table SQL devant le nom du champ
2149
-	if ($table) {
2150
-		if ($col[0] == '`') {
2151
-			$arg = "$table." . substr($col, 1, -1);
2152
-		} else {
2153
-			$arg = "$table.$col";
2154
-		}
2155
-	} else {
2156
-		$arg = $col;
2157
-	}
2158
-
2159
-	// inserer la fonction SQL
2160
-	if ($fct) {
2161
-		$arg = "$fct($arg$args_sql)";
2162
-	}
2163
-
2164
-	return [$arg, $op, $val, $col_alias, $where_complement];
2006
+    $boucle = &$boucles[$idb];
2007
+    $type = $boucle->type_requete;
2008
+    $table = $boucle->id_table;
2009
+    $desc = $boucle->show;
2010
+    $col_vraie = null;
2011
+
2012
+    [$fct, $col, $op, $val, $args_sql] =
2013
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
2014
+
2015
+    $col_alias = $col;
2016
+    $where_complement = false;
2017
+
2018
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
2019
+    if ($col == 'id_enfant') {
2020
+        $col = $boucle->primary;
2021
+    }
2022
+
2023
+    // Cas particulier : id_parent => verifier les exceptions de tables
2024
+    if (
2025
+        (in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2026
+        or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2027
+    ) {
2028
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
2029
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2030
+    else {
2031
+        if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2032
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
2033
+        }
2034
+
2035
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2036
+        // sauf si exception declaree : sauter cette etape
2037
+        else {
2038
+            if (
2039
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2040
+                and !isset($GLOBALS['exceptions_des_jointures'][$col])
2041
+                and count(trouver_champs_decomposes($col, $desc)) > 1
2042
+            ) {
2043
+                $e = decompose_champ_id_objet($col);
2044
+                $col = array_shift($e);
2045
+                $where_complement = primary_doublee($e, $table);
2046
+            } // Cas particulier : expressions de date
2047
+            else {
2048
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2049
+                    [$col, $col_vraie] = $c;
2050
+                    $table = '';
2051
+                } // table explicitée {mots.titre}
2052
+                else {
2053
+                    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2054
+                        [, $table, $col] = $r;
2055
+                        $col_alias = $col;
2056
+
2057
+                        $trouver_table = charger_fonction('trouver_table', 'base');
2058
+                        if (
2059
+                            $desc = $trouver_table($table, $boucle->sql_serveur)
2060
+                            and isset($desc['field'][$col])
2061
+                            and $cle = array_search($desc['table'], $boucle->from)
2062
+                        ) {
2063
+                            $table = $cle;
2064
+                        } else {
2065
+                            $table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '='));
2066
+                        }
2067
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2068
+                        if (!$table) {
2069
+                            return '';
2070
+                        }
2071
+                    }
2072
+                    // si le champ n'est pas trouvé dans la table,
2073
+                    // on cherche si une jointure peut l'obtenir
2074
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2075
+                        // Champ joker * des iterateurs DATA qui accepte tout
2076
+                        if (@array_key_exists('*', $desc['field'])) {
2077
+                            $desc['field'][$col_vraie ?: $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2078
+                        }
2079
+                        else {
2080
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2081
+                            if (!$r) {
2082
+                                return '';
2083
+                            }
2084
+                            [$col, $col_alias, $table, $where_complement, $desc] = $r;
2085
+                        }
2086
+                    }
2087
+                }
2088
+            }
2089
+        }
2090
+    }
2091
+
2092
+    $col_vraie = ($col_vraie ?: $col);
2093
+    // Dans tous les cas,
2094
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2095
+    // et passer dans sql_quote avec le type si connu
2096
+    // et int sinon si la valeur est numerique
2097
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2098
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2099
+    if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2100
+        $type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
2101
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2102
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2103
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2104
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2105
+        }
2106
+        // sinon expliciter les
2107
+        // sql_quote(truc) en sql_quote(truc,'',type)
2108
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2109
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2110
+        // sans toucher aux
2111
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2112
+        // sql_quote(truc,'','varchar')
2113
+        elseif (
2114
+            preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2115
+            // si pas deja un type
2116
+            and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2117
+        ) {
2118
+            $r = $r[1]
2119
+                . ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2120
+                . ",'" . addslashes($type_cast_quote) . "'";
2121
+            $val[0] = "sql_quote($r)";
2122
+        }
2123
+        elseif (
2124
+            strpos($val[0], '@@defaultcast@@') !== false
2125
+            and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2126
+        ) {
2127
+            $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2128
+        }
2129
+    }
2130
+
2131
+    if (
2132
+        strpos($val[0], '@@defaultcast@@') !== false
2133
+        and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2134
+    ) {
2135
+        $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2136
+    }
2137
+
2138
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2139
+    // leurs requetes par defaut, notamment le champ statut
2140
+    // Ne pas confondre champs de la table principale et des jointures
2141
+    if ($table === $boucle->id_table) {
2142
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2143
+        if ($col_alias != $col_vraie) {
2144
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2145
+        }
2146
+    }
2147
+
2148
+    // inserer le nom de la table SQL devant le nom du champ
2149
+    if ($table) {
2150
+        if ($col[0] == '`') {
2151
+            $arg = "$table." . substr($col, 1, -1);
2152
+        } else {
2153
+            $arg = "$table.$col";
2154
+        }
2155
+    } else {
2156
+        $arg = $col;
2157
+    }
2158
+
2159
+    // inserer la fonction SQL
2160
+    if ($fct) {
2161
+        $arg = "$fct($arg$args_sql)";
2162
+    }
2163
+
2164
+    return [$arg, $op, $val, $col_alias, $where_complement];
2165 2165
 }
2166 2166
 
2167 2167
 
@@ -2190,77 +2190,77 @@  discard block
 block discarded – undo
2190 2190
  **/
2191 2191
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2192 2192
 
2193
-	$where = '';
2194
-
2195
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2196
-	// gestion par les plugins des jointures tordues
2197
-	// pas automatiques mais necessaires
2198
-	$table_sql = table_objet_sql($table);
2199
-	if (
2200
-		isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2201
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2202
-		and
2203
-		(
2204
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2205
-			or
2206
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2207
-		)
2208
-	) {
2209
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2210
-		$index = $t[$col] ?? $t[''] ?? [];
2211
-
2212
-		if ((is_countable($index) ? count($index) : 0) == 3) {
2213
-			[$t, $col, $calculer_critere_externe] = $index;
2214
-		} elseif ((is_countable($index) ? count($index) : 0) == 2) {
2215
-			[$t, $col] = $t[$col];
2216
-		} elseif ((is_countable($index) ? count($index) : 0) == 1) {
2217
-			[$calculer_critere_externe] = $index;
2218
-			$t = $table;
2219
-		} else {
2220
-			$t = '';
2221
-		} // jointure non declaree. La trouver.
2222
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2223
-		[$t, $col] = $GLOBALS['exceptions_des_jointures'][$col];
2224
-	} else {
2225
-		$t = '';
2226
-	} // jointure non declaree. La trouver.
2227
-
2228
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2229
-
2230
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2231
-	// permet de forcer une table de lien quand il y a ambiguite
2232
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2233
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2234
-	$table = '';
2235
-	if ($boucle->jointures_explicites) {
2236
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2237
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2238
-	}
2239
-
2240
-	// et sinon on cherche parmi toutes les jointures declarees
2241
-	if (!$table) {
2242
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2243
-	}
2244
-
2245
-	if (!$table) {
2246
-		return '';
2247
-	}
2248
-
2249
-	// il ne reste plus qu'a trouver le champ dans les from
2250
-	[$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
2251
-
2252
-	if ((is_countable($cle) ? count($cle) : 0) > 1 or reset($cle) !== $col) {
2253
-		$col_alias = $col; // id_article devient juste le nom d'origine
2254
-		if ((is_countable($cle) ? count($cle) : 0) > 1 and reset($cle) == 'id_objet') {
2255
-			$e = decompose_champ_id_objet($col);
2256
-			$col = array_shift($e);
2257
-			$where = primary_doublee($e, $table);
2258
-		} else {
2259
-			$col = reset($cle);
2260
-		}
2261
-	}
2262
-
2263
-	return [$col, $col_alias, $table, $where, $desc];
2193
+    $where = '';
2194
+
2195
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2196
+    // gestion par les plugins des jointures tordues
2197
+    // pas automatiques mais necessaires
2198
+    $table_sql = table_objet_sql($table);
2199
+    if (
2200
+        isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2201
+        and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2202
+        and
2203
+        (
2204
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2205
+            or
2206
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2207
+        )
2208
+    ) {
2209
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2210
+        $index = $t[$col] ?? $t[''] ?? [];
2211
+
2212
+        if ((is_countable($index) ? count($index) : 0) == 3) {
2213
+            [$t, $col, $calculer_critere_externe] = $index;
2214
+        } elseif ((is_countable($index) ? count($index) : 0) == 2) {
2215
+            [$t, $col] = $t[$col];
2216
+        } elseif ((is_countable($index) ? count($index) : 0) == 1) {
2217
+            [$calculer_critere_externe] = $index;
2218
+            $t = $table;
2219
+        } else {
2220
+            $t = '';
2221
+        } // jointure non declaree. La trouver.
2222
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2223
+        [$t, $col] = $GLOBALS['exceptions_des_jointures'][$col];
2224
+    } else {
2225
+        $t = '';
2226
+    } // jointure non declaree. La trouver.
2227
+
2228
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2229
+
2230
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2231
+    // permet de forcer une table de lien quand il y a ambiguite
2232
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2233
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2234
+    $table = '';
2235
+    if ($boucle->jointures_explicites) {
2236
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2237
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2238
+    }
2239
+
2240
+    // et sinon on cherche parmi toutes les jointures declarees
2241
+    if (!$table) {
2242
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2243
+    }
2244
+
2245
+    if (!$table) {
2246
+        return '';
2247
+    }
2248
+
2249
+    // il ne reste plus qu'a trouver le champ dans les from
2250
+    [$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
2251
+
2252
+    if ((is_countable($cle) ? count($cle) : 0) > 1 or reset($cle) !== $col) {
2253
+        $col_alias = $col; // id_article devient juste le nom d'origine
2254
+        if ((is_countable($cle) ? count($cle) : 0) > 1 and reset($cle) == 'id_objet') {
2255
+            $e = decompose_champ_id_objet($col);
2256
+            $col = array_shift($e);
2257
+            $where = primary_doublee($e, $table);
2258
+        } else {
2259
+            $col = reset($cle);
2260
+        }
2261
+    }
2262
+
2263
+    return [$col, $col_alias, $table, $where, $desc];
2264 2264
 }
2265 2265
 
2266 2266
 
@@ -2281,10 +2281,10 @@  discard block
 block discarded – undo
2281 2281
  *     - valeur
2282 2282
  **/
2283 2283
 function primary_doublee($decompose, $table) {
2284
-	$e1 = reset($decompose);
2285
-	$e2 = "sql_quote('" . end($decompose) . "')";
2284
+    $e1 = reset($decompose);
2285
+    $e2 = "sql_quote('" . end($decompose) . "')";
2286 2286
 
2287
-	return ["'='", "'$table." . $e1 . "'", $e2];
2287
+    return ["'='", "'$table." . $e1 . "'", $e2];
2288 2288
 }
2289 2289
 
2290 2290
 /**
@@ -2315,57 +2315,57 @@  discard block
 block discarded – undo
2315 2315
  *     Vide sinon.
2316 2316
  */
2317 2317
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2318
-	// si on demande un truc du genre spip_mots
2319
-	// avec aussi spip_mots_liens dans les jointures dispo
2320
-	// et qu'on est la
2321
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2322
-	if (
2323
-		$checkarrivee
2324
-		and is_string($checkarrivee)
2325
-		and $a = table_objet($checkarrivee)
2326
-		and in_array($a . '_liens', $joints)
2327
-	) {
2328
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2329
-			return $res;
2330
-		}
2331
-	}
2332
-	foreach ($joints as $joint) {
2333
-		if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2334
-			// alias de table dans le from
2335
-			$t = array_search($arrivee[0], $boucle->from);
2336
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2337
-			$cols = $arrivee[2];
2338
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2339
-			if ((is_countable($cols) ? count($cols) : 0) > 2) {
2340
-				array_pop($cols);
2341
-			}
2342
-			if ($t) {
2343
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2344
-				$joindre = false;
2345
-				foreach ($cols as $col) {
2346
-					$c = '/\b' . $t . ".$col" . '\b/';
2347
-					if (trouver_champ($c, $boucle->where)) {
2348
-						$joindre = true;
2349
-					} else {
2350
-						// mais ca peut etre dans le FIELD pour le Having
2351
-						$c = "/FIELD.$t" . ".$col,/";
2352
-						if (trouver_champ($c, $boucle->select)) {
2353
-							$joindre = true;
2354
-						}
2355
-					}
2356
-				}
2357
-				if (!$joindre) {
2358
-					return $t;
2359
-				}
2360
-			}
2361
-			array_pop($arrivee);
2362
-			if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2363
-				return $res;
2364
-			}
2365
-		}
2366
-	}
2367
-
2368
-	return '';
2318
+    // si on demande un truc du genre spip_mots
2319
+    // avec aussi spip_mots_liens dans les jointures dispo
2320
+    // et qu'on est la
2321
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2322
+    if (
2323
+        $checkarrivee
2324
+        and is_string($checkarrivee)
2325
+        and $a = table_objet($checkarrivee)
2326
+        and in_array($a . '_liens', $joints)
2327
+    ) {
2328
+        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2329
+            return $res;
2330
+        }
2331
+    }
2332
+    foreach ($joints as $joint) {
2333
+        if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2334
+            // alias de table dans le from
2335
+            $t = array_search($arrivee[0], $boucle->from);
2336
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2337
+            $cols = $arrivee[2];
2338
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2339
+            if ((is_countable($cols) ? count($cols) : 0) > 2) {
2340
+                array_pop($cols);
2341
+            }
2342
+            if ($t) {
2343
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2344
+                $joindre = false;
2345
+                foreach ($cols as $col) {
2346
+                    $c = '/\b' . $t . ".$col" . '\b/';
2347
+                    if (trouver_champ($c, $boucle->where)) {
2348
+                        $joindre = true;
2349
+                    } else {
2350
+                        // mais ca peut etre dans le FIELD pour le Having
2351
+                        $c = "/FIELD.$t" . ".$col,/";
2352
+                        if (trouver_champ($c, $boucle->select)) {
2353
+                            $joindre = true;
2354
+                        }
2355
+                    }
2356
+                }
2357
+                if (!$joindre) {
2358
+                    return $t;
2359
+                }
2360
+            }
2361
+            array_pop($arrivee);
2362
+            if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2363
+                return $res;
2364
+            }
2365
+        }
2366
+    }
2367
+
2368
+    return '';
2369 2369
 }
2370 2370
 
2371 2371
 /**
@@ -2391,35 +2391,35 @@  discard block
 block discarded – undo
2391 2391
  *     Alias de la table de jointure (Lx)
2392 2392
  */
2393 2393
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2394
-	$primary_arrivee = id_table_objet($checkarrivee);
2395
-
2396
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2397
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2398
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2399
-
2400
-	if (!$intermediaire or !$arrivee) {
2401
-		return '';
2402
-	}
2403
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2404
-	array_pop($arrivee); // enlever la cle en 3eme argument
2405
-
2406
-	$res = fabrique_jointures(
2407
-		$boucle,
2408
-		[
2409
-			[
2410
-				$boucle->id_table,
2411
-				$intermediaire,
2412
-				[id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2413
-			],
2414
-			[reset($intermediaire), $arrivee, $primary_arrivee]
2415
-		],
2416
-		$cond,
2417
-		$desc,
2418
-		$boucle->id_table,
2419
-		[$col]
2420
-	);
2421
-
2422
-	return $res;
2394
+    $primary_arrivee = id_table_objet($checkarrivee);
2395
+
2396
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2397
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2398
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2399
+
2400
+    if (!$intermediaire or !$arrivee) {
2401
+        return '';
2402
+    }
2403
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2404
+    array_pop($arrivee); // enlever la cle en 3eme argument
2405
+
2406
+    $res = fabrique_jointures(
2407
+        $boucle,
2408
+        [
2409
+            [
2410
+                $boucle->id_table,
2411
+                $intermediaire,
2412
+                [id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2413
+            ],
2414
+            [reset($intermediaire), $arrivee, $primary_arrivee]
2415
+        ],
2416
+        $cond,
2417
+        $desc,
2418
+        $boucle->id_table,
2419
+        [$col]
2420
+    );
2421
+
2422
+    return $res;
2423 2423
 }
2424 2424
 
2425 2425
 
@@ -2436,17 +2436,17 @@  discard block
 block discarded – undo
2436 2436
  *     false sinon.
2437 2437
  **/
2438 2438
 function trouver_champ($champ, $where) {
2439
-	if (!is_array($where)) {
2440
-		return preg_match($champ, $where);
2441
-	} else {
2442
-		foreach ($where as $clause) {
2443
-			if (trouver_champ($champ, $clause)) {
2444
-				return true;
2445
-			}
2446
-		}
2447
-
2448
-		return false;
2449
-	}
2439
+    if (!is_array($where)) {
2440
+        return preg_match($champ, $where);
2441
+    } else {
2442
+        foreach ($where as $clause) {
2443
+            if (trouver_champ($champ, $clause)) {
2444
+                return true;
2445
+            }
2446
+        }
2447
+
2448
+        return false;
2449
+    }
2450 2450
 }
2451 2451
 
2452 2452
 
@@ -2472,129 +2472,129 @@  discard block
 block discarded – undo
2472 2472
  *     - string $args_sql  Suite des arguments du critère. ?
2473 2473
  **/
2474 2474
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2475
-	// cas d'une valeur comparee a elle-meme ou son referent
2476
-	if (count($crit->param) == 0) {
2477
-		$op = '=';
2478
-		$col = $val = $crit->op;
2479
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2480
-			$val = $r[2];
2481
-		}
2482
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2483
-		if ($val == 'lang') {
2484
-			$val = [kwote('$GLOBALS[\'spip_lang\']')];
2485
-		} else {
2486
-			$defaut = null;
2487
-			if ($val == 'id_parent') {
2488
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2489
-				// de la boucle superieure.... faudrait verifier qu'il existe
2490
-				// pour eviter l'erreur SQL
2491
-				$val = $boucles[$idb]->primary;
2492
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2493
-				$defaut = "(\$Pile[0]['id_parent'] ?? null)";
2494
-			} elseif ($val == 'id_enfant') {
2495
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2496
-				// de la boucle superieure
2497
-				$val = 'id_parent';
2498
-			} elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) {
2499
-				// un critere conditionnel sur date est traite a part
2500
-				// car la date est mise d'office par SPIP,
2501
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2502
-			}
2503
-
2504
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2505
-			$val = [kwote($val)];
2506
-		}
2507
-	} else {
2508
-		// comparaison explicite
2509
-		// le phraseur impose que le premier param soit du texte
2510
-		$params = $crit->param;
2511
-		$op = $crit->op;
2512
-		if ($op == '==') {
2513
-			$op = 'REGEXP';
2514
-		}
2515
-		$col = array_shift($params);
2516
-		$col = $col[0]->texte;
2517
-
2518
-		$val = [];
2519
-		$parent = $boucles[$idb]->id_parent;
2520
-
2521
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2522
-		// celui ne sachant pas ce qu'est un critere infixe
2523
-		// et a fortiori son 2e operande qu'entoure " ou '
2524
-		if (
2525
-			count($params) == 1
2526
-			and (is_countable($params[0]) ? count($params[0]) : 0) == 3
2527
-			and $params[0][0]->type == 'texte'
2528
-			and $params[0][2]->type == 'texte'
2529
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
2530
-			and (($p == "'") or ($p == '"'))
2531
-			and $params[0][1]->type == 'champ'
2532
-		) {
2533
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2534
-		} else {
2535
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2536
-				$a = calculer_liste($p, $idb, $boucles, $parent);
2537
-				if (strcasecmp($op, 'IN') == 0) {
2538
-					$val[] = $a;
2539
-				} else {
2540
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2541
-				} // toujours quoter en char ici
2542
-			}
2543
-		}
2544
-	}
2545
-
2546
-	$fct = $args_sql = '';
2547
-	// fonction SQL ?
2548
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2549
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2550
-		$fct = $m[1];
2551
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2552
-		$col = $a[1];
2553
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2554
-			$col = $m[1];
2555
-			$args_sql = $m[2];
2556
-		}
2557
-		$args_sql .= $a[2];
2558
-	}
2559
-
2560
-	return [$fct, $col, $op, $val, $args_sql];
2475
+    // cas d'une valeur comparee a elle-meme ou son referent
2476
+    if (count($crit->param) == 0) {
2477
+        $op = '=';
2478
+        $col = $val = $crit->op;
2479
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2480
+            $val = $r[2];
2481
+        }
2482
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2483
+        if ($val == 'lang') {
2484
+            $val = [kwote('$GLOBALS[\'spip_lang\']')];
2485
+        } else {
2486
+            $defaut = null;
2487
+            if ($val == 'id_parent') {
2488
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2489
+                // de la boucle superieure.... faudrait verifier qu'il existe
2490
+                // pour eviter l'erreur SQL
2491
+                $val = $boucles[$idb]->primary;
2492
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2493
+                $defaut = "(\$Pile[0]['id_parent'] ?? null)";
2494
+            } elseif ($val == 'id_enfant') {
2495
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2496
+                // de la boucle superieure
2497
+                $val = 'id_parent';
2498
+            } elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) {
2499
+                // un critere conditionnel sur date est traite a part
2500
+                // car la date est mise d'office par SPIP,
2501
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2502
+            }
2503
+
2504
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2505
+            $val = [kwote($val)];
2506
+        }
2507
+    } else {
2508
+        // comparaison explicite
2509
+        // le phraseur impose que le premier param soit du texte
2510
+        $params = $crit->param;
2511
+        $op = $crit->op;
2512
+        if ($op == '==') {
2513
+            $op = 'REGEXP';
2514
+        }
2515
+        $col = array_shift($params);
2516
+        $col = $col[0]->texte;
2517
+
2518
+        $val = [];
2519
+        $parent = $boucles[$idb]->id_parent;
2520
+
2521
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2522
+        // celui ne sachant pas ce qu'est un critere infixe
2523
+        // et a fortiori son 2e operande qu'entoure " ou '
2524
+        if (
2525
+            count($params) == 1
2526
+            and (is_countable($params[0]) ? count($params[0]) : 0) == 3
2527
+            and $params[0][0]->type == 'texte'
2528
+            and $params[0][2]->type == 'texte'
2529
+            and ($p = $params[0][0]->texte) == $params[0][2]->texte
2530
+            and (($p == "'") or ($p == '"'))
2531
+            and $params[0][1]->type == 'champ'
2532
+        ) {
2533
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2534
+        } else {
2535
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2536
+                $a = calculer_liste($p, $idb, $boucles, $parent);
2537
+                if (strcasecmp($op, 'IN') == 0) {
2538
+                    $val[] = $a;
2539
+                } else {
2540
+                    $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2541
+                } // toujours quoter en char ici
2542
+            }
2543
+        }
2544
+    }
2545
+
2546
+    $fct = $args_sql = '';
2547
+    // fonction SQL ?
2548
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2549
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2550
+        $fct = $m[1];
2551
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2552
+        $col = $a[1];
2553
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2554
+            $col = $m[1];
2555
+            $args_sql = $m[2];
2556
+        }
2557
+        $args_sql .= $a[2];
2558
+    }
2559
+
2560
+    return [$fct, $col, $op, $val, $args_sql];
2561 2561
 }
2562 2562
 
2563 2563
 // compatibilite ancienne version
2564 2564
 
2565 2565
 function calculer_vieux_in($params) {
2566
-	$deb = $params[0][0];
2567
-	$k = (is_countable($params) ? count($params) : 0) - 1;
2568
-	$last = $params[$k];
2569
-	$j = (is_countable($last) ? count($last) : 0) - 1;
2570
-	$last = $last[$j];
2571
-	$n = isset($last->texte) ? strlen($last->texte) : 0;
2572
-
2573
-	if (
2574
-		!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2575
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2576
-	) {
2577
-		return $params;
2578
-	}
2579
-	$params[0][0]->texte = substr($deb->texte, 1);
2580
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2581
-	$last = $params[$k][$j];
2582
-	$n = strlen($last->texte);
2583
-	$params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2584
-	$newp = [];
2585
-	foreach ($params as $v) {
2586
-		if ($v[0]->type != 'texte') {
2587
-			$newp[] = $v;
2588
-		} else {
2589
-			foreach (explode(',', $v[0]->texte) as $x) {
2590
-				$t = new Texte();
2591
-				$t->texte = $x;
2592
-				$newp[] = [$t];
2593
-			}
2594
-		}
2595
-	}
2596
-
2597
-	return $newp;
2566
+    $deb = $params[0][0];
2567
+    $k = (is_countable($params) ? count($params) : 0) - 1;
2568
+    $last = $params[$k];
2569
+    $j = (is_countable($last) ? count($last) : 0) - 1;
2570
+    $last = $last[$j];
2571
+    $n = isset($last->texte) ? strlen($last->texte) : 0;
2572
+
2573
+    if (
2574
+        !((isset($deb->texte[0]) and $deb->texte[0] == '(')
2575
+        && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2576
+    ) {
2577
+        return $params;
2578
+    }
2579
+    $params[0][0]->texte = substr($deb->texte, 1);
2580
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2581
+    $last = $params[$k][$j];
2582
+    $n = strlen($last->texte);
2583
+    $params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2584
+    $newp = [];
2585
+    foreach ($params as $v) {
2586
+        if ($v[0]->type != 'texte') {
2587
+            $newp[] = $v;
2588
+        } else {
2589
+            foreach (explode(',', $v[0]->texte) as $x) {
2590
+                $t = new Texte();
2591
+                $t->texte = $x;
2592
+                $newp[] = [$t];
2593
+            }
2594
+        }
2595
+    }
2596
+
2597
+    return $newp;
2598 2598
 }
2599 2599
 
2600 2600
 /**
@@ -2613,95 +2613,95 @@  discard block
 block discarded – undo
2613 2613
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2614 2614
  **/
2615 2615
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2616
-	if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2617
-		return '';
2618
-	}
2619
-
2620
-	$boucle = $boucles[$idb];
2621
-	$table = $boucle->show;
2622
-
2623
-	// si c'est une colonne de la table, ne rien faire
2624
-	if (isset($table['field'][$col])) {
2625
-		return '';
2626
-	}
2627
-
2628
-	// Le type de critère à prendre en compte
2629
-	$col = $regs[1];
2630
-
2631
-	// Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet
2632
-	if (isset($regs[3]) and $suite = $regs[3]) {
2633
-		# Recherche de l'existence du champ date_xxxx,
2634
-		# si oui choisir ce champ, sinon choisir xxxx
2635
-		if (isset($table['field']["date$suite"])) {
2636
-			$date_orig = 'date' . $suite;
2637
-		} else {
2638
-			$date_orig = substr($suite, 1);
2639
-		}
2640
-
2641
-		$pred = $date_orig;
2642
-	} else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet
2643
-		// Si aucune déclaration trouvée, on quitte
2644
-		if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2645
-			return '';
2646
-		}
2647
-		// Par défaut, on prend le champ date déclaré dans l'API
2648
-		$pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
2649
-
2650
-		// Si c'est pour du relatif
2651
-		if (isset($regs[2]) and $rel = $regs[2]) {
2652
-			$pred = 'date';
2653
-		}
2654
-	}
2655
-
2656
-	$date_compare = "\"' . normaliser_date(" .
2657
-		calculer_argument_precedent($idb, $pred, $boucles) .
2658
-		") . '\"";
2659
-
2660
-	$col_vraie = $date_orig;
2661
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2662
-
2663
-	switch ($col) {
2664
-		case 'date':
2665
-			$col = $date_orig;
2666
-			break;
2667
-		case 'jour':
2668
-			$col = "DAYOFMONTH($date_orig)";
2669
-			break;
2670
-		case 'mois':
2671
-			$col = "MONTH($date_orig)";
2672
-			break;
2673
-		case 'annee':
2674
-			$col = "YEAR($date_orig)";
2675
-			break;
2676
-		case 'heure':
2677
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2678
-			break;
2679
-		case 'age':
2680
-			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2681
-			$col_vraie = '';// comparer a un int (par defaut)
2682
-			break;
2683
-		case 'age_relatif':
2684
-			$col = calculer_param_date($date_compare, $date_orig);
2685
-			$col_vraie = '';// comparer a un int (par defaut)
2686
-			break;
2687
-		case 'jour_relatif':
2688
-			$col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2689
-			$col_vraie = '';// comparer a un int (par defaut)
2690
-			break;
2691
-		case 'mois_relatif':
2692
-			$col = 'MONTH(' . $date_compare . ')-MONTH(' .
2693
-				$date_orig . ')+12*(YEAR(' . $date_compare .
2694
-				')-YEAR(' . $date_orig . '))';
2695
-			$col_vraie = '';// comparer a un int (par defaut)
2696
-			break;
2697
-		case 'annee_relatif':
2698
-			$col = 'YEAR(' . $date_compare . ')-YEAR(' .
2699
-				$date_orig . ')';
2700
-			$col_vraie = '';// comparer a un int (par defaut)
2701
-			break;
2702
-	}
2703
-
2704
-	return [$col, $col_vraie];
2616
+    if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2617
+        return '';
2618
+    }
2619
+
2620
+    $boucle = $boucles[$idb];
2621
+    $table = $boucle->show;
2622
+
2623
+    // si c'est une colonne de la table, ne rien faire
2624
+    if (isset($table['field'][$col])) {
2625
+        return '';
2626
+    }
2627
+
2628
+    // Le type de critère à prendre en compte
2629
+    $col = $regs[1];
2630
+
2631
+    // Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet
2632
+    if (isset($regs[3]) and $suite = $regs[3]) {
2633
+        # Recherche de l'existence du champ date_xxxx,
2634
+        # si oui choisir ce champ, sinon choisir xxxx
2635
+        if (isset($table['field']["date$suite"])) {
2636
+            $date_orig = 'date' . $suite;
2637
+        } else {
2638
+            $date_orig = substr($suite, 1);
2639
+        }
2640
+
2641
+        $pred = $date_orig;
2642
+    } else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet
2643
+        // Si aucune déclaration trouvée, on quitte
2644
+        if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2645
+            return '';
2646
+        }
2647
+        // Par défaut, on prend le champ date déclaré dans l'API
2648
+        $pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
2649
+
2650
+        // Si c'est pour du relatif
2651
+        if (isset($regs[2]) and $rel = $regs[2]) {
2652
+            $pred = 'date';
2653
+        }
2654
+    }
2655
+
2656
+    $date_compare = "\"' . normaliser_date(" .
2657
+        calculer_argument_precedent($idb, $pred, $boucles) .
2658
+        ") . '\"";
2659
+
2660
+    $col_vraie = $date_orig;
2661
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2662
+
2663
+    switch ($col) {
2664
+        case 'date':
2665
+            $col = $date_orig;
2666
+            break;
2667
+        case 'jour':
2668
+            $col = "DAYOFMONTH($date_orig)";
2669
+            break;
2670
+        case 'mois':
2671
+            $col = "MONTH($date_orig)";
2672
+            break;
2673
+        case 'annee':
2674
+            $col = "YEAR($date_orig)";
2675
+            break;
2676
+        case 'heure':
2677
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2678
+            break;
2679
+        case 'age':
2680
+            $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2681
+            $col_vraie = '';// comparer a un int (par defaut)
2682
+            break;
2683
+        case 'age_relatif':
2684
+            $col = calculer_param_date($date_compare, $date_orig);
2685
+            $col_vraie = '';// comparer a un int (par defaut)
2686
+            break;
2687
+        case 'jour_relatif':
2688
+            $col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2689
+            $col_vraie = '';// comparer a un int (par defaut)
2690
+            break;
2691
+        case 'mois_relatif':
2692
+            $col = 'MONTH(' . $date_compare . ')-MONTH(' .
2693
+                $date_orig . ')+12*(YEAR(' . $date_compare .
2694
+                ')-YEAR(' . $date_orig . '))';
2695
+            $col_vraie = '';// comparer a un int (par defaut)
2696
+            break;
2697
+        case 'annee_relatif':
2698
+            $col = 'YEAR(' . $date_compare . ')-YEAR(' .
2699
+                $date_orig . ')';
2700
+            $col_vraie = '';// comparer a un int (par defaut)
2701
+            break;
2702
+    }
2703
+
2704
+    return [$col, $col_vraie];
2705 2705
 }
2706 2706
 
2707 2707
 /**
@@ -2720,16 +2720,16 @@  discard block
 block discarded – undo
2720 2720
  *     de colonne SQL et une date.
2721 2721
  **/
2722 2722
 function calculer_param_date($date_compare, $date_orig) {
2723
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2724
-		$init = "'\" . (\$x = $r[1]) . \"'";
2725
-		$date_compare = '\'$x\'';
2726
-	} else {
2727
-		$init = $date_compare;
2728
-	}
2729
-
2730
-	return
2731
-		// optimisation : mais prevoir le support SQLite avant
2732
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2723
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2724
+        $init = "'\" . (\$x = $r[1]) . \"'";
2725
+        $date_compare = '\'$x\'';
2726
+    } else {
2727
+        $init = $date_compare;
2728
+    }
2729
+
2730
+    return
2731
+        // optimisation : mais prevoir le support SQLite avant
2732
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2733 2733
 }
2734 2734
 
2735 2735
 /**
@@ -2747,20 +2747,20 @@  discard block
 block discarded – undo
2747 2747
  * @param Critere $crit Paramètres du critère dans cette boucle
2748 2748
  */
2749 2749
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2750
-	$boucle = &$boucles[$idb];
2751
-
2752
-	$args = [];
2753
-	foreach ($crit->param as &$param) {
2754
-		array_push(
2755
-			$args,
2756
-			calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent)
2757
-		);
2758
-	}
2750
+    $boucle = &$boucles[$idb];
2759 2751
 
2760
-	$boucle->hash .= '
2752
+    $args = [];
2753
+    foreach ($crit->param as &$param) {
2754
+        array_push(
2755
+            $args,
2756
+            calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent)
2757
+        );
2758
+    }
2759
+
2760
+    $boucle->hash .= '
2761 2761
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2762 2762
 
2763
-	$boucle->hash .= '
2763
+    $boucle->hash .= '
2764 2764
 	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2765 2765
 }
2766 2766
 
@@ -2778,8 +2778,8 @@  discard block
 block discarded – undo
2778 2778
  * @param Critere $crit Paramètres du critère dans cette boucle
2779 2779
  */
2780 2780
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2781
-	$boucle = &$boucles[$idb];
2782
-	$boucle->hash .= '
2781
+    $boucle = &$boucles[$idb];
2782
+    $boucle->hash .= '
2783 2783
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2784 2784
 }
2785 2785
 
@@ -2795,12 +2795,12 @@  discard block
 block discarded – undo
2795 2795
  * @param Critere $crit Paramètres du critère dans cette boucle
2796 2796
  */
2797 2797
 function critere_php_args_dist($idb, &$boucles, $crit) {
2798
-	$boucle = &$boucles[$idb];
2799
-	$boucle->hash .= '$command[\'args\']=array();';
2800
-	foreach ($crit->param as $param) {
2801
-		$boucle->hash .= '
2798
+    $boucle = &$boucles[$idb];
2799
+    $boucle->hash .= '$command[\'args\']=array();';
2800
+    foreach ($crit->param as $param) {
2801
+        $boucle->hash .= '
2802 2802
 			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2803
-	}
2803
+    }
2804 2804
 }
2805 2805
 
2806 2806
 /**
@@ -2817,16 +2817,16 @@  discard block
 block discarded – undo
2817 2817
  * @param Critere $crit Paramètres du critère dans cette boucle
2818 2818
  */
2819 2819
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2820
-	$boucle = &$boucles[$idb];
2821
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2822
-	foreach ($crit->param as $param) {
2823
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2824
-			$param,
2825
-			$idb,
2826
-			$boucles,
2827
-			$boucles[$idb]->id_parent
2828
-		) . ";\n";
2829
-	}
2820
+    $boucle = &$boucles[$idb];
2821
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2822
+    foreach ($crit->param as $param) {
2823
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2824
+            $param,
2825
+            $idb,
2826
+            $boucles,
2827
+            $boucles[$idb]->id_parent
2828
+        ) . ";\n";
2829
+    }
2830 2830
 }
2831 2831
 
2832 2832
 /**
@@ -2851,16 +2851,16 @@  discard block
 block discarded – undo
2851 2851
  * @param Critere $crit Paramètres du critère dans cette boucle
2852 2852
  */
2853 2853
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2854
-	$boucle = &$boucles[$idb];
2855
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2856
-	foreach ($crit->param as $param) {
2857
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2858
-			$param,
2859
-			$idb,
2860
-			$boucles,
2861
-			$boucles[$idb]->id_parent
2862
-		) . ";\n";
2863
-	}
2854
+    $boucle = &$boucles[$idb];
2855
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2856
+    foreach ($crit->param as $param) {
2857
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2858
+            $param,
2859
+            $idb,
2860
+            $boucles,
2861
+            $boucles[$idb]->id_parent
2862
+        ) . ";\n";
2863
+    }
2864 2864
 }
2865 2865
 
2866 2866
 /**
@@ -2875,11 +2875,11 @@  discard block
 block discarded – undo
2875 2875
  * @param Critere $crit Paramètres du critère dans cette boucle
2876 2876
  */
2877 2877
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2878
-	$boucle = &$boucles[$idb];
2879
-	foreach ($crit->param as $param) {
2880
-		$boucle->hash .= '
2878
+    $boucle = &$boucles[$idb];
2879
+    foreach ($crit->param as $param) {
2880
+        $boucle->hash .= '
2881 2881
 			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2882
-	}
2882
+    }
2883 2883
 }
2884 2884
 
2885 2885
 
@@ -2911,20 +2911,20 @@  discard block
 block discarded – undo
2911 2911
  * @param Critere $crit Paramètres du critère dans cette boucle
2912 2912
  */
2913 2913
 function critere_si_dist($idb, &$boucles, $crit) {
2914
-	$boucle = &$boucles[$idb];
2915
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2916
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2917
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2918
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2919
-	if ($crit->param) {
2920
-		foreach ($crit->param as $param) {
2921
-			$boucle->hash .= "\t\$command['si'][] = "
2922
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2923
-		}
2924
-		// interdire {si 0} aussi !
2925
-	} else {
2926
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2927
-	}
2914
+    $boucle = &$boucles[$idb];
2915
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2916
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2917
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2918
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2919
+    if ($crit->param) {
2920
+        foreach ($crit->param as $param) {
2921
+            $boucle->hash .= "\t\$command['si'][] = "
2922
+                . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2923
+        }
2924
+        // interdire {si 0} aussi !
2925
+    } else {
2926
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2927
+    }
2928 2928
 }
2929 2929
 
2930 2930
 /**
@@ -2941,8 +2941,8 @@  discard block
 block discarded – undo
2941 2941
  * @param Critere $crit Paramètres du critère dans cette boucle
2942 2942
  */
2943 2943
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2944
-	$boucle = &$boucles[$idb];
2945
-	$boucle->hash .= '
2944
+    $boucle = &$boucles[$idb];
2945
+    $boucle->hash .= '
2946 2946
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2947 2947
 	$command[\'sourcemode\'] = \'table\';';
2948 2948
 }
@@ -2963,27 +2963,27 @@  discard block
 block discarded – undo
2963 2963
  */
2964 2964
 function critere_noeud_dist($idb, &$boucles, $crit) {
2965 2965
 
2966
-	$not = $crit->not;
2967
-	$boucle = &$boucles[$idb];
2968
-	$primary = $boucle->primary;
2966
+    $not = $crit->not;
2967
+    $boucle = &$boucles[$idb];
2968
+    $primary = $boucle->primary;
2969 2969
 
2970
-	if (!$primary or strpos($primary, ',')) {
2971
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2970
+    if (!$primary or strpos($primary, ',')) {
2971
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2972 2972
 
2973
-		return;
2974
-	}
2975
-	$table = $boucle->type_requete;
2976
-	$table_sql = table_objet_sql(objet_type($table));
2973
+        return;
2974
+    }
2975
+    $table = $boucle->type_requete;
2976
+    $table_sql = table_objet_sql(objet_type($table));
2977 2977
 
2978
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2978
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2979 2979
 
2980
-	$in = 'IN';
2981
-	$where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2982
-	if ($not) {
2983
-		$where = ["'NOT'", $where];
2984
-	}
2980
+    $in = 'IN';
2981
+    $where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2982
+    if ($not) {
2983
+        $where = ["'NOT'", $where];
2984
+    }
2985 2985
 
2986
-	$boucle->where[] = $where;
2986
+    $boucle->where[] = $where;
2987 2987
 }
2988 2988
 
2989 2989
 /**
@@ -2999,8 +2999,8 @@  discard block
 block discarded – undo
2999 2999
  * @param Critere $crit Paramètres du critère dans cette boucle
3000 3000
  */
3001 3001
 function critere_feuille_dist($idb, &$boucles, $crit) {
3002
-	$not = $crit->not;
3003
-	$crit->not = $not ? false : true;
3004
-	critere_noeud_dist($idb, $boucles, $crit);
3005
-	$crit->not = $not;
3002
+    $not = $crit->not;
3003
+    $crit->not = $not ? false : true;
3004
+    critere_noeud_dist($idb, $boucles, $crit);
3005
+    $crit->not = $not;
3006 3006
 }
Please login to merge, or discard this patch.
ecrire/inc/rubriques.php 1 patch
Indentation   +621 added lines, -621 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
  */
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 
@@ -55,65 +55,65 @@  discard block
 block discarded – undo
55 55
  * @return void
56 56
  **/
57 57
 function calculer_rubriques_if($id_rubrique, $modifs, $infos = [], $postdate = false) {
58
-	$statuts_publies = null;
59
-	$neuf = false;
60
-
61
-	// Compat avec l'ancienne signature
62
-	if (is_string($infos)) {
63
-		$infos = ['statut_ancien' => $infos];
64
-	}
65
-	if (!isset($infos['statut_ancien'])) {
66
-		$infos['statut_ancien'] = '';
67
-	}
68
-
69
-	// On recherche quels statuts tester
70
-	if (
71
-		isset($infos['objet'])
72
-		and include_spip('inc/filtres')
73
-		and $declaration_statut = objet_info($infos['objet'], 'statut')
74
-		and is_array($declaration_statut)
75
-	) {
76
-		foreach ($declaration_statut as $champ_statut) {
77
-			if ($champ_statut['champ'] == 'statut') {
78
-				$statuts_publies = array_map('trim', explode(',', $champ_statut['publie']));
79
-				break; // stop on a trouvé le bon champ
80
-			}
81
-		}
82
-	} else {
83
-		$statuts_publies = ['publie'];
84
-	}
85
-
86
-	if (in_array($infos['statut_ancien'], $statuts_publies)) {
87
-		if (
88
-			isset($modifs['statut'])
89
-			or isset($modifs['id_rubrique'])
90
-			or ($postdate and strtotime($postdate) > time())
91
-		) {
92
-			$neuf |= depublier_branche_rubrique_if($id_rubrique);
93
-		}
94
-		// ne publier que si c'est pas un postdate, ou si la date n'est pas dans le futur
95
-		if ($postdate) {
96
-			calculer_prochain_postdate(true);
97
-			$neuf |= (strtotime($postdate) <= time()); // par securite
98
-		} elseif (isset($modifs['id_rubrique'])) {
99
-			$neuf |= publier_branche_rubrique($modifs['id_rubrique']);
100
-		}
101
-	} elseif (isset($modifs['statut']) and in_array($modifs['statut'], $statuts_publies)) {
102
-		if ($postdate) {
103
-			calculer_prochain_postdate(true);
104
-			$neuf |= (strtotime($postdate) <= time()); // par securite
105
-		} else {
106
-			$neuf |= publier_branche_rubrique($id_rubrique);
107
-		}
108
-	}
109
-
110
-	if ($neuf) {
111
-		// Sauver la date de la derniere mise a jour (pour menu_rubriques)
112
-		ecrire_meta('date_calcul_rubriques', date('U'));
113
-	}
114
-
115
-	$langues = calculer_langues_utilisees();
116
-	ecrire_meta('langues_utilisees', $langues);
58
+    $statuts_publies = null;
59
+    $neuf = false;
60
+
61
+    // Compat avec l'ancienne signature
62
+    if (is_string($infos)) {
63
+        $infos = ['statut_ancien' => $infos];
64
+    }
65
+    if (!isset($infos['statut_ancien'])) {
66
+        $infos['statut_ancien'] = '';
67
+    }
68
+
69
+    // On recherche quels statuts tester
70
+    if (
71
+        isset($infos['objet'])
72
+        and include_spip('inc/filtres')
73
+        and $declaration_statut = objet_info($infos['objet'], 'statut')
74
+        and is_array($declaration_statut)
75
+    ) {
76
+        foreach ($declaration_statut as $champ_statut) {
77
+            if ($champ_statut['champ'] == 'statut') {
78
+                $statuts_publies = array_map('trim', explode(',', $champ_statut['publie']));
79
+                break; // stop on a trouvé le bon champ
80
+            }
81
+        }
82
+    } else {
83
+        $statuts_publies = ['publie'];
84
+    }
85
+
86
+    if (in_array($infos['statut_ancien'], $statuts_publies)) {
87
+        if (
88
+            isset($modifs['statut'])
89
+            or isset($modifs['id_rubrique'])
90
+            or ($postdate and strtotime($postdate) > time())
91
+        ) {
92
+            $neuf |= depublier_branche_rubrique_if($id_rubrique);
93
+        }
94
+        // ne publier que si c'est pas un postdate, ou si la date n'est pas dans le futur
95
+        if ($postdate) {
96
+            calculer_prochain_postdate(true);
97
+            $neuf |= (strtotime($postdate) <= time()); // par securite
98
+        } elseif (isset($modifs['id_rubrique'])) {
99
+            $neuf |= publier_branche_rubrique($modifs['id_rubrique']);
100
+        }
101
+    } elseif (isset($modifs['statut']) and in_array($modifs['statut'], $statuts_publies)) {
102
+        if ($postdate) {
103
+            calculer_prochain_postdate(true);
104
+            $neuf |= (strtotime($postdate) <= time()); // par securite
105
+        } else {
106
+            $neuf |= publier_branche_rubrique($id_rubrique);
107
+        }
108
+    }
109
+
110
+    if ($neuf) {
111
+        // Sauver la date de la derniere mise a jour (pour menu_rubriques)
112
+        ecrire_meta('date_calcul_rubriques', date('U'));
113
+    }
114
+
115
+    $langues = calculer_langues_utilisees();
116
+    ecrire_meta('langues_utilisees', $langues);
117 117
 }
118 118
 
119 119
 
@@ -131,22 +131,22 @@  discard block
 block discarded – undo
131 131
  *     true si le statut change effectivement
132 132
  */
133 133
 function publier_branche_rubrique($id_rubrique) {
134
-	$id_pred = $id_rubrique;
135
-	while (true) {
136
-		sql_updateq(
137
-			'spip_rubriques',
138
-			['statut' => 'publie', 'date' => date('Y-m-d H:i:s')],
139
-			'id_rubrique=' . intval($id_rubrique)
140
-		);
141
-		$id_parent = sql_getfetsel('id_parent', 'spip_rubriques AS R', 'R.id_rubrique=' . intval($id_rubrique));
142
-		if (!$id_parent) {
143
-			break;
144
-		}
145
-		$id_rubrique = $id_parent;
146
-	}
134
+    $id_pred = $id_rubrique;
135
+    while (true) {
136
+        sql_updateq(
137
+            'spip_rubriques',
138
+            ['statut' => 'publie', 'date' => date('Y-m-d H:i:s')],
139
+            'id_rubrique=' . intval($id_rubrique)
140
+        );
141
+        $id_parent = sql_getfetsel('id_parent', 'spip_rubriques AS R', 'R.id_rubrique=' . intval($id_rubrique));
142
+        if (!$id_parent) {
143
+            break;
144
+        }
145
+        $id_rubrique = $id_parent;
146
+    }
147 147
 
148 148
 #	spip_log(" publier_branche_rubrique($id_rubrique $id_pred");
149
-	return $id_pred != $id_rubrique;
149
+    return $id_pred != $id_rubrique;
150 150
 }
151 151
 
152 152
 /**
@@ -164,20 +164,20 @@  discard block
 block discarded – undo
164 164
  *     true si le statut change effectivement
165 165
  */
166 166
 function depublier_branche_rubrique_if($id_rubrique) {
167
-	$date = date('Y-m-d H:i:s'); // figer la date
168
-
169
-	#	spip_log("depublier_branche_rubrique($id_rubrique ?");
170
-	$id_pred = $id_rubrique;
171
-	while ($id_pred) {
172
-		if (!depublier_rubrique_if($id_pred, $date)) {
173
-			return $id_pred != $id_rubrique;
174
-		}
175
-		// passer au parent si on a depublie
176
-		$r = sql_fetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id_pred));
177
-		$id_pred = $r['id_parent'];
178
-	}
179
-
180
-	return $id_pred != $id_rubrique;
167
+    $date = date('Y-m-d H:i:s'); // figer la date
168
+
169
+    #	spip_log("depublier_branche_rubrique($id_rubrique ?");
170
+    $id_pred = $id_rubrique;
171
+    while ($id_pred) {
172
+        if (!depublier_rubrique_if($id_pred, $date)) {
173
+            return $id_pred != $id_rubrique;
174
+        }
175
+        // passer au parent si on a depublie
176
+        $r = sql_fetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id_pred));
177
+        $id_pred = $r['id_parent'];
178
+    }
179
+
180
+    return $id_pred != $id_rubrique;
181 181
 }
182 182
 
183 183
 /**
@@ -194,61 +194,61 @@  discard block
 block discarded – undo
194 194
  *    true si la rubrique a été dépubliée
195 195
  */
196 196
 function depublier_rubrique_if($id_rubrique, $date = null) {
197
-	if (is_null($date)) {
198
-		$date = date('Y-m-d H:i:s');
199
-	}
200
-	$postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
201
-		' AND date <= ' . sql_quote($date) : '';
202
-
203
-	if (!$id_rubrique = intval($id_rubrique)) {
204
-		return false;
205
-	}
206
-
207
-	// verifier qu'elle existe et est bien publiee
208
-	$r = sql_fetsel('id_rubrique,statut', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
209
-	if (!$r or $r['statut'] !== 'publie') {
210
-		return false;
211
-	}
212
-
213
-	// On met le nombre de chaque type d'enfants dans un tableau
214
-	// Le type de l'objet est au pluriel
215
-	$compte = [
216
-		'articles' => sql_countsel(
217
-			'spip_articles',
218
-			'id_rubrique=' . intval($id_rubrique) . " AND statut='publie'$postdates"
219
-		),
220
-		'rubriques' => sql_countsel('spip_rubriques', 'id_parent=' . intval($id_rubrique) . " AND statut='publie'"),
221
-		'documents' => sql_countsel(
222
-			'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document',
223
-			'L.id_objet=' . intval($id_rubrique) . " AND L.objet='rubrique' and D.mode NOT IN('logoon', 'logooff') "
224
-		)
225
-	];
226
-
227
-	// On passe le tableau des comptes dans un pipeline pour que les plugins puissent ajouter (ou retirer) des enfants
228
-	$compte = pipeline(
229
-		'objet_compte_enfants',
230
-		[
231
-			'args' => [
232
-				'objet' => 'rubrique',
233
-				'id_objet' => $id_rubrique,
234
-				'statut' => 'publie',
235
-				'date' => $date
236
-			],
237
-			'data' => $compte
238
-		]
239
-	);
240
-
241
-	// S'il y a au moins un enfant de n'importe quoi, on ne dépublie pas
242
-	foreach ($compte as $objet => $n) {
243
-		if ($n) {
244
-			return false;
245
-		}
246
-	}
247
-
248
-	sql_updateq('spip_rubriques', ['statut' => 'prepa'], 'id_rubrique=' . intval($id_rubrique));
197
+    if (is_null($date)) {
198
+        $date = date('Y-m-d H:i:s');
199
+    }
200
+    $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
201
+        ' AND date <= ' . sql_quote($date) : '';
202
+
203
+    if (!$id_rubrique = intval($id_rubrique)) {
204
+        return false;
205
+    }
206
+
207
+    // verifier qu'elle existe et est bien publiee
208
+    $r = sql_fetsel('id_rubrique,statut', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
209
+    if (!$r or $r['statut'] !== 'publie') {
210
+        return false;
211
+    }
212
+
213
+    // On met le nombre de chaque type d'enfants dans un tableau
214
+    // Le type de l'objet est au pluriel
215
+    $compte = [
216
+        'articles' => sql_countsel(
217
+            'spip_articles',
218
+            'id_rubrique=' . intval($id_rubrique) . " AND statut='publie'$postdates"
219
+        ),
220
+        'rubriques' => sql_countsel('spip_rubriques', 'id_parent=' . intval($id_rubrique) . " AND statut='publie'"),
221
+        'documents' => sql_countsel(
222
+            'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document',
223
+            'L.id_objet=' . intval($id_rubrique) . " AND L.objet='rubrique' and D.mode NOT IN('logoon', 'logooff') "
224
+        )
225
+    ];
226
+
227
+    // On passe le tableau des comptes dans un pipeline pour que les plugins puissent ajouter (ou retirer) des enfants
228
+    $compte = pipeline(
229
+        'objet_compte_enfants',
230
+        [
231
+            'args' => [
232
+                'objet' => 'rubrique',
233
+                'id_objet' => $id_rubrique,
234
+                'statut' => 'publie',
235
+                'date' => $date
236
+            ],
237
+            'data' => $compte
238
+        ]
239
+    );
240
+
241
+    // S'il y a au moins un enfant de n'importe quoi, on ne dépublie pas
242
+    foreach ($compte as $objet => $n) {
243
+        if ($n) {
244
+            return false;
245
+        }
246
+    }
247
+
248
+    sql_updateq('spip_rubriques', ['statut' => 'prepa'], 'id_rubrique=' . intval($id_rubrique));
249 249
 
250 250
 #		spip_log("depublier_rubrique $id_pred");
251
-	return true;
251
+    return true;
252 252
 }
253 253
 
254 254
 
@@ -271,18 +271,18 @@  discard block
 block discarded – undo
271 271
  **/
272 272
 function calculer_rubriques() {
273 273
 
274
-	calculer_rubriques_publiees();
274
+    calculer_rubriques_publiees();
275 275
 
276
-	// Apres chaque (de)publication
277
-	// recalculer les langues utilisees sur le site
278
-	$langues = calculer_langues_utilisees();
279
-	ecrire_meta('langues_utilisees', $langues);
276
+    // Apres chaque (de)publication
277
+    // recalculer les langues utilisees sur le site
278
+    $langues = calculer_langues_utilisees();
279
+    ecrire_meta('langues_utilisees', $langues);
280 280
 
281
-	// Sauver la date de la derniere mise a jour (pour menu_rubriques)
282
-	ecrire_meta('date_calcul_rubriques', date('U'));
281
+    // Sauver la date de la derniere mise a jour (pour menu_rubriques)
282
+    ecrire_meta('date_calcul_rubriques', date('U'));
283 283
 
284
-	// on calcule la date du prochain article post-date
285
-	calculer_prochain_postdate();
284
+    // on calcule la date du prochain article post-date
285
+    calculer_prochain_postdate();
286 286
 }
287 287
 
288 288
 
@@ -299,61 +299,61 @@  discard block
 block discarded – undo
299 299
  **/
300 300
 function calculer_rubriques_publiees() {
301 301
 
302
-	// Mettre les compteurs a zero
303
-	sql_updateq('spip_rubriques', ['date_tmp' => '0000-00-00 00:00:00', 'statut_tmp' => 'prepa']);
304
-
305
-	//
306
-	// Publier et dater les rubriques qui ont un article publie
307
-	//
308
-
309
-	// Afficher les articles post-dates ?
310
-	$postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
311
-		'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : '';
312
-
313
-	$r = sql_select(
314
-		'R.id_rubrique AS id, max(A.date) AS date_h',
315
-		'spip_rubriques AS R JOIN spip_articles AS A ON R.id_rubrique = A.id_rubrique',
316
-		"A.date>R.date_tmp AND A.statut='publie' $postdates ",
317
-		'R.id_rubrique'
318
-	);
319
-	while ($row = sql_fetch($r)) {
320
-		sql_updateq(
321
-			'spip_rubriques',
322
-			['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']],
323
-			'id_rubrique=' . intval($row['id'])
324
-		);
325
-	}
326
-
327
-	// point d'entree pour permettre a des plugins de gerer le statut
328
-	// autrement (par ex: toute rubrique est publiee des sa creation)
329
-	// Ce pipeline fait ce qu'il veut, mais s'il touche aux statuts/dates
330
-	// c'est statut_tmp/date_tmp qu'il doit modifier
331
-	// [C'est un trigger... a renommer en trig_calculer_rubriques ?]
332
-	pipeline('calculer_rubriques', null);
333
-
334
-
335
-	// Les rubriques qui ont une rubrique fille plus recente
336
-	// on tourne tant que les donnees remontent vers la racine.
337
-	do {
338
-		$continuer = false;
339
-		$r = sql_select(
340
-			'R.id_rubrique AS id, max(SR.date_tmp) AS date_h',
341
-			'spip_rubriques AS R JOIN spip_rubriques AS SR ON R.id_rubrique = SR.id_parent',
342
-			"(SR.date_tmp>R.date_tmp OR R.statut_tmp<>'publie') AND SR.statut_tmp='publie' ",
343
-			'R.id_rubrique'
344
-		);
345
-		while ($row = sql_fetch($r)) {
346
-			sql_updateq(
347
-				'spip_rubriques',
348
-				['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']],
349
-				'id_rubrique=' . intval($row['id'])
350
-			);
351
-			$continuer = true;
352
-		}
353
-	} while ($continuer);
354
-
355
-	// Enregistrement des modifs
356
-	sql_update('spip_rubriques', ['date' => 'date_tmp', 'statut' => 'statut_tmp']);
302
+    // Mettre les compteurs a zero
303
+    sql_updateq('spip_rubriques', ['date_tmp' => '0000-00-00 00:00:00', 'statut_tmp' => 'prepa']);
304
+
305
+    //
306
+    // Publier et dater les rubriques qui ont un article publie
307
+    //
308
+
309
+    // Afficher les articles post-dates ?
310
+    $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
311
+        'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : '';
312
+
313
+    $r = sql_select(
314
+        'R.id_rubrique AS id, max(A.date) AS date_h',
315
+        'spip_rubriques AS R JOIN spip_articles AS A ON R.id_rubrique = A.id_rubrique',
316
+        "A.date>R.date_tmp AND A.statut='publie' $postdates ",
317
+        'R.id_rubrique'
318
+    );
319
+    while ($row = sql_fetch($r)) {
320
+        sql_updateq(
321
+            'spip_rubriques',
322
+            ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']],
323
+            'id_rubrique=' . intval($row['id'])
324
+        );
325
+    }
326
+
327
+    // point d'entree pour permettre a des plugins de gerer le statut
328
+    // autrement (par ex: toute rubrique est publiee des sa creation)
329
+    // Ce pipeline fait ce qu'il veut, mais s'il touche aux statuts/dates
330
+    // c'est statut_tmp/date_tmp qu'il doit modifier
331
+    // [C'est un trigger... a renommer en trig_calculer_rubriques ?]
332
+    pipeline('calculer_rubriques', null);
333
+
334
+
335
+    // Les rubriques qui ont une rubrique fille plus recente
336
+    // on tourne tant que les donnees remontent vers la racine.
337
+    do {
338
+        $continuer = false;
339
+        $r = sql_select(
340
+            'R.id_rubrique AS id, max(SR.date_tmp) AS date_h',
341
+            'spip_rubriques AS R JOIN spip_rubriques AS SR ON R.id_rubrique = SR.id_parent',
342
+            "(SR.date_tmp>R.date_tmp OR R.statut_tmp<>'publie') AND SR.statut_tmp='publie' ",
343
+            'R.id_rubrique'
344
+        );
345
+        while ($row = sql_fetch($r)) {
346
+            sql_updateq(
347
+                'spip_rubriques',
348
+                ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']],
349
+                'id_rubrique=' . intval($row['id'])
350
+            );
351
+            $continuer = true;
352
+        }
353
+    } while ($continuer);
354
+
355
+    // Enregistrement des modifs
356
+    sql_update('spip_rubriques', ['date' => 'date_tmp', 'statut' => 'statut_tmp']);
357 357
 }
358 358
 
359 359
 /**
@@ -368,123 +368,123 @@  discard block
 block discarded – undo
368 368
  * @return void
369 369
  **/
370 370
 function propager_les_secteurs() {
371
-	// Profondeur 0
372
-	// Toutes les rubriques racines sont de profondeur 0
373
-	// et fixer les id_secteur des rubriques racines
374
-	sql_update('spip_rubriques', ['id_secteur' => 'id_rubrique', 'profondeur' => 0], 'id_parent=0');
375
-	// Toute rubrique non racine est de profondeur >0
376
-	sql_updateq('spip_rubriques', ['profondeur' => 1], 'id_parent<>0 AND profondeur=0');
377
-
378
-	// securite : pas plus d'iteration que de rubriques dans la base
379
-	$maxiter = sql_countsel('spip_rubriques');
380
-
381
-	// reparer les rubriques qui n'ont pas l'id_secteur de leur parent
382
-	// on fait profondeur par profondeur
383
-
384
-	$prof = 0;
385
-	do {
386
-		$continuer = false;
387
-
388
-		// Par recursivite : si toutes les rubriques de profondeur $prof sont bonnes
389
-		// on fixe le profondeur $prof+1
390
-
391
-		// Toutes les rubriques dont le parent est de profondeur $prof ont une profondeur $prof+1
392
-		// on teste A.profondeur > $prof+1 car :
393
-		// - toutes les rubriques de profondeur 0 à $prof sont bonnes
394
-		// - si A.profondeur = $prof+1 c'est bon
395
-		// - cela nous protege de la boucle infinie en cas de reference circulaire dans les rubriques
396
-		$maxiter2 = $maxiter;
397
-		while (
398
-			$maxiter2--
399
-			and $rows = sql_allfetsel(
400
-				'A.id_rubrique AS id, R.id_secteur AS id_secteur, R.profondeur+1 as profondeur',
401
-				'spip_rubriques AS A JOIN spip_rubriques AS R ON A.id_parent = R.id_rubrique',
402
-				'R.profondeur=' . intval($prof) . ' AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)',
403
-				'',
404
-				'R.id_secteur',
405
-				'0,100'
406
-			)
407
-		) {
408
-			$id_secteur = null;
409
-			$ids = [];
410
-			while ($row = array_shift($rows)) {
411
-				if ($row['id_secteur'] !== $id_secteur) {
412
-					if (count($ids)) {
413
-						sql_updateq(
414
-							'spip_rubriques',
415
-							['id_secteur' => $id_secteur, 'profondeur' => $prof + 1],
416
-							sql_in('id_rubrique', $ids)
417
-						);
418
-					}
419
-					$id_secteur = $row['id_secteur'];
420
-					$ids = [];
421
-				}
422
-				$ids[] = $row['id'];
423
-			}
424
-			if (count($ids)) {
425
-				sql_updateq(
426
-					'spip_rubriques',
427
-					['id_secteur' => $id_secteur, 'profondeur' => $prof + 1],
428
-					sql_in('id_rubrique', $ids)
429
-				);
430
-			}
431
-		}
432
-
433
-
434
-		// Toutes les rubriques de profondeur $prof+1 qui n'ont pas un parent de profondeur $prof sont decalees
435
-		$maxiter2 = $maxiter;
436
-		while (
437
-			$maxiter2--
438
-			and $rows = sql_allfetsel(
439
-				'id_rubrique as id',
440
-				'spip_rubriques',
441
-				'profondeur=' . intval($prof + 1) . ' AND id_parent NOT IN (' . sql_get_select(
442
-					'zzz.id_rubrique',
443
-					'spip_rubriques AS zzz',
444
-					'zzz.profondeur=' . intval($prof)
445
-				) . ')',
446
-				'',
447
-				'',
448
-				'0,100'
449
-			)
450
-		) {
451
-			$rows = array_column($rows, 'id');
452
-			sql_updateq('spip_rubriques', ['profondeur' => $prof + 2], sql_in('id_rubrique', $rows));
453
-		}
454
-
455
-		// ici on a fini de valider $prof+1, toutes les rubriques de prondeur 0 a $prof+1 sont OK
456
-		// si pas de rubrique a profondeur $prof+1 pas la peine de continuer
457
-		// si il reste des rubriques non vues, c'est une branche morte ou reference circulaire (base foireuse)
458
-		// on arrete les frais
459
-		if (sql_countsel('spip_rubriques', 'profondeur=' . intval($prof + 1))) {
460
-			$prof++;
461
-			$continuer = true;
462
-		}
463
-	} while ($continuer and $maxiter--);
464
-
465
-	// loger si la table des rubriques semble foireuse
466
-	// et mettre un id_secteur=0 sur ces rubriques pour eviter toute selection par les boucles
467
-	if (sql_countsel('spip_rubriques', 'profondeur>' . intval($prof + 1))) {
468
-		spip_log(
469
-			'Les rubriques de profondeur>' . ($prof + 1) . ' semblent suspectes (branches morte ou reference circulaire dans les parents)',
470
-			_LOG_CRITIQUE
471
-		);
472
-		sql_update('spip_rubriques', ['id_secteur' => 0], 'profondeur>' . intval($prof + 1));
473
-	}
474
-
475
-	// reparer les articles
476
-	$r = sql_select(
477
-		'A.id_article AS id, R.id_secteur AS secteur',
478
-		'spip_articles AS A, spip_rubriques AS R',
479
-		'A.id_rubrique = R.id_rubrique AND A.id_secteur <> R.id_secteur'
480
-	);
481
-
482
-	while ($row = sql_fetch($r)) {
483
-		sql_update('spip_articles', ['id_secteur' => $row['secteur']], 'id_article=' . intval($row['id']));
484
-	}
485
-
486
-	// avertir les plugins qui peuvent faire leur mises a jour egalement
487
-	pipeline('trig_propager_les_secteurs', '');
371
+    // Profondeur 0
372
+    // Toutes les rubriques racines sont de profondeur 0
373
+    // et fixer les id_secteur des rubriques racines
374
+    sql_update('spip_rubriques', ['id_secteur' => 'id_rubrique', 'profondeur' => 0], 'id_parent=0');
375
+    // Toute rubrique non racine est de profondeur >0
376
+    sql_updateq('spip_rubriques', ['profondeur' => 1], 'id_parent<>0 AND profondeur=0');
377
+
378
+    // securite : pas plus d'iteration que de rubriques dans la base
379
+    $maxiter = sql_countsel('spip_rubriques');
380
+
381
+    // reparer les rubriques qui n'ont pas l'id_secteur de leur parent
382
+    // on fait profondeur par profondeur
383
+
384
+    $prof = 0;
385
+    do {
386
+        $continuer = false;
387
+
388
+        // Par recursivite : si toutes les rubriques de profondeur $prof sont bonnes
389
+        // on fixe le profondeur $prof+1
390
+
391
+        // Toutes les rubriques dont le parent est de profondeur $prof ont une profondeur $prof+1
392
+        // on teste A.profondeur > $prof+1 car :
393
+        // - toutes les rubriques de profondeur 0 à $prof sont bonnes
394
+        // - si A.profondeur = $prof+1 c'est bon
395
+        // - cela nous protege de la boucle infinie en cas de reference circulaire dans les rubriques
396
+        $maxiter2 = $maxiter;
397
+        while (
398
+            $maxiter2--
399
+            and $rows = sql_allfetsel(
400
+                'A.id_rubrique AS id, R.id_secteur AS id_secteur, R.profondeur+1 as profondeur',
401
+                'spip_rubriques AS A JOIN spip_rubriques AS R ON A.id_parent = R.id_rubrique',
402
+                'R.profondeur=' . intval($prof) . ' AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)',
403
+                '',
404
+                'R.id_secteur',
405
+                '0,100'
406
+            )
407
+        ) {
408
+            $id_secteur = null;
409
+            $ids = [];
410
+            while ($row = array_shift($rows)) {
411
+                if ($row['id_secteur'] !== $id_secteur) {
412
+                    if (count($ids)) {
413
+                        sql_updateq(
414
+                            'spip_rubriques',
415
+                            ['id_secteur' => $id_secteur, 'profondeur' => $prof + 1],
416
+                            sql_in('id_rubrique', $ids)
417
+                        );
418
+                    }
419
+                    $id_secteur = $row['id_secteur'];
420
+                    $ids = [];
421
+                }
422
+                $ids[] = $row['id'];
423
+            }
424
+            if (count($ids)) {
425
+                sql_updateq(
426
+                    'spip_rubriques',
427
+                    ['id_secteur' => $id_secteur, 'profondeur' => $prof + 1],
428
+                    sql_in('id_rubrique', $ids)
429
+                );
430
+            }
431
+        }
432
+
433
+
434
+        // Toutes les rubriques de profondeur $prof+1 qui n'ont pas un parent de profondeur $prof sont decalees
435
+        $maxiter2 = $maxiter;
436
+        while (
437
+            $maxiter2--
438
+            and $rows = sql_allfetsel(
439
+                'id_rubrique as id',
440
+                'spip_rubriques',
441
+                'profondeur=' . intval($prof + 1) . ' AND id_parent NOT IN (' . sql_get_select(
442
+                    'zzz.id_rubrique',
443
+                    'spip_rubriques AS zzz',
444
+                    'zzz.profondeur=' . intval($prof)
445
+                ) . ')',
446
+                '',
447
+                '',
448
+                '0,100'
449
+            )
450
+        ) {
451
+            $rows = array_column($rows, 'id');
452
+            sql_updateq('spip_rubriques', ['profondeur' => $prof + 2], sql_in('id_rubrique', $rows));
453
+        }
454
+
455
+        // ici on a fini de valider $prof+1, toutes les rubriques de prondeur 0 a $prof+1 sont OK
456
+        // si pas de rubrique a profondeur $prof+1 pas la peine de continuer
457
+        // si il reste des rubriques non vues, c'est une branche morte ou reference circulaire (base foireuse)
458
+        // on arrete les frais
459
+        if (sql_countsel('spip_rubriques', 'profondeur=' . intval($prof + 1))) {
460
+            $prof++;
461
+            $continuer = true;
462
+        }
463
+    } while ($continuer and $maxiter--);
464
+
465
+    // loger si la table des rubriques semble foireuse
466
+    // et mettre un id_secteur=0 sur ces rubriques pour eviter toute selection par les boucles
467
+    if (sql_countsel('spip_rubriques', 'profondeur>' . intval($prof + 1))) {
468
+        spip_log(
469
+            'Les rubriques de profondeur>' . ($prof + 1) . ' semblent suspectes (branches morte ou reference circulaire dans les parents)',
470
+            _LOG_CRITIQUE
471
+        );
472
+        sql_update('spip_rubriques', ['id_secteur' => 0], 'profondeur>' . intval($prof + 1));
473
+    }
474
+
475
+    // reparer les articles
476
+    $r = sql_select(
477
+        'A.id_article AS id, R.id_secteur AS secteur',
478
+        'spip_articles AS A, spip_rubriques AS R',
479
+        'A.id_rubrique = R.id_rubrique AND A.id_secteur <> R.id_secteur'
480
+    );
481
+
482
+    while ($row = sql_fetch($r)) {
483
+        sql_update('spip_articles', ['id_secteur' => $row['secteur']], 'id_article=' . intval($row['id']));
484
+    }
485
+
486
+    // avertir les plugins qui peuvent faire leur mises a jour egalement
487
+    pipeline('trig_propager_les_secteurs', '');
488 488
 }
489 489
 
490 490
 
@@ -499,23 +499,23 @@  discard block
 block discarded – undo
499 499
  *     true si un changement a eu lieu
500 500
  **/
501 501
 function calculer_langues_rubriques_etape() {
502
-	$s = sql_select(
503
-		'A.id_rubrique AS id_rubrique, R.lang AS lang',
504
-		'spip_rubriques AS A, spip_rubriques AS R',
505
-		"A.id_parent = R.id_rubrique AND A.langue_choisie != 'oui' AND R.lang<>'' AND R.lang<>A.lang"
506
-	);
507
-
508
-	$t = false;
509
-	while ($row = sql_fetch($s)) {
510
-		$id_rubrique = $row['id_rubrique'];
511
-		$t = sql_updateq(
512
-			'spip_rubriques',
513
-			['lang' => $row['lang'], 'langue_choisie' => 'non'],
514
-			'id_rubrique=' . intval($id_rubrique)
515
-		);
516
-	}
517
-
518
-	return $t;
502
+    $s = sql_select(
503
+        'A.id_rubrique AS id_rubrique, R.lang AS lang',
504
+        'spip_rubriques AS A, spip_rubriques AS R',
505
+        "A.id_parent = R.id_rubrique AND A.langue_choisie != 'oui' AND R.lang<>'' AND R.lang<>A.lang"
506
+    );
507
+
508
+    $t = false;
509
+    while ($row = sql_fetch($s)) {
510
+        $id_rubrique = $row['id_rubrique'];
511
+        $t = sql_updateq(
512
+            'spip_rubriques',
513
+            ['lang' => $row['lang'], 'langue_choisie' => 'non'],
514
+            'id_rubrique=' . intval($id_rubrique)
515
+        );
516
+    }
517
+
518
+    return $t;
519 519
 }
520 520
 
521 521
 /**
@@ -535,38 +535,38 @@  discard block
 block discarded – undo
535 535
  **/
536 536
 function calculer_langues_rubriques() {
537 537
 
538
-	// rubriques (recursivite)
539
-	sql_updateq(
540
-		'spip_rubriques',
541
-		['lang' => $GLOBALS['meta']['langue_site'], 'langue_choisie' => 'non'],
542
-		"id_parent=0 AND langue_choisie != 'oui'"
543
-	);
544
-	while (calculer_langues_rubriques_etape()) {
545
-		;
546
-	}
547
-
548
-	// articles
549
-	$s = sql_select(
550
-		'A.id_article AS id_article, R.lang AS lang',
551
-		'spip_articles AS A, spip_rubriques AS R',
552
-		"A.id_rubrique = R.id_rubrique AND A.langue_choisie != 'oui' AND (length(A.lang)=0 OR length(R.lang)>0) AND R.lang<>A.lang"
553
-	);
554
-	while ($row = sql_fetch($s)) {
555
-		$id_article = $row['id_article'];
556
-		sql_updateq(
557
-			'spip_articles',
558
-			['lang' => $row['lang'], 'langue_choisie' => 'non'],
559
-			'id_article=' . intval($id_article)
560
-		);
561
-	}
562
-
563
-	if ($GLOBALS['meta']['multi_rubriques'] == 'oui') {
564
-		$langues = calculer_langues_utilisees();
565
-		ecrire_meta('langues_utilisees', $langues);
566
-	}
567
-
568
-	// avertir les plugins qui peuvent faire leur mises a jour egalement
569
-	pipeline('trig_calculer_langues_rubriques', '');
538
+    // rubriques (recursivite)
539
+    sql_updateq(
540
+        'spip_rubriques',
541
+        ['lang' => $GLOBALS['meta']['langue_site'], 'langue_choisie' => 'non'],
542
+        "id_parent=0 AND langue_choisie != 'oui'"
543
+    );
544
+    while (calculer_langues_rubriques_etape()) {
545
+        ;
546
+    }
547
+
548
+    // articles
549
+    $s = sql_select(
550
+        'A.id_article AS id_article, R.lang AS lang',
551
+        'spip_articles AS A, spip_rubriques AS R',
552
+        "A.id_rubrique = R.id_rubrique AND A.langue_choisie != 'oui' AND (length(A.lang)=0 OR length(R.lang)>0) AND R.lang<>A.lang"
553
+    );
554
+    while ($row = sql_fetch($s)) {
555
+        $id_article = $row['id_article'];
556
+        sql_updateq(
557
+            'spip_articles',
558
+            ['lang' => $row['lang'], 'langue_choisie' => 'non'],
559
+            'id_article=' . intval($id_article)
560
+        );
561
+    }
562
+
563
+    if ($GLOBALS['meta']['multi_rubriques'] == 'oui') {
564
+        $langues = calculer_langues_utilisees();
565
+        ecrire_meta('langues_utilisees', $langues);
566
+    }
567
+
568
+    // avertir les plugins qui peuvent faire leur mises a jour egalement
569
+    pipeline('trig_calculer_langues_rubriques', '');
570 570
 }
571 571
 
572 572
 
@@ -583,80 +583,80 @@  discard block
 block discarded – undo
583 583
  *    Liste des langues utilisées séparées par des virgules
584 584
  **/
585 585
 function calculer_langues_utilisees($serveur = '') {
586
-	include_spip('public/interfaces');
587
-	include_spip('public/compiler');
588
-	include_spip('public/composer');
589
-	include_spip('public/phraser_html');
590
-	$langues = [];
591
-
592
-	$langues[$GLOBALS['meta']['langue_site']] = 1;
593
-
594
-	include_spip('base/objets');
595
-	$tables = lister_tables_objets_sql();
596
-	$trouver_table = charger_fonction('trouver_table', 'base');
597
-
598
-	foreach (array_keys($tables) as $t) {
599
-		$desc = $trouver_table($t, $serveur);
600
-		// c'est une table avec des langues
601
-		if (
602
-			$desc['exist']
603
-			and isset($desc['field']['lang'])
604
-			and isset($desc['field']['langue_choisie'])
605
-		) {
606
-			$boucle = new Boucle();
607
-			$boucle->show = $desc;
608
-			$boucle->nom = 'calculer_langues_utilisees';
609
-			$boucle->id_boucle = $desc['table_objet'];
610
-			$boucle->id_table = $desc['table_objet'];
611
-			$boucle->primary = $desc['key']['PRIMARY KEY'] ?? '';
612
-			$boucle->sql_serveur = $serveur;
613
-			$boucle->select[] = 'DISTINCT lang';
614
-			$boucle->from[$desc['table_objet']] = $t;
615
-			$boucle->separateur[] = ',';
616
-			$boucle->return = '$Pile[$SP][\'lang\']';
617
-			$boucle->iterateur = 'sql';
618
-
619
-			$boucle->descr['nom'] = 'calculer_langues_utilisees'; // eviter notice php
620
-			$boucle->descr['sourcefile'] = 'internal';
621
-			$boucle->descr['gram'] = 'html';
622
-
623
-			$boucle = pipeline('pre_boucle', $boucle);
624
-
625
-			if (
626
-				isset($desc['statut'])
627
-				and $desc['statut']
628
-			) {
629
-				$boucles = [
630
-					'calculer_langues_utilisees' => $boucle,
631
-				];
632
-				// generer un nom de fonction "anonyme" unique
633
-				do {
634
-					$functionname = 'f_calculer_langues_utilisees_' . $boucle->id_table . '_' . time() . '_' . random_int(0, mt_getrandmax());
635
-				} while (function_exists($functionname));
636
-				$code = calculer_boucle('calculer_langues_utilisees', $boucles);
637
-				$code = '$SP=0; $command=array();$command["connect"] = $connect = "' . $serveur . '"; $Pile=array(0=>array());' . "\n" . $code;
638
-				$code = 'function ' . $functionname . '(){' . $code . '};$res = ' . $functionname . '();';
639
-				$res = '';
640
-				eval($code);
641
-				$res = explode(',', $res);
642
-				foreach ($res as $lang) {
643
-					$langues[$lang] = 1;
644
-				}
645
-			} else {
646
-				$res = sql_select(implode(',', $boucle->select), $boucle->from);
647
-				while ($row = sql_fetch($res)) {
648
-					$langues[$row['lang']] = 1;
649
-				}
650
-			}
651
-		}
652
-	}
653
-
654
-	$langues = array_filter(array_keys($langues));
655
-	sort($langues);
656
-	$langues = join(',', $langues);
657
-	spip_log("langues utilisees: $langues");
658
-
659
-	return $langues;
586
+    include_spip('public/interfaces');
587
+    include_spip('public/compiler');
588
+    include_spip('public/composer');
589
+    include_spip('public/phraser_html');
590
+    $langues = [];
591
+
592
+    $langues[$GLOBALS['meta']['langue_site']] = 1;
593
+
594
+    include_spip('base/objets');
595
+    $tables = lister_tables_objets_sql();
596
+    $trouver_table = charger_fonction('trouver_table', 'base');
597
+
598
+    foreach (array_keys($tables) as $t) {
599
+        $desc = $trouver_table($t, $serveur);
600
+        // c'est une table avec des langues
601
+        if (
602
+            $desc['exist']
603
+            and isset($desc['field']['lang'])
604
+            and isset($desc['field']['langue_choisie'])
605
+        ) {
606
+            $boucle = new Boucle();
607
+            $boucle->show = $desc;
608
+            $boucle->nom = 'calculer_langues_utilisees';
609
+            $boucle->id_boucle = $desc['table_objet'];
610
+            $boucle->id_table = $desc['table_objet'];
611
+            $boucle->primary = $desc['key']['PRIMARY KEY'] ?? '';
612
+            $boucle->sql_serveur = $serveur;
613
+            $boucle->select[] = 'DISTINCT lang';
614
+            $boucle->from[$desc['table_objet']] = $t;
615
+            $boucle->separateur[] = ',';
616
+            $boucle->return = '$Pile[$SP][\'lang\']';
617
+            $boucle->iterateur = 'sql';
618
+
619
+            $boucle->descr['nom'] = 'calculer_langues_utilisees'; // eviter notice php
620
+            $boucle->descr['sourcefile'] = 'internal';
621
+            $boucle->descr['gram'] = 'html';
622
+
623
+            $boucle = pipeline('pre_boucle', $boucle);
624
+
625
+            if (
626
+                isset($desc['statut'])
627
+                and $desc['statut']
628
+            ) {
629
+                $boucles = [
630
+                    'calculer_langues_utilisees' => $boucle,
631
+                ];
632
+                // generer un nom de fonction "anonyme" unique
633
+                do {
634
+                    $functionname = 'f_calculer_langues_utilisees_' . $boucle->id_table . '_' . time() . '_' . random_int(0, mt_getrandmax());
635
+                } while (function_exists($functionname));
636
+                $code = calculer_boucle('calculer_langues_utilisees', $boucles);
637
+                $code = '$SP=0; $command=array();$command["connect"] = $connect = "' . $serveur . '"; $Pile=array(0=>array());' . "\n" . $code;
638
+                $code = 'function ' . $functionname . '(){' . $code . '};$res = ' . $functionname . '();';
639
+                $res = '';
640
+                eval($code);
641
+                $res = explode(',', $res);
642
+                foreach ($res as $lang) {
643
+                    $langues[$lang] = 1;
644
+                }
645
+            } else {
646
+                $res = sql_select(implode(',', $boucle->select), $boucle->from);
647
+                while ($row = sql_fetch($res)) {
648
+                    $langues[$row['lang']] = 1;
649
+                }
650
+            }
651
+        }
652
+    }
653
+
654
+    $langues = array_filter(array_keys($langues));
655
+    sort($langues);
656
+    $langues = join(',', $langues);
657
+    spip_log("langues utilisees: $langues");
658
+
659
+    return $langues;
660 660
 }
661 661
 
662 662
 /**
@@ -673,9 +673,9 @@  discard block
 block discarded – undo
673 673
  *     incluant les rubriques noeuds et toutes leurs descendances
674 674
  */
675 675
 function calcul_branche_in($id) {
676
-	$calcul_branche_in = charger_fonction('calcul_branche_in', 'inc');
676
+    $calcul_branche_in = charger_fonction('calcul_branche_in', 'inc');
677 677
 
678
-	return $calcul_branche_in($id);
678
+    return $calcul_branche_in($id);
679 679
 }
680 680
 
681 681
 /**
@@ -693,9 +693,9 @@  discard block
 block discarded – undo
693 693
  *     incluant les rubriques transmises et toutes leurs parentées
694 694
  */
695 695
 function calcul_hierarchie_in($id, $tout = true) {
696
-	$calcul_hierarchie_in = charger_fonction('calcul_hierarchie_in', 'inc');
696
+    $calcul_hierarchie_in = charger_fonction('calcul_hierarchie_in', 'inc');
697 697
 
698
-	return $calcul_hierarchie_in($id, $tout);
698
+    return $calcul_hierarchie_in($id, $tout);
699 699
 }
700 700
 
701 701
 
@@ -716,40 +716,40 @@  discard block
 block discarded – undo
716 716
  *     incluant les rubriques noeuds et toutes leurs descendances
717 717
  */
718 718
 function inc_calcul_branche_in_dist($id) {
719
-	static $b = [];
720
-
721
-	// normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN
722
-	if (!is_array($id)) {
723
-		$id = explode(',', $id);
724
-	}
725
-	$id = join(',', array_map('intval', $id));
726
-	if (isset($b[$id])) {
727
-		return $b[$id];
728
-	}
729
-
730
-	// Notre branche commence par la rubrique de depart
731
-	$branche = $r = $id;
732
-
733
-	// On ajoute une generation (les filles de la generation precedente)
734
-	// jusqu'a epuisement, en se protegeant des references circulaires
735
-	$maxiter = 10000;
736
-	while (
737
-		$maxiter-- and $filles = sql_allfetsel(
738
-			'id_rubrique',
739
-			'spip_rubriques',
740
-			sql_in('id_parent', $r) . ' AND ' . sql_in('id_rubrique', $r, 'NOT')
741
-		)
742
-	) {
743
-		$r = join(',', array_column($filles, 'id_rubrique'));
744
-		$branche .= ',' . $r;
745
-	}
746
-
747
-	# securite pour ne pas plomber la conso memoire sur les sites prolifiques
748
-	if (strlen($branche) < 10000) {
749
-		$b[$id] = $branche;
750
-	}
751
-
752
-	return $branche;
719
+    static $b = [];
720
+
721
+    // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN
722
+    if (!is_array($id)) {
723
+        $id = explode(',', $id);
724
+    }
725
+    $id = join(',', array_map('intval', $id));
726
+    if (isset($b[$id])) {
727
+        return $b[$id];
728
+    }
729
+
730
+    // Notre branche commence par la rubrique de depart
731
+    $branche = $r = $id;
732
+
733
+    // On ajoute une generation (les filles de la generation precedente)
734
+    // jusqu'a epuisement, en se protegeant des references circulaires
735
+    $maxiter = 10000;
736
+    while (
737
+        $maxiter-- and $filles = sql_allfetsel(
738
+            'id_rubrique',
739
+            'spip_rubriques',
740
+            sql_in('id_parent', $r) . ' AND ' . sql_in('id_rubrique', $r, 'NOT')
741
+        )
742
+    ) {
743
+        $r = join(',', array_column($filles, 'id_rubrique'));
744
+        $branche .= ',' . $r;
745
+    }
746
+
747
+    # securite pour ne pas plomber la conso memoire sur les sites prolifiques
748
+    if (strlen($branche) < 10000) {
749
+        $b[$id] = $branche;
750
+    }
751
+
752
+    return $branche;
753 753
 }
754 754
 
755 755
 
@@ -771,45 +771,45 @@  discard block
 block discarded – undo
771 771
  *     incluant les rubriques transmises et toutes leurs parentées
772 772
  */
773 773
 function inc_calcul_hierarchie_in_dist($id, $tout = true) {
774
-	static $b = [];
775
-
776
-	// normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN
777
-	if (!is_array($id)) {
778
-		$id = explode(',', $id);
779
-	}
780
-	$id = join(',', array_map('intval', $id));
781
-
782
-	if (isset($b[$id])) {
783
-		// Notre branche commence par la rubrique de depart si $tout=true
784
-		return $tout ? (strlen($b[$id]) ? $b[$id] . ",$id" : $id) : $b[$id];
785
-	}
786
-
787
-	$hier = '';
788
-
789
-	// On ajoute une generation (les filles de la generation precedente)
790
-	// jusqu'a epuisement, en se protegeant des references circulaires
791
-	$ids_nouveaux_parents = $id;
792
-	$maxiter = 10000;
793
-	while (
794
-		$maxiter-- and $parents = sql_allfetsel(
795
-			'id_parent',
796
-			'spip_rubriques',
797
-			sql_in('id_rubrique', $ids_nouveaux_parents) . ' AND ' . sql_in('id_parent', $hier, 'NOT')
798
-		)
799
-	) {
800
-		$ids_nouveaux_parents = join(',', array_column($parents, 'id_parent'));
801
-		$hier = $ids_nouveaux_parents . (strlen($hier) ? ',' . $hier : '');
802
-	}
803
-
804
-	# securite pour ne pas plomber la conso memoire sur les sites prolifiques
805
-	if (strlen($hier) < 10000) {
806
-		$b[$id] = $hier;
807
-	}
808
-
809
-	// Notre branche commence par la rubrique de depart si $tout=true
810
-	$hier = $tout ? (strlen($hier) ? "$hier,$id" : $id) : $hier;
811
-
812
-	return $hier;
774
+    static $b = [];
775
+
776
+    // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN
777
+    if (!is_array($id)) {
778
+        $id = explode(',', $id);
779
+    }
780
+    $id = join(',', array_map('intval', $id));
781
+
782
+    if (isset($b[$id])) {
783
+        // Notre branche commence par la rubrique de depart si $tout=true
784
+        return $tout ? (strlen($b[$id]) ? $b[$id] . ",$id" : $id) : $b[$id];
785
+    }
786
+
787
+    $hier = '';
788
+
789
+    // On ajoute une generation (les filles de la generation precedente)
790
+    // jusqu'a epuisement, en se protegeant des references circulaires
791
+    $ids_nouveaux_parents = $id;
792
+    $maxiter = 10000;
793
+    while (
794
+        $maxiter-- and $parents = sql_allfetsel(
795
+            'id_parent',
796
+            'spip_rubriques',
797
+            sql_in('id_rubrique', $ids_nouveaux_parents) . ' AND ' . sql_in('id_parent', $hier, 'NOT')
798
+        )
799
+    ) {
800
+        $ids_nouveaux_parents = join(',', array_column($parents, 'id_parent'));
801
+        $hier = $ids_nouveaux_parents . (strlen($hier) ? ',' . $hier : '');
802
+    }
803
+
804
+    # securite pour ne pas plomber la conso memoire sur les sites prolifiques
805
+    if (strlen($hier) < 10000) {
806
+        $b[$id] = $hier;
807
+    }
808
+
809
+    // Notre branche commence par la rubrique de depart si $tout=true
810
+    $hier = $tout ? (strlen($hier) ? "$hier,$id" : $id) : $hier;
811
+
812
+    return $hier;
813 813
 }
814 814
 
815 815
 
@@ -827,47 +827,47 @@  discard block
 block discarded – undo
827 827
  * @return void
828 828
  **/
829 829
 function calculer_prochain_postdate($check = false) {
830
-	include_spip('base/abstract_sql');
831
-	if ($check) {
832
-		$postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
833
-			'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : '';
834
-
835
-		$r = sql_select(
836
-			'DISTINCT A.id_rubrique AS id',
837
-			'spip_articles AS A LEFT JOIN spip_rubriques AS R ON A.id_rubrique=R.id_rubrique',
838
-			"R.statut != 'publie' AND A.statut='publie'$postdates"
839
-		);
840
-		while ($row = sql_fetch($r)) {
841
-			publier_branche_rubrique($row['id']);
842
-		}
843
-
844
-		pipeline('trig_calculer_prochain_postdate', '');
845
-	}
846
-
847
-	$t = sql_fetsel(
848
-		'date',
849
-		'spip_articles',
850
-		"statut='publie' AND date > " . sql_quote(date('Y-m-d H:i:s')),
851
-		'',
852
-		'date',
853
-		'1'
854
-	);
855
-
856
-	if ($t) {
857
-		$t = $t['date'];
858
-		if (
859
-			!isset($GLOBALS['meta']['date_prochain_postdate'])
860
-			or $t <> $GLOBALS['meta']['date_prochain_postdate']
861
-		) {
862
-			ecrire_meta('date_prochain_postdate', strtotime($t));
863
-			ecrire_meta('derniere_modif', time());
864
-		}
865
-	} else {
866
-		effacer_meta('date_prochain_postdate');
867
-		ecrire_meta('derniere_modif', time());
868
-	}
869
-
870
-	spip_log("prochain postdate: $t");
830
+    include_spip('base/abstract_sql');
831
+    if ($check) {
832
+        $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ?
833
+            'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : '';
834
+
835
+        $r = sql_select(
836
+            'DISTINCT A.id_rubrique AS id',
837
+            'spip_articles AS A LEFT JOIN spip_rubriques AS R ON A.id_rubrique=R.id_rubrique',
838
+            "R.statut != 'publie' AND A.statut='publie'$postdates"
839
+        );
840
+        while ($row = sql_fetch($r)) {
841
+            publier_branche_rubrique($row['id']);
842
+        }
843
+
844
+        pipeline('trig_calculer_prochain_postdate', '');
845
+    }
846
+
847
+    $t = sql_fetsel(
848
+        'date',
849
+        'spip_articles',
850
+        "statut='publie' AND date > " . sql_quote(date('Y-m-d H:i:s')),
851
+        '',
852
+        'date',
853
+        '1'
854
+    );
855
+
856
+    if ($t) {
857
+        $t = $t['date'];
858
+        if (
859
+            !isset($GLOBALS['meta']['date_prochain_postdate'])
860
+            or $t <> $GLOBALS['meta']['date_prochain_postdate']
861
+        ) {
862
+            ecrire_meta('date_prochain_postdate', strtotime($t));
863
+            ecrire_meta('derniere_modif', time());
864
+        }
865
+    } else {
866
+        effacer_meta('date_prochain_postdate');
867
+        ecrire_meta('derniere_modif', time());
868
+    }
869
+
870
+    spip_log("prochain postdate: $t");
871 871
 }
872 872
 
873 873
 /**
@@ -892,62 +892,62 @@  discard block
 block discarded – undo
892 892
  */
893 893
 function creer_rubrique_nommee($titre, $id_parent = 0, $serveur = '') {
894 894
 
895
-	// eclater l'arborescence demandee
896
-	// echapper les </multi> et autres balises fermantes html
897
-	$titre = preg_replace(',</([a-z][^>]*)>,ims', "<@\\1>", $titre);
898
-	$arbo = explode('/', preg_replace(',^/,', '', $titre));
899
-	include_spip('base/abstract_sql');
900
-	foreach ($arbo as $titre) {
901
-		// retablir les </multi> et autres balises fermantes html
902
-		$titre = preg_replace(',<@([a-z][^>]*)>,ims', "</\\1>", $titre);
903
-		$r = sql_getfetsel(
904
-			'id_rubrique',
905
-			'spip_rubriques',
906
-			'titre = ' . sql_quote($titre) . ' AND id_parent=' . intval($id_parent),
907
-			$groupby = [],
908
-			$orderby = [],
909
-			$limit = '',
910
-			$having = [],
911
-			$serveur
912
-		);
913
-		if ($r !== null) {
914
-			$id_parent = $r;
915
-		} else {
916
-			$id_rubrique = sql_insertq('spip_rubriques', [
917
-					'titre' => $titre,
918
-					'id_parent' => $id_parent,
919
-					'statut' => 'prepa'
920
-				], $desc = [], $serveur);
921
-			if ($id_parent > 0) {
922
-				$data = sql_fetsel(
923
-					'id_secteur,lang',
924
-					'spip_rubriques',
925
-					"id_rubrique=$id_parent",
926
-					$groupby = [],
927
-					$orderby = [],
928
-					$limit = '',
929
-					$having = [],
930
-					$serveur
931
-				);
932
-				$id_secteur = $data['id_secteur'];
933
-				$lang = $data['lang'];
934
-			} else {
935
-				$id_secteur = $id_rubrique;
936
-				$lang = $GLOBALS['meta']['langue_site'];
937
-			}
938
-
939
-			sql_updateq(
940
-				'spip_rubriques',
941
-				['id_secteur' => $id_secteur, 'lang' => $lang],
942
-				'id_rubrique=' . intval($id_rubrique),
943
-				[],
944
-				$serveur
945
-			);
946
-
947
-			// pour la recursion
948
-			$id_parent = $id_rubrique;
949
-		}
950
-	}
951
-
952
-	return intval($id_parent);
895
+    // eclater l'arborescence demandee
896
+    // echapper les </multi> et autres balises fermantes html
897
+    $titre = preg_replace(',</([a-z][^>]*)>,ims', "<@\\1>", $titre);
898
+    $arbo = explode('/', preg_replace(',^/,', '', $titre));
899
+    include_spip('base/abstract_sql');
900
+    foreach ($arbo as $titre) {
901
+        // retablir les </multi> et autres balises fermantes html
902
+        $titre = preg_replace(',<@([a-z][^>]*)>,ims', "</\\1>", $titre);
903
+        $r = sql_getfetsel(
904
+            'id_rubrique',
905
+            'spip_rubriques',
906
+            'titre = ' . sql_quote($titre) . ' AND id_parent=' . intval($id_parent),
907
+            $groupby = [],
908
+            $orderby = [],
909
+            $limit = '',
910
+            $having = [],
911
+            $serveur
912
+        );
913
+        if ($r !== null) {
914
+            $id_parent = $r;
915
+        } else {
916
+            $id_rubrique = sql_insertq('spip_rubriques', [
917
+                    'titre' => $titre,
918
+                    'id_parent' => $id_parent,
919
+                    'statut' => 'prepa'
920
+                ], $desc = [], $serveur);
921
+            if ($id_parent > 0) {
922
+                $data = sql_fetsel(
923
+                    'id_secteur,lang',
924
+                    'spip_rubriques',
925
+                    "id_rubrique=$id_parent",
926
+                    $groupby = [],
927
+                    $orderby = [],
928
+                    $limit = '',
929
+                    $having = [],
930
+                    $serveur
931
+                );
932
+                $id_secteur = $data['id_secteur'];
933
+                $lang = $data['lang'];
934
+            } else {
935
+                $id_secteur = $id_rubrique;
936
+                $lang = $GLOBALS['meta']['langue_site'];
937
+            }
938
+
939
+            sql_updateq(
940
+                'spip_rubriques',
941
+                ['id_secteur' => $id_secteur, 'lang' => $lang],
942
+                'id_rubrique=' . intval($id_rubrique),
943
+                [],
944
+                $serveur
945
+            );
946
+
947
+            // pour la recursion
948
+            $id_parent = $id_rubrique;
949
+        }
950
+    }
951
+
952
+    return intval($id_parent);
953 953
 }
Please login to merge, or discard this patch.
ecrire/lang/ecrire_pt_br.php 1 patch
Indentation   +839 added lines, -839 removed lines patch added patch discarded remove patch
@@ -4,879 +4,879 @@
 block discarded – undo
4 4
 // ** ne pas modifier le fichier **
5 5
 
6 6
 if (!defined('_ECRIRE_INC_VERSION')) {
7
-	return;
7
+    return;
8 8
 }
9 9
 
10 10
 $GLOBALS[$GLOBALS['idx_lang']] = array(
11 11
 
12
-	// A
13
-	'activer_plugin' => 'Ativar o plugin',
14
-	'affichage' => 'Exibição',
15
-	'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.',
16
-	'annuler_recherche' => 'Cancelar a busca',
17
-	'auteur' => 'Autor:',
18
-	'avis_acces_interdit' => 'Acesso negado.',
19
-	'avis_acces_interdit_prive' => 'Você não está autorizado a acessar a página <b>@exec@</b>.',
20
-	'avis_article_modifie' => 'Atenção, @nom_auteur_modif@ editou esta matéria há @date_diff@ minutos',
21
-	'avis_aucun_resultat' => 'Nenhum resultado.',
22
-	'avis_base_inaccessible' => 'Não foi possível conectar com a base de dados @base@.',
23
-	'avis_chemin_invalide_1' => 'O caminho que você escolheu',
24
-	'avis_chemin_invalide_2' => 'não parece válido. Por favor, volte à página anterior e verifique as informações fornecidas.',
25
-	'avis_connexion_echec_1' => 'A conexão com a base de dados falhou.',
26
-	'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
27
-	'avis_connexion_echec_3' => '<b>N.B.</b> Em diversos servidores, você precisa <b>solicitar</b> a ativação do seu acesso à base de dados antes de poder utilizá-la. Se você não consegue se conectar, verifique se você efetuou esse pedido.',
28
-	'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.',
29
-	'avis_connexion_erreur_fichier_cle_manquant_1' => 'A instalação deve ser realizada por um webmaster com um backup das chaves e sua senha.',
30
-	'avis_connexion_erreur_fichier_cle_manquant_2' => 'A instalação deve ser feita por um webmaster com um backup das chaves',
31
-	'avis_connexion_erreur_nom_base' => 'O nome da base só pode conter letras, números e traços',
32
-	'avis_connexion_ldap_echec_1' => 'A conexão ao servidor LDAP falhou.',
33
-	'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
34
-	'avis_connexion_ldap_echec_3' => 'Opcionalmente, não use o suporte LDAP para importar os usuários.',
35
-	'avis_deplacement_rubrique' => 'Atenção! Esta seção contém @contient_breves@ nota@scb@: se você a transferir, por favor, marque este quadrado.',
36
-	'avis_erreur_connexion_mysql' => 'Erro de conexão SQL',
37
-	'avis_erreur_creation_compte' => 'Erro durante a inicialização da conta',
38
-	'avis_espace_interdit' => '<b>Área interdita</b> <div>O SPIP já está instalado.</div>',
39
-	'avis_lecture_noms_bases_1' => 'O programa de instalação não pôde ler os nomes das bases de dados instaladas.',
40
-	'avis_lecture_noms_bases_2' => 'Ou nenhuma base de dados esta disponível, ou a função que permite listar as bases foi desativada por razões de segurança (o que é o caso de diversos provedores de hospedagem).',
41
-	'avis_lecture_noms_bases_3' => 'No segundo caso, é provável que uma base de dados com o nome do seu login possa ser utilizada:',
42
-	'avis_non_acces_page' => 'Você não tem acesso a esta página.',
43
-	'avis_operation_echec' => 'A operação falhou.',
44
-	'avis_operation_impossible' => 'Operação impossível',
45
-	'avis_suppression_base' => 'ATENÇÃO, a supressão dos dados é irreversível',
12
+    // A
13
+    'activer_plugin' => 'Ativar o plugin',
14
+    'affichage' => 'Exibição',
15
+    'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.',
16
+    'annuler_recherche' => 'Cancelar a busca',
17
+    'auteur' => 'Autor:',
18
+    'avis_acces_interdit' => 'Acesso negado.',
19
+    'avis_acces_interdit_prive' => 'Você não está autorizado a acessar a página <b>@exec@</b>.',
20
+    'avis_article_modifie' => 'Atenção, @nom_auteur_modif@ editou esta matéria há @date_diff@ minutos',
21
+    'avis_aucun_resultat' => 'Nenhum resultado.',
22
+    'avis_base_inaccessible' => 'Não foi possível conectar com a base de dados @base@.',
23
+    'avis_chemin_invalide_1' => 'O caminho que você escolheu',
24
+    'avis_chemin_invalide_2' => 'não parece válido. Por favor, volte à página anterior e verifique as informações fornecidas.',
25
+    'avis_connexion_echec_1' => 'A conexão com a base de dados falhou.',
26
+    'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
27
+    'avis_connexion_echec_3' => '<b>N.B.</b> Em diversos servidores, você precisa <b>solicitar</b> a ativação do seu acesso à base de dados antes de poder utilizá-la. Se você não consegue se conectar, verifique se você efetuou esse pedido.',
28
+    'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.',
29
+    'avis_connexion_erreur_fichier_cle_manquant_1' => 'A instalação deve ser realizada por um webmaster com um backup das chaves e sua senha.',
30
+    'avis_connexion_erreur_fichier_cle_manquant_2' => 'A instalação deve ser feita por um webmaster com um backup das chaves',
31
+    'avis_connexion_erreur_nom_base' => 'O nome da base só pode conter letras, números e traços',
32
+    'avis_connexion_ldap_echec_1' => 'A conexão ao servidor LDAP falhou.',
33
+    'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que você forneceu.',
34
+    'avis_connexion_ldap_echec_3' => 'Opcionalmente, não use o suporte LDAP para importar os usuários.',
35
+    'avis_deplacement_rubrique' => 'Atenção! Esta seção contém @contient_breves@ nota@scb@: se você a transferir, por favor, marque este quadrado.',
36
+    'avis_erreur_connexion_mysql' => 'Erro de conexão SQL',
37
+    'avis_erreur_creation_compte' => 'Erro durante a inicialização da conta',
38
+    'avis_espace_interdit' => '<b>Área interdita</b> <div>O SPIP já está instalado.</div>',
39
+    'avis_lecture_noms_bases_1' => 'O programa de instalação não pôde ler os nomes das bases de dados instaladas.',
40
+    'avis_lecture_noms_bases_2' => 'Ou nenhuma base de dados esta disponível, ou a função que permite listar as bases foi desativada por razões de segurança (o que é o caso de diversos provedores de hospedagem).',
41
+    'avis_lecture_noms_bases_3' => 'No segundo caso, é provável que uma base de dados com o nome do seu login possa ser utilizada:',
42
+    'avis_non_acces_page' => 'Você não tem acesso a esta página.',
43
+    'avis_operation_echec' => 'A operação falhou.',
44
+    'avis_operation_impossible' => 'Operação impossível',
45
+    'avis_suppression_base' => 'ATENÇÃO, a supressão dos dados é irreversível',
46 46
 
47
-	// B
48
-	'bouton_acces_ldap' => 'Incluir o acesso ao LDAP',
49
-	'bouton_ajouter' => 'Incluir',
50
-	'bouton_annuler' => 'Anular',
51
-	'bouton_cache_activer' => 'Reativar o cache',
52
-	'bouton_cache_desactiver' => 'Desativar temporariamente o cache',
53
-	'bouton_demande_publication' => 'Solicitar a publicação desta matéria',
54
-	'bouton_desactive_tout' => 'Desativar tudo',
55
-	'bouton_desinstaller' => 'Desinstalar',
56
-	'bouton_effacer_tout' => 'Apagar TUDO',
57
-	'bouton_envoyer_message' => 'Mensagem definitiva: enviar',
58
-	'bouton_fermer' => 'Fechar',
59
-	'bouton_mettre_a_jour_base' => 'Atualizar a base de dados',
60
-	'bouton_modifier' => 'Alterar',
61
-	'bouton_radio_afficher' => 'Exibir',
62
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Exibir nas listas de redatores conectados',
63
-	'bouton_radio_envoi_annonces_adresse' => 'Enviar os avisos para o endereço:',
64
-	'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista de novidades',
65
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não exibir na lista de redatores',
66
-	'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar os avisos editoriais',
67
-	'bouton_redirection' => 'REDIRECIONAMENTO',
68
-	'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Reiniciar aos valores padrão',
69
-	'bouton_relancer_inscription' => 'Reiniciar o registro',
70
-	'bouton_relancer_inscriptions' => 'Reiniciar os registros',
71
-	'bouton_relancer_installation' => 'Reiniciar a instalação',
72
-	'bouton_reset_password' => 'Criar uma nova senha e enviá-la por e-mail',
73
-	'bouton_suivant' => 'Avançar',
74
-	'bouton_tenter_recuperation' => 'Tentar uma reparação',
75
-	'bouton_test_proxy' => 'Testar o proxy',
76
-	'bouton_vider_cache' => 'Limpar o cache',
47
+    // B
48
+    'bouton_acces_ldap' => 'Incluir o acesso ao LDAP',
49
+    'bouton_ajouter' => 'Incluir',
50
+    'bouton_annuler' => 'Anular',
51
+    'bouton_cache_activer' => 'Reativar o cache',
52
+    'bouton_cache_desactiver' => 'Desativar temporariamente o cache',
53
+    'bouton_demande_publication' => 'Solicitar a publicação desta matéria',
54
+    'bouton_desactive_tout' => 'Desativar tudo',
55
+    'bouton_desinstaller' => 'Desinstalar',
56
+    'bouton_effacer_tout' => 'Apagar TUDO',
57
+    'bouton_envoyer_message' => 'Mensagem definitiva: enviar',
58
+    'bouton_fermer' => 'Fechar',
59
+    'bouton_mettre_a_jour_base' => 'Atualizar a base de dados',
60
+    'bouton_modifier' => 'Alterar',
61
+    'bouton_radio_afficher' => 'Exibir',
62
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Exibir nas listas de redatores conectados',
63
+    'bouton_radio_envoi_annonces_adresse' => 'Enviar os avisos para o endereço:',
64
+    'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista de novidades',
65
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não exibir na lista de redatores',
66
+    'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar os avisos editoriais',
67
+    'bouton_redirection' => 'REDIRECIONAMENTO',
68
+    'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Reiniciar aos valores padrão',
69
+    'bouton_relancer_inscription' => 'Reiniciar o registro',
70
+    'bouton_relancer_inscriptions' => 'Reiniciar os registros',
71
+    'bouton_relancer_installation' => 'Reiniciar a instalação',
72
+    'bouton_reset_password' => 'Criar uma nova senha e enviá-la por e-mail',
73
+    'bouton_suivant' => 'Avançar',
74
+    'bouton_tenter_recuperation' => 'Tentar uma reparação',
75
+    'bouton_test_proxy' => 'Testar o proxy',
76
+    'bouton_vider_cache' => 'Limpar o cache',
77 77
 
78
-	// C
79
-	'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.',
80
-	'calendrier_synchro' => 'Se você usa um programa de agenda compatível com <b>iCal</b>, você pode sincronizá-lo com as informações deste site.',
81
-	'config_activer_champs' => 'Ativar os campos a seguir',
82
-	'config_choix_base_sup' => 'indicar uma base neste servidor',
83
-	'config_erreur_base_sup' => 'O SPIP não tem acesso à lista de bases acessíveis',
84
-	'config_info_base_sup' => 'Se você tiver outras bases de dados para serem consultadas via SPIP, em seu servidor SQL ou em outro, o formulário abaixo permite configurá-las. Se você deixar determinados campos em branco, os dados de conexão da base principal serão utilizados.',
85
-	'config_info_base_sup_disponibles' => 'Bases suplementares já consultáveis:',
86
-	'config_info_enregistree' => 'A nova configuração foi gravada',
87
-	'config_info_logos' => 'Cada elemento do site pode ter um ícone, bem como um ícone de «mouseOver»',
88
-	'config_info_logos_utiliser' => 'Usar os ícones',
89
-	'config_info_logos_utiliser_non' => 'Não usar o ícones',
90
-	'config_info_logos_utiliser_survol' => 'Usar os ícones de mouseOver',
91
-	'config_info_logos_utiliser_survol_non' => 'Não usar os ícones de mouseOver',
92
-	'config_info_redirection' => 'Ao ativar esta opção, você poderá criar matérias virtuais, meras referências a matérias publicadas em outros sites ou fora do SPIP.',
93
-	'config_redirection' => 'Matérias virtuais',
94
-	'config_titre_base_sup' => 'Configuração de uma base suplementar',
95
-	'config_titre_base_sup_choix' => 'Escolha uma base suplementar',
96
-	'connexion_ldap' => 'Conexão:',
97
-	'creer_et_associer_un_auteur' => 'Criar e vincular um autor',
78
+    // C
79
+    'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.',
80
+    'calendrier_synchro' => 'Se você usa um programa de agenda compatível com <b>iCal</b>, você pode sincronizá-lo com as informações deste site.',
81
+    'config_activer_champs' => 'Ativar os campos a seguir',
82
+    'config_choix_base_sup' => 'indicar uma base neste servidor',
83
+    'config_erreur_base_sup' => 'O SPIP não tem acesso à lista de bases acessíveis',
84
+    'config_info_base_sup' => 'Se você tiver outras bases de dados para serem consultadas via SPIP, em seu servidor SQL ou em outro, o formulário abaixo permite configurá-las. Se você deixar determinados campos em branco, os dados de conexão da base principal serão utilizados.',
85
+    'config_info_base_sup_disponibles' => 'Bases suplementares já consultáveis:',
86
+    'config_info_enregistree' => 'A nova configuração foi gravada',
87
+    'config_info_logos' => 'Cada elemento do site pode ter um ícone, bem como um ícone de «mouseOver»',
88
+    'config_info_logos_utiliser' => 'Usar os ícones',
89
+    'config_info_logos_utiliser_non' => 'Não usar o ícones',
90
+    'config_info_logos_utiliser_survol' => 'Usar os ícones de mouseOver',
91
+    'config_info_logos_utiliser_survol_non' => 'Não usar os ícones de mouseOver',
92
+    'config_info_redirection' => 'Ao ativar esta opção, você poderá criar matérias virtuais, meras referências a matérias publicadas em outros sites ou fora do SPIP.',
93
+    'config_redirection' => 'Matérias virtuais',
94
+    'config_titre_base_sup' => 'Configuração de uma base suplementar',
95
+    'config_titre_base_sup_choix' => 'Escolha uma base suplementar',
96
+    'connexion_ldap' => 'Conexão:',
97
+    'creer_et_associer_un_auteur' => 'Criar e vincular um autor',
98 98
 
99
-	// D
100
-	'date_mot_heures' => 'horas',
99
+    // D
100
+    'date_mot_heures' => 'horas',
101 101
 
102
-	// E
103
-	'ecran_connexion_couleur_principale' => 'Cor principal',
104
-	'ecran_connexion_image_fond' => 'Imagem de fundo',
105
-	'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)',
106
-	'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão',
107
-	'ecran_connexion_titre' => 'Tela de conexão',
108
-	'ecran_securite' => ' + tela de segurança @version@',
109
-	'email' => 'e-mail',
110
-	'email_2' => 'e-mail:',
111
-	'en_savoir_plus' => 'Saiba mais',
112
-	'entree_adresse_annuaire' => 'Endereço do catálogo',
113
-	'entree_adresse_email' => 'Seu endereço de e-mail',
114
-	'entree_adresse_email_2' => 'Endereço de e-mail',
115
-	'entree_base_donnee_1' => 'Endereço da base de dados',
116
-	'entree_base_donnee_2' => '(Frequentemente este endereço corresponde ao do seu site, às vezes ele corresponde ao nome «localhost», algumas vezes ele pode ser deixado completamente em branco.)',
117
-	'entree_biographie' => 'Biografia curta em poucas palavras.',
118
-	'entree_chemin_acces' => '<b>Informe</b> o caminho de acesso:',
119
-	'entree_cle_pgp' => 'Sua chave PGP',
120
-	'entree_cle_pgp_2' => 'Chave PGP',
121
-	'entree_contenu_rubrique' => '(Conteúdo da seção em poucas palavras.)',
122
-	'entree_identifiants_connexion' => 'Seus dados de conexão...',
123
-	'entree_identifiants_connexion_2' => 'Dados de conexão',
124
-	'entree_informations_connexion_ldap' => 'Informe neste formulário os dados de conexão ao seu catálogo LDAP.
102
+    // E
103
+    'ecran_connexion_couleur_principale' => 'Cor principal',
104
+    'ecran_connexion_image_fond' => 'Imagem de fundo',
105
+    'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)',
106
+    'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão',
107
+    'ecran_connexion_titre' => 'Tela de conexão',
108
+    'ecran_securite' => ' + tela de segurança @version@',
109
+    'email' => 'e-mail',
110
+    'email_2' => 'e-mail:',
111
+    'en_savoir_plus' => 'Saiba mais',
112
+    'entree_adresse_annuaire' => 'Endereço do catálogo',
113
+    'entree_adresse_email' => 'Seu endereço de e-mail',
114
+    'entree_adresse_email_2' => 'Endereço de e-mail',
115
+    'entree_base_donnee_1' => 'Endereço da base de dados',
116
+    'entree_base_donnee_2' => '(Frequentemente este endereço corresponde ao do seu site, às vezes ele corresponde ao nome «localhost», algumas vezes ele pode ser deixado completamente em branco.)',
117
+    'entree_biographie' => 'Biografia curta em poucas palavras.',
118
+    'entree_chemin_acces' => '<b>Informe</b> o caminho de acesso:',
119
+    'entree_cle_pgp' => 'Sua chave PGP',
120
+    'entree_cle_pgp_2' => 'Chave PGP',
121
+    'entree_contenu_rubrique' => '(Conteúdo da seção em poucas palavras.)',
122
+    'entree_identifiants_connexion' => 'Seus dados de conexão...',
123
+    'entree_identifiants_connexion_2' => 'Dados de conexão',
124
+    'entree_informations_connexion_ldap' => 'Informe neste formulário os dados de conexão ao seu catálogo LDAP.
125 125
 Estas informações deverão ser fornecidas pelo administrador do sistema ou da rede.',
126
-	'entree_infos_perso' => 'Quem é você?',
127
-	'entree_infos_perso_2' => 'Quem é o autor?',
128
-	'entree_interieur_rubrique' => 'No interior da seção:',
129
-	'entree_liens_sites' => '<b>Link hipertexto</b> (referência, site a visitar...)',
130
-	'entree_login' => 'Seu login',
131
-	'entree_login_connexion_1' => 'O login de conexão',
132
-	'entree_login_connexion_2' => '(Frequentemente corresponde ao seu login para acesso por FTP; às vezes pode ser deixado em branco)',
133
-	'entree_mot_passe' => 'Sua senha',
134
-	'entree_mot_passe_1' => 'A senha de conexão',
135
-	'entree_mot_passe_2' => '(Frequentemente corresponde à sua senha para acesso por FTP; às vezes pode ser deixado em branco)',
136
-	'entree_nom_fichier' => 'Por favor, informe o nome do arquivo @texte_compresse@:',
137
-	'entree_nom_pseudo' => 'Seu nome ou apelido',
138
-	'entree_nom_pseudo_1' => '(Seu nome ou apelido)',
139
-	'entree_nom_pseudo_2' => 'Nome ou apelido',
140
-	'entree_nom_site' => 'O nome do seu site',
141
-	'entree_nom_site_2' => 'Nome do site do autor',
142
-	'entree_nouveau_passe' => 'Nova senha',
143
-	'entree_passe_ldap' => 'Senha',
144
-	'entree_port_annuaire' => 'O número da porta do catálogo',
145
-	'entree_signature' => 'Assinatura',
146
-	'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />',
147
-	'entree_url' => 'O endereço (URL) do seu site',
148
-	'entree_url_2' => 'Endereço (URL) do site',
149
-	'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome',
150
-	'erreur_contenu_suspect' => 'Texto escapado',
151
-	'erreur_email_deja_existant' => 'Esse endereço de email já está em uso.',
152
-	'erreur_nom_connect_incorrect' => 'Este nome de servidor não é autorizado',
153
-	'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ faltando no tag @balise@.',
154
-	'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, você pode desativá-lo.',
155
-	'erreur_plugin_fichier_absent' => 'Arquivo ausente',
156
-	'erreur_plugin_fichier_def_absent' => 'Arquivo de definição ausente',
157
-	'erreur_plugin_nom_fonction_interdit' => 'Nome de função não permitido',
158
-	'erreur_plugin_nom_manquant' => 'Nome do plugin ausente',
159
-	'erreur_plugin_prefix_manquant' => 'Área de nomeação do plugin não definida',
160
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; ausente no arquivo de definição',
161
-	'erreur_plugin_version_manquant' => 'Versão do plugin ausente',
162
-	'erreur_type_fichier' => 'Tipo de arquivo incorreto',
126
+    'entree_infos_perso' => 'Quem é você?',
127
+    'entree_infos_perso_2' => 'Quem é o autor?',
128
+    'entree_interieur_rubrique' => 'No interior da seção:',
129
+    'entree_liens_sites' => '<b>Link hipertexto</b> (referência, site a visitar...)',
130
+    'entree_login' => 'Seu login',
131
+    'entree_login_connexion_1' => 'O login de conexão',
132
+    'entree_login_connexion_2' => '(Frequentemente corresponde ao seu login para acesso por FTP; às vezes pode ser deixado em branco)',
133
+    'entree_mot_passe' => 'Sua senha',
134
+    'entree_mot_passe_1' => 'A senha de conexão',
135
+    'entree_mot_passe_2' => '(Frequentemente corresponde à sua senha para acesso por FTP; às vezes pode ser deixado em branco)',
136
+    'entree_nom_fichier' => 'Por favor, informe o nome do arquivo @texte_compresse@:',
137
+    'entree_nom_pseudo' => 'Seu nome ou apelido',
138
+    'entree_nom_pseudo_1' => '(Seu nome ou apelido)',
139
+    'entree_nom_pseudo_2' => 'Nome ou apelido',
140
+    'entree_nom_site' => 'O nome do seu site',
141
+    'entree_nom_site_2' => 'Nome do site do autor',
142
+    'entree_nouveau_passe' => 'Nova senha',
143
+    'entree_passe_ldap' => 'Senha',
144
+    'entree_port_annuaire' => 'O número da porta do catálogo',
145
+    'entree_signature' => 'Assinatura',
146
+    'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />',
147
+    'entree_url' => 'O endereço (URL) do seu site',
148
+    'entree_url_2' => 'Endereço (URL) do site',
149
+    'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome',
150
+    'erreur_contenu_suspect' => 'Texto escapado',
151
+    'erreur_email_deja_existant' => 'Esse endereço de email já está em uso.',
152
+    'erreur_nom_connect_incorrect' => 'Este nome de servidor não é autorizado',
153
+    'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ faltando no tag @balise@.',
154
+    'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, você pode desativá-lo.',
155
+    'erreur_plugin_fichier_absent' => 'Arquivo ausente',
156
+    'erreur_plugin_fichier_def_absent' => 'Arquivo de definição ausente',
157
+    'erreur_plugin_nom_fonction_interdit' => 'Nome de função não permitido',
158
+    'erreur_plugin_nom_manquant' => 'Nome do plugin ausente',
159
+    'erreur_plugin_prefix_manquant' => 'Área de nomeação do plugin não definida',
160
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; ausente no arquivo de definição',
161
+    'erreur_plugin_version_manquant' => 'Versão do plugin ausente',
162
+    'erreur_type_fichier' => 'Tipo de arquivo incorreto',
163 163
 
164
-	// H
165
-	'htaccess_a_simuler' => 'Aviso: a configuração do seu servidor HTTP não leva em conta os arquivos @htaccess@. Para poder garantir um bom nível de segurança, é preciso que você altere esta configuração, ou que as constantes @constantes@ (definíveis no arquivo mes_options.php) tenham como valor os diretórios abaixo de @document_root@.',
166
-	'htaccess_inoperant' => 'htaccess inoperante',
164
+    // H
165
+    'htaccess_a_simuler' => 'Aviso: a configuração do seu servidor HTTP não leva em conta os arquivos @htaccess@. Para poder garantir um bom nível de segurança, é preciso que você altere esta configuração, ou que as constantes @constantes@ (definíveis no arquivo mes_options.php) tenham como valor os diretórios abaixo de @document_root@.',
166
+    'htaccess_inoperant' => 'htaccess inoperante',
167 167
 
168
-	// I
169
-	'ical_info1' => 'Esta página apresenta diversos métodos para se manter a par da atividade deste site.',
170
-	'ical_info2' => 'Para mais informações sobre todas estas técnicas, não deixe de consultar <a href="@spipnet@">a documentação do SPIP</a>.',
171
-	'ical_info_calendrier' => 'Dois calendários estão à sua disposição. O primeiro é um mapa do site anunciando todas as matérias publicadas. O segundo contém os avisos editoriais bem como suas últimas mensagens privadas: ele lhe é reservado graças a uma chave pessoal, que você pode alterar a qualquer momento ao renovar a sua senha.',
172
-	'ical_methode_http' => 'Transferência',
173
-	'ical_methode_webcal' => 'Sincronização (webcal://)',
174
-	'ical_texte_prive' => 'Este calendário, de uso estritamente pessoal, o informa sobre a atividade editorial privada deste site (tarefas e encontros pessoais, matérias e notas propostas...).',
175
-	'ical_texte_public' => 'Este calendário permite-lhe acompanhar a atividade pública deste site (matérias e notas publicadas).',
176
-	'ical_texte_rss' => 'Você pode sindicar as novidades deste site em qualquer leitor de arquivos em formato XML/RSS (Rich Site Summary). É também o formato que permite ao SPIP ler as novidades publicadas em outros sites que utilizem um formato de troca de informações compatível (sites sindicados).',
177
-	'ical_titre_js' => 'Javascript',
178
-	'ical_titre_mailing' => 'Mailing-list',
179
-	'ical_titre_rss' => 'Arquivos de sindicação',
180
-	'icone_accueil' => 'Página Inicial',
181
-	'icone_activer_cookie' => 'Ativar o coockie de correspondência',
182
-	'icone_activite' => 'Atividade',
183
-	'icone_admin_plugin' => 'Gerenciamento dos plugins',
184
-	'icone_administration' => 'Manutenção',
185
-	'icone_afficher_auteurs' => 'Exibir os autores',
186
-	'icone_afficher_visiteurs' => 'Exibir os visitantes',
187
-	'icone_arret_discussion' => 'Não participar mais desta discussão',
188
-	'icone_calendrier' => 'Calendário',
189
-	'icone_configuration' => 'Configuração',
190
-	'icone_creer_auteur' => 'Criar um novo autor e vinculá-lo a esta matéria',
191
-	'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a esta matéria',
192
-	'icone_creer_rubrique_2' => 'Criar uma nova seção',
193
-	'icone_developpement' => 'Desenvolvimento',
194
-	'icone_edition' => 'Edição',
195
-	'icone_ma_langue' => 'Meu idioma',
196
-	'icone_mes_infos' => 'Minhas informações',
197
-	'icone_mes_preferences' => 'Minhas preferências',
198
-	'icone_modifier_article' => 'Editar esta matéria',
199
-	'icone_modifier_rubrique' => 'Editar esta seção',
200
-	'icone_publication' => 'Publicação',
201
-	'icone_relancer_signataire' => 'Reconfirmar o assinante',
202
-	'icone_retour' => 'Voltar',
203
-	'icone_retour_article' => 'Voltar para a matéria',
204
-	'icone_squelette' => 'Templates',
205
-	'icone_suivi_publication' => 'Acompanhamento da publicação',
206
-	'icone_supprimer_cookie' => 'Excluir o cookie de correspondência',
207
-	'icone_supprimer_rubrique' => 'Excluir esta seção',
208
-	'icone_supprimer_signature' => 'Excluir esta assinatura',
209
-	'icone_valider_signature' => 'Validar esta assinatura',
210
-	'image_administrer_rubrique' => 'Você pode administrar esta seção',
211
-	'impossible_modifier_login_auteur' => 'Não foi possível alterar o login.',
212
-	'impossible_modifier_pass_auteur' => 'Não foi possível alterar a senha.',
213
-	'info_1_article' => '1 matéria',
214
-	'info_1_auteur' => '1 autor',
215
-	'info_1_message' => '1 mensagem',
216
-	'info_1_mot_cle' => '1 palavra-chave',
217
-	'info_1_rubrique' => '1 seção',
218
-	'info_1_visiteur' => '1 visitante',
219
-	'info_activer_cookie' => 'Você pode ativar um <b>cookie de correspondência</b>, que lhe permitirá passar facilmente do site público para o site privado.',
220
-	'info_activer_menu_developpement' => 'Exibir o menu Desenvolvimento',
221
-	'info_admin_etre_webmestre' => 'Me conceder direitos de webmaster',
222
-	'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>',
223
-	'info_admin_statuer_webmestre' => 'Dar a este administrador os direitos de webmaster',
224
-	'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>',
225
-	'info_administrateur' => 'Administrador',
226
-	'info_administrateur_1' => 'Administrador',
227
-	'info_administrateur_2' => 'do site (<i>use com cuidado</i>)',
228
-	'info_administrateur_site_01' => 'Se você é administrador do site, por favor,',
229
-	'info_administrateur_site_02' => 'clique neste link',
230
-	'info_administrateurs' => 'Administradores',
231
-	'info_administrer_rubrique' => 'Você pode administrar esta seção',
232
-	'info_adresse' => 'no endereço:',
233
-	'info_adresse_desinscription' => 'Endereço da desinscrição:',
234
-	'info_adresse_url' => 'Endereço (URL) do site público',
235
-	'info_afficher_par_nb' => 'Exibir por',
236
-	'info_aide_en_ligne' => 'Ajuda online SPIP',
237
-	'info_ajout_image' => 'Assim que você incluir imagens e documentos anexados a uma matéria, o SPIP pode criar para você, automaticamente, ícones (miniaturas) das imagens inseridas. Isto permite, por exemplo, criar automaticamente uma galeria ou um portfólio.',
238
-	'info_ajouter_rubrique' => 'Incluir outra seção para administrar:',
239
-	'info_annonce_nouveautes' => 'Aviso das novidades',
240
-	'info_article' => 'matéria',
241
-	'info_article_2' => 'matérias',
242
-	'info_article_a_paraitre' => 'As matérias pós-datadas para exibição',
243
-	'info_articles_02' => 'matérias',
244
-	'info_articles_2' => 'Matérias',
245
-	'info_articles_auteur' => 'As matérias deste autor',
246
-	'info_articles_miens' => 'Minhas matérias',
247
-	'info_articles_tous' => 'Todas as matérias',
248
-	'info_articles_trouves' => 'Matérias encontradas',
249
-	'info_attente_validation' => 'Suas matérias aguardando validação',
250
-	'info_aucun_article' => 'Nenhuma matéria',
251
-	'info_aucun_auteur' => 'Nenhum autor',
252
-	'info_aucun_message' => 'Nenhuma mensagem',
253
-	'info_aucun_rubrique' => 'Nenhuma seção',
254
-	'info_aujourdhui' => 'Hoje:',
255
-	'info_auteur_gere_rubriques' => 'Este autor gerencia as seções a seguir:',
256
-	'info_auteur_gere_toutes_rubriques' => 'Este autor gerencia <b>todas as seções</b>',
257
-	'info_auteur_gere_toutes_rubriques_2' => 'Eu gerencio <b>todas as seções</b>',
258
-	'info_auteurs' => 'Os autores',
259
-	'info_auteurs_par_tri' => 'Autores@partri@',
260
-	'info_auteurs_trouves' => 'Autores encontrados',
261
-	'info_authentification_externe' => 'Autenticação externa',
262
-	'info_avertissement' => 'Aviso',
263
-	'info_barre_outils' => 'com sua barra de ferramentas?',
264
-	'info_base_installee' => 'A estrutura da sua base de dados foi instalada.',
265
-	'info_bio' => 'Biografia',
266
-	'info_cache_desactive' => 'O cache está temporariamente desativado.',
267
-	'info_chapeau' => 'Introdução',
268
-	'info_chapeau_2' => 'Introdução:',
269
-	'info_chemin_acces_1' => 'Opções: <b>Caminho de acesso no diretório</b>',
270
-	'info_chemin_acces_2' => 'A partir daqui, você deverá configurar o caminho de acesso às informações do diretório. Esta informação é indispensávelpara ler os perfis dos usuários no diretório.',
271
-	'info_chemin_acces_annuaire' => 'Opções: <b>Caminho de acesso no diretório</b>',
272
-	'info_choix_base' => 'Terceiro passo:',
273
-	'info_classement_1' => '<sup><u>o</u></sup> em @liste@',
274
-	'info_classement_2' => '<sup><u>a</u></sup> em @liste@',
275
-	'info_code_acces' => 'Não se esqueça dos seus dados de conexão!',
276
-	'info_config_suivi' => 'Se este endereço corresponde a uma mailing-list, você pode informar abaixo o endereço onde os participantes do site podem se inscrever. Este endereço pode ser um URL (por exemplo a página de inscrição na lista pela Web), ou um endereço de e-mail dotado de um assunto específico (par exemple: <tt>@adresse_suivi@?subject=subscribe</tt>):',
277
-	'info_config_suivi_explication' => 'Voce pode assinar a  mailing-list deste site. Você irá receber por e-mail, os avisos de matérias e notas propostos para publicação.',
278
-	'info_confirmer_passe' => 'Confirmar a nova senha:',
279
-	'info_conflit_edition_avis_non_sauvegarde' => 'Atenção os campos a seguir foram alterados por terceiros. As suas modificações nestes campos não foram, por isso, gravadas.',
280
-	'info_conflit_edition_differences' => 'Diferenças:',
281
-	'info_conflit_edition_version_enregistree' => 'A versão gravada:',
282
-	'info_conflit_edition_votre_version' => 'A sua versão:',
283
-	'info_connexion_base' => 'Teste de conexão com a base',
284
-	'info_connexion_base_donnee' => 'Conexão à sua base de dados',
285
-	'info_connexion_ldap_ok' => '<b>A conexão LDAP foi efetuada.</b><p>Você pode passar para o próximo passo.</p>',
286
-	'info_connexion_mysql' => 'Sua conexão SQL',
287
-	'info_connexion_ok' => 'A conexão foi obtida.',
288
-	'info_contact' => 'Contato',
289
-	'info_contenu_articles' => 'Conteúdo das matérias',
290
-	'info_contributions' => 'Contribuições',
291
-	'info_creation_paragraphe' => 'Para criar parágrafos, basta deixar linhas em branco.',
292
-	'info_creation_rubrique' => 'Antes de poder escrever matérias, você deve criar, pelo menos, uma seção.<br />',
293
-	'info_creation_tables' => 'Criação das tabelas da base',
294
-	'info_creer_base' => '<b>Criar</b> uma nova base de dados:',
295
-	'info_dans_rubrique' => 'Na seção:',
296
-	'info_date_publication_anterieure' => 'Data de redação anterior:',
297
-	'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SITE:',
298
-	'info_derniere_etape' => 'Terminou!',
299
-	'info_descriptif' => 'Descrição:',
300
-	'info_desinstaller_plugin' => 'exclui os dados e desativa o plugin',
301
-	'info_discussion_cours' => 'Discussões em andamento',
302
-	'info_ecrire_article' => 'Antes de poder escrever matérias, você precisa criar pelo menos uma seção.',
303
-	'info_email_envoi' => 'Endereço de e-mail de envio (opcional)',
304
-	'info_email_envoi_txt' => 'Informe aqui o endereço a ser utilizado para enviar os e-mails (por padrão, o endereço de destino será usado como endereço de envio):',
305
-	'info_email_webmestre' => 'Endereço de e-mail do webmaster',
306
-	'info_envoi_email_automatique' => 'Envio automático de e-mails',
307
-	'info_envoyer_maintenant' => 'Enviar agora',
308
-	'info_etape_suivante' => 'Avançar para a próxima etapa',
309
-	'info_etape_suivante_1' => 'Você pode passar para a próxima etapa.',
310
-	'info_etape_suivante_2' => 'Você pode passar para a próxima etapa.',
311
-	'info_exceptions_proxy' => 'Exceções para o proxy',
312
-	'info_exportation_base' => 'exportação da base para @archive@',
313
-	'info_facilite_suivi_activite' => 'Para facilitar o acompanhamento da atividade editorial do site, o SPIP pode avisar por e-mail, por exemplo para uma mailing-list de redatores, os avisos dos pedidos de publicação e das validações das matérias. Informe um ou mais endereços, separados por vírgula.',
314
-	'info_fichiers_authent' => 'Arquivos de autenticação «.htpasswd»',
315
-	'info_forums_abo_invites' => 'O seu site comporta fóruns por assinatura; os visitantes são convidados a se registrar no site público.',
316
-	'info_gauche_admin_tech' => '<b>Esta página é acessível apenas aos responsáveis pelo site.</b><p>Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao website.</p>',
317
-	'info_gauche_admin_vider' => '<b>Esta página é acessível apenas aos responsáveis pelo site.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao website.</p>',
318
-	'info_gauche_auteurs' => 'Aqui, você encontra todos os autores do site.
168
+    // I
169
+    'ical_info1' => 'Esta página apresenta diversos métodos para se manter a par da atividade deste site.',
170
+    'ical_info2' => 'Para mais informações sobre todas estas técnicas, não deixe de consultar <a href="@spipnet@">a documentação do SPIP</a>.',
171
+    'ical_info_calendrier' => 'Dois calendários estão à sua disposição. O primeiro é um mapa do site anunciando todas as matérias publicadas. O segundo contém os avisos editoriais bem como suas últimas mensagens privadas: ele lhe é reservado graças a uma chave pessoal, que você pode alterar a qualquer momento ao renovar a sua senha.',
172
+    'ical_methode_http' => 'Transferência',
173
+    'ical_methode_webcal' => 'Sincronização (webcal://)',
174
+    'ical_texte_prive' => 'Este calendário, de uso estritamente pessoal, o informa sobre a atividade editorial privada deste site (tarefas e encontros pessoais, matérias e notas propostas...).',
175
+    'ical_texte_public' => 'Este calendário permite-lhe acompanhar a atividade pública deste site (matérias e notas publicadas).',
176
+    'ical_texte_rss' => 'Você pode sindicar as novidades deste site em qualquer leitor de arquivos em formato XML/RSS (Rich Site Summary). É também o formato que permite ao SPIP ler as novidades publicadas em outros sites que utilizem um formato de troca de informações compatível (sites sindicados).',
177
+    'ical_titre_js' => 'Javascript',
178
+    'ical_titre_mailing' => 'Mailing-list',
179
+    'ical_titre_rss' => 'Arquivos de sindicação',
180
+    'icone_accueil' => 'Página Inicial',
181
+    'icone_activer_cookie' => 'Ativar o coockie de correspondência',
182
+    'icone_activite' => 'Atividade',
183
+    'icone_admin_plugin' => 'Gerenciamento dos plugins',
184
+    'icone_administration' => 'Manutenção',
185
+    'icone_afficher_auteurs' => 'Exibir os autores',
186
+    'icone_afficher_visiteurs' => 'Exibir os visitantes',
187
+    'icone_arret_discussion' => 'Não participar mais desta discussão',
188
+    'icone_calendrier' => 'Calendário',
189
+    'icone_configuration' => 'Configuração',
190
+    'icone_creer_auteur' => 'Criar um novo autor e vinculá-lo a esta matéria',
191
+    'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a esta matéria',
192
+    'icone_creer_rubrique_2' => 'Criar uma nova seção',
193
+    'icone_developpement' => 'Desenvolvimento',
194
+    'icone_edition' => 'Edição',
195
+    'icone_ma_langue' => 'Meu idioma',
196
+    'icone_mes_infos' => 'Minhas informações',
197
+    'icone_mes_preferences' => 'Minhas preferências',
198
+    'icone_modifier_article' => 'Editar esta matéria',
199
+    'icone_modifier_rubrique' => 'Editar esta seção',
200
+    'icone_publication' => 'Publicação',
201
+    'icone_relancer_signataire' => 'Reconfirmar o assinante',
202
+    'icone_retour' => 'Voltar',
203
+    'icone_retour_article' => 'Voltar para a matéria',
204
+    'icone_squelette' => 'Templates',
205
+    'icone_suivi_publication' => 'Acompanhamento da publicação',
206
+    'icone_supprimer_cookie' => 'Excluir o cookie de correspondência',
207
+    'icone_supprimer_rubrique' => 'Excluir esta seção',
208
+    'icone_supprimer_signature' => 'Excluir esta assinatura',
209
+    'icone_valider_signature' => 'Validar esta assinatura',
210
+    'image_administrer_rubrique' => 'Você pode administrar esta seção',
211
+    'impossible_modifier_login_auteur' => 'Não foi possível alterar o login.',
212
+    'impossible_modifier_pass_auteur' => 'Não foi possível alterar a senha.',
213
+    'info_1_article' => '1 matéria',
214
+    'info_1_auteur' => '1 autor',
215
+    'info_1_message' => '1 mensagem',
216
+    'info_1_mot_cle' => '1 palavra-chave',
217
+    'info_1_rubrique' => '1 seção',
218
+    'info_1_visiteur' => '1 visitante',
219
+    'info_activer_cookie' => 'Você pode ativar um <b>cookie de correspondência</b>, que lhe permitirá passar facilmente do site público para o site privado.',
220
+    'info_activer_menu_developpement' => 'Exibir o menu Desenvolvimento',
221
+    'info_admin_etre_webmestre' => 'Me conceder direitos de webmaster',
222
+    'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>',
223
+    'info_admin_statuer_webmestre' => 'Dar a este administrador os direitos de webmaster',
224
+    'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>',
225
+    'info_administrateur' => 'Administrador',
226
+    'info_administrateur_1' => 'Administrador',
227
+    'info_administrateur_2' => 'do site (<i>use com cuidado</i>)',
228
+    'info_administrateur_site_01' => 'Se você é administrador do site, por favor,',
229
+    'info_administrateur_site_02' => 'clique neste link',
230
+    'info_administrateurs' => 'Administradores',
231
+    'info_administrer_rubrique' => 'Você pode administrar esta seção',
232
+    'info_adresse' => 'no endereço:',
233
+    'info_adresse_desinscription' => 'Endereço da desinscrição:',
234
+    'info_adresse_url' => 'Endereço (URL) do site público',
235
+    'info_afficher_par_nb' => 'Exibir por',
236
+    'info_aide_en_ligne' => 'Ajuda online SPIP',
237
+    'info_ajout_image' => 'Assim que você incluir imagens e documentos anexados a uma matéria, o SPIP pode criar para você, automaticamente, ícones (miniaturas) das imagens inseridas. Isto permite, por exemplo, criar automaticamente uma galeria ou um portfólio.',
238
+    'info_ajouter_rubrique' => 'Incluir outra seção para administrar:',
239
+    'info_annonce_nouveautes' => 'Aviso das novidades',
240
+    'info_article' => 'matéria',
241
+    'info_article_2' => 'matérias',
242
+    'info_article_a_paraitre' => 'As matérias pós-datadas para exibição',
243
+    'info_articles_02' => 'matérias',
244
+    'info_articles_2' => 'Matérias',
245
+    'info_articles_auteur' => 'As matérias deste autor',
246
+    'info_articles_miens' => 'Minhas matérias',
247
+    'info_articles_tous' => 'Todas as matérias',
248
+    'info_articles_trouves' => 'Matérias encontradas',
249
+    'info_attente_validation' => 'Suas matérias aguardando validação',
250
+    'info_aucun_article' => 'Nenhuma matéria',
251
+    'info_aucun_auteur' => 'Nenhum autor',
252
+    'info_aucun_message' => 'Nenhuma mensagem',
253
+    'info_aucun_rubrique' => 'Nenhuma seção',
254
+    'info_aujourdhui' => 'Hoje:',
255
+    'info_auteur_gere_rubriques' => 'Este autor gerencia as seções a seguir:',
256
+    'info_auteur_gere_toutes_rubriques' => 'Este autor gerencia <b>todas as seções</b>',
257
+    'info_auteur_gere_toutes_rubriques_2' => 'Eu gerencio <b>todas as seções</b>',
258
+    'info_auteurs' => 'Os autores',
259
+    'info_auteurs_par_tri' => 'Autores@partri@',
260
+    'info_auteurs_trouves' => 'Autores encontrados',
261
+    'info_authentification_externe' => 'Autenticação externa',
262
+    'info_avertissement' => 'Aviso',
263
+    'info_barre_outils' => 'com sua barra de ferramentas?',
264
+    'info_base_installee' => 'A estrutura da sua base de dados foi instalada.',
265
+    'info_bio' => 'Biografia',
266
+    'info_cache_desactive' => 'O cache está temporariamente desativado.',
267
+    'info_chapeau' => 'Introdução',
268
+    'info_chapeau_2' => 'Introdução:',
269
+    'info_chemin_acces_1' => 'Opções: <b>Caminho de acesso no diretório</b>',
270
+    'info_chemin_acces_2' => 'A partir daqui, você deverá configurar o caminho de acesso às informações do diretório. Esta informação é indispensávelpara ler os perfis dos usuários no diretório.',
271
+    'info_chemin_acces_annuaire' => 'Opções: <b>Caminho de acesso no diretório</b>',
272
+    'info_choix_base' => 'Terceiro passo:',
273
+    'info_classement_1' => '<sup><u>o</u></sup> em @liste@',
274
+    'info_classement_2' => '<sup><u>a</u></sup> em @liste@',
275
+    'info_code_acces' => 'Não se esqueça dos seus dados de conexão!',
276
+    'info_config_suivi' => 'Se este endereço corresponde a uma mailing-list, você pode informar abaixo o endereço onde os participantes do site podem se inscrever. Este endereço pode ser um URL (por exemplo a página de inscrição na lista pela Web), ou um endereço de e-mail dotado de um assunto específico (par exemple: <tt>@adresse_suivi@?subject=subscribe</tt>):',
277
+    'info_config_suivi_explication' => 'Voce pode assinar a  mailing-list deste site. Você irá receber por e-mail, os avisos de matérias e notas propostos para publicação.',
278
+    'info_confirmer_passe' => 'Confirmar a nova senha:',
279
+    'info_conflit_edition_avis_non_sauvegarde' => 'Atenção os campos a seguir foram alterados por terceiros. As suas modificações nestes campos não foram, por isso, gravadas.',
280
+    'info_conflit_edition_differences' => 'Diferenças:',
281
+    'info_conflit_edition_version_enregistree' => 'A versão gravada:',
282
+    'info_conflit_edition_votre_version' => 'A sua versão:',
283
+    'info_connexion_base' => 'Teste de conexão com a base',
284
+    'info_connexion_base_donnee' => 'Conexão à sua base de dados',
285
+    'info_connexion_ldap_ok' => '<b>A conexão LDAP foi efetuada.</b><p>Você pode passar para o próximo passo.</p>',
286
+    'info_connexion_mysql' => 'Sua conexão SQL',
287
+    'info_connexion_ok' => 'A conexão foi obtida.',
288
+    'info_contact' => 'Contato',
289
+    'info_contenu_articles' => 'Conteúdo das matérias',
290
+    'info_contributions' => 'Contribuições',
291
+    'info_creation_paragraphe' => 'Para criar parágrafos, basta deixar linhas em branco.',
292
+    'info_creation_rubrique' => 'Antes de poder escrever matérias, você deve criar, pelo menos, uma seção.<br />',
293
+    'info_creation_tables' => 'Criação das tabelas da base',
294
+    'info_creer_base' => '<b>Criar</b> uma nova base de dados:',
295
+    'info_dans_rubrique' => 'Na seção:',
296
+    'info_date_publication_anterieure' => 'Data de redação anterior:',
297
+    'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SITE:',
298
+    'info_derniere_etape' => 'Terminou!',
299
+    'info_descriptif' => 'Descrição:',
300
+    'info_desinstaller_plugin' => 'exclui os dados e desativa o plugin',
301
+    'info_discussion_cours' => 'Discussões em andamento',
302
+    'info_ecrire_article' => 'Antes de poder escrever matérias, você precisa criar pelo menos uma seção.',
303
+    'info_email_envoi' => 'Endereço de e-mail de envio (opcional)',
304
+    'info_email_envoi_txt' => 'Informe aqui o endereço a ser utilizado para enviar os e-mails (por padrão, o endereço de destino será usado como endereço de envio):',
305
+    'info_email_webmestre' => 'Endereço de e-mail do webmaster',
306
+    'info_envoi_email_automatique' => 'Envio automático de e-mails',
307
+    'info_envoyer_maintenant' => 'Enviar agora',
308
+    'info_etape_suivante' => 'Avançar para a próxima etapa',
309
+    'info_etape_suivante_1' => 'Você pode passar para a próxima etapa.',
310
+    'info_etape_suivante_2' => 'Você pode passar para a próxima etapa.',
311
+    'info_exceptions_proxy' => 'Exceções para o proxy',
312
+    'info_exportation_base' => 'exportação da base para @archive@',
313
+    'info_facilite_suivi_activite' => 'Para facilitar o acompanhamento da atividade editorial do site, o SPIP pode avisar por e-mail, por exemplo para uma mailing-list de redatores, os avisos dos pedidos de publicação e das validações das matérias. Informe um ou mais endereços, separados por vírgula.',
314
+    'info_fichiers_authent' => 'Arquivos de autenticação «.htpasswd»',
315
+    'info_forums_abo_invites' => 'O seu site comporta fóruns por assinatura; os visitantes são convidados a se registrar no site público.',
316
+    'info_gauche_admin_tech' => '<b>Esta página é acessível apenas aos responsáveis pelo site.</b><p>Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao website.</p>',
317
+    'info_gauche_admin_vider' => '<b>Esta página é acessível apenas aos responsáveis pelo site.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao website.</p>',
318
+    'info_gauche_auteurs' => 'Aqui, você encontra todos os autores do site.
319 319
 Os status dos autores é indicado pela côr dos ícones (administrador = verde; redator = amarelo).',
320
-	'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao site, são indicados por um ícone azul;
320
+    'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao site, são indicados por um ícone azul;
321 321
 os autores excluídos por um ícone cinza.',
322
-	'info_gauche_messagerie' => 'O sistema interno de mensagens permite a troca de mensagens entre redatores, a criação de lembretes (para seu uso pessoal) ou exibir anúncios na página de entrada da área privada (se você for administrador).',
323
-	'info_gauche_statistiques_referers' => 'Esta página apresenta a lista dos  <i>referers</i>, ou seja, dos sites que contêm links para o seu site, unicamente para ontem e hoje; esta lista é zerada a cada 24 horas.',
324
-	'info_gauche_visiteurs_enregistres' => 'Você encontrará aqui os visitantes registrados na área pública do site (fóruns por assinatura).',
325
-	'info_generation_miniatures_images' => 'Geração de miniaturas das imagens',
326
-	'info_gerer_trad_objets' => '@objets@ : gerenciar os links de tradução',
327
-	'info_hebergeur_desactiver_envoi_email' => 'Alguns serviços de hospedagem desativam o envio automático de e-mails a partir dos seus servidores. Neste caso, as funcionalidades a seguir não funcionarão.',
328
-	'info_hier' => 'ontem:',
329
-	'info_identification_publique' => 'Sua identificação pública...',
330
-	'info_image_process' => 'Por favor, selecione o melhor método de criação dos ícones, clicando na imagem correspondente.',
331
-	'info_image_process2' => 'Se nenhuma imagem está sendo exibida, o servidor que hospeda o seu site não foi configurado para utilizar essas ferramentas. Se você deseja usar essas funções, contate o responsável técnico e solicite as extensões «GD» ou «Imagick».',
332
-	'info_images_auto' => 'Imagens calculadas automaticamente',
333
-	'info_informations_personnelles' => 'Informações pessoais',
334
-	'info_inscription' => 'Inscrição online',
335
-	'info_inscription_automatique' => 'Inscrição automática de novos redatores',
336
-	'info_jeu_caractere' => 'Conjunto de caracteres do site',
337
-	'info_jours' => 'dias',
338
-	'info_laisser_champs_vides' => 'deixar estes campos vazios)',
339
-	'info_langues' => 'Idiomas do site',
340
-	'info_ldap_ok' => 'A autenticação LDAP está instalada.',
341
-	'info_lien_hypertexte' => 'Link hipertexto:',
342
-	'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada',
343
-	'info_liste_redacteurs_connectes' => 'Lista de redatores conectados',
344
-	'info_login_existant' => 'Este login já está cadastrado.',
345
-	'info_login_trop_court' => 'Login muito curto.',
346
-	'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.',
347
-	'info_logos' => 'Os ícones',
348
-	'info_maximum' => 'máximo:',
349
-	'info_meme_rubrique' => 'Na mesma seção',
350
-	'info_message_en_redaction' => 'Suas mensagens em fase de redação',
351
-	'info_message_technique' => 'Mensagem técnica:',
352
-	'info_messagerie_interne' => 'Mensageria interna',
353
-	'info_mise_a_niveau_base' => 'atualização da sua base SQL',
354
-	'info_mise_a_niveau_base_2' => '{{Atenção!}} Você instalou uma versão de arquivos SPIP {anterior} à que estava instalada no site: a sua base de dados corre o risco de se corromper e o seu site não funcionar mais.<br />{{Reinstale os arquivos SPIP.}}',
355
-	'info_modification_enregistree' => 'Sua alteração foi gravada',
356
-	'info_modifier_auteur' => 'Editar o autor:',
357
-	'info_modifier_rubrique' => 'Editar a seção:',
358
-	'info_modifier_titre' => 'Editar: @titre@',
359
-	'info_mon_site_spip' => 'Meu site SPIP',
360
-	'info_moyenne' => 'média:',
361
-	'info_multi_cet_article' => 'Idioma desta matéria:',
362
-	'info_multi_langues_choisies' => 'Por favor, selecione a seguir os idiomas à disposição dos redatores do seu site.
322
+    'info_gauche_messagerie' => 'O sistema interno de mensagens permite a troca de mensagens entre redatores, a criação de lembretes (para seu uso pessoal) ou exibir anúncios na página de entrada da área privada (se você for administrador).',
323
+    'info_gauche_statistiques_referers' => 'Esta página apresenta a lista dos  <i>referers</i>, ou seja, dos sites que contêm links para o seu site, unicamente para ontem e hoje; esta lista é zerada a cada 24 horas.',
324
+    'info_gauche_visiteurs_enregistres' => 'Você encontrará aqui os visitantes registrados na área pública do site (fóruns por assinatura).',
325
+    'info_generation_miniatures_images' => 'Geração de miniaturas das imagens',
326
+    'info_gerer_trad_objets' => '@objets@ : gerenciar os links de tradução',
327
+    'info_hebergeur_desactiver_envoi_email' => 'Alguns serviços de hospedagem desativam o envio automático de e-mails a partir dos seus servidores. Neste caso, as funcionalidades a seguir não funcionarão.',
328
+    'info_hier' => 'ontem:',
329
+    'info_identification_publique' => 'Sua identificação pública...',
330
+    'info_image_process' => 'Por favor, selecione o melhor método de criação dos ícones, clicando na imagem correspondente.',
331
+    'info_image_process2' => 'Se nenhuma imagem está sendo exibida, o servidor que hospeda o seu site não foi configurado para utilizar essas ferramentas. Se você deseja usar essas funções, contate o responsável técnico e solicite as extensões «GD» ou «Imagick».',
332
+    'info_images_auto' => 'Imagens calculadas automaticamente',
333
+    'info_informations_personnelles' => 'Informações pessoais',
334
+    'info_inscription' => 'Inscrição online',
335
+    'info_inscription_automatique' => 'Inscrição automática de novos redatores',
336
+    'info_jeu_caractere' => 'Conjunto de caracteres do site',
337
+    'info_jours' => 'dias',
338
+    'info_laisser_champs_vides' => 'deixar estes campos vazios)',
339
+    'info_langues' => 'Idiomas do site',
340
+    'info_ldap_ok' => 'A autenticação LDAP está instalada.',
341
+    'info_lien_hypertexte' => 'Link hipertexto:',
342
+    'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada',
343
+    'info_liste_redacteurs_connectes' => 'Lista de redatores conectados',
344
+    'info_login_existant' => 'Este login já está cadastrado.',
345
+    'info_login_trop_court' => 'Login muito curto.',
346
+    'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.',
347
+    'info_logos' => 'Os ícones',
348
+    'info_maximum' => 'máximo:',
349
+    'info_meme_rubrique' => 'Na mesma seção',
350
+    'info_message_en_redaction' => 'Suas mensagens em fase de redação',
351
+    'info_message_technique' => 'Mensagem técnica:',
352
+    'info_messagerie_interne' => 'Mensageria interna',
353
+    'info_mise_a_niveau_base' => 'atualização da sua base SQL',
354
+    'info_mise_a_niveau_base_2' => '{{Atenção!}} Você instalou uma versão de arquivos SPIP {anterior} à que estava instalada no site: a sua base de dados corre o risco de se corromper e o seu site não funcionar mais.<br />{{Reinstale os arquivos SPIP.}}',
355
+    'info_modification_enregistree' => 'Sua alteração foi gravada',
356
+    'info_modifier_auteur' => 'Editar o autor:',
357
+    'info_modifier_rubrique' => 'Editar a seção:',
358
+    'info_modifier_titre' => 'Editar: @titre@',
359
+    'info_mon_site_spip' => 'Meu site SPIP',
360
+    'info_moyenne' => 'média:',
361
+    'info_multi_cet_article' => 'Idioma desta matéria:',
362
+    'info_multi_langues_choisies' => 'Por favor, selecione a seguir os idiomas à disposição dos redatores do seu site.
363 363
 Os idiomas já utilizados no site (no topo da lista) não podem ser desativados.',
364
-	'info_multi_objets' => '@objets@ : ativar o menu de idioma',
365
-	'info_multi_secteurs' => '... apenas para as seções situadas na raiz?',
366
-	'info_nb_articles' => '@nb@ matérias',
367
-	'info_nb_auteurs' => '@nb@ autores',
368
-	'info_nb_messages' => '@nb@ mensagens',
369
-	'info_nb_mots_cles' => '@nb@ palavras-chave',
370
-	'info_nb_rubriques' => '@nb@ seções',
371
-	'info_nb_visiteurs' => '@nb@ visitantes',
372
-	'info_nom' => 'Nome',
373
-	'info_nom_destinataire' => 'Nome do destinatário',
374
-	'info_nom_pas_conforme' => 'tags HTML não são permitidas',
375
-	'info_nom_site' => 'Nome do seu site',
376
-	'info_nombre_articles' => '@nb_articles@ matérias,',
377
-	'info_nombre_rubriques' => '@nb_rubriques@ seções,',
378
-	'info_nombre_sites' => '@nb_sites@ sites,',
379
-	'info_non_deplacer' => 'Não mover...',
380
-	'info_non_envoi_annonce_dernieres_nouveautes' => 'O SPIP pode enviar regularmente o anúncio das últimas novidades do site (matérias e notas publicadas recentemente).',
381
-	'info_non_envoi_liste_nouveautes' => 'Não enviar a lista de novidades',
382
-	'info_non_modifiable' => 'não pode ser modificado',
383
-	'info_non_suppression_mot_cle' => 'Eu não quero excluir esta palavra-chave.',
384
-	'info_notes' => 'Observações',
385
-	'info_nouvel_article' => 'Nova matéria',
386
-	'info_nouvelle_traduction' => 'Nova tradução:',
387
-	'info_numero_article' => 'MATÉRIA NÚMERO:',
388
-	'info_obligatoire_02' => '(obrigatório)',
389
-	'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do site público',
390
-	'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição dos visitantes',
391
-	'info_options_avancees' => 'OPÇÕES AVANÇADAS',
392
-	'info_ou' => 'ou...',
393
-	'info_page_interdite' => 'Página não autorizada',
394
-	'info_par_nom' => 'por nome',
395
-	'info_par_nombre_article' => 'por número de matérias',
396
-	'info_par_statut' => 'por status',
397
-	'info_par_tri' => '’(por @tri@)’',
398
-	'info_passe_trop_court' => 'Senha muito curta.',
399
-	'info_passe_trop_court_car_pluriel' => 'A senha deve conter pelo menos @nb@ caracteres.',
400
-	'info_passes_identiques' => 'As duas senhas não são idênticas.',
401
-	'info_plus_cinq_car' => 'mais de 5 caracteres',
402
-	'info_plus_cinq_car_2' => '(Mais de 5 caracteres)',
403
-	'info_plus_trois_car' => '(Mais de 3 caracteres)',
404
-	'info_popularite' => 'popularidade: @popularite@; visitas: @visites@',
405
-	'info_post_scriptum' => 'Rodapé',
406
-	'info_post_scriptum_2' => 'Rodapé:',
407
-	'info_pour' => 'para',
408
-	'info_preview_texte' => 'É possível visualizar os diferentes elementos editoriais do site que tenham  pelo menos o status de «proposto», bem como os elementos em fase de redação de que se é autor. Esta funcionalidade deve estar disponível para os administradores, para os redatores, ou para ninguém?',
409
-	'info_procedez_par_etape' => 'proceder passo-a-passo',
410
-	'info_procedure_maj_version' => 'o procedimento de atualização deve ser rodado para adaptar a base de dados à nova versão do SPIP.',
411
-	'info_proxy_ok' => 'Teste do proxy bem sucedido',
412
-	'info_ps' => 'P.S.',
413
-	'info_publier' => 'publicar',
414
-	'info_publies' => 'Suas matérias publicadas online',
415
-	'info_question_accepter_visiteurs' => 'Se os templates do seu site prevêem o cadastramento de visitantes sem acesso à área privada, por favor, ative a opção abaixo:',
416
-	'info_question_inscription_nouveaux_redacteurs' => 'Você quer aceitar inscrições de novos redatores a partir do site público? Se você aceitar, os visitantes poderão se cadastrar através de um formulário automatizado, tendo acesso à área privada para propôr as suas próprias matérias. <div class="notice">Durante a fase de inscrição, os usuários recebem um e-mail automático, fornecendo-lhes os seus códigos de acesso à área privada. Alguns serviços de hospedagem desativam o envio de e-mails a partir dos seus servidores: nesse caso, a inscrição automática é impossível.</div>',
417
-	'info_qui_edite' => '@nom_auteur_modif@ trabalhou neste conteúdo há @date_diff@ minutos',
418
-	'info_racine_site' => 'Raiz do site',
419
-	'info_recharger_page' => 'Por favor, atualize esta página em alguns instantes.',
420
-	'info_recherche_auteur_zero' => 'Nenhum resultado para «@cherche_auteur@».',
421
-	'info_recommencer' => 'Por favor, recomece.',
422
-	'info_redacteur_1' => 'Redator',
423
-	'info_redacteur_2' => 'com acesso à área privada (<i>recomendado</i>)',
424
-	'info_redacteurs' => 'Redatores',
425
-	'info_redaction_en_cours' => 'EM FASE DE REDAÇÃO',
426
-	'info_redirection' => 'Redirecionamento',
427
-	'info_redirection_activee' => 'O redirecionamento foi ativado.',
428
-	'info_redirection_boucle' => 'Você tentou redirecionar a matéria para ela mesma.',
429
-	'info_redirection_desactivee' => 'O redirecionamento foi excluído.',
430
-	'info_refuses' => 'Suas matérias recusadas',
431
-	'info_reglage_ldap' => 'Opções: <b>Configuração da importação LDAP</b>',
432
-	'info_renvoi_article' => '<b>Redirecionamento.</b> Esta matéria redireciona para a página:',
433
-	'info_reserve_admin' => 'Apenas os administradores podem alterar este endereço.',
434
-	'info_restreindre_rubrique' => 'Restringir o gerenciamento à seção:',
435
-	'info_resultat_recherche' => 'Resultados da busca:',
436
-	'info_rubriques' => 'Seções',
437
-	'info_rubriques_02' => 'seções',
438
-	'info_rubriques_trouvees' => 'Seções encontradas',
439
-	'info_sans_titre' => 'Sem título',
440
-	'info_selection_chemin_acces' => '<b>Selecione</b> a seguir o caminho para acessar o diretório:',
441
-	'info_signatures' => 'assinaturas',
442
-	'info_site' => 'Site',
443
-	'info_site_2' => 'site:',
444
-	'info_site_min' => 'site',
445
-	'info_site_reference_2' => 'Site referenciado',
446
-	'info_site_web' => 'Website:',
447
-	'info_sites' => 'sites',
448
-	'info_sites_lies_mot' => 'Os sites referenciados vinculados a esta palavra-chave',
449
-	'info_sites_proxy' => 'Utilizar um proxy',
450
-	'info_sites_trouves' => 'Sites encontrados',
451
-	'info_sous_titre' => 'Subtítulo:',
452
-	'info_statut_administrateur' => 'Administrador',
453
-	'info_statut_auteur' => 'Status deste autor:',
454
-	'info_statut_auteur_2' => 'Eu sou',
455
-	'info_statut_auteur_a_confirmer' => 'Inscrição a confirmar',
456
-	'info_statut_auteur_autre' => 'Outro status:',
457
-	'info_statut_redacteur' => 'Redator',
458
-	'info_statut_utilisateurs_1' => 'Status padrão dos usuários importados',
459
-	'info_statut_utilisateurs_2' => 'Escolha o status atribuído às pessoas que constam do diretório LDAP, quando elas se conectarem pela primeira vêz. Você poderá, em seguida, alterar caso a caso este valor para cada autor.',
460
-	'info_suivi_activite' => 'Acompanhamento da atividade editorial',
461
-	'info_surtitre' => 'Sobretítulo:',
462
-	'info_syndication_integrale_1' => 'O seu site propõe arquivos de sindicação (ver «<a href="@url@">@titre@</a>»).',
463
-	'info_syndication_integrale_2' => 'Você deseja transmitir as matérias integralmente, ou difundir apenas um resumo de algumas centenas de caracteres?',
464
-	'info_table_prefix' => 'Você pode alterar o prefixo do nome das tabelas de dados (indispensável no caso de pretender instalar diversos sites na mesma base de dados). Este prefixo deve estar em minúsculas, não acentuadas, e sem espaços.',
465
-	'info_taille_maximale_images' => 'SPIP irá testar o tamanho máximo das imagens que o sistema pode tratar (em milhões de pixels).<br />As imagens muito grandes não serão reduzidas.',
466
-	'info_taille_maximale_vignette' => 'Tamanho máximo dos ícones gerados pelo sistema:',
467
-	'info_terminer_installation' => 'Você pode agora terminar o procedimento de instalação padrão.',
468
-	'info_texte' => 'Texto',
469
-	'info_texte_explicatif' => 'Texto explicativo',
470
-	'info_texte_long' => '(o texto é longo: ele aparecerá em diversas partes que serão recombinadas após validação.)',
471
-	'info_texte_message' => 'Texto da sua mensagem',
472
-	'info_texte_message_02' => 'Texto da mensagem',
473
-	'info_titre' => 'Título:',
474
-	'info_total' => 'total:',
475
-	'info_tous_articles_en_redaction' => 'Todas as matérias em fase de redação',
476
-	'info_tous_articles_presents' => 'Todas as matérias publicadas nesta seção',
477
-	'info_tous_articles_refuses' => 'Todas as matérias recusadas',
478
-	'info_tous_les' => 'todos os:',
479
-	'info_tout_site' => 'Todo o site',
480
-	'info_tout_site2' => 'A matéria não foi traduzida para este idioma.',
481
-	'info_tout_site3' => 'A matéria foi traduzida para este idioma, mas foram feitas alterações na matéria de referência. A tradução procisa ser atualizada.',
482
-	'info_tout_site4' => 'A matéria foi traduzida para este idioma e a tradução está em dia.',
483
-	'info_tout_site5' => 'Matéria original.',
484
-	'info_tout_site6' => '<b>Atenção:</b> apenas as matérias originais estão exibidas.
364
+    'info_multi_objets' => '@objets@ : ativar o menu de idioma',
365
+    'info_multi_secteurs' => '... apenas para as seções situadas na raiz?',
366
+    'info_nb_articles' => '@nb@ matérias',
367
+    'info_nb_auteurs' => '@nb@ autores',
368
+    'info_nb_messages' => '@nb@ mensagens',
369
+    'info_nb_mots_cles' => '@nb@ palavras-chave',
370
+    'info_nb_rubriques' => '@nb@ seções',
371
+    'info_nb_visiteurs' => '@nb@ visitantes',
372
+    'info_nom' => 'Nome',
373
+    'info_nom_destinataire' => 'Nome do destinatário',
374
+    'info_nom_pas_conforme' => 'tags HTML não são permitidas',
375
+    'info_nom_site' => 'Nome do seu site',
376
+    'info_nombre_articles' => '@nb_articles@ matérias,',
377
+    'info_nombre_rubriques' => '@nb_rubriques@ seções,',
378
+    'info_nombre_sites' => '@nb_sites@ sites,',
379
+    'info_non_deplacer' => 'Não mover...',
380
+    'info_non_envoi_annonce_dernieres_nouveautes' => 'O SPIP pode enviar regularmente o anúncio das últimas novidades do site (matérias e notas publicadas recentemente).',
381
+    'info_non_envoi_liste_nouveautes' => 'Não enviar a lista de novidades',
382
+    'info_non_modifiable' => 'não pode ser modificado',
383
+    'info_non_suppression_mot_cle' => 'Eu não quero excluir esta palavra-chave.',
384
+    'info_notes' => 'Observações',
385
+    'info_nouvel_article' => 'Nova matéria',
386
+    'info_nouvelle_traduction' => 'Nova tradução:',
387
+    'info_numero_article' => 'MATÉRIA NÚMERO:',
388
+    'info_obligatoire_02' => '(obrigatório)',
389
+    'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do site público',
390
+    'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição dos visitantes',
391
+    'info_options_avancees' => 'OPÇÕES AVANÇADAS',
392
+    'info_ou' => 'ou...',
393
+    'info_page_interdite' => 'Página não autorizada',
394
+    'info_par_nom' => 'por nome',
395
+    'info_par_nombre_article' => 'por número de matérias',
396
+    'info_par_statut' => 'por status',
397
+    'info_par_tri' => '’(por @tri@)’',
398
+    'info_passe_trop_court' => 'Senha muito curta.',
399
+    'info_passe_trop_court_car_pluriel' => 'A senha deve conter pelo menos @nb@ caracteres.',
400
+    'info_passes_identiques' => 'As duas senhas não são idênticas.',
401
+    'info_plus_cinq_car' => 'mais de 5 caracteres',
402
+    'info_plus_cinq_car_2' => '(Mais de 5 caracteres)',
403
+    'info_plus_trois_car' => '(Mais de 3 caracteres)',
404
+    'info_popularite' => 'popularidade: @popularite@; visitas: @visites@',
405
+    'info_post_scriptum' => 'Rodapé',
406
+    'info_post_scriptum_2' => 'Rodapé:',
407
+    'info_pour' => 'para',
408
+    'info_preview_texte' => 'É possível visualizar os diferentes elementos editoriais do site que tenham  pelo menos o status de «proposto», bem como os elementos em fase de redação de que se é autor. Esta funcionalidade deve estar disponível para os administradores, para os redatores, ou para ninguém?',
409
+    'info_procedez_par_etape' => 'proceder passo-a-passo',
410
+    'info_procedure_maj_version' => 'o procedimento de atualização deve ser rodado para adaptar a base de dados à nova versão do SPIP.',
411
+    'info_proxy_ok' => 'Teste do proxy bem sucedido',
412
+    'info_ps' => 'P.S.',
413
+    'info_publier' => 'publicar',
414
+    'info_publies' => 'Suas matérias publicadas online',
415
+    'info_question_accepter_visiteurs' => 'Se os templates do seu site prevêem o cadastramento de visitantes sem acesso à área privada, por favor, ative a opção abaixo:',
416
+    'info_question_inscription_nouveaux_redacteurs' => 'Você quer aceitar inscrições de novos redatores a partir do site público? Se você aceitar, os visitantes poderão se cadastrar através de um formulário automatizado, tendo acesso à área privada para propôr as suas próprias matérias. <div class="notice">Durante a fase de inscrição, os usuários recebem um e-mail automático, fornecendo-lhes os seus códigos de acesso à área privada. Alguns serviços de hospedagem desativam o envio de e-mails a partir dos seus servidores: nesse caso, a inscrição automática é impossível.</div>',
417
+    'info_qui_edite' => '@nom_auteur_modif@ trabalhou neste conteúdo há @date_diff@ minutos',
418
+    'info_racine_site' => 'Raiz do site',
419
+    'info_recharger_page' => 'Por favor, atualize esta página em alguns instantes.',
420
+    'info_recherche_auteur_zero' => 'Nenhum resultado para «@cherche_auteur@».',
421
+    'info_recommencer' => 'Por favor, recomece.',
422
+    'info_redacteur_1' => 'Redator',
423
+    'info_redacteur_2' => 'com acesso à área privada (<i>recomendado</i>)',
424
+    'info_redacteurs' => 'Redatores',
425
+    'info_redaction_en_cours' => 'EM FASE DE REDAÇÃO',
426
+    'info_redirection' => 'Redirecionamento',
427
+    'info_redirection_activee' => 'O redirecionamento foi ativado.',
428
+    'info_redirection_boucle' => 'Você tentou redirecionar a matéria para ela mesma.',
429
+    'info_redirection_desactivee' => 'O redirecionamento foi excluído.',
430
+    'info_refuses' => 'Suas matérias recusadas',
431
+    'info_reglage_ldap' => 'Opções: <b>Configuração da importação LDAP</b>',
432
+    'info_renvoi_article' => '<b>Redirecionamento.</b> Esta matéria redireciona para a página:',
433
+    'info_reserve_admin' => 'Apenas os administradores podem alterar este endereço.',
434
+    'info_restreindre_rubrique' => 'Restringir o gerenciamento à seção:',
435
+    'info_resultat_recherche' => 'Resultados da busca:',
436
+    'info_rubriques' => 'Seções',
437
+    'info_rubriques_02' => 'seções',
438
+    'info_rubriques_trouvees' => 'Seções encontradas',
439
+    'info_sans_titre' => 'Sem título',
440
+    'info_selection_chemin_acces' => '<b>Selecione</b> a seguir o caminho para acessar o diretório:',
441
+    'info_signatures' => 'assinaturas',
442
+    'info_site' => 'Site',
443
+    'info_site_2' => 'site:',
444
+    'info_site_min' => 'site',
445
+    'info_site_reference_2' => 'Site referenciado',
446
+    'info_site_web' => 'Website:',
447
+    'info_sites' => 'sites',
448
+    'info_sites_lies_mot' => 'Os sites referenciados vinculados a esta palavra-chave',
449
+    'info_sites_proxy' => 'Utilizar um proxy',
450
+    'info_sites_trouves' => 'Sites encontrados',
451
+    'info_sous_titre' => 'Subtítulo:',
452
+    'info_statut_administrateur' => 'Administrador',
453
+    'info_statut_auteur' => 'Status deste autor:',
454
+    'info_statut_auteur_2' => 'Eu sou',
455
+    'info_statut_auteur_a_confirmer' => 'Inscrição a confirmar',
456
+    'info_statut_auteur_autre' => 'Outro status:',
457
+    'info_statut_redacteur' => 'Redator',
458
+    'info_statut_utilisateurs_1' => 'Status padrão dos usuários importados',
459
+    'info_statut_utilisateurs_2' => 'Escolha o status atribuído às pessoas que constam do diretório LDAP, quando elas se conectarem pela primeira vêz. Você poderá, em seguida, alterar caso a caso este valor para cada autor.',
460
+    'info_suivi_activite' => 'Acompanhamento da atividade editorial',
461
+    'info_surtitre' => 'Sobretítulo:',
462
+    'info_syndication_integrale_1' => 'O seu site propõe arquivos de sindicação (ver «<a href="@url@">@titre@</a>»).',
463
+    'info_syndication_integrale_2' => 'Você deseja transmitir as matérias integralmente, ou difundir apenas um resumo de algumas centenas de caracteres?',
464
+    'info_table_prefix' => 'Você pode alterar o prefixo do nome das tabelas de dados (indispensável no caso de pretender instalar diversos sites na mesma base de dados). Este prefixo deve estar em minúsculas, não acentuadas, e sem espaços.',
465
+    'info_taille_maximale_images' => 'SPIP irá testar o tamanho máximo das imagens que o sistema pode tratar (em milhões de pixels).<br />As imagens muito grandes não serão reduzidas.',
466
+    'info_taille_maximale_vignette' => 'Tamanho máximo dos ícones gerados pelo sistema:',
467
+    'info_terminer_installation' => 'Você pode agora terminar o procedimento de instalação padrão.',
468
+    'info_texte' => 'Texto',
469
+    'info_texte_explicatif' => 'Texto explicativo',
470
+    'info_texte_long' => '(o texto é longo: ele aparecerá em diversas partes que serão recombinadas após validação.)',
471
+    'info_texte_message' => 'Texto da sua mensagem',
472
+    'info_texte_message_02' => 'Texto da mensagem',
473
+    'info_titre' => 'Título:',
474
+    'info_total' => 'total:',
475
+    'info_tous_articles_en_redaction' => 'Todas as matérias em fase de redação',
476
+    'info_tous_articles_presents' => 'Todas as matérias publicadas nesta seção',
477
+    'info_tous_articles_refuses' => 'Todas as matérias recusadas',
478
+    'info_tous_les' => 'todos os:',
479
+    'info_tout_site' => 'Todo o site',
480
+    'info_tout_site2' => 'A matéria não foi traduzida para este idioma.',
481
+    'info_tout_site3' => 'A matéria foi traduzida para este idioma, mas foram feitas alterações na matéria de referência. A tradução procisa ser atualizada.',
482
+    'info_tout_site4' => 'A matéria foi traduzida para este idioma e a tradução está em dia.',
483
+    'info_tout_site5' => 'Matéria original.',
484
+    'info_tout_site6' => '<b>Atenção:</b> apenas as matérias originais estão exibidas.
485 485
 As traduções estão associadas ao original, numa côr que indica o seu status:',
486
-	'info_traductions' => 'Traduções',
487
-	'info_travail_colaboratif' => 'Trabalho colaborativo nas matérias',
488
-	'info_un_article' => 'uma matéria,',
489
-	'info_un_site' => 'um site,',
490
-	'info_une_rubrique' => 'uma seção,',
491
-	'info_une_rubrique_02' => '1 seção',
492
-	'info_url' => 'URL:',
493
-	'info_url_proxy' => 'URL do proxy',
494
-	'info_url_proxy_pas_conforme' => 'O URL do proxy não é válido.',
495
-	'info_url_site_pas_conforme' => 'O URL do site não é válido.',
496
-	'info_url_test_proxy' => 'URL de teste',
497
-	'info_urlref' => 'Link hipertexto:',
498
-	'info_utilisation_spip' => 'Você pode agora começar a utilizar o sistema de publicação assistida...',
499
-	'info_visites_par_mois' => 'Exibir por mês:',
500
-	'info_visiteur_1' => 'Visitante',
501
-	'info_visiteur_2' => 'do site público',
502
-	'info_visiteurs' => 'Visitantes',
503
-	'info_visiteurs_02' => 'Visitantes do site público',
504
-	'info_webmestre_forces' => 'Os webmasters são definidos em <tt>@file_options@</tt>.',
505
-	'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem:',
506
-	'install_connect_ok' => 'A nova base de dados foi corretamente declarada sob o nome de servidor @connect@.',
507
-	'install_echec_annonce' => 'A instalação irá, provavelmente, falhar, ou levar a um site que não funciona...',
508
-	'install_extension_mbstring' => 'O SPIP não funciona com:',
509
-	'install_extension_php_obligatoire' => 'O SPIP exige a extensão php:',
510
-	'install_login_base_hebergeur' => 'Login de conexão atribuído pelo serviço de hospedagem:',
511
-	'install_nom_base_hebergeur' => 'Nome da base atribuído pelo serviço de hospedagem:',
512
-	'install_pas_table' => 'Base atualmente sem tabelas',
513
-	'install_pass_base_hebergeur' => 'Senha de conexão atribuída pelo serviço de hospedagem',
514
-	'install_php_extension' => 'As extensões a seguir estão faltando: @extensions@',
515
-	'install_php_version' => 'PHP versão @version@ é insuficiente (mínimo = @minimum@)',
516
-	'install_php_version_max' => 'A versão @version@ do PHP é muito recente (máximo = @maximum@)',
517
-	'install_select_langue' => 'Escolha um idioma e clique no botão «avançar» para iniciar o procedimento de instalação.',
518
-	'install_select_type_db' => 'Indicar o tipo de base de dados:',
519
-	'install_select_type_mysql' => 'MySQL',
520
-	'install_select_type_pg' => 'PostgreSQL',
521
-	'install_select_type_sqlite2' => 'SQLite 2',
522
-	'install_select_type_sqlite3' => 'SQLite 3',
523
-	'install_serveur_hebergeur' => 'Servidor de base de dados atribuído pelo serviço de hospedagem',
524
-	'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:',
525
-	'install_tables_base' => 'Tabelas da base',
526
-	'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (a mais comum), e <b>SQLite</b>.',
527
-	'install_types_db_connus_avertissement' => 'O suporte ao <b>PostgreSQL</b> é também proposto a título experimental',
528
-	'instituer_erreur_statut_a_change' => 'O status já foi alterado',
529
-	'instituer_erreur_statut_non_autorise' => 'Você não pode escolher este status',
530
-	'intem_redacteur' => 'redator',
531
-	'intitule_licence' => 'Licença',
532
-	'item_accepter_inscriptions' => 'Aceitar as inscrições',
533
-	'item_activer_messages_avertissement' => 'Ativar as mensagens de aviso',
534
-	'item_administrateur_2' => 'administrador',
535
-	'item_afficher_calendrier' => 'Exibir no calendário',
536
-	'item_autoriser_syndication_integrale' => 'Difundir a íntegra das matérias nos arquivos de sindicação',
537
-	'item_choix_administrateurs' => 'os administradores',
538
-	'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.',
539
-	'item_choix_non_generation_miniature' => 'Não gerar as miniaturas das imagens.',
540
-	'item_choix_redacteurs' => 'os redatores',
541
-	'item_choix_visiteurs' => 'os visitantes do site público',
542
-	'item_creer_fichiers_authent' => 'Criar os arquivos .htpasswd',
543
-	'item_login' => 'Login',
544
-	'item_messagerie_agenda' => 'Ativar as mesagens internas e a agenda',
545
-	'item_mots_cles_association_articles' => 'às matérias',
546
-	'item_mots_cles_association_rubriques' => 'às seções',
547
-	'item_mots_cles_association_sites' => 'aos sites referenciados ou sindicados.',
548
-	'item_non' => 'Não',
549
-	'item_non_accepter_inscriptions' => 'Não aceitar inscrições',
550
-	'item_non_activer_messages_avertissement' => 'Sem mensagens de aviso',
551
-	'item_non_afficher_calendrier' => 'Não exibir no calendário',
552
-	'item_non_autoriser_syndication_integrale' => 'Difundir apenas um resumo',
553
-	'item_non_creer_fichiers_authent' => 'Não criar os arquivos',
554
-	'item_non_messagerie_agenda' => 'Desativar as mensagens internas e a agenda',
555
-	'item_non_publier_articles' => 'Não publicar as matérias antes da data de publicação fixada.',
556
-	'item_nouvel_auteur' => 'Novo autor',
557
-	'item_nouvelle_rubrique' => 'Nova seção',
558
-	'item_oui' => 'Sim',
559
-	'item_publier_articles' => 'Publicar as matérias seja qual for a sua data de publicação.',
560
-	'item_reponse_article' => 'Resposta à matéria',
561
-	'item_visiteur' => 'Visitante',
486
+    'info_traductions' => 'Traduções',
487
+    'info_travail_colaboratif' => 'Trabalho colaborativo nas matérias',
488
+    'info_un_article' => 'uma matéria,',
489
+    'info_un_site' => 'um site,',
490
+    'info_une_rubrique' => 'uma seção,',
491
+    'info_une_rubrique_02' => '1 seção',
492
+    'info_url' => 'URL:',
493
+    'info_url_proxy' => 'URL do proxy',
494
+    'info_url_proxy_pas_conforme' => 'O URL do proxy não é válido.',
495
+    'info_url_site_pas_conforme' => 'O URL do site não é válido.',
496
+    'info_url_test_proxy' => 'URL de teste',
497
+    'info_urlref' => 'Link hipertexto:',
498
+    'info_utilisation_spip' => 'Você pode agora começar a utilizar o sistema de publicação assistida...',
499
+    'info_visites_par_mois' => 'Exibir por mês:',
500
+    'info_visiteur_1' => 'Visitante',
501
+    'info_visiteur_2' => 'do site público',
502
+    'info_visiteurs' => 'Visitantes',
503
+    'info_visiteurs_02' => 'Visitantes do site público',
504
+    'info_webmestre_forces' => 'Os webmasters são definidos em <tt>@file_options@</tt>.',
505
+    'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem:',
506
+    'install_connect_ok' => 'A nova base de dados foi corretamente declarada sob o nome de servidor @connect@.',
507
+    'install_echec_annonce' => 'A instalação irá, provavelmente, falhar, ou levar a um site que não funciona...',
508
+    'install_extension_mbstring' => 'O SPIP não funciona com:',
509
+    'install_extension_php_obligatoire' => 'O SPIP exige a extensão php:',
510
+    'install_login_base_hebergeur' => 'Login de conexão atribuído pelo serviço de hospedagem:',
511
+    'install_nom_base_hebergeur' => 'Nome da base atribuído pelo serviço de hospedagem:',
512
+    'install_pas_table' => 'Base atualmente sem tabelas',
513
+    'install_pass_base_hebergeur' => 'Senha de conexão atribuída pelo serviço de hospedagem',
514
+    'install_php_extension' => 'As extensões a seguir estão faltando: @extensions@',
515
+    'install_php_version' => 'PHP versão @version@ é insuficiente (mínimo = @minimum@)',
516
+    'install_php_version_max' => 'A versão @version@ do PHP é muito recente (máximo = @maximum@)',
517
+    'install_select_langue' => 'Escolha um idioma e clique no botão «avançar» para iniciar o procedimento de instalação.',
518
+    'install_select_type_db' => 'Indicar o tipo de base de dados:',
519
+    'install_select_type_mysql' => 'MySQL',
520
+    'install_select_type_pg' => 'PostgreSQL',
521
+    'install_select_type_sqlite2' => 'SQLite 2',
522
+    'install_select_type_sqlite3' => 'SQLite 3',
523
+    'install_serveur_hebergeur' => 'Servidor de base de dados atribuído pelo serviço de hospedagem',
524
+    'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:',
525
+    'install_tables_base' => 'Tabelas da base',
526
+    'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (a mais comum), e <b>SQLite</b>.',
527
+    'install_types_db_connus_avertissement' => 'O suporte ao <b>PostgreSQL</b> é também proposto a título experimental',
528
+    'instituer_erreur_statut_a_change' => 'O status já foi alterado',
529
+    'instituer_erreur_statut_non_autorise' => 'Você não pode escolher este status',
530
+    'intem_redacteur' => 'redator',
531
+    'intitule_licence' => 'Licença',
532
+    'item_accepter_inscriptions' => 'Aceitar as inscrições',
533
+    'item_activer_messages_avertissement' => 'Ativar as mensagens de aviso',
534
+    'item_administrateur_2' => 'administrador',
535
+    'item_afficher_calendrier' => 'Exibir no calendário',
536
+    'item_autoriser_syndication_integrale' => 'Difundir a íntegra das matérias nos arquivos de sindicação',
537
+    'item_choix_administrateurs' => 'os administradores',
538
+    'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.',
539
+    'item_choix_non_generation_miniature' => 'Não gerar as miniaturas das imagens.',
540
+    'item_choix_redacteurs' => 'os redatores',
541
+    'item_choix_visiteurs' => 'os visitantes do site público',
542
+    'item_creer_fichiers_authent' => 'Criar os arquivos .htpasswd',
543
+    'item_login' => 'Login',
544
+    'item_messagerie_agenda' => 'Ativar as mesagens internas e a agenda',
545
+    'item_mots_cles_association_articles' => 'às matérias',
546
+    'item_mots_cles_association_rubriques' => 'às seções',
547
+    'item_mots_cles_association_sites' => 'aos sites referenciados ou sindicados.',
548
+    'item_non' => 'Não',
549
+    'item_non_accepter_inscriptions' => 'Não aceitar inscrições',
550
+    'item_non_activer_messages_avertissement' => 'Sem mensagens de aviso',
551
+    'item_non_afficher_calendrier' => 'Não exibir no calendário',
552
+    'item_non_autoriser_syndication_integrale' => 'Difundir apenas um resumo',
553
+    'item_non_creer_fichiers_authent' => 'Não criar os arquivos',
554
+    'item_non_messagerie_agenda' => 'Desativar as mensagens internas e a agenda',
555
+    'item_non_publier_articles' => 'Não publicar as matérias antes da data de publicação fixada.',
556
+    'item_nouvel_auteur' => 'Novo autor',
557
+    'item_nouvelle_rubrique' => 'Nova seção',
558
+    'item_oui' => 'Sim',
559
+    'item_publier_articles' => 'Publicar as matérias seja qual for a sua data de publicação.',
560
+    'item_reponse_article' => 'Resposta à matéria',
561
+    'item_visiteur' => 'Visitante',
562 562
 
563
-	// J
564
-	'jour_non_connu_nc' => 'n.c.',
563
+    // J
564
+    'jour_non_connu_nc' => 'n.c.',
565 565
 
566
-	// L
567
-	'label_bando_outils' => 'Barra de ferramentas',
568
-	'label_bando_outils_afficher' => 'Exibir as ferramentas',
569
-	'label_bando_outils_masquer' => 'Esconder as ferramentas',
570
-	'label_choix_langue' => 'Escolha o seu idioma',
571
-	'label_langue' => 'Idioma',
572
-	'label_nom_fichier_connect' => 'Informe o nome usado por este servidor',
573
-	'label_slogan_site' => 'Slogan do site',
574
-	'label_taille_ecran' => 'Largura da tela',
575
-	'label_texte_et_icones_navigation' => 'Menu de navegação',
576
-	'label_texte_et_icones_page' => 'Exibição na página',
577
-	'ldap_correspondance' => 'herança do campo @champ@',
578
-	'ldap_correspondance_1' => 'Herança dos campos LDAP',
579
-	'ldap_correspondance_2' => 'Para cada um dos campos SPIP a seguir, indique o nome do campo LDAP correspondente. Deixe em branco para não preencher, separe por espaços ou vírgulas para tentar vários campos LDAP.',
580
-	'lien_ajouter_auteur' => 'Incluir este autor',
581
-	'lien_ajouter_une_rubrique' => 'Incluir esta seção',
582
-	'lien_email' => 'e-mail',
583
-	'lien_nom_site' => 'NOME DO SITE:',
584
-	'lien_rapide_contenu' => 'Ir para o conteúdo',
585
-	'lien_rapide_navigation' => 'Ir para a navegação',
586
-	'lien_rapide_recherche' => 'Ir para a busca',
587
-	'lien_retirer_auteur' => 'Retirar o autor',
588
-	'lien_retirer_rubrique' => 'Excluir a seção',
589
-	'lien_retirer_tous_auteurs' => 'Retirar todos os autores',
590
-	'lien_retirer_toutes_rubriques' => 'Retirar todas as seções',
591
-	'lien_site' => 'site',
592
-	'lien_tout_decocher' => 'Desmarcar tudo',
593
-	'lien_tout_deplier' => 'Expandir tudo',
594
-	'lien_tout_replier' => 'Retrair tudo',
595
-	'lien_tout_supprimer' => 'Excluir tudo',
596
-	'lien_trier_nom' => 'Ordenar pelo nome',
597
-	'lien_trier_nombre_articles' => 'Ordenar por número de matérias',
598
-	'lien_trier_statut' => 'Ordenar pelo status',
599
-	'lien_voir_en_ligne' => 'VER ONLINE:',
600
-	'logo_article' => 'Ícone da matéria',
601
-	'logo_auteur' => 'Ícone do autor',
602
-	'logo_rubrique' => 'Ícone da seção',
603
-	'logo_site' => 'Ícone deste site',
604
-	'logo_standard_rubrique' => 'Ícone padrão das seções',
605
-	'logo_survol' => 'Ícone para mouseOver',
566
+    // L
567
+    'label_bando_outils' => 'Barra de ferramentas',
568
+    'label_bando_outils_afficher' => 'Exibir as ferramentas',
569
+    'label_bando_outils_masquer' => 'Esconder as ferramentas',
570
+    'label_choix_langue' => 'Escolha o seu idioma',
571
+    'label_langue' => 'Idioma',
572
+    'label_nom_fichier_connect' => 'Informe o nome usado por este servidor',
573
+    'label_slogan_site' => 'Slogan do site',
574
+    'label_taille_ecran' => 'Largura da tela',
575
+    'label_texte_et_icones_navigation' => 'Menu de navegação',
576
+    'label_texte_et_icones_page' => 'Exibição na página',
577
+    'ldap_correspondance' => 'herança do campo @champ@',
578
+    'ldap_correspondance_1' => 'Herança dos campos LDAP',
579
+    'ldap_correspondance_2' => 'Para cada um dos campos SPIP a seguir, indique o nome do campo LDAP correspondente. Deixe em branco para não preencher, separe por espaços ou vírgulas para tentar vários campos LDAP.',
580
+    'lien_ajouter_auteur' => 'Incluir este autor',
581
+    'lien_ajouter_une_rubrique' => 'Incluir esta seção',
582
+    'lien_email' => 'e-mail',
583
+    'lien_nom_site' => 'NOME DO SITE:',
584
+    'lien_rapide_contenu' => 'Ir para o conteúdo',
585
+    'lien_rapide_navigation' => 'Ir para a navegação',
586
+    'lien_rapide_recherche' => 'Ir para a busca',
587
+    'lien_retirer_auteur' => 'Retirar o autor',
588
+    'lien_retirer_rubrique' => 'Excluir a seção',
589
+    'lien_retirer_tous_auteurs' => 'Retirar todos os autores',
590
+    'lien_retirer_toutes_rubriques' => 'Retirar todas as seções',
591
+    'lien_site' => 'site',
592
+    'lien_tout_decocher' => 'Desmarcar tudo',
593
+    'lien_tout_deplier' => 'Expandir tudo',
594
+    'lien_tout_replier' => 'Retrair tudo',
595
+    'lien_tout_supprimer' => 'Excluir tudo',
596
+    'lien_trier_nom' => 'Ordenar pelo nome',
597
+    'lien_trier_nombre_articles' => 'Ordenar por número de matérias',
598
+    'lien_trier_statut' => 'Ordenar pelo status',
599
+    'lien_voir_en_ligne' => 'VER ONLINE:',
600
+    'logo_article' => 'Ícone da matéria',
601
+    'logo_auteur' => 'Ícone do autor',
602
+    'logo_rubrique' => 'Ícone da seção',
603
+    'logo_site' => 'Ícone deste site',
604
+    'logo_standard_rubrique' => 'Ícone padrão das seções',
605
+    'logo_survol' => 'Ícone para mouseOver',
606 606
 
607
-	// M
608
-	'menu_aide_installation_choix_base' => 'Seleção da sua base',
609
-	'module_fichier_langue' => 'Arquivo de idioma',
610
-	'module_raccourci' => 'Atalho',
611
-	'module_texte_affiche' => 'Texto exibido',
612
-	'module_texte_explicatif' => 'Você pode inserir os atalhos a seguir nos templates do seu site público. Eles serão traduzidos automaticamente para os idiomas para os quais exista um arquivo de idioma.',
613
-	'module_texte_traduction' => 'O arquivo de idioma «@module@» está disponível em:',
614
-	'mois_non_connu' => 'desconhecido',
607
+    // M
608
+    'menu_aide_installation_choix_base' => 'Seleção da sua base',
609
+    'module_fichier_langue' => 'Arquivo de idioma',
610
+    'module_raccourci' => 'Atalho',
611
+    'module_texte_affiche' => 'Texto exibido',
612
+    'module_texte_explicatif' => 'Você pode inserir os atalhos a seguir nos templates do seu site público. Eles serão traduzidos automaticamente para os idiomas para os quais exista um arquivo de idioma.',
613
+    'module_texte_traduction' => 'O arquivo de idioma «@module@» está disponível em:',
614
+    'mois_non_connu' => 'desconhecido',
615 615
 
616
-	// N
617
-	'nouvelle_version_spip' => 'A versão @version@ do SPIP está disponível',
618
-	'nouvelle_version_spip_majeure' => 'Uma nova versão SPIP @version@ está disponível',
616
+    // N
617
+    'nouvelle_version_spip' => 'A versão @version@ do SPIP está disponível',
618
+    'nouvelle_version_spip_majeure' => 'Uma nova versão SPIP @version@ está disponível',
619 619
 
620
-	// O
621
-	'onglet_contenu' => 'Conteúdo',
622
-	'onglet_declarer_une_autre_base' => 'Configurar outra base',
623
-	'onglet_discuter' => 'Discutir',
624
-	'onglet_interactivite' => 'Interatividade',
625
-	'onglet_proprietes' => 'Propriedades',
626
-	'onglet_repartition_actuelle' => 'atualmente',
627
-	'onglet_sous_rubriques' => 'Subseções',
620
+    // O
621
+    'onglet_contenu' => 'Conteúdo',
622
+    'onglet_declarer_une_autre_base' => 'Configurar outra base',
623
+    'onglet_discuter' => 'Discutir',
624
+    'onglet_interactivite' => 'Interatividade',
625
+    'onglet_proprietes' => 'Propriedades',
626
+    'onglet_repartition_actuelle' => 'atualmente',
627
+    'onglet_sous_rubriques' => 'Subseções',
628 628
 
629
-	// P
630
-	'page_pas_proxy' => 'Esta página não deve passar pelo proxy',
631
-	'pas_de_proxy_pour' => 'Se necessário, indique as máquinas ou domínios para os quais este proxy não se aplica (por exemplo: @exemple@)',
632
-	'phpinfo' => 'Configuração PHP',
633
-	'plugin_charge_paquet' => 'Carregamento do pacote @name@',
634
-	'plugin_charger' => 'Transferir',
635
-	'plugin_erreur_charger' => 'erro: não foi possível carregar @zip@',
636
-	'plugin_erreur_droit1' => 'O diretório <code>@dest@</code> não está acessível para escrita.',
637
-	'plugin_erreur_droit2' => 'Por favor, verifique os direitos deste diretório (e criá-lo, caso não exista), ou instalar os arquivos por FTP.',
638
-	'plugin_erreur_zip' => 'falha pclzip: erro @status@',
639
-	'plugin_etat_developpement' => 'em desenvolvimento',
640
-	'plugin_etat_experimental' => 'experimental',
641
-	'plugin_etat_stable' => 'estável',
642
-	'plugin_etat_test' => 'em teste',
643
-	'plugin_impossible_activer' => 'Não foi possível ativar o plugin @plugin@',
644
-	'plugin_info_automatique1' => 'Se você deseja autorizar a instalaçào automática dos plugins, por favor:',
645
-	'plugin_info_automatique1_lib' => 'Se você deseja autorizar a instalação automática desta biblioteca, por favor:',
646
-	'plugin_info_automatique2' => 'crie um diretório <code>@rep@</code> ;',
647
-	'plugin_info_automatique3' => 'verifique se o servidor está autorizado a escrever neste diretório',
648
-	'plugin_info_automatique_creer' => 'a ser criado na raiz do site.',
649
-	'plugin_info_automatique_exemples' => 'exemplos:',
650
-	'plugin_info_automatique_ftp' => 'Você pode instalar os plugins, por FTP, no diretório <tt>@rep@</tt>',
651
-	'plugin_info_automatique_lib' => 'Alguns plugins precisam também poder transferir arquivos para o diretório <code>lib/</code>, a ser criado, caso não exista, na raiz do site.',
652
-	'plugin_info_automatique_liste' => 'Suas listas de plugins:',
653
-	'plugin_info_automatique_liste_officielle' => 'os plugins oficiais',
654
-	'plugin_info_automatique_liste_update' => 'Atualizar as listas',
655
-	'plugin_info_automatique_ou' => 'ou...',
656
-	'plugin_info_automatique_select' => 'Selecione abaixo um plugin: O SPIP o transferirá e o instalará no diretório <code>@rep@</code>; se o plugin já existir, será atualizado.',
657
-	'plugin_info_credit' => 'Créditos',
658
-	'plugin_info_erreur_xml' => 'A declaração deste plugin está incorreta',
659
-	'plugin_info_install_ok' => 'Instalação bem sucedida',
660
-	'plugin_info_necessite' => 'Requer:',
661
-	'plugin_info_non_compatible_spip' => 'Este plugin não é compatível com esta versão do SPIP',
662
-	'plugin_info_plugins_dist_1' => 'Os plugins abaixo são carregados e ativados no diretório @plugins_dist@.',
663
-	'plugin_info_plugins_dist_2' => 'Eles não são desativáveis.',
664
-	'plugin_info_telecharger' => 'transferir de @url@ e instalar em @rep@',
665
-	'plugin_info_upgrade_ok' => 'Atualização bem sucedida',
666
-	'plugin_librairies_installees' => 'Bibliotecas instaladas',
667
-	'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ na versão @version@.',
668
-	'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@',
669
-	'plugin_necessite_lib' => 'Este plugin precisa da biblioteca @lib@',
670
-	'plugin_necessite_php' => 'Requer @plugin@ na versão @version@.',
671
-	'plugin_necessite_plugin' => 'Precisa do plugin @plugin@, na versão @version@.',
672
-	'plugin_necessite_plugin_sans_version' => 'Precisa do plugin @plugin@',
673
-	'plugin_necessite_spip' => 'É necessário o SPIP na versão @version@, pelo menos.',
674
-	'plugin_source' => 'fonte: ',
675
-	'plugin_titre_automatique' => 'Instalação automática',
676
-	'plugin_titre_automatique_ajouter' => 'Incluir plugins',
677
-	'plugin_titre_installation' => 'Instalação do plugin @plugin@',
678
-	'plugin_titre_modifier' => 'Meus plugins',
679
-	'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.',
680
-	'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.',
681
-	'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.',
682
-	'plugin_zip_active' => 'Continue para o ativar',
683
-	'plugin_zip_adresse' => 'Indique abaixo o endereço de um arquivo zip de plugin a ser transferido, ou ainda o endereço de uma lista de plugins.',
684
-	'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista',
685
-	'plugin_zip_content' => 'Ele contém os arquivos a seguir (@taille@),<br />prontos para serem instalados no diretório <code>@rep@</code>',
686
-	'plugin_zip_installe_finie' => 'O arquivo @zip@ foi descompactado e instalado.',
687
-	'plugin_zip_installe_rep_finie' => 'O arquivo @zip@ foi descompactado e instalado no diretório @rep@',
688
-	'plugin_zip_installer' => 'Você pode, agora, instalá-lo.',
689
-	'plugin_zip_telecharge' => 'O arquivo @zip@ foi transferido',
690
-	'plugins_actif_aucun' => 'Nenhum plugin ativado.',
691
-	'plugins_actif_un' => 'Um plugin ativado.',
692
-	'plugins_actifs' => '@count@ plugins ativados.',
693
-	'plugins_actifs_liste' => 'Ativos',
694
-	'plugins_compte' => '@count@ plugins',
695
-	'plugins_disponible_un' => 'Um plugin disponível.',
696
-	'plugins_disponibles' => '@count@ plugins disponiveis.',
697
-	'plugins_erreur' => 'Erro nos plugins: @plugins@',
698
-	'plugins_liste' => 'Lista dos plugins',
699
-	'plugins_liste_dist' => 'Plugins bloqueados',
700
-	'plugins_recents' => 'Plugins recentes.',
701
-	'plugins_tous_liste' => 'Todos',
702
-	'plugins_vue_hierarchie' => 'Hierarquia',
703
-	'plugins_vue_liste' => 'Lista',
704
-	'protocole_ldap' => 'Versão do protocolo:',
629
+    // P
630
+    'page_pas_proxy' => 'Esta página não deve passar pelo proxy',
631
+    'pas_de_proxy_pour' => 'Se necessário, indique as máquinas ou domínios para os quais este proxy não se aplica (por exemplo: @exemple@)',
632
+    'phpinfo' => 'Configuração PHP',
633
+    'plugin_charge_paquet' => 'Carregamento do pacote @name@',
634
+    'plugin_charger' => 'Transferir',
635
+    'plugin_erreur_charger' => 'erro: não foi possível carregar @zip@',
636
+    'plugin_erreur_droit1' => 'O diretório <code>@dest@</code> não está acessível para escrita.',
637
+    'plugin_erreur_droit2' => 'Por favor, verifique os direitos deste diretório (e criá-lo, caso não exista), ou instalar os arquivos por FTP.',
638
+    'plugin_erreur_zip' => 'falha pclzip: erro @status@',
639
+    'plugin_etat_developpement' => 'em desenvolvimento',
640
+    'plugin_etat_experimental' => 'experimental',
641
+    'plugin_etat_stable' => 'estável',
642
+    'plugin_etat_test' => 'em teste',
643
+    'plugin_impossible_activer' => 'Não foi possível ativar o plugin @plugin@',
644
+    'plugin_info_automatique1' => 'Se você deseja autorizar a instalaçào automática dos plugins, por favor:',
645
+    'plugin_info_automatique1_lib' => 'Se você deseja autorizar a instalação automática desta biblioteca, por favor:',
646
+    'plugin_info_automatique2' => 'crie um diretório <code>@rep@</code> ;',
647
+    'plugin_info_automatique3' => 'verifique se o servidor está autorizado a escrever neste diretório',
648
+    'plugin_info_automatique_creer' => 'a ser criado na raiz do site.',
649
+    'plugin_info_automatique_exemples' => 'exemplos:',
650
+    'plugin_info_automatique_ftp' => 'Você pode instalar os plugins, por FTP, no diretório <tt>@rep@</tt>',
651
+    'plugin_info_automatique_lib' => 'Alguns plugins precisam também poder transferir arquivos para o diretório <code>lib/</code>, a ser criado, caso não exista, na raiz do site.',
652
+    'plugin_info_automatique_liste' => 'Suas listas de plugins:',
653
+    'plugin_info_automatique_liste_officielle' => 'os plugins oficiais',
654
+    'plugin_info_automatique_liste_update' => 'Atualizar as listas',
655
+    'plugin_info_automatique_ou' => 'ou...',
656
+    'plugin_info_automatique_select' => 'Selecione abaixo um plugin: O SPIP o transferirá e o instalará no diretório <code>@rep@</code>; se o plugin já existir, será atualizado.',
657
+    'plugin_info_credit' => 'Créditos',
658
+    'plugin_info_erreur_xml' => 'A declaração deste plugin está incorreta',
659
+    'plugin_info_install_ok' => 'Instalação bem sucedida',
660
+    'plugin_info_necessite' => 'Requer:',
661
+    'plugin_info_non_compatible_spip' => 'Este plugin não é compatível com esta versão do SPIP',
662
+    'plugin_info_plugins_dist_1' => 'Os plugins abaixo são carregados e ativados no diretório @plugins_dist@.',
663
+    'plugin_info_plugins_dist_2' => 'Eles não são desativáveis.',
664
+    'plugin_info_telecharger' => 'transferir de @url@ e instalar em @rep@',
665
+    'plugin_info_upgrade_ok' => 'Atualização bem sucedida',
666
+    'plugin_librairies_installees' => 'Bibliotecas instaladas',
667
+    'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ na versão @version@.',
668
+    'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@',
669
+    'plugin_necessite_lib' => 'Este plugin precisa da biblioteca @lib@',
670
+    'plugin_necessite_php' => 'Requer @plugin@ na versão @version@.',
671
+    'plugin_necessite_plugin' => 'Precisa do plugin @plugin@, na versão @version@.',
672
+    'plugin_necessite_plugin_sans_version' => 'Precisa do plugin @plugin@',
673
+    'plugin_necessite_spip' => 'É necessário o SPIP na versão @version@, pelo menos.',
674
+    'plugin_source' => 'fonte: ',
675
+    'plugin_titre_automatique' => 'Instalação automática',
676
+    'plugin_titre_automatique_ajouter' => 'Incluir plugins',
677
+    'plugin_titre_installation' => 'Instalação do plugin @plugin@',
678
+    'plugin_titre_modifier' => 'Meus plugins',
679
+    'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.',
680
+    'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.',
681
+    'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.',
682
+    'plugin_zip_active' => 'Continue para o ativar',
683
+    'plugin_zip_adresse' => 'Indique abaixo o endereço de um arquivo zip de plugin a ser transferido, ou ainda o endereço de uma lista de plugins.',
684
+    'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista',
685
+    'plugin_zip_content' => 'Ele contém os arquivos a seguir (@taille@),<br />prontos para serem instalados no diretório <code>@rep@</code>',
686
+    'plugin_zip_installe_finie' => 'O arquivo @zip@ foi descompactado e instalado.',
687
+    'plugin_zip_installe_rep_finie' => 'O arquivo @zip@ foi descompactado e instalado no diretório @rep@',
688
+    'plugin_zip_installer' => 'Você pode, agora, instalá-lo.',
689
+    'plugin_zip_telecharge' => 'O arquivo @zip@ foi transferido',
690
+    'plugins_actif_aucun' => 'Nenhum plugin ativado.',
691
+    'plugins_actif_un' => 'Um plugin ativado.',
692
+    'plugins_actifs' => '@count@ plugins ativados.',
693
+    'plugins_actifs_liste' => 'Ativos',
694
+    'plugins_compte' => '@count@ plugins',
695
+    'plugins_disponible_un' => 'Um plugin disponível.',
696
+    'plugins_disponibles' => '@count@ plugins disponiveis.',
697
+    'plugins_erreur' => 'Erro nos plugins: @plugins@',
698
+    'plugins_liste' => 'Lista dos plugins',
699
+    'plugins_liste_dist' => 'Plugins bloqueados',
700
+    'plugins_recents' => 'Plugins recentes.',
701
+    'plugins_tous_liste' => 'Todos',
702
+    'plugins_vue_hierarchie' => 'Hierarquia',
703
+    'plugins_vue_liste' => 'Lista',
704
+    'protocole_ldap' => 'Versão do protocolo:',
705 705
 
706
-	// Q
707
-	'queue_executer_maintenant' => 'Executar agora',
708
-	'queue_info_purger' => 'Você pode excluir todas as tarefas de fundo em espera e reinicializar a lista com as tarefas periódicas',
709
-	'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera',
710
-	'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s',
711
-	'queue_no_job_in_queue' => 'Nenhum tarefa em espera',
712
-	'queue_one_job_in_queue' => '1 tarefa em espera',
713
-	'queue_priorite_tache' => 'prioridade',
714
-	'queue_purger_queue' => 'Reiniciar a lista de tarefas',
715
-	'queue_titre' => 'Tarefas de fundo',
706
+    // Q
707
+    'queue_executer_maintenant' => 'Executar agora',
708
+    'queue_info_purger' => 'Você pode excluir todas as tarefas de fundo em espera e reinicializar a lista com as tarefas periódicas',
709
+    'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera',
710
+    'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s',
711
+    'queue_no_job_in_queue' => 'Nenhum tarefa em espera',
712
+    'queue_one_job_in_queue' => '1 tarefa em espera',
713
+    'queue_priorite_tache' => 'prioridade',
714
+    'queue_purger_queue' => 'Reiniciar a lista de tarefas',
715
+    'queue_titre' => 'Tarefas de fundo',
716 716
 
717
-	// R
718
-	'repertoire_plugins' => 'Diretório:',
719
-	'required' => '(obrigatório)',
717
+    // R
718
+    'repertoire_plugins' => 'Diretório:',
719
+    'required' => '(obrigatório)',
720 720
 
721
-	// S
722
-	'sans_heure' => 'sem hora',
723
-	'statut_admin_restreint' => '(admin limitado)',
724
-	'statut_webmestre' => 'webmaster',
721
+    // S
722
+    'sans_heure' => 'sem hora',
723
+    'statut_admin_restreint' => '(admin limitado)',
724
+    'statut_webmestre' => 'webmaster',
725 725
 
726
-	// T
727
-	'tache_cron_asap' => 'Tarefa CRON @function@ (ASAP)',
728
-	'tache_cron_secondes' => 'Tarefa CRON @function@ (a cada @nb@ s)',
729
-	'taille_cache_image' => 'As imagens calculadas automaticamente pelo SPIP (ícones de documentos, títulos apresentados sob a forma gráfica, funções matemáticas em formato TeX...) ocupam, no diretório @dir@, um total de @taille@.',
730
-	'taille_cache_moins_de' => 'O tamanho do cache é menor do que @octets@.',
731
-	'taille_cache_octets' => 'O tamanho atual do cache é de cerca de @octets@.',
732
-	'taille_cache_vide' => 'O cache está vazio.',
733
-	'taille_repertoire_cache' => 'Tamanho do diretório cache',
734
-	'text_article_propose_publication' => 'Matéria proposta para publicação.',
735
-	'texte_acces_ldap_anonyme_1' => 'Alguns servidores LDAP não aceitam nenhum acesso anônimo. Neste caso, é necessário especificar um identificador de acesso inicial de modo a poder, em seguida, pesquisar as informações no diretório. Na maior parte dos casos, entretanto, os campos a seguir poderão ser deixados em branco.',
736
-	'texte_admin_effacer_01' => 'Este comando apaga <i>todo</i> o conteúdo da base de dados,incluindo <i>todos</i> os acessos dos redatores e administradores. Após executá-lo, você deverá reinstalar o SPIP para recriar uma nova base de dados bem como um acesso inicial de administrador.',
737
-	'texte_adresse_annuaire_1' => '(Se o seu diretório está instalado na mesma máquina que este website, trata-se provavelmente de «localhost».)',
738
-	'texte_ajout_auteur' => 'O autor a seguir foi incluído na matéria:',
739
-	'texte_annuaire_ldap_1' => 'Se você tem acesso a um diretório LDAP, você poderá utilizá-lo para importar automaticamente os usuários para o SPIP.',
740
-	'texte_article_statut' => 'Esta matéria está:',
741
-	'texte_article_virtuel' => 'Matéria virtual',
742
-	'texte_article_virtuel_reference' => '<b>Matéria virtual:</b> matéria referenciada no seu site SPIP, mas redirecionada para um outro URL. Para cancelar o redirecionamento, apague o URL abaixo.',
743
-	'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"',
744
-	'texte_auteur_messagerie' => 'Este site pode monitorar permanentemente a lista de editores conectados, permitindo-lhe trocar mensagens em tempo real. Você pode decidir não aparecer nessa lista (ficando "invisível" para os outros usuários).',
745
-	'texte_auteurs' => 'OS AUTORES',
746
-	'texte_choix_base_1' => 'Escolha a sua base:',
747
-	'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.',
748
-	'texte_choix_base_3' => '<b>Escolha</b> abaixo a que lhe foi atribuída pelo seu serviço de hospedagem:',
749
-	'texte_choix_table_prefix' => 'Prefixo das tabelas:',
750
-	'texte_compte_element' => '@count@ elemento',
751
-	'texte_compte_elements' => '@count@ elementos',
752
-	'texte_conflit_edition_correction' => 'Por favor, controle abaixo as diferenças entre as duas versões do texto; você pode também copiar as suas modificações e depois recomeçar.',
753
-	'texte_connexion_mysql' => 'Consulte as informações fornecidas pelo seu serviço de hospedagem: nelas, você deverá encontrar o servidor de base de dados fornecido e os seus dados de conexão ao servidor SQL.',
754
-	'texte_contenu_article' => '(Conteúdo da matéria em poucas palavras.)',
755
-	'texte_contenu_articles' => 'De acordo com o layout adotado pelo seu site, você poderá decidir se certos elementos das matérias serão utilizados. Use a listagem abaixo para indicar quais elementos estão disponíveis.',
756
-	'texte_crash_base' => 'Se a sua base de dados se corrompeu, você poderá tentar uma reparação automática.',
757
-	'texte_creer_rubrique' => 'Antes de poder escrever matérias, você precisa criar uma seção.',
758
-	'texte_date_creation_article' => 'DATA DE CRIAÇÃO DA MATÉRIA:',
759
-	'texte_date_creation_objet' => 'Data de criação:', # on ajoute le &quot;:&quot;
760
-	'texte_date_publication_anterieure' => 'Data de redação anterior:',
761
-	'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redação anterior.',
762
-	'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:',
763
-	'texte_date_publication_objet' => 'Data de publicação online:',
764
-	'texte_definir_comme_traduction_rubrique' => 'Esta seção é uma tradução da seção número:',
765
-	'texte_descriptif_rapide' => 'Descrição rápida',
766
-	'texte_effacer_base' => 'Apagar a base de dados do SPIP',
767
-	'texte_effacer_statistiques' => 'Apagar as estatísticas',
768
-	'texte_en_cours_validation' => 'Os conteúdos abaixo estão propostos para publicação.',
769
-	'texte_enrichir_mise_a_jour' => 'Você pode enriquecer a diagramação do seu texto usando «atalhos tipográficos».',
770
-	'texte_fichier_authent' => '<b>O SPIP pode criar os arquivos especiais  <tt>.htpasswd</tt> e <tt>.htpasswd-admin</tt> no diretório @dossier@?</b><p>
726
+    // T
727
+    'tache_cron_asap' => 'Tarefa CRON @function@ (ASAP)',
728
+    'tache_cron_secondes' => 'Tarefa CRON @function@ (a cada @nb@ s)',
729
+    'taille_cache_image' => 'As imagens calculadas automaticamente pelo SPIP (ícones de documentos, títulos apresentados sob a forma gráfica, funções matemáticas em formato TeX...) ocupam, no diretório @dir@, um total de @taille@.',
730
+    'taille_cache_moins_de' => 'O tamanho do cache é menor do que @octets@.',
731
+    'taille_cache_octets' => 'O tamanho atual do cache é de cerca de @octets@.',
732
+    'taille_cache_vide' => 'O cache está vazio.',
733
+    'taille_repertoire_cache' => 'Tamanho do diretório cache',
734
+    'text_article_propose_publication' => 'Matéria proposta para publicação.',
735
+    'texte_acces_ldap_anonyme_1' => 'Alguns servidores LDAP não aceitam nenhum acesso anônimo. Neste caso, é necessário especificar um identificador de acesso inicial de modo a poder, em seguida, pesquisar as informações no diretório. Na maior parte dos casos, entretanto, os campos a seguir poderão ser deixados em branco.',
736
+    'texte_admin_effacer_01' => 'Este comando apaga <i>todo</i> o conteúdo da base de dados,incluindo <i>todos</i> os acessos dos redatores e administradores. Após executá-lo, você deverá reinstalar o SPIP para recriar uma nova base de dados bem como um acesso inicial de administrador.',
737
+    'texte_adresse_annuaire_1' => '(Se o seu diretório está instalado na mesma máquina que este website, trata-se provavelmente de «localhost».)',
738
+    'texte_ajout_auteur' => 'O autor a seguir foi incluído na matéria:',
739
+    'texte_annuaire_ldap_1' => 'Se você tem acesso a um diretório LDAP, você poderá utilizá-lo para importar automaticamente os usuários para o SPIP.',
740
+    'texte_article_statut' => 'Esta matéria está:',
741
+    'texte_article_virtuel' => 'Matéria virtual',
742
+    'texte_article_virtuel_reference' => '<b>Matéria virtual:</b> matéria referenciada no seu site SPIP, mas redirecionada para um outro URL. Para cancelar o redirecionamento, apague o URL abaixo.',
743
+    'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"',
744
+    'texte_auteur_messagerie' => 'Este site pode monitorar permanentemente a lista de editores conectados, permitindo-lhe trocar mensagens em tempo real. Você pode decidir não aparecer nessa lista (ficando "invisível" para os outros usuários).',
745
+    'texte_auteurs' => 'OS AUTORES',
746
+    'texte_choix_base_1' => 'Escolha a sua base:',
747
+    'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.',
748
+    'texte_choix_base_3' => '<b>Escolha</b> abaixo a que lhe foi atribuída pelo seu serviço de hospedagem:',
749
+    'texte_choix_table_prefix' => 'Prefixo das tabelas:',
750
+    'texte_compte_element' => '@count@ elemento',
751
+    'texte_compte_elements' => '@count@ elementos',
752
+    'texte_conflit_edition_correction' => 'Por favor, controle abaixo as diferenças entre as duas versões do texto; você pode também copiar as suas modificações e depois recomeçar.',
753
+    'texte_connexion_mysql' => 'Consulte as informações fornecidas pelo seu serviço de hospedagem: nelas, você deverá encontrar o servidor de base de dados fornecido e os seus dados de conexão ao servidor SQL.',
754
+    'texte_contenu_article' => '(Conteúdo da matéria em poucas palavras.)',
755
+    'texte_contenu_articles' => 'De acordo com o layout adotado pelo seu site, você poderá decidir se certos elementos das matérias serão utilizados. Use a listagem abaixo para indicar quais elementos estão disponíveis.',
756
+    'texte_crash_base' => 'Se a sua base de dados se corrompeu, você poderá tentar uma reparação automática.',
757
+    'texte_creer_rubrique' => 'Antes de poder escrever matérias, você precisa criar uma seção.',
758
+    'texte_date_creation_article' => 'DATA DE CRIAÇÃO DA MATÉRIA:',
759
+    'texte_date_creation_objet' => 'Data de criação:', # on ajoute le &quot;:&quot;
760
+    'texte_date_publication_anterieure' => 'Data de redação anterior:',
761
+    'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redação anterior.',
762
+    'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:',
763
+    'texte_date_publication_objet' => 'Data de publicação online:',
764
+    'texte_definir_comme_traduction_rubrique' => 'Esta seção é uma tradução da seção número:',
765
+    'texte_descriptif_rapide' => 'Descrição rápida',
766
+    'texte_effacer_base' => 'Apagar a base de dados do SPIP',
767
+    'texte_effacer_statistiques' => 'Apagar as estatísticas',
768
+    'texte_en_cours_validation' => 'Os conteúdos abaixo estão propostos para publicação.',
769
+    'texte_enrichir_mise_a_jour' => 'Você pode enriquecer a diagramação do seu texto usando «atalhos tipográficos».',
770
+    'texte_fichier_authent' => '<b>O SPIP pode criar os arquivos especiais  <tt>.htpasswd</tt> e <tt>.htpasswd-admin</tt> no diretório @dossier@?</b><p>
771 771
 Estes arquivos podem servir para restringir o acesso aos autores e administradores em outras áreas do seu site (programas externos de estatísticas, por exemplo).</p><p>
772 772
 Se eles não forem úteis, você poderá deixar esta opção com o seu valor padrão (sem criar os arquivos).</p>',
773
-	'texte_informations_personnelles_1' => 'O sistema vai criar agora um acesso personalizado ao site.',
774
-	'texte_informations_personnelles_2' => '(Nota: trata-se de uma reinstalação, se o seu acesso funciona corretamente, você pode',
775
-	'texte_introductif_article' => '(Texto introdutório da matéria.)',
776
-	'texte_jeu_caractere' => 'É aconselhável usar no seu site o alfabeto universal (<tt>utf-8</tt>): ele permite a exibição de textos em todos os idiomas, e não tem problemas de compatibilidade com os navegadores modernos.',
777
-	'texte_jeu_caractere_3' => 'O seu site está configurado atualmente com o conjunto de caracteres:',
778
-	'texte_jeu_caractere_4' => 'Se isso não corresponde à realidade dos seus dados (por ex., em seguimento a um restauro da base de dados), ou se <em>você lançou este site</em> e deseja utilizar um outro conjunto de caracteres, por favor, indique-o aqui:',
779
-	'texte_login_ldap_1' => '(Deixe em branco para acesso anônimo, ou informe o caminho completo, por exemplo «<tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt>».)',
780
-	'texte_login_precaution' => 'Atenção! Este é o login com o qual você está conectado agora. Use este formulário com cautela...',
781
-	'texte_messagerie_agenda' => 'As mensagens internas permitem que os redatores se comuniquem entre si, diretamente da área privada do site. Elas estão associadas a uma agenda.',
782
-	'texte_mise_a_niveau_base_1' => 'Você acabou de atualizar os arquivos do SPIP.
773
+    'texte_informations_personnelles_1' => 'O sistema vai criar agora um acesso personalizado ao site.',
774
+    'texte_informations_personnelles_2' => '(Nota: trata-se de uma reinstalação, se o seu acesso funciona corretamente, você pode',
775
+    'texte_introductif_article' => '(Texto introdutório da matéria.)',
776
+    'texte_jeu_caractere' => 'É aconselhável usar no seu site o alfabeto universal (<tt>utf-8</tt>): ele permite a exibição de textos em todos os idiomas, e não tem problemas de compatibilidade com os navegadores modernos.',
777
+    'texte_jeu_caractere_3' => 'O seu site está configurado atualmente com o conjunto de caracteres:',
778
+    'texte_jeu_caractere_4' => 'Se isso não corresponde à realidade dos seus dados (por ex., em seguimento a um restauro da base de dados), ou se <em>você lançou este site</em> e deseja utilizar um outro conjunto de caracteres, por favor, indique-o aqui:',
779
+    'texte_login_ldap_1' => '(Deixe em branco para acesso anônimo, ou informe o caminho completo, por exemplo «<tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt>».)',
780
+    'texte_login_precaution' => 'Atenção! Este é o login com o qual você está conectado agora. Use este formulário com cautela...',
781
+    'texte_messagerie_agenda' => 'As mensagens internas permitem que os redatores se comuniquem entre si, diretamente da área privada do site. Elas estão associadas a uma agenda.',
782
+    'texte_mise_a_niveau_base_1' => 'Você acabou de atualizar os arquivos do SPIP.
783 783
 Agora é necessário atualizar a base de dados do site.',
784
-	'texte_modifier_article' => 'Editar a matéria:',
785
-	'texte_multilinguisme' => 'Se você deseja gerar objetos em diversos idiomas, com uma navegação complexa, você pode incluir um menu de seleção de idioma nesses objetos, de acordo com a estrutura do seu site.',
786
-	'texte_multilinguisme_trad' => 'Você pode, igualmente, ativar um sistema de gerenciamento de links entre as diferentes traduções em certos objetos.',
787
-	'texte_non_compresse' => '<i>não compactado</i> (seu servidor não suporta esta funcionalidade)',
788
-	'texte_nouvelle_version_spip_1' => 'Você instalou uma nova versão do SPIP.',
789
-	'texte_nouvelle_version_spip_2' => 'Esta nova versão precisa de uma atualização mais completa do que o normal. Se você é o webmaster do site, por favor, apague o arquivo @connect@ e retome a instalação de forma a incluir os seus parâmetros de conexão à base de dados.<p> (NB.: se você não se lembra dos seus parâmetros de conexão, consulte o arquivo @connect@ antes de apagá-lo...)</p>',
790
-	'texte_operation_echec' => 'Volte à página anterior, escolha uma outra base de dados ou crie uma nova. Verifique as informações fornecidas pelo seu serviço de hospedagem.',
791
-	'texte_plus_trois_car' => 'mais de 3 caracteres',
792
-	'texte_plusieurs_articles' => 'Demasiados autores encontrados para "@cherche_auteur@":',
793
-	'texte_port_annuaire' => '(O valor padrão indicado é geralmente conveniente.)',
794
-	'texte_presente_plugin' => 'Esta página lista os plugins disponíveis para o site. Você pode ativar os plugins necessários marcando a opção correspondente.',
795
-	'texte_proposer_publication' => 'Assim que a sua matéria estiver pronta, você pode propor a sua publicação.',
796
-	'texte_proxy' => 'Em alguns casos (intranet, redes protegidas...), os sites remotos (documentação do SPIP, sites sindicados etc.) só estarão acessíveis através de um <i>proxy HTTP</i>. Nesse caso, informe abaixo o endereço, no formato @[email protected], você pode deixar este campo vazio.',
797
-	'texte_publication_articles_post_dates' => 'Que comportamento o SPIP deve adotar face às matérias em que a data de publicação está pré-datada?',
798
-	'texte_rappel_selection_champs' => '[Não se esqueça de selecionar corretamente este campo.]',
799
-	'texte_recalcul_page' => 'Se você quiser recalcular uma única página, passe para a área pública e clique no botão «atualizar».',
800
-	'texte_recuperer_base' => 'Reparar a base de dados',
801
-	'texte_reference_mais_redirige' => 'matéria referenciada no seu site em  SPIP, mas redirecionada para outro URL.',
802
-	'texte_requetes_echouent' => '<b>Já que certas solicitações SQL falharam sistematicamente e sem razão aparente, é possível que a causa esteja na base de dados em si.</b><p>
784
+    'texte_modifier_article' => 'Editar a matéria:',
785
+    'texte_multilinguisme' => 'Se você deseja gerar objetos em diversos idiomas, com uma navegação complexa, você pode incluir um menu de seleção de idioma nesses objetos, de acordo com a estrutura do seu site.',
786
+    'texte_multilinguisme_trad' => 'Você pode, igualmente, ativar um sistema de gerenciamento de links entre as diferentes traduções em certos objetos.',
787
+    'texte_non_compresse' => '<i>não compactado</i> (seu servidor não suporta esta funcionalidade)',
788
+    'texte_nouvelle_version_spip_1' => 'Você instalou uma nova versão do SPIP.',
789
+    'texte_nouvelle_version_spip_2' => 'Esta nova versão precisa de uma atualização mais completa do que o normal. Se você é o webmaster do site, por favor, apague o arquivo @connect@ e retome a instalação de forma a incluir os seus parâmetros de conexão à base de dados.<p> (NB.: se você não se lembra dos seus parâmetros de conexão, consulte o arquivo @connect@ antes de apagá-lo...)</p>',
790
+    'texte_operation_echec' => 'Volte à página anterior, escolha uma outra base de dados ou crie uma nova. Verifique as informações fornecidas pelo seu serviço de hospedagem.',
791
+    'texte_plus_trois_car' => 'mais de 3 caracteres',
792
+    'texte_plusieurs_articles' => 'Demasiados autores encontrados para "@cherche_auteur@":',
793
+    'texte_port_annuaire' => '(O valor padrão indicado é geralmente conveniente.)',
794
+    'texte_presente_plugin' => 'Esta página lista os plugins disponíveis para o site. Você pode ativar os plugins necessários marcando a opção correspondente.',
795
+    'texte_proposer_publication' => 'Assim que a sua matéria estiver pronta, você pode propor a sua publicação.',
796
+    'texte_proxy' => 'Em alguns casos (intranet, redes protegidas...), os sites remotos (documentação do SPIP, sites sindicados etc.) só estarão acessíveis através de um <i>proxy HTTP</i>. Nesse caso, informe abaixo o endereço, no formato @[email protected], você pode deixar este campo vazio.',
797
+    'texte_publication_articles_post_dates' => 'Que comportamento o SPIP deve adotar face às matérias em que a data de publicação está pré-datada?',
798
+    'texte_rappel_selection_champs' => '[Não se esqueça de selecionar corretamente este campo.]',
799
+    'texte_recalcul_page' => 'Se você quiser recalcular uma única página, passe para a área pública e clique no botão «atualizar».',
800
+    'texte_recuperer_base' => 'Reparar a base de dados',
801
+    'texte_reference_mais_redirige' => 'matéria referenciada no seu site em  SPIP, mas redirecionada para outro URL.',
802
+    'texte_requetes_echouent' => '<b>Já que certas solicitações SQL falharam sistematicamente e sem razão aparente, é possível que a causa esteja na base de dados em si.</b><p>
803 803
 O seu servidor SQL dispõe de uma funcionalidade de reparação das suas tabelas quando elas são danificadas por acidente. Você poderá tentar esta reparação; em caso de falha, conserve uma cópia da mensagem de erro, que poderá conter indícios do que não está funcionando...</p><p>
804 804
 Se o problema persistir, contate o seu serviço de hospedagem.</p>',
805
-	'texte_selection_langue_principale' => 'Você pode escolher abaixo o «idioma principal» do site. esta escolha não o obriga - felizmente! - a escrever as suas matérias no idioma selecionado, mas permite determinar:
805
+    'texte_selection_langue_principale' => 'Você pode escolher abaixo o «idioma principal» do site. esta escolha não o obriga - felizmente! - a escrever as suas matérias no idioma selecionado, mas permite determinar:
806 806
  <ul><li>o formato padrão das datas no site público;</li>
807 807
  <li>a natureza do motor tipográfico que o SPIP deverá usar para a composição dos textos;</li>
808 808
  <li>o idioma usado nos formulários do site público;</li>
809 809
  <li>o idioma padrão exibido na área privada.</li></ul>',
810
-	'texte_sous_titre' => 'Subtítulo',
811
-	'texte_statistiques_visites' => '(barras escuras:  domingo / curva escura: evolução da média)',
812
-	'texte_statut_attente_validation' => 'aguardando validação',
813
-	'texte_statut_publies' => 'publicadas online',
814
-	'texte_statut_refuses' => 'recusadas',
815
-	'texte_suppression_fichiers' => 'Use este comando para excluir todos os arquivos que constam do cache do SPIP. Isto permite, por exemplo, forçar a reconstrução de todas as páginas, caso você tenha feito alterações importantes no layout ou na estrutura do site.',
816
-	'texte_sur_titre' => 'Sobretítulo',
817
-	'texte_table_ok' => ': esta tabela está OK.',
818
-	'texte_tentative_recuperation' => 'Tentativa de reparação',
819
-	'texte_tenter_reparation' => 'Tentar uma reparação da base de dados',
820
-	'texte_test_proxy' => 'Para testar este proxy, informe aqui o endereço de um website que você deseje testar.',
821
-	'texte_titre_02' => 'Título:',
822
-	'texte_titre_obligatoire' => '<b>Título</b> [obrigatório]',
823
-	'texte_travail_article' => '@nom_auteur_modif@ trabalhou nesta matéria há @date_diff@ minutos',
824
-	'texte_travail_collaboratif' => 'Se é frequente acontecer de mais de um redator trabalhar em uma mesma matéria, o sistema pode exibir as matérias recentemente "abertas", de modo a evitar modificações concorrentes. Esta opção está desativada por padrão, para evitar a exibição de mensagens de aviso desnecessárias.',
825
-	'texte_vide' => 'vazia',
826
-	'texte_vider_cache' => 'Esvaziar o cache',
827
-	'titre_admin_tech' => 'Manutenção técnica',
828
-	'titre_admin_vider' => 'Manutenção técnica',
829
-	'titre_ajouter_un_auteur' => 'Incluir um autor',
830
-	'titre_ajouter_un_mot' => 'Incluir uma palavra-chave',
831
-	'titre_cadre_afficher_article' => 'Exibir as matérias',
832
-	'titre_cadre_afficher_traductions' => 'Exibir o status das traduções para os idiomas a seguir:',
833
-	'titre_cadre_ajouter_auteur' => 'INCLUIR UM AUTOR:',
834
-	'titre_cadre_interieur_rubrique' => 'Na seção',
835
-	'titre_cadre_numero_auteur' => 'AUTOR NÚMERO',
836
-	'titre_cadre_numero_objet' => '@objet@ NÚMERO:',
837
-	'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [obrigatório]<br />',
838
-	'titre_config_contenu_notifications' => 'Notificações',
839
-	'titre_config_contenu_prive' => 'Na área privada',
840
-	'titre_config_contenu_public' => 'No site público',
841
-	'titre_config_fonctions' => 'Configuração do site',
842
-	'titre_config_langage' => 'Configurar o idioma',
843
-	'titre_configuration' => 'Configuração do site',
844
-	'titre_configurer_preferences' => 'Configurar as suas preferências',
845
-	'titre_configurer_preferences_menus' => 'Configurar as suas preferências de menus',
846
-	'titre_conflit_edition' => 'Conflito durante a edição',
847
-	'titre_connexion_ldap' => 'Opções: <b>Sua conexão LDAP</b>',
848
-	'titre_groupe_mots' => 'GRUPO DE PALAVRAS-CHAVE:',
849
-	'titre_identite_site' => 'Identidade do site',
850
-	'titre_langue_article' => 'Idioma da matéria',
851
-	'titre_langue_rubrique' => 'Idioma da seção',
852
-	'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DA MATÉRIA',
853
-	'titre_les_articles' => 'AS MATÉRIAS',
854
-	'titre_messagerie_agenda' => 'Mensagens internas e agenda',
855
-	'titre_naviguer_dans_le_site' => 'Navegar no site...',
856
-	'titre_nouvelle_rubrique' => 'Nova seção',
857
-	'titre_numero_rubrique' => 'SEÇÃO NÚMERO:',
858
-	'titre_page_articles_edit' => 'Editar: @titre@',
859
-	'titre_page_articles_page' => 'As matérias',
860
-	'titre_page_articles_tous' => 'Todo o site',
861
-	'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@',
862
-	'titre_page_config_contenu' => 'Configuração do site',
863
-	'titre_page_delete_all' => 'supressão total e irreversível',
864
-	'titre_page_recherche' => 'Resultados da busca por @recherche@',
865
-	'titre_page_statistiques_referers' => 'Estatísticas (links de entrada)',
866
-	'titre_page_upgrade' => 'Atualização do SPIP',
867
-	'titre_preference_menus_favoris' => 'Menus favoritos',
868
-	'titre_publication_articles_post_dates' => 'Publicação de matérias pós-datadas',
869
-	'titre_reparation' => 'Reparação',
870
-	'titre_suivi_petition' => 'Acompanhamento das petições',
871
-	'tls_ldap' => 'Transport Layer Security:',
872
-	'trad_article_traduction' => 'Todas as versões desta matéria:',
873
-	'trad_delier' => 'Desvincular destas traduções',
874
-	'trad_lier' => 'Esta matéria é uma tradução da matéria número:',
875
-	'trad_new' => 'Escrever uma nova tradução',
810
+    'texte_sous_titre' => 'Subtítulo',
811
+    'texte_statistiques_visites' => '(barras escuras:  domingo / curva escura: evolução da média)',
812
+    'texte_statut_attente_validation' => 'aguardando validação',
813
+    'texte_statut_publies' => 'publicadas online',
814
+    'texte_statut_refuses' => 'recusadas',
815
+    'texte_suppression_fichiers' => 'Use este comando para excluir todos os arquivos que constam do cache do SPIP. Isto permite, por exemplo, forçar a reconstrução de todas as páginas, caso você tenha feito alterações importantes no layout ou na estrutura do site.',
816
+    'texte_sur_titre' => 'Sobretítulo',
817
+    'texte_table_ok' => ': esta tabela está OK.',
818
+    'texte_tentative_recuperation' => 'Tentativa de reparação',
819
+    'texte_tenter_reparation' => 'Tentar uma reparação da base de dados',
820
+    'texte_test_proxy' => 'Para testar este proxy, informe aqui o endereço de um website que você deseje testar.',
821
+    'texte_titre_02' => 'Título:',
822
+    'texte_titre_obligatoire' => '<b>Título</b> [obrigatório]',
823
+    'texte_travail_article' => '@nom_auteur_modif@ trabalhou nesta matéria há @date_diff@ minutos',
824
+    'texte_travail_collaboratif' => 'Se é frequente acontecer de mais de um redator trabalhar em uma mesma matéria, o sistema pode exibir as matérias recentemente "abertas", de modo a evitar modificações concorrentes. Esta opção está desativada por padrão, para evitar a exibição de mensagens de aviso desnecessárias.',
825
+    'texte_vide' => 'vazia',
826
+    'texte_vider_cache' => 'Esvaziar o cache',
827
+    'titre_admin_tech' => 'Manutenção técnica',
828
+    'titre_admin_vider' => 'Manutenção técnica',
829
+    'titre_ajouter_un_auteur' => 'Incluir um autor',
830
+    'titre_ajouter_un_mot' => 'Incluir uma palavra-chave',
831
+    'titre_cadre_afficher_article' => 'Exibir as matérias',
832
+    'titre_cadre_afficher_traductions' => 'Exibir o status das traduções para os idiomas a seguir:',
833
+    'titre_cadre_ajouter_auteur' => 'INCLUIR UM AUTOR:',
834
+    'titre_cadre_interieur_rubrique' => 'Na seção',
835
+    'titre_cadre_numero_auteur' => 'AUTOR NÚMERO',
836
+    'titre_cadre_numero_objet' => '@objet@ NÚMERO:',
837
+    'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [obrigatório]<br />',
838
+    'titre_config_contenu_notifications' => 'Notificações',
839
+    'titre_config_contenu_prive' => 'Na área privada',
840
+    'titre_config_contenu_public' => 'No site público',
841
+    'titre_config_fonctions' => 'Configuração do site',
842
+    'titre_config_langage' => 'Configurar o idioma',
843
+    'titre_configuration' => 'Configuração do site',
844
+    'titre_configurer_preferences' => 'Configurar as suas preferências',
845
+    'titre_configurer_preferences_menus' => 'Configurar as suas preferências de menus',
846
+    'titre_conflit_edition' => 'Conflito durante a edição',
847
+    'titre_connexion_ldap' => 'Opções: <b>Sua conexão LDAP</b>',
848
+    'titre_groupe_mots' => 'GRUPO DE PALAVRAS-CHAVE:',
849
+    'titre_identite_site' => 'Identidade do site',
850
+    'titre_langue_article' => 'Idioma da matéria',
851
+    'titre_langue_rubrique' => 'Idioma da seção',
852
+    'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DA MATÉRIA',
853
+    'titre_les_articles' => 'AS MATÉRIAS',
854
+    'titre_messagerie_agenda' => 'Mensagens internas e agenda',
855
+    'titre_naviguer_dans_le_site' => 'Navegar no site...',
856
+    'titre_nouvelle_rubrique' => 'Nova seção',
857
+    'titre_numero_rubrique' => 'SEÇÃO NÚMERO:',
858
+    'titre_page_articles_edit' => 'Editar: @titre@',
859
+    'titre_page_articles_page' => 'As matérias',
860
+    'titre_page_articles_tous' => 'Todo o site',
861
+    'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@',
862
+    'titre_page_config_contenu' => 'Configuração do site',
863
+    'titre_page_delete_all' => 'supressão total e irreversível',
864
+    'titre_page_recherche' => 'Resultados da busca por @recherche@',
865
+    'titre_page_statistiques_referers' => 'Estatísticas (links de entrada)',
866
+    'titre_page_upgrade' => 'Atualização do SPIP',
867
+    'titre_preference_menus_favoris' => 'Menus favoritos',
868
+    'titre_publication_articles_post_dates' => 'Publicação de matérias pós-datadas',
869
+    'titre_reparation' => 'Reparação',
870
+    'titre_suivi_petition' => 'Acompanhamento das petições',
871
+    'tls_ldap' => 'Transport Layer Security:',
872
+    'trad_article_traduction' => 'Todas as versões desta matéria:',
873
+    'trad_delier' => 'Desvincular destas traduções',
874
+    'trad_lier' => 'Esta matéria é uma tradução da matéria número:',
875
+    'trad_new' => 'Escrever uma nova tradução',
876 876
 
877
-	// U
878
-	'utf8_convert_erreur_orig' => 'Erro: o conjunto de caracteres @charset@ não é suportado.',
877
+    // U
878
+    'utf8_convert_erreur_orig' => 'Erro: o conjunto de caracteres @charset@ não é suportado.',
879 879
 
880
-	// V
881
-	'version' => 'Versão:'
880
+    // V
881
+    'version' => 'Versão:'
882 882
 );
Please login to merge, or discard this patch.
ecrire/lang/spip_eo.php 1 patch
Indentation   +657 added lines, -657 removed lines patch added patch discarded remove patch
@@ -4,584 +4,584 @@  discard block
 block discarded – undo
4 4
 // ** ne pas modifier le fichier **
5 5
 
6 6
 if (!defined('_ECRIRE_INC_VERSION')) {
7
-	return;
7
+    return;
8 8
 }
9 9
 
10 10
 $GLOBALS[$GLOBALS['idx_lang']] = array(
11 11
 
12
-	// A
13
-	'access_interface_graphique' => 'Reen al kompleta grafika interfaco',
14
-	'access_mode_texte' => 'Afiŝi la simpligitan tekstan interfacon',
15
-	'admin_debug' => 'erarserĉilo',
16
-	'admin_modifier_article' => 'Modifu tiun ĉi artikolon',
17
-	'admin_modifier_auteur' => 'Modifu tiun ĉi aŭtoron',
18
-	'admin_modifier_breve' => 'Modifu tiun ĉi fulm-informon',
19
-	'admin_modifier_mot' => 'Modifu tiun ĉi ŝlosilvorton',
20
-	'admin_modifier_rubrique' => 'Modifu tiun ĉi rubrikon',
21
-	'admin_recalculer' => 'Rekalkulu tiun ĉi paĝon',
22
-	'afficher_calendrier' => 'Montri la kalendaro',
23
-	'afficher_trad' => 'afiŝi la tradukojn',
24
-	'alerte_maj_impossible' => '<b>Alarmo !</b> La ĝisdatigo de la SQL-datenbazo al versio @version@ ne eblas pro datenbazo-modif-rajtaj kialoj. Bonvolu kontakti vian retgastiganton.',
25
-	'alerte_modif_info_concourante' => 'ATENTU : Tiu ĉi informo estis modifita de alia homo. La nuna stato estas :',
26
-	'analyse_xml' => 'XML analizo',
27
-	'annuler' => 'Nuligi',
28
-	'antispam_champ_vide' => 'Bonvolu forlasi tiun tajpujon malplena :',
29
-	'articles_recents' => 'La plej freŝaj artikoloj',
30
-	'avis_1_erreur_saisie' => 'Estas 1 eraro en via tajpado, bonvolu kontroli ĝin.',
31
-	'avis_archive_incorrect' => 'Tiu arkivo ne estas SPIP-dosiero',
32
-	'avis_archive_invalide' => 'Tiu arkiva dosiero ne validas',
33
-	'avis_attention' => 'ATENTU !',
34
-	'avis_champ_incorrect_type_objet' => 'Erara tajpuja nomo @name@ por la objekto de tipo @type@',
35
-	'avis_colonne_inexistante' => 'La kolumno @col@ ne ekzistas',
36
-	'avis_erreur' => 'Eraro : vidu ĉi-sube',
37
-	'avis_erreur_connexion' => 'Konekt-eraro',
38
-	'avis_erreur_cookie' => 'kuketo-problemo',
39
-	'avis_erreur_fonction_contexte' => 'Program-eraro. Tiu funkcio ne alvokeblas en tiu ĉi kunteksto.',
40
-	'avis_erreur_mysql' => 'SQL-eraro',
41
-	'avis_erreur_sauvegarde' => 'Konservo-eraro (@type@ @id_objet@) ! ',
42
-	'avis_erreur_visiteur' => 'Alir-problemo al la privata spaco',
43
-	'avis_nb_erreurs_saisie' => 'Estas @nb@ eraroj en via tajpado, bonvolu kontroli ilin.',
12
+    // A
13
+    'access_interface_graphique' => 'Reen al kompleta grafika interfaco',
14
+    'access_mode_texte' => 'Afiŝi la simpligitan tekstan interfacon',
15
+    'admin_debug' => 'erarserĉilo',
16
+    'admin_modifier_article' => 'Modifu tiun ĉi artikolon',
17
+    'admin_modifier_auteur' => 'Modifu tiun ĉi aŭtoron',
18
+    'admin_modifier_breve' => 'Modifu tiun ĉi fulm-informon',
19
+    'admin_modifier_mot' => 'Modifu tiun ĉi ŝlosilvorton',
20
+    'admin_modifier_rubrique' => 'Modifu tiun ĉi rubrikon',
21
+    'admin_recalculer' => 'Rekalkulu tiun ĉi paĝon',
22
+    'afficher_calendrier' => 'Montri la kalendaro',
23
+    'afficher_trad' => 'afiŝi la tradukojn',
24
+    'alerte_maj_impossible' => '<b>Alarmo !</b> La ĝisdatigo de la SQL-datenbazo al versio @version@ ne eblas pro datenbazo-modif-rajtaj kialoj. Bonvolu kontakti vian retgastiganton.',
25
+    'alerte_modif_info_concourante' => 'ATENTU : Tiu ĉi informo estis modifita de alia homo. La nuna stato estas :',
26
+    'analyse_xml' => 'XML analizo',
27
+    'annuler' => 'Nuligi',
28
+    'antispam_champ_vide' => 'Bonvolu forlasi tiun tajpujon malplena :',
29
+    'articles_recents' => 'La plej freŝaj artikoloj',
30
+    'avis_1_erreur_saisie' => 'Estas 1 eraro en via tajpado, bonvolu kontroli ĝin.',
31
+    'avis_archive_incorrect' => 'Tiu arkivo ne estas SPIP-dosiero',
32
+    'avis_archive_invalide' => 'Tiu arkiva dosiero ne validas',
33
+    'avis_attention' => 'ATENTU !',
34
+    'avis_champ_incorrect_type_objet' => 'Erara tajpuja nomo @name@ por la objekto de tipo @type@',
35
+    'avis_colonne_inexistante' => 'La kolumno @col@ ne ekzistas',
36
+    'avis_erreur' => 'Eraro : vidu ĉi-sube',
37
+    'avis_erreur_connexion' => 'Konekt-eraro',
38
+    'avis_erreur_cookie' => 'kuketo-problemo',
39
+    'avis_erreur_fonction_contexte' => 'Program-eraro. Tiu funkcio ne alvokeblas en tiu ĉi kunteksto.',
40
+    'avis_erreur_mysql' => 'SQL-eraro',
41
+    'avis_erreur_sauvegarde' => 'Konservo-eraro (@type@ @id_objet@) ! ',
42
+    'avis_erreur_visiteur' => 'Alir-problemo al la privata spaco',
43
+    'avis_nb_erreurs_saisie' => 'Estas @nb@ eraroj en via tajpado, bonvolu kontroli ilin.',
44 44
 
45
-	// B
46
-	'barre_a_accent_grave' => 'Entajpi malakut-akcentan ĉefliteran A',
47
-	'barre_aide' => 'Uzu la tipografiajn rapidligilojn por pliriĉigi vian enpaĝigon',
48
-	'barre_e_accent_aigu' => 'Entajpi malakut-akcentan ĉefliteran E',
49
-	'barre_eo' => 'Entajpi E en ĉefliteran O',
50
-	'barre_eo_maj' => 'Entajpi E en la ĉeflitero O',
51
-	'barre_euro' => 'Entajpi la simbolon €',
52
-	'barre_gras' => '{{Grasigi}}',
53
-	'barre_guillemets' => 'Flanki per « citiloj »',
54
-	'barre_guillemets_simples' => 'Flanki per “simplaj citiloj”',
55
-	'barre_intertitre' => '{{{Intertitoligi}}}',
56
-	'barre_italic' => '{Kursivigi}',
57
-	'barre_lien' => 'Transformi al [hiperligo->http://...]',
58
-	'barre_lien_input' => 'Bonvolu indiki la retadreson de via ligilo (vi povas indiki ret-adreson tian, kia http://www.monsite.com aŭ simple indiki la numeron de artikolo de tiu retejo.',
59
-	'barre_note' => 'Transformi al [[sub-paĝan noton]]',
60
-	'barre_paragraphe' => 'Krei paragrafon',
61
-	'barre_quote' => '<quote>Citi mesaĝon</quote>',
62
-	'bouton_changer' => 'Ŝanĝi',
63
-	'bouton_chercher' => 'Serĉi',
64
-	'bouton_choisir' => 'Elekti',
65
-	'bouton_deplacer' => 'Movi',
66
-	'bouton_download' => 'Elŝuti',
67
-	'bouton_enregistrer' => 'Registri',
68
-	'bouton_radio_desactiver_messagerie_interne' => 'Malŝalti la internan mesaĝilon',
69
-	'bouton_radio_envoi_annonces' => 'Sendi la ĉefartikolajn anoncojn',
70
-	'bouton_radio_non_envoi_annonces' => 'Ne sendi anoncojn',
71
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Ne sendi liston de novaĵoj',
72
-	'bouton_recharger_page' => 'freŝigi tiun paĝon',
73
-	'bouton_telecharger' => 'Alŝuti',
74
-	'bouton_upload' => 'Alŝuti',
75
-	'bouton_valider' => 'Validigi',
45
+    // B
46
+    'barre_a_accent_grave' => 'Entajpi malakut-akcentan ĉefliteran A',
47
+    'barre_aide' => 'Uzu la tipografiajn rapidligilojn por pliriĉigi vian enpaĝigon',
48
+    'barre_e_accent_aigu' => 'Entajpi malakut-akcentan ĉefliteran E',
49
+    'barre_eo' => 'Entajpi E en ĉefliteran O',
50
+    'barre_eo_maj' => 'Entajpi E en la ĉeflitero O',
51
+    'barre_euro' => 'Entajpi la simbolon €',
52
+    'barre_gras' => '{{Grasigi}}',
53
+    'barre_guillemets' => 'Flanki per « citiloj »',
54
+    'barre_guillemets_simples' => 'Flanki per “simplaj citiloj”',
55
+    'barre_intertitre' => '{{{Intertitoligi}}}',
56
+    'barre_italic' => '{Kursivigi}',
57
+    'barre_lien' => 'Transformi al [hiperligo->http://...]',
58
+    'barre_lien_input' => 'Bonvolu indiki la retadreson de via ligilo (vi povas indiki ret-adreson tian, kia http://www.monsite.com aŭ simple indiki la numeron de artikolo de tiu retejo.',
59
+    'barre_note' => 'Transformi al [[sub-paĝan noton]]',
60
+    'barre_paragraphe' => 'Krei paragrafon',
61
+    'barre_quote' => '<quote>Citi mesaĝon</quote>',
62
+    'bouton_changer' => 'Ŝanĝi',
63
+    'bouton_chercher' => 'Serĉi',
64
+    'bouton_choisir' => 'Elekti',
65
+    'bouton_deplacer' => 'Movi',
66
+    'bouton_download' => 'Elŝuti',
67
+    'bouton_enregistrer' => 'Registri',
68
+    'bouton_radio_desactiver_messagerie_interne' => 'Malŝalti la internan mesaĝilon',
69
+    'bouton_radio_envoi_annonces' => 'Sendi la ĉefartikolajn anoncojn',
70
+    'bouton_radio_non_envoi_annonces' => 'Ne sendi anoncojn',
71
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Ne sendi liston de novaĵoj',
72
+    'bouton_recharger_page' => 'freŝigi tiun paĝon',
73
+    'bouton_telecharger' => 'Alŝuti',
74
+    'bouton_upload' => 'Alŝuti',
75
+    'bouton_valider' => 'Validigi',
76 76
 
77
-	// C
78
-	'cal_apresmidi' => 'posttagmezo',
79
-	'cal_jour_entier' => 'tuta tago',
80
-	'cal_matin' => 'mateno',
81
-	'cal_par_jour' => 'tag-kalendaro',
82
-	'cal_par_mois' => 'monat-kalendaro',
83
-	'cal_par_semaine' => 'semajn-kalendaro',
84
-	'choix_couleur_interface' => 'koloro',
85
-	'choix_interface' => 'elekto de interfaco',
86
-	'colonne' => 'Kolumno',
87
-	'confirm_changer_statut' => 'Atentu, vi petis por ŝanĝi la statuton de tiu elemento. Ĉu vi deziras daŭrigi ?',
88
-	'correcte' => 'korekta',
77
+    // C
78
+    'cal_apresmidi' => 'posttagmezo',
79
+    'cal_jour_entier' => 'tuta tago',
80
+    'cal_matin' => 'mateno',
81
+    'cal_par_jour' => 'tag-kalendaro',
82
+    'cal_par_mois' => 'monat-kalendaro',
83
+    'cal_par_semaine' => 'semajn-kalendaro',
84
+    'choix_couleur_interface' => 'koloro',
85
+    'choix_interface' => 'elekto de interfaco',
86
+    'colonne' => 'Kolumno',
87
+    'confirm_changer_statut' => 'Atentu, vi petis por ŝanĝi la statuton de tiu elemento. Ĉu vi deziras daŭrigi ?',
88
+    'correcte' => 'korekta',
89 89
 
90
-	// D
91
-	'date_aujourdhui' => 'hodiaŭ',
92
-	'date_avant_jc' => 'a.K.',
93
-	'date_dans' => 'post @delai@',
94
-	'date_de_mois_1' => '@j@ @nommois@',
95
-	'date_de_mois_10' => '@j@ @nommois@',
96
-	'date_de_mois_11' => '@j@ @nommois@',
97
-	'date_de_mois_12' => '@j@ @nommois@',
98
-	'date_de_mois_2' => '@j@ @nommois@',
99
-	'date_de_mois_3' => '@j@ @nommois@',
100
-	'date_de_mois_4' => '@j@ @nommois@',
101
-	'date_de_mois_5' => '@j@ @nommois@',
102
-	'date_de_mois_6' => '@j@ @nommois@',
103
-	'date_de_mois_7' => '@j@ @nommois@',
104
-	'date_de_mois_8' => '@j@ @nommois@',
105
-	'date_de_mois_9' => '@j@ @nommois@',
106
-	'date_demain' => 'morgaŭ',
107
-	'date_fmt_heures_minutes' => '@h@h@m@min',
108
-	'date_fmt_heures_minutes_court' => '@h@h@m@',
109
-	'date_fmt_jour' => '@nomjour@ la @jour@a',
110
-	'date_fmt_jour_heure' => '@jour@ je la @heure@',
111
-	'date_fmt_jour_heure_debut_fin' => 'la @jour@ de @heure_debut@ ĝis @heure_fin@',
112
-	'date_fmt_jour_heure_debut_fin_abbr' => 'la @dtstart@@jour@a de @heure_debut@@dtabbr@ ĝis @dtend@@heure_fin@@dtend@',
113
-	'date_fmt_jour_mois' => '@jour@a @nommois@',
114
-	'date_fmt_jour_mois_annee' => '@jour@a @nommois@ @annee@',
115
-	'date_fmt_mois_annee' => '@nommois@ @annee@',
116
-	'date_fmt_nomjour' => '@nomjour@ @date@',
117
-	'date_fmt_nomjour_date' => 'la @nomjour@ @date@',
118
-	'date_fmt_periode' => 'De @date_debut@ ĝis @date_fin@',
119
-	'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ ĝis @dtend@@date_fin@@dtabbr@',
120
-	'date_fmt_periode_from' => 'De',
121
-	'date_fmt_periode_to' => 'ĝis',
122
-	'date_fmt_saison_annee' => '@saison@ @annee@',
123
-	'date_heures' => 'horoj',
124
-	'date_hier' => 'hieraŭ',
125
-	'date_il_y_a' => 'antaŭ @delai@',
126
-	'date_jnum1' => '1',
127
-	'date_jnum10' => '10',
128
-	'date_jnum11' => '11',
129
-	'date_jnum12' => '12',
130
-	'date_jnum13' => '13',
131
-	'date_jnum14' => '14',
132
-	'date_jnum15' => '15',
133
-	'date_jnum16' => '16',
134
-	'date_jnum17' => '17',
135
-	'date_jnum18' => '18',
136
-	'date_jnum19' => '19',
137
-	'date_jnum2' => '2',
138
-	'date_jnum20' => '20',
139
-	'date_jnum21' => '21',
140
-	'date_jnum22' => '22',
141
-	'date_jnum23' => '23',
142
-	'date_jnum24' => '24',
143
-	'date_jnum25' => '25',
144
-	'date_jnum26' => '26',
145
-	'date_jnum27' => '27',
146
-	'date_jnum28' => '28',
147
-	'date_jnum29' => '29',
148
-	'date_jnum3' => '3',
149
-	'date_jnum30' => '30',
150
-	'date_jnum31' => '31',
151
-	'date_jnum4' => '4',
152
-	'date_jnum5' => '5',
153
-	'date_jnum6' => '6',
154
-	'date_jnum7' => '7',
155
-	'date_jnum8' => '8',
156
-	'date_jnum9' => '9',
157
-	'date_jour_1' => 'dimanĉo',
158
-	'date_jour_1_abbr' => 'dim.',
159
-	'date_jour_1_initiale' => 'd.',
160
-	'date_jour_2' => 'lundo',
161
-	'date_jour_2_abbr' => 'lun.',
162
-	'date_jour_2_initiale' => 'l.',
163
-	'date_jour_3' => 'mardo',
164
-	'date_jour_3_abbr' => 'mar.',
165
-	'date_jour_3_initiale' => 'm.',
166
-	'date_jour_4' => 'merkredo',
167
-	'date_jour_4_abbr' => 'mer.',
168
-	'date_jour_4_initiale' => 'm.',
169
-	'date_jour_5' => 'ĵaŭdo',
170
-	'date_jour_5_abbr' => 'jaŭ.',
171
-	'date_jour_5_initiale' => 'j.',
172
-	'date_jour_6' => 'vendredo',
173
-	'date_jour_6_abbr' => 'ven.',
174
-	'date_jour_6_initiale' => 'v.',
175
-	'date_jour_7' => 'sabato',
176
-	'date_jour_7_abbr' => 'sab.',
177
-	'date_jour_7_initiale' => 's.',
178
-	'date_jours' => 'tagoj',
179
-	'date_minutes' => 'minutoj',
180
-	'date_mois' => 'monatoj',
181
-	'date_mois_1' => 'januaro',
182
-	'date_mois_10' => 'oktobro',
183
-	'date_mois_10_abbr' => 'oct.',
184
-	'date_mois_11' => 'novembro',
185
-	'date_mois_11_abbr' => 'nov.',
186
-	'date_mois_12' => 'decembro',
187
-	'date_mois_12_abbr' => 'dec.',
188
-	'date_mois_1_abbr' => 'jan.',
189
-	'date_mois_2' => 'februaro',
190
-	'date_mois_2_abbr' => 'feb.',
191
-	'date_mois_3' => 'marto',
192
-	'date_mois_3_abbr' => 'mar.',
193
-	'date_mois_4' => 'aprilo',
194
-	'date_mois_4_abbr' => 'apr.',
195
-	'date_mois_5' => 'majo',
196
-	'date_mois_5_abbr' => 'majo',
197
-	'date_mois_6' => 'junio',
198
-	'date_mois_6_abbr' => 'jun.',
199
-	'date_mois_7' => 'julio',
200
-	'date_mois_7_abbr' => 'jul.',
201
-	'date_mois_8' => 'aŭgusto',
202
-	'date_mois_8_abbr' => 'aŭg.',
203
-	'date_mois_9' => 'septembro',
204
-	'date_mois_9_abbr' => 'sep.',
205
-	'date_saison_1' => 'vintro',
206
-	'date_saison_2' => 'printempo',
207
-	'date_saison_3' => 'somero',
208
-	'date_saison_4' => 'aŭtuno',
209
-	'date_secondes' => 'sekundoj',
210
-	'date_semaines' => 'semajnoj',
211
-	'date_un_mois' => 'monato',
212
-	'date_une_heure' => 'horo',
213
-	'date_une_minute' => 'minuto',
214
-	'date_une_seconde' => 'sekundo',
215
-	'date_une_semaine' => 'semajno',
216
-	'dirs_commencer' => ' por vere komenci la instalprocezon',
217
-	'dirs_preliminaire' => 'Antaŭfaro : <b>Difinu la alir-rajtojn</b>',
218
-	'dirs_probleme_droits' => 'Alir-rajta problemo',
219
-	'dirs_repertoires_absents' => '<b>La jenaj dosierujoj ne estas trovitaj : <ul>@bad_dirs@.</ul> </b>
90
+    // D
91
+    'date_aujourdhui' => 'hodiaŭ',
92
+    'date_avant_jc' => 'a.K.',
93
+    'date_dans' => 'post @delai@',
94
+    'date_de_mois_1' => '@j@ @nommois@',
95
+    'date_de_mois_10' => '@j@ @nommois@',
96
+    'date_de_mois_11' => '@j@ @nommois@',
97
+    'date_de_mois_12' => '@j@ @nommois@',
98
+    'date_de_mois_2' => '@j@ @nommois@',
99
+    'date_de_mois_3' => '@j@ @nommois@',
100
+    'date_de_mois_4' => '@j@ @nommois@',
101
+    'date_de_mois_5' => '@j@ @nommois@',
102
+    'date_de_mois_6' => '@j@ @nommois@',
103
+    'date_de_mois_7' => '@j@ @nommois@',
104
+    'date_de_mois_8' => '@j@ @nommois@',
105
+    'date_de_mois_9' => '@j@ @nommois@',
106
+    'date_demain' => 'morgaŭ',
107
+    'date_fmt_heures_minutes' => '@h@h@m@min',
108
+    'date_fmt_heures_minutes_court' => '@h@h@m@',
109
+    'date_fmt_jour' => '@nomjour@ la @jour@a',
110
+    'date_fmt_jour_heure' => '@jour@ je la @heure@',
111
+    'date_fmt_jour_heure_debut_fin' => 'la @jour@ de @heure_debut@ ĝis @heure_fin@',
112
+    'date_fmt_jour_heure_debut_fin_abbr' => 'la @dtstart@@jour@a de @heure_debut@@dtabbr@ ĝis @dtend@@heure_fin@@dtend@',
113
+    'date_fmt_jour_mois' => '@jour@a @nommois@',
114
+    'date_fmt_jour_mois_annee' => '@jour@a @nommois@ @annee@',
115
+    'date_fmt_mois_annee' => '@nommois@ @annee@',
116
+    'date_fmt_nomjour' => '@nomjour@ @date@',
117
+    'date_fmt_nomjour_date' => 'la @nomjour@ @date@',
118
+    'date_fmt_periode' => 'De @date_debut@ ĝis @date_fin@',
119
+    'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ ĝis @dtend@@date_fin@@dtabbr@',
120
+    'date_fmt_periode_from' => 'De',
121
+    'date_fmt_periode_to' => 'ĝis',
122
+    'date_fmt_saison_annee' => '@saison@ @annee@',
123
+    'date_heures' => 'horoj',
124
+    'date_hier' => 'hieraŭ',
125
+    'date_il_y_a' => 'antaŭ @delai@',
126
+    'date_jnum1' => '1',
127
+    'date_jnum10' => '10',
128
+    'date_jnum11' => '11',
129
+    'date_jnum12' => '12',
130
+    'date_jnum13' => '13',
131
+    'date_jnum14' => '14',
132
+    'date_jnum15' => '15',
133
+    'date_jnum16' => '16',
134
+    'date_jnum17' => '17',
135
+    'date_jnum18' => '18',
136
+    'date_jnum19' => '19',
137
+    'date_jnum2' => '2',
138
+    'date_jnum20' => '20',
139
+    'date_jnum21' => '21',
140
+    'date_jnum22' => '22',
141
+    'date_jnum23' => '23',
142
+    'date_jnum24' => '24',
143
+    'date_jnum25' => '25',
144
+    'date_jnum26' => '26',
145
+    'date_jnum27' => '27',
146
+    'date_jnum28' => '28',
147
+    'date_jnum29' => '29',
148
+    'date_jnum3' => '3',
149
+    'date_jnum30' => '30',
150
+    'date_jnum31' => '31',
151
+    'date_jnum4' => '4',
152
+    'date_jnum5' => '5',
153
+    'date_jnum6' => '6',
154
+    'date_jnum7' => '7',
155
+    'date_jnum8' => '8',
156
+    'date_jnum9' => '9',
157
+    'date_jour_1' => 'dimanĉo',
158
+    'date_jour_1_abbr' => 'dim.',
159
+    'date_jour_1_initiale' => 'd.',
160
+    'date_jour_2' => 'lundo',
161
+    'date_jour_2_abbr' => 'lun.',
162
+    'date_jour_2_initiale' => 'l.',
163
+    'date_jour_3' => 'mardo',
164
+    'date_jour_3_abbr' => 'mar.',
165
+    'date_jour_3_initiale' => 'm.',
166
+    'date_jour_4' => 'merkredo',
167
+    'date_jour_4_abbr' => 'mer.',
168
+    'date_jour_4_initiale' => 'm.',
169
+    'date_jour_5' => 'ĵaŭdo',
170
+    'date_jour_5_abbr' => 'jaŭ.',
171
+    'date_jour_5_initiale' => 'j.',
172
+    'date_jour_6' => 'vendredo',
173
+    'date_jour_6_abbr' => 'ven.',
174
+    'date_jour_6_initiale' => 'v.',
175
+    'date_jour_7' => 'sabato',
176
+    'date_jour_7_abbr' => 'sab.',
177
+    'date_jour_7_initiale' => 's.',
178
+    'date_jours' => 'tagoj',
179
+    'date_minutes' => 'minutoj',
180
+    'date_mois' => 'monatoj',
181
+    'date_mois_1' => 'januaro',
182
+    'date_mois_10' => 'oktobro',
183
+    'date_mois_10_abbr' => 'oct.',
184
+    'date_mois_11' => 'novembro',
185
+    'date_mois_11_abbr' => 'nov.',
186
+    'date_mois_12' => 'decembro',
187
+    'date_mois_12_abbr' => 'dec.',
188
+    'date_mois_1_abbr' => 'jan.',
189
+    'date_mois_2' => 'februaro',
190
+    'date_mois_2_abbr' => 'feb.',
191
+    'date_mois_3' => 'marto',
192
+    'date_mois_3_abbr' => 'mar.',
193
+    'date_mois_4' => 'aprilo',
194
+    'date_mois_4_abbr' => 'apr.',
195
+    'date_mois_5' => 'majo',
196
+    'date_mois_5_abbr' => 'majo',
197
+    'date_mois_6' => 'junio',
198
+    'date_mois_6_abbr' => 'jun.',
199
+    'date_mois_7' => 'julio',
200
+    'date_mois_7_abbr' => 'jul.',
201
+    'date_mois_8' => 'aŭgusto',
202
+    'date_mois_8_abbr' => 'aŭg.',
203
+    'date_mois_9' => 'septembro',
204
+    'date_mois_9_abbr' => 'sep.',
205
+    'date_saison_1' => 'vintro',
206
+    'date_saison_2' => 'printempo',
207
+    'date_saison_3' => 'somero',
208
+    'date_saison_4' => 'aŭtuno',
209
+    'date_secondes' => 'sekundoj',
210
+    'date_semaines' => 'semajnoj',
211
+    'date_un_mois' => 'monato',
212
+    'date_une_heure' => 'horo',
213
+    'date_une_minute' => 'minuto',
214
+    'date_une_seconde' => 'sekundo',
215
+    'date_une_semaine' => 'semajno',
216
+    'dirs_commencer' => ' por vere komenci la instalprocezon',
217
+    'dirs_preliminaire' => 'Antaŭfaro : <b>Difinu la alir-rajtojn</b>',
218
+    'dirs_probleme_droits' => 'Alir-rajta problemo',
219
+    'dirs_repertoires_absents' => '<b>La jenaj dosierujoj ne estas trovitaj : <ul>@bad_dirs@.</ul> </b>
220 220
   <p>La problemo verŝajne rilatas al majuskligo de literoj.
221 221
   Kontrolu ke la majuskloj ja kongruas kun tio kio estas afiŝita ĉi-supre ;
222 222
   se ili ne kongruas, bonvolu renomi la dosierujon per via FTP-programo por korekti la eraron.
223 223
 </p><p>Post tio, vi povos</p>',
224
-	'dirs_repertoires_suivants' => '<b>La jenaj dosierujoj ne estas skribe modifeblaj : 
224
+    'dirs_repertoires_suivants' => '<b>La jenaj dosierujoj ne estas skribe modifeblaj : 
225 225
 <ul>@bad_dirs@.</ul></b>
226 226
 <p>Por solvi tion, uzu vian FTP-klienton por reguligi la alir-rajtojn de ĉiu
227 227
  el tiuj dosierujoj. La proceduron oni detale klarigas en la instalgvidlibro.
228 228
 </p><p>Post tio, vi povos </p>',
229
-	'double_occurrence' => 'Duobla trafo de @balise@',
229
+    'double_occurrence' => 'Duobla trafo de @balise@',
230 230
 
231
-	// E
232
-	'en_cours' => 'okazanta',
233
-	'envoi_via_le_site' => 'Sendo tra la retejo',
234
-	'erreur' => 'Eraro',
235
-	'erreur_balise_non_fermee' => 'lasta ne fermita marko :',
236
-	'erreur_technique_ajaxform' => 'Aj. Neatendita eraro ne ebligis la sendon de la formularo. Vi povas reprovi denove.',
237
-	'erreur_technique_enregistrement_champs' => 'Teknika eraro neebligis la ĝustan registradon de la kampo @champs@.',
238
-	'erreur_technique_enregistrement_impossible' => 'Teknika eraro neebligis la registradon.',
239
-	'erreur_texte' => 'eraro(j)',
240
-	'etape' => 'Etapo',
231
+    // E
232
+    'en_cours' => 'okazanta',
233
+    'envoi_via_le_site' => 'Sendo tra la retejo',
234
+    'erreur' => 'Eraro',
235
+    'erreur_balise_non_fermee' => 'lasta ne fermita marko :',
236
+    'erreur_technique_ajaxform' => 'Aj. Neatendita eraro ne ebligis la sendon de la formularo. Vi povas reprovi denove.',
237
+    'erreur_technique_enregistrement_champs' => 'Teknika eraro neebligis la ĝustan registradon de la kampo @champs@.',
238
+    'erreur_technique_enregistrement_impossible' => 'Teknika eraro neebligis la registradon.',
239
+    'erreur_texte' => 'eraro(j)',
240
+    'etape' => 'Etapo',
241 241
 
242
-	// F
243
-	'fichier_introuvable' => 'Netrovebla dosiero @fichier@ ', # MODIF
244
-	'form_auteur_confirmation' => 'Konfirmu vian retpoŝtadreso',
245
-	'form_auteur_email_modifie' => 'Via retpoŝtadreso estis modifita.',
246
-	'form_auteur_envoi_mail_confirmation' => 'Konfirmretmesaĝo estis sendita al @email@. Vi devu viziti la menciita retadreso en la retmesaĝo por validigi vian retpoŝtadreson.',
247
-	'form_auteur_mail_confirmation' => 'Saluton,
242
+    // F
243
+    'fichier_introuvable' => 'Netrovebla dosiero @fichier@ ', # MODIF
244
+    'form_auteur_confirmation' => 'Konfirmu vian retpoŝtadreso',
245
+    'form_auteur_email_modifie' => 'Via retpoŝtadreso estis modifita.',
246
+    'form_auteur_envoi_mail_confirmation' => 'Konfirmretmesaĝo estis sendita al @email@. Vi devu viziti la menciita retadreso en la retmesaĝo por validigi vian retpoŝtadreson.',
247
+    'form_auteur_mail_confirmation' => 'Saluton,
248 248
 
249 249
 Vi petis ŝanĝi vian retpoŝtadreson.
250 250
 Por konfirmi vian novan retadreson, simple ensaluti al
251 251
 la retadreso ĉi-sube (alie, via peto estos ignoritaj) :
252 252
 
253 253
     @url@',
254
-	'form_deja_inscrit' => 'Vi estas jam registrita.',
255
-	'form_email_non_valide' => 'Via retpoŝtadreso ne validas.',
256
-	'form_forum_access_refuse' => 'Vi ne plu havas alir-rajton al tiu retejo.',
257
-	'form_forum_bonjour' => 'Saluton @nom@,',
258
-	'form_forum_confirmer_email' => 'Por konfirmi vian retpoŝtadreson, iru al tiu retadreso : @url_confirm@',
259
-	'form_forum_email_deja_enregistre' => 'Tiu ĉi retpoŝtadreso estas jam registrita, vi povas do uzi vian kutiman pasvorton.',
260
-	'form_forum_identifiant_mail' => 'Via nova ensalutilo estis ĵus al vi sendita per retletero.',
261
-	'form_forum_identifiants' => 'Personaj ensalutiloj',
262
-	'form_forum_indiquer_nom_email' => 'Indiku ĉi tie vian nomon kaj retpoŝtadreson. Via persona ensalutilo rapide alvenos al vi retletere.',
263
-	'form_forum_login' => 'salutnomo :',
264
-	'form_forum_message_auto' => '(tio estas aŭtomata mesaĝo)',
265
-	'form_forum_pass' => 'pasvorto :',
266
-	'form_forum_probleme_mail' => 'Retpoŝta problemo : la ensalutilo ne sendeblas.',
267
-	'form_forum_voici1' => 'Jen viaj ensalutiloj por partopreni la vivon de la retejo "@nom_site_spip@" (@adresse_site@) :',
268
-	'form_forum_voici2' => 'Jen estas viaj ensalutiloj por proponi artikolojn ĉe la retejo "@nom_site_spip@" (@adresse_login@) :',
269
-	'form_indiquer_email' => 'Bonvolu indiki vian retpoŝtadreson.',
270
-	'form_indiquer_nom' => 'Bonvolu indiki vian nomon.',
271
-	'form_indiquer_nom_site' => 'Bonvolu indiki la nomon de via retejo.',
272
-	'form_pet_deja_enregistre' => 'Tiu retejo estas jam registrita',
273
-	'form_pet_signature_pasprise' => 'Via subskribo ne estas registrita.',
274
-	'form_prop_confirmer_envoi' => 'Konfirmi la sendon',
275
-	'form_prop_description' => 'Priskribo/komento',
276
-	'form_prop_enregistre' => 'Via kontribuo estas registrita, ĝi aperos ĉerete post validigo de la respondeculoj de la retejo.',
277
-	'form_prop_envoyer' => 'Sendi mesaĝon',
278
-	'form_prop_indiquer_email' => 'Bonvolu indiki validan retpoŝtadreson',
279
-	'form_prop_indiquer_nom_site' => 'Bonvolu indiki la nomon de la retejo.',
280
-	'form_prop_indiquer_sujet' => 'Bonvolu indiki temon',
281
-	'form_prop_message_envoye' => 'Mesaĝo sendita',
282
-	'form_prop_non_enregistre' => 'Via propono ne estis registrita.',
283
-	'form_prop_sujet' => 'Temo',
284
-	'form_prop_url_site' => 'URL-adreso de la retejo',
285
-	'format_date_incorrecte' => 'La dato aŭ ĝia formo ne validas',
286
-	'format_heure_incorrecte' => 'La horo aŭ ĝia formo ne validas',
287
-	'forum_non_inscrit' => 'Vi ne estas registrita, aŭ la adreso aŭ la pasvorto ne ĝustas.',
288
-	'forum_par_auteur' => 'de @auteur@',
289
-	'forum_titre_erreur' => 'Eraro...',
254
+    'form_deja_inscrit' => 'Vi estas jam registrita.',
255
+    'form_email_non_valide' => 'Via retpoŝtadreso ne validas.',
256
+    'form_forum_access_refuse' => 'Vi ne plu havas alir-rajton al tiu retejo.',
257
+    'form_forum_bonjour' => 'Saluton @nom@,',
258
+    'form_forum_confirmer_email' => 'Por konfirmi vian retpoŝtadreson, iru al tiu retadreso : @url_confirm@',
259
+    'form_forum_email_deja_enregistre' => 'Tiu ĉi retpoŝtadreso estas jam registrita, vi povas do uzi vian kutiman pasvorton.',
260
+    'form_forum_identifiant_mail' => 'Via nova ensalutilo estis ĵus al vi sendita per retletero.',
261
+    'form_forum_identifiants' => 'Personaj ensalutiloj',
262
+    'form_forum_indiquer_nom_email' => 'Indiku ĉi tie vian nomon kaj retpoŝtadreson. Via persona ensalutilo rapide alvenos al vi retletere.',
263
+    'form_forum_login' => 'salutnomo :',
264
+    'form_forum_message_auto' => '(tio estas aŭtomata mesaĝo)',
265
+    'form_forum_pass' => 'pasvorto :',
266
+    'form_forum_probleme_mail' => 'Retpoŝta problemo : la ensalutilo ne sendeblas.',
267
+    'form_forum_voici1' => 'Jen viaj ensalutiloj por partopreni la vivon de la retejo "@nom_site_spip@" (@adresse_site@) :',
268
+    'form_forum_voici2' => 'Jen estas viaj ensalutiloj por proponi artikolojn ĉe la retejo "@nom_site_spip@" (@adresse_login@) :',
269
+    'form_indiquer_email' => 'Bonvolu indiki vian retpoŝtadreson.',
270
+    'form_indiquer_nom' => 'Bonvolu indiki vian nomon.',
271
+    'form_indiquer_nom_site' => 'Bonvolu indiki la nomon de via retejo.',
272
+    'form_pet_deja_enregistre' => 'Tiu retejo estas jam registrita',
273
+    'form_pet_signature_pasprise' => 'Via subskribo ne estas registrita.',
274
+    'form_prop_confirmer_envoi' => 'Konfirmi la sendon',
275
+    'form_prop_description' => 'Priskribo/komento',
276
+    'form_prop_enregistre' => 'Via kontribuo estas registrita, ĝi aperos ĉerete post validigo de la respondeculoj de la retejo.',
277
+    'form_prop_envoyer' => 'Sendi mesaĝon',
278
+    'form_prop_indiquer_email' => 'Bonvolu indiki validan retpoŝtadreson',
279
+    'form_prop_indiquer_nom_site' => 'Bonvolu indiki la nomon de la retejo.',
280
+    'form_prop_indiquer_sujet' => 'Bonvolu indiki temon',
281
+    'form_prop_message_envoye' => 'Mesaĝo sendita',
282
+    'form_prop_non_enregistre' => 'Via propono ne estis registrita.',
283
+    'form_prop_sujet' => 'Temo',
284
+    'form_prop_url_site' => 'URL-adreso de la retejo',
285
+    'format_date_incorrecte' => 'La dato aŭ ĝia formo ne validas',
286
+    'format_heure_incorrecte' => 'La horo aŭ ĝia formo ne validas',
287
+    'forum_non_inscrit' => 'Vi ne estas registrita, aŭ la adreso aŭ la pasvorto ne ĝustas.',
288
+    'forum_par_auteur' => 'de @auteur@',
289
+    'forum_titre_erreur' => 'Eraro...',
290 290
 
291
-	// I
292
-	'ical_texte_rss_articles' => 'La abondosiero (backend-dosiero) de la artikoloj de tiu retejo troveblas ĉe la retadreso :',
293
-	'ical_texte_rss_articles2' => 'Sube, vi povas trovi abonligojn por gvati evoluadon de artikoloj el ĉiu rubriko de la retejo :',
294
-	'ical_texte_rss_breves' => 'Krome ekzistas dosiero enhavanta ĉiujn fulm-informojn de la retejo. Precizigante la rubriko-numeron, vi ricevos nur la fulm-informojn el tiu rubriko.',
295
-	'icone_a_suivre' => 'Stabejo',
296
-	'icone_admin_site' => 'Reteja administrado',
297
-	'icone_agenda' => 'Agendo',
298
-	'icone_aide_ligne' => 'Helpilo',
299
-	'icone_articles' => 'Artikoloj',
300
-	'icone_auteurs' => 'Aŭtoroj',
301
-	'icone_brouteur' => 'Rapida retumado',
302
-	'icone_configuration_site' => 'Konfiguro',
303
-	'icone_configurer_site' => 'Konfiguri vian retejon',
304
-	'icone_creer_nouvel_auteur' => 'Krei novan aŭtoron',
305
-	'icone_creer_rubrique' => 'Krei novan rubrikon',
306
-	'icone_creer_sous_rubrique' => 'Krei sub-rubrikon',
307
-	'icone_deconnecter' => 'Elsaluti',
308
-	'icone_discussions' => 'Diskutoj',
309
-	'icone_doc_rubrique' => 'Dokumentoj de la rubrikoj',
310
-	'icone_ecrire_article' => 'Skribi novan artikolon',
311
-	'icone_edition_site' => 'Redaktejo',
312
-	'icone_gestion_langues' => 'Mastrumado de lingvoj',
313
-	'icone_informations_personnelles' => 'Personaj datenoj',
314
-	'icone_interface_complet' => 'kompleta interfaco',
315
-	'icone_interface_simple' => 'Simpla interfaco',
316
-	'icone_maintenance_site' => 'Retejo-bontenado',
317
-	'icone_messagerie_personnelle' => 'Persona mesaĝilo',
318
-	'icone_repartition_debut' => 'Afiŝi la distribuon ekde la komenco',
319
-	'icone_rubriques' => 'Rubrikoj',
320
-	'icone_sauver_site' => 'Savkopii la retejon',
321
-	'icone_site_entier' => 'La tuta retejo',
322
-	'icone_sites_references' => 'Referencigitaj retejoj',
323
-	'icone_statistiques' => 'Statistikoj de la retejo',
324
-	'icone_suivi_activite' => 'Gvati vivon de la retejo',
325
-	'icone_suivi_actualite' => 'Evoluado de la retejo',
326
-	'icone_suivi_pettions' => 'Superrigardi/mastrumi la petskribon',
327
-	'icone_suivi_revisions' => 'Modifoj de artikoloj',
328
-	'icone_supprimer_document' => 'Forigi tiun dokumenton',
329
-	'icone_supprimer_image' => 'Forigi tiun bildon',
330
-	'icone_tous_articles' => 'Ĉiuj viaj artikoloj',
331
-	'icone_tous_auteur' => 'Ĉiuj aŭtoroj',
332
-	'icone_tous_visiteur' => 'Ĉiuj vizitantoj',
333
-	'icone_visiter_site' => 'Vidi la publika spaco',
334
-	'icone_voir_en_ligne' => 'Vidi ĉeretigite',
335
-	'img_indisponible' => 'nedisponebla bildo',
336
-	'impossible' => 'ne eblas',
337
-	'info_a_suivre' => 'STABEJO »',
338
-	'info_acces_interdit' => 'Malpermesata aliro',
339
-	'info_acces_refuse' => 'Rifuzita aliro',
340
-	'info_action' => 'Ago : @action@',
341
-	'info_administrer_rubriques' => 'Vi povas mastrumi tiun rubrikon kaj ties subrubrikojn',
342
-	'info_adresse_non_indiquee' => 'Vi indikis neniun adreson por testi !',
343
-	'info_aide' => 'HELPO :',
344
-	'info_ajouter_mot' => 'Aldoni tiun vorton',
345
-	'info_annonce' => 'ANONCO',
346
-	'info_annonces_generales' => 'Ĝeneralaj anoncoj :',
347
-	'info_article_propose' => 'Proponita artikolo',
348
-	'info_article_publie' => 'Publikigita artikolo',
349
-	'info_article_redaction' => 'Redaktata artikolo',
350
-	'info_article_refuse' => 'Rifuzita artikolo',
351
-	'info_article_supprime' => 'Forviŝita artikolo',
352
-	'info_articles' => 'Artikoloj',
353
-	'info_articles_a_valider' => 'Validigendaj artikoloj',
354
-	'info_articles_nb' => '@nb@ artikoloj',
355
-	'info_articles_proposes' => 'Proponitaj artikoloj',
356
-	'info_articles_un' => '1 artikolo',
357
-	'info_auteurs_nombre' => 'aŭtoro(j) :',
358
-	'info_authentification_ftp' => 'Aŭtentigo (per FTP).',
359
-	'info_breves_2' => 'fulm-informoj',
360
-	'info_breves_nb' => '@nb@ fulm-informoj',
361
-	'info_breves_un' => '1 fulm-informo',
362
-	'info_connexion_refusee' => 'Konektiĝo rifuzata',
363
-	'info_contact_developpeur' => 'Bonvolu kontakti programiston.',
364
-	'info_contenance' => 'Tiu retejo enhavas :',
365
-	'info_contribution' => 'kontribuaĵoj',
366
-	'info_copyright' => '@spip@ estas libera programo distribuata @lien_gpl@.',
367
-	'info_copyright_doc' => 'Por pliaj informoj vidu la retpaĝon <a href="@spipnet@">@spipnet_affiche@</a>.',
368
-	'info_copyright_gpl' => 'sub licenco GPL',
369
-	'info_cours_edition' => 'Viaj redaktataj artikoloj', # MODIF
370
-	'info_creer_repertoire' => 'Bonvolu krei dosieron aŭ dosierujon kies nomo estu :',
371
-	'info_creer_repertoire_2' => 'ene de la subdosierujo <b>@repertoire@</b>, kaj :',
372
-	'info_creer_vignette' => 'aŭtomata kreo de la vinjeto',
373
-	'info_creerdansrubrique_non_autorise' => 'Vi ne havas sufiĉajn rajtojn por krei enhavo en ĉi tiu rubriko',
374
-	'info_deplier' => 'Malfaldi',
375
-	'info_descriptif_nombre' => 'priskribo(j) :',
376
-	'info_description' => 'Priskribo :',
377
-	'info_description_2' => 'Priskribo :',
378
-	'info_dimension' => 'Dimensioj :',
379
-	'info_documents_nb' => '@nb@ dokumentoj',
380
-	'info_documents_un' => '1 dokumento',
381
-	'info_ecire_message_prive' => 'Skribi privatan mesaĝon',
382
-	'info_email_invalide' => 'Nevalida retpoŝtadreso.',
383
-	'info_en_cours_validation' => 'Viaj redaktataj artikoloj',
384
-	'info_en_ligne' => 'Nun ĉerete :',
385
-	'info_envoyer_message_prive' => 'Sendi privatan mesaĝon al tiu ĉi aŭtoro',
386
-	'info_erreur_requete' => 'Eraro en la peto : ',
387
-	'info_erreur_squelette2' => 'Neniu skeleto <b>@fichier@</b> disponeblas...',
388
-	'info_erreur_systeme' => 'Sistemo-eraro (errno @errsys@)',
389
-	'info_erreur_systeme2' => 'Eble la fiksdisko plenas, aŭ la datenbazo estas difektita.<br />
291
+    // I
292
+    'ical_texte_rss_articles' => 'La abondosiero (backend-dosiero) de la artikoloj de tiu retejo troveblas ĉe la retadreso :',
293
+    'ical_texte_rss_articles2' => 'Sube, vi povas trovi abonligojn por gvati evoluadon de artikoloj el ĉiu rubriko de la retejo :',
294
+    'ical_texte_rss_breves' => 'Krome ekzistas dosiero enhavanta ĉiujn fulm-informojn de la retejo. Precizigante la rubriko-numeron, vi ricevos nur la fulm-informojn el tiu rubriko.',
295
+    'icone_a_suivre' => 'Stabejo',
296
+    'icone_admin_site' => 'Reteja administrado',
297
+    'icone_agenda' => 'Agendo',
298
+    'icone_aide_ligne' => 'Helpilo',
299
+    'icone_articles' => 'Artikoloj',
300
+    'icone_auteurs' => 'Aŭtoroj',
301
+    'icone_brouteur' => 'Rapida retumado',
302
+    'icone_configuration_site' => 'Konfiguro',
303
+    'icone_configurer_site' => 'Konfiguri vian retejon',
304
+    'icone_creer_nouvel_auteur' => 'Krei novan aŭtoron',
305
+    'icone_creer_rubrique' => 'Krei novan rubrikon',
306
+    'icone_creer_sous_rubrique' => 'Krei sub-rubrikon',
307
+    'icone_deconnecter' => 'Elsaluti',
308
+    'icone_discussions' => 'Diskutoj',
309
+    'icone_doc_rubrique' => 'Dokumentoj de la rubrikoj',
310
+    'icone_ecrire_article' => 'Skribi novan artikolon',
311
+    'icone_edition_site' => 'Redaktejo',
312
+    'icone_gestion_langues' => 'Mastrumado de lingvoj',
313
+    'icone_informations_personnelles' => 'Personaj datenoj',
314
+    'icone_interface_complet' => 'kompleta interfaco',
315
+    'icone_interface_simple' => 'Simpla interfaco',
316
+    'icone_maintenance_site' => 'Retejo-bontenado',
317
+    'icone_messagerie_personnelle' => 'Persona mesaĝilo',
318
+    'icone_repartition_debut' => 'Afiŝi la distribuon ekde la komenco',
319
+    'icone_rubriques' => 'Rubrikoj',
320
+    'icone_sauver_site' => 'Savkopii la retejon',
321
+    'icone_site_entier' => 'La tuta retejo',
322
+    'icone_sites_references' => 'Referencigitaj retejoj',
323
+    'icone_statistiques' => 'Statistikoj de la retejo',
324
+    'icone_suivi_activite' => 'Gvati vivon de la retejo',
325
+    'icone_suivi_actualite' => 'Evoluado de la retejo',
326
+    'icone_suivi_pettions' => 'Superrigardi/mastrumi la petskribon',
327
+    'icone_suivi_revisions' => 'Modifoj de artikoloj',
328
+    'icone_supprimer_document' => 'Forigi tiun dokumenton',
329
+    'icone_supprimer_image' => 'Forigi tiun bildon',
330
+    'icone_tous_articles' => 'Ĉiuj viaj artikoloj',
331
+    'icone_tous_auteur' => 'Ĉiuj aŭtoroj',
332
+    'icone_tous_visiteur' => 'Ĉiuj vizitantoj',
333
+    'icone_visiter_site' => 'Vidi la publika spaco',
334
+    'icone_voir_en_ligne' => 'Vidi ĉeretigite',
335
+    'img_indisponible' => 'nedisponebla bildo',
336
+    'impossible' => 'ne eblas',
337
+    'info_a_suivre' => 'STABEJO »',
338
+    'info_acces_interdit' => 'Malpermesata aliro',
339
+    'info_acces_refuse' => 'Rifuzita aliro',
340
+    'info_action' => 'Ago : @action@',
341
+    'info_administrer_rubriques' => 'Vi povas mastrumi tiun rubrikon kaj ties subrubrikojn',
342
+    'info_adresse_non_indiquee' => 'Vi indikis neniun adreson por testi !',
343
+    'info_aide' => 'HELPO :',
344
+    'info_ajouter_mot' => 'Aldoni tiun vorton',
345
+    'info_annonce' => 'ANONCO',
346
+    'info_annonces_generales' => 'Ĝeneralaj anoncoj :',
347
+    'info_article_propose' => 'Proponita artikolo',
348
+    'info_article_publie' => 'Publikigita artikolo',
349
+    'info_article_redaction' => 'Redaktata artikolo',
350
+    'info_article_refuse' => 'Rifuzita artikolo',
351
+    'info_article_supprime' => 'Forviŝita artikolo',
352
+    'info_articles' => 'Artikoloj',
353
+    'info_articles_a_valider' => 'Validigendaj artikoloj',
354
+    'info_articles_nb' => '@nb@ artikoloj',
355
+    'info_articles_proposes' => 'Proponitaj artikoloj',
356
+    'info_articles_un' => '1 artikolo',
357
+    'info_auteurs_nombre' => 'aŭtoro(j) :',
358
+    'info_authentification_ftp' => 'Aŭtentigo (per FTP).',
359
+    'info_breves_2' => 'fulm-informoj',
360
+    'info_breves_nb' => '@nb@ fulm-informoj',
361
+    'info_breves_un' => '1 fulm-informo',
362
+    'info_connexion_refusee' => 'Konektiĝo rifuzata',
363
+    'info_contact_developpeur' => 'Bonvolu kontakti programiston.',
364
+    'info_contenance' => 'Tiu retejo enhavas :',
365
+    'info_contribution' => 'kontribuaĵoj',
366
+    'info_copyright' => '@spip@ estas libera programo distribuata @lien_gpl@.',
367
+    'info_copyright_doc' => 'Por pliaj informoj vidu la retpaĝon <a href="@spipnet@">@spipnet_affiche@</a>.',
368
+    'info_copyright_gpl' => 'sub licenco GPL',
369
+    'info_cours_edition' => 'Viaj redaktataj artikoloj', # MODIF
370
+    'info_creer_repertoire' => 'Bonvolu krei dosieron aŭ dosierujon kies nomo estu :',
371
+    'info_creer_repertoire_2' => 'ene de la subdosierujo <b>@repertoire@</b>, kaj :',
372
+    'info_creer_vignette' => 'aŭtomata kreo de la vinjeto',
373
+    'info_creerdansrubrique_non_autorise' => 'Vi ne havas sufiĉajn rajtojn por krei enhavo en ĉi tiu rubriko',
374
+    'info_deplier' => 'Malfaldi',
375
+    'info_descriptif_nombre' => 'priskribo(j) :',
376
+    'info_description' => 'Priskribo :',
377
+    'info_description_2' => 'Priskribo :',
378
+    'info_dimension' => 'Dimensioj :',
379
+    'info_documents_nb' => '@nb@ dokumentoj',
380
+    'info_documents_un' => '1 dokumento',
381
+    'info_ecire_message_prive' => 'Skribi privatan mesaĝon',
382
+    'info_email_invalide' => 'Nevalida retpoŝtadreso.',
383
+    'info_en_cours_validation' => 'Viaj redaktataj artikoloj',
384
+    'info_en_ligne' => 'Nun ĉerete :',
385
+    'info_envoyer_message_prive' => 'Sendi privatan mesaĝon al tiu ĉi aŭtoro',
386
+    'info_erreur_requete' => 'Eraro en la peto : ',
387
+    'info_erreur_squelette2' => 'Neniu skeleto <b>@fichier@</b> disponeblas...',
388
+    'info_erreur_systeme' => 'Sistemo-eraro (errno @errsys@)',
389
+    'info_erreur_systeme2' => 'Eble la fiksdisko plenas, aŭ la datenbazo estas difektita.<br />
390 390
 <span style="color:red;">Provu<a href=\'@script@\'>ripari la datenbazon</a>,
391 391
 aŭ kontaktu vian retgastiganton.</span>',
392
-	'info_fini' => 'Finite !',
393
-	'info_format_image' => 'Bildaj formatoj uzeblaj por krei vinjetojn : @gd_formats@.',
394
-	'info_format_non_defini' => 'nedefinita formato',
395
-	'info_grand_ecran' => 'Granda ekrano',
396
-	'info_image_aide' => 'HELPILO',
397
-	'info_image_process_titre' => 'Metodo pri vinjet-farado',
398
-	'info_impossible_lire_page' => '<b>Eraro !</b> Ne eblas legi la paĝon <tt> <html>@test_proxy@</html> </tt> tra la prokura servilo <tt>',
399
-	'info_installation_systeme_publication' => 'Instalo de la publikiga sistemo...',
400
-	'info_installer_documents' => 'Vi povas aŭtomate instali ĉiujn dokumentojn troviĝantajn en la dosiero @upload@.',
401
-	'info_installer_ftp' => 'Kiel mastrumanto, vi povas instali (FTP-e) dosierojn en la dosierujon @upload@ kaj poste rekte selekti ilin ĉi tie.',
402
-	'info_installer_images' => 'Vi povas instali bildojn je la formatoj JPEG, GIF kaj PNG.',
403
-	'info_installer_images_dossier' => 'Instali bildojn en la dosierujon @upload@ por povi ilin selekti ĉi tie.',
404
-	'info_interface_complete' => 'kompleta interfaco',
405
-	'info_interface_simple' => 'Simpla interfaco',
406
-	'info_joindre_document_article' => 'Vi povas ligi kun tiu artikolo dokumentojn tiajn, kiaj',
407
-	'info_joindre_document_rubrique' => 'Vi povas ligi kun tiu rubriko dokumentojn tiajn, kiaj',
408
-	'info_joindre_documents_article' => 'Vi povas ligi kun tiu artikolo dokumentojn tiajn, kiaj :',
409
-	'info_l_article' => 'la artikolo',
410
-	'info_la_breve' => 'la fulm-informo',
411
-	'info_la_rubrique' => 'la rubriko',
412
-	'info_langue_principale' => 'Ĉefa lingvo de la retejo',
413
-	'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ bilderoj',
414
-	'info_les_auteurs_1' => 'de @les_auteurs@',
415
-	'info_logo_format_interdit' => 'Nur vinjetoj je formatoj @formats@ estas permesataj.',
416
-	'info_logo_max_poids' => 'Vinjetoj devige pezu malpli ol @maxi@ (tiu dosiero pezas @actuel@).',
417
-	'info_mail_fournisseur' => '[email protected]',
418
-	'info_message_2' => 'MESAĜO',
419
-	'info_message_supprime' => 'FORIGITA MESAĜO',
420
-	'info_messages_nb' => '@nb@ mesaĝoj',
421
-	'info_messages_un' => '1 mesaĝo',
422
-	'info_mise_en_ligne' => 'Dato de ĉeretigo : ',
423
-	'info_modification_parametres_securite' => 'modifoj de la sekuraj parametroj',
424
-	'info_mois_courant' => 'En la kuranta monato :',
425
-	'info_mot_cle_ajoute' => 'La jena ŝlosilvorto estas ligita kun',
426
-	'info_multi_herit' => 'Defaŭlta lingvo',
427
-	'info_multi_langues_soulignees' => 'Por la <u>substrekitaj lingvoj</u>, ĉiuj tekstoj de la interfaco estas tute aŭ parte tradukitaj. Kiam vi elektas tiujn lingvojn, multaj elementoj de la publika retejo (datenoj, formularoj) estos aŭtomate tradukitaj. Por la nesubstrekitaj lingvoj, tiuj elementoj afiŝiĝos en la ĉefa lingvo de la retejo.',
428
-	'info_multilinguisme' => 'Multlingvismo',
429
-	'info_nom_non_utilisateurs_connectes' => 'Via nomo ne aperas en la listo de la ensalutintaj uzantoj.',
430
-	'info_nom_utilisateurs_connectes' => 'Via nomo aperas en la listo de la ensalutintaj uzantoj.',
431
-	'info_nombre_en_ligne' => 'Nun ensalutintaj :',
432
-	'info_non_resultat' => 'Neniu rezulto por "@cherche_mot@"',
433
-	'info_non_utilisation_messagerie' => 'Vi ne uzas la internan mesaĝilon de tiu retejo.',
434
-	'info_nouveau_message' => 'VI HAVAS NOVAN MESAĜON',
435
-	'info_nouveaux_messages' => 'VI HAVAS @total_messages@ NOVA(J)N MESAĜO(J)N',
436
-	'info_numero_abbreviation' => 'N° ',
437
-	'info_obligatoire' => 'Tiu ĉi informo estas deviga',
438
-	'info_pense_bete' => 'MEMORIGILO',
439
-	'info_petit_ecran' => 'Eta ekrano',
440
-	'info_petition_close' => 'Petskribo fermita',
441
-	'info_pixels' => 'bilderoj',
442
-	'info_plusieurs_mots_trouves' => 'Pluraj ŝlosilvortoj trovitaj por "@cherche_mot@" :',
443
-	'info_portfolio_automatique' => 'Aŭtomata dokumentujo :',
444
-	'info_premier_resultat' => '[@debut_limit@ unuaj rezultoj el @total@]',
445
-	'info_premier_resultat_sur' => '[@debut_limit@ unuaj rezultoj el @total@]',
446
-	'info_propose_1' => '[@nom_site_spip@] Proponas : @titre@',
447
-	'info_propose_2' => 'Proponita artikolo
392
+    'info_fini' => 'Finite !',
393
+    'info_format_image' => 'Bildaj formatoj uzeblaj por krei vinjetojn : @gd_formats@.',
394
+    'info_format_non_defini' => 'nedefinita formato',
395
+    'info_grand_ecran' => 'Granda ekrano',
396
+    'info_image_aide' => 'HELPILO',
397
+    'info_image_process_titre' => 'Metodo pri vinjet-farado',
398
+    'info_impossible_lire_page' => '<b>Eraro !</b> Ne eblas legi la paĝon <tt> <html>@test_proxy@</html> </tt> tra la prokura servilo <tt>',
399
+    'info_installation_systeme_publication' => 'Instalo de la publikiga sistemo...',
400
+    'info_installer_documents' => 'Vi povas aŭtomate instali ĉiujn dokumentojn troviĝantajn en la dosiero @upload@.',
401
+    'info_installer_ftp' => 'Kiel mastrumanto, vi povas instali (FTP-e) dosierojn en la dosierujon @upload@ kaj poste rekte selekti ilin ĉi tie.',
402
+    'info_installer_images' => 'Vi povas instali bildojn je la formatoj JPEG, GIF kaj PNG.',
403
+    'info_installer_images_dossier' => 'Instali bildojn en la dosierujon @upload@ por povi ilin selekti ĉi tie.',
404
+    'info_interface_complete' => 'kompleta interfaco',
405
+    'info_interface_simple' => 'Simpla interfaco',
406
+    'info_joindre_document_article' => 'Vi povas ligi kun tiu artikolo dokumentojn tiajn, kiaj',
407
+    'info_joindre_document_rubrique' => 'Vi povas ligi kun tiu rubriko dokumentojn tiajn, kiaj',
408
+    'info_joindre_documents_article' => 'Vi povas ligi kun tiu artikolo dokumentojn tiajn, kiaj :',
409
+    'info_l_article' => 'la artikolo',
410
+    'info_la_breve' => 'la fulm-informo',
411
+    'info_la_rubrique' => 'la rubriko',
412
+    'info_langue_principale' => 'Ĉefa lingvo de la retejo',
413
+    'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ bilderoj',
414
+    'info_les_auteurs_1' => 'de @les_auteurs@',
415
+    'info_logo_format_interdit' => 'Nur vinjetoj je formatoj @formats@ estas permesataj.',
416
+    'info_logo_max_poids' => 'Vinjetoj devige pezu malpli ol @maxi@ (tiu dosiero pezas @actuel@).',
417
+    'info_mail_fournisseur' => '[email protected]',
418
+    'info_message_2' => 'MESAĜO',
419
+    'info_message_supprime' => 'FORIGITA MESAĜO',
420
+    'info_messages_nb' => '@nb@ mesaĝoj',
421
+    'info_messages_un' => '1 mesaĝo',
422
+    'info_mise_en_ligne' => 'Dato de ĉeretigo : ',
423
+    'info_modification_parametres_securite' => 'modifoj de la sekuraj parametroj',
424
+    'info_mois_courant' => 'En la kuranta monato :',
425
+    'info_mot_cle_ajoute' => 'La jena ŝlosilvorto estas ligita kun',
426
+    'info_multi_herit' => 'Defaŭlta lingvo',
427
+    'info_multi_langues_soulignees' => 'Por la <u>substrekitaj lingvoj</u>, ĉiuj tekstoj de la interfaco estas tute aŭ parte tradukitaj. Kiam vi elektas tiujn lingvojn, multaj elementoj de la publika retejo (datenoj, formularoj) estos aŭtomate tradukitaj. Por la nesubstrekitaj lingvoj, tiuj elementoj afiŝiĝos en la ĉefa lingvo de la retejo.',
428
+    'info_multilinguisme' => 'Multlingvismo',
429
+    'info_nom_non_utilisateurs_connectes' => 'Via nomo ne aperas en la listo de la ensalutintaj uzantoj.',
430
+    'info_nom_utilisateurs_connectes' => 'Via nomo aperas en la listo de la ensalutintaj uzantoj.',
431
+    'info_nombre_en_ligne' => 'Nun ensalutintaj :',
432
+    'info_non_resultat' => 'Neniu rezulto por "@cherche_mot@"',
433
+    'info_non_utilisation_messagerie' => 'Vi ne uzas la internan mesaĝilon de tiu retejo.',
434
+    'info_nouveau_message' => 'VI HAVAS NOVAN MESAĜON',
435
+    'info_nouveaux_messages' => 'VI HAVAS @total_messages@ NOVA(J)N MESAĜO(J)N',
436
+    'info_numero_abbreviation' => 'N° ',
437
+    'info_obligatoire' => 'Tiu ĉi informo estas deviga',
438
+    'info_pense_bete' => 'MEMORIGILO',
439
+    'info_petit_ecran' => 'Eta ekrano',
440
+    'info_petition_close' => 'Petskribo fermita',
441
+    'info_pixels' => 'bilderoj',
442
+    'info_plusieurs_mots_trouves' => 'Pluraj ŝlosilvortoj trovitaj por "@cherche_mot@" :',
443
+    'info_portfolio_automatique' => 'Aŭtomata dokumentujo :',
444
+    'info_premier_resultat' => '[@debut_limit@ unuaj rezultoj el @total@]',
445
+    'info_premier_resultat_sur' => '[@debut_limit@ unuaj rezultoj el @total@]',
446
+    'info_propose_1' => '[@nom_site_spip@] Proponas : @titre@',
447
+    'info_propose_2' => 'Proponita artikolo
448 448
 ---------------',
449
-	'info_propose_3' => 'La artikolo "@titre@" estas proponita por publikigo.',
450
-	'info_propose_4' => 'Vi estas petata konsulti ĝin kaj doni vian opinion',
451
-	'info_propose_5' => 'en la forumo ligita al ĝi. Ĝi estas disponebla el la adreso :',
452
-	'info_publie_01' => 'La artikolo "@titre@" estis validigita de @connect_nom@.',
453
-	'info_publie_1' => '[@nom_site_spip@] PUBLIKIGAS : @titre@',
454
-	'info_publie_2' => 'Artikolo publikigita
449
+    'info_propose_3' => 'La artikolo "@titre@" estas proponita por publikigo.',
450
+    'info_propose_4' => 'Vi estas petata konsulti ĝin kaj doni vian opinion',
451
+    'info_propose_5' => 'en la forumo ligita al ĝi. Ĝi estas disponebla el la adreso :',
452
+    'info_publie_01' => 'La artikolo "@titre@" estis validigita de @connect_nom@.',
453
+    'info_publie_1' => '[@nom_site_spip@] PUBLIKIGAS : @titre@',
454
+    'info_publie_2' => 'Artikolo publikigita
455 455
 --------------',
456
-	'info_rechercher' => 'Serĉi',
457
-	'info_rechercher_02' => 'Serĉi :',
458
-	'info_remplacer_vignette' => 'Anstataŭi la defaŭltan vinjeton per propra vinjeto :',
459
-	'info_rubriques_nb' => '@nb@ rubrikoj',
460
-	'info_rubriques_un' => '1 rubriko',
461
-	'info_sans_titre_2' => 'sen titolo',
462
-	'info_selectionner_fichier' => 'Vi povas selekti dosieron el la dosierujo @upload@',
463
-	'info_selectionner_fichier_2' => 'Elektu dosieron :',
464
-	'info_sites_nb' => '@nb@ retejoj',
465
-	'info_sites_un' => '1 retejo',
466
-	'info_supprimer_vignette' => 'forigi la vinjeton',
467
-	'info_symbole_bleu' => 'La <b>blua</b> simbolo indikas <b>memorigilon</b> : tio estas al vi persone adresata memoriga mesaĝo.',
468
-	'info_symbole_jaune' => 'La <b>flava</b> simbolo indikas <b>anoncon al ĉiuj redaktantoj</b> : modifebla de ĉiuj mastrumantoj, kaj videbla de ĉiuj redaktantoj.',
469
-	'info_symbole_vert' => 'La <b>verda</b> simbolo indikas la <b>mesaĝojn interŝanĝitajn kun aliaj uzantoj</b> de la retejo.',
470
-	'info_telecharger_nouveau_logo' => 'Alŝuti novan vinjeton :',
471
-	'info_telecharger_ordinateur' => 'Alŝuti ekde via komputilo :',
472
-	'info_tous_resultats_enregistres' => '[ĉiuj rezultoj estas registritaj]',
473
-	'info_tout_afficher' => 'Ĉion afiŝi',
474
-	'info_travaux_texte' => 'Tiu retejo ne jam estas konfigurita. Bonvolu reveni poste...',
475
-	'info_travaux_titre' => 'Retejo prilaborata ',
476
-	'info_trop_resultat' => 'Tro da rezultoj por "@cherche_mot@" ; bonvolu fajnigi la serĉokriteriojn.',
477
-	'info_utilisation_messagerie_interne' => 'Vi uzas la internan poŝton de tiu ĉi retejo.',
478
-	'info_valider_lien' => 'validigi tiun ĉi ligilon',
479
-	'info_verifier_image' => ', bonvolu kontroli ĉu viaj bildoj estas trafe transigitaj.',
480
-	'info_vignette_defaut' => 'Defaŭlta vinjeto',
481
-	'info_vignette_personnalisee' => 'Persona vinjeto',
482
-	'info_visite' => 'vizito :',
483
-	'info_vos_rendez_vous' => 'Viaj estontaj rendevuoj',
484
-	'infos_vos_pense_bete' => 'Viaj memorigiloj',
456
+    'info_rechercher' => 'Serĉi',
457
+    'info_rechercher_02' => 'Serĉi :',
458
+    'info_remplacer_vignette' => 'Anstataŭi la defaŭltan vinjeton per propra vinjeto :',
459
+    'info_rubriques_nb' => '@nb@ rubrikoj',
460
+    'info_rubriques_un' => '1 rubriko',
461
+    'info_sans_titre_2' => 'sen titolo',
462
+    'info_selectionner_fichier' => 'Vi povas selekti dosieron el la dosierujo @upload@',
463
+    'info_selectionner_fichier_2' => 'Elektu dosieron :',
464
+    'info_sites_nb' => '@nb@ retejoj',
465
+    'info_sites_un' => '1 retejo',
466
+    'info_supprimer_vignette' => 'forigi la vinjeton',
467
+    'info_symbole_bleu' => 'La <b>blua</b> simbolo indikas <b>memorigilon</b> : tio estas al vi persone adresata memoriga mesaĝo.',
468
+    'info_symbole_jaune' => 'La <b>flava</b> simbolo indikas <b>anoncon al ĉiuj redaktantoj</b> : modifebla de ĉiuj mastrumantoj, kaj videbla de ĉiuj redaktantoj.',
469
+    'info_symbole_vert' => 'La <b>verda</b> simbolo indikas la <b>mesaĝojn interŝanĝitajn kun aliaj uzantoj</b> de la retejo.',
470
+    'info_telecharger_nouveau_logo' => 'Alŝuti novan vinjeton :',
471
+    'info_telecharger_ordinateur' => 'Alŝuti ekde via komputilo :',
472
+    'info_tous_resultats_enregistres' => '[ĉiuj rezultoj estas registritaj]',
473
+    'info_tout_afficher' => 'Ĉion afiŝi',
474
+    'info_travaux_texte' => 'Tiu retejo ne jam estas konfigurita. Bonvolu reveni poste...',
475
+    'info_travaux_titre' => 'Retejo prilaborata ',
476
+    'info_trop_resultat' => 'Tro da rezultoj por "@cherche_mot@" ; bonvolu fajnigi la serĉokriteriojn.',
477
+    'info_utilisation_messagerie_interne' => 'Vi uzas la internan poŝton de tiu ĉi retejo.',
478
+    'info_valider_lien' => 'validigi tiun ĉi ligilon',
479
+    'info_verifier_image' => ', bonvolu kontroli ĉu viaj bildoj estas trafe transigitaj.',
480
+    'info_vignette_defaut' => 'Defaŭlta vinjeto',
481
+    'info_vignette_personnalisee' => 'Persona vinjeto',
482
+    'info_visite' => 'vizito :',
483
+    'info_vos_rendez_vous' => 'Viaj estontaj rendevuoj',
484
+    'infos_vos_pense_bete' => 'Viaj memorigiloj',
485 485
 
486
-	// L
487
-	'label_ajout_id_rapide' => 'Rapida aldono',
488
-	'label_poids_fichier' => 'Grandeco',
489
-	'lien_afficher_icones_seuls' => 'Afiŝi nur la piktogramojn',
490
-	'lien_afficher_texte_icones' => 'Afiŝi la piktogramojn kaj la tekston',
491
-	'lien_afficher_texte_seul' => 'Afiŝi nur la tekston',
492
-	'lien_liberer' => 'liberigi',
493
-	'lien_liberer_tous' => 'Liberigi ĉiujn',
494
-	'lien_nouvea_pense_bete' => 'NOVA MEMORIGILO',
495
-	'lien_nouveau_message' => 'NOVA MESAĜO',
496
-	'lien_nouvelle_annonce' => 'NOVA ANONCO',
497
-	'lien_petitions' => 'PETSKRIBO',
498
-	'lien_popularite' => 'populareco : @popularite@%',
499
-	'lien_racine_site' => 'RADIKO DE LA RETEJO',
500
-	'lien_reessayer' => 'reprovi',
501
-	'lien_repondre_message' => 'Respondi al tiu mesaĝo',
502
-	'lien_supprimer' => 'forigi',
503
-	'lien_tout_afficher' => 'Afiŝi ĉion',
504
-	'lien_visite_site' => 'viziti tiun retejon',
505
-	'lien_visites' => '@visites@ vizitoj',
506
-	'lien_voir_auteur' => 'Vidi tiun aŭtoron',
507
-	'ligne' => 'Linio',
508
-	'login' => 'Ensaluti',
509
-	'login_acces_prive' => 'aliro al la privata spaco',
510
-	'login_autre_identifiant' => 'ensaluti per alia salutnomo',
511
-	'login_cookie_accepte' => 'Bonvolu agordi vian retumilon por ke ĝi akceptu ilin (almenaŭ por tiu ĉi retejo).',
512
-	'login_cookie_oblige' => 'Por sekure ensalutiĝi en tiu retejo, vi devas akcepti la kuketojn.',
513
-	'login_deconnexion_ok' => 'Elsalutinta.',
514
-	'login_erreur_pass' => 'Pasvort-eraro.',
515
-	'login_espace_prive' => 'privata spaco',
516
-	'login_identifiant_inconnu' => 'La salutnomo « @login@ » estas nekonata.',
517
-	'login_login' => 'Salutnomo :',
518
-	'login_login2' => 'Salutnomo aŭ retpoŝtadreso :',
519
-	'login_login_pass_incorrect' => '(Salutnomo aŭ pasvorto ne valida.)',
520
-	'login_motpasseoublie' => 'ĉu pasvorto forgesita ?',
521
-	'login_non_securise' => 'Atentu, tiu formularo ne estas sekurigita ;.
486
+    // L
487
+    'label_ajout_id_rapide' => 'Rapida aldono',
488
+    'label_poids_fichier' => 'Grandeco',
489
+    'lien_afficher_icones_seuls' => 'Afiŝi nur la piktogramojn',
490
+    'lien_afficher_texte_icones' => 'Afiŝi la piktogramojn kaj la tekston',
491
+    'lien_afficher_texte_seul' => 'Afiŝi nur la tekston',
492
+    'lien_liberer' => 'liberigi',
493
+    'lien_liberer_tous' => 'Liberigi ĉiujn',
494
+    'lien_nouvea_pense_bete' => 'NOVA MEMORIGILO',
495
+    'lien_nouveau_message' => 'NOVA MESAĜO',
496
+    'lien_nouvelle_annonce' => 'NOVA ANONCO',
497
+    'lien_petitions' => 'PETSKRIBO',
498
+    'lien_popularite' => 'populareco : @popularite@%',
499
+    'lien_racine_site' => 'RADIKO DE LA RETEJO',
500
+    'lien_reessayer' => 'reprovi',
501
+    'lien_repondre_message' => 'Respondi al tiu mesaĝo',
502
+    'lien_supprimer' => 'forigi',
503
+    'lien_tout_afficher' => 'Afiŝi ĉion',
504
+    'lien_visite_site' => 'viziti tiun retejon',
505
+    'lien_visites' => '@visites@ vizitoj',
506
+    'lien_voir_auteur' => 'Vidi tiun aŭtoron',
507
+    'ligne' => 'Linio',
508
+    'login' => 'Ensaluti',
509
+    'login_acces_prive' => 'aliro al la privata spaco',
510
+    'login_autre_identifiant' => 'ensaluti per alia salutnomo',
511
+    'login_cookie_accepte' => 'Bonvolu agordi vian retumilon por ke ĝi akceptu ilin (almenaŭ por tiu ĉi retejo).',
512
+    'login_cookie_oblige' => 'Por sekure ensalutiĝi en tiu retejo, vi devas akcepti la kuketojn.',
513
+    'login_deconnexion_ok' => 'Elsalutinta.',
514
+    'login_erreur_pass' => 'Pasvort-eraro.',
515
+    'login_espace_prive' => 'privata spaco',
516
+    'login_identifiant_inconnu' => 'La salutnomo « @login@ » estas nekonata.',
517
+    'login_login' => 'Salutnomo :',
518
+    'login_login2' => 'Salutnomo aŭ retpoŝtadreso :',
519
+    'login_login_pass_incorrect' => '(Salutnomo aŭ pasvorto ne valida.)',
520
+    'login_motpasseoublie' => 'ĉu pasvorto forgesita ?',
521
+    'login_non_securise' => 'Atentu, tiu formularo ne estas sekurigita ;.
522 522
    Se vi ne volas ke via pasvorto estu fraŭde
523 523
    interkaptita ĉe la reto, bonvolu aktivigi
524 524
    Javascript-on en via retumilo',
525
-	'login_nouvelle_tentative' => 'Nova provo',
526
-	'login_par_ici' => 'Vi estas registrita... ĉi tien...',
527
-	'login_pass2' => 'Pasvorto :',
528
-	'login_preferez_refuser' => '<b>Se vi preferas rifuzi kuketojn</b>, alia konektometodo (malpli sekura) estas je via dispono :',
529
-	'login_recharger' => 'freŝigi tiun ĉi paĝon',
530
-	'login_rester_identifie' => 'Resti ensalutinta kelkajn tagojn', # MODIF
531
-	'login_retour_public' => 'Reen al la publika spaco',
532
-	'login_retour_site' => 'Reen al la publika spaco',
533
-	'login_retoursitepublic' => 'reen al la publika spaco',
534
-	'login_sans_cookie' => 'Ensaluto sen kuketo',
535
-	'login_securise' => 'Sekura salutnomo',
536
-	'login_sinscrire' => 'registriĝi', # MODIF
537
-	'login_test_navigateur' => 'testo retumilo/rekonektiĝo',
538
-	'login_verifiez_navigateur' => '(Kontrolu tamen ke via retumilo ne memoras pri via pasvorto...)',
525
+    'login_nouvelle_tentative' => 'Nova provo',
526
+    'login_par_ici' => 'Vi estas registrita... ĉi tien...',
527
+    'login_pass2' => 'Pasvorto :',
528
+    'login_preferez_refuser' => '<b>Se vi preferas rifuzi kuketojn</b>, alia konektometodo (malpli sekura) estas je via dispono :',
529
+    'login_recharger' => 'freŝigi tiun ĉi paĝon',
530
+    'login_rester_identifie' => 'Resti ensalutinta kelkajn tagojn', # MODIF
531
+    'login_retour_public' => 'Reen al la publika spaco',
532
+    'login_retour_site' => 'Reen al la publika spaco',
533
+    'login_retoursitepublic' => 'reen al la publika spaco',
534
+    'login_sans_cookie' => 'Ensaluto sen kuketo',
535
+    'login_securise' => 'Sekura salutnomo',
536
+    'login_sinscrire' => 'registriĝi', # MODIF
537
+    'login_test_navigateur' => 'testo retumilo/rekonektiĝo',
538
+    'login_verifiez_navigateur' => '(Kontrolu tamen ke via retumilo ne memoras pri via pasvorto...)',
539 539
 
540
-	// M
541
-	'masquer_colonne' => 'Kaŝi tiun ĉi kolumnon',
542
-	'masquer_trad' => 'kaŝi la tradukojn',
543
-	'message_nouveaux_identifiants_echec' => 'Ne eblas krei novajn ensalutilojn.',
544
-	'message_nouveaux_identifiants_echec_envoi' => 'Ne eblis sendi la novajn ensalutilojn.',
545
-	'message_nouveaux_identifiants_ok' => 'La novaj ensalutilojn estis senditaj al @email@.',
546
-	'module_fichiers_langues' => 'Dosieroj de lingvo',
540
+    // M
541
+    'masquer_colonne' => 'Kaŝi tiun ĉi kolumnon',
542
+    'masquer_trad' => 'kaŝi la tradukojn',
543
+    'message_nouveaux_identifiants_echec' => 'Ne eblas krei novajn ensalutilojn.',
544
+    'message_nouveaux_identifiants_echec_envoi' => 'Ne eblis sendi la novajn ensalutilojn.',
545
+    'message_nouveaux_identifiants_ok' => 'La novaj ensalutilojn estis senditaj al @email@.',
546
+    'module_fichiers_langues' => 'Dosieroj de lingvo',
547 547
 
548
-	// N
549
-	'navigateur_pas_redirige' => 'Se via retumilo ne redirektiĝas, daŭrigu musklakante ĉi tie.',
550
-	'numero' => 'Numero',
548
+    // N
549
+    'navigateur_pas_redirige' => 'Se via retumilo ne redirektiĝas, daŭrigu musklakante ĉi tie.',
550
+    'numero' => 'Numero',
551 551
 
552
-	// O
553
-	'occurence' => 'Trafo',
554
-	'onglet_affacer_base' => 'Forigi la datenbazon',
555
-	'onglet_auteur' => 'La aŭtoro',
556
-	'onglet_contenu_site' => 'Enhavo de la retejo',
557
-	'onglet_evolution_visite_mod' => 'Evoluado',
558
-	'onglet_fonctions_avances' => 'Ampleksaj funkcioj',
559
-	'onglet_informations_personnelles' => 'Personaj datenoj',
560
-	'onglet_interactivite' => 'Interagado',
561
-	'onglet_messagerie' => 'Mesaĝilo',
562
-	'onglet_repartition_rubrique' => 'Distribuo laŭ rubrikoj',
563
-	'onglet_save_restaur_base' => 'Savkopii/restaŭri la datenbazon',
564
-	'onglet_vider_cache' => 'Malplenigi la staplon',
552
+    // O
553
+    'occurence' => 'Trafo',
554
+    'onglet_affacer_base' => 'Forigi la datenbazon',
555
+    'onglet_auteur' => 'La aŭtoro',
556
+    'onglet_contenu_site' => 'Enhavo de la retejo',
557
+    'onglet_evolution_visite_mod' => 'Evoluado',
558
+    'onglet_fonctions_avances' => 'Ampleksaj funkcioj',
559
+    'onglet_informations_personnelles' => 'Personaj datenoj',
560
+    'onglet_interactivite' => 'Interagado',
561
+    'onglet_messagerie' => 'Mesaĝilo',
562
+    'onglet_repartition_rubrique' => 'Distribuo laŭ rubrikoj',
563
+    'onglet_save_restaur_base' => 'Savkopii/restaŭri la datenbazon',
564
+    'onglet_vider_cache' => 'Malplenigi la staplon',
565 565
 
566
-	// P
567
-	'pass_choix_pass' => 'Bonvolu elekti vian novan pasvorton :',
568
-	'pass_erreur' => 'Eraro',
569
-	'pass_erreur_acces_refuse' => '<b>Eraro :</b> vi ne plu havas aliron al tiu retejo.',
570
-	'pass_erreur_code_inconnu' => '<b>Eraro :</b> tiu kodo kongruas kun neniu el la vizitantoj rajtantaj aliri tiun ĉi retejon.',
571
-	'pass_erreur_non_enregistre' => '<b>Eraro :</b> la retpoŝtadreso <tt>@email_oubli@</tt> ne estas registrita ĉi tie.',
572
-	'pass_erreur_non_valide' => '<b>Eraro :</b> tiu retpoŝtadreso <tt>@email_oubli@</tt> ne validas !',
573
-	'pass_erreur_probleme_technique' => '<b>Eraro :</b> pro teknika problemo, la retmesaĝo ne povas esti sendata.',
574
-	'pass_espace_prive_bla' => 'La privata spaco de tiu ĉi retejo estas malfermita al
566
+    // P
567
+    'pass_choix_pass' => 'Bonvolu elekti vian novan pasvorton :',
568
+    'pass_erreur' => 'Eraro',
569
+    'pass_erreur_acces_refuse' => '<b>Eraro :</b> vi ne plu havas aliron al tiu retejo.',
570
+    'pass_erreur_code_inconnu' => '<b>Eraro :</b> tiu kodo kongruas kun neniu el la vizitantoj rajtantaj aliri tiun ĉi retejon.',
571
+    'pass_erreur_non_enregistre' => '<b>Eraro :</b> la retpoŝtadreso <tt>@email_oubli@</tt> ne estas registrita ĉi tie.',
572
+    'pass_erreur_non_valide' => '<b>Eraro :</b> tiu retpoŝtadreso <tt>@email_oubli@</tt> ne validas !',
573
+    'pass_erreur_probleme_technique' => '<b>Eraro :</b> pro teknika problemo, la retmesaĝo ne povas esti sendata.',
574
+    'pass_espace_prive_bla' => 'La privata spaco de tiu ĉi retejo estas malfermita al
575 575
   vizitantoj, post ties registriĝo. Tio farita, vi povos
576 576
   konsulti la redaktatajn artikolojn, proponi artikolojn
577 577
   kaj partopreni en ĉiuj forumoj.',
578
-	'pass_forum_bla' => 'Vi petis por kontribui en forumo
578
+    'pass_forum_bla' => 'Vi petis por kontribui en forumo
579 579
   rezervita al registritaj vizitantoj.',
580
-	'pass_indiquez_cidessous' => 'Indiku ĉi-sube la retpoŝtadreson laŭ kiu vi
580
+    'pass_indiquez_cidessous' => 'Indiku ĉi-sube la retpoŝtadreson laŭ kiu vi
581 581
    antaŭe registriĝis. Vi
582 582
    ricevos retmesaĝon kiu indikos al vi kion fari por
583 583
    reakiri vian alir-rajton.',
584
-	'pass_mail_passcookie' => '(tio ĉi estas aŭtomata mesaĝo)
584
+    'pass_mail_passcookie' => '(tio ĉi estas aŭtomata mesaĝo)
585 585
 Por reakiri alireblon al la retejo
586 586
 @nom_site_spip@ (@adresse_site@)
587 587
 
@@ -593,145 +593,145 @@  discard block
 block discarded – undo
593 593
 kaj ensaluti.
594 594
 
595 595
 ',
596
-	'pass_mot_oublie' => 'Pasvorto forgesita',
597
-	'pass_nouveau_enregistre' => 'Via nova pasvorto estas registrita.',
598
-	'pass_nouveau_pass' => 'Nova pasvorto',
599
-	'pass_ok' => 'JES',
600
-	'pass_oubli_mot' => 'Pasvorto-forgeso',
601
-	'pass_procedure_changer' => 'Por ŝanĝi vian pasvorton, specifu al ni la asociitan retpoŝtadreson el via konto.',
602
-	'pass_quitter_fenetre' => 'Forlasi tiun fenestron',
603
-	'pass_rappel_login' => 'Memoru : via ensalutilo (salutnomo) estas « @login@ ».',
604
-	'pass_recevoir_mail' => 'Vi ricevos retmesaĝon indikantan al vi kiel retrovi vian aliron al la retejo.', # MODIF
605
-	'pass_retour_public' => 'Reen al la publika spaco',
606
-	'pass_rien_a_faire_ici' => 'Nenion por fari ĉi tie.',
607
-	'pass_vousinscrire' => 'Registriĝi ĉe tiu retejo',
608
-	'precedent' => 'antaŭan',
609
-	'previsualisation' => 'Antaŭrigardo',
610
-	'previsualiser' => 'Antaŭrigardi',
596
+    'pass_mot_oublie' => 'Pasvorto forgesita',
597
+    'pass_nouveau_enregistre' => 'Via nova pasvorto estas registrita.',
598
+    'pass_nouveau_pass' => 'Nova pasvorto',
599
+    'pass_ok' => 'JES',
600
+    'pass_oubli_mot' => 'Pasvorto-forgeso',
601
+    'pass_procedure_changer' => 'Por ŝanĝi vian pasvorton, specifu al ni la asociitan retpoŝtadreson el via konto.',
602
+    'pass_quitter_fenetre' => 'Forlasi tiun fenestron',
603
+    'pass_rappel_login' => 'Memoru : via ensalutilo (salutnomo) estas « @login@ ».',
604
+    'pass_recevoir_mail' => 'Vi ricevos retmesaĝon indikantan al vi kiel retrovi vian aliron al la retejo.', # MODIF
605
+    'pass_retour_public' => 'Reen al la publika spaco',
606
+    'pass_rien_a_faire_ici' => 'Nenion por fari ĉi tie.',
607
+    'pass_vousinscrire' => 'Registriĝi ĉe tiu retejo',
608
+    'precedent' => 'antaŭan',
609
+    'previsualisation' => 'Antaŭrigardo',
610
+    'previsualiser' => 'Antaŭrigardi',
611 611
 
612
-	// R
613
-	'retour' => 'Reen',
612
+    // R
613
+    'retour' => 'Reen',
614 614
 
615
-	// S
616
-	'spip_conforme_dtd' => 'SPIP konsideras tiun dokumenton konforma al sia DOCTYPE :',
617
-	'squelette' => 'skeleto',
618
-	'squelette_inclus_ligne' => 'skeleto inkluzivita, linio',
619
-	'squelette_ligne' => 'skeleto, linio',
620
-	'stats_visites_et_popularite' => '@visites@ vizitoj ; populareco : @popularite@',
621
-	'suivant' => 'sekvanta',
615
+    // S
616
+    'spip_conforme_dtd' => 'SPIP konsideras tiun dokumenton konforma al sia DOCTYPE :',
617
+    'squelette' => 'skeleto',
618
+    'squelette_inclus_ligne' => 'skeleto inkluzivita, linio',
619
+    'squelette_ligne' => 'skeleto, linio',
620
+    'stats_visites_et_popularite' => '@visites@ vizitoj ; populareco : @popularite@',
621
+    'suivant' => 'sekvanta',
622 622
 
623
-	// T
624
-	'taille_go' => '@taille@ Go',
625
-	'taille_ko' => '@taille@ kb',
626
-	'taille_mo' => '@taille@ Mb',
627
-	'taille_octets' => '@taille@ bitokoj',
628
-	'taille_octets_bi' => '@taille@ bitokoj',
629
-	'texte_actualite_site_1' => 'Kiam vi estos kutimiĝinta kun la interfaco, vi povos musklaki sur « ',
630
-	'texte_actualite_site_2' => 'kompleta interfaco',
631
-	'texte_actualite_site_3' => ' » por malfermi pliajn eblecojn.',
632
-	'texte_creation_automatique_vignette' => 'La aŭtomata kreado de antaŭrigardaj vinjetoj estas aktivigita ĉe tiu ĉi retejo. Se vi instalas pere de tiu ĉi formularo bildojn je la formato(j) @gd_formats@, ili estos akompanataj de vinjeto kun maksimuma grandeco de @taille_preview@ bilderoj.',
633
-	'texte_documents_associes' => 'La sekvantaj dokumentoj estas asociitaj al la artikolo,
623
+    // T
624
+    'taille_go' => '@taille@ Go',
625
+    'taille_ko' => '@taille@ kb',
626
+    'taille_mo' => '@taille@ Mb',
627
+    'taille_octets' => '@taille@ bitokoj',
628
+    'taille_octets_bi' => '@taille@ bitokoj',
629
+    'texte_actualite_site_1' => 'Kiam vi estos kutimiĝinta kun la interfaco, vi povos musklaki sur « ',
630
+    'texte_actualite_site_2' => 'kompleta interfaco',
631
+    'texte_actualite_site_3' => ' » por malfermi pliajn eblecojn.',
632
+    'texte_creation_automatique_vignette' => 'La aŭtomata kreado de antaŭrigardaj vinjetoj estas aktivigita ĉe tiu ĉi retejo. Se vi instalas pere de tiu ĉi formularo bildojn je la formato(j) @gd_formats@, ili estos akompanataj de vinjeto kun maksimuma grandeco de @taille_preview@ bilderoj.',
633
+    'texte_documents_associes' => 'La sekvantaj dokumentoj estas asociitaj al la artikolo,
634 634
     sed ili ne estis rekte enmetitaj en ĝin.
635 635
     Laŭ la enpaĝigo de la publika spaco,
636 636
     ili povos aperi en formo de alkroĉitaj dokumentoj.',
637
-	'texte_erreur_mise_niveau_base' => 'Datenbazo-eraro dum la alniveligo.
637
+    'texte_erreur_mise_niveau_base' => 'Datenbazo-eraro dum la alniveligo.
638 638
   La bildo <b>@fichier@</b> ne transŝutiĝis (artikolo @id_article@).
639 639
   Bone notu tiun referencon, reprovu la alniveligon,
640 640
   kaj fine kontrolu ke la bildoj plu aperu
641 641
 en la artikoloj.',
642
-	'texte_erreur_visiteur' => 'Vi provis eniri la privatan spacon pere de ne alir-rajtiga salutnomo.',
643
-	'texte_inc_auth_1' => 'Vi ensalutis laŭ la
642
+    'texte_erreur_visiteur' => 'Vi provis eniri la privatan spacon pere de ne alir-rajtiga salutnomo.',
643
+    'texte_inc_auth_1' => 'Vi ensalutis laŭ la
644 644
   salutnomo <b>@auth_login@</b>, sed tiu ne/ne plu ekzistas en la datenbazo.
645 645
   Provu',
646
-	'texte_inc_auth_2' => 'rekonektiĝi',
647
-	'texte_inc_auth_3' => ', post esti eventuale ferminta kaj
646
+    'texte_inc_auth_2' => 'rekonektiĝi',
647
+    'texte_inc_auth_3' => ', post esti eventuale ferminta kaj
648 648
   restartiginta via retumilon.',
649
-	'texte_inc_config' => 'La ŝanĝoj faritaj en tiuj ĉi paĝoj influas grave la
649
+    'texte_inc_config' => 'La ŝanĝoj faritaj en tiuj ĉi paĝoj influas grave la
650 650
  funkciadon de via retejo. Ni konsilas al vi ne plu interveni antaŭ ol esti pli
651 651
  kutimiĝinta pri la funkciado de la SPIP-sistemo. <br /><br /><b>Pli
652 652
  ĝenerale, estas tre konsilinde lasi la mastrumadon de tiuj ĉi paĝoj
653 653
 sub la respondeco de la ĉefa retejestro .</b>',
654
-	'texte_inc_meta_1' => 'La sistemo detektis eraron dum skribado de la dosiero <code>@fichier@</code>. Bonvolu, kiel mastrumanto de la retejo,',
655
-	'texte_inc_meta_2' => 'kontroli la skriborajtojn',
656
-	'texte_inc_meta_3' => 'en la dosierujo <code>@repertoire@</code>.',
657
-	'texte_statut_en_cours_redaction' => 'Redaktataj',
658
-	'texte_statut_poubelle' => 'en rubujo',
659
-	'texte_statut_propose_evaluation' => 'proponita por taksado',
660
-	'texte_statut_publie' => 'rete publikigita',
661
-	'texte_statut_refuse' => 'rifuzita',
662
-	'titre_ajouter_mot_cle' => 'ALDONI ŜLOSILVORTON :',
663
-	'titre_cadre_raccourcis' => 'RAPIDAJ ALIROJ :',
664
-	'titre_changer_couleur_interface' => 'Ŝanĝi la koloron de la interfaco',
665
-	'titre_image_admin_article' => 'Vi povas mastrumi tiun ĉi artikolon',
666
-	'titre_image_administrateur' => 'Mastrumanto',
667
-	'titre_image_aide' => 'Helpo pri tiu elemento',
668
-	'titre_image_auteur_supprime' => 'Aŭtoro forigita',
669
-	'titre_image_redacteur' => 'Redaktanto sen alireblo',
670
-	'titre_image_redacteur_02' => 'Redaktanto',
671
-	'titre_image_selecteur' => 'Montri la liston',
672
-	'titre_image_visiteur' => 'Vizitanto',
673
-	'titre_joindre_document' => 'ALDONI DOKUMENTON',
674
-	'titre_mots_cles' => 'ŜLOSILVORTOJ',
675
-	'titre_probleme_technique' => 'Atentu : teknika problemo  (SQL-servilo) malhelpas la aliron al tiu parto de la retejo. Dankon pro via komprenemo.',
676
-	'titre_publier_document' => 'PUBLIKIGI DOKUMENTON EN TIU ĈI RUBRIKO',
677
-	'titre_signatures_attente' => 'Subskriboj validotaj',
678
-	'titre_signatures_confirmees' => 'Subskriboj konfirmitaj',
679
-	'titre_statistiques' => 'Statistikoj de la retejo',
680
-	'titre_titre_document' => 'Titolo de la dokumento :',
681
-	'todo' => 'venonta',
682
-	'trad_definir_reference' => 'Elekti „@titre@“ kiel referenco de la tradukoj',
683
-	'trad_reference' => '(referenco de la traduktoj)',
654
+    'texte_inc_meta_1' => 'La sistemo detektis eraron dum skribado de la dosiero <code>@fichier@</code>. Bonvolu, kiel mastrumanto de la retejo,',
655
+    'texte_inc_meta_2' => 'kontroli la skriborajtojn',
656
+    'texte_inc_meta_3' => 'en la dosierujo <code>@repertoire@</code>.',
657
+    'texte_statut_en_cours_redaction' => 'Redaktataj',
658
+    'texte_statut_poubelle' => 'en rubujo',
659
+    'texte_statut_propose_evaluation' => 'proponita por taksado',
660
+    'texte_statut_publie' => 'rete publikigita',
661
+    'texte_statut_refuse' => 'rifuzita',
662
+    'titre_ajouter_mot_cle' => 'ALDONI ŜLOSILVORTON :',
663
+    'titre_cadre_raccourcis' => 'RAPIDAJ ALIROJ :',
664
+    'titre_changer_couleur_interface' => 'Ŝanĝi la koloron de la interfaco',
665
+    'titre_image_admin_article' => 'Vi povas mastrumi tiun ĉi artikolon',
666
+    'titre_image_administrateur' => 'Mastrumanto',
667
+    'titre_image_aide' => 'Helpo pri tiu elemento',
668
+    'titre_image_auteur_supprime' => 'Aŭtoro forigita',
669
+    'titre_image_redacteur' => 'Redaktanto sen alireblo',
670
+    'titre_image_redacteur_02' => 'Redaktanto',
671
+    'titre_image_selecteur' => 'Montri la liston',
672
+    'titre_image_visiteur' => 'Vizitanto',
673
+    'titre_joindre_document' => 'ALDONI DOKUMENTON',
674
+    'titre_mots_cles' => 'ŜLOSILVORTOJ',
675
+    'titre_probleme_technique' => 'Atentu : teknika problemo  (SQL-servilo) malhelpas la aliron al tiu parto de la retejo. Dankon pro via komprenemo.',
676
+    'titre_publier_document' => 'PUBLIKIGI DOKUMENTON EN TIU ĈI RUBRIKO',
677
+    'titre_signatures_attente' => 'Subskriboj validotaj',
678
+    'titre_signatures_confirmees' => 'Subskriboj konfirmitaj',
679
+    'titre_statistiques' => 'Statistikoj de la retejo',
680
+    'titre_titre_document' => 'Titolo de la dokumento :',
681
+    'todo' => 'venonta',
682
+    'trad_definir_reference' => 'Elekti „@titre@“ kiel referenco de la tradukoj',
683
+    'trad_reference' => '(referenco de la traduktoj)',
684 684
 
685
-	// U
686
-	'upload_limit' => 'Tiu dosiero estas tro granda por la servilo : la maksimuma dosiergrando, kiam oni alŝutas, estas @max@.',
685
+    // U
686
+    'upload_limit' => 'Tiu dosiero estas tro granda por la servilo : la maksimuma dosiergrando, kiam oni alŝutas, estas @max@.',
687 687
 
688
-	// Z
689
-	'zbug_balise_b_aval' => ' : posta B marko',
690
-	'zbug_balise_inexistante' => 'Marko @balise@ malbone deklarita por @from@',
691
-	'zbug_balise_sans_argument' => 'Mankas argumento en la marko @balise@',
692
-	'zbug_boucle' => 'iteracio',
693
-	'zbug_boucle_recursive_undef' => 'Nedifinita rekursia iteracio : @nom@',
694
-	'zbug_calcul' => 'komputado',
695
-	'zbug_champ_hors_boucle' => 'Kampo @champ@ eksteras iteracion',
696
-	'zbug_champ_hors_motif' => 'Kampo @champ@ eksteras kontekston @motif@',
697
-	'zbug_code' => 'kodo',
698
-	'zbug_critere_inconnu' => 'Nekonata kriterio @critere@',
699
-	'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} pri tabelo sen atoma ĉefŝlosilo',
700
-	'zbug_distant_interdit' => 'Ago ĉe tiu ekstera datenbazo malpermesata',
701
-	'zbug_doublon_table_sans_cle_primaire' => 'Duobloj uzitaj ĉe tabelo, kiu ne havas simplan ĉefŝlosilon',
702
-	'zbug_doublon_table_sans_index' => 'Duoblaĵoj en la datentabelo sen indekso',
703
-	'zbug_erreur_boucle_double' => 'Duobla difino de la interacio @id@',
704
-	'zbug_erreur_boucle_fermant' => 'Iteracio @id@ ne fermita',
705
-	'zbug_erreur_boucle_syntaxe' => 'Sintakso de la iteracia @id@ ne valida',
706
-	'zbug_erreur_compilation' => 'Kompil-eraro',
707
-	'zbug_erreur_execution_page' => 'Eraro dum plenumo',
708
-	'zbug_erreur_filtre' => 'Filtrilo @filtre@ nedifinita',
709
-	'zbug_erreur_meme_parent' => 'La kriterio {meme_parent} nur aplikiĝas je iteracioj (FORUMS) aŭ (RUBRIQUES)',
710
-	'zbug_erreur_squelette' => 'Eraro(j) en la skeleto',
711
-	'zbug_hors_compilation' => 'Ne kompilita',
712
-	'zbug_info_erreur_squelette' => 'Eraro ĉe la retejo',
713
-	'zbug_inversion_ordre_inexistant' => 'Inversigo de ne ekzistanta ordo',
714
-	'zbug_pagination_sans_critere' => 'Marko #PAGINATION senkriteria {pagination} aŭ uzata en rekursia iteracio',
715
-	'zbug_parametres_inclus_incorrects' => 'Ne korektaj inkludaj parametroj : @param@',
716
-	'zbug_profile' => 'Kalkuldaŭro : @time@',
717
-	'zbug_resultat' => 'rezulto',
718
-	'zbug_serveur_indefini' => 'Nedifinata SQL-servilo',
719
-	'zbug_statistiques' => 'statistikoj pri SQL-informpetoj ordigitaj laŭ daŭro',
720
-	'zbug_table_inconnue' => 'nekonata SQL « @table@ » tabelo',
721
-	'zxml_connus_attributs' => 'konataj atributoj',
722
-	'zxml_de' => 'de',
723
-	'zxml_inconnu_attribut' => 'nekonataj atributoj',
724
-	'zxml_inconnu_balise' => 'ne konita marko',
725
-	'zxml_inconnu_entite' => 'ne konata ento',
726
-	'zxml_inconnu_id' => 'ne konata ID',
727
-	'zxml_mais_de' => 'sed',
728
-	'zxml_non_conforme' => 'ne kongrua kun la motivo',
729
-	'zxml_non_fils' => 'ne estas filo de',
730
-	'zxml_nonvide_balise' => 'ne malplena marko',
731
-	'zxml_obligatoire_attribut' => 'deviga atributo sed foresta en',
732
-	'zxml_succession_fils_incorrecte' => 'sinsekvo de filoj korekta',
733
-	'zxml_survoler' => 'superflugi por ekvidi korektaĵojn',
734
-	'zxml_valeur_attribut' => 'atributa valoro',
735
-	'zxml_vide_balise' => 'malplena marko',
736
-	'zxml_vu' => 'antaŭe vidita'
688
+    // Z
689
+    'zbug_balise_b_aval' => ' : posta B marko',
690
+    'zbug_balise_inexistante' => 'Marko @balise@ malbone deklarita por @from@',
691
+    'zbug_balise_sans_argument' => 'Mankas argumento en la marko @balise@',
692
+    'zbug_boucle' => 'iteracio',
693
+    'zbug_boucle_recursive_undef' => 'Nedifinita rekursia iteracio : @nom@',
694
+    'zbug_calcul' => 'komputado',
695
+    'zbug_champ_hors_boucle' => 'Kampo @champ@ eksteras iteracion',
696
+    'zbug_champ_hors_motif' => 'Kampo @champ@ eksteras kontekston @motif@',
697
+    'zbug_code' => 'kodo',
698
+    'zbug_critere_inconnu' => 'Nekonata kriterio @critere@',
699
+    'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} pri tabelo sen atoma ĉefŝlosilo',
700
+    'zbug_distant_interdit' => 'Ago ĉe tiu ekstera datenbazo malpermesata',
701
+    'zbug_doublon_table_sans_cle_primaire' => 'Duobloj uzitaj ĉe tabelo, kiu ne havas simplan ĉefŝlosilon',
702
+    'zbug_doublon_table_sans_index' => 'Duoblaĵoj en la datentabelo sen indekso',
703
+    'zbug_erreur_boucle_double' => 'Duobla difino de la interacio @id@',
704
+    'zbug_erreur_boucle_fermant' => 'Iteracio @id@ ne fermita',
705
+    'zbug_erreur_boucle_syntaxe' => 'Sintakso de la iteracia @id@ ne valida',
706
+    'zbug_erreur_compilation' => 'Kompil-eraro',
707
+    'zbug_erreur_execution_page' => 'Eraro dum plenumo',
708
+    'zbug_erreur_filtre' => 'Filtrilo @filtre@ nedifinita',
709
+    'zbug_erreur_meme_parent' => 'La kriterio {meme_parent} nur aplikiĝas je iteracioj (FORUMS) aŭ (RUBRIQUES)',
710
+    'zbug_erreur_squelette' => 'Eraro(j) en la skeleto',
711
+    'zbug_hors_compilation' => 'Ne kompilita',
712
+    'zbug_info_erreur_squelette' => 'Eraro ĉe la retejo',
713
+    'zbug_inversion_ordre_inexistant' => 'Inversigo de ne ekzistanta ordo',
714
+    'zbug_pagination_sans_critere' => 'Marko #PAGINATION senkriteria {pagination} aŭ uzata en rekursia iteracio',
715
+    'zbug_parametres_inclus_incorrects' => 'Ne korektaj inkludaj parametroj : @param@',
716
+    'zbug_profile' => 'Kalkuldaŭro : @time@',
717
+    'zbug_resultat' => 'rezulto',
718
+    'zbug_serveur_indefini' => 'Nedifinata SQL-servilo',
719
+    'zbug_statistiques' => 'statistikoj pri SQL-informpetoj ordigitaj laŭ daŭro',
720
+    'zbug_table_inconnue' => 'nekonata SQL « @table@ » tabelo',
721
+    'zxml_connus_attributs' => 'konataj atributoj',
722
+    'zxml_de' => 'de',
723
+    'zxml_inconnu_attribut' => 'nekonataj atributoj',
724
+    'zxml_inconnu_balise' => 'ne konita marko',
725
+    'zxml_inconnu_entite' => 'ne konata ento',
726
+    'zxml_inconnu_id' => 'ne konata ID',
727
+    'zxml_mais_de' => 'sed',
728
+    'zxml_non_conforme' => 'ne kongrua kun la motivo',
729
+    'zxml_non_fils' => 'ne estas filo de',
730
+    'zxml_nonvide_balise' => 'ne malplena marko',
731
+    'zxml_obligatoire_attribut' => 'deviga atributo sed foresta en',
732
+    'zxml_succession_fils_incorrecte' => 'sinsekvo de filoj korekta',
733
+    'zxml_survoler' => 'superflugi por ekvidi korektaĵojn',
734
+    'zxml_valeur_attribut' => 'atributa valoro',
735
+    'zxml_vide_balise' => 'malplena marko',
736
+    'zxml_vu' => 'antaŭe vidita'
737 737
 );
Please login to merge, or discard this patch.
ecrire/lang/spip_tr.php 1 patch
Indentation   +587 added lines, -587 removed lines patch added patch discarded remove patch
@@ -4,510 +4,510 @@  discard block
 block discarded – undo
4 4
 // ** ne pas modifier le fichier **
5 5
 
6 6
 if (!defined('_ECRIRE_INC_VERSION')) {
7
-	return;
7
+    return;
8 8
 }
9 9
 
10 10
 $GLOBALS[$GLOBALS['idx_lang']] = array(
11 11
 
12
-	// A
13
-	'access_interface_graphique' => 'Tam grafik arayüze geri dön',
14
-	'access_mode_texte' => 'Basitleştirilmiş metin arayüzünü göster',
15
-	'admin_debug' => 'hata ayıkla',
16
-	'admin_modifier_article' => 'Bu makaleyi değiştir',
17
-	'admin_modifier_auteur' => 'Bu yazarı değiştir',
18
-	'admin_modifier_breve' => 'Bu kısa haberi değiştir',
19
-	'admin_modifier_mot' => 'Bu anahtar sözcüğü değiştir',
20
-	'admin_modifier_rubrique' => 'Bu bölümü değiştir',
21
-	'admin_recalculer' => 'Bu sayfayı yeniden oluştur',
22
-	'afficher_trad' => 'çevirileri listele',
23
-	'alerte_maj_impossible' => '<b>Dikkat !</b> SQL veri tabanının @version@ sürümüne güncellenmesi imkansız. Sorun veritabanı değiştirme haklarından kaynaklanıyor olabilir, lütfen sitenizi barındıran şirkete başvurunuz.',
24
-	'alerte_modif_info_concourante' => 'DİKKAT: Bu bilgi başka bir yerde değiştirildi. Güncel değer :',
25
-	'analyse_xml' => 'XML analizi',
26
-	'annuler' => 'İptal et',
27
-	'antispam_champ_vide' => 'Lütfen bu alanı boş bırakınız :',
28
-	'articles_recents' => 'En yeni makaleler',
29
-	'avis_archive_incorrect' => 'arşiv dosyası SPIP dosyası değil',
30
-	'avis_archive_invalide' => 'bu arşiv dosyası geçerli değil',
31
-	'avis_attention' => 'DİKKAT !',
32
-	'avis_champ_incorrect_type_objet' => '@type@ tipindeki nesne için @name@ ismi geçersiz',
33
-	'avis_colonne_inexistante' => '@col@ isimli sütun yok',
34
-	'avis_erreur' => 'Hata: aşağıdaki açıklamaya bakınız',
35
-	'avis_erreur_connexion' => 'Bağlantı hatası',
36
-	'avis_erreur_cookie' => 'çerez sorunu',
37
-	'avis_erreur_fonction_contexte' => 'Yazılım hatası. Bu işlev bu biçimde kullanılmamalı.',
38
-	'avis_erreur_mysql' => 'SQL hatası',
39
-	'avis_erreur_sauvegarde' => 'Yedeklemede hata (@type@ @id_objet@) !',
40
-	'avis_erreur_visiteur' => 'Özel alana erişim sorunu',
12
+    // A
13
+    'access_interface_graphique' => 'Tam grafik arayüze geri dön',
14
+    'access_mode_texte' => 'Basitleştirilmiş metin arayüzünü göster',
15
+    'admin_debug' => 'hata ayıkla',
16
+    'admin_modifier_article' => 'Bu makaleyi değiştir',
17
+    'admin_modifier_auteur' => 'Bu yazarı değiştir',
18
+    'admin_modifier_breve' => 'Bu kısa haberi değiştir',
19
+    'admin_modifier_mot' => 'Bu anahtar sözcüğü değiştir',
20
+    'admin_modifier_rubrique' => 'Bu bölümü değiştir',
21
+    'admin_recalculer' => 'Bu sayfayı yeniden oluştur',
22
+    'afficher_trad' => 'çevirileri listele',
23
+    'alerte_maj_impossible' => '<b>Dikkat !</b> SQL veri tabanının @version@ sürümüne güncellenmesi imkansız. Sorun veritabanı değiştirme haklarından kaynaklanıyor olabilir, lütfen sitenizi barındıran şirkete başvurunuz.',
24
+    'alerte_modif_info_concourante' => 'DİKKAT: Bu bilgi başka bir yerde değiştirildi. Güncel değer :',
25
+    'analyse_xml' => 'XML analizi',
26
+    'annuler' => 'İptal et',
27
+    'antispam_champ_vide' => 'Lütfen bu alanı boş bırakınız :',
28
+    'articles_recents' => 'En yeni makaleler',
29
+    'avis_archive_incorrect' => 'arşiv dosyası SPIP dosyası değil',
30
+    'avis_archive_invalide' => 'bu arşiv dosyası geçerli değil',
31
+    'avis_attention' => 'DİKKAT !',
32
+    'avis_champ_incorrect_type_objet' => '@type@ tipindeki nesne için @name@ ismi geçersiz',
33
+    'avis_colonne_inexistante' => '@col@ isimli sütun yok',
34
+    'avis_erreur' => 'Hata: aşağıdaki açıklamaya bakınız',
35
+    'avis_erreur_connexion' => 'Bağlantı hatası',
36
+    'avis_erreur_cookie' => 'çerez sorunu',
37
+    'avis_erreur_fonction_contexte' => 'Yazılım hatası. Bu işlev bu biçimde kullanılmamalı.',
38
+    'avis_erreur_mysql' => 'SQL hatası',
39
+    'avis_erreur_sauvegarde' => 'Yedeklemede hata (@type@ @id_objet@) !',
40
+    'avis_erreur_visiteur' => 'Özel alana erişim sorunu',
41 41
 
42
-	// B
43
-	'barre_a_accent_grave' => 'A harfinin üstüne aksan ekle (Türkçede anlamsız)',
44
-	'barre_aide' => 'Sayfa düzenini zenginleştirmek için tipografik kısayolları kullanınız',
45
-	'barre_e_accent_aigu' => 'E harfinin üstüne aksan ekle (Türkçe’de anlamsız)',
46
-	'barre_eo' => 'Türkçe’de anlamsız',
47
-	'barre_eo_maj' => 'Türkçe’de anlamsız',
48
-	'barre_euro' => '€ işaretini girin',
49
-	'barre_gras' => '{{Kalın}} yaz',
50
-	'barre_guillemets' => '« Tırnak » içine al',
51
-	'barre_guillemets_simples' => '“İkinci biçimde tırnak” içine al',
52
-	'barre_intertitre' => '{{{Arabaşlık’a}}} dönüştür',
53
-	'barre_italic' => '{Yana yatık (italik)} yaz',
54
-	'barre_lien' => '[Hipermetin bağlantısına->http://...] dönüştür',
55
-	'barre_lien_input' => 'Lütfen bağlantınızın adresini girin (adresi http://www.adresim.com veya bu sitede bulunan bir metnin numarası şeklinde girebilirsiniz).',
56
-	'barre_note' => '[[Sayfa sonu notuna]] dönüştür',
57
-	'barre_paragraphe' => 'Bir paragraf oluştur',
58
-	'barre_quote' => '<quote>Bir iletiden alıntı yap</quote>',
59
-	'bouton_changer' => 'Değiştir',
60
-	'bouton_chercher' => 'Ara',
61
-	'bouton_choisir' => 'Seç',
62
-	'bouton_download' => 'İndir', # MODIF
63
-	'bouton_enregistrer' => 'Kaydet',
64
-	'bouton_radio_desactiver_messagerie_interne' => 'İç iletileri kapat',
65
-	'bouton_radio_envoi_annonces' => 'Yazar duyurularını yolla',
66
-	'bouton_radio_non_envoi_annonces' => 'Duyuruları yollama',
67
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Yenilikler listesini gönderme',
68
-	'bouton_recharger_page' => 'bu sayfayı yeniden yükle',
69
-	'bouton_telecharger' => 'İndir',
70
-	'bouton_upload' => 'İndir', # MODIF
71
-	'bouton_valider' => 'Onayla',
42
+    // B
43
+    'barre_a_accent_grave' => 'A harfinin üstüne aksan ekle (Türkçede anlamsız)',
44
+    'barre_aide' => 'Sayfa düzenini zenginleştirmek için tipografik kısayolları kullanınız',
45
+    'barre_e_accent_aigu' => 'E harfinin üstüne aksan ekle (Türkçe’de anlamsız)',
46
+    'barre_eo' => 'Türkçe’de anlamsız',
47
+    'barre_eo_maj' => 'Türkçe’de anlamsız',
48
+    'barre_euro' => '€ işaretini girin',
49
+    'barre_gras' => '{{Kalın}} yaz',
50
+    'barre_guillemets' => '« Tırnak » içine al',
51
+    'barre_guillemets_simples' => '“İkinci biçimde tırnak” içine al',
52
+    'barre_intertitre' => '{{{Arabaşlık’a}}} dönüştür',
53
+    'barre_italic' => '{Yana yatık (italik)} yaz',
54
+    'barre_lien' => '[Hipermetin bağlantısına->http://...] dönüştür',
55
+    'barre_lien_input' => 'Lütfen bağlantınızın adresini girin (adresi http://www.adresim.com veya bu sitede bulunan bir metnin numarası şeklinde girebilirsiniz).',
56
+    'barre_note' => '[[Sayfa sonu notuna]] dönüştür',
57
+    'barre_paragraphe' => 'Bir paragraf oluştur',
58
+    'barre_quote' => '<quote>Bir iletiden alıntı yap</quote>',
59
+    'bouton_changer' => 'Değiştir',
60
+    'bouton_chercher' => 'Ara',
61
+    'bouton_choisir' => 'Seç',
62
+    'bouton_download' => 'İndir', # MODIF
63
+    'bouton_enregistrer' => 'Kaydet',
64
+    'bouton_radio_desactiver_messagerie_interne' => 'İç iletileri kapat',
65
+    'bouton_radio_envoi_annonces' => 'Yazar duyurularını yolla',
66
+    'bouton_radio_non_envoi_annonces' => 'Duyuruları yollama',
67
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Yenilikler listesini gönderme',
68
+    'bouton_recharger_page' => 'bu sayfayı yeniden yükle',
69
+    'bouton_telecharger' => 'İndir',
70
+    'bouton_upload' => 'İndir', # MODIF
71
+    'bouton_valider' => 'Onayla',
72 72
 
73
-	// C
74
-	'cal_apresmidi' => 'öğleden sonra',
75
-	'cal_jour_entier' => 'tam gün',
76
-	'cal_matin' => 'sabah',
77
-	'cal_par_jour' => 'günlük takvim',
78
-	'cal_par_mois' => 'aylık takvim',
79
-	'cal_par_semaine' => 'haftalık takvim',
80
-	'choix_couleur_interface' => 'renk',
81
-	'choix_interface' => 'arayüz seçimi',
82
-	'colonne' => 'Sütun',
83
-	'confirm_changer_statut' => 'Dikkat, bu elemanın durumunu değiştirmek istediniz. Devam etmek istiyor musunuz ?',
84
-	'correcte' => 'doğru',
73
+    // C
74
+    'cal_apresmidi' => 'öğleden sonra',
75
+    'cal_jour_entier' => 'tam gün',
76
+    'cal_matin' => 'sabah',
77
+    'cal_par_jour' => 'günlük takvim',
78
+    'cal_par_mois' => 'aylık takvim',
79
+    'cal_par_semaine' => 'haftalık takvim',
80
+    'choix_couleur_interface' => 'renk',
81
+    'choix_interface' => 'arayüz seçimi',
82
+    'colonne' => 'Sütun',
83
+    'confirm_changer_statut' => 'Dikkat, bu elemanın durumunu değiştirmek istediniz. Devam etmek istiyor musunuz ?',
84
+    'correcte' => 'doğru',
85 85
 
86
-	// D
87
-	'date_aujourdhui' => 'bugün',
88
-	'date_avant_jc' => 'İ.Ö.',
89
-	'date_dans' => ' @delai@ içinde',
90
-	'date_de_mois_1' => '@j@ @nommois@',
91
-	'date_de_mois_10' => '@j@ @nommois@',
92
-	'date_de_mois_11' => '@j@ @nommois@',
93
-	'date_de_mois_12' => '@j@ @nommois@',
94
-	'date_de_mois_2' => '@j@ @nommois@',
95
-	'date_de_mois_3' => '@j@ @nommois@',
96
-	'date_de_mois_4' => '@j@ @nommois@',
97
-	'date_de_mois_5' => '@j@ @nommois@',
98
-	'date_de_mois_6' => '@j@ @nommois@',
99
-	'date_de_mois_7' => '@j@ @nommois@',
100
-	'date_de_mois_8' => '@j@ @nommois@',
101
-	'date_de_mois_9' => '@j@ @nommois@',
102
-	'date_demain' => 'yarın',
103
-	'date_fmt_heures_minutes' => '@h@h@m@min',
104
-	'date_fmt_jour_heure' => '@jour@ @heure@',
105
-	'date_fmt_jour_mois' => '@jour@ @nommois@',
106
-	'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
107
-	'date_fmt_mois_annee' => '@nommois@ @annee@',
108
-	'date_fmt_nomjour_date' => '@date@ @nomjour@',
109
-	'date_heures' => 'saat ',
110
-	'date_hier' => 'dün',
111
-	'date_il_y_a' => '@delai@ önce',
112
-	'date_jnum1' => '1.',
113
-	'date_jnum10' => '10',
114
-	'date_jnum11' => '11',
115
-	'date_jnum12' => '12',
116
-	'date_jnum13' => '13',
117
-	'date_jnum14' => '14',
118
-	'date_jnum15' => '15',
119
-	'date_jnum16' => '16',
120
-	'date_jnum17' => '17',
121
-	'date_jnum18' => '18',
122
-	'date_jnum19' => '19',
123
-	'date_jnum2' => '2',
124
-	'date_jnum20' => '20',
125
-	'date_jnum21' => '21',
126
-	'date_jnum22' => '22',
127
-	'date_jnum23' => '23',
128
-	'date_jnum24' => '24',
129
-	'date_jnum25' => '25',
130
-	'date_jnum26' => '26',
131
-	'date_jnum27' => '27',
132
-	'date_jnum28' => '28',
133
-	'date_jnum29' => '29',
134
-	'date_jnum3' => '3',
135
-	'date_jnum30' => '30',
136
-	'date_jnum31' => '31',
137
-	'date_jnum4' => '4',
138
-	'date_jnum5' => '5',
139
-	'date_jnum6' => '6',
140
-	'date_jnum7' => '7',
141
-	'date_jnum8' => '8',
142
-	'date_jnum9' => '9',
143
-	'date_jour_1' => 'Pazar',
144
-	'date_jour_1_abbr' => 'Pzr.',
145
-	'date_jour_1_initiale' => 'g.',
146
-	'date_jour_2' => 'Pazartesi',
147
-	'date_jour_2_abbr' => 'Ptesi.',
148
-	'date_jour_2_initiale' => 'P.',
149
-	'date_jour_3' => 'Salı',
150
-	'date_jour_3_abbr' => 'Salı',
151
-	'date_jour_3_initiale' => 'S.',
152
-	'date_jour_4' => 'Çarşamba',
153
-	'date_jour_4_abbr' => 'Çarş.',
154
-	'date_jour_4_initiale' => 'Ç.',
155
-	'date_jour_5' => 'Perşembe',
156
-	'date_jour_5_abbr' => 'Perş.',
157
-	'date_jour_5_initiale' => 'P.',
158
-	'date_jour_6' => 'Cuma',
159
-	'date_jour_6_abbr' => 'Cuma',
160
-	'date_jour_6_initiale' => 'C.',
161
-	'date_jour_7' => 'Cumartesi',
162
-	'date_jour_7_abbr' => 'Ctesi',
163
-	'date_jour_7_initiale' => 'Ct.',
164
-	'date_jours' => 'gün',
165
-	'date_minutes' => 'dakika',
166
-	'date_mois' => 'ay',
167
-	'date_mois_1' => 'Ocak',
168
-	'date_mois_10' => 'Ekim',
169
-	'date_mois_11' => 'Kasım',
170
-	'date_mois_12' => 'Aralık',
171
-	'date_mois_2' => 'Şubat',
172
-	'date_mois_3' => 'Mart',
173
-	'date_mois_4' => 'Nisan',
174
-	'date_mois_5' => 'Mayıs',
175
-	'date_mois_6' => 'Haziran',
176
-	'date_mois_7' => 'Temmuz',
177
-	'date_mois_8' => 'Ağustos',
178
-	'date_mois_9' => 'Eylül',
179
-	'date_saison_1' => 'kış',
180
-	'date_saison_2' => 'ilkbahar',
181
-	'date_saison_3' => 'yaz',
182
-	'date_saison_4' => 'sonbahar',
183
-	'date_semaines' => 'hafta',
184
-	'dirs_commencer' => ' yüklemeye gerçekten başlamak için',
185
-	'dirs_preliminaire' => 'Ön bilgi : <b>Erişim haklarını ayarlayınız</b>',
186
-	'dirs_probleme_droits' => 'Erişim hakları sorunu ',
187
-	'dirs_repertoires_absents' => '<p><b>Şu dizinler bulunamadı : </b></p><ul>@bad_dirs@</ul> </b>
86
+    // D
87
+    'date_aujourdhui' => 'bugün',
88
+    'date_avant_jc' => 'İ.Ö.',
89
+    'date_dans' => ' @delai@ içinde',
90
+    'date_de_mois_1' => '@j@ @nommois@',
91
+    'date_de_mois_10' => '@j@ @nommois@',
92
+    'date_de_mois_11' => '@j@ @nommois@',
93
+    'date_de_mois_12' => '@j@ @nommois@',
94
+    'date_de_mois_2' => '@j@ @nommois@',
95
+    'date_de_mois_3' => '@j@ @nommois@',
96
+    'date_de_mois_4' => '@j@ @nommois@',
97
+    'date_de_mois_5' => '@j@ @nommois@',
98
+    'date_de_mois_6' => '@j@ @nommois@',
99
+    'date_de_mois_7' => '@j@ @nommois@',
100
+    'date_de_mois_8' => '@j@ @nommois@',
101
+    'date_de_mois_9' => '@j@ @nommois@',
102
+    'date_demain' => 'yarın',
103
+    'date_fmt_heures_minutes' => '@h@h@m@min',
104
+    'date_fmt_jour_heure' => '@jour@ @heure@',
105
+    'date_fmt_jour_mois' => '@jour@ @nommois@',
106
+    'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
107
+    'date_fmt_mois_annee' => '@nommois@ @annee@',
108
+    'date_fmt_nomjour_date' => '@date@ @nomjour@',
109
+    'date_heures' => 'saat ',
110
+    'date_hier' => 'dün',
111
+    'date_il_y_a' => '@delai@ önce',
112
+    'date_jnum1' => '1.',
113
+    'date_jnum10' => '10',
114
+    'date_jnum11' => '11',
115
+    'date_jnum12' => '12',
116
+    'date_jnum13' => '13',
117
+    'date_jnum14' => '14',
118
+    'date_jnum15' => '15',
119
+    'date_jnum16' => '16',
120
+    'date_jnum17' => '17',
121
+    'date_jnum18' => '18',
122
+    'date_jnum19' => '19',
123
+    'date_jnum2' => '2',
124
+    'date_jnum20' => '20',
125
+    'date_jnum21' => '21',
126
+    'date_jnum22' => '22',
127
+    'date_jnum23' => '23',
128
+    'date_jnum24' => '24',
129
+    'date_jnum25' => '25',
130
+    'date_jnum26' => '26',
131
+    'date_jnum27' => '27',
132
+    'date_jnum28' => '28',
133
+    'date_jnum29' => '29',
134
+    'date_jnum3' => '3',
135
+    'date_jnum30' => '30',
136
+    'date_jnum31' => '31',
137
+    'date_jnum4' => '4',
138
+    'date_jnum5' => '5',
139
+    'date_jnum6' => '6',
140
+    'date_jnum7' => '7',
141
+    'date_jnum8' => '8',
142
+    'date_jnum9' => '9',
143
+    'date_jour_1' => 'Pazar',
144
+    'date_jour_1_abbr' => 'Pzr.',
145
+    'date_jour_1_initiale' => 'g.',
146
+    'date_jour_2' => 'Pazartesi',
147
+    'date_jour_2_abbr' => 'Ptesi.',
148
+    'date_jour_2_initiale' => 'P.',
149
+    'date_jour_3' => 'Salı',
150
+    'date_jour_3_abbr' => 'Salı',
151
+    'date_jour_3_initiale' => 'S.',
152
+    'date_jour_4' => 'Çarşamba',
153
+    'date_jour_4_abbr' => 'Çarş.',
154
+    'date_jour_4_initiale' => 'Ç.',
155
+    'date_jour_5' => 'Perşembe',
156
+    'date_jour_5_abbr' => 'Perş.',
157
+    'date_jour_5_initiale' => 'P.',
158
+    'date_jour_6' => 'Cuma',
159
+    'date_jour_6_abbr' => 'Cuma',
160
+    'date_jour_6_initiale' => 'C.',
161
+    'date_jour_7' => 'Cumartesi',
162
+    'date_jour_7_abbr' => 'Ctesi',
163
+    'date_jour_7_initiale' => 'Ct.',
164
+    'date_jours' => 'gün',
165
+    'date_minutes' => 'dakika',
166
+    'date_mois' => 'ay',
167
+    'date_mois_1' => 'Ocak',
168
+    'date_mois_10' => 'Ekim',
169
+    'date_mois_11' => 'Kasım',
170
+    'date_mois_12' => 'Aralık',
171
+    'date_mois_2' => 'Şubat',
172
+    'date_mois_3' => 'Mart',
173
+    'date_mois_4' => 'Nisan',
174
+    'date_mois_5' => 'Mayıs',
175
+    'date_mois_6' => 'Haziran',
176
+    'date_mois_7' => 'Temmuz',
177
+    'date_mois_8' => 'Ağustos',
178
+    'date_mois_9' => 'Eylül',
179
+    'date_saison_1' => 'kış',
180
+    'date_saison_2' => 'ilkbahar',
181
+    'date_saison_3' => 'yaz',
182
+    'date_saison_4' => 'sonbahar',
183
+    'date_semaines' => 'hafta',
184
+    'dirs_commencer' => ' yüklemeye gerçekten başlamak için',
185
+    'dirs_preliminaire' => 'Ön bilgi : <b>Erişim haklarını ayarlayınız</b>',
186
+    'dirs_probleme_droits' => 'Erişim hakları sorunu ',
187
+    'dirs_repertoires_absents' => '<p><b>Şu dizinler bulunamadı : </b></p><ul>@bad_dirs@</ul> </b>
188 188
   <p>Büyük küçük harf hatasına bağlı olabilir.
189 189
   Dizinlerin küçük büyük harflerle yazılışlarının yukarıda gösterilenlerle uyuştuğunu kontrol edin;  eğer uyuşmuyorsa FTP programınızla dizin isimlerini düzeltin.</p>
190 190
   <p>Bu işlemi yaptığınızda ',
191
-	'dirs_repertoires_suivants' => '<p><b>Aşağıdaki dizinlere yazma izni yoktur : </b></p><ul>@bad_dirs@.</ul> 
191
+    'dirs_repertoires_suivants' => '<p><b>Aşağıdaki dizinlere yazma izni yoktur : </b></p><ul>@bad_dirs@.</ul> 
192 192
   <p>Bu sorunu çözmek için FTP programınızla her bir dizine erişim haklarını düzenleyin. Bu yordam, kurulum kitapçığında detaylı biçimde açıklanmıştır./p> 
193 193
   <p>Bu işlemi yaptığınızda ',
194
-	'double_occurrence' => 'Çift tekrar ', # MODIF
194
+    'double_occurrence' => 'Çift tekrar ', # MODIF
195 195
 
196
-	// E
197
-	'en_cours' => 'işlenmekte',
198
-	'envoi_via_le_site' => 'Site üzerinden gönder',
199
-	'erreur' => 'Hata',
200
-	'erreur_balise_non_fermee' => 'son etiket kapatılmamış :',
201
-	'erreur_texte' => 'hata(lar)',
202
-	'etape' => 'Aşama',
196
+    // E
197
+    'en_cours' => 'işlenmekte',
198
+    'envoi_via_le_site' => 'Site üzerinden gönder',
199
+    'erreur' => 'Hata',
200
+    'erreur_balise_non_fermee' => 'son etiket kapatılmamış :',
201
+    'erreur_texte' => 'hata(lar)',
202
+    'etape' => 'Aşama',
203 203
 
204
-	// F
205
-	'fichier_introuvable' => '@fichier@ dosyası bulunamadı', # MODIF
206
-	'form_deja_inscrit' => 'Zaten kayıtlısınız.',
207
-	'form_email_non_valide' => 'E-posta adresiniz geçersiz.',
208
-	'form_forum_access_refuse' => 'Artık bu siteye erişim izniniz yok.',
209
-	'form_forum_bonjour' => 'Merhaba @nom@,',
210
-	'form_forum_email_deja_enregistre' => 'Bu e-posta adresi zaten kayıtlı, kullanmakta olduğunuz şifrenizi kullanmaya devam edebilirsiniz.',
211
-	'form_forum_identifiant_mail' => 'Yeni tanımlayıcınız e-posta yoluyla gönderildi.',
212
-	'form_forum_identifiants' => 'Kişisel tanımlayıcılar',
213
-	'form_forum_indiquer_nom_email' => 'Buraya isminizi ve e-posta adresinizi giriniz. Yeni tanımlayıcınız size bir e-posta ile hemen gönderilecektir.',
214
-	'form_forum_login' => 'kullanıcı ismi :',
215
-	'form_forum_message_auto' => '(bu otomatik bir iletidir)',
216
-	'form_forum_pass' => 'şifre :',
217
-	'form_forum_probleme_mail' => 'E-posta sorunu : tanımlayıcı gönderilemiyor.',
218
-	'form_forum_voici1' => '"@nom_site_spip@" (@adresse_site@) site yaşamına katılabilmek için tanımlayıcılarınız :',
219
-	'form_forum_voici2' => '"@nom_site_spip@" (@adresse_login@) sitesinde makale yayınlayabilmeniz için gereken kimlik bilgileriniz :',
220
-	'form_indiquer_email' => 'Lütfen e-posta adresinizi belirtiniz.',
221
-	'form_indiquer_nom' => 'Lütfen isminizi belirtiniz.',
222
-	'form_indiquer_nom_site' => 'Lütfen sitenizin ismini belirtiniz.',
223
-	'form_pet_deja_enregistre' => 'Bu site zaten kayıtlı',
224
-	'form_pet_signature_pasprise' => 'İmzanız dikkate alınmadı.',
225
-	'form_prop_confirmer_envoi' => 'Gönderiyi onayla',
226
-	'form_prop_description' => 'Tanım / Yorum',
227
-	'form_prop_enregistre' => 'Öneriniz kaydedildi, sitenin sorumluları tarafından onaylandıktan sonra çevrimiçi yayınlanacak.',
228
-	'form_prop_envoyer' => 'Bir ileti gönder',
229
-	'form_prop_indiquer_email' => 'Lütfen geçerli bir e-posta adresi belirtiniz',
230
-	'form_prop_indiquer_nom_site' => 'Sitenin ismini giriniz.',
231
-	'form_prop_indiquer_sujet' => 'Bir konu belirtiniz',
232
-	'form_prop_message_envoye' => 'İleti gönderildi',
233
-	'form_prop_non_enregistre' => 'Öneriniz kaydedilmedi.',
234
-	'form_prop_sujet' => 'Konu',
235
-	'form_prop_url_site' => 'Sitenin Url adresi', # MODIF
236
-	'forum_non_inscrit' => 'Kayıtlı değilsiniz veya adresiniz veya şifreniz hatalı.',
237
-	'forum_par_auteur' => 'yazan @auteur@ ',
238
-	'forum_titre_erreur' => 'Hata...',
204
+    // F
205
+    'fichier_introuvable' => '@fichier@ dosyası bulunamadı', # MODIF
206
+    'form_deja_inscrit' => 'Zaten kayıtlısınız.',
207
+    'form_email_non_valide' => 'E-posta adresiniz geçersiz.',
208
+    'form_forum_access_refuse' => 'Artık bu siteye erişim izniniz yok.',
209
+    'form_forum_bonjour' => 'Merhaba @nom@,',
210
+    'form_forum_email_deja_enregistre' => 'Bu e-posta adresi zaten kayıtlı, kullanmakta olduğunuz şifrenizi kullanmaya devam edebilirsiniz.',
211
+    'form_forum_identifiant_mail' => 'Yeni tanımlayıcınız e-posta yoluyla gönderildi.',
212
+    'form_forum_identifiants' => 'Kişisel tanımlayıcılar',
213
+    'form_forum_indiquer_nom_email' => 'Buraya isminizi ve e-posta adresinizi giriniz. Yeni tanımlayıcınız size bir e-posta ile hemen gönderilecektir.',
214
+    'form_forum_login' => 'kullanıcı ismi :',
215
+    'form_forum_message_auto' => '(bu otomatik bir iletidir)',
216
+    'form_forum_pass' => 'şifre :',
217
+    'form_forum_probleme_mail' => 'E-posta sorunu : tanımlayıcı gönderilemiyor.',
218
+    'form_forum_voici1' => '"@nom_site_spip@" (@adresse_site@) site yaşamına katılabilmek için tanımlayıcılarınız :',
219
+    'form_forum_voici2' => '"@nom_site_spip@" (@adresse_login@) sitesinde makale yayınlayabilmeniz için gereken kimlik bilgileriniz :',
220
+    'form_indiquer_email' => 'Lütfen e-posta adresinizi belirtiniz.',
221
+    'form_indiquer_nom' => 'Lütfen isminizi belirtiniz.',
222
+    'form_indiquer_nom_site' => 'Lütfen sitenizin ismini belirtiniz.',
223
+    'form_pet_deja_enregistre' => 'Bu site zaten kayıtlı',
224
+    'form_pet_signature_pasprise' => 'İmzanız dikkate alınmadı.',
225
+    'form_prop_confirmer_envoi' => 'Gönderiyi onayla',
226
+    'form_prop_description' => 'Tanım / Yorum',
227
+    'form_prop_enregistre' => 'Öneriniz kaydedildi, sitenin sorumluları tarafından onaylandıktan sonra çevrimiçi yayınlanacak.',
228
+    'form_prop_envoyer' => 'Bir ileti gönder',
229
+    'form_prop_indiquer_email' => 'Lütfen geçerli bir e-posta adresi belirtiniz',
230
+    'form_prop_indiquer_nom_site' => 'Sitenin ismini giriniz.',
231
+    'form_prop_indiquer_sujet' => 'Bir konu belirtiniz',
232
+    'form_prop_message_envoye' => 'İleti gönderildi',
233
+    'form_prop_non_enregistre' => 'Öneriniz kaydedilmedi.',
234
+    'form_prop_sujet' => 'Konu',
235
+    'form_prop_url_site' => 'Sitenin Url adresi', # MODIF
236
+    'forum_non_inscrit' => 'Kayıtlı değilsiniz veya adresiniz veya şifreniz hatalı.',
237
+    'forum_par_auteur' => 'yazan @auteur@ ',
238
+    'forum_titre_erreur' => 'Hata...',
239 239
 
240
-	// I
241
-	'ical_texte_rss_articles' => 'Makalelerin «backend» dosyası şu adrestedir:',
242
-	'ical_texte_rss_articles2' => 'Sitenin her bir bölümünün makaleleri için «backend» dosyaları edinebilirsiniz :',
243
-	'ical_texte_rss_breves' => 'Ayrıca site haberlerini içeren bir dosya mevcuttur. Bir bölüm numarası belirterek, sadece bu bölümün haberlerini elde edebilirsiniz.',
244
-	'icone_a_suivre' => 'İzlenecek',
245
-	'icone_admin_site' => 'Site yönetimi',
246
-	'icone_agenda' => 'Ajanda',
247
-	'icone_aide_ligne' => 'Yardım',
248
-	'icone_articles' => 'Makaleler',
249
-	'icone_auteurs' => 'Yazarlar',
250
-	'icone_brouteur' => 'Hızlı gezinti',
251
-	'icone_configuration_site' => 'Yapılandırma',
252
-	'icone_configurer_site' => 'Sitenizi yapılandırın',
253
-	'icone_creer_nouvel_auteur' => 'Yeni bir yazar oluştur',
254
-	'icone_creer_rubrique' => 'Bölüm oluştur',
255
-	'icone_creer_sous_rubrique' => 'Alt-bölüm oluştur',
256
-	'icone_deconnecter' => 'Çıkış',
257
-	'icone_discussions' => 'Tartışmalar',
258
-	'icone_doc_rubrique' => 'Bölüm belgeleri',
259
-	'icone_ecrire_article' => 'Yeni bir makale yaz',
260
-	'icone_edition_site' => 'Yayın',
261
-	'icone_gestion_langues' => 'Dillerin yönetimi',
262
-	'icone_informations_personnelles' => 'Kişisel bilgiler',
263
-	'icone_interface_complet' => 'Tüm arayüz',
264
-	'icone_interface_simple' => 'Basit arayüz',
265
-	'icone_maintenance_site' => 'Site bakımı',
266
-	'icone_messagerie_personnelle' => 'Kişisel iletiler',
267
-	'icone_repartition_debut' => 'Dağılımı en başından itibaren göster',
268
-	'icone_rubriques' => 'Bölümler',
269
-	'icone_sauver_site' => 'Siteyi yedekle',
270
-	'icone_site_entier' => 'Tüm site',
271
-	'icone_sites_references' => 'Önerilen siteler',
272
-	'icone_statistiques' => 'Site istatistikleri',
273
-	'icone_suivi_activite' => 'Site yaşamını izle',
274
-	'icone_suivi_actualite' => 'Site gelişimi',
275
-	'icone_suivi_pettions' => 'Dilekçeleri izle / Yönet',
276
-	'icone_suivi_revisions' => 'Makale değişiklikleri',
277
-	'icone_supprimer_document' => 'Bu belgeyi sil',
278
-	'icone_supprimer_image' => 'Bu resmi sil',
279
-	'icone_tous_articles' => 'Tüm makaleleriniz',
280
-	'icone_tous_auteur' => 'Tüm yazarlar',
281
-	'icone_visiter_site' => 'Ziyaret et', # MODIF
282
-	'icone_voir_en_ligne' => 'Çevrimiçi göster',
283
-	'img_indisponible' => 'resim mevcut değil',
284
-	'impossible' => 'olanaksız',
285
-	'info_a_suivre' => 'İZLENECEK »',
286
-	'info_acces_interdit' => 'Erişim yasak',
287
-	'info_acces_refuse' => 'Erişim reddedildi',
288
-	'info_action' => 'Eylem : @action@',
289
-	'info_administrer_rubriques' => 'Bu bölümü ve alt-bölümleri yönetebilirsiniz',
290
-	'info_adresse_non_indiquee' => 'Denenecek bir adres belirtmediniz !',
291
-	'info_aide' => 'YARDIM :',
292
-	'info_ajouter_mot' => 'Bu sözcüğü ekle',
293
-	'info_annonce' => 'DUYURU',
294
-	'info_annonces_generales' => 'Genel duyurular :',
295
-	'info_article_propose' => 'Önerilen makale',
296
-	'info_article_publie' => 'Yayınlanan makale',
297
-	'info_article_redaction' => 'Yazılmakta olan makale',
298
-	'info_article_refuse' => 'Reddedilen makale',
299
-	'info_article_supprime' => 'Silinen makale',
300
-	'info_articles' => 'Makaleler',
301
-	'info_articles_a_valider' => 'Onaylanacak makaleler',
302
-	'info_articles_proposes' => 'Önerilen makaleler',
303
-	'info_auteurs_nombre' => 'yazar(lar) :',
304
-	'info_authentification_ftp' => 'Onay (FTP ile)',
305
-	'info_breves_2' => 'kısa haberler',
306
-	'info_connexion_refusee' => 'Bağlantı reddedildi',
307
-	'info_contact_developpeur' => 'Lütfen bir program geliştirici ile temasa geçiniz.',
308
-	'info_contenance' => 'Site içeriği :',
309
-	'info_contribution' => 'Forum katkıları', # MODIF
310
-	'info_copyright' => '@spip@, @lien_gpl@ GPL lisansı ile dağıtılan serbest bir yazılımdır.',
311
-	'info_copyright_doc' => 'Ayrıntılı bilgi için, bkz.  <a href="@spipnet@">http://www.spip.net/fr</a>.', # MODIF
312
-	'info_copyright_gpl' => 'GPL lisansı altında',
313
-	'info_cours_edition' => 'Yazılmakta olan makaleleriniz', # MODIF
314
-	'info_creer_repertoire' => 'Şu isimde bir dosya veya dizin oluşturunuz :',
315
-	'info_creer_repertoire_2' => '<b>@repertoire@</b> alt-dizini içerisinde, daha sonra :',
316
-	'info_creer_vignette' => 'otomatik ikon oluşturma',
317
-	'info_deplier' => 'Açılıp sergilenmesi',
318
-	'info_descriptif_nombre' => 'tanımlayıcı(lar) :',
319
-	'info_description' => 'Tanımlama :',
320
-	'info_description_2' => 'Tanımlama :',
321
-	'info_dimension' => 'Boyutlar :',
322
-	'info_ecire_message_prive' => 'Özel bir ileti yaz',
323
-	'info_email_invalide' => 'Geçersiz e-posta adresi.',
324
-	'info_en_cours_validation' => 'Yazılmakta olan makaleleriniz',
325
-	'info_en_ligne' => 'Şu anda çevrimiçi :',
326
-	'info_envoyer_message_prive' => 'Bu yazara özel bir ileti gönder',
327
-	'info_erreur_requete' => 'Aramada hata :',
328
-	'info_erreur_squelette2' => 'Hiçbir @fichier@ iskeleti müsait değil...',
329
-	'info_erreur_systeme' => 'Sistem hatası (hata no @errsys@)',
330
-	'info_erreur_systeme2' => 'Sabit disk dolu olabilir veya veritabanı hasar görmüş olabilir.<br />
240
+    // I
241
+    'ical_texte_rss_articles' => 'Makalelerin «backend» dosyası şu adrestedir:',
242
+    'ical_texte_rss_articles2' => 'Sitenin her bir bölümünün makaleleri için «backend» dosyaları edinebilirsiniz :',
243
+    'ical_texte_rss_breves' => 'Ayrıca site haberlerini içeren bir dosya mevcuttur. Bir bölüm numarası belirterek, sadece bu bölümün haberlerini elde edebilirsiniz.',
244
+    'icone_a_suivre' => 'İzlenecek',
245
+    'icone_admin_site' => 'Site yönetimi',
246
+    'icone_agenda' => 'Ajanda',
247
+    'icone_aide_ligne' => 'Yardım',
248
+    'icone_articles' => 'Makaleler',
249
+    'icone_auteurs' => 'Yazarlar',
250
+    'icone_brouteur' => 'Hızlı gezinti',
251
+    'icone_configuration_site' => 'Yapılandırma',
252
+    'icone_configurer_site' => 'Sitenizi yapılandırın',
253
+    'icone_creer_nouvel_auteur' => 'Yeni bir yazar oluştur',
254
+    'icone_creer_rubrique' => 'Bölüm oluştur',
255
+    'icone_creer_sous_rubrique' => 'Alt-bölüm oluştur',
256
+    'icone_deconnecter' => 'Çıkış',
257
+    'icone_discussions' => 'Tartışmalar',
258
+    'icone_doc_rubrique' => 'Bölüm belgeleri',
259
+    'icone_ecrire_article' => 'Yeni bir makale yaz',
260
+    'icone_edition_site' => 'Yayın',
261
+    'icone_gestion_langues' => 'Dillerin yönetimi',
262
+    'icone_informations_personnelles' => 'Kişisel bilgiler',
263
+    'icone_interface_complet' => 'Tüm arayüz',
264
+    'icone_interface_simple' => 'Basit arayüz',
265
+    'icone_maintenance_site' => 'Site bakımı',
266
+    'icone_messagerie_personnelle' => 'Kişisel iletiler',
267
+    'icone_repartition_debut' => 'Dağılımı en başından itibaren göster',
268
+    'icone_rubriques' => 'Bölümler',
269
+    'icone_sauver_site' => 'Siteyi yedekle',
270
+    'icone_site_entier' => 'Tüm site',
271
+    'icone_sites_references' => 'Önerilen siteler',
272
+    'icone_statistiques' => 'Site istatistikleri',
273
+    'icone_suivi_activite' => 'Site yaşamını izle',
274
+    'icone_suivi_actualite' => 'Site gelişimi',
275
+    'icone_suivi_pettions' => 'Dilekçeleri izle / Yönet',
276
+    'icone_suivi_revisions' => 'Makale değişiklikleri',
277
+    'icone_supprimer_document' => 'Bu belgeyi sil',
278
+    'icone_supprimer_image' => 'Bu resmi sil',
279
+    'icone_tous_articles' => 'Tüm makaleleriniz',
280
+    'icone_tous_auteur' => 'Tüm yazarlar',
281
+    'icone_visiter_site' => 'Ziyaret et', # MODIF
282
+    'icone_voir_en_ligne' => 'Çevrimiçi göster',
283
+    'img_indisponible' => 'resim mevcut değil',
284
+    'impossible' => 'olanaksız',
285
+    'info_a_suivre' => 'İZLENECEK »',
286
+    'info_acces_interdit' => 'Erişim yasak',
287
+    'info_acces_refuse' => 'Erişim reddedildi',
288
+    'info_action' => 'Eylem : @action@',
289
+    'info_administrer_rubriques' => 'Bu bölümü ve alt-bölümleri yönetebilirsiniz',
290
+    'info_adresse_non_indiquee' => 'Denenecek bir adres belirtmediniz !',
291
+    'info_aide' => 'YARDIM :',
292
+    'info_ajouter_mot' => 'Bu sözcüğü ekle',
293
+    'info_annonce' => 'DUYURU',
294
+    'info_annonces_generales' => 'Genel duyurular :',
295
+    'info_article_propose' => 'Önerilen makale',
296
+    'info_article_publie' => 'Yayınlanan makale',
297
+    'info_article_redaction' => 'Yazılmakta olan makale',
298
+    'info_article_refuse' => 'Reddedilen makale',
299
+    'info_article_supprime' => 'Silinen makale',
300
+    'info_articles' => 'Makaleler',
301
+    'info_articles_a_valider' => 'Onaylanacak makaleler',
302
+    'info_articles_proposes' => 'Önerilen makaleler',
303
+    'info_auteurs_nombre' => 'yazar(lar) :',
304
+    'info_authentification_ftp' => 'Onay (FTP ile)',
305
+    'info_breves_2' => 'kısa haberler',
306
+    'info_connexion_refusee' => 'Bağlantı reddedildi',
307
+    'info_contact_developpeur' => 'Lütfen bir program geliştirici ile temasa geçiniz.',
308
+    'info_contenance' => 'Site içeriği :',
309
+    'info_contribution' => 'Forum katkıları', # MODIF
310
+    'info_copyright' => '@spip@, @lien_gpl@ GPL lisansı ile dağıtılan serbest bir yazılımdır.',
311
+    'info_copyright_doc' => 'Ayrıntılı bilgi için, bkz.  <a href="@spipnet@">http://www.spip.net/fr</a>.', # MODIF
312
+    'info_copyright_gpl' => 'GPL lisansı altında',
313
+    'info_cours_edition' => 'Yazılmakta olan makaleleriniz', # MODIF
314
+    'info_creer_repertoire' => 'Şu isimde bir dosya veya dizin oluşturunuz :',
315
+    'info_creer_repertoire_2' => '<b>@repertoire@</b> alt-dizini içerisinde, daha sonra :',
316
+    'info_creer_vignette' => 'otomatik ikon oluşturma',
317
+    'info_deplier' => 'Açılıp sergilenmesi',
318
+    'info_descriptif_nombre' => 'tanımlayıcı(lar) :',
319
+    'info_description' => 'Tanımlama :',
320
+    'info_description_2' => 'Tanımlama :',
321
+    'info_dimension' => 'Boyutlar :',
322
+    'info_ecire_message_prive' => 'Özel bir ileti yaz',
323
+    'info_email_invalide' => 'Geçersiz e-posta adresi.',
324
+    'info_en_cours_validation' => 'Yazılmakta olan makaleleriniz',
325
+    'info_en_ligne' => 'Şu anda çevrimiçi :',
326
+    'info_envoyer_message_prive' => 'Bu yazara özel bir ileti gönder',
327
+    'info_erreur_requete' => 'Aramada hata :',
328
+    'info_erreur_squelette2' => 'Hiçbir @fichier@ iskeleti müsait değil...',
329
+    'info_erreur_systeme' => 'Sistem hatası (hata no @errsys@)',
330
+    'info_erreur_systeme2' => 'Sabit disk dolu olabilir veya veritabanı hasar görmüş olabilir.<br />
331 331
 <span style="color:red;">Veritabanını <a href=\'@script@\'>onarmayı deneyiniz </a>, veya sitenizi barındıran firmayı arayınız.</span>',
332
-	'info_fini' => 'Bitti !',
333
-	'info_format_image' => 'İkon yaratmak için kullanılabilecek resim formatları : @gd_formats@.',
334
-	'info_format_non_defini' => 'tanımsız format',
335
-	'info_grand_ecran' => 'Büyük ekran',
336
-	'info_image_aide' => 'YARDIM',
337
-	'info_image_process_titre' => 'İkon oluşturma yöntemleri',
338
-	'info_impossible_lire_page' => '<b>Hata !</b> Sayfa vekil (proxy) üzerinden <tt><html>@test_proxy@</html></tt> okunamıyor  <tt>',
339
-	'info_installation_systeme_publication' => 'Yayın sistemi kurulumu...',
340
-	'info_installer_documents' => '@upload@ dizininde bulunan tüm belgeleri otomatik olarak kurabilirsiniz. ',
341
-	'info_installer_ftp' => 'Yönetici olarak (FTP ile) @upload@ dizinine dosya gönderip sonra onları buradan direkt olarak seçebilirsiniz. ',
342
-	'info_installer_images' => 'JPEG, GIF ve PNG formatında resimler yükleyebilirsiniz.',
343
-	'info_installer_images_dossier' => 'Buradan seçim yapabilmek için @upload@ dizinine resim yükleyiniz. ',
344
-	'info_interface_complete' => 'Tam arayüz',
345
-	'info_interface_simple' => 'Basit arayüz',
346
-	'info_joindre_document_article' => 'Bu makaleye ekleyebileceğiniz belgeler ',
347
-	'info_joindre_document_rubrique' => 'Bu bölüme ekleyebileceğiniz belgeler ',
348
-	'info_joindre_documents_article' => 'Makalenize ekleyebileceğiniz belgeler :',
349
-	'info_l_article' => 'makale',
350
-	'info_la_breve' => 'kısa haber',
351
-	'info_la_rubrique' => 'bölüm',
352
-	'info_langue_principale' => 'Sitenin ana dili',
353
-	'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ piksel',
354
-	'info_les_auteurs_1' => 'yazan @les_auteurs@ ',
355
-	'info_logo_format_interdit' => 'Sadece @formats@ formatındaki logolar kullanılabilir.',
356
-	'info_logo_max_poids' => 'Logolar @maxi@ dan daha küçük olmalıdır (bu dosyanın boyutu  @actuel@).',
357
-	'info_mail_fournisseur' => 'isminiz@hizmet_veren_firma.com',
358
-	'info_message_2' => 'İLETİ',
359
-	'info_message_supprime' => 'İLETİ SİLİNDİ',
360
-	'info_mise_en_ligne' => 'Çevrimiçi yayın tarihi :',
361
-	'info_modification_parametres_securite' => 'güvenlik parametreleri değişikliği',
362
-	'info_mois_courant' => 'Ay içinde :',
363
-	'info_mot_cle_ajoute' => 'Şu anahtar sözcük eklendi > ',
364
-	'info_multi_herit' => 'Varsayılan dil :',
365
-	'info_multi_langues_soulignees' => '<u>Altı çizili dillerin</u> arayüzde tüm metinlerin çevirileri bulunmaktadır. Bu dilleri seçerseniz, kamu sitesinin bir çok elemanı (tarihler, formlar) otomatik olarak çevrilecektir. Altı çizili olmayan diller için ise bu elemanlar sitenin başlıca dilinde görüntülenecektir.', # MODIF
366
-	'info_multilinguisme' => 'Çok dillilik',
367
-	'info_nom_non_utilisateurs_connectes' => 'Bağlı kullanıcılar listesinde isminiz görünmüyor.',
368
-	'info_nom_utilisateurs_connectes' => 'Bağlı kullanıcılar listesinde isminiz görünüyor.',
369
-	'info_nombre_en_ligne' => 'Şu anda çevrimiçi :',
370
-	'info_non_resultat' => '"@cherche_mot@" için hiç sonuç yok',
371
-	'info_non_utilisation_messagerie' => 'Bu sitenin iç ileti sistemini kullanmıyorsunuz.',
372
-	'info_nouveau_message' => 'YENİ BİR İLETİNİZ VAR',
373
-	'info_nouveaux_messages' => '@total_messages@ YENİ MESAJINIZ VAR',
374
-	'info_numero_abbreviation' => 'N° ',
375
-	'info_obligatoire' => 'Bu bilgi zorunludur.',
376
-	'info_pense_bete' => 'HATIRLATMA',
377
-	'info_petit_ecran' => 'Küçük ekran',
378
-	'info_petition_close' => 'Dilekçe kapandı',
379
-	'info_pixels' => 'Piksel',
380
-	'info_plusieurs_mots_trouves' => ' "@cherche_mot@" için birçok anahtar sözcük bulundu',
381
-	'info_portfolio_automatique' => 'Otomatik portföy :',
382
-	'info_premier_resultat' => '[Toplam @total@ dan @debut_limit@ ilk sonuç]',
383
-	'info_premier_resultat_sur' => '[@debut_limit@ ilk sonuç / @total@ sonuç]',
384
-	'info_propose_1' => '[@nom_site_spip@] Öneriyor : @titre@',
385
-	'info_propose_2' => 'Önerilen makale
332
+    'info_fini' => 'Bitti !',
333
+    'info_format_image' => 'İkon yaratmak için kullanılabilecek resim formatları : @gd_formats@.',
334
+    'info_format_non_defini' => 'tanımsız format',
335
+    'info_grand_ecran' => 'Büyük ekran',
336
+    'info_image_aide' => 'YARDIM',
337
+    'info_image_process_titre' => 'İkon oluşturma yöntemleri',
338
+    'info_impossible_lire_page' => '<b>Hata !</b> Sayfa vekil (proxy) üzerinden <tt><html>@test_proxy@</html></tt> okunamıyor  <tt>',
339
+    'info_installation_systeme_publication' => 'Yayın sistemi kurulumu...',
340
+    'info_installer_documents' => '@upload@ dizininde bulunan tüm belgeleri otomatik olarak kurabilirsiniz. ',
341
+    'info_installer_ftp' => 'Yönetici olarak (FTP ile) @upload@ dizinine dosya gönderip sonra onları buradan direkt olarak seçebilirsiniz. ',
342
+    'info_installer_images' => 'JPEG, GIF ve PNG formatında resimler yükleyebilirsiniz.',
343
+    'info_installer_images_dossier' => 'Buradan seçim yapabilmek için @upload@ dizinine resim yükleyiniz. ',
344
+    'info_interface_complete' => 'Tam arayüz',
345
+    'info_interface_simple' => 'Basit arayüz',
346
+    'info_joindre_document_article' => 'Bu makaleye ekleyebileceğiniz belgeler ',
347
+    'info_joindre_document_rubrique' => 'Bu bölüme ekleyebileceğiniz belgeler ',
348
+    'info_joindre_documents_article' => 'Makalenize ekleyebileceğiniz belgeler :',
349
+    'info_l_article' => 'makale',
350
+    'info_la_breve' => 'kısa haber',
351
+    'info_la_rubrique' => 'bölüm',
352
+    'info_langue_principale' => 'Sitenin ana dili',
353
+    'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ piksel',
354
+    'info_les_auteurs_1' => 'yazan @les_auteurs@ ',
355
+    'info_logo_format_interdit' => 'Sadece @formats@ formatındaki logolar kullanılabilir.',
356
+    'info_logo_max_poids' => 'Logolar @maxi@ dan daha küçük olmalıdır (bu dosyanın boyutu  @actuel@).',
357
+    'info_mail_fournisseur' => 'isminiz@hizmet_veren_firma.com',
358
+    'info_message_2' => 'İLETİ',
359
+    'info_message_supprime' => 'İLETİ SİLİNDİ',
360
+    'info_mise_en_ligne' => 'Çevrimiçi yayın tarihi :',
361
+    'info_modification_parametres_securite' => 'güvenlik parametreleri değişikliği',
362
+    'info_mois_courant' => 'Ay içinde :',
363
+    'info_mot_cle_ajoute' => 'Şu anahtar sözcük eklendi > ',
364
+    'info_multi_herit' => 'Varsayılan dil :',
365
+    'info_multi_langues_soulignees' => '<u>Altı çizili dillerin</u> arayüzde tüm metinlerin çevirileri bulunmaktadır. Bu dilleri seçerseniz, kamu sitesinin bir çok elemanı (tarihler, formlar) otomatik olarak çevrilecektir. Altı çizili olmayan diller için ise bu elemanlar sitenin başlıca dilinde görüntülenecektir.', # MODIF
366
+    'info_multilinguisme' => 'Çok dillilik',
367
+    'info_nom_non_utilisateurs_connectes' => 'Bağlı kullanıcılar listesinde isminiz görünmüyor.',
368
+    'info_nom_utilisateurs_connectes' => 'Bağlı kullanıcılar listesinde isminiz görünüyor.',
369
+    'info_nombre_en_ligne' => 'Şu anda çevrimiçi :',
370
+    'info_non_resultat' => '"@cherche_mot@" için hiç sonuç yok',
371
+    'info_non_utilisation_messagerie' => 'Bu sitenin iç ileti sistemini kullanmıyorsunuz.',
372
+    'info_nouveau_message' => 'YENİ BİR İLETİNİZ VAR',
373
+    'info_nouveaux_messages' => '@total_messages@ YENİ MESAJINIZ VAR',
374
+    'info_numero_abbreviation' => 'N° ',
375
+    'info_obligatoire' => 'Bu bilgi zorunludur.',
376
+    'info_pense_bete' => 'HATIRLATMA',
377
+    'info_petit_ecran' => 'Küçük ekran',
378
+    'info_petition_close' => 'Dilekçe kapandı',
379
+    'info_pixels' => 'Piksel',
380
+    'info_plusieurs_mots_trouves' => ' "@cherche_mot@" için birçok anahtar sözcük bulundu',
381
+    'info_portfolio_automatique' => 'Otomatik portföy :',
382
+    'info_premier_resultat' => '[Toplam @total@ dan @debut_limit@ ilk sonuç]',
383
+    'info_premier_resultat_sur' => '[@debut_limit@ ilk sonuç / @total@ sonuç]',
384
+    'info_propose_1' => '[@nom_site_spip@] Öneriyor : @titre@',
385
+    'info_propose_2' => 'Önerilen makale
386 386
 ---------------',
387
-	'info_propose_3' => '"@titre@" makalesi yayınlanmak üzere önerildi.',
388
-	'info_propose_4' => 'Lütfen inceleyiniz ve görüşünüzü belirtiniz',
389
-	'info_propose_5' => 'bağlı olan forumda. Forumun adresi:',
390
-	'info_publie_01' => '"@titre@" makalesi @connect_nom@ tarafından onaylandı.',
391
-	'info_publie_1' => '[@nom_site_spip@] YAYINLANDI : @titre@',
392
-	'info_publie_2' => 'Yayınlanan makale
387
+    'info_propose_3' => '"@titre@" makalesi yayınlanmak üzere önerildi.',
388
+    'info_propose_4' => 'Lütfen inceleyiniz ve görüşünüzü belirtiniz',
389
+    'info_propose_5' => 'bağlı olan forumda. Forumun adresi:',
390
+    'info_publie_01' => '"@titre@" makalesi @connect_nom@ tarafından onaylandı.',
391
+    'info_publie_1' => '[@nom_site_spip@] YAYINLANDI : @titre@',
392
+    'info_publie_2' => 'Yayınlanan makale
393 393
 -----------------',
394
-	'info_rechercher' => 'Ara',
395
-	'info_rechercher_02' => 'Ara :',
396
-	'info_remplacer_vignette' => 'Varsayılan etiketi kişiselleştirilmiş bir logo ile değiştir :',
397
-	'info_sans_titre_2' => 'başlıksız',
398
-	'info_selectionner_fichier' => '@upload@ dizininden bir dosya seçebilirsiniz. ',
399
-	'info_selectionner_fichier_2' => 'Bir dosya seç :',
400
-	'info_supprimer_vignette' => 'Bu etiketi sil',
401
-	'info_symbole_bleu' => '<b>Mavi</b> sembol bir <b>hatırlatmayı</b> gösterir : yani, kişisel kullanımınız için bir iletidir.',
402
-	'info_symbole_jaune' => '<b>Sarı</b> sembol <b>tüm editörlere yönelik</b> bir duyuruyu gösterir : tüm yöneticiler tarafından değiştirilebilir ve tüm editörler tarafından görülebilir. ',
403
-	'info_symbole_vert' => 'Sarı sembol sitenin başka kullanıcılarıyla yapılan ileti alışverişlerini gösterir.',
404
-	'info_telecharger_nouveau_logo' => 'Yeni bir logo yükle :',
405
-	'info_telecharger_ordinateur' => 'Bilgisayarınızdan indiriniz :',
406
-	'info_tous_resultats_enregistres' => '[tüm sonuçlar kaydedildi]',
407
-	'info_tout_afficher' => 'Tümünü görüntüle',
408
-	'info_travaux_texte' => 'Bu site henüz konfigüre edilmedi. Lütfen daha sonra uğrayınız.',
409
-	'info_travaux_titre' => 'Site yapım aşamasında.',
410
-	'info_trop_resultat' => ' "@cherche_mot@" için çok fazla sonuç çıktı; lütfen aramayı netleştirin.',
411
-	'info_utilisation_messagerie_interne' => 'Bu sitenin iç ileti sistemini kullanıyorsunuz.',
412
-	'info_valider_lien' => 'Bu bağlantıyı onayla',
413
-	'info_verifier_image' => 'Resimlerinizin doğru iletildiğinden emin olunuz.',
414
-	'info_vignette_defaut' => 'Varsayılan ikon',
415
-	'info_vignette_personnalisee' => 'Kişiselleştirilmiş etiket',
416
-	'info_visite' => 'Ziyaret :',
417
-	'info_vos_rendez_vous' => 'İlerideki randevularınız',
418
-	'infos_vos_pense_bete' => 'Hatırlatmalarınız', # MODIF
394
+    'info_rechercher' => 'Ara',
395
+    'info_rechercher_02' => 'Ara :',
396
+    'info_remplacer_vignette' => 'Varsayılan etiketi kişiselleştirilmiş bir logo ile değiştir :',
397
+    'info_sans_titre_2' => 'başlıksız',
398
+    'info_selectionner_fichier' => '@upload@ dizininden bir dosya seçebilirsiniz. ',
399
+    'info_selectionner_fichier_2' => 'Bir dosya seç :',
400
+    'info_supprimer_vignette' => 'Bu etiketi sil',
401
+    'info_symbole_bleu' => '<b>Mavi</b> sembol bir <b>hatırlatmayı</b> gösterir : yani, kişisel kullanımınız için bir iletidir.',
402
+    'info_symbole_jaune' => '<b>Sarı</b> sembol <b>tüm editörlere yönelik</b> bir duyuruyu gösterir : tüm yöneticiler tarafından değiştirilebilir ve tüm editörler tarafından görülebilir. ',
403
+    'info_symbole_vert' => 'Sarı sembol sitenin başka kullanıcılarıyla yapılan ileti alışverişlerini gösterir.',
404
+    'info_telecharger_nouveau_logo' => 'Yeni bir logo yükle :',
405
+    'info_telecharger_ordinateur' => 'Bilgisayarınızdan indiriniz :',
406
+    'info_tous_resultats_enregistres' => '[tüm sonuçlar kaydedildi]',
407
+    'info_tout_afficher' => 'Tümünü görüntüle',
408
+    'info_travaux_texte' => 'Bu site henüz konfigüre edilmedi. Lütfen daha sonra uğrayınız.',
409
+    'info_travaux_titre' => 'Site yapım aşamasında.',
410
+    'info_trop_resultat' => ' "@cherche_mot@" için çok fazla sonuç çıktı; lütfen aramayı netleştirin.',
411
+    'info_utilisation_messagerie_interne' => 'Bu sitenin iç ileti sistemini kullanıyorsunuz.',
412
+    'info_valider_lien' => 'Bu bağlantıyı onayla',
413
+    'info_verifier_image' => 'Resimlerinizin doğru iletildiğinden emin olunuz.',
414
+    'info_vignette_defaut' => 'Varsayılan ikon',
415
+    'info_vignette_personnalisee' => 'Kişiselleştirilmiş etiket',
416
+    'info_visite' => 'Ziyaret :',
417
+    'info_vos_rendez_vous' => 'İlerideki randevularınız',
418
+    'infos_vos_pense_bete' => 'Hatırlatmalarınız', # MODIF
419 419
 
420
-	// L
421
-	'lien_afficher_icones_seuls' => 'Sadece ikonları görüntüle',
422
-	'lien_afficher_texte_icones' => 'ikonları ve metni görüntüle',
423
-	'lien_afficher_texte_seul' => 'Sadece metni görüntüle',
424
-	'lien_liberer' => 'Serbest bırak',
425
-	'lien_liberer_tous' => 'Bu makaleleri serbest bırak', # MODIF
426
-	'lien_nouvea_pense_bete' => 'YENİ HATIRLATMA',
427
-	'lien_nouveau_message' => 'YENİ İLETİ',
428
-	'lien_nouvelle_annonce' => 'YENİ DUYURU',
429
-	'lien_petitions' => 'DİLEKÇE ',
430
-	'lien_popularite' => 'Popülerlik : @popularite@%',
431
-	'lien_racine_site' => 'SİTENİN KÖK DİZİNİ',
432
-	'lien_reessayer' => 'Tekrar dene',
433
-	'lien_repondre_message' => 'Bu iletiye yanıt ver',
434
-	'lien_supprimer' => 'Sil',
435
-	'lien_tout_afficher' => 'Tümünü görüntüle',
436
-	'lien_visite_site' => 'Bu siteyi ziyaret et',
437
-	'lien_visites' => '@visites@ ziyaret',
438
-	'lien_voir_auteur' => 'Bu yazarı görüntüle',
439
-	'ligne' => 'Satır',
440
-	'login' => 'Bağlantı',
441
-	'login_acces_prive' => 'Özel alana erişim',
442
-	'login_autre_identifiant' => 'Başka bir kullanıcı ismi ile bağlan',
443
-	'login_cookie_accepte' => 'Lütfen gezgininizi (en azından bu site için) bunları kabul edecek biçimde ayarlayınız.',
444
-	'login_cookie_oblige' => 'Kendinizi güvenli bir şekilde tanımlamak için çerezleri kabul etmelisiniz.',
445
-	'login_deconnexion_ok' => 'Bağlantıya son verildi.',
446
-	'login_erreur_pass' => 'Şifre hatası.',
447
-	'login_espace_prive' => 'Özel alan',
448
-	'login_identifiant_inconnu' => '"@login@" kullanıcı ismi tanınmıyor.',
449
-	'login_login' => 'Kullanıcı ismi :',
450
-	'login_login2' => 'Kullanıcı ismi :', # MODIF
451
-	'login_login_pass_incorrect' => '(Kullanıcı ismi veya şifre hatalı.)',
452
-	'login_motpasseoublie' => 'Şifreyi unuttum',
453
-	'login_non_securise' => 'Dikkat, bu form güvenli değil.
420
+    // L
421
+    'lien_afficher_icones_seuls' => 'Sadece ikonları görüntüle',
422
+    'lien_afficher_texte_icones' => 'ikonları ve metni görüntüle',
423
+    'lien_afficher_texte_seul' => 'Sadece metni görüntüle',
424
+    'lien_liberer' => 'Serbest bırak',
425
+    'lien_liberer_tous' => 'Bu makaleleri serbest bırak', # MODIF
426
+    'lien_nouvea_pense_bete' => 'YENİ HATIRLATMA',
427
+    'lien_nouveau_message' => 'YENİ İLETİ',
428
+    'lien_nouvelle_annonce' => 'YENİ DUYURU',
429
+    'lien_petitions' => 'DİLEKÇE ',
430
+    'lien_popularite' => 'Popülerlik : @popularite@%',
431
+    'lien_racine_site' => 'SİTENİN KÖK DİZİNİ',
432
+    'lien_reessayer' => 'Tekrar dene',
433
+    'lien_repondre_message' => 'Bu iletiye yanıt ver',
434
+    'lien_supprimer' => 'Sil',
435
+    'lien_tout_afficher' => 'Tümünü görüntüle',
436
+    'lien_visite_site' => 'Bu siteyi ziyaret et',
437
+    'lien_visites' => '@visites@ ziyaret',
438
+    'lien_voir_auteur' => 'Bu yazarı görüntüle',
439
+    'ligne' => 'Satır',
440
+    'login' => 'Bağlantı',
441
+    'login_acces_prive' => 'Özel alana erişim',
442
+    'login_autre_identifiant' => 'Başka bir kullanıcı ismi ile bağlan',
443
+    'login_cookie_accepte' => 'Lütfen gezgininizi (en azından bu site için) bunları kabul edecek biçimde ayarlayınız.',
444
+    'login_cookie_oblige' => 'Kendinizi güvenli bir şekilde tanımlamak için çerezleri kabul etmelisiniz.',
445
+    'login_deconnexion_ok' => 'Bağlantıya son verildi.',
446
+    'login_erreur_pass' => 'Şifre hatası.',
447
+    'login_espace_prive' => 'Özel alan',
448
+    'login_identifiant_inconnu' => '"@login@" kullanıcı ismi tanınmıyor.',
449
+    'login_login' => 'Kullanıcı ismi :',
450
+    'login_login2' => 'Kullanıcı ismi :', # MODIF
451
+    'login_login_pass_incorrect' => '(Kullanıcı ismi veya şifre hatalı.)',
452
+    'login_motpasseoublie' => 'Şifreyi unuttum',
453
+    'login_non_securise' => 'Dikkat, bu form güvenli değil.
454 454
           Eğer şifrenizin ağ üzerinde tesbit edilmesini istemiyorsanız,
455 455
           lütfen gezgininizde Javascript’i çalıştırınız ve ',
456
-	'login_nouvelle_tentative' => 'Yeni deneme',
457
-	'login_par_ici' => 'Kayıt oldunuz... buradan devam ediniz...',
458
-	'login_pass2' => 'Şifre :',
459
-	'login_preferez_refuser' => '<b>Eğer çerezleri reddetmeyi tercih ediyorsanız,</b>   başka (daha az güvenli) bir bağlantı yöntemi emrinizde :',
460
-	'login_recharger' => 'sayfayı tekrar yükle',
461
-	'login_rester_identifie' => 'Bir kaç gün tanımlanmış olarak kalayım', # MODIF
462
-	'login_retour_public' => 'Kamusal siteye dön',
463
-	'login_retour_site' => 'Kamusal siteye dön',
464
-	'login_retoursitepublic' => 'Kamusal siteye dön',
465
-	'login_sinscrire' => 'Kayıt ol', # MODIF
466
-	'login_test_navigateur' => 'Gezgini dene / Tekrar bağlan',
467
-	'login_verifiez_navigateur' => '(Ancak gezginin şifrenizi belleğe almadığından emin olunuz...)',
456
+    'login_nouvelle_tentative' => 'Yeni deneme',
457
+    'login_par_ici' => 'Kayıt oldunuz... buradan devam ediniz...',
458
+    'login_pass2' => 'Şifre :',
459
+    'login_preferez_refuser' => '<b>Eğer çerezleri reddetmeyi tercih ediyorsanız,</b>   başka (daha az güvenli) bir bağlantı yöntemi emrinizde :',
460
+    'login_recharger' => 'sayfayı tekrar yükle',
461
+    'login_rester_identifie' => 'Bir kaç gün tanımlanmış olarak kalayım', # MODIF
462
+    'login_retour_public' => 'Kamusal siteye dön',
463
+    'login_retour_site' => 'Kamusal siteye dön',
464
+    'login_retoursitepublic' => 'Kamusal siteye dön',
465
+    'login_sinscrire' => 'Kayıt ol', # MODIF
466
+    'login_test_navigateur' => 'Gezgini dene / Tekrar bağlan',
467
+    'login_verifiez_navigateur' => '(Ancak gezginin şifrenizi belleğe almadığından emin olunuz...)',
468 468
 
469
-	// M
470
-	'masquer_colonne' => 'Bu sütunu sakla',
471
-	'masquer_trad' => 'çevirileri gizle',
472
-	'module_fichiers_langues' => 'Dil dosyaları',
469
+    // M
470
+    'masquer_colonne' => 'Bu sütunu sakla',
471
+    'masquer_trad' => 'çevirileri gizle',
472
+    'module_fichiers_langues' => 'Dil dosyaları',
473 473
 
474
-	// N
475
-	'navigateur_pas_redirige' => 'Gezgininiz yeniden yönlenmiyorsa, devam etmek için buraya tıklayınız.',
476
-	'numero' => 'Numara',
474
+    // N
475
+    'navigateur_pas_redirige' => 'Gezgininiz yeniden yönlenmiyorsa, devam etmek için buraya tıklayınız.',
476
+    'numero' => 'Numara',
477 477
 
478
-	// O
479
-	'occurence' => 'Tekrarlanış',
480
-	'onglet_affacer_base' => 'Veritabanını sil',
481
-	'onglet_auteur' => 'Yazar',
482
-	'onglet_contenu_site' => 'Sitenin içeriği',
483
-	'onglet_evolution_visite_mod' => 'Ziyaretlerin gelişimi',
484
-	'onglet_fonctions_avances' => 'Gelişmiş işlevler',
485
-	'onglet_informations_personnelles' => 'Kişisel bilgi',
486
-	'onglet_interactivite' => 'Etkileşim özelliği',
487
-	'onglet_messagerie' => 'İleti sistemi',
488
-	'onglet_repartition_rubrique' => 'Bölümlere göre dağılım',
489
-	'onglet_save_restaur_base' => 'Veritabanını yedekle / Geri yükle',
490
-	'onglet_vider_cache' => 'Önbelleği boşalt',
478
+    // O
479
+    'occurence' => 'Tekrarlanış',
480
+    'onglet_affacer_base' => 'Veritabanını sil',
481
+    'onglet_auteur' => 'Yazar',
482
+    'onglet_contenu_site' => 'Sitenin içeriği',
483
+    'onglet_evolution_visite_mod' => 'Ziyaretlerin gelişimi',
484
+    'onglet_fonctions_avances' => 'Gelişmiş işlevler',
485
+    'onglet_informations_personnelles' => 'Kişisel bilgi',
486
+    'onglet_interactivite' => 'Etkileşim özelliği',
487
+    'onglet_messagerie' => 'İleti sistemi',
488
+    'onglet_repartition_rubrique' => 'Bölümlere göre dağılım',
489
+    'onglet_save_restaur_base' => 'Veritabanını yedekle / Geri yükle',
490
+    'onglet_vider_cache' => 'Önbelleği boşalt',
491 491
 
492
-	// P
493
-	'pass_choix_pass' => 'Lütfen yeni şifrenizi seçiniz :',
494
-	'pass_erreur' => 'Hata',
495
-	'pass_erreur_acces_refuse' => '<b>Hata : </b> artık bu siteye erişiminiz yoktur.',
496
-	'pass_erreur_code_inconnu' => 'Hata : bu şifre bu siteye erişimi olan hiç bir ziyaretçiye uymuyor.',
497
-	'pass_erreur_non_enregistre' => 'Hata : @email_oubli@ adresi bu siteye kayıtlı değil. ',
498
-	'pass_erreur_non_valide' => 'Hata :  @email_oubli@ e-posta adresi geçerli değil !',
499
-	'pass_erreur_probleme_technique' => 'Hata : teknik bir sorundan ötürü e-posta gönderilemiyor.',
500
-	'pass_espace_prive_bla' => 'Bu sitenin özel alanı,
492
+    // P
493
+    'pass_choix_pass' => 'Lütfen yeni şifrenizi seçiniz :',
494
+    'pass_erreur' => 'Hata',
495
+    'pass_erreur_acces_refuse' => '<b>Hata : </b> artık bu siteye erişiminiz yoktur.',
496
+    'pass_erreur_code_inconnu' => 'Hata : bu şifre bu siteye erişimi olan hiç bir ziyaretçiye uymuyor.',
497
+    'pass_erreur_non_enregistre' => 'Hata : @email_oubli@ adresi bu siteye kayıtlı değil. ',
498
+    'pass_erreur_non_valide' => 'Hata :  @email_oubli@ e-posta adresi geçerli değil !',
499
+    'pass_erreur_probleme_technique' => 'Hata : teknik bir sorundan ötürü e-posta gönderilemiyor.',
500
+    'pass_espace_prive_bla' => 'Bu sitenin özel alanı,
501 501
     kayıtlı ziyaretçilere açıktır. Kayıt olduktan sonra,
502 502
     yazılmakta olan makalelere bakabilir, makale önerebilir 
503 503
   ve tüm forumlara katılabilirsiniz. ',
504
-	'pass_forum_bla' => 'Kayıtlı ziyaretçilere ayrılmış bir foruma
504
+    'pass_forum_bla' => 'Kayıtlı ziyaretçilere ayrılmış bir foruma
505 505
      müdahale etmek istediniz. ',
506
-	'pass_indiquez_cidessous' => 'Daha önce kayıt olduğunuz e-posta adresinizi aşağıya belirtiniz.
506
+    'pass_indiquez_cidessous' => 'Daha önce kayıt olduğunuz e-posta adresinizi aşağıya belirtiniz.
507 507
   Tekrar erişebilmek için gereken işlemi 
508 508
   belirten 
509 509
   bir e-posta alacaksınız. ',
510
-	'pass_mail_passcookie' => '(Bu otomatik bir iletidir)
510
+    'pass_mail_passcookie' => '(Bu otomatik bir iletidir)
511 511
 
512 512
   @nom_site_spip@ (@adresse_site@)
513 513
 
@@ -517,125 +517,125 @@  discard block
 block discarded – undo
517 517
  @sendcookie@
518 518
  O zaman yeni bir şifre girebilecek
519 519
  ve tekrar siteye bağlanabileceksiniz.  ',
520
-	'pass_mot_oublie' => 'Şifreyi unuttum',
521
-	'pass_nouveau_enregistre' => 'Yeni şifreniz kaydedildi.',
522
-	'pass_nouveau_pass' => 'Yeni şifre',
523
-	'pass_ok' => 'OK',
524
-	'pass_oubli_mot' => 'Şifremi unuttum',
525
-	'pass_quitter_fenetre' => 'Bu pencereyi terk et',
526
-	'pass_rappel_login' => 'Hatırlatma : kullanıcı isminiz « @login@ » dır.',
527
-	'pass_recevoir_mail' => 'Siteye erişiminizi yeniden nasıl kazanabileceğinizi belirten bir e-posta alacaksınız. ', # MODIF
528
-	'pass_retour_public' => 'Kamu sitesine dönüş',
529
-	'pass_rien_a_faire_ici' => 'Burada yapılacak bir şey yok.',
530
-	'pass_vousinscrire' => 'Bu siteye kaydolmanız',
531
-	'precedent' => 'önceki',
532
-	'previsualisation' => 'Öngörüntüle',
533
-	'previsualiser' => 'Öngörüntüle',
520
+    'pass_mot_oublie' => 'Şifreyi unuttum',
521
+    'pass_nouveau_enregistre' => 'Yeni şifreniz kaydedildi.',
522
+    'pass_nouveau_pass' => 'Yeni şifre',
523
+    'pass_ok' => 'OK',
524
+    'pass_oubli_mot' => 'Şifremi unuttum',
525
+    'pass_quitter_fenetre' => 'Bu pencereyi terk et',
526
+    'pass_rappel_login' => 'Hatırlatma : kullanıcı isminiz « @login@ » dır.',
527
+    'pass_recevoir_mail' => 'Siteye erişiminizi yeniden nasıl kazanabileceğinizi belirten bir e-posta alacaksınız. ', # MODIF
528
+    'pass_retour_public' => 'Kamu sitesine dönüş',
529
+    'pass_rien_a_faire_ici' => 'Burada yapılacak bir şey yok.',
530
+    'pass_vousinscrire' => 'Bu siteye kaydolmanız',
531
+    'precedent' => 'önceki',
532
+    'previsualisation' => 'Öngörüntüle',
533
+    'previsualiser' => 'Öngörüntüle',
534 534
 
535
-	// R
536
-	'retour' => 'Geri dön',
535
+    // R
536
+    'retour' => 'Geri dön',
537 537
 
538
-	// S
539
-	'spip_conforme_dtd' => 'SPIP bu belgeyi DOCTYPE’e uygun buluyor :',
540
-	'squelette' => 'iskelet',
541
-	'squelette_inclus_ligne' => 'iskelet eklendi, satır',
542
-	'squelette_ligne' => 'iskelet, satır',
543
-	'stats_visites_et_popularite' => '@visites@ ziyaret; popülerlik : @popularite@',
544
-	'suivant' => 'sonraki',
538
+    // S
539
+    'spip_conforme_dtd' => 'SPIP bu belgeyi DOCTYPE’e uygun buluyor :',
540
+    'squelette' => 'iskelet',
541
+    'squelette_inclus_ligne' => 'iskelet eklendi, satır',
542
+    'squelette_ligne' => 'iskelet, satır',
543
+    'stats_visites_et_popularite' => '@visites@ ziyaret; popülerlik : @popularite@',
544
+    'suivant' => 'sonraki',
545 545
 
546
-	// T
547
-	'taille_ko' => '@taille@ kb',
548
-	'taille_mo' => '@taille@ Mb',
549
-	'taille_octets' => '@taille@ bayt',
550
-	'taille_octets_bi' => '@taille@ bayt',
551
-	'texte_actualite_site_1' => 'Arayüze alışınca «',
552
-	'texte_actualite_site_2' => 'Tüm arayüz',
553
-	'texte_actualite_site_3' => '»’e tıklayarak daha fazla seçeneğe ulaşabilirsiniz.',
554
-	'texte_creation_automatique_vignette' => 'Bu sitede öngörüntüleme ikonlarının otomatik olarak yaratılması işlemi etkinleştirişmiştir. Eğer bu formdan hareket ederek @gd_formats@, formatlı resimler yüklerseniz, bunlara, en fazla @taille_preview@ piksel boyutunda bir ikon eşlik edecektir.',
555
-	'texte_documents_associes' => 'Aşağıdaki belgeler makale ile bağlantılı olup,
546
+    // T
547
+    'taille_ko' => '@taille@ kb',
548
+    'taille_mo' => '@taille@ Mb',
549
+    'taille_octets' => '@taille@ bayt',
550
+    'taille_octets_bi' => '@taille@ bayt',
551
+    'texte_actualite_site_1' => 'Arayüze alışınca «',
552
+    'texte_actualite_site_2' => 'Tüm arayüz',
553
+    'texte_actualite_site_3' => '»’e tıklayarak daha fazla seçeneğe ulaşabilirsiniz.',
554
+    'texte_creation_automatique_vignette' => 'Bu sitede öngörüntüleme ikonlarının otomatik olarak yaratılması işlemi etkinleştirişmiştir. Eğer bu formdan hareket ederek @gd_formats@, formatlı resimler yüklerseniz, bunlara, en fazla @taille_preview@ piksel boyutunda bir ikon eşlik edecektir.',
555
+    'texte_documents_associes' => 'Aşağıdaki belgeler makale ile bağlantılı olup,
556 556
     doğrudan makalenin içine dahil edilmemiştir. Kamu sitesinin sayfa düzenine göre,
557 557
     sonradan belge eki olarak görülebilir.',
558
-	'texte_erreur_mise_niveau_base' => 'Güncelleme sırasında veritabanı hatası. @fichier@ resmi ulaşmadı (@id_article@ makalesi). Bu referansı kaydedip güncelemeyi tekrar deneyiniz ve resimlerin makalelerde görüldüğünden emin olunuz. ',
559
-	'texte_erreur_visiteur' => 'Özel alana, girişe izin vermeyen bir kullanıcı ismiyle erişmeyi denediniz.',
560
-	'texte_inc_auth_1' => '<b>@auth_login@</b> kullanıcı ismini girdiniz ancak veritabanında bu kullanıcı ismi yok/artık yok. Lütfen şunu deneyiniz',
561
-	'texte_inc_auth_2' => 'gezgininizi kapatıp tekrar çalıştırınız ve ',
562
-	'texte_inc_auth_3' => 'tekrar bağlanınız.',
563
-	'texte_inc_config' => 'Bu sayfalarda yapılan değişiklikler sitenizin işleyişi üzerinde büyük ölçüde etkilidir. SPIP sisteminin işleyişine aşina olmadığınız sürece müdahale etmemenizi öneririz.  <br /><br /><b>Daha genel bir ifadeyle söylemek gerekirse bu sayfalarla ilgilenme işini sitenin Ağ Yöneticisi’ne bırakmanızı özellikle öneririz.</b>',
564
-	'texte_inc_meta_1' => 'Sistem <code>@fichier@</code> dosyasının yazılması sırasında bir hata ile karşılaştı. Lütfen, site yöneticisi olarak ',
565
-	'texte_inc_meta_2' => '(<code>ecrire/data/</code> dizinindeki) ',
566
-	'texte_inc_meta_3' => '<code>@repertoire@</code> dizinindeki yazma haklarını kontrol ediniz. ',
567
-	'texte_statut_en_cours_redaction' => 'Yazılıyor',
568
-	'texte_statut_poubelle' => 'Çöpe atıldı',
569
-	'texte_statut_propose_evaluation' => 'Değerlendirmeye alındı',
570
-	'texte_statut_publie' => 'Çevrimiçi yayınlandı',
571
-	'texte_statut_refuse' => 'Reddedildi',
572
-	'titre_ajouter_mot_cle' => 'BİR ANAHTAR-SÖZCÜK EKLE :',
573
-	'titre_cadre_raccourcis' => 'KISA YOLLAR :',
574
-	'titre_changer_couleur_interface' => 'Arayüz rengini değiştir',
575
-	'titre_image_admin_article' => 'Bu makaleyi yönetebilirsiniz',
576
-	'titre_image_administrateur' => 'Yönetici',
577
-	'titre_image_aide' => 'Bu eleman hakkında yardım',
578
-	'titre_image_auteur_supprime' => 'Silinmiş yazar',
579
-	'titre_image_redacteur' => 'Erişim hakkı olmayan yazar',
580
-	'titre_image_redacteur_02' => 'Yazar',
581
-	'titre_image_visiteur' => 'Ziyaretçi',
582
-	'titre_joindre_document' => 'BİR BELGE EKLE',
583
-	'titre_mots_cles' => 'ANAHTAR SÖZCÜKLER',
584
-	'titre_probleme_technique' => 'Dikkat : teknik bir sorun (SQL hizmet birimi) sitenin bu bölümüne erişimi engelliyor. Anlayışınız için teşekkürler.',
585
-	'titre_publier_document' => 'BU BÖLÜM ALTINDA BİR BELGE YAYINLA',
586
-	'titre_signatures_attente' => 'Onay bekleyen imzalar',
587
-	'titre_signatures_confirmees' => 'Onaylanmış imzalar',
588
-	'titre_statistiques' => 'Site istatistikleri',
589
-	'titre_titre_document' => 'Belge başlığı :',
590
-	'todo' => 'gelecek',
591
-	'trad_reference' => '(referans makale)', # MODIF
558
+    'texte_erreur_mise_niveau_base' => 'Güncelleme sırasında veritabanı hatası. @fichier@ resmi ulaşmadı (@id_article@ makalesi). Bu referansı kaydedip güncelemeyi tekrar deneyiniz ve resimlerin makalelerde görüldüğünden emin olunuz. ',
559
+    'texte_erreur_visiteur' => 'Özel alana, girişe izin vermeyen bir kullanıcı ismiyle erişmeyi denediniz.',
560
+    'texte_inc_auth_1' => '<b>@auth_login@</b> kullanıcı ismini girdiniz ancak veritabanında bu kullanıcı ismi yok/artık yok. Lütfen şunu deneyiniz',
561
+    'texte_inc_auth_2' => 'gezgininizi kapatıp tekrar çalıştırınız ve ',
562
+    'texte_inc_auth_3' => 'tekrar bağlanınız.',
563
+    'texte_inc_config' => 'Bu sayfalarda yapılan değişiklikler sitenizin işleyişi üzerinde büyük ölçüde etkilidir. SPIP sisteminin işleyişine aşina olmadığınız sürece müdahale etmemenizi öneririz.  <br /><br /><b>Daha genel bir ifadeyle söylemek gerekirse bu sayfalarla ilgilenme işini sitenin Ağ Yöneticisi’ne bırakmanızı özellikle öneririz.</b>',
564
+    'texte_inc_meta_1' => 'Sistem <code>@fichier@</code> dosyasının yazılması sırasında bir hata ile karşılaştı. Lütfen, site yöneticisi olarak ',
565
+    'texte_inc_meta_2' => '(<code>ecrire/data/</code> dizinindeki) ',
566
+    'texte_inc_meta_3' => '<code>@repertoire@</code> dizinindeki yazma haklarını kontrol ediniz. ',
567
+    'texte_statut_en_cours_redaction' => 'Yazılıyor',
568
+    'texte_statut_poubelle' => 'Çöpe atıldı',
569
+    'texte_statut_propose_evaluation' => 'Değerlendirmeye alındı',
570
+    'texte_statut_publie' => 'Çevrimiçi yayınlandı',
571
+    'texte_statut_refuse' => 'Reddedildi',
572
+    'titre_ajouter_mot_cle' => 'BİR ANAHTAR-SÖZCÜK EKLE :',
573
+    'titre_cadre_raccourcis' => 'KISA YOLLAR :',
574
+    'titre_changer_couleur_interface' => 'Arayüz rengini değiştir',
575
+    'titre_image_admin_article' => 'Bu makaleyi yönetebilirsiniz',
576
+    'titre_image_administrateur' => 'Yönetici',
577
+    'titre_image_aide' => 'Bu eleman hakkında yardım',
578
+    'titre_image_auteur_supprime' => 'Silinmiş yazar',
579
+    'titre_image_redacteur' => 'Erişim hakkı olmayan yazar',
580
+    'titre_image_redacteur_02' => 'Yazar',
581
+    'titre_image_visiteur' => 'Ziyaretçi',
582
+    'titre_joindre_document' => 'BİR BELGE EKLE',
583
+    'titre_mots_cles' => 'ANAHTAR SÖZCÜKLER',
584
+    'titre_probleme_technique' => 'Dikkat : teknik bir sorun (SQL hizmet birimi) sitenin bu bölümüne erişimi engelliyor. Anlayışınız için teşekkürler.',
585
+    'titre_publier_document' => 'BU BÖLÜM ALTINDA BİR BELGE YAYINLA',
586
+    'titre_signatures_attente' => 'Onay bekleyen imzalar',
587
+    'titre_signatures_confirmees' => 'Onaylanmış imzalar',
588
+    'titre_statistiques' => 'Site istatistikleri',
589
+    'titre_titre_document' => 'Belge başlığı :',
590
+    'todo' => 'gelecek',
591
+    'trad_reference' => '(referans makale)', # MODIF
592 592
 
593
-	// Z
594
-	'zbug_balise_b_aval' => ' : B etiketinde sorun var',
595
-	'zbug_balise_inexistante' => 'hata @from@: #@balise@ komutu mevcut değil', # MODIF
596
-	'zbug_balise_sans_argument' => '@balise@ komutunda argüman eksik',
597
-	'zbug_boucle' => 'döngü',
598
-	'zbug_boucle_recursive_undef' => 'tanımsız tekrarlı döngü', # MODIF
599
-	'zbug_calcul' => 'hesaplama',
600
-	'zbug_champ_hors_boucle' => '@champ@ alanı döngü dışında',
601
-	'zbug_champ_hors_motif' => '@champ@ alanı @motif@ döngüsü dışında ', # MODIF
602
-	'zbug_code' => 'kod',
603
-	'zbug_critere_inconnu' => 'tanımsız kriter @critere@', # MODIF
604
-	'zbug_distant_interdit' => 'yasaklanmış dış veri dosyası', # MODIF
605
-	'zbug_doublon_table_sans_cle_primaire' => 'endekssiz bir tabloda tekrarlar var', # MODIF
606
-	'zbug_doublon_table_sans_index' => 'endekslenmemiş bir tabloda tekrarlanan bilgiler', # MODIF
607
-	'zbug_erreur_boucle_double' => 'DÖNGÜ@id@: çift tanımlı', # MODIF
608
-	'zbug_erreur_boucle_fermant' => 'DÖNGÜ@id@: kapatma etiketi eksik', # MODIF
609
-	'zbug_erreur_boucle_syntaxe' => 'Döngü tümcesi hatalı', # MODIF
610
-	'zbug_erreur_compilation' => 'derleme hatası',
611
-	'zbug_erreur_execution_page' => 'sayfa işletilirken hata oluştu', # MODIF
612
-	'zbug_erreur_filtre' => 'Hata : <b>« @filtre@ »</b> filtresi tanımsız', # MODIF
613
-	'zbug_erreur_meme_parent' => '{meme_parent} sadece (FORUMS) veya  (RUBRIQUES) için uygulanabilir', # MODIF
614
-	'zbug_erreur_squelette' => 'İskelette hata var',
615
-	'zbug_hors_compilation' => 'Derleme Dışı',
616
-	'zbug_info_erreur_squelette' => 'Sitede hata var',
617
-	'zbug_inversion_ordre_inexistant' => 'olmayan bir sıralama ters çevrilemez', # MODIF
618
-	'zbug_pagination_sans_critere' => 'kritersiz veya kendini çağıran döngüde kullanılan #PAGINATION {pagination} ', # MODIF
619
-	'zbug_parametres_inclus_incorrects' => 'Ekleme parametreleri hatalı', # MODIF
620
-	'zbug_profile' => 'Hesaplama süresi : @time@',
621
-	'zbug_resultat' => 'sonuç',
622
-	'zbug_serveur_indefini' => 'SQL hizmet birimi tanımsız', # MODIF
623
-	'zbug_statistiques' => 'Süreye göre sınıflanmış SQL istekleri istatistikleri',
624
-	'zbug_table_inconnue' => '« @table@ » SQL tablosu tanımsız',
625
-	'zxml_connus_attributs' => 'bilinen öznitelikler',
626
-	'zxml_de' => 'nın / nin',
627
-	'zxml_inconnu_attribut' => 'bilinmeyen öznitelik',
628
-	'zxml_inconnu_balise' => 'bilinmeyen etiket',
629
-	'zxml_inconnu_entite' => 'bilinmeyen madde',
630
-	'zxml_inconnu_id' => 'bilinmeyen ID',
631
-	'zxml_mais_de' => 'ama nın / nin',
632
-	'zxml_non_conforme' => 'amaca uygun değil',
633
-	'zxml_non_fils' => 'bir alt maddesi değil',
634
-	'zxml_nonvide_balise' => 'boş olmayan etiket',
635
-	'zxml_obligatoire_attribut' => 'zorunlu ama belirtilmemiş etiket',
636
-	'zxml_succession_fils_incorrecte' => 'alt maddelerin peşpeşe gelmesi hatalı',
637
-	'zxml_survoler' => 'doğruları görmek için üzerindne geçmek ???',
638
-	'zxml_valeur_attribut' => 'özniteliğin değeri',
639
-	'zxml_vide_balise' => 'boş etiket',
640
-	'zxml_vu' => 'önceden görülen'
593
+    // Z
594
+    'zbug_balise_b_aval' => ' : B etiketinde sorun var',
595
+    'zbug_balise_inexistante' => 'hata @from@: #@balise@ komutu mevcut değil', # MODIF
596
+    'zbug_balise_sans_argument' => '@balise@ komutunda argüman eksik',
597
+    'zbug_boucle' => 'döngü',
598
+    'zbug_boucle_recursive_undef' => 'tanımsız tekrarlı döngü', # MODIF
599
+    'zbug_calcul' => 'hesaplama',
600
+    'zbug_champ_hors_boucle' => '@champ@ alanı döngü dışında',
601
+    'zbug_champ_hors_motif' => '@champ@ alanı @motif@ döngüsü dışında ', # MODIF
602
+    'zbug_code' => 'kod',
603
+    'zbug_critere_inconnu' => 'tanımsız kriter @critere@', # MODIF
604
+    'zbug_distant_interdit' => 'yasaklanmış dış veri dosyası', # MODIF
605
+    'zbug_doublon_table_sans_cle_primaire' => 'endekssiz bir tabloda tekrarlar var', # MODIF
606
+    'zbug_doublon_table_sans_index' => 'endekslenmemiş bir tabloda tekrarlanan bilgiler', # MODIF
607
+    'zbug_erreur_boucle_double' => 'DÖNGÜ@id@: çift tanımlı', # MODIF
608
+    'zbug_erreur_boucle_fermant' => 'DÖNGÜ@id@: kapatma etiketi eksik', # MODIF
609
+    'zbug_erreur_boucle_syntaxe' => 'Döngü tümcesi hatalı', # MODIF
610
+    'zbug_erreur_compilation' => 'derleme hatası',
611
+    'zbug_erreur_execution_page' => 'sayfa işletilirken hata oluştu', # MODIF
612
+    'zbug_erreur_filtre' => 'Hata : <b>« @filtre@ »</b> filtresi tanımsız', # MODIF
613
+    'zbug_erreur_meme_parent' => '{meme_parent} sadece (FORUMS) veya  (RUBRIQUES) için uygulanabilir', # MODIF
614
+    'zbug_erreur_squelette' => 'İskelette hata var',
615
+    'zbug_hors_compilation' => 'Derleme Dışı',
616
+    'zbug_info_erreur_squelette' => 'Sitede hata var',
617
+    'zbug_inversion_ordre_inexistant' => 'olmayan bir sıralama ters çevrilemez', # MODIF
618
+    'zbug_pagination_sans_critere' => 'kritersiz veya kendini çağıran döngüde kullanılan #PAGINATION {pagination} ', # MODIF
619
+    'zbug_parametres_inclus_incorrects' => 'Ekleme parametreleri hatalı', # MODIF
620
+    'zbug_profile' => 'Hesaplama süresi : @time@',
621
+    'zbug_resultat' => 'sonuç',
622
+    'zbug_serveur_indefini' => 'SQL hizmet birimi tanımsız', # MODIF
623
+    'zbug_statistiques' => 'Süreye göre sınıflanmış SQL istekleri istatistikleri',
624
+    'zbug_table_inconnue' => '« @table@ » SQL tablosu tanımsız',
625
+    'zxml_connus_attributs' => 'bilinen öznitelikler',
626
+    'zxml_de' => 'nın / nin',
627
+    'zxml_inconnu_attribut' => 'bilinmeyen öznitelik',
628
+    'zxml_inconnu_balise' => 'bilinmeyen etiket',
629
+    'zxml_inconnu_entite' => 'bilinmeyen madde',
630
+    'zxml_inconnu_id' => 'bilinmeyen ID',
631
+    'zxml_mais_de' => 'ama nın / nin',
632
+    'zxml_non_conforme' => 'amaca uygun değil',
633
+    'zxml_non_fils' => 'bir alt maddesi değil',
634
+    'zxml_nonvide_balise' => 'boş olmayan etiket',
635
+    'zxml_obligatoire_attribut' => 'zorunlu ama belirtilmemiş etiket',
636
+    'zxml_succession_fils_incorrecte' => 'alt maddelerin peşpeşe gelmesi hatalı',
637
+    'zxml_survoler' => 'doğruları görmek için üzerindne geçmek ???',
638
+    'zxml_valeur_attribut' => 'özniteliğin değeri',
639
+    'zxml_vide_balise' => 'boş etiket',
640
+    'zxml_vu' => 'önceden görülen'
641 641
 );
Please login to merge, or discard this patch.
ecrire/lang/spip_pt_br.php 1 patch
Indentation   +670 added lines, -670 removed lines patch added patch discarded remove patch
@@ -4,582 +4,582 @@  discard block
 block discarded – undo
4 4
 // ** ne pas modifier le fichier **
5 5
 
6 6
 if (!defined('_ECRIRE_INC_VERSION')) {
7
-	return;
7
+    return;
8 8
 }
9 9
 
10 10
 $GLOBALS[$GLOBALS['idx_lang']] = array(
11 11
 
12
-	// A
13
-	'access_interface_graphique' => 'Voltar para a interface gráfica completa',
14
-	'access_mode_texte' => 'Exibir a interface textual simplificada',
15
-	'admin_debug' => 'depurar',
16
-	'admin_modifier_article' => 'Editar esta matéria',
17
-	'admin_modifier_auteur' => 'Editar este autor',
18
-	'admin_modifier_breve' => 'Editar esta nota',
19
-	'admin_modifier_mot' => 'Editar esta palavra-chave',
20
-	'admin_modifier_rubrique' => 'Editar esta seção',
21
-	'admin_recalculer' => 'Atualizar esta página',
22
-	'afficher_calendrier' => 'Exibir o calendário',
23
-	'afficher_trad' => 'exibir as traduções',
24
-	'alerte_maj_impossible' => '<b>Atenção!</b> A atualização da base de dados SQL para a versão @version@ não é possível, provavelmente por problema de direitos de edição na base de dados. Por favor, contate o seu provedor de hospedagem.',
25
-	'alerte_modif_info_concourante' => 'ATENÇÃO: Esta informação foi alterada por outra pessoa. O valor atual é:',
26
-	'analyse_xml' => 'Analisar XML',
27
-	'annuler' => 'Cancelar',
28
-	'antispam_champ_vide' => 'Por favor, deixe este campo vazio:',
29
-	'articles_recents' => 'Matérias mais recentes',
30
-	'attention_champ_mini_nb_caractères' => 'Atenção! Mínimo de @nb@ caracteres',
31
-	'avis_1_erreur_saisie' => 'Há um erro nos dados informados. Por favor, verifique.',
32
-	'avis_archive_incorrect' => 'a cópia de segurança não é um arquivo do SPIP',
33
-	'avis_archive_invalide' => 'a cópia de segurança não é válida',
34
-	'avis_attention' => 'ATENÇÃO!',
35
-	'avis_champ_incorrect_type_objet' => 'Nome de campo @name@ incorreto para objeto do tipo @type@',
36
-	'avis_colonne_inexistante' => 'A coluna @col@ não existe',
37
-	'avis_erreur' => 'Erro: ver abaixo',
38
-	'avis_erreur_connexion' => 'Erro de conexão',
39
-	'avis_erreur_cookie' => 'problema de cookie',
40
-	'avis_erreur_fonction_contexte' => 'Erro de programação. Esta função não deve ser chamada neste contexto.',
41
-	'avis_erreur_mysql' => 'Erro SQL',
42
-	'avis_erreur_sauvegarde' => 'Erro na cópia de segurança (@type@ @id_objet@) !',
43
-	'avis_erreur_visiteur' => 'Problema de acesso ao espaço privado',
44
-	'avis_nb_erreurs_saisie' => 'Há @nb@ erros nos dados informados. Por favor, verifique.',
12
+    // A
13
+    'access_interface_graphique' => 'Voltar para a interface gráfica completa',
14
+    'access_mode_texte' => 'Exibir a interface textual simplificada',
15
+    'admin_debug' => 'depurar',
16
+    'admin_modifier_article' => 'Editar esta matéria',
17
+    'admin_modifier_auteur' => 'Editar este autor',
18
+    'admin_modifier_breve' => 'Editar esta nota',
19
+    'admin_modifier_mot' => 'Editar esta palavra-chave',
20
+    'admin_modifier_rubrique' => 'Editar esta seção',
21
+    'admin_recalculer' => 'Atualizar esta página',
22
+    'afficher_calendrier' => 'Exibir o calendário',
23
+    'afficher_trad' => 'exibir as traduções',
24
+    'alerte_maj_impossible' => '<b>Atenção!</b> A atualização da base de dados SQL para a versão @version@ não é possível, provavelmente por problema de direitos de edição na base de dados. Por favor, contate o seu provedor de hospedagem.',
25
+    'alerte_modif_info_concourante' => 'ATENÇÃO: Esta informação foi alterada por outra pessoa. O valor atual é:',
26
+    'analyse_xml' => 'Analisar XML',
27
+    'annuler' => 'Cancelar',
28
+    'antispam_champ_vide' => 'Por favor, deixe este campo vazio:',
29
+    'articles_recents' => 'Matérias mais recentes',
30
+    'attention_champ_mini_nb_caractères' => 'Atenção! Mínimo de @nb@ caracteres',
31
+    'avis_1_erreur_saisie' => 'Há um erro nos dados informados. Por favor, verifique.',
32
+    'avis_archive_incorrect' => 'a cópia de segurança não é um arquivo do SPIP',
33
+    'avis_archive_invalide' => 'a cópia de segurança não é válida',
34
+    'avis_attention' => 'ATENÇÃO!',
35
+    'avis_champ_incorrect_type_objet' => 'Nome de campo @name@ incorreto para objeto do tipo @type@',
36
+    'avis_colonne_inexistante' => 'A coluna @col@ não existe',
37
+    'avis_erreur' => 'Erro: ver abaixo',
38
+    'avis_erreur_connexion' => 'Erro de conexão',
39
+    'avis_erreur_cookie' => 'problema de cookie',
40
+    'avis_erreur_fonction_contexte' => 'Erro de programação. Esta função não deve ser chamada neste contexto.',
41
+    'avis_erreur_mysql' => 'Erro SQL',
42
+    'avis_erreur_sauvegarde' => 'Erro na cópia de segurança (@type@ @id_objet@) !',
43
+    'avis_erreur_visiteur' => 'Problema de acesso ao espaço privado',
44
+    'avis_nb_erreurs_saisie' => 'Há @nb@ erros nos dados informados. Por favor, verifique.',
45 45
 
46
-	// B
47
-	'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave',
48
-	'barre_aide' => 'utilize os atalhos tipográficos para enriquecer o seu layout',
49
-	'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo',
50
-	'barre_eo' => 'Inserir um OE contraído',
51
-	'barre_eo_maj' => 'Inserir um OE contraído maiúsculo',
52
-	'barre_euro' => 'Inserir o símbolo € (euro)',
53
-	'barre_gras' => 'Escrever em {{negrito}}',
54
-	'barre_guillemets' => 'envolver em "aspas"',
55
-	'barre_guillemets_simples' => 'Envolver em ’plicas’',
56
-	'barre_intertitre' => 'Transformar em {{{entretítulo}}}',
57
-	'barre_italic' => 'Escrever em {itálico}',
58
-	'barre_lien' => 'Transformar em [link hipertexto->http://...]',
59
-	'barre_lien_input' => 'Informe o endereço do seu link (você pode informar um endereço web do tipo http://www.monsite/com ou simplesmente informar o número de uma matéria deste site.',
60
-	'barre_note' => 'Transformar em [[Nota de pé de página]]',
61
-	'barre_paragraphe' => 'Criar um parágrafo',
62
-	'barre_quote' => '<quote>Citar uma mensagem</quote>',
63
-	'bouton_changer' => 'Alterar',
64
-	'bouton_chercher' => 'Procurar',
65
-	'bouton_choisir' => 'Escolher',
66
-	'bouton_deplacer' => 'Deslocar',
67
-	'bouton_download' => 'Baixar',
68
-	'bouton_enregistrer' => 'Gravar',
69
-	'bouton_radio_desactiver_messagerie_interne' => 'Desativar o sistema interno de mensagens',
70
-	'bouton_radio_envoi_annonces' => 'Enviar os avisos editoriais',
71
-	'bouton_radio_non_envoi_annonces' => 'Não enviar os avisos',
72
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista de novidades',
73
-	'bouton_recharger_page' => 'atualizar esta página',
74
-	'bouton_telecharger' => 'Transferir',
75
-	'bouton_upload' => 'Upload',
76
-	'bouton_valider' => 'Validar',
46
+    // B
47
+    'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave',
48
+    'barre_aide' => 'utilize os atalhos tipográficos para enriquecer o seu layout',
49
+    'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo',
50
+    'barre_eo' => 'Inserir um OE contraído',
51
+    'barre_eo_maj' => 'Inserir um OE contraído maiúsculo',
52
+    'barre_euro' => 'Inserir o símbolo € (euro)',
53
+    'barre_gras' => 'Escrever em {{negrito}}',
54
+    'barre_guillemets' => 'envolver em "aspas"',
55
+    'barre_guillemets_simples' => 'Envolver em ’plicas’',
56
+    'barre_intertitre' => 'Transformar em {{{entretítulo}}}',
57
+    'barre_italic' => 'Escrever em {itálico}',
58
+    'barre_lien' => 'Transformar em [link hipertexto->http://...]',
59
+    'barre_lien_input' => 'Informe o endereço do seu link (você pode informar um endereço web do tipo http://www.monsite/com ou simplesmente informar o número de uma matéria deste site.',
60
+    'barre_note' => 'Transformar em [[Nota de pé de página]]',
61
+    'barre_paragraphe' => 'Criar um parágrafo',
62
+    'barre_quote' => '<quote>Citar uma mensagem</quote>',
63
+    'bouton_changer' => 'Alterar',
64
+    'bouton_chercher' => 'Procurar',
65
+    'bouton_choisir' => 'Escolher',
66
+    'bouton_deplacer' => 'Deslocar',
67
+    'bouton_download' => 'Baixar',
68
+    'bouton_enregistrer' => 'Gravar',
69
+    'bouton_radio_desactiver_messagerie_interne' => 'Desativar o sistema interno de mensagens',
70
+    'bouton_radio_envoi_annonces' => 'Enviar os avisos editoriais',
71
+    'bouton_radio_non_envoi_annonces' => 'Não enviar os avisos',
72
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista de novidades',
73
+    'bouton_recharger_page' => 'atualizar esta página',
74
+    'bouton_telecharger' => 'Transferir',
75
+    'bouton_upload' => 'Upload',
76
+    'bouton_valider' => 'Validar',
77 77
 
78
-	// C
79
-	'cal_apresmidi' => 'tarde',
80
-	'cal_jour_entier' => 'dia todo',
81
-	'cal_matin' => 'manhã',
82
-	'cal_par_jour' => 'calendário por dia',
83
-	'cal_par_mois' => 'calendário por mês',
84
-	'cal_par_semaine' => 'calendário por semana',
85
-	'choix_couleur_interface' => 'côr',
86
-	'choix_interface' => 'escolha da interface',
87
-	'colonne' => 'Coluna',
88
-	'confirm_changer_statut' => 'Atenção, você solicitou a alteração de status deste elemento. Deseja continuar?',
89
-	'correcte' => 'correta',
78
+    // C
79
+    'cal_apresmidi' => 'tarde',
80
+    'cal_jour_entier' => 'dia todo',
81
+    'cal_matin' => 'manhã',
82
+    'cal_par_jour' => 'calendário por dia',
83
+    'cal_par_mois' => 'calendário por mês',
84
+    'cal_par_semaine' => 'calendário por semana',
85
+    'choix_couleur_interface' => 'côr',
86
+    'choix_interface' => 'escolha da interface',
87
+    'colonne' => 'Coluna',
88
+    'confirm_changer_statut' => 'Atenção, você solicitou a alteração de status deste elemento. Deseja continuar?',
89
+    'correcte' => 'correta',
90 90
 
91
-	// D
92
-	'date_aujourdhui' => 'hoje',
93
-	'date_avant_jc' => 'a.C.',
94
-	'date_dans' => 'entre @delai@',
95
-	'date_de_mois_1' => '@j@ de @nommois@',
96
-	'date_de_mois_10' => '@j@ de @nommois@',
97
-	'date_de_mois_11' => '@j@ de @nommois@',
98
-	'date_de_mois_12' => '@j@ de @nommois@',
99
-	'date_de_mois_2' => '@j@ de @nommois@',
100
-	'date_de_mois_3' => '@j@ de @nommois@',
101
-	'date_de_mois_4' => '@j@ de @nommois@',
102
-	'date_de_mois_5' => '@j@ de @nommois@',
103
-	'date_de_mois_6' => '@j@ de @nommois@',
104
-	'date_de_mois_7' => '@j@ de @nommois@',
105
-	'date_de_mois_8' => '@j@ de @nommois@',
106
-	'date_de_mois_9' => '@j@ de @nommois@',
107
-	'date_demain' => 'amanhã',
108
-	'date_fmt_heures_minutes' => '@h@h@m@min',
109
-	'date_fmt_heures_minutes_court' => '@h@h@m@',
110
-	'date_fmt_jour' => '@nomjour@ @jour@',
111
-	'date_fmt_jour_heure' => '@jour@ - @heure@',
112
-	'date_fmt_jour_heure_debut_fin' => 'dia @jour@ de @heure_debut@ a @heure_fin@',
113
-	'date_fmt_jour_heure_debut_fin_abbr' => 'dia @dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@',
114
-	'date_fmt_jour_mois' => '@jour@ de @nommois@',
115
-	'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@',
116
-	'date_fmt_mois_annee' => '@nommois@ de @annee@',
117
-	'date_fmt_nomjour' => '@nomjour@ @date@',
118
-	'date_fmt_nomjour_date' => '@nomjour@ de @date@',
119
-	'date_fmt_periode' => 'De @date_debut@ a @date_fin@',
120
-	'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@',
121
-	'date_fmt_periode_from' => 'De',
122
-	'date_fmt_periode_to' => 'para',
123
-	'date_fmt_saison_annee' => '@saison@ @annee@',
124
-	'date_heures' => 'horas',
125
-	'date_hier' => 'ontem',
126
-	'date_il_y_a' => 'há @delai@',
127
-	'date_jnum1' => '1º',
128
-	'date_jnum10' => '10',
129
-	'date_jnum11' => '11',
130
-	'date_jnum12' => '12',
131
-	'date_jnum13' => '13',
132
-	'date_jnum14' => '14',
133
-	'date_jnum15' => '15',
134
-	'date_jnum16' => '16',
135
-	'date_jnum17' => '17',
136
-	'date_jnum18' => '18',
137
-	'date_jnum19' => '19',
138
-	'date_jnum2' => '2',
139
-	'date_jnum20' => '20',
140
-	'date_jnum21' => '21',
141
-	'date_jnum22' => '22',
142
-	'date_jnum23' => '23',
143
-	'date_jnum24' => '24',
144
-	'date_jnum25' => '25',
145
-	'date_jnum26' => '26',
146
-	'date_jnum27' => '27',
147
-	'date_jnum28' => '28',
148
-	'date_jnum29' => '29',
149
-	'date_jnum3' => '3',
150
-	'date_jnum30' => '30',
151
-	'date_jnum31' => '31',
152
-	'date_jnum4' => '4',
153
-	'date_jnum5' => '5',
154
-	'date_jnum6' => '6',
155
-	'date_jnum7' => '7',
156
-	'date_jnum8' => '8',
157
-	'date_jnum9' => '9',
158
-	'date_jour_1' => 'domingo',
159
-	'date_jour_1_abbr' => 'dom.',
160
-	'date_jour_1_initiale' => 'd.',
161
-	'date_jour_2' => 'segunda-feira',
162
-	'date_jour_2_abbr' => 'seg.',
163
-	'date_jour_2_initiale' => 's.',
164
-	'date_jour_3' => 'terça-feira',
165
-	'date_jour_3_abbr' => 'ter.',
166
-	'date_jour_3_initiale' => 't.',
167
-	'date_jour_4' => 'quarta-feira',
168
-	'date_jour_4_abbr' => 'quar.',
169
-	'date_jour_4_initiale' => 'q.',
170
-	'date_jour_5' => 'quinta-feira',
171
-	'date_jour_5_abbr' => 'quin.',
172
-	'date_jour_5_initiale' => 'q.',
173
-	'date_jour_6' => 'sexta-feira',
174
-	'date_jour_6_abbr' => 'sex.',
175
-	'date_jour_6_initiale' => 's.',
176
-	'date_jour_7' => 'sábado',
177
-	'date_jour_7_abbr' => 'sáb.',
178
-	'date_jour_7_initiale' => 's.',
179
-	'date_jours' => 'dias',
180
-	'date_minutes' => 'minutos',
181
-	'date_mois' => 'meses',
182
-	'date_mois_1' => 'janeiro',
183
-	'date_mois_10' => 'outubro',
184
-	'date_mois_10_abbr' => 'out.',
185
-	'date_mois_11' => 'novembro',
186
-	'date_mois_11_abbr' => 'nov.',
187
-	'date_mois_12' => 'dezembro',
188
-	'date_mois_12_abbr' => 'dez.',
189
-	'date_mois_1_abbr' => 'jan.',
190
-	'date_mois_2' => 'fevereiro',
191
-	'date_mois_2_abbr' => 'fev.',
192
-	'date_mois_3' => 'março',
193
-	'date_mois_3_abbr' => 'mar.',
194
-	'date_mois_4' => 'abril',
195
-	'date_mois_4_abbr' => 'abr.',
196
-	'date_mois_5' => 'maio',
197
-	'date_mois_5_abbr' => 'mai.',
198
-	'date_mois_6' => 'junho',
199
-	'date_mois_6_abbr' => 'jun.',
200
-	'date_mois_7' => 'julho',
201
-	'date_mois_7_abbr' => 'jul.',
202
-	'date_mois_8' => 'agosto',
203
-	'date_mois_8_abbr' => 'ago.',
204
-	'date_mois_9' => 'setembro',
205
-	'date_mois_9_abbr' => 'set.',
206
-	'date_saison_1' => 'inverno',
207
-	'date_saison_2' => 'primavera',
208
-	'date_saison_3' => 'verão',
209
-	'date_saison_4' => 'outono',
210
-	'date_secondes' => 'segundos',
211
-	'date_semaines' => 'semanas',
212
-	'date_un_mois' => 'mês',
213
-	'date_une_heure' => 'hora',
214
-	'date_une_minute' => 'minuto',
215
-	'date_une_seconde' => 'segundo',
216
-	'date_une_semaine' => 'semana',
217
-	'dirs_commencer' => 'Para começar realmente a instalação',
218
-	'dirs_preliminaire' => 'Preliminar: <b>Configurar os direitos de acesso</b>',
219
-	'dirs_probleme_droits' => 'Problema com as permissões de acesso',
220
-	'dirs_repertoires_absents' => '<p><b>Os diretórios a seguir não foram encontrados:</b></p><ul>@bad_dirs@.</ul>
91
+    // D
92
+    'date_aujourdhui' => 'hoje',
93
+    'date_avant_jc' => 'a.C.',
94
+    'date_dans' => 'entre @delai@',
95
+    'date_de_mois_1' => '@j@ de @nommois@',
96
+    'date_de_mois_10' => '@j@ de @nommois@',
97
+    'date_de_mois_11' => '@j@ de @nommois@',
98
+    'date_de_mois_12' => '@j@ de @nommois@',
99
+    'date_de_mois_2' => '@j@ de @nommois@',
100
+    'date_de_mois_3' => '@j@ de @nommois@',
101
+    'date_de_mois_4' => '@j@ de @nommois@',
102
+    'date_de_mois_5' => '@j@ de @nommois@',
103
+    'date_de_mois_6' => '@j@ de @nommois@',
104
+    'date_de_mois_7' => '@j@ de @nommois@',
105
+    'date_de_mois_8' => '@j@ de @nommois@',
106
+    'date_de_mois_9' => '@j@ de @nommois@',
107
+    'date_demain' => 'amanhã',
108
+    'date_fmt_heures_minutes' => '@h@h@m@min',
109
+    'date_fmt_heures_minutes_court' => '@h@h@m@',
110
+    'date_fmt_jour' => '@nomjour@ @jour@',
111
+    'date_fmt_jour_heure' => '@jour@ - @heure@',
112
+    'date_fmt_jour_heure_debut_fin' => 'dia @jour@ de @heure_debut@ a @heure_fin@',
113
+    'date_fmt_jour_heure_debut_fin_abbr' => 'dia @dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@',
114
+    'date_fmt_jour_mois' => '@jour@ de @nommois@',
115
+    'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@',
116
+    'date_fmt_mois_annee' => '@nommois@ de @annee@',
117
+    'date_fmt_nomjour' => '@nomjour@ @date@',
118
+    'date_fmt_nomjour_date' => '@nomjour@ de @date@',
119
+    'date_fmt_periode' => 'De @date_debut@ a @date_fin@',
120
+    'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@',
121
+    'date_fmt_periode_from' => 'De',
122
+    'date_fmt_periode_to' => 'para',
123
+    'date_fmt_saison_annee' => '@saison@ @annee@',
124
+    'date_heures' => 'horas',
125
+    'date_hier' => 'ontem',
126
+    'date_il_y_a' => 'há @delai@',
127
+    'date_jnum1' => '1º',
128
+    'date_jnum10' => '10',
129
+    'date_jnum11' => '11',
130
+    'date_jnum12' => '12',
131
+    'date_jnum13' => '13',
132
+    'date_jnum14' => '14',
133
+    'date_jnum15' => '15',
134
+    'date_jnum16' => '16',
135
+    'date_jnum17' => '17',
136
+    'date_jnum18' => '18',
137
+    'date_jnum19' => '19',
138
+    'date_jnum2' => '2',
139
+    'date_jnum20' => '20',
140
+    'date_jnum21' => '21',
141
+    'date_jnum22' => '22',
142
+    'date_jnum23' => '23',
143
+    'date_jnum24' => '24',
144
+    'date_jnum25' => '25',
145
+    'date_jnum26' => '26',
146
+    'date_jnum27' => '27',
147
+    'date_jnum28' => '28',
148
+    'date_jnum29' => '29',
149
+    'date_jnum3' => '3',
150
+    'date_jnum30' => '30',
151
+    'date_jnum31' => '31',
152
+    'date_jnum4' => '4',
153
+    'date_jnum5' => '5',
154
+    'date_jnum6' => '6',
155
+    'date_jnum7' => '7',
156
+    'date_jnum8' => '8',
157
+    'date_jnum9' => '9',
158
+    'date_jour_1' => 'domingo',
159
+    'date_jour_1_abbr' => 'dom.',
160
+    'date_jour_1_initiale' => 'd.',
161
+    'date_jour_2' => 'segunda-feira',
162
+    'date_jour_2_abbr' => 'seg.',
163
+    'date_jour_2_initiale' => 's.',
164
+    'date_jour_3' => 'terça-feira',
165
+    'date_jour_3_abbr' => 'ter.',
166
+    'date_jour_3_initiale' => 't.',
167
+    'date_jour_4' => 'quarta-feira',
168
+    'date_jour_4_abbr' => 'quar.',
169
+    'date_jour_4_initiale' => 'q.',
170
+    'date_jour_5' => 'quinta-feira',
171
+    'date_jour_5_abbr' => 'quin.',
172
+    'date_jour_5_initiale' => 'q.',
173
+    'date_jour_6' => 'sexta-feira',
174
+    'date_jour_6_abbr' => 'sex.',
175
+    'date_jour_6_initiale' => 's.',
176
+    'date_jour_7' => 'sábado',
177
+    'date_jour_7_abbr' => 'sáb.',
178
+    'date_jour_7_initiale' => 's.',
179
+    'date_jours' => 'dias',
180
+    'date_minutes' => 'minutos',
181
+    'date_mois' => 'meses',
182
+    'date_mois_1' => 'janeiro',
183
+    'date_mois_10' => 'outubro',
184
+    'date_mois_10_abbr' => 'out.',
185
+    'date_mois_11' => 'novembro',
186
+    'date_mois_11_abbr' => 'nov.',
187
+    'date_mois_12' => 'dezembro',
188
+    'date_mois_12_abbr' => 'dez.',
189
+    'date_mois_1_abbr' => 'jan.',
190
+    'date_mois_2' => 'fevereiro',
191
+    'date_mois_2_abbr' => 'fev.',
192
+    'date_mois_3' => 'março',
193
+    'date_mois_3_abbr' => 'mar.',
194
+    'date_mois_4' => 'abril',
195
+    'date_mois_4_abbr' => 'abr.',
196
+    'date_mois_5' => 'maio',
197
+    'date_mois_5_abbr' => 'mai.',
198
+    'date_mois_6' => 'junho',
199
+    'date_mois_6_abbr' => 'jun.',
200
+    'date_mois_7' => 'julho',
201
+    'date_mois_7_abbr' => 'jul.',
202
+    'date_mois_8' => 'agosto',
203
+    'date_mois_8_abbr' => 'ago.',
204
+    'date_mois_9' => 'setembro',
205
+    'date_mois_9_abbr' => 'set.',
206
+    'date_saison_1' => 'inverno',
207
+    'date_saison_2' => 'primavera',
208
+    'date_saison_3' => 'verão',
209
+    'date_saison_4' => 'outono',
210
+    'date_secondes' => 'segundos',
211
+    'date_semaines' => 'semanas',
212
+    'date_un_mois' => 'mês',
213
+    'date_une_heure' => 'hora',
214
+    'date_une_minute' => 'minuto',
215
+    'date_une_seconde' => 'segundo',
216
+    'date_une_semaine' => 'semana',
217
+    'dirs_commencer' => 'Para começar realmente a instalação',
218
+    'dirs_preliminaire' => 'Preliminar: <b>Configurar os direitos de acesso</b>',
219
+    'dirs_probleme_droits' => 'Problema com as permissões de acesso',
220
+    'dirs_repertoires_absents' => '<p><b>Os diretórios a seguir não foram encontrados:</b></p><ul>@bad_dirs@.</ul>
221 221
 <p>É provável que isto se deva a um problema de letras em maiúsculas e minúsculas.
222 222
 Verifique se as maiúsculas e minúsuculas destes diretórios coincidem exatamente com o que está sendo exibido abaixo; se este não for o caso, renomeie os diretórios com o seu programa de FTP de modo a corrigir o erro.
223 223
 <p>Uma vêz feita esta manipulação, você poderá ',
224
-	'dirs_repertoires_suivants' => '<p><b>Os diretórios a seguir não estão acessiveis para leitura:</b></p><ul>@bad_dirs@.</ul>
224
+    'dirs_repertoires_suivants' => '<p><b>Os diretórios a seguir não estão acessiveis para leitura:</b></p><ul>@bad_dirs@.</ul>
225 225
 <p>Para corrigir, utilize o seu programa de FTP para configurar os direitos de acesso de cada um destes diretórios. O procedimento está explicado em detalhes no guia de instalação.</p>
226 226
 <p>Uma vêz feita esta alteração, você poderá ',
227
-	'double_occurrence' => 'Ocorrência dupla de @balise@',
227
+    'double_occurrence' => 'Ocorrência dupla de @balise@',
228 228
 
229
-	// E
230
-	'en_cours' => 'em curso',
231
-	'envoi_via_le_site' => 'Envio pelo site',
232
-	'erreur' => 'Erro',
233
-	'erreur_balise_non_fermee' => 'Última tag em aberto:',
234
-	'erreur_technique_ajaxform' => 'Ooops. Um erro inesperado impediu o envio do formulário. Você pode tentar novamente.',
235
-	'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu a gravação correta do campo @champs@.',
236
-	'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu a gravação.',
237
-	'erreur_texte' => 'erro(s)',
238
-	'etape' => 'Etapa',
229
+    // E
230
+    'en_cours' => 'em curso',
231
+    'envoi_via_le_site' => 'Envio pelo site',
232
+    'erreur' => 'Erro',
233
+    'erreur_balise_non_fermee' => 'Última tag em aberto:',
234
+    'erreur_technique_ajaxform' => 'Ooops. Um erro inesperado impediu o envio do formulário. Você pode tentar novamente.',
235
+    'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu a gravação correta do campo @champs@.',
236
+    'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu a gravação.',
237
+    'erreur_texte' => 'erro(s)',
238
+    'etape' => 'Etapa',
239 239
 
240
-	// F
241
-	'fichier_introuvable' => 'Arquivo @fichier@ não encontrado.',
242
-	'fonction_introuvable' => 'Função @fonction@() não encontrada.',
243
-	'form_auteur_confirmation' => 'Confirme o seu endereço de e-mail',
244
-	'form_auteur_email_modifie' => 'O seu endereço de e-mail foi alterado.',
245
-	'form_auteur_envoi_mail_confirmation' => 'Uma mensagem de confirmação acabou de ser enviada para @email@. Você precisa entrar no endereço web mencionado na mensagem para validar o seu endereço de e-mail.',
246
-	'form_auteur_mail_confirmation' => 'Olá,
240
+    // F
241
+    'fichier_introuvable' => 'Arquivo @fichier@ não encontrado.',
242
+    'fonction_introuvable' => 'Função @fonction@() não encontrada.',
243
+    'form_auteur_confirmation' => 'Confirme o seu endereço de e-mail',
244
+    'form_auteur_email_modifie' => 'O seu endereço de e-mail foi alterado.',
245
+    'form_auteur_envoi_mail_confirmation' => 'Uma mensagem de confirmação acabou de ser enviada para @email@. Você precisa entrar no endereço web mencionado na mensagem para validar o seu endereço de e-mail.',
246
+    'form_auteur_mail_confirmation' => 'Olá,
247 247
 
248 248
 Você pediu para alterar o seu endereço de e-mail
249 249
 Para confirmar o seu novo endereço, basta acessar o endereço abaixo (cas contrário, a sua solicitação será ignorada):
250 250
 
251 251
     @url@
252 252
 ',
253
-	'form_deja_inscrit' => 'Você já está inscrito.',
254
-	'form_email_non_valide' => 'Seu endereço de e-mail não é válido.',
255
-	'form_forum_access_refuse' => 'Você não tem mais acesso a este site.',
256
-	'form_forum_bonjour' => 'Bom dia @nom@,',
257
-	'form_forum_confirmer_email' => 'Para confirmar o seu endereço de e-mail, clique neste link: @url_confirm@',
258
-	'form_forum_email_deja_enregistre' => 'Este endereço de e-mail já está cadastrado, você pode usar a sua senha habitual.',
259
-	'form_forum_identifiant_mail' => 'Seu novo login foi enviado por e-mail.',
260
-	'form_forum_identifiants' => 'Identificadores pessoais',
261
-	'form_forum_indiquer_nom_email' => 'Informe aqui o seu nome  endereço de e-mail. O seu identificador pessoal será enviado de imediato por correio eletrônico.',
262
-	'form_forum_login' => 'login:',
263
-	'form_forum_message_auto' => '(esta é uma mensagem automática)',
264
-	'form_forum_pass' => 'senha:',
265
-	'form_forum_probleme_mail' => 'Problema de e-mail: o identificador não pôde ser enviado.',
266
-	'form_forum_voici1' => 'Estes são os seus identificadores para que você possa participar da vida do site "@nom_site_spip@" (@adresse_site@):',
267
-	'form_forum_voici2' => 'Estes são os seus identificadores para que você possa propor matérias ao site "@nom_site_spip@" (@adresse_login@):',
268
-	'form_indiquer_email' => 'Por favor, informe o seu endereço de e-mail.',
269
-	'form_indiquer_nom' => 'Por favor, informe o seu nome.',
270
-	'form_indiquer_nom_site' => 'Por favor, informe o nome do seu site.',
271
-	'form_pet_deja_enregistre' => 'Este site já está cadastrado',
272
-	'form_pet_signature_pasprise' => 'Sua assinatura não foi computada.',
273
-	'form_prop_confirmer_envoi' => 'Confirmar o envio',
274
-	'form_prop_description' => 'Descrição / comentário',
275
-	'form_prop_enregistre' => 'Sua proposta foi cadastrada, ela aparecerá online após ser validada pelos responsáveis deste site.',
276
-	'form_prop_envoyer' => 'Enviar uma mensagem',
277
-	'form_prop_indiquer_email' => 'Por favor, indique um endereço de e-mail válido',
278
-	'form_prop_indiquer_nom_site' => 'Por favor, informe o nome do site.',
279
-	'form_prop_indiquer_sujet' => 'Por favor, informe um assunto',
280
-	'form_prop_message_envoye' => 'Mensagem enviada',
281
-	'form_prop_non_enregistre' => 'Sua proposta não foi cadastrada.',
282
-	'form_prop_sujet' => 'Assunto',
283
-	'form_prop_url_site' => 'Endereço URL do site',
284
-	'format_date_attendu' => 'Inserir uma data no formato dd/mm/aaaa.',
285
-	'format_date_incorrecte' => 'A data e o seu formato está incorreta',
286
-	'format_heure_attendu' => 'Inserir uma hora no formato hh:mm.',
287
-	'format_heure_incorrecte' => 'A hora e o seu formato está incorreta',
288
-	'forum_non_inscrit' => 'Você não está inscrito, ou o endereço ou a senha estão errados.',
289
-	'forum_par_auteur' => 'por @auteur@',
290
-	'forum_titre_erreur' => 'Erro...',
253
+    'form_deja_inscrit' => 'Você já está inscrito.',
254
+    'form_email_non_valide' => 'Seu endereço de e-mail não é válido.',
255
+    'form_forum_access_refuse' => 'Você não tem mais acesso a este site.',
256
+    'form_forum_bonjour' => 'Bom dia @nom@,',
257
+    'form_forum_confirmer_email' => 'Para confirmar o seu endereço de e-mail, clique neste link: @url_confirm@',
258
+    'form_forum_email_deja_enregistre' => 'Este endereço de e-mail já está cadastrado, você pode usar a sua senha habitual.',
259
+    'form_forum_identifiant_mail' => 'Seu novo login foi enviado por e-mail.',
260
+    'form_forum_identifiants' => 'Identificadores pessoais',
261
+    'form_forum_indiquer_nom_email' => 'Informe aqui o seu nome  endereço de e-mail. O seu identificador pessoal será enviado de imediato por correio eletrônico.',
262
+    'form_forum_login' => 'login:',
263
+    'form_forum_message_auto' => '(esta é uma mensagem automática)',
264
+    'form_forum_pass' => 'senha:',
265
+    'form_forum_probleme_mail' => 'Problema de e-mail: o identificador não pôde ser enviado.',
266
+    'form_forum_voici1' => 'Estes são os seus identificadores para que você possa participar da vida do site "@nom_site_spip@" (@adresse_site@):',
267
+    'form_forum_voici2' => 'Estes são os seus identificadores para que você possa propor matérias ao site "@nom_site_spip@" (@adresse_login@):',
268
+    'form_indiquer_email' => 'Por favor, informe o seu endereço de e-mail.',
269
+    'form_indiquer_nom' => 'Por favor, informe o seu nome.',
270
+    'form_indiquer_nom_site' => 'Por favor, informe o nome do seu site.',
271
+    'form_pet_deja_enregistre' => 'Este site já está cadastrado',
272
+    'form_pet_signature_pasprise' => 'Sua assinatura não foi computada.',
273
+    'form_prop_confirmer_envoi' => 'Confirmar o envio',
274
+    'form_prop_description' => 'Descrição / comentário',
275
+    'form_prop_enregistre' => 'Sua proposta foi cadastrada, ela aparecerá online após ser validada pelos responsáveis deste site.',
276
+    'form_prop_envoyer' => 'Enviar uma mensagem',
277
+    'form_prop_indiquer_email' => 'Por favor, indique um endereço de e-mail válido',
278
+    'form_prop_indiquer_nom_site' => 'Por favor, informe o nome do site.',
279
+    'form_prop_indiquer_sujet' => 'Por favor, informe um assunto',
280
+    'form_prop_message_envoye' => 'Mensagem enviada',
281
+    'form_prop_non_enregistre' => 'Sua proposta não foi cadastrada.',
282
+    'form_prop_sujet' => 'Assunto',
283
+    'form_prop_url_site' => 'Endereço URL do site',
284
+    'format_date_attendu' => 'Inserir uma data no formato dd/mm/aaaa.',
285
+    'format_date_incorrecte' => 'A data e o seu formato está incorreta',
286
+    'format_heure_attendu' => 'Inserir uma hora no formato hh:mm.',
287
+    'format_heure_incorrecte' => 'A hora e o seu formato está incorreta',
288
+    'forum_non_inscrit' => 'Você não está inscrito, ou o endereço ou a senha estão errados.',
289
+    'forum_par_auteur' => 'por @auteur@',
290
+    'forum_titre_erreur' => 'Erro...',
291 291
 
292
-	// I
293
-	'ical_texte_rss_articles' => 'O arquivo «backend» das matérias deste site encontra-se no endereço:',
294
-	'ical_texte_rss_articles2' => 'Você pode também obter os arquivos «backend» para as matérias de cada seção do site:',
295
-	'ical_texte_rss_breves' => 'Existe também um arquivo contendo as notas do site. Ao especificar um número de seção, você obterá unicamente as natos dessa seção.',
296
-	'icone_a_suivre' => 'Acompanhar',
297
-	'icone_admin_site' => 'Administração do site',
298
-	'icone_agenda' => 'Agenda',
299
-	'icone_aide_ligne' => 'Ajuda',
300
-	'icone_articles' => 'Matérias',
301
-	'icone_auteurs' => 'Autores',
302
-	'icone_brouteur' => 'Navegação rápida',
303
-	'icone_configuration_site' => 'Configuração',
304
-	'icone_configurer_site' => 'Configurar o seu site',
305
-	'icone_creer_nouvel_auteur' => 'Criar um novo autor',
306
-	'icone_creer_rubrique' => 'Criar uma seção',
307
-	'icone_creer_sous_rubrique' => 'Criar uma subseção',
308
-	'icone_deconnecter' => 'Desconectar-se',
309
-	'icone_discussions' => 'Discussões',
310
-	'icone_doc_rubrique' => 'Documentos das seções',
311
-	'icone_ecrire_article' => 'Escrever uma nova matéria',
312
-	'icone_edition_site' => 'Edição',
313
-	'icone_gestion_langues' => 'Gerenciamento de idiomas',
314
-	'icone_informations_personnelles' => 'Informações pessoais',
315
-	'icone_interface_complet' => 'interface completa',
316
-	'icone_interface_simple' => 'Interface simplificada',
317
-	'icone_maintenance_site' => 'Manutenção do site',
318
-	'icone_messagerie_personnelle' => 'Mensagens pessoais',
319
-	'icone_repartition_debut' => 'Exibir a repartição após o início',
320
-	'icone_rubriques' => 'Seções',
321
-	'icone_sauver_site' => 'Backup do site',
322
-	'icone_site_entier' => 'Todo o site',
323
-	'icone_sites_references' => 'Sites referenciados',
324
-	'icone_statistiques' => 'Estatísticas do site',
325
-	'icone_suivi_activite' => 'Acompanhar a vida do site',
326
-	'icone_suivi_actualite' => 'Evolução do site',
327
-	'icone_suivi_pettions' => 'Acompanhar / gerenciar as petições',
328
-	'icone_suivi_revisions' => 'Modificações das matérias',
329
-	'icone_supprimer_document' => 'Suprimir este documento',
330
-	'icone_supprimer_image' => 'Suprimir esta imagem',
331
-	'icone_tous_articles' => 'Todas as suas matérias',
332
-	'icone_tous_auteur' => 'Todos os autores',
333
-	'icone_tous_visiteur' => 'Todos os visitantes',
334
-	'icone_visiter_site' => 'Ver o site público',
335
-	'icone_voir_en_ligne' => 'Ver online',
336
-	'img_indisponible' => 'imagem indisponível',
337
-	'impossible' => 'impossível',
338
-	'info_a_suivre' => 'ACOMPANHAR»',
339
-	'info_acces_interdit' => 'Acesso interdito',
340
-	'info_acces_refuse' => 'Acesso recusado',
341
-	'info_action' => 'Ação: @action@',
342
-	'info_administrer_rubriques' => 'Você pode administrar esta seção e suas subseções',
343
-	'info_adresse_non_indiquee' => 'Você não informou o endereço a testar!',
344
-	'info_aide' => 'AJUDA:',
345
-	'info_ajouter_mot' => 'Incluir esta palavra',
346
-	'info_annonce' => 'AVISO',
347
-	'info_annonces_generales' => 'Avisos gerais:',
348
-	'info_article_propose' => 'Matéria proposta',
349
-	'info_article_publie' => 'Matéria publicada',
350
-	'info_article_redaction' => 'Matéria em fase de redação',
351
-	'info_article_refuse' => 'Matéria recusada',
352
-	'info_article_supprime' => 'Matéria suprimida',
353
-	'info_articles' => 'Matérias',
354
-	'info_articles_a_valider' => 'As matérias para validar',
355
-	'info_articles_nb' => '@nb@ matérias',
356
-	'info_articles_proposes' => 'Matérias propostas',
357
-	'info_articles_un' => '1 matéria',
358
-	'info_auteurs_nombre' => 'autor(es):',
359
-	'info_authentification_ftp' => 'Autenticação (por FTP).',
360
-	'info_breves_2' => 'notas',
361
-	'info_breves_nb' => '@nb@ notas',
362
-	'info_breves_un' => '1 nota',
363
-	'info_connexion_refusee' => 'Conexão recusada',
364
-	'info_contact_developpeur' => 'Por favor, contate um desenvolvedor.',
365
-	'info_contenance' => 'Este site contém:',
366
-	'info_contribution' => 'contribuições',
367
-	'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.',
368
-	'info_copyright_doc' => 'Para mais informações, veja o site <a href="@spipnet@">@spipnet_affiche@</a>.',
369
-	'info_copyright_gpl' => 'sob licença GPL',
370
-	'info_cours_edition' => 'Em edição',
371
-	'info_creer_repertoire' => 'Por favor, crie um arquivo ou diretório com o nome:',
372
-	'info_creer_repertoire_2' => 'dentro do subdiretório <b>@repertoire@</b>, e depois:',
373
-	'info_creer_vignette' => 'criação automática do ícone',
374
-	'info_creerdansrubrique_non_autorise' => 'Você não tem permissão para criar um conteúdo nesta seção',
375
-	'info_deplier' => 'Expandir',
376
-	'info_descriptif_nombre' => 'descrição(ões):',
377
-	'info_description' => 'Resumo:',
378
-	'info_description_2' => 'Resumo:',
379
-	'info_dimension' => 'Dimensões:',
380
-	'info_documents_nb' => '@nb@ documentos',
381
-	'info_documents_un' => '1 documento',
382
-	'info_ecire_message_prive' => 'Escrever uma mensagem privada',
383
-	'info_email_invalide' => 'Endereço de e-mail inválido.',
384
-	'info_en_cours_validation' => 'Suas matérias em fase de redação',
385
-	'info_en_ligne' => 'Atualmente online:',
386
-	'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor',
387
-	'info_erreur_requete' => 'Erro na requisição:',
388
-	'info_erreur_squelette2' => 'Nenhum template <b>@fichier@</b> está disponível...',
389
-	'info_erreur_systeme' => 'Erro do sistema (errno @errsys@)',
390
-	'info_erreur_systeme2' => 'É possível que não haja espaço livre em disco, ou que a base de dados esteja corrompida.<br />
292
+    // I
293
+    'ical_texte_rss_articles' => 'O arquivo «backend» das matérias deste site encontra-se no endereço:',
294
+    'ical_texte_rss_articles2' => 'Você pode também obter os arquivos «backend» para as matérias de cada seção do site:',
295
+    'ical_texte_rss_breves' => 'Existe também um arquivo contendo as notas do site. Ao especificar um número de seção, você obterá unicamente as natos dessa seção.',
296
+    'icone_a_suivre' => 'Acompanhar',
297
+    'icone_admin_site' => 'Administração do site',
298
+    'icone_agenda' => 'Agenda',
299
+    'icone_aide_ligne' => 'Ajuda',
300
+    'icone_articles' => 'Matérias',
301
+    'icone_auteurs' => 'Autores',
302
+    'icone_brouteur' => 'Navegação rápida',
303
+    'icone_configuration_site' => 'Configuração',
304
+    'icone_configurer_site' => 'Configurar o seu site',
305
+    'icone_creer_nouvel_auteur' => 'Criar um novo autor',
306
+    'icone_creer_rubrique' => 'Criar uma seção',
307
+    'icone_creer_sous_rubrique' => 'Criar uma subseção',
308
+    'icone_deconnecter' => 'Desconectar-se',
309
+    'icone_discussions' => 'Discussões',
310
+    'icone_doc_rubrique' => 'Documentos das seções',
311
+    'icone_ecrire_article' => 'Escrever uma nova matéria',
312
+    'icone_edition_site' => 'Edição',
313
+    'icone_gestion_langues' => 'Gerenciamento de idiomas',
314
+    'icone_informations_personnelles' => 'Informações pessoais',
315
+    'icone_interface_complet' => 'interface completa',
316
+    'icone_interface_simple' => 'Interface simplificada',
317
+    'icone_maintenance_site' => 'Manutenção do site',
318
+    'icone_messagerie_personnelle' => 'Mensagens pessoais',
319
+    'icone_repartition_debut' => 'Exibir a repartição após o início',
320
+    'icone_rubriques' => 'Seções',
321
+    'icone_sauver_site' => 'Backup do site',
322
+    'icone_site_entier' => 'Todo o site',
323
+    'icone_sites_references' => 'Sites referenciados',
324
+    'icone_statistiques' => 'Estatísticas do site',
325
+    'icone_suivi_activite' => 'Acompanhar a vida do site',
326
+    'icone_suivi_actualite' => 'Evolução do site',
327
+    'icone_suivi_pettions' => 'Acompanhar / gerenciar as petições',
328
+    'icone_suivi_revisions' => 'Modificações das matérias',
329
+    'icone_supprimer_document' => 'Suprimir este documento',
330
+    'icone_supprimer_image' => 'Suprimir esta imagem',
331
+    'icone_tous_articles' => 'Todas as suas matérias',
332
+    'icone_tous_auteur' => 'Todos os autores',
333
+    'icone_tous_visiteur' => 'Todos os visitantes',
334
+    'icone_visiter_site' => 'Ver o site público',
335
+    'icone_voir_en_ligne' => 'Ver online',
336
+    'img_indisponible' => 'imagem indisponível',
337
+    'impossible' => 'impossível',
338
+    'info_a_suivre' => 'ACOMPANHAR»',
339
+    'info_acces_interdit' => 'Acesso interdito',
340
+    'info_acces_refuse' => 'Acesso recusado',
341
+    'info_action' => 'Ação: @action@',
342
+    'info_administrer_rubriques' => 'Você pode administrar esta seção e suas subseções',
343
+    'info_adresse_non_indiquee' => 'Você não informou o endereço a testar!',
344
+    'info_aide' => 'AJUDA:',
345
+    'info_ajouter_mot' => 'Incluir esta palavra',
346
+    'info_annonce' => 'AVISO',
347
+    'info_annonces_generales' => 'Avisos gerais:',
348
+    'info_article_propose' => 'Matéria proposta',
349
+    'info_article_publie' => 'Matéria publicada',
350
+    'info_article_redaction' => 'Matéria em fase de redação',
351
+    'info_article_refuse' => 'Matéria recusada',
352
+    'info_article_supprime' => 'Matéria suprimida',
353
+    'info_articles' => 'Matérias',
354
+    'info_articles_a_valider' => 'As matérias para validar',
355
+    'info_articles_nb' => '@nb@ matérias',
356
+    'info_articles_proposes' => 'Matérias propostas',
357
+    'info_articles_un' => '1 matéria',
358
+    'info_auteurs_nombre' => 'autor(es):',
359
+    'info_authentification_ftp' => 'Autenticação (por FTP).',
360
+    'info_breves_2' => 'notas',
361
+    'info_breves_nb' => '@nb@ notas',
362
+    'info_breves_un' => '1 nota',
363
+    'info_connexion_refusee' => 'Conexão recusada',
364
+    'info_contact_developpeur' => 'Por favor, contate um desenvolvedor.',
365
+    'info_contenance' => 'Este site contém:',
366
+    'info_contribution' => 'contribuições',
367
+    'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.',
368
+    'info_copyright_doc' => 'Para mais informações, veja o site <a href="@spipnet@">@spipnet_affiche@</a>.',
369
+    'info_copyright_gpl' => 'sob licença GPL',
370
+    'info_cours_edition' => 'Em edição',
371
+    'info_creer_repertoire' => 'Por favor, crie um arquivo ou diretório com o nome:',
372
+    'info_creer_repertoire_2' => 'dentro do subdiretório <b>@repertoire@</b>, e depois:',
373
+    'info_creer_vignette' => 'criação automática do ícone',
374
+    'info_creerdansrubrique_non_autorise' => 'Você não tem permissão para criar um conteúdo nesta seção',
375
+    'info_deplier' => 'Expandir',
376
+    'info_descriptif_nombre' => 'descrição(ões):',
377
+    'info_description' => 'Resumo:',
378
+    'info_description_2' => 'Resumo:',
379
+    'info_dimension' => 'Dimensões:',
380
+    'info_documents_nb' => '@nb@ documentos',
381
+    'info_documents_un' => '1 documento',
382
+    'info_ecire_message_prive' => 'Escrever uma mensagem privada',
383
+    'info_email_invalide' => 'Endereço de e-mail inválido.',
384
+    'info_en_cours_validation' => 'Suas matérias em fase de redação',
385
+    'info_en_ligne' => 'Atualmente online:',
386
+    'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor',
387
+    'info_erreur_requete' => 'Erro na requisição:',
388
+    'info_erreur_squelette2' => 'Nenhum template <b>@fichier@</b> está disponível...',
389
+    'info_erreur_systeme' => 'Erro do sistema (errno @errsys@)',
390
+    'info_erreur_systeme2' => 'É possível que não haja espaço livre em disco, ou que a base de dados esteja corrompida.<br />
391 391
 <span style="color:red;">Tente <a href=\'@script@\'>reparar a base</a>, ou contate o seu serviço de hospedagem.</span>',
392
-	'info_fini' => 'Terminou!',
393
-	'info_format_image' => 'Formatos das imagens que podem ser utilizados para criar os ícones @gd_formats@.',
394
-	'info_format_non_defini' => 'formato não definido',
395
-	'info_grand_ecran' => 'Alta resolução',
396
-	'info_image_aide' => 'AJUDA',
397
-	'info_image_process_titre' => 'Método de criação dos ícones',
398
-	'info_impossible_lire_page' => '<b>Erro!</b> Impossível ler a página <tt><html>@test_proxy@</html></tt> via proxy',
399
-	'info_installation_systeme_publication' => 'Instalação do sistema de publicação...',
400
-	'info_installer_documents' => 'Você pode instalar automaticamente todos os documentos contídos no diretório @upload@.',
401
-	'info_installer_ftp' => 'Como administrador, você pode transferir (por FTP) arquivos para o diretório @upload@ para, em seguida, selecioná-los aqui diretamente.',
402
-	'info_installer_images' => 'Você pode transferir imagens nos formatos JPEG, GIF e PNG.',
403
-	'info_installer_images_dossier' => 'Transferir as imagens para o diretório @upload@ para poder selecioná-las aqui.',
404
-	'info_interface_complete' => 'interface completa',
405
-	'info_interface_simple' => 'Interface simplificada',
406
-	'info_joindre_document_article' => 'Você pode anexar a esta matéria documentos dos tipos a seguir',
407
-	'info_joindre_document_rubrique' => 'Você pode anexar a esta seção documentos dos tipos a seguir',
408
-	'info_joindre_documents_article' => 'Você pode anexar à sua matéria documentos dos tipos a seguir:',
409
-	'info_l_article' => 'a matéria',
410
-	'info_la_breve' => 'a nota',
411
-	'info_la_rubrique' => 'a seção',
412
-	'info_langue_principale' => 'Idioma principal do site',
413
-	'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
414
-	'info_les_auteurs_1' => 'por @les_auteurs@',
415
-	'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.',
416
-	'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).',
417
-	'info_mail_fournisseur' => '[email protected]',
418
-	'info_message_2' => 'MENSAGEM',
419
-	'info_message_supprime' => 'MENSAGEM EXCLUÍDA',
420
-	'info_messages_nb' => '@nb@ mensagens',
421
-	'info_messages_un' => '1 mensagem',
422
-	'info_mise_en_ligne' => 'Data de publicação online:',
423
-	'info_modification_parametres_securite' => 'modificações dos parâmetros de segurança',
424
-	'info_mois_courant' => 'No mês corrente:',
425
-	'info_mot_cle_ajoute' => 'A palavra-chave a seguir foi associada a',
426
-	'info_multi_herit' => 'Idioma padrão',
427
-	'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhados</u> dispõem de tradução total ou parcial dos textos da interface. Se você escolher esses idiomas, diversos elementos do site público (datas, formulários) são traduzidos automaticamente. Para os idiomas não sublinhados, estes elementos aparecerão no idioma principal do site.',
428
-	'info_multilinguisme' => 'Multilinguismo',
429
-	'info_nom_non_utilisateurs_connectes' => 'Seu nome não aparece na relação de usuários conectados.',
430
-	'info_nom_utilisateurs_connectes' => 'Seu nome aparecerá na relação de usuários conectados.',
431
-	'info_nombre_en_ligne' => 'Online neste momento:',
432
-	'info_non_resultat' => 'Nenhum resultados para "@cherche_mot@"',
433
-	'info_non_utilisation_messagerie' => 'Você não utiliza o sistema de mensagens deste site.',
434
-	'info_nouveau_message' => 'VOCÊ TEM UMA NOVA MENSAGEM',
435
-	'info_nouveaux_messages' => 'VOCÊ TEM @total_messages@ MENSAGENS NOVAS',
436
-	'info_numero_abbreviation' => 'N° ',
437
-	'info_obligatoire' => 'Esta informação é obrigatória',
438
-	'info_page_actuelle' => 'Página atual',
439
-	'info_pense_bete' => 'LEMBRETE',
440
-	'info_petit_ecran' => 'Baixa resolução',
441
-	'info_petition_close' => 'Petição fechada',
442
-	'info_pixels' => 'pixels',
443
-	'info_plusieurs_mots_trouves' => 'Várias palavras-chave encontradas para "@cherche_mot@":',
444
-	'info_portfolio_automatique' => 'Portfólio automático:',
445
-	'info_premier_resultat' => '[@debut_limit@ primeiros resultados de @total@]',
446
-	'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados de @total@]',
447
-	'info_propose_1' => '[@nom_site_spip@] Propõe: @titre@',
448
-	'info_propose_2' => 'Matéria proposta
392
+    'info_fini' => 'Terminou!',
393
+    'info_format_image' => 'Formatos das imagens que podem ser utilizados para criar os ícones @gd_formats@.',
394
+    'info_format_non_defini' => 'formato não definido',
395
+    'info_grand_ecran' => 'Alta resolução',
396
+    'info_image_aide' => 'AJUDA',
397
+    'info_image_process_titre' => 'Método de criação dos ícones',
398
+    'info_impossible_lire_page' => '<b>Erro!</b> Impossível ler a página <tt><html>@test_proxy@</html></tt> via proxy',
399
+    'info_installation_systeme_publication' => 'Instalação do sistema de publicação...',
400
+    'info_installer_documents' => 'Você pode instalar automaticamente todos os documentos contídos no diretório @upload@.',
401
+    'info_installer_ftp' => 'Como administrador, você pode transferir (por FTP) arquivos para o diretório @upload@ para, em seguida, selecioná-los aqui diretamente.',
402
+    'info_installer_images' => 'Você pode transferir imagens nos formatos JPEG, GIF e PNG.',
403
+    'info_installer_images_dossier' => 'Transferir as imagens para o diretório @upload@ para poder selecioná-las aqui.',
404
+    'info_interface_complete' => 'interface completa',
405
+    'info_interface_simple' => 'Interface simplificada',
406
+    'info_joindre_document_article' => 'Você pode anexar a esta matéria documentos dos tipos a seguir',
407
+    'info_joindre_document_rubrique' => 'Você pode anexar a esta seção documentos dos tipos a seguir',
408
+    'info_joindre_documents_article' => 'Você pode anexar à sua matéria documentos dos tipos a seguir:',
409
+    'info_l_article' => 'a matéria',
410
+    'info_la_breve' => 'a nota',
411
+    'info_la_rubrique' => 'a seção',
412
+    'info_langue_principale' => 'Idioma principal do site',
413
+    'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
414
+    'info_les_auteurs_1' => 'por @les_auteurs@',
415
+    'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.',
416
+    'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).',
417
+    'info_mail_fournisseur' => '[email protected]',
418
+    'info_message_2' => 'MENSAGEM',
419
+    'info_message_supprime' => 'MENSAGEM EXCLUÍDA',
420
+    'info_messages_nb' => '@nb@ mensagens',
421
+    'info_messages_un' => '1 mensagem',
422
+    'info_mise_en_ligne' => 'Data de publicação online:',
423
+    'info_modification_parametres_securite' => 'modificações dos parâmetros de segurança',
424
+    'info_mois_courant' => 'No mês corrente:',
425
+    'info_mot_cle_ajoute' => 'A palavra-chave a seguir foi associada a',
426
+    'info_multi_herit' => 'Idioma padrão',
427
+    'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhados</u> dispõem de tradução total ou parcial dos textos da interface. Se você escolher esses idiomas, diversos elementos do site público (datas, formulários) são traduzidos automaticamente. Para os idiomas não sublinhados, estes elementos aparecerão no idioma principal do site.',
428
+    'info_multilinguisme' => 'Multilinguismo',
429
+    'info_nom_non_utilisateurs_connectes' => 'Seu nome não aparece na relação de usuários conectados.',
430
+    'info_nom_utilisateurs_connectes' => 'Seu nome aparecerá na relação de usuários conectados.',
431
+    'info_nombre_en_ligne' => 'Online neste momento:',
432
+    'info_non_resultat' => 'Nenhum resultados para "@cherche_mot@"',
433
+    'info_non_utilisation_messagerie' => 'Você não utiliza o sistema de mensagens deste site.',
434
+    'info_nouveau_message' => 'VOCÊ TEM UMA NOVA MENSAGEM',
435
+    'info_nouveaux_messages' => 'VOCÊ TEM @total_messages@ MENSAGENS NOVAS',
436
+    'info_numero_abbreviation' => 'N° ',
437
+    'info_obligatoire' => 'Esta informação é obrigatória',
438
+    'info_page_actuelle' => 'Página atual',
439
+    'info_pense_bete' => 'LEMBRETE',
440
+    'info_petit_ecran' => 'Baixa resolução',
441
+    'info_petition_close' => 'Petição fechada',
442
+    'info_pixels' => 'pixels',
443
+    'info_plusieurs_mots_trouves' => 'Várias palavras-chave encontradas para "@cherche_mot@":',
444
+    'info_portfolio_automatique' => 'Portfólio automático:',
445
+    'info_premier_resultat' => '[@debut_limit@ primeiros resultados de @total@]',
446
+    'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados de @total@]',
447
+    'info_propose_1' => '[@nom_site_spip@] Propõe: @titre@',
448
+    'info_propose_2' => 'Matéria proposta
449 449
 ----------------',
450
-	'info_propose_3' => 'A matéria "@titre@" foi proposta para publicação.',
451
-	'info_propose_4' => 'Você está convidado a consultá-la e dar sua opinião',
452
-	'info_propose_5' => 'no fórum a ela anexado. Ela está disponível no endereço:',
453
-	'info_publie_01' => 'A matéria "@titre@" foi validada por @connect_nom@.',
454
-	'info_publie_1' => '[@nom_site_spip@] PUBLICADO: @titre@',
455
-	'info_publie_2' => 'Matéria publicada
450
+    'info_propose_3' => 'A matéria "@titre@" foi proposta para publicação.',
451
+    'info_propose_4' => 'Você está convidado a consultá-la e dar sua opinião',
452
+    'info_propose_5' => 'no fórum a ela anexado. Ela está disponível no endereço:',
453
+    'info_publie_01' => 'A matéria "@titre@" foi validada por @connect_nom@.',
454
+    'info_publie_1' => '[@nom_site_spip@] PUBLICADO: @titre@',
455
+    'info_publie_2' => 'Matéria publicada
456 456
 -----------------',
457
-	'info_rechercher' => 'Procurar',
458
-	'info_rechercher_02' => 'Procurar:',
459
-	'info_remplacer_vignette' => 'Substituir o ícone padrão por um logo personalizado:',
460
-	'info_rubriques_nb' => '@nb@ seções',
461
-	'info_rubriques_un' => '1 seção',
462
-	'info_sans_titre_2' => 'sem título',
463
-	'info_selectionner_fichier' => 'Você pode escolher um arquivo do diretório @upload@',
464
-	'info_selectionner_fichier_2' => 'Selecionar um arquivo:',
465
-	'info_sites_nb' => '@nb@ sites',
466
-	'info_sites_un' => '1 site',
467
-	'info_supprimer_vignette' => 'excluir o ícone',
468
-	'info_symbole_bleu' => 'O ícone <b>azul</b> indica um <b>lembrete</b>: ou seja, uma mensagem para seu uso pessoal.',
469
-	'info_symbole_jaune' => 'O ícone <b>amarelo</b> indica um  <b>anúncio para todos os redatores</b>: modificável por todos os administradores, e visível por todos os redatores.',
470
-	'info_symbole_vert' => 'O ícone <b>verde</b> indica as  <b>mensagens trocadas com outros usuários</b> do site.',
471
-	'info_telecharger_nouveau_logo' => 'Transferir um novo logo:',
472
-	'info_telecharger_ordinateur' => 'Tranferir do seu computador:',
473
-	'info_tous_resultats_enregistres' => '[todos os resultados são gravados]',
474
-	'info_tout_afficher' => 'Mostrar todas',
475
-	'info_travaux_texte' => 'Este site ainda não está configurado. Volte mais tarde...',
476
-	'info_travaux_titre' => 'Site em manutenção',
477
-	'info_trop_resultat' => 'Resultados de mais para "@cherche_mot@"; por favor, refine a busca.',
478
-	'info_utilisation_messagerie_interne' => 'Você usa o sistema interno de mensagens deste site.',
479
-	'info_valider_lien' => 'validar este link',
480
-	'info_verifier_image' => ', verifique se as suas imagens foram transferidas corretamente.',
481
-	'info_vignette_defaut' => 'Ícone padrão',
482
-	'info_vignette_personnalisee' => 'Ícone personalizado',
483
-	'info_visite' => 'visita:',
484
-	'info_vos_rendez_vous' => 'Seus encontros futuros',
485
-	'infos_vos_pense_bete' => 'Seus lembretes',
457
+    'info_rechercher' => 'Procurar',
458
+    'info_rechercher_02' => 'Procurar:',
459
+    'info_remplacer_vignette' => 'Substituir o ícone padrão por um logo personalizado:',
460
+    'info_rubriques_nb' => '@nb@ seções',
461
+    'info_rubriques_un' => '1 seção',
462
+    'info_sans_titre_2' => 'sem título',
463
+    'info_selectionner_fichier' => 'Você pode escolher um arquivo do diretório @upload@',
464
+    'info_selectionner_fichier_2' => 'Selecionar um arquivo:',
465
+    'info_sites_nb' => '@nb@ sites',
466
+    'info_sites_un' => '1 site',
467
+    'info_supprimer_vignette' => 'excluir o ícone',
468
+    'info_symbole_bleu' => 'O ícone <b>azul</b> indica um <b>lembrete</b>: ou seja, uma mensagem para seu uso pessoal.',
469
+    'info_symbole_jaune' => 'O ícone <b>amarelo</b> indica um  <b>anúncio para todos os redatores</b>: modificável por todos os administradores, e visível por todos os redatores.',
470
+    'info_symbole_vert' => 'O ícone <b>verde</b> indica as  <b>mensagens trocadas com outros usuários</b> do site.',
471
+    'info_telecharger_nouveau_logo' => 'Transferir um novo logo:',
472
+    'info_telecharger_ordinateur' => 'Tranferir do seu computador:',
473
+    'info_tous_resultats_enregistres' => '[todos os resultados são gravados]',
474
+    'info_tout_afficher' => 'Mostrar todas',
475
+    'info_travaux_texte' => 'Este site ainda não está configurado. Volte mais tarde...',
476
+    'info_travaux_titre' => 'Site em manutenção',
477
+    'info_trop_resultat' => 'Resultados de mais para "@cherche_mot@"; por favor, refine a busca.',
478
+    'info_utilisation_messagerie_interne' => 'Você usa o sistema interno de mensagens deste site.',
479
+    'info_valider_lien' => 'validar este link',
480
+    'info_verifier_image' => ', verifique se as suas imagens foram transferidas corretamente.',
481
+    'info_vignette_defaut' => 'Ícone padrão',
482
+    'info_vignette_personnalisee' => 'Ícone personalizado',
483
+    'info_visite' => 'visita:',
484
+    'info_vos_rendez_vous' => 'Seus encontros futuros',
485
+    'infos_vos_pense_bete' => 'Seus lembretes',
486 486
 
487
-	// L
488
-	'label_ajout_id_rapide' => 'Ajuda rápida',
489
-	'label_poids_fichier' => 'Tamanho',
490
-	'label_ponctuer' => '@label@:',
491
-	'lien_afficher_icones_seuls' => 'Exibir apenas os ícones',
492
-	'lien_afficher_texte_icones' => 'Exibir ícones e texto',
493
-	'lien_afficher_texte_seul' => 'Exibir apenas o texto',
494
-	'lien_aller_a_la_derniere_page' => 'Ir para a última página',
495
-	'lien_aller_a_la_page_nb' => 'Ir para a página @nb@',
496
-	'lien_aller_a_la_page_precedente' => 'Ir para a página anterior',
497
-	'lien_aller_a_la_page_suivante' => 'Ir para a página seguinte',
498
-	'lien_aller_a_la_premiere_page' => 'Ir para a primeira página',
499
-	'lien_liberer' => 'liberar',
500
-	'lien_liberer_tous' => 'liberar todas',
501
-	'lien_nouvea_pense_bete' => 'NOVO LEMBRETE',
502
-	'lien_nouveau_message' => 'NOVA MENSAGEM',
503
-	'lien_nouvelle_annonce' => 'NOVO ANÚNCIO',
504
-	'lien_petitions' => 'PETIÇÃO',
505
-	'lien_popularite' => 'popularidade: @popularite@%',
506
-	'lien_racine_site' => 'RAIZ DO SITE',
507
-	'lien_reessayer' => 'tente novamente',
508
-	'lien_repondre_message' => 'Responder a esta mensagem',
509
-	'lien_supprimer' => 'excluir',
510
-	'lien_tout_afficher' => 'Mostrar tudo',
511
-	'lien_visite_site' => 'visitar este site',
512
-	'lien_visites' => '@visites@ visitas',
513
-	'lien_voir_auteur' => 'Ver este autor',
514
-	'ligne' => 'Linha',
515
-	'login' => 'Conexão',
516
-	'login_acces_prive' => 'acesso ao espaço privado',
517
-	'login_autre_identifiant' => 'conectar-se com outra identificação',
518
-	'login_cookie_accepte' => 'Por favor, configure o seu navegador para aceitá-los (pelo menos para este site).',
519
-	'login_cookie_oblige' => 'Para você se identificar de modo seguro neste site, você precisa aceitar cookies.',
520
-	'login_deconnexion_ok' => 'Desconexão efetuada.',
521
-	'login_erreur_pass' => 'Erro de senha.',
522
-	'login_espace_prive' => 'espaço privado',
523
-	'login_identifiant_inconnu' => 'O identificador «@login@» não está cadastrado.',
524
-	'login_login' => 'Login:',
525
-	'login_login2' => 'Login',
526
-	'login_login_pass_incorrect' => '(Login ou senha incorreta.)',
527
-	'login_motpasseoublie' => 'esqueceu sua senha?',
528
-	'login_non_securise' => 'Atenção, este formulário não é seguro.
487
+    // L
488
+    'label_ajout_id_rapide' => 'Ajuda rápida',
489
+    'label_poids_fichier' => 'Tamanho',
490
+    'label_ponctuer' => '@label@:',
491
+    'lien_afficher_icones_seuls' => 'Exibir apenas os ícones',
492
+    'lien_afficher_texte_icones' => 'Exibir ícones e texto',
493
+    'lien_afficher_texte_seul' => 'Exibir apenas o texto',
494
+    'lien_aller_a_la_derniere_page' => 'Ir para a última página',
495
+    'lien_aller_a_la_page_nb' => 'Ir para a página @nb@',
496
+    'lien_aller_a_la_page_precedente' => 'Ir para a página anterior',
497
+    'lien_aller_a_la_page_suivante' => 'Ir para a página seguinte',
498
+    'lien_aller_a_la_premiere_page' => 'Ir para a primeira página',
499
+    'lien_liberer' => 'liberar',
500
+    'lien_liberer_tous' => 'liberar todas',
501
+    'lien_nouvea_pense_bete' => 'NOVO LEMBRETE',
502
+    'lien_nouveau_message' => 'NOVA MENSAGEM',
503
+    'lien_nouvelle_annonce' => 'NOVO ANÚNCIO',
504
+    'lien_petitions' => 'PETIÇÃO',
505
+    'lien_popularite' => 'popularidade: @popularite@%',
506
+    'lien_racine_site' => 'RAIZ DO SITE',
507
+    'lien_reessayer' => 'tente novamente',
508
+    'lien_repondre_message' => 'Responder a esta mensagem',
509
+    'lien_supprimer' => 'excluir',
510
+    'lien_tout_afficher' => 'Mostrar tudo',
511
+    'lien_visite_site' => 'visitar este site',
512
+    'lien_visites' => '@visites@ visitas',
513
+    'lien_voir_auteur' => 'Ver este autor',
514
+    'ligne' => 'Linha',
515
+    'login' => 'Conexão',
516
+    'login_acces_prive' => 'acesso ao espaço privado',
517
+    'login_autre_identifiant' => 'conectar-se com outra identificação',
518
+    'login_cookie_accepte' => 'Por favor, configure o seu navegador para aceitá-los (pelo menos para este site).',
519
+    'login_cookie_oblige' => 'Para você se identificar de modo seguro neste site, você precisa aceitar cookies.',
520
+    'login_deconnexion_ok' => 'Desconexão efetuada.',
521
+    'login_erreur_pass' => 'Erro de senha.',
522
+    'login_espace_prive' => 'espaço privado',
523
+    'login_identifiant_inconnu' => 'O identificador «@login@» não está cadastrado.',
524
+    'login_login' => 'Login:',
525
+    'login_login2' => 'Login',
526
+    'login_login_pass_incorrect' => '(Login ou senha incorreta.)',
527
+    'login_motpasseoublie' => 'esqueceu sua senha?',
528
+    'login_non_securise' => 'Atenção, este formulário não é seguro.
529 529
 Se você não quiser que a sua senha possa ser interceptada na rede, por favor ative o Javascript no seu navegador e',
530
-	'login_nouvelle_tentative' => 'Tentar novamente',
531
-	'login_par_ici' => 'VocÊ está registrado... por aqui...',
532
-	'login_pass2' => 'Senha:',
533
-	'login_preferez_refuser' => '<b>Se você prefere recusar os cookies</b>, um outro método de conexão (menos seguro) está disponível:',
534
-	'login_recharger' => 'atualizar esta página',
535
-	'login_rester_identifie' => 'Manter-se identificado',
536
-	'login_retour_public' => 'Voltar ao site público',
537
-	'login_retour_site' => 'Voltar ao site público',
538
-	'login_retoursitepublic' => 'voltar ao site público',
539
-	'login_sans_cookie' => 'Identificação sem cookie',
540
-	'login_securise' => 'Login seguro',
541
-	'login_sinscrire' => 'Cadastrar-se',
542
-	'login_test_navigateur' => 'testar navegador/reconexão',
543
-	'login_verifiez_navigateur' => '(Verifique sempre se o seu navegador não está memorizando a sua senha...)',
530
+    'login_nouvelle_tentative' => 'Tentar novamente',
531
+    'login_par_ici' => 'VocÊ está registrado... por aqui...',
532
+    'login_pass2' => 'Senha:',
533
+    'login_preferez_refuser' => '<b>Se você prefere recusar os cookies</b>, um outro método de conexão (menos seguro) está disponível:',
534
+    'login_recharger' => 'atualizar esta página',
535
+    'login_rester_identifie' => 'Manter-se identificado',
536
+    'login_retour_public' => 'Voltar ao site público',
537
+    'login_retour_site' => 'Voltar ao site público',
538
+    'login_retoursitepublic' => 'voltar ao site público',
539
+    'login_sans_cookie' => 'Identificação sem cookie',
540
+    'login_securise' => 'Login seguro',
541
+    'login_sinscrire' => 'Cadastrar-se',
542
+    'login_test_navigateur' => 'testar navegador/reconexão',
543
+    'login_verifiez_navigateur' => '(Verifique sempre se o seu navegador não está memorizando a sua senha...)',
544 544
 
545
-	// M
546
-	'masquer_colonne' => 'Ocultar esta coluna',
547
-	'masquer_trad' => 'esconder as traduções',
548
-	'message_nouveaux_identifiants_echec' => 'Impossível criar novos logins.',
549
-	'message_nouveaux_identifiants_echec_envoi' => 'Os novos logins de conexão não puderam ser enviados.',
550
-	'message_nouveaux_identifiants_ok' => 'Os novos logins de conexão foram enviados para @email@.',
551
-	'module_fichiers_langues' => 'Arquivos de idioma',
545
+    // M
546
+    'masquer_colonne' => 'Ocultar esta coluna',
547
+    'masquer_trad' => 'esconder as traduções',
548
+    'message_nouveaux_identifiants_echec' => 'Impossível criar novos logins.',
549
+    'message_nouveaux_identifiants_echec_envoi' => 'Os novos logins de conexão não puderam ser enviados.',
550
+    'message_nouveaux_identifiants_ok' => 'Os novos logins de conexão foram enviados para @email@.',
551
+    'module_fichiers_langues' => 'Arquivos de idioma',
552 552
 
553
-	// N
554
-	'navigateur_pas_redirige' => 'Se o seu navegador não o redirecionar, clique aqui para continuar.',
555
-	'numero' => 'Número',
553
+    // N
554
+    'navigateur_pas_redirige' => 'Se o seu navegador não o redirecionar, clique aqui para continuar.',
555
+    'numero' => 'Número',
556 556
 
557
-	// O
558
-	'occurence' => 'Ocorrência',
559
-	'onglet_affacer_base' => 'Apagar a base',
560
-	'onglet_auteur' => 'O autor',
561
-	'onglet_contenu_site' => 'Conteúdo do site',
562
-	'onglet_evolution_visite_mod' => 'Evolução',
563
-	'onglet_fonctions_avances' => 'Funções avançadas',
564
-	'onglet_informations_personnelles' => 'Informações pessoais',
565
-	'onglet_interactivite' => 'Interatividade',
566
-	'onglet_messagerie' => 'Sistema de mensagens',
567
-	'onglet_repartition_rubrique' => 'Repartição por seções',
568
-	'onglet_save_restaur_base' => 'Fazer cópia de segurança/restaurar a base',
569
-	'onglet_vider_cache' => 'Esvaziar o cache',
557
+    // O
558
+    'occurence' => 'Ocorrência',
559
+    'onglet_affacer_base' => 'Apagar a base',
560
+    'onglet_auteur' => 'O autor',
561
+    'onglet_contenu_site' => 'Conteúdo do site',
562
+    'onglet_evolution_visite_mod' => 'Evolução',
563
+    'onglet_fonctions_avances' => 'Funções avançadas',
564
+    'onglet_informations_personnelles' => 'Informações pessoais',
565
+    'onglet_interactivite' => 'Interatividade',
566
+    'onglet_messagerie' => 'Sistema de mensagens',
567
+    'onglet_repartition_rubrique' => 'Repartição por seções',
568
+    'onglet_save_restaur_base' => 'Fazer cópia de segurança/restaurar a base',
569
+    'onglet_vider_cache' => 'Esvaziar o cache',
570 570
 
571
-	// P
572
-	'pass_choix_pass' => 'Por favor, escolha a sua nova senha:',
573
-	'pass_erreur' => 'Erro',
574
-	'pass_erreur_acces_refuse' => '<b>Erro:</b> você não tem mais acesso a este site.',
575
-	'pass_erreur_code_inconnu' => '<b>Erro:</b> este login não corresponde a nenhum visitante com permissão de acesso a este site.',
576
-	'pass_erreur_non_enregistre' => '<b>Erro:</b> o e-mail <tt>@email_oubli@</tt> não está cadastrado neste site.',
577
-	'pass_erreur_non_valide' => '<b>Erro:</b> o e-mail <tt>@email_oubli@</tt> não é válido!',
578
-	'pass_erreur_probleme_technique' => '<b>Erro:</b> este e-mail não pôde ser enviado devido a um problema técnico.',
579
-	'pass_espace_prive_bla' => 'O espaço privado deste site é aberto aos visitantes, após inscrição. Uma vez cadastrado, você poderá consultar as matérias em fase de redação, propor a publicação de novas matérias e participar de todos os fóruns.',
580
-	'pass_forum_bla' => 'Você soliciou a participação num fórum reservado a visitantes registrados.',
581
-	'pass_indiquez_cidessous' => 'Informe abaixo o endereço de e-mail com o qual você se cadastrou anteriormente. Você receberá um e-mail lhe indicando os procedimentos a seguir para recuperar o seu acesso.',
582
-	'pass_mail_passcookie' => '(esta é uma mensagem automática)
571
+    // P
572
+    'pass_choix_pass' => 'Por favor, escolha a sua nova senha:',
573
+    'pass_erreur' => 'Erro',
574
+    'pass_erreur_acces_refuse' => '<b>Erro:</b> você não tem mais acesso a este site.',
575
+    'pass_erreur_code_inconnu' => '<b>Erro:</b> este login não corresponde a nenhum visitante com permissão de acesso a este site.',
576
+    'pass_erreur_non_enregistre' => '<b>Erro:</b> o e-mail <tt>@email_oubli@</tt> não está cadastrado neste site.',
577
+    'pass_erreur_non_valide' => '<b>Erro:</b> o e-mail <tt>@email_oubli@</tt> não é válido!',
578
+    'pass_erreur_probleme_technique' => '<b>Erro:</b> este e-mail não pôde ser enviado devido a um problema técnico.',
579
+    'pass_espace_prive_bla' => 'O espaço privado deste site é aberto aos visitantes, após inscrição. Uma vez cadastrado, você poderá consultar as matérias em fase de redação, propor a publicação de novas matérias e participar de todos os fóruns.',
580
+    'pass_forum_bla' => 'Você soliciou a participação num fórum reservado a visitantes registrados.',
581
+    'pass_indiquez_cidessous' => 'Informe abaixo o endereço de e-mail com o qual você se cadastrou anteriormente. Você receberá um e-mail lhe indicando os procedimentos a seguir para recuperar o seu acesso.',
582
+    'pass_mail_passcookie' => '(esta é uma mensagem automática)
583 583
 Para recuperar o seu acesso ao site
584 584
 @nom_site_spip@ (@adresse_site@)
585 585
 
@@ -591,137 +591,137 @@  discard block
 block discarded – undo
591 591
 e reconectar-se com o site.
592 592
 
593 593
 ',
594
-	'pass_mot_oublie' => 'Senha esquecida',
595
-	'pass_nouveau_enregistre' => 'Sua nova senha foi cadastrada.',
596
-	'pass_nouveau_pass' => 'Nova senha',
597
-	'pass_ok' => 'OK',
598
-	'pass_oubli_mot' => 'Esquecimento de senha',
599
-	'pass_procedure_changer' => 'Para alterar a sua senha, por favor informe o endereço de e-mail associado à sua conta.',
600
-	'pass_quitter_fenetre' => 'Fechar esta janela',
601
-	'pass_rappel_login' => 'Lembrete: seu login é «@login@».',
602
-	'pass_recevoir_mail' => 'Um link para redefinição da sua senha foi enviado para o seu endereço de e-mail (se ele for válido).',
603
-	'pass_retour_public' => 'Voltar para o site público',
604
-	'pass_rien_a_faire_ici' => 'Nada a fazer aqui.',
605
-	'pass_vousinscrire' => 'Cadastrar-se neste site',
606
-	'precedent' => 'precedente',
607
-	'previsualisation' => 'Visualização',
608
-	'previsualiser' => 'Visualizar',
594
+    'pass_mot_oublie' => 'Senha esquecida',
595
+    'pass_nouveau_enregistre' => 'Sua nova senha foi cadastrada.',
596
+    'pass_nouveau_pass' => 'Nova senha',
597
+    'pass_ok' => 'OK',
598
+    'pass_oubli_mot' => 'Esquecimento de senha',
599
+    'pass_procedure_changer' => 'Para alterar a sua senha, por favor informe o endereço de e-mail associado à sua conta.',
600
+    'pass_quitter_fenetre' => 'Fechar esta janela',
601
+    'pass_rappel_login' => 'Lembrete: seu login é «@login@».',
602
+    'pass_recevoir_mail' => 'Um link para redefinição da sua senha foi enviado para o seu endereço de e-mail (se ele for válido).',
603
+    'pass_retour_public' => 'Voltar para o site público',
604
+    'pass_rien_a_faire_ici' => 'Nada a fazer aqui.',
605
+    'pass_vousinscrire' => 'Cadastrar-se neste site',
606
+    'precedent' => 'precedente',
607
+    'previsualisation' => 'Visualização',
608
+    'previsualiser' => 'Visualizar',
609 609
 
610
-	// R
611
-	'retour' => 'Voltar',
610
+    // R
611
+    'retour' => 'Voltar',
612 612
 
613
-	// S
614
-	'spip_conforme_dtd' => 'O SPIP considera este documento de acordo com o seu DOCTYPE:',
615
-	'squelette' => 'template',
616
-	'squelette_inclus_ligne' => 'template incluído, linha',
617
-	'squelette_ligne' => 'template, linha',
618
-	'stats_visites_et_popularite' => '@visites@ visitas; popularidade: @popularite@',
619
-	'suivant' => 'seguinte',
613
+    // S
614
+    'spip_conforme_dtd' => 'O SPIP considera este documento de acordo com o seu DOCTYPE:',
615
+    'squelette' => 'template',
616
+    'squelette_inclus_ligne' => 'template incluído, linha',
617
+    'squelette_ligne' => 'template, linha',
618
+    'stats_visites_et_popularite' => '@visites@ visitas; popularidade: @popularite@',
619
+    'suivant' => 'seguinte',
620 620
 
621
-	// T
622
-	'taille_go' => '@taille@ GB',
623
-	'taille_ko' => '@taille@ KB',
624
-	'taille_mo' => '@taille@ MB',
625
-	'taille_octets' => ' @taille@ bytes',
626
-	'taille_octets_bi' => ' @taille@ bytes',
627
-	'texte_actualite_site_1' => 'Quando você estiver mais familiarizado com a interface, clique em «',
628
-	'texte_actualite_site_2' => 'interface completa',
629
-	'texte_actualite_site_3' => '» para abrir mais possibilidades.',
630
-	'texte_creation_automatique_vignette' => 'A criação automática de ícones de visualização está ativada neste site. Se você transferir por este formulário imagens no(s) formato(s) @gd_formats@, elas serão acompanhadas de um ícone com o tamanho máximo de @taille_preview@ pixels.',
631
-	'texte_documents_associes' => 'Os documentos a seguir estão associados à matéria,
621
+    // T
622
+    'taille_go' => '@taille@ GB',
623
+    'taille_ko' => '@taille@ KB',
624
+    'taille_mo' => '@taille@ MB',
625
+    'taille_octets' => ' @taille@ bytes',
626
+    'taille_octets_bi' => ' @taille@ bytes',
627
+    'texte_actualite_site_1' => 'Quando você estiver mais familiarizado com a interface, clique em «',
628
+    'texte_actualite_site_2' => 'interface completa',
629
+    'texte_actualite_site_3' => '» para abrir mais possibilidades.',
630
+    'texte_creation_automatique_vignette' => 'A criação automática de ícones de visualização está ativada neste site. Se você transferir por este formulário imagens no(s) formato(s) @gd_formats@, elas serão acompanhadas de um ícone com o tamanho máximo de @taille_preview@ pixels.',
631
+    'texte_documents_associes' => 'Os documentos a seguir estão associados à matéria,
632 632
 mas eles não foram inseridos diretamente. Dependendo da elaboração dos templates do site público, eles podem aparecer como documentos anexados.',
633
-	'texte_erreur_mise_niveau_base' => 'Erro da base de dados durante a atualização.
633
+    'texte_erreur_mise_niveau_base' => 'Erro da base de dados durante a atualização.
634 634
 A imagem <b>@fichier@</b> não passou (matéria @id_article@).
635 635
 Anote esta referência, tente novamente a atualização e, finalmente, verifique se as imagens aparecem nas matérias.',
636
-	'texte_erreur_visiteur' => 'Você tentou acessar o espaço restrito com um login que não tem a permissão necessária.',
637
-	'texte_inc_auth_1' => 'Você se identificou com o login <b>@auth_login@</b>, mas ele não consta (mais) na base.
636
+    'texte_erreur_visiteur' => 'Você tentou acessar o espaço restrito com um login que não tem a permissão necessária.',
637
+    'texte_inc_auth_1' => 'Você se identificou com o login <b>@auth_login@</b>, mas ele não consta (mais) na base.
638 638
 Tente se',
639
-	'texte_inc_auth_2' => 'reconectar',
640
-	'texte_inc_auth_3' => ', após ter eventualmente saído e reiniciado o seu navegador.',
641
-	'texte_inc_config' => 'As modificações efetuadas nestas páginas influem consideravelmente no funcionamento do seu site. É recomendável não intervir enquanto você não estiver familiarizado com o funcionamento do sistema SPIP.<br /><br /><b>Geralmente, é fortemente aconselhável deixar a carga destas páginas para o webmaster principal do seu site.</b>',
642
-	'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do site, queira por favor,',
643
-	'texte_inc_meta_2' => 'Verificar os direitos de escrita',
644
-	'texte_inc_meta_3' => 'no diretório <code>@repertoire@</code>.',
645
-	'texte_statut_en_cours_redaction' => 'em fase de redação',
646
-	'texte_statut_poubelle' => 'na lixeira',
647
-	'texte_statut_propose_evaluation' => 'proposto para avaliação',
648
-	'texte_statut_publie' => 'publicado online',
649
-	'texte_statut_refuse' => 'recusado',
650
-	'titre_ajouter_mot_cle' => 'INCLUIR UMA PALAVRA-CHAVE:',
651
-	'titre_cadre_raccourcis' => 'ATALHOS:',
652
-	'titre_changer_couleur_interface' => 'Alterar a côr da interface',
653
-	'titre_image_admin_article' => 'Você pode administrar esta matéria',
654
-	'titre_image_administrateur' => 'Administrador',
655
-	'titre_image_aide' => 'Ajuda sobre este elemento',
656
-	'titre_image_auteur_supprime' => 'Autor excluído',
657
-	'titre_image_redacteur' => 'Redator sem acesso',
658
-	'titre_image_redacteur_02' => 'Redator',
659
-	'titre_image_selecteur' => 'Ver a lista',
660
-	'titre_image_visiteur' => 'Visitante',
661
-	'titre_joindre_document' => 'INCLUIR UM DOCUMENTO',
662
-	'titre_mots_cles' => 'PALAVRAS-CHAVE',
663
-	'titre_probleme_technique' => 'Atenção: um problema técnico (servidor SQL) impede o acesso a esta parte do site. Agradecemos sua compreensão.',
664
-	'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA SEÇÃO',
665
-	'titre_signatures_attente' => 'Assinaturas aguardando validação',
666
-	'titre_signatures_confirmees' => 'Assinaturas confirmadas',
667
-	'titre_statistiques' => 'Estatísticas do site',
668
-	'titre_titre_document' => 'Título do documento:',
669
-	'todo' => 'breve',
670
-	'trad_definir_reference' => 'Escolher "@titre@" como referência das traduções',
671
-	'trad_reference' => '(matéria das traduções)',
639
+    'texte_inc_auth_2' => 'reconectar',
640
+    'texte_inc_auth_3' => ', após ter eventualmente saído e reiniciado o seu navegador.',
641
+    'texte_inc_config' => 'As modificações efetuadas nestas páginas influem consideravelmente no funcionamento do seu site. É recomendável não intervir enquanto você não estiver familiarizado com o funcionamento do sistema SPIP.<br /><br /><b>Geralmente, é fortemente aconselhável deixar a carga destas páginas para o webmaster principal do seu site.</b>',
642
+    'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do site, queira por favor,',
643
+    'texte_inc_meta_2' => 'Verificar os direitos de escrita',
644
+    'texte_inc_meta_3' => 'no diretório <code>@repertoire@</code>.',
645
+    'texte_statut_en_cours_redaction' => 'em fase de redação',
646
+    'texte_statut_poubelle' => 'na lixeira',
647
+    'texte_statut_propose_evaluation' => 'proposto para avaliação',
648
+    'texte_statut_publie' => 'publicado online',
649
+    'texte_statut_refuse' => 'recusado',
650
+    'titre_ajouter_mot_cle' => 'INCLUIR UMA PALAVRA-CHAVE:',
651
+    'titre_cadre_raccourcis' => 'ATALHOS:',
652
+    'titre_changer_couleur_interface' => 'Alterar a côr da interface',
653
+    'titre_image_admin_article' => 'Você pode administrar esta matéria',
654
+    'titre_image_administrateur' => 'Administrador',
655
+    'titre_image_aide' => 'Ajuda sobre este elemento',
656
+    'titre_image_auteur_supprime' => 'Autor excluído',
657
+    'titre_image_redacteur' => 'Redator sem acesso',
658
+    'titre_image_redacteur_02' => 'Redator',
659
+    'titre_image_selecteur' => 'Ver a lista',
660
+    'titre_image_visiteur' => 'Visitante',
661
+    'titre_joindre_document' => 'INCLUIR UM DOCUMENTO',
662
+    'titre_mots_cles' => 'PALAVRAS-CHAVE',
663
+    'titre_probleme_technique' => 'Atenção: um problema técnico (servidor SQL) impede o acesso a esta parte do site. Agradecemos sua compreensão.',
664
+    'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA SEÇÃO',
665
+    'titre_signatures_attente' => 'Assinaturas aguardando validação',
666
+    'titre_signatures_confirmees' => 'Assinaturas confirmadas',
667
+    'titre_statistiques' => 'Estatísticas do site',
668
+    'titre_titre_document' => 'Título do documento:',
669
+    'todo' => 'breve',
670
+    'trad_definir_reference' => 'Escolher "@titre@" como referência das traduções',
671
+    'trad_reference' => '(matéria das traduções)',
672 672
 
673
-	// U
674
-	'upload_limit' => 'Este arquivo é grande demais para o servidor; o tamanho máximo autorizado para <i>upload</i> é de @max@.',
673
+    // U
674
+    'upload_limit' => 'Este arquivo é grande demais para o servidor; o tamanho máximo autorizado para <i>upload</i> é de @max@.',
675 675
 
676
-	// Z
677
-	'zbug_balise_b_aval' => ': tag B colocada após BOUCLE',
678
-	'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@',
679
-	'zbug_balise_sans_argument' => 'Falta um arqumento na tag @balise@',
680
-	'zbug_boucle' => 'laço',
681
-	'zbug_boucle_recursive_undef' => 'Laço recursivo não definido: @nom@',
682
-	'zbug_calcul' => 'cálculo',
683
-	'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço',
684
-	'zbug_champ_hors_critere' => 'Campo @champ@ fora do critério @critere@',
685
-	'zbug_champ_hors_motif' => 'Campo @champ@ fora de um contexto @motif@',
686
-	'zbug_code' => 'código',
687
-	'zbug_critere_inconnu' => 'Critério @critere@ desconhecido',
688
-	'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} em uma tabela sem chave primária atômica',
689
-	'zbug_distant_interdit' => 'Externa interdita',
690
-	'zbug_doublon_table_sans_cle_primaire' => 'Duplicação em tabela sem chave primária atômica',
691
-	'zbug_doublon_table_sans_index' => 'Doublons em uma tabela sem index',
692
-	'zbug_erreur_boucle_double' => 'Dupla definição do laço @id@',
693
-	'zbug_erreur_boucle_fermant' => 'Laço @id@ não fechado',
694
-	'zbug_erreur_boucle_syntaxe' => 'Sintaxe do laço @id@ está incorreta',
695
-	'zbug_erreur_compilation' => 'Erro de compilação',
696
-	'zbug_erreur_execution_page' => 'Erro de execução',
697
-	'zbug_erreur_filtre' => 'Filtro @filtre@ não definido',
698
-	'zbug_erreur_filtre_nbarg_min' => 'Filtro @filtre@: falta(m) @nb@ argumento(s)',
699
-	'zbug_erreur_meme_parent' => 'O critério {meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)',
700
-	'zbug_erreur_squelette' => 'Erro(s) no template',
701
-	'zbug_hors_compilation' => 'Fora de Compilação',
702
-	'zbug_info_erreur_squelette' => 'Erro no site',
703
-	'zbug_inversion_ordre_inexistant' => 'Inversão de uma ordem inexistente',
704
-	'zbug_pagination_sans_critere' => 'Tag #PAGINATION sem critério {pagination} ou usada dentro de uma boucle recursiva',
705
-	'zbug_parametres_inclus_incorrects' => 'Parâmetro de inclusão incorreto: @param@',
706
-	'zbug_profile' => 'Tempo de processamento: @time@',
707
-	'zbug_resultat' => 'resultado',
708
-	'zbug_serveur_indefini' => 'Sevidor SQL não definido',
709
-	'zbug_statistiques' => 'Estatísticas das requisições SQL classificadas por duração',
710
-	'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida',
711
-	'zxml_connus_attributs' => 'atributos conhecidos',
712
-	'zxml_de' => 'de',
713
-	'zxml_inconnu_attribut' => 'atributo desconhecido',
714
-	'zxml_inconnu_balise' => 'tag desconhecida',
715
-	'zxml_inconnu_entite' => 'entidade desconhecida',
716
-	'zxml_inconnu_id' => 'ID desconhecida',
717
-	'zxml_mais_de' => 'mas de',
718
-	'zxml_non_conforme' => 'não está de acordo com o motivo',
719
-	'zxml_non_fils' => 'não é filho de',
720
-	'zxml_nonvide_balise' => 'tag não vazia',
721
-	'zxml_obligatoire_attribut' => 'atributo obrigatório mas ausente em',
722
-	'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorreta',
723
-	'zxml_survoler' => 'sobrepor para ver os corretos',
724
-	'zxml_valeur_attribut' => 'valor do atributo',
725
-	'zxml_vide_balise' => 'tag vazia',
726
-	'zxml_vu' => 'previsualização'
676
+    // Z
677
+    'zbug_balise_b_aval' => ': tag B colocada após BOUCLE',
678
+    'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@',
679
+    'zbug_balise_sans_argument' => 'Falta um arqumento na tag @balise@',
680
+    'zbug_boucle' => 'laço',
681
+    'zbug_boucle_recursive_undef' => 'Laço recursivo não definido: @nom@',
682
+    'zbug_calcul' => 'cálculo',
683
+    'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço',
684
+    'zbug_champ_hors_critere' => 'Campo @champ@ fora do critério @critere@',
685
+    'zbug_champ_hors_motif' => 'Campo @champ@ fora de um contexto @motif@',
686
+    'zbug_code' => 'código',
687
+    'zbug_critere_inconnu' => 'Critério @critere@ desconhecido',
688
+    'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} em uma tabela sem chave primária atômica',
689
+    'zbug_distant_interdit' => 'Externa interdita',
690
+    'zbug_doublon_table_sans_cle_primaire' => 'Duplicação em tabela sem chave primária atômica',
691
+    'zbug_doublon_table_sans_index' => 'Doublons em uma tabela sem index',
692
+    'zbug_erreur_boucle_double' => 'Dupla definição do laço @id@',
693
+    'zbug_erreur_boucle_fermant' => 'Laço @id@ não fechado',
694
+    'zbug_erreur_boucle_syntaxe' => 'Sintaxe do laço @id@ está incorreta',
695
+    'zbug_erreur_compilation' => 'Erro de compilação',
696
+    'zbug_erreur_execution_page' => 'Erro de execução',
697
+    'zbug_erreur_filtre' => 'Filtro @filtre@ não definido',
698
+    'zbug_erreur_filtre_nbarg_min' => 'Filtro @filtre@: falta(m) @nb@ argumento(s)',
699
+    'zbug_erreur_meme_parent' => 'O critério {meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)',
700
+    'zbug_erreur_squelette' => 'Erro(s) no template',
701
+    'zbug_hors_compilation' => 'Fora de Compilação',
702
+    'zbug_info_erreur_squelette' => 'Erro no site',
703
+    'zbug_inversion_ordre_inexistant' => 'Inversão de uma ordem inexistente',
704
+    'zbug_pagination_sans_critere' => 'Tag #PAGINATION sem critério {pagination} ou usada dentro de uma boucle recursiva',
705
+    'zbug_parametres_inclus_incorrects' => 'Parâmetro de inclusão incorreto: @param@',
706
+    'zbug_profile' => 'Tempo de processamento: @time@',
707
+    'zbug_resultat' => 'resultado',
708
+    'zbug_serveur_indefini' => 'Sevidor SQL não definido',
709
+    'zbug_statistiques' => 'Estatísticas das requisições SQL classificadas por duração',
710
+    'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida',
711
+    'zxml_connus_attributs' => 'atributos conhecidos',
712
+    'zxml_de' => 'de',
713
+    'zxml_inconnu_attribut' => 'atributo desconhecido',
714
+    'zxml_inconnu_balise' => 'tag desconhecida',
715
+    'zxml_inconnu_entite' => 'entidade desconhecida',
716
+    'zxml_inconnu_id' => 'ID desconhecida',
717
+    'zxml_mais_de' => 'mas de',
718
+    'zxml_non_conforme' => 'não está de acordo com o motivo',
719
+    'zxml_non_fils' => 'não é filho de',
720
+    'zxml_nonvide_balise' => 'tag não vazia',
721
+    'zxml_obligatoire_attribut' => 'atributo obrigatório mas ausente em',
722
+    'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorreta',
723
+    'zxml_survoler' => 'sobrepor para ver os corretos',
724
+    'zxml_valeur_attribut' => 'valor do atributo',
725
+    'zxml_vide_balise' => 'tag vazia',
726
+    'zxml_vu' => 'previsualização'
727 727
 );
Please login to merge, or discard this patch.