Completed
Push — master ( cacd66...717daf )
by cam
02:37 queued 21s
created
ecrire/lang/ecrire_eo.php 1 patch
Indentation   +827 added lines, -827 removed lines patch added patch discarded remove patch
@@ -4,411 +4,411 @@  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
-	'activer_plugin' => 'Aktivigi la kromprogramon',
14
-	'affichage' => 'Afiŝado',
15
-	'aide_non_disponible' => 'Tiu ĉi parto de la rethelpilo ankoraŭ ne disponeblas en tiu ĉi lingvo.',
16
-	'annuler_recherche' => 'Nuligi serĉon',
17
-	'auteur' => 'Aŭtoro :',
18
-	'avis_acces_interdit' => 'Malpermesata aliro.',
19
-	'avis_article_modifie' => 'Atentu, @nom_auteur_modif@ laboris pri tiu artikolo antaŭ @date_diff@ minutoj',
20
-	'avis_aucun_resultat' => 'Neniu rezulto.',
21
-	'avis_base_inaccessible' => 'Ne eblas konektiĝi al la datumbazo @base@.',
22
-	'avis_chemin_invalide_1' => 'La alirvojo, kiun vi elektis, ',
23
-	'avis_chemin_invalide_2' => 'ne ŝajnas taŭgi. Bonvolu reveni al la antaŭa paĝo kaj kontroli la entajpitajn datenojn.',
24
-	'avis_connexion_echec_1' => 'Konektiĝo al SQL-servilo malsukcesis.',
25
-	'avis_connexion_echec_2' => 'Revenu al la antaŭa paĝo, kaj kontrolu entajpitajn datenojn.',
26
-	'avis_connexion_echec_3' => '<b>N.B.</b> Ĉe multaj serviloj, vi devas <b>peti</b> aktivigon de via aliro al SQL-datumbazo antaŭ ol uzi ĝin. Se vi ne povas konektiĝi, kontrolu ke vi ja faris tiun ĉi demarŝon.',
27
-	'avis_connexion_erreur_creer_base' => 'La datenbazo ne povis esti kreita.',
28
-	'avis_connexion_erreur_nom_base' => 'La nomo de la datumbazo enhaveblas nur literoj, ciferoj kaj haltostrekoj',
29
-	'avis_connexion_ldap_echec_1' => 'Konektiĝo al LDAP-servilo malsukcesis.',
30
-	'avis_connexion_ldap_echec_2' => 'Revenu al la antaŭa paĝo, kaj kontrolu la entajpitajn datenojn. ',
31
-	'avis_connexion_ldap_echec_3' => 'Eventuale, provu ne uzi LDAP-materialon por importi uzantojn.',
32
-	'avis_deplacement_rubrique' => 'Atentu ! Tiu ĉi rubriko enhavas @contient_breves@ fulm-informon @scb@ : se vi translokas ĝin, bonvolu noĉi tiun por-konfirman noĉujon. ',
33
-	'avis_erreur_connexion_mysql' => 'SQL-konekta eraro ',
34
-	'avis_espace_interdit' => '<b>Malpermesata aliro</b> <div>SPIP jam estas instalita.</div>',
35
-	'avis_lecture_noms_bases_1' => 'Instalprogramo ne sukcesis legi la nomojn de la instalitaj datenbazoj.',
36
-	'avis_lecture_noms_bases_2' => 'Aŭ neniu datenbazo disponeblas, aŭ la funkcio ebliganta listigi datenbazojn estis malaktivigita pro sekuraj kialoj (tio ja okazas ĉe multaj retejoj-gastigantoj).',
37
-	'avis_lecture_noms_bases_3' => 'Okaze de la dua alternativo, eble uzeblos datenbazo nomita per via salutnomo :',
38
-	'avis_non_acces_page' => 'Vi ne havas alir-rajton al tiu paĝo.',
39
-	'avis_operation_echec' => 'La ago malsukcesis.',
40
-	'avis_operation_impossible' => 'Faro ne ebla',
41
-	'avis_suppression_base' => 'ATENTU, forviŝo de datenoj estas definitiva',
12
+    // A
13
+    'activer_plugin' => 'Aktivigi la kromprogramon',
14
+    'affichage' => 'Afiŝado',
15
+    'aide_non_disponible' => 'Tiu ĉi parto de la rethelpilo ankoraŭ ne disponeblas en tiu ĉi lingvo.',
16
+    'annuler_recherche' => 'Nuligi serĉon',
17
+    'auteur' => 'Aŭtoro :',
18
+    'avis_acces_interdit' => 'Malpermesata aliro.',
19
+    'avis_article_modifie' => 'Atentu, @nom_auteur_modif@ laboris pri tiu artikolo antaŭ @date_diff@ minutoj',
20
+    'avis_aucun_resultat' => 'Neniu rezulto.',
21
+    'avis_base_inaccessible' => 'Ne eblas konektiĝi al la datumbazo @base@.',
22
+    'avis_chemin_invalide_1' => 'La alirvojo, kiun vi elektis, ',
23
+    'avis_chemin_invalide_2' => 'ne ŝajnas taŭgi. Bonvolu reveni al la antaŭa paĝo kaj kontroli la entajpitajn datenojn.',
24
+    'avis_connexion_echec_1' => 'Konektiĝo al SQL-servilo malsukcesis.',
25
+    'avis_connexion_echec_2' => 'Revenu al la antaŭa paĝo, kaj kontrolu entajpitajn datenojn.',
26
+    'avis_connexion_echec_3' => '<b>N.B.</b> Ĉe multaj serviloj, vi devas <b>peti</b> aktivigon de via aliro al SQL-datumbazo antaŭ ol uzi ĝin. Se vi ne povas konektiĝi, kontrolu ke vi ja faris tiun ĉi demarŝon.',
27
+    'avis_connexion_erreur_creer_base' => 'La datenbazo ne povis esti kreita.',
28
+    'avis_connexion_erreur_nom_base' => 'La nomo de la datumbazo enhaveblas nur literoj, ciferoj kaj haltostrekoj',
29
+    'avis_connexion_ldap_echec_1' => 'Konektiĝo al LDAP-servilo malsukcesis.',
30
+    'avis_connexion_ldap_echec_2' => 'Revenu al la antaŭa paĝo, kaj kontrolu la entajpitajn datenojn. ',
31
+    'avis_connexion_ldap_echec_3' => 'Eventuale, provu ne uzi LDAP-materialon por importi uzantojn.',
32
+    'avis_deplacement_rubrique' => 'Atentu ! Tiu ĉi rubriko enhavas @contient_breves@ fulm-informon @scb@ : se vi translokas ĝin, bonvolu noĉi tiun por-konfirman noĉujon. ',
33
+    'avis_erreur_connexion_mysql' => 'SQL-konekta eraro ',
34
+    'avis_espace_interdit' => '<b>Malpermesata aliro</b> <div>SPIP jam estas instalita.</div>',
35
+    'avis_lecture_noms_bases_1' => 'Instalprogramo ne sukcesis legi la nomojn de la instalitaj datenbazoj.',
36
+    'avis_lecture_noms_bases_2' => 'Aŭ neniu datenbazo disponeblas, aŭ la funkcio ebliganta listigi datenbazojn estis malaktivigita pro sekuraj kialoj (tio ja okazas ĉe multaj retejoj-gastigantoj).',
37
+    'avis_lecture_noms_bases_3' => 'Okaze de la dua alternativo, eble uzeblos datenbazo nomita per via salutnomo :',
38
+    'avis_non_acces_page' => 'Vi ne havas alir-rajton al tiu paĝo.',
39
+    'avis_operation_echec' => 'La ago malsukcesis.',
40
+    'avis_operation_impossible' => 'Faro ne ebla',
41
+    'avis_suppression_base' => 'ATENTU, forviŝo de datenoj estas definitiva',
42 42
 
43
-	// B
44
-	'bouton_acces_ldap' => 'Aldoni aliron al LDAP',
45
-	'bouton_ajouter' => 'Aldoni',
46
-	'bouton_annuler' => 'Nuligi',
47
-	'bouton_cache_activer' => 'Reaktivigi la staplon',
48
-	'bouton_cache_desactiver' => 'Malaktivigi maldaŭre la staplon',
49
-	'bouton_demande_publication' => 'Peti publikigon de tiu ĉi artikolo',
50
-	'bouton_desactive_tout' => 'Ĉion malaktivigi',
51
-	'bouton_desinstaller' => 'Malinstali',
52
-	'bouton_effacer_tout' => 'Forviŝi ĈION',
53
-	'bouton_envoyer_message' => 'Definitiva mesaĝo : sendi',
54
-	'bouton_fermer' => 'Fermi',
55
-	'bouton_mettre_a_jour_base' => 'Ĝisdatigi la datumbazo',
56
-	'bouton_modifier' => 'Modifi',
57
-	'bouton_radio_afficher' => 'Afiŝi',
58
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Aperi en la listo de konektitaj redaktantoj',
59
-	'bouton_radio_envoi_annonces_adresse' => 'Sendi la anoncojn al jena adreso :',
60
-	'bouton_radio_envoi_liste_nouveautes' => 'Sendi la novaĵoj-liston',
61
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Ne aperi en la listo de redaktantoj',
62
-	'bouton_radio_non_envoi_annonces_editoriales' => 'Ne sendi anoncojn pri ĉefartikoloj',
63
-	'bouton_redirection' => 'ALIDIREKTIGO',
64
-	'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Restarigi laŭ defaŭltaj valoroj',
65
-	'bouton_relancer_installation' => 'Relanĉi la instaladon',
66
-	'bouton_reset_password' => 'Krei novan pasvorton, kaj sendi ĝin retpoŝte',
67
-	'bouton_suivant' => 'Sekvanta',
68
-	'bouton_tenter_recuperation' => 'Provi riparon',
69
-	'bouton_test_proxy' => 'Provi la prokuran servilon',
70
-	'bouton_vider_cache' => 'Malplenigi la staplon',
43
+    // B
44
+    'bouton_acces_ldap' => 'Aldoni aliron al LDAP',
45
+    'bouton_ajouter' => 'Aldoni',
46
+    'bouton_annuler' => 'Nuligi',
47
+    'bouton_cache_activer' => 'Reaktivigi la staplon',
48
+    'bouton_cache_desactiver' => 'Malaktivigi maldaŭre la staplon',
49
+    'bouton_demande_publication' => 'Peti publikigon de tiu ĉi artikolo',
50
+    'bouton_desactive_tout' => 'Ĉion malaktivigi',
51
+    'bouton_desinstaller' => 'Malinstali',
52
+    'bouton_effacer_tout' => 'Forviŝi ĈION',
53
+    'bouton_envoyer_message' => 'Definitiva mesaĝo : sendi',
54
+    'bouton_fermer' => 'Fermi',
55
+    'bouton_mettre_a_jour_base' => 'Ĝisdatigi la datumbazo',
56
+    'bouton_modifier' => 'Modifi',
57
+    'bouton_radio_afficher' => 'Afiŝi',
58
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Aperi en la listo de konektitaj redaktantoj',
59
+    'bouton_radio_envoi_annonces_adresse' => 'Sendi la anoncojn al jena adreso :',
60
+    'bouton_radio_envoi_liste_nouveautes' => 'Sendi la novaĵoj-liston',
61
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Ne aperi en la listo de redaktantoj',
62
+    'bouton_radio_non_envoi_annonces_editoriales' => 'Ne sendi anoncojn pri ĉefartikoloj',
63
+    'bouton_redirection' => 'ALIDIREKTIGO',
64
+    'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Restarigi laŭ defaŭltaj valoroj',
65
+    'bouton_relancer_installation' => 'Relanĉi la instaladon',
66
+    'bouton_reset_password' => 'Krei novan pasvorton, kaj sendi ĝin retpoŝte',
67
+    'bouton_suivant' => 'Sekvanta',
68
+    'bouton_tenter_recuperation' => 'Provi riparon',
69
+    'bouton_test_proxy' => 'Provi la prokuran servilon',
70
+    'bouton_vider_cache' => 'Malplenigi la staplon',
71 71
 
72
-	// C
73
-	'cache_modifiable_webmestre' => 'Tiun parametron povas modifi la retejestro.',
74
-	'calendrier_synchro' => 'Se vi uzas temp-organizan bitvaron kongruan kun <b>iCal</b> formato, vi povas ĝisdatigi tiun lastan laŭ la datenoj de tiu ĉi retejo.',
75
-	'config_activer_champs' => 'Ŝalti la jenajn kampojn',
76
-	'config_choix_base_sup' => 'indiki datumbazon ĉe tiu ĉi servilo',
77
-	'config_erreur_base_sup' => 'SPIP ne havas alireblon al listo de alireblaj bazoj',
78
-	'config_info_base_sup' => 'Se vi havas aliajn datumbazojn por pridemandi tra SPIP, pere de ĝia SQL-servilo aŭ de alia servilo, la ĉi-suba formularo ebligas al vi ilin deklari. Se vi lasas tajpujojn malplenaj, la ensalutiloj al la ĉefa datumbazo estos uzitaj.',
79
-	'config_info_base_sup_disponibles' => 'Jam pridemandeblaj kromaj datumbazoj :',
80
-	'config_info_enregistree' => 'La nova agordo estas registrita',
81
-	'config_info_logos' => 'Ĉiu elemento de la retejo povas havi vinjeton, kaj « flugrigardeblajn vinjeton »',
82
-	'config_info_logos_utiliser' => 'Uzi la vinjetojn',
83
-	'config_info_logos_utiliser_non' => 'Ne uzi la vinjetojn',
84
-	'config_info_logos_utiliser_survol' => 'Uzi la flugrigardajn vinjetojn',
85
-	'config_info_logos_utiliser_survol_non' => 'Ne uzi la flugrigardeblajn vinjetojn',
86
-	'config_info_redirection' => 'Se vi ŝaltas tiun ĉi opcion, vi povos krei virtualajn artikolojn, simplajn referencojn pri artikoloj publikigitaj ĉe aliaj retejoj aŭ ekster SPIP.',
87
-	'config_redirection' => 'Virtualaj artikoloj',
88
-	'config_titre_base_sup' => 'Deklaro de kroma datumbazo',
89
-	'config_titre_base_sup_choix' => 'Elektu kroman datumbazon',
90
-	'connexion_ldap' => 'Konektiĝo :',
91
-	'creer_et_associer_un_auteur' => 'Krei kaj ligi aŭtoron',
72
+    // C
73
+    'cache_modifiable_webmestre' => 'Tiun parametron povas modifi la retejestro.',
74
+    'calendrier_synchro' => 'Se vi uzas temp-organizan bitvaron kongruan kun <b>iCal</b> formato, vi povas ĝisdatigi tiun lastan laŭ la datenoj de tiu ĉi retejo.',
75
+    'config_activer_champs' => 'Ŝalti la jenajn kampojn',
76
+    'config_choix_base_sup' => 'indiki datumbazon ĉe tiu ĉi servilo',
77
+    'config_erreur_base_sup' => 'SPIP ne havas alireblon al listo de alireblaj bazoj',
78
+    'config_info_base_sup' => 'Se vi havas aliajn datumbazojn por pridemandi tra SPIP, pere de ĝia SQL-servilo aŭ de alia servilo, la ĉi-suba formularo ebligas al vi ilin deklari. Se vi lasas tajpujojn malplenaj, la ensalutiloj al la ĉefa datumbazo estos uzitaj.',
79
+    'config_info_base_sup_disponibles' => 'Jam pridemandeblaj kromaj datumbazoj :',
80
+    'config_info_enregistree' => 'La nova agordo estas registrita',
81
+    'config_info_logos' => 'Ĉiu elemento de la retejo povas havi vinjeton, kaj « flugrigardeblajn vinjeton »',
82
+    'config_info_logos_utiliser' => 'Uzi la vinjetojn',
83
+    'config_info_logos_utiliser_non' => 'Ne uzi la vinjetojn',
84
+    'config_info_logos_utiliser_survol' => 'Uzi la flugrigardajn vinjetojn',
85
+    'config_info_logos_utiliser_survol_non' => 'Ne uzi la flugrigardeblajn vinjetojn',
86
+    'config_info_redirection' => 'Se vi ŝaltas tiun ĉi opcion, vi povos krei virtualajn artikolojn, simplajn referencojn pri artikoloj publikigitaj ĉe aliaj retejoj aŭ ekster SPIP.',
87
+    'config_redirection' => 'Virtualaj artikoloj',
88
+    'config_titre_base_sup' => 'Deklaro de kroma datumbazo',
89
+    'config_titre_base_sup_choix' => 'Elektu kroman datumbazon',
90
+    'connexion_ldap' => 'Konektiĝo :',
91
+    'creer_et_associer_un_auteur' => 'Krei kaj ligi aŭtoron',
92 92
 
93
-	// D
94
-	'date_mot_heures' => 'horoj',
93
+    // D
94
+    'date_mot_heures' => 'horoj',
95 95
 
96
-	// E
97
-	'ecran_securite' => ' + sekuriga ŝirmilo @version@',
98
-	'email' => 'retpoŝtadreso',
99
-	'email_2' => 'retpoŝtadreso :',
100
-	'en_savoir_plus' => 'Pli scii tion',
101
-	'entree_adresse_annuaire' => 'Adreso al la dosierujilo',
102
-	'entree_adresse_email' => 'Via retpoŝtadreso',
103
-	'entree_adresse_email_2' => ' Retpoŝtadreso',
104
-	'entree_base_donnee_1' => 'Adreso de la datenbazo',
105
-	'entree_base_donnee_2' => '(Tiu adreso ofte estas tiu de via retejo, foje estas "localhost", alifoje la entajpujo restas malplena.)',
106
-	'entree_biographie' => 'Mallonga kelkvorta biografio.',
107
-	'entree_chemin_acces' => '<b>Entajpi</b> alirvojon :',
108
-	'entree_cle_pgp' => 'Via PGP-ŝlosilo ',
109
-	'entree_cle_pgp_2' => 'PGP-ŝlosilo',
110
-	'entree_contenu_rubrique' => '(Enhavo de la rubriko per kelkaj vortoj.)',
111
-	'entree_identifiants_connexion' => 'Viaj ensalutiloj...',
112
-	'entree_identifiants_connexion_2' => 'Ensalutiloj',
113
-	'entree_informations_connexion_ldap' => 'En tiun formularon, bonvolu entajpi informojn por konekti al via LDAP-dosierujilo. Tiujn informojn disponigu al vi la sistema aŭ reta mastrumanto.',
114
-	'entree_infos_perso' => 'Kiu vi estas ?',
115
-	'entree_infos_perso_2' => 'Kiu estas la aŭtoro ?',
116
-	'entree_interieur_rubrique' => 'En la rubriko :',
117
-	'entree_liens_sites' => '<b>Hiperligilo</b> (referenco, vizitinda retejo...)',
118
-	'entree_login' => 'Via salutnomo',
119
-	'entree_login_connexion_1' => 'La salutnomo',
120
-	'entree_login_connexion_2' => '(Foje estas via salutnomo por eniri la FTP-ejon ; foje ĝi restas malplena)',
121
-	'entree_mot_passe' => 'Via pasvorto',
122
-	'entree_mot_passe_1' => 'La pasvorto por ensaluti',
123
-	'entree_mot_passe_2' => '(Foje estas via pasvorto por la FTP-ejo ; foje ĝi restas malplena)',
124
-	'entree_nom_fichier' => 'Bonvolu entajpi la dosieran nomon @texte_compresse@ :',
125
-	'entree_nom_pseudo' => 'Via nomo aŭ via kromnomo',
126
-	'entree_nom_pseudo_1' => '(Via nomo aŭ via kromnomo)',
127
-	'entree_nom_pseudo_2' => 'Nomo aŭ kromnomo',
128
-	'entree_nom_site' => 'La nomo de via retejo',
129
-	'entree_nom_site_2' => 'retejnomo de la aŭtoro',
130
-	'entree_nouveau_passe' => 'Nova pasvorto',
131
-	'entree_passe_ldap' => 'Pasvorto',
132
-	'entree_port_annuaire' => 'Numero de la dosierujila pordo',
133
-	'entree_signature' => 'Subskribo',
134
-	'entree_titre_obligatoire' => '<b>Titolo</b> [Deviga]<br />',
135
-	'entree_url' => 'Retadreso de via retejo',
136
-	'entree_url_2' => 'Retadreso de la retejo',
137
-	'erreur_connect_deja_existant' => 'Servilo jam ekzistas kun tiu nomo',
138
-	'erreur_contenu_suspect' => 'Teksto kun ne aktivaj HTML-markoj',
139
-	'erreur_email_deja_existant' => 'Tiu retpoŝtadreso jam estas registrita.',
140
-	'erreur_nom_connect_incorrect' => 'Tiu servilonomo ne estas permesita',
141
-	'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ mankas en la marko @balise@.',
142
-	'erreur_plugin_desinstalation_echouee' => 'La malinstalo de la kromprogramo malsukcesis.
96
+    // E
97
+    'ecran_securite' => ' + sekuriga ŝirmilo @version@',
98
+    'email' => 'retpoŝtadreso',
99
+    'email_2' => 'retpoŝtadreso :',
100
+    'en_savoir_plus' => 'Pli scii tion',
101
+    'entree_adresse_annuaire' => 'Adreso al la dosierujilo',
102
+    'entree_adresse_email' => 'Via retpoŝtadreso',
103
+    'entree_adresse_email_2' => ' Retpoŝtadreso',
104
+    'entree_base_donnee_1' => 'Adreso de la datenbazo',
105
+    'entree_base_donnee_2' => '(Tiu adreso ofte estas tiu de via retejo, foje estas "localhost", alifoje la entajpujo restas malplena.)',
106
+    'entree_biographie' => 'Mallonga kelkvorta biografio.',
107
+    'entree_chemin_acces' => '<b>Entajpi</b> alirvojon :',
108
+    'entree_cle_pgp' => 'Via PGP-ŝlosilo ',
109
+    'entree_cle_pgp_2' => 'PGP-ŝlosilo',
110
+    'entree_contenu_rubrique' => '(Enhavo de la rubriko per kelkaj vortoj.)',
111
+    'entree_identifiants_connexion' => 'Viaj ensalutiloj...',
112
+    'entree_identifiants_connexion_2' => 'Ensalutiloj',
113
+    'entree_informations_connexion_ldap' => 'En tiun formularon, bonvolu entajpi informojn por konekti al via LDAP-dosierujilo. Tiujn informojn disponigu al vi la sistema aŭ reta mastrumanto.',
114
+    'entree_infos_perso' => 'Kiu vi estas ?',
115
+    'entree_infos_perso_2' => 'Kiu estas la aŭtoro ?',
116
+    'entree_interieur_rubrique' => 'En la rubriko :',
117
+    'entree_liens_sites' => '<b>Hiperligilo</b> (referenco, vizitinda retejo...)',
118
+    'entree_login' => 'Via salutnomo',
119
+    'entree_login_connexion_1' => 'La salutnomo',
120
+    'entree_login_connexion_2' => '(Foje estas via salutnomo por eniri la FTP-ejon ; foje ĝi restas malplena)',
121
+    'entree_mot_passe' => 'Via pasvorto',
122
+    'entree_mot_passe_1' => 'La pasvorto por ensaluti',
123
+    'entree_mot_passe_2' => '(Foje estas via pasvorto por la FTP-ejo ; foje ĝi restas malplena)',
124
+    'entree_nom_fichier' => 'Bonvolu entajpi la dosieran nomon @texte_compresse@ :',
125
+    'entree_nom_pseudo' => 'Via nomo aŭ via kromnomo',
126
+    'entree_nom_pseudo_1' => '(Via nomo aŭ via kromnomo)',
127
+    'entree_nom_pseudo_2' => 'Nomo aŭ kromnomo',
128
+    'entree_nom_site' => 'La nomo de via retejo',
129
+    'entree_nom_site_2' => 'retejnomo de la aŭtoro',
130
+    'entree_nouveau_passe' => 'Nova pasvorto',
131
+    'entree_passe_ldap' => 'Pasvorto',
132
+    'entree_port_annuaire' => 'Numero de la dosierujila pordo',
133
+    'entree_signature' => 'Subskribo',
134
+    'entree_titre_obligatoire' => '<b>Titolo</b> [Deviga]<br />',
135
+    'entree_url' => 'Retadreso de via retejo',
136
+    'entree_url_2' => 'Retadreso de la retejo',
137
+    'erreur_connect_deja_existant' => 'Servilo jam ekzistas kun tiu nomo',
138
+    'erreur_contenu_suspect' => 'Teksto kun ne aktivaj HTML-markoj',
139
+    'erreur_email_deja_existant' => 'Tiu retpoŝtadreso jam estas registrita.',
140
+    'erreur_nom_connect_incorrect' => 'Tiu servilonomo ne estas permesita',
141
+    'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ mankas en la marko @balise@.',
142
+    'erreur_plugin_desinstalation_echouee' => 'La malinstalo de la kromprogramo malsukcesis.
143 143
 Tamen vi povas malŝalti ĝin.',
144
-	'erreur_plugin_fichier_absent' => 'Foresta dosiero',
145
-	'erreur_plugin_fichier_def_absent' => 'Difina dosiero forestas',
146
-	'erreur_plugin_nom_fonction_interdit' => 'Malpermesata funkcio-nomo',
147
-	'erreur_plugin_nom_manquant' => 'Kromprogramo-nomo mankas',
148
-	'erreur_plugin_prefix_manquant' => 'Nedifinita nom-spaco de kromprogramo',
149
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; mankas en tiu difina dosiero',
150
-	'erreur_plugin_version_manquant' => 'Kromprogramo-versio mankas',
144
+    'erreur_plugin_fichier_absent' => 'Foresta dosiero',
145
+    'erreur_plugin_fichier_def_absent' => 'Difina dosiero forestas',
146
+    'erreur_plugin_nom_fonction_interdit' => 'Malpermesata funkcio-nomo',
147
+    'erreur_plugin_nom_manquant' => 'Kromprogramo-nomo mankas',
148
+    'erreur_plugin_prefix_manquant' => 'Nedifinita nom-spaco de kromprogramo',
149
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; mankas en tiu difina dosiero',
150
+    'erreur_plugin_version_manquant' => 'Kromprogramo-versio mankas',
151 151
 
152
-	// H
153
-	'htaccess_a_simuler' => 'Averto : la agordo de vian HTTP-servilo ignoras dosierojn @htaccess@. Por certigi taŭgan sekureco, vi devas ŝanĝi la agordon pri tio, aŭ ke konstantoj @constantes@ (difinebla en la dosiero mes_options.php) havas kiel valoro dosierujojn ekstere de @document_root@.',
154
-	'htaccess_inoperant' => 'senefika htaccess',
152
+    // H
153
+    'htaccess_a_simuler' => 'Averto : la agordo de vian HTTP-servilo ignoras dosierojn @htaccess@. Por certigi taŭgan sekureco, vi devas ŝanĝi la agordon pri tio, aŭ ke konstantoj @constantes@ (difinebla en la dosiero mes_options.php) havas kiel valoro dosierujojn ekstere de @document_root@.',
154
+    'htaccess_inoperant' => 'senefika htaccess',
155 155
 
156
-	// I
157
-	'ical_info1' => 'Tiu paĝo prezentas plurajn metodojn por daŭre ricevi informojn pri la vivo de tiu retejo.',
158
-	'ical_info2' => 'Por pli da informoj pri ĉi ĉiuj teknikoj, senhezite konsultu <a href="@spipnet@">la dokumentaron de SPIP</a>.',
159
-	'ical_info_calendrier' => 'Du kalendaroj disponeblas. La unua estas retejo-mapo anoncanta ĉiujn publikigitajn artikolojn. La dua enhavas la eldon-anoncojn, kaj viajn lastajn privatajn mesaĝojn : ĝi estas rezervita al vi, pere de persona ŝlosilo, kiun vi ĉiumomente povas modifi ŝanĝante vian pasvorton.',
160
-	'ical_methode_http' => 'Elŝuti',
161
-	'ical_methode_webcal' => 'Sinkroniga ĝisdatigo (webcal://)',
162
-	'ical_texte_js' => 'Per ununura linio de ĝavaskripto, vi povas simplege afiŝi ĉe kiu ajn retejo, kiun vi havas, la lastajn artikolojn publikigitajn ĉe tiu retejo.',
163
-	'ical_texte_prive' => 'Tiu ĉi strikte persona kalendaro, informas vin pri la privataj eldonoj de la retejo (personaj taskoj kaj rendevuoj, proponitaj artikoloj kaj fulm-informoj...).',
164
-	'ical_texte_public' => 'Per tiu ĉi kalendaro, vi povas gvati la publikan funkciadon de tiu retejo (publikigitaj fulm-informoj kaj artikoloj).',
165
-	'ical_texte_rss' => 'Vi povas abonŝuti la novaĵojn el tiu ĉi retejo al kiu ajn XML/RSS-legilo. Estas tiu formato, kiu ankaŭ ebligas al SPIP legi la novaĵojn publikigitajn ĉe aliaj retejoj, kiuj uzas kongruan formaton (aliaj abonligitaj retejoj).',
166
-	'ical_titre_js' => 'Ĝavaskripto',
167
-	'ical_titre_mailing' => 'Dissendlisto',
168
-	'ical_titre_rss' => 'Abonligoj',
169
-	'icone_accueil' => 'Hejmpaĝo',
170
-	'icone_activer_cookie' => 'Aktivigi la korespond-kuketon',
171
-	'icone_activite' => 'Aktiveco',
172
-	'icone_admin_plugin' => 'Mastrumado de kromprogramoj',
173
-	'icone_administration' => 'Bontenado',
174
-	'icone_afficher_auteurs' => 'Afiŝi la aŭtorojn',
175
-	'icone_afficher_visiteurs' => 'Afiŝi la vizitantojn',
176
-	'icone_arret_discussion' => 'Ne plu partopreni en ĉi tiu diskuto',
177
-	'icone_calendrier' => 'Kalendaro',
178
-	'icone_configuration' => 'Agordo',
179
-	'icone_creer_auteur' => 'Krei novan aŭtoron kaj ligi ŝlin al tiu artikolo',
180
-	'icone_creer_mot_cle' => 'Krei novan ŝlosilvorton kaj ligi ĝin al tiu artikolo',
181
-	'icone_creer_rubrique_2' => 'Krei novan rubrikon',
182
-	'icone_developpement' => 'Programado',
183
-	'icone_edition' => 'Eldono',
184
-	'icone_ma_langue' => 'Mia lingvo',
185
-	'icone_mes_infos' => 'Miaj informoj',
186
-	'icone_mes_preferences' => 'Miaj preferoj',
187
-	'icone_modifier_article' => 'Modifi tiun ĉi artikolon',
188
-	'icone_modifier_rubrique' => 'Modifi tiun ĉi rubrikon',
189
-	'icone_publication' => 'Publikigo',
190
-	'icone_relancer_signataire' => 'Reinstigi tiun ĉi subskribinton',
191
-	'icone_retour' => 'Reen',
192
-	'icone_retour_article' => 'Reen al la artikolo',
193
-	'icone_squelette' => 'Skeletoj',
194
-	'icone_suivi_publication' => 'Superrigardo de la publikigo',
195
-	'icone_supprimer_cookie' => 'Forviŝi la por-korespondan kuketon ',
196
-	'icone_supprimer_rubrique' => 'Forviŝi tiun rubrikon',
197
-	'icone_supprimer_signature' => 'Forviŝi tiun subskribon',
198
-	'icone_valider_signature' => 'Validigi tiun subskribon',
199
-	'image_administrer_rubrique' => 'Vi povas mastrumi tiun rubrikon',
200
-	'impossible_modifier_login_auteur' => 'Ne eblas modifi la salutnomo.', # MODIF
201
-	'impossible_modifier_pass_auteur' => 'Ne eblas modifi la pasvorto.', # MODIF
202
-	'info_1_article' => '1 artikolo',
203
-	'info_1_auteur' => '1 aŭtoro',
204
-	'info_1_message' => '1 mesaĝo',
205
-	'info_1_mot_cle' => '1 ŝlosilvorto',
206
-	'info_1_rubrique' => '1 rubriko',
207
-	'info_1_visiteur' => '1 vizitanto',
208
-	'info_activer_cookie' => 'Vi povas aktivigi <b>por-korespondan kuketon</b>. Tio ebligos al vi facile iri de la publika spaco al la privata.',
209
-	'info_activer_menu_developpement' => 'Montri la menuon Programado',
210
-	'info_admin_etre_webmestre' => 'Doni al mi la rajtoj de retejestro',
211
-	'info_admin_je_suis_webmestre' => 'Mi estas <b>retejestro</b>',
212
-	'info_admin_statuer_webmestre' => 'Doni al tiu mastrumanto la rajtoj de retejestro',
213
-	'info_admin_webmestre' => 'Tiu mastrumanto estas <b>retejestro</b>',
214
-	'info_administrateur' => 'Mastrumanto',
215
-	'info_administrateur_1' => 'Mastrumanto',
216
-	'info_administrateur_2' => 'de la retejo (<i>uzi singarde</i>)',
217
-	'info_administrateur_site_01' => 'Se vi estas mastrumanto de la retejo, bonvolu',
218
-	'info_administrateur_site_02' => 'musklaki ĉi-tiun ligilon',
219
-	'info_administrateurs' => 'Mastrumantoj',
220
-	'info_administrer_rubrique' => 'Vi povas mastrumi tiun rubrikon',
221
-	'info_adresse' => 'ĉe la adreso :',
222
-	'info_adresse_desinscription' => 'Adreso de malregistriĝo',
223
-	'info_adresse_url' => 'Retadreso (URL) de la publika retejo',
224
-	'info_afficher_par_nb' => 'Afiŝi per',
225
-	'info_aide_en_ligne' => 'Reta SPIP-helpilo',
226
-	'info_ajout_image' => 'Kiam vi ligas bildojn kiel alkroĉitajn dokumentojn al artikolo,
156
+    // I
157
+    'ical_info1' => 'Tiu paĝo prezentas plurajn metodojn por daŭre ricevi informojn pri la vivo de tiu retejo.',
158
+    'ical_info2' => 'Por pli da informoj pri ĉi ĉiuj teknikoj, senhezite konsultu <a href="@spipnet@">la dokumentaron de SPIP</a>.',
159
+    'ical_info_calendrier' => 'Du kalendaroj disponeblas. La unua estas retejo-mapo anoncanta ĉiujn publikigitajn artikolojn. La dua enhavas la eldon-anoncojn, kaj viajn lastajn privatajn mesaĝojn : ĝi estas rezervita al vi, pere de persona ŝlosilo, kiun vi ĉiumomente povas modifi ŝanĝante vian pasvorton.',
160
+    'ical_methode_http' => 'Elŝuti',
161
+    'ical_methode_webcal' => 'Sinkroniga ĝisdatigo (webcal://)',
162
+    'ical_texte_js' => 'Per ununura linio de ĝavaskripto, vi povas simplege afiŝi ĉe kiu ajn retejo, kiun vi havas, la lastajn artikolojn publikigitajn ĉe tiu retejo.',
163
+    'ical_texte_prive' => 'Tiu ĉi strikte persona kalendaro, informas vin pri la privataj eldonoj de la retejo (personaj taskoj kaj rendevuoj, proponitaj artikoloj kaj fulm-informoj...).',
164
+    'ical_texte_public' => 'Per tiu ĉi kalendaro, vi povas gvati la publikan funkciadon de tiu retejo (publikigitaj fulm-informoj kaj artikoloj).',
165
+    'ical_texte_rss' => 'Vi povas abonŝuti la novaĵojn el tiu ĉi retejo al kiu ajn XML/RSS-legilo. Estas tiu formato, kiu ankaŭ ebligas al SPIP legi la novaĵojn publikigitajn ĉe aliaj retejoj, kiuj uzas kongruan formaton (aliaj abonligitaj retejoj).',
166
+    'ical_titre_js' => 'Ĝavaskripto',
167
+    'ical_titre_mailing' => 'Dissendlisto',
168
+    'ical_titre_rss' => 'Abonligoj',
169
+    'icone_accueil' => 'Hejmpaĝo',
170
+    'icone_activer_cookie' => 'Aktivigi la korespond-kuketon',
171
+    'icone_activite' => 'Aktiveco',
172
+    'icone_admin_plugin' => 'Mastrumado de kromprogramoj',
173
+    'icone_administration' => 'Bontenado',
174
+    'icone_afficher_auteurs' => 'Afiŝi la aŭtorojn',
175
+    'icone_afficher_visiteurs' => 'Afiŝi la vizitantojn',
176
+    'icone_arret_discussion' => 'Ne plu partopreni en ĉi tiu diskuto',
177
+    'icone_calendrier' => 'Kalendaro',
178
+    'icone_configuration' => 'Agordo',
179
+    'icone_creer_auteur' => 'Krei novan aŭtoron kaj ligi ŝlin al tiu artikolo',
180
+    'icone_creer_mot_cle' => 'Krei novan ŝlosilvorton kaj ligi ĝin al tiu artikolo',
181
+    'icone_creer_rubrique_2' => 'Krei novan rubrikon',
182
+    'icone_developpement' => 'Programado',
183
+    'icone_edition' => 'Eldono',
184
+    'icone_ma_langue' => 'Mia lingvo',
185
+    'icone_mes_infos' => 'Miaj informoj',
186
+    'icone_mes_preferences' => 'Miaj preferoj',
187
+    'icone_modifier_article' => 'Modifi tiun ĉi artikolon',
188
+    'icone_modifier_rubrique' => 'Modifi tiun ĉi rubrikon',
189
+    'icone_publication' => 'Publikigo',
190
+    'icone_relancer_signataire' => 'Reinstigi tiun ĉi subskribinton',
191
+    'icone_retour' => 'Reen',
192
+    'icone_retour_article' => 'Reen al la artikolo',
193
+    'icone_squelette' => 'Skeletoj',
194
+    'icone_suivi_publication' => 'Superrigardo de la publikigo',
195
+    'icone_supprimer_cookie' => 'Forviŝi la por-korespondan kuketon ',
196
+    'icone_supprimer_rubrique' => 'Forviŝi tiun rubrikon',
197
+    'icone_supprimer_signature' => 'Forviŝi tiun subskribon',
198
+    'icone_valider_signature' => 'Validigi tiun subskribon',
199
+    'image_administrer_rubrique' => 'Vi povas mastrumi tiun rubrikon',
200
+    'impossible_modifier_login_auteur' => 'Ne eblas modifi la salutnomo.', # MODIF
201
+    'impossible_modifier_pass_auteur' => 'Ne eblas modifi la pasvorto.', # MODIF
202
+    'info_1_article' => '1 artikolo',
203
+    'info_1_auteur' => '1 aŭtoro',
204
+    'info_1_message' => '1 mesaĝo',
205
+    'info_1_mot_cle' => '1 ŝlosilvorto',
206
+    'info_1_rubrique' => '1 rubriko',
207
+    'info_1_visiteur' => '1 vizitanto',
208
+    'info_activer_cookie' => 'Vi povas aktivigi <b>por-korespondan kuketon</b>. Tio ebligos al vi facile iri de la publika spaco al la privata.',
209
+    'info_activer_menu_developpement' => 'Montri la menuon Programado',
210
+    'info_admin_etre_webmestre' => 'Doni al mi la rajtoj de retejestro',
211
+    'info_admin_je_suis_webmestre' => 'Mi estas <b>retejestro</b>',
212
+    'info_admin_statuer_webmestre' => 'Doni al tiu mastrumanto la rajtoj de retejestro',
213
+    'info_admin_webmestre' => 'Tiu mastrumanto estas <b>retejestro</b>',
214
+    'info_administrateur' => 'Mastrumanto',
215
+    'info_administrateur_1' => 'Mastrumanto',
216
+    'info_administrateur_2' => 'de la retejo (<i>uzi singarde</i>)',
217
+    'info_administrateur_site_01' => 'Se vi estas mastrumanto de la retejo, bonvolu',
218
+    'info_administrateur_site_02' => 'musklaki ĉi-tiun ligilon',
219
+    'info_administrateurs' => 'Mastrumantoj',
220
+    'info_administrer_rubrique' => 'Vi povas mastrumi tiun rubrikon',
221
+    'info_adresse' => 'ĉe la adreso :',
222
+    'info_adresse_desinscription' => 'Adreso de malregistriĝo',
223
+    'info_adresse_url' => 'Retadreso (URL) de la publika retejo',
224
+    'info_afficher_par_nb' => 'Afiŝi per',
225
+    'info_aide_en_ligne' => 'Reta SPIP-helpilo',
226
+    'info_ajout_image' => 'Kiam vi ligas bildojn kiel alkroĉitajn dokumentojn al artikolo,
227 227
  SPIP povas aŭtomate krei por vi etajn vinjetojn de la
228 228
  enmetitaj bildoj. Tio ebligas ekzemple, aŭtomate krei bildaron, ĉu en sukcesiva, ĉu samtempa ordo.',
229
-	'info_ajouter_rubrique' => 'Aldoni alian mastrumendan rubrikon :',
230
-	'info_annonce_nouveautes' => 'Anonco pri novaĵoj',
231
-	'info_article' => 'artikolo',
232
-	'info_article_2' => 'artikoloj',
233
-	'info_article_a_paraitre' => 'Aperotaj post-datitaj artikoloj',
234
-	'info_articles_02' => 'artikoloj',
235
-	'info_articles_2' => 'Artikoloj',
236
-	'info_articles_auteur' => 'La artikoloj de tiu aŭtoro',
237
-	'info_articles_miens' => 'Miaj artikoloj',
238
-	'info_articles_tous' => 'Ĉiuj la artikoloj',
239
-	'info_articles_trouves' => 'Trovitaj artikoloj',
240
-	'info_attente_validation' => 'Viaj artikoloj atendantaj validigon',
241
-	'info_aucun_article' => 'Neniu artikolo',
242
-	'info_aucun_auteur' => 'Neniu aŭtoro',
243
-	'info_aucun_message' => 'Neniu mesaĝo',
244
-	'info_aucun_rubrique' => 'Neniu rubriko',
245
-	'info_aujourdhui' => 'hodiaŭ : ',
246
-	'info_auteur_gere_rubriques' => 'Tiu aŭtoro mastrumas la jenajn rubrikojn :',
247
-	'info_auteur_gere_toutes_rubriques' => 'Tiu aŭtoro mastrumas <b>ĉiujn rubrikojn</b>',
248
-	'info_auteur_gere_toutes_rubriques_2' => 'Mi mastrumas <b>ĉiujn rubrikojn</b>',
249
-	'info_auteurs' => 'La aŭtoroj',
250
-	'info_auteurs_par_tri' => 'Aŭtoroj@partri@',
251
-	'info_auteurs_trouves' => 'Aŭtoroj trovitaj',
252
-	'info_authentification_externe' => 'Ekstera aŭtentigo',
253
-	'info_avertissement' => 'Averto',
254
-	'info_barre_outils' => 'ĉu per ĝia ilobreto ?',
255
-	'info_base_installee' => 'La strukturo de via datenbazo estas instalita.',
256
-	'info_bio' => 'Biografio',
257
-	'info_cache_desactive' => 'La staplo estas maldaŭre malaktivigita.',
258
-	'info_chapeau' => 'Ĉapo',
259
-	'info_chapeau_2' => 'Ĉapo :',
260
-	'info_chemin_acces_1' => 'Opcioj : <b>Alirvojo en la LDAP-dosierujilo</b>',
261
-	'info_chemin_acces_2' => 'Ekde nun vi devas konfiguri la alirvojon al la LDAP-dosierujilo. Tiu informo estas nepre necesa por legi la profilojn de uzantoj stokataj en la dosierujilo.',
262
-	'info_chemin_acces_annuaire' => 'Opcioj : <b>Aliro en la LDAP-dosierujilo',
263
-	'info_choix_base' => 'Tria etapo : ',
264
-	'info_classement_1' => '<sup>a</sup> en @liste@',
265
-	'info_classement_2' => '<sup>a</sup> en @liste@',
266
-	'info_code_acces' => 'Ne forgesu viajn proprajn alir-kodojn !',
267
-	'info_config_suivi' => 'Se tiu ĉi adreso estas tiu de dissendlisto, indiku ĉi-sube la adreson ĉe kiu la partoprenantoj de la retejo povos registriĝi. Tiu adreso povas esti retligilo (ekz. la paĝo por rete registriĝi en la listo), aŭ retpoŝtadreso kun specifa temo (ekz. <tt>@adresse_suivi@?subject=registrigxi</tt>) :',
268
-	'info_config_suivi_explication' => 'Vi povas aboni la dissendliston de tiu ĉi retejo. Aboninta, vi ricevos per retmesaĝoj la anoncojn pri artikoloj kaj pri fulm-informoj proponitaj por publikigo.',
269
-	'info_confirmer_passe' => 'Konfirmi tiun novan pasvorton :',
270
-	'info_conflit_edition_avis_non_sauvegarde' => 'Atentu, la jenaj tajpujoj estis iel modifitaj. Sekve, viaj ŝanĝoj en tiuj ĉi tajpujoj ne estas registritaj.',
271
-	'info_conflit_edition_differences' => 'Malsamecoj :',
272
-	'info_conflit_edition_version_enregistree' => 'La registrita versio :',
273
-	'info_conflit_edition_votre_version' => 'Via versio :',
274
-	'info_connexion_base' => 'Dua etapo : <b>Konektiĝo-provo al la datenbazo</b>',
275
-	'info_connexion_base_donnee' => 'Konektiĝo al via datumbazo',
276
-	'info_connexion_ldap_ok' => '<b>La konektiĝo al LDAP sukcesis.</b><p>Vi povas iri al la sekvanta etapo</p>',
277
-	'info_connexion_mysql' => 'Via SQL-konektiĝo',
278
-	'info_connexion_ok' => 'La konektiĝo sukcesis.',
279
-	'info_contact' => 'Kontakt-adreso',
280
-	'info_contenu_articles' => 'Enhavo de la artikoloj',
281
-	'info_contributions' => 'Kontribuaĵoj',
282
-	'info_creation_paragraphe' => 'Por krei malplenajn paragrafojn, simple lasu malplenajn liniojn.',
283
-	'info_creation_rubrique' => 'Antaŭ ol skribi artikolojn,<br /> vi kreu almenaŭ po unu rubrikon.<br />',
284
-	'info_creation_tables' => 'Kreo de la datentabeloj',
285
-	'info_creer_base' => '<b>Krei</b> novan datenbazon :',
286
-	'info_dans_rubrique' => 'En la rubriko :',
287
-	'info_date_publication_anterieure' => 'Dato de antaŭa redakto :',
288
-	'info_date_referencement' => 'REFERENCIGO-DATO DE TIU RETEJO :',
289
-	'info_derniere_etape' => 'Finite !',
290
-	'info_descriptif' => 'Priskribo :',
291
-	'info_desinstaller_plugin' => 'forviŝas la datenojn kaj malaktivigas la kromprogramon',
292
-	'info_discussion_cours' => 'Nunaj diskutoj',
293
-	'info_ecrire_article' => 'Antaŭ ol ekhavi la eblon skribi artikolojn, vi devas krei almenaŭ unu rubrikon.',
294
-	'info_email_envoi' => 'retpoŝtadreso por sendo (nedeviga)',
295
-	'info_email_envoi_txt' => 'Indiku ĉi tie la adreson uzotan por sendi poŝtmesaĝojn (defaŭlte, la ricev-adreso estos uzata) :',
296
-	'info_email_webmestre' => 'Retpoŝtadreso de la retejestro',
297
-	'info_envoi_email_automatique' => 'Aŭtomata retleteroj-dissendado',
298
-	'info_envoyer_maintenant' => 'Sendu nun',
299
-	'info_etape_suivante' => 'Ek al posta etapo',
300
-	'info_etape_suivante_1' => 'Vi povas paŝi al posta etapo.',
301
-	'info_etape_suivante_2' => 'Vi povas paŝi al posta etapo.',
302
-	'info_exceptions_proxy' => 'Escepto por la prokura servilo',
303
-	'info_exportation_base' => 'Eksporto de la datenbazo al @archive@',
304
-	'info_facilite_suivi_activite' => 'Por faciligi la kontrolon de la reteja ĉefartikola aktiveco, SPIP povas transdoni per retmesaĝoj - ekzemple al dissendlisto de redaktantoj - la anoncon pri publikig-petoj kaj validig-petoj de artikoloj.', # MODIF
305
-	'info_fichiers_authent' => 'Aŭtentokontrolaj dosieroj « .htpasswd »',
306
-	'info_forums_abo_invites' => 'Via retejo enhavas forumojn alireblajn nur per abono ; vizitantoj estas invititaj al registriĝo ĉe la publika retejo.',
307
-	'info_gauche_admin_tech' => '<b>Nur respondeculoj de la retejo rajtas aliri tiun paĝon.</b><p>Ĝi ebligas aliron al la diversaj funkcioj pri teknika bontenado. Iuj el ili okazigas specifan aŭtentigan procezon, kiu
229
+    'info_ajouter_rubrique' => 'Aldoni alian mastrumendan rubrikon :',
230
+    'info_annonce_nouveautes' => 'Anonco pri novaĵoj',
231
+    'info_article' => 'artikolo',
232
+    'info_article_2' => 'artikoloj',
233
+    'info_article_a_paraitre' => 'Aperotaj post-datitaj artikoloj',
234
+    'info_articles_02' => 'artikoloj',
235
+    'info_articles_2' => 'Artikoloj',
236
+    'info_articles_auteur' => 'La artikoloj de tiu aŭtoro',
237
+    'info_articles_miens' => 'Miaj artikoloj',
238
+    'info_articles_tous' => 'Ĉiuj la artikoloj',
239
+    'info_articles_trouves' => 'Trovitaj artikoloj',
240
+    'info_attente_validation' => 'Viaj artikoloj atendantaj validigon',
241
+    'info_aucun_article' => 'Neniu artikolo',
242
+    'info_aucun_auteur' => 'Neniu aŭtoro',
243
+    'info_aucun_message' => 'Neniu mesaĝo',
244
+    'info_aucun_rubrique' => 'Neniu rubriko',
245
+    'info_aujourdhui' => 'hodiaŭ : ',
246
+    'info_auteur_gere_rubriques' => 'Tiu aŭtoro mastrumas la jenajn rubrikojn :',
247
+    'info_auteur_gere_toutes_rubriques' => 'Tiu aŭtoro mastrumas <b>ĉiujn rubrikojn</b>',
248
+    'info_auteur_gere_toutes_rubriques_2' => 'Mi mastrumas <b>ĉiujn rubrikojn</b>',
249
+    'info_auteurs' => 'La aŭtoroj',
250
+    'info_auteurs_par_tri' => 'Aŭtoroj@partri@',
251
+    'info_auteurs_trouves' => 'Aŭtoroj trovitaj',
252
+    'info_authentification_externe' => 'Ekstera aŭtentigo',
253
+    'info_avertissement' => 'Averto',
254
+    'info_barre_outils' => 'ĉu per ĝia ilobreto ?',
255
+    'info_base_installee' => 'La strukturo de via datenbazo estas instalita.',
256
+    'info_bio' => 'Biografio',
257
+    'info_cache_desactive' => 'La staplo estas maldaŭre malaktivigita.',
258
+    'info_chapeau' => 'Ĉapo',
259
+    'info_chapeau_2' => 'Ĉapo :',
260
+    'info_chemin_acces_1' => 'Opcioj : <b>Alirvojo en la LDAP-dosierujilo</b>',
261
+    'info_chemin_acces_2' => 'Ekde nun vi devas konfiguri la alirvojon al la LDAP-dosierujilo. Tiu informo estas nepre necesa por legi la profilojn de uzantoj stokataj en la dosierujilo.',
262
+    'info_chemin_acces_annuaire' => 'Opcioj : <b>Aliro en la LDAP-dosierujilo',
263
+    'info_choix_base' => 'Tria etapo : ',
264
+    'info_classement_1' => '<sup>a</sup> en @liste@',
265
+    'info_classement_2' => '<sup>a</sup> en @liste@',
266
+    'info_code_acces' => 'Ne forgesu viajn proprajn alir-kodojn !',
267
+    'info_config_suivi' => 'Se tiu ĉi adreso estas tiu de dissendlisto, indiku ĉi-sube la adreson ĉe kiu la partoprenantoj de la retejo povos registriĝi. Tiu adreso povas esti retligilo (ekz. la paĝo por rete registriĝi en la listo), aŭ retpoŝtadreso kun specifa temo (ekz. <tt>@adresse_suivi@?subject=registrigxi</tt>) :',
268
+    'info_config_suivi_explication' => 'Vi povas aboni la dissendliston de tiu ĉi retejo. Aboninta, vi ricevos per retmesaĝoj la anoncojn pri artikoloj kaj pri fulm-informoj proponitaj por publikigo.',
269
+    'info_confirmer_passe' => 'Konfirmi tiun novan pasvorton :',
270
+    'info_conflit_edition_avis_non_sauvegarde' => 'Atentu, la jenaj tajpujoj estis iel modifitaj. Sekve, viaj ŝanĝoj en tiuj ĉi tajpujoj ne estas registritaj.',
271
+    'info_conflit_edition_differences' => 'Malsamecoj :',
272
+    'info_conflit_edition_version_enregistree' => 'La registrita versio :',
273
+    'info_conflit_edition_votre_version' => 'Via versio :',
274
+    'info_connexion_base' => 'Dua etapo : <b>Konektiĝo-provo al la datenbazo</b>',
275
+    'info_connexion_base_donnee' => 'Konektiĝo al via datumbazo',
276
+    'info_connexion_ldap_ok' => '<b>La konektiĝo al LDAP sukcesis.</b><p>Vi povas iri al la sekvanta etapo</p>',
277
+    'info_connexion_mysql' => 'Via SQL-konektiĝo',
278
+    'info_connexion_ok' => 'La konektiĝo sukcesis.',
279
+    'info_contact' => 'Kontakt-adreso',
280
+    'info_contenu_articles' => 'Enhavo de la artikoloj',
281
+    'info_contributions' => 'Kontribuaĵoj',
282
+    'info_creation_paragraphe' => 'Por krei malplenajn paragrafojn, simple lasu malplenajn liniojn.',
283
+    'info_creation_rubrique' => 'Antaŭ ol skribi artikolojn,<br /> vi kreu almenaŭ po unu rubrikon.<br />',
284
+    'info_creation_tables' => 'Kreo de la datentabeloj',
285
+    'info_creer_base' => '<b>Krei</b> novan datenbazon :',
286
+    'info_dans_rubrique' => 'En la rubriko :',
287
+    'info_date_publication_anterieure' => 'Dato de antaŭa redakto :',
288
+    'info_date_referencement' => 'REFERENCIGO-DATO DE TIU RETEJO :',
289
+    'info_derniere_etape' => 'Finite !',
290
+    'info_descriptif' => 'Priskribo :',
291
+    'info_desinstaller_plugin' => 'forviŝas la datenojn kaj malaktivigas la kromprogramon',
292
+    'info_discussion_cours' => 'Nunaj diskutoj',
293
+    'info_ecrire_article' => 'Antaŭ ol ekhavi la eblon skribi artikolojn, vi devas krei almenaŭ unu rubrikon.',
294
+    'info_email_envoi' => 'retpoŝtadreso por sendo (nedeviga)',
295
+    'info_email_envoi_txt' => 'Indiku ĉi tie la adreson uzotan por sendi poŝtmesaĝojn (defaŭlte, la ricev-adreso estos uzata) :',
296
+    'info_email_webmestre' => 'Retpoŝtadreso de la retejestro',
297
+    'info_envoi_email_automatique' => 'Aŭtomata retleteroj-dissendado',
298
+    'info_envoyer_maintenant' => 'Sendu nun',
299
+    'info_etape_suivante' => 'Ek al posta etapo',
300
+    'info_etape_suivante_1' => 'Vi povas paŝi al posta etapo.',
301
+    'info_etape_suivante_2' => 'Vi povas paŝi al posta etapo.',
302
+    'info_exceptions_proxy' => 'Escepto por la prokura servilo',
303
+    'info_exportation_base' => 'Eksporto de la datenbazo al @archive@',
304
+    'info_facilite_suivi_activite' => 'Por faciligi la kontrolon de la reteja ĉefartikola aktiveco, SPIP povas transdoni per retmesaĝoj - ekzemple al dissendlisto de redaktantoj - la anoncon pri publikig-petoj kaj validig-petoj de artikoloj.', # MODIF
305
+    'info_fichiers_authent' => 'Aŭtentokontrolaj dosieroj « .htpasswd »',
306
+    'info_forums_abo_invites' => 'Via retejo enhavas forumojn alireblajn nur per abono ; vizitantoj estas invititaj al registriĝo ĉe la publika retejo.',
307
+    'info_gauche_admin_tech' => '<b>Nur respondeculoj de la retejo rajtas aliri tiun paĝon.</b><p>Ĝi ebligas aliron al la diversaj funkcioj pri teknika bontenado. Iuj el ili okazigas specifan aŭtentigan procezon, kiu
308 308
 postulas disponi je FTP-alirrajto al la retejo.</p>',
309
-	'info_gauche_admin_vider' => '<b>Nur respondeculoj de la retejo rajtas aliri tiun paĝon.</b><p>Ĝi ebligas aliron al la diversaj funkcioj pri teknika bontenado. Iuj el ili okazigas specifan aŭtentigan procezon, kiu
309
+    'info_gauche_admin_vider' => '<b>Nur respondeculoj de la retejo rajtas aliri tiun paĝon.</b><p>Ĝi ebligas aliron al la diversaj funkcioj pri teknika bontenado. Iuj el ili okazigas specifan aŭtentigan procezon, kiu
310 310
 postulas disponi je FTP-alirrajto al la retejo.</p>',
311
-	'info_gauche_auteurs' => 'Vi trovos ĉi tie ĉiujn aŭtorojn de la retejo. Ilia statuso estas indikita per koloro de sia piktogramo (mastrumanto = verda, redaktanto = flava).',
312
-	'info_gauche_auteurs_exterieurs' => 'La eksteraj aŭtoroj, sen alireblo al la retejo, estas indikitaj per blua piktogramo ;
311
+    'info_gauche_auteurs' => 'Vi trovos ĉi tie ĉiujn aŭtorojn de la retejo. Ilia statuso estas indikita per koloro de sia piktogramo (mastrumanto = verda, redaktanto = flava).',
312
+    'info_gauche_auteurs_exterieurs' => 'La eksteraj aŭtoroj, sen alireblo al la retejo, estas indikitaj per blua piktogramo ;
313 313
  la aŭtoroj forviŝitaj per griza piktogramo.',
314
-	'info_gauche_messagerie' => 'La mesaĝilo ebligas al vi interŝanĝi mesaĝojn inter aŭtoroj, konservi memorigilojn (por via propra uzado) aŭ afiŝi anoncojn ĉe la hejmpaĝo de la privata spaco (se vi estas mastrumanto).',
315
-	'info_gauche_statistiques_referers' => 'Tiu paĝo prezentas la liston de la  <i>referencoj</i>, tio estas retejoj enhavantaj ligilojn al via propra retejo, nur koncerne hieraŭ kaj hodiaŭ : tiu listo estas prastatigita ĉiujn 24 horojn.',
316
-	'info_gauche_visiteurs_enregistres' => 'Vi trovos ĉi tie la vizitantojn registritajn
314
+    'info_gauche_messagerie' => 'La mesaĝilo ebligas al vi interŝanĝi mesaĝojn inter aŭtoroj, konservi memorigilojn (por via propra uzado) aŭ afiŝi anoncojn ĉe la hejmpaĝo de la privata spaco (se vi estas mastrumanto).',
315
+    'info_gauche_statistiques_referers' => 'Tiu paĝo prezentas la liston de la  <i>referencoj</i>, tio estas retejoj enhavantaj ligilojn al via propra retejo, nur koncerne hieraŭ kaj hodiaŭ : tiu listo estas prastatigita ĉiujn 24 horojn.',
316
+    'info_gauche_visiteurs_enregistres' => 'Vi trovos ĉi tie la vizitantojn registritajn
317 317
  en la publika spaco de la retejo (forumoj laŭ abono).',
318
-	'info_generation_miniatures_images' => 'Bildoj-miniaturigo',
319
-	'info_gerer_trad_objets' => '@objets@ : mastrumi la traduk-ligilojn',
320
-	'info_hebergeur_desactiver_envoi_email' => 'Iuj retgastigantoj malaktivigas la aŭtomatan retleteroj-sendadon ekde ties serviloj. Tiukaze, la jenaj SPIP-funkcioj ne fonkcios.',
321
-	'info_hier' => 'hieraŭ :',
322
-	'info_identification_publique' => 'Via publika identeco...',
323
-	'info_image_process' => 'Bonvolu elekti la plej bonan metodon por fabriki vinjetojn musklakante laŭcele bildon.',
324
-	'info_image_process2' => 'Se neniu bildo afiŝiĝas, tio signifas ke la servilo kiu gastigas vian retejon ne estas konfigurita por uzi tiajn ilojn. Se vi deziras uzi tiujn funkciojn, petu la « GD » aŭ « Imagick » modulojn al la teknika repondeculo.',
325
-	'info_images_auto' => 'Bildoj aŭtomate komputitaj',
326
-	'info_informations_personnelles' => 'Personaj datenoj',
327
-	'info_inscription' => 'Registriĝado je',
328
-	'info_inscription_automatique' => 'Aŭtomata registriĝado de novaj redaktantoj',
329
-	'info_jeu_caractere' => 'Litertiparo de la retejo',
330
-	'info_jours' => 'tagoj',
331
-	'info_laisser_champs_vides' => 'lasi tiujn tajpujojn malplenaj)',
332
-	'info_langues' => 'Lingvoj de la retejo',
333
-	'info_ldap_ok' => 'La LDAP-aŭtentokontrolilo estas instalita.',
334
-	'info_lien_hypertexte' => 'Hiperligilo :',
335
-	'info_liste_nouveautes_envoyee' => 'La listo de novaĵoj estis sendita',
336
-	'info_liste_redacteurs_connectes' => 'Listo de la konektitaj redaktantoj',
337
-	'info_login_existant' => 'Tiu salutnomo jam ekzistas.',
338
-	'info_login_trop_court' => 'Tro mallonga salutnomo.',
339
-	'info_login_trop_court_car_pluriel' => 'La salutnomo devas enhavi almenaŭ @nb@ signojn.',
340
-	'info_logos' => 'La vinjetoj',
341
-	'info_maximum' => 'maksimumo :',
342
-	'info_meme_rubrique' => 'En la sama rubriko',
343
-	'info_message_en_redaction' => 'Viaj redaktataj mesaĝoj',
344
-	'info_message_technique' => 'Teknika mesaĝo :',
345
-	'info_messagerie_interne' => 'Interna mesaĝilo',
346
-	'info_mise_a_niveau_base' => 'alniveligo de via SQL-datenbazo',
347
-	'info_mise_a_niveau_base_2' => '{{Atentu !}} Vi ĵus instalis version de la SPIP-dosieroj {pli malnovan} ol tiun, kiu estis instalita antaŭe ĉe via retejo : eblas ke via datenbazo perdiĝos kaj ke via retejo ne plu funkcios.<br />{{Reinstalu la
318
+    'info_generation_miniatures_images' => 'Bildoj-miniaturigo',
319
+    'info_gerer_trad_objets' => '@objets@ : mastrumi la traduk-ligilojn',
320
+    'info_hebergeur_desactiver_envoi_email' => 'Iuj retgastigantoj malaktivigas la aŭtomatan retleteroj-sendadon ekde ties serviloj. Tiukaze, la jenaj SPIP-funkcioj ne fonkcios.',
321
+    'info_hier' => 'hieraŭ :',
322
+    'info_identification_publique' => 'Via publika identeco...',
323
+    'info_image_process' => 'Bonvolu elekti la plej bonan metodon por fabriki vinjetojn musklakante laŭcele bildon.',
324
+    'info_image_process2' => 'Se neniu bildo afiŝiĝas, tio signifas ke la servilo kiu gastigas vian retejon ne estas konfigurita por uzi tiajn ilojn. Se vi deziras uzi tiujn funkciojn, petu la « GD » aŭ « Imagick » modulojn al la teknika repondeculo.',
325
+    'info_images_auto' => 'Bildoj aŭtomate komputitaj',
326
+    'info_informations_personnelles' => 'Personaj datenoj',
327
+    'info_inscription' => 'Registriĝado je',
328
+    'info_inscription_automatique' => 'Aŭtomata registriĝado de novaj redaktantoj',
329
+    'info_jeu_caractere' => 'Litertiparo de la retejo',
330
+    'info_jours' => 'tagoj',
331
+    'info_laisser_champs_vides' => 'lasi tiujn tajpujojn malplenaj)',
332
+    'info_langues' => 'Lingvoj de la retejo',
333
+    'info_ldap_ok' => 'La LDAP-aŭtentokontrolilo estas instalita.',
334
+    'info_lien_hypertexte' => 'Hiperligilo :',
335
+    'info_liste_nouveautes_envoyee' => 'La listo de novaĵoj estis sendita',
336
+    'info_liste_redacteurs_connectes' => 'Listo de la konektitaj redaktantoj',
337
+    'info_login_existant' => 'Tiu salutnomo jam ekzistas.',
338
+    'info_login_trop_court' => 'Tro mallonga salutnomo.',
339
+    'info_login_trop_court_car_pluriel' => 'La salutnomo devas enhavi almenaŭ @nb@ signojn.',
340
+    'info_logos' => 'La vinjetoj',
341
+    'info_maximum' => 'maksimumo :',
342
+    'info_meme_rubrique' => 'En la sama rubriko',
343
+    'info_message_en_redaction' => 'Viaj redaktataj mesaĝoj',
344
+    'info_message_technique' => 'Teknika mesaĝo :',
345
+    'info_messagerie_interne' => 'Interna mesaĝilo',
346
+    'info_mise_a_niveau_base' => 'alniveligo de via SQL-datenbazo',
347
+    'info_mise_a_niveau_base_2' => '{{Atentu !}} Vi ĵus instalis version de la SPIP-dosieroj {pli malnovan} ol tiun, kiu estis instalita antaŭe ĉe via retejo : eblas ke via datenbazo perdiĝos kaj ke via retejo ne plu funkcios.<br />{{Reinstalu la
348 348
  SPIP-dosierojn.}}',
349
-	'info_modification_enregistree' => 'Via modifo estis registrita',
350
-	'info_modifier_auteur' => 'Modifi tiun ĉi aŭtoron :',
351
-	'info_modifier_rubrique' => 'Modifi la rubrikon :',
352
-	'info_modifier_titre' => 'Modifi : @titre@',
353
-	'info_mon_site_spip' => 'Mia SPIP-retejo',
354
-	'info_moyenne' => 'meznombro :',
355
-	'info_multi_cet_article' => 'Lingvo de tiu ĉi artikolo :',
356
-	'info_multi_langues_choisies' => 'Bonvolu elekti ĉi-sube la lingvojn, kiujn vi volas disponigi al la redaktantoj de via retejo.
349
+    'info_modification_enregistree' => 'Via modifo estis registrita',
350
+    'info_modifier_auteur' => 'Modifi tiun ĉi aŭtoron :',
351
+    'info_modifier_rubrique' => 'Modifi la rubrikon :',
352
+    'info_modifier_titre' => 'Modifi : @titre@',
353
+    'info_mon_site_spip' => 'Mia SPIP-retejo',
354
+    'info_moyenne' => 'meznombro :',
355
+    'info_multi_cet_article' => 'Lingvo de tiu ĉi artikolo :',
356
+    'info_multi_langues_choisies' => 'Bonvolu elekti ĉi-sube la lingvojn, kiujn vi volas disponigi al la redaktantoj de via retejo.
357 357
   Vi ne povas malaktivigi la lingvojn jam uzatajn (unue afiŝitajn) ĉe via retejo.',
358
-	'info_multi_objets' => '@objets@ : aktivigi la lingvomenuon',
359
-	'info_multi_secteurs' => '... ĉu nur por la rubrikoj situantaj ĉe la radiko ?',
360
-	'info_nb_articles' => '@nb@ artikoloj',
361
-	'info_nb_auteurs' => '@nb@ aŭtoroj',
362
-	'info_nb_messages' => '@nb@ mesaĝoj',
363
-	'info_nb_mots_cles' => '@nb@ ŝlosilvortoj',
364
-	'info_nb_rubriques' => '@nb@ rubrikoj',
365
-	'info_nb_visiteurs' => '@nb@ vizitantoj',
366
-	'info_nom' => 'Nomo',
367
-	'info_nom_destinataire' => 'Nomo de la adresato',
368
-	'info_nom_pas_conforme' => 'la HTML-markoj estas malpermesitaj',
369
-	'info_nom_site' => 'Nomo de via retejo',
370
-	'info_nombre_articles' => '@nb_articles@ artikoloj,',
371
-	'info_nombre_rubriques' => '@nb_rubriques@ rubrikoj,',
372
-	'info_nombre_sites' => '@nb_sites@ retejoj,',
373
-	'info_non_deplacer' => 'Ne transloki...',
374
-	'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP povas regule sendi anoncon pri la lastaj novaĵoj de la retejo (artikolojn kaj fulm-informojn freŝe publikigitajn).',
375
-	'info_non_envoi_liste_nouveautes' => 'Ne sendi la liston de la novaĵoj.',
376
-	'info_non_modifiable' => 'ne modifebla',
377
-	'info_non_suppression_mot_cle' => 'mi ne volas forviŝi tiun ŝlosilvorton.',
378
-	'info_notes' => 'Notoj',
379
-	'info_nouvel_article' => 'Nova artikolo',
380
-	'info_nouvelle_traduction' => 'Nova tradukaĵo :',
381
-	'info_numero_article' => 'ARTIKOLO NUMERO :',
382
-	'info_obligatoire_02' => '(deviga)', # MODIF
383
-	'info_option_accepter_visiteurs' => 'Permesi registriĝojn de vizitantoj el la publika spaco',
384
-	'info_option_ne_pas_accepter_visiteurs' => 'Rifuzi registriĝon de vizitantoj',
385
-	'info_options_avancees' => 'PLENDETALAJ AGORDOJ',
386
-	'info_ou' => 'aŭ...',
387
-	'info_page_interdite' => 'Malpermesata paĝo',
388
-	'info_par_nom' => 'laŭ nomo',
389
-	'info_par_nombre_article' => 'laŭ nombro de artikoloj',
390
-	'info_par_statut' => 'laŭ statuso',
391
-	'info_par_tri' => '’(laŭ @tri@)’',
392
-	'info_passe_trop_court' => 'Pasvorto tro mallonga.',
393
-	'info_passe_trop_court_car_pluriel' => 'La pasvorto devas enhavi almenaŭ @nb@ signojn.',
394
-	'info_passes_identiques' => 'Ambaŭ pasvortoj ne samas.',
395
-	'info_plus_cinq_car' => 'pli ol 5 signoj',
396
-	'info_plus_cinq_car_2' => '(Pli ol 5 signoj)',
397
-	'info_plus_trois_car' => '(Pli ol 3 signoj)',
398
-	'info_popularite' => 'populareco : @popularite@ ; vizitoj : @visites@',
399
-	'info_post_scriptum' => 'Postskribo',
400
-	'info_post_scriptum_2' => 'Postskribo :',
401
-	'info_pour' => 'por',
402
-	'info_preview_texte' => 'Eblas antaŭrigardi la diversajn redakteblajn elementojn, kiuj havas almenaŭ la statuson „Proponita“, kaj ankaŭ la elementojn, kiujn vi estas redaktanta. Ĉu tio eblu nur al mastrumantoj, al ĉiuj redaktantoj, aŭ al neniu ?',
403
-	'info_procedez_par_etape' => 'procedu etapon post etapo',
404
-	'info_procedure_maj_version' => 'la ĝisdatiga proceduro devas esti lanĉita por adapti
358
+    'info_multi_objets' => '@objets@ : aktivigi la lingvomenuon',
359
+    'info_multi_secteurs' => '... ĉu nur por la rubrikoj situantaj ĉe la radiko ?',
360
+    'info_nb_articles' => '@nb@ artikoloj',
361
+    'info_nb_auteurs' => '@nb@ aŭtoroj',
362
+    'info_nb_messages' => '@nb@ mesaĝoj',
363
+    'info_nb_mots_cles' => '@nb@ ŝlosilvortoj',
364
+    'info_nb_rubriques' => '@nb@ rubrikoj',
365
+    'info_nb_visiteurs' => '@nb@ vizitantoj',
366
+    'info_nom' => 'Nomo',
367
+    'info_nom_destinataire' => 'Nomo de la adresato',
368
+    'info_nom_pas_conforme' => 'la HTML-markoj estas malpermesitaj',
369
+    'info_nom_site' => 'Nomo de via retejo',
370
+    'info_nombre_articles' => '@nb_articles@ artikoloj,',
371
+    'info_nombre_rubriques' => '@nb_rubriques@ rubrikoj,',
372
+    'info_nombre_sites' => '@nb_sites@ retejoj,',
373
+    'info_non_deplacer' => 'Ne transloki...',
374
+    'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP povas regule sendi anoncon pri la lastaj novaĵoj de la retejo (artikolojn kaj fulm-informojn freŝe publikigitajn).',
375
+    'info_non_envoi_liste_nouveautes' => 'Ne sendi la liston de la novaĵoj.',
376
+    'info_non_modifiable' => 'ne modifebla',
377
+    'info_non_suppression_mot_cle' => 'mi ne volas forviŝi tiun ŝlosilvorton.',
378
+    'info_notes' => 'Notoj',
379
+    'info_nouvel_article' => 'Nova artikolo',
380
+    'info_nouvelle_traduction' => 'Nova tradukaĵo :',
381
+    'info_numero_article' => 'ARTIKOLO NUMERO :',
382
+    'info_obligatoire_02' => '(deviga)', # MODIF
383
+    'info_option_accepter_visiteurs' => 'Permesi registriĝojn de vizitantoj el la publika spaco',
384
+    'info_option_ne_pas_accepter_visiteurs' => 'Rifuzi registriĝon de vizitantoj',
385
+    'info_options_avancees' => 'PLENDETALAJ AGORDOJ',
386
+    'info_ou' => 'aŭ...',
387
+    'info_page_interdite' => 'Malpermesata paĝo',
388
+    'info_par_nom' => 'laŭ nomo',
389
+    'info_par_nombre_article' => 'laŭ nombro de artikoloj',
390
+    'info_par_statut' => 'laŭ statuso',
391
+    'info_par_tri' => '’(laŭ @tri@)’',
392
+    'info_passe_trop_court' => 'Pasvorto tro mallonga.',
393
+    'info_passe_trop_court_car_pluriel' => 'La pasvorto devas enhavi almenaŭ @nb@ signojn.',
394
+    'info_passes_identiques' => 'Ambaŭ pasvortoj ne samas.',
395
+    'info_plus_cinq_car' => 'pli ol 5 signoj',
396
+    'info_plus_cinq_car_2' => '(Pli ol 5 signoj)',
397
+    'info_plus_trois_car' => '(Pli ol 3 signoj)',
398
+    'info_popularite' => 'populareco : @popularite@ ; vizitoj : @visites@',
399
+    'info_post_scriptum' => 'Postskribo',
400
+    'info_post_scriptum_2' => 'Postskribo :',
401
+    'info_pour' => 'por',
402
+    'info_preview_texte' => 'Eblas antaŭrigardi la diversajn redakteblajn elementojn, kiuj havas almenaŭ la statuson „Proponita“, kaj ankaŭ la elementojn, kiujn vi estas redaktanta. Ĉu tio eblu nur al mastrumantoj, al ĉiuj redaktantoj, aŭ al neniu ?',
403
+    'info_procedez_par_etape' => 'procedu etapon post etapo',
404
+    'info_procedure_maj_version' => 'la ĝisdatiga proceduro devas esti lanĉita por adapti
405 405
  la datenbazon al la nova versio de SPIP.',
406
-	'info_proxy_ok' => 'Testo de la prokurservilo sukcesa.',
407
-	'info_ps' => 'P.S.',
408
-	'info_publier' => 'publikigi',
409
-	'info_publies' => 'Viaj artikoloj rete publikigitaj',
410
-	'info_question_accepter_visiteurs' => 'Se viaj skeletoj ebligas registradon de vizitantoj, kiuj ne rajtas aliri la privatan spacon, bonvolu aktivigi la ĉi-suban opcion :',
411
-	'info_question_inscription_nouveaux_redacteurs' => 'Ĉu vi akceptas la registriĝadon de novaj redaktantoj ekde
406
+    'info_proxy_ok' => 'Testo de la prokurservilo sukcesa.',
407
+    'info_ps' => 'P.S.',
408
+    'info_publier' => 'publikigi',
409
+    'info_publies' => 'Viaj artikoloj rete publikigitaj',
410
+    'info_question_accepter_visiteurs' => 'Se viaj skeletoj ebligas registradon de vizitantoj, kiuj ne rajtas aliri la privatan spacon, bonvolu aktivigi la ĉi-suban opcion :',
411
+    'info_question_inscription_nouveaux_redacteurs' => 'Ĉu vi akceptas la registriĝadon de novaj redaktantoj ekde
412 412
   la publika spaco ? Se vi akceptas tion, la vizitantoj povos registriĝi
413 413
   per aŭtomata aliĝilo kaj tiam aliros al la privata spaco por
414 414
   proponi siajn proprajn artikolojn. <div class="notice">Dum la aliĝo,
@@ -416,407 +416,407 @@  discard block
 block discarded – undo
416 416
   alir-kodoj al la privata spaco. Iuj
417 417
   retejgastigantoj malaktivigas la sendadon de retleteroj el siaj
418 418
   serviloj : tiukaze la aŭtomata aliĝo ne eblos.</div>',
419
-	'info_qui_edite' => '@nom_auteur_modif@ laboris pri tiu ĉi enhavo antaŭ @date_diff@ minutoj',
420
-	'info_racine_site' => 'Radiko de la retejo',
421
-	'info_recharger_page' => 'Bonvolu refreŝigi tiun ĉi paĝon post momento.',
422
-	'info_recherche_auteur_zero' => 'Neniu rezulto por "@cherche_auteur@".',
423
-	'info_recommencer' => 'Bonvolu rekomenci.',
424
-	'info_redacteur_1' => 'Redaktanto',
425
-	'info_redacteur_2' => 'kun aliro al la privata spaco (<i>Estas konsilinde</i>)',
426
-	'info_redacteurs' => 'Redaktantoj',
427
-	'info_redaction_en_cours' => 'REDAKTATA',
428
-	'info_redirection' => 'Alidirektigo',
429
-	'info_redirection_activee' => 'La alidirektigo estas aktiva.',
430
-	'info_redirection_boucle' => 'Vi provas redirekti la artikolo al ĝi mem.',
431
-	'info_redirection_desactivee' => 'La alidirektigo estis forigita.',
432
-	'info_refuses' => 'Viaj rifuzitaj artikoloj',
433
-	'info_reglage_ldap' => 'Opcioj : <b>Agordo de la LDAP-elŝuto</b>',
434
-	'info_renvoi_article' => '<b>Alidirektigo.</b> Tiu artikolo alidirektas al la paĝo :',
435
-	'info_reserve_admin' => 'Nur la mastrumantoj povas modifi tiun ĉi adreson.',
436
-	'info_restreindre_rubrique' => 'Limigi la mastrumadon al la rubriko :',
437
-	'info_resultat_recherche' => 'Serĉo-rezultoj :',
438
-	'info_rubriques' => 'Rubrikoj',
439
-	'info_rubriques_02' => 'rubrikoj',
440
-	'info_rubriques_trouvees' => 'Trovitaj rubrikoj',
441
-	'info_sans_titre' => 'Sen titolo',
442
-	'info_selection_chemin_acces' => '<b>Selektu</b> ĉi-sube alirvojon en la dosierujilo :',
443
-	'info_signatures' => 'subskriboj',
444
-	'info_site' => 'Retejo',
445
-	'info_site_2' => 'retejo :',
446
-	'info_site_min' => 'retejo',
447
-	'info_site_reference_2' => 'Referencigita retejo',
448
-	'info_site_web' => 'Retejo :',
449
-	'info_sites' => 'retejoj',
450
-	'info_sites_lies_mot' => 'La referencigitaj retejoj ligitaj al tiu ĉi ŝlosilvorto',
451
-	'info_sites_proxy' => 'Uzi prokuran servilon',
452
-	'info_sites_trouves' => 'Retejoj trovitaj',
453
-	'info_sous_titre' => 'Subtitolo :',
454
-	'info_statut_administrateur' => 'Mastrumanto',
455
-	'info_statut_auteur' => 'Statuso de tiu ĉi aŭtoro :',
456
-	'info_statut_auteur_2' => 'Mi estas',
457
-	'info_statut_auteur_a_confirmer' => 'Konfirmenda registropeto',
458
-	'info_statut_auteur_autre' => 'Alia statuso :',
459
-	'info_statut_redacteur' => 'Redaktanto',
460
-	'info_statut_utilisateurs_1' => 'Defaŭlta statuso de la importitaj uzantoj',
461
-	'info_statut_utilisateurs_2' => 'Elektu la statuson atribuotan al la personoj ĉeestantaj en LDAP-dosierujilo, kiam ili unuafoje konektiĝas. Poste vi povos modifi tiun valoron por ĉiu aŭtoro laŭkaze.',
462
-	'info_suivi_activite' => 'Superrigardo de la redakta agado',
463
-	'info_surtitre' => 'Surtitolo :',
464
-	'info_syndication_integrale_1' => 'Via retejo proponas abondosierojn (vidu « <a href="@url@">@titre@</a> »).',
465
-	'info_syndication_integrale_2' => 'Ĉu vi deziras transdoni tutajn artikolojn, aŭ nur afiŝi kelkcent-literan resumon ?',
466
-	'info_table_prefix' => 'Vi povas modifi la prefikson de la datentabelo (tio nepras se vi deziras instali plurajn retejojn en la sama datenbazo). Tiun prefikson skribu per minusklaj literoj, sen ĉapeloj, kaj sen spaco.',
467
-	'info_taille_maximale_images' => 'SPIP tuj pritestos la maksimuman bildgrandecon, kiun ĝi povas pritrakti (laŭ milionrastrumeroj). <br/> La plej grandaj bildoj ne estos malgrandigitaj.',
468
-	'info_taille_maximale_vignette' => 'Maksimuma grandeco de la vinjetoj generataj de la sistemo :',
469
-	'info_terminer_installation' => 'Vi povas nun fini laŭnorman instalproceduron.',
470
-	'info_texte' => 'Teksto',
471
-	'info_texte_explicatif' => 'Klariga teksto',
472
-	'info_texte_long' => '(la teksto estas longa : ĝi aperas do en pluraj partoj kiuj estos rekunigitaj post validigo.)',
473
-	'info_texte_message' => 'Teksto de via mesaĝo',
474
-	'info_texte_message_02' => 'Teksto de la mesaĝo',
475
-	'info_titre' => 'Titolo :',
476
-	'info_total' => 'totalo :',
477
-	'info_tous_articles_en_redaction' => 'Ĉiuj artikoloj redaktataj',
478
-	'info_tous_articles_presents' => 'Ĉiuj artikoloj publikigitaj en tiu ĉi rubriko',
479
-	'info_tous_articles_refuses' => 'Ĉiuj artikoloj rifuzitaj',
480
-	'info_tous_les' => 'ĉiuj :',
481
-	'info_tout_site' => 'La tuta retejo',
482
-	'info_tout_site2' => 'La artikolon oni ne tradukis al tiu lingvo.',
483
-	'info_tout_site3' => 'La artikolo jam haveblas en tiu lingvo, sed modifoj estis poste aldonitaj al la referenca artikolo. Bonvolu ĝisdatigi la tradukaĵon.',
484
-	'info_tout_site4' => 'La artikolo haveblas en tiu lingvo, kaj la tradukaĵo estas ĝisdatigita.',
485
-	'info_tout_site5' => 'Originala artikolo.',
486
-	'info_tout_site6' => '<b>Atentu :</b> nur la originalaj artikoloj estas afiŝitaj.
419
+    'info_qui_edite' => '@nom_auteur_modif@ laboris pri tiu ĉi enhavo antaŭ @date_diff@ minutoj',
420
+    'info_racine_site' => 'Radiko de la retejo',
421
+    'info_recharger_page' => 'Bonvolu refreŝigi tiun ĉi paĝon post momento.',
422
+    'info_recherche_auteur_zero' => 'Neniu rezulto por "@cherche_auteur@".',
423
+    'info_recommencer' => 'Bonvolu rekomenci.',
424
+    'info_redacteur_1' => 'Redaktanto',
425
+    'info_redacteur_2' => 'kun aliro al la privata spaco (<i>Estas konsilinde</i>)',
426
+    'info_redacteurs' => 'Redaktantoj',
427
+    'info_redaction_en_cours' => 'REDAKTATA',
428
+    'info_redirection' => 'Alidirektigo',
429
+    'info_redirection_activee' => 'La alidirektigo estas aktiva.',
430
+    'info_redirection_boucle' => 'Vi provas redirekti la artikolo al ĝi mem.',
431
+    'info_redirection_desactivee' => 'La alidirektigo estis forigita.',
432
+    'info_refuses' => 'Viaj rifuzitaj artikoloj',
433
+    'info_reglage_ldap' => 'Opcioj : <b>Agordo de la LDAP-elŝuto</b>',
434
+    'info_renvoi_article' => '<b>Alidirektigo.</b> Tiu artikolo alidirektas al la paĝo :',
435
+    'info_reserve_admin' => 'Nur la mastrumantoj povas modifi tiun ĉi adreson.',
436
+    'info_restreindre_rubrique' => 'Limigi la mastrumadon al la rubriko :',
437
+    'info_resultat_recherche' => 'Serĉo-rezultoj :',
438
+    'info_rubriques' => 'Rubrikoj',
439
+    'info_rubriques_02' => 'rubrikoj',
440
+    'info_rubriques_trouvees' => 'Trovitaj rubrikoj',
441
+    'info_sans_titre' => 'Sen titolo',
442
+    'info_selection_chemin_acces' => '<b>Selektu</b> ĉi-sube alirvojon en la dosierujilo :',
443
+    'info_signatures' => 'subskriboj',
444
+    'info_site' => 'Retejo',
445
+    'info_site_2' => 'retejo :',
446
+    'info_site_min' => 'retejo',
447
+    'info_site_reference_2' => 'Referencigita retejo',
448
+    'info_site_web' => 'Retejo :',
449
+    'info_sites' => 'retejoj',
450
+    'info_sites_lies_mot' => 'La referencigitaj retejoj ligitaj al tiu ĉi ŝlosilvorto',
451
+    'info_sites_proxy' => 'Uzi prokuran servilon',
452
+    'info_sites_trouves' => 'Retejoj trovitaj',
453
+    'info_sous_titre' => 'Subtitolo :',
454
+    'info_statut_administrateur' => 'Mastrumanto',
455
+    'info_statut_auteur' => 'Statuso de tiu ĉi aŭtoro :',
456
+    'info_statut_auteur_2' => 'Mi estas',
457
+    'info_statut_auteur_a_confirmer' => 'Konfirmenda registropeto',
458
+    'info_statut_auteur_autre' => 'Alia statuso :',
459
+    'info_statut_redacteur' => 'Redaktanto',
460
+    'info_statut_utilisateurs_1' => 'Defaŭlta statuso de la importitaj uzantoj',
461
+    'info_statut_utilisateurs_2' => 'Elektu la statuson atribuotan al la personoj ĉeestantaj en LDAP-dosierujilo, kiam ili unuafoje konektiĝas. Poste vi povos modifi tiun valoron por ĉiu aŭtoro laŭkaze.',
462
+    'info_suivi_activite' => 'Superrigardo de la redakta agado',
463
+    'info_surtitre' => 'Surtitolo :',
464
+    'info_syndication_integrale_1' => 'Via retejo proponas abondosierojn (vidu « <a href="@url@">@titre@</a> »).',
465
+    'info_syndication_integrale_2' => 'Ĉu vi deziras transdoni tutajn artikolojn, aŭ nur afiŝi kelkcent-literan resumon ?',
466
+    'info_table_prefix' => 'Vi povas modifi la prefikson de la datentabelo (tio nepras se vi deziras instali plurajn retejojn en la sama datenbazo). Tiun prefikson skribu per minusklaj literoj, sen ĉapeloj, kaj sen spaco.',
467
+    'info_taille_maximale_images' => 'SPIP tuj pritestos la maksimuman bildgrandecon, kiun ĝi povas pritrakti (laŭ milionrastrumeroj). <br/> La plej grandaj bildoj ne estos malgrandigitaj.',
468
+    'info_taille_maximale_vignette' => 'Maksimuma grandeco de la vinjetoj generataj de la sistemo :',
469
+    'info_terminer_installation' => 'Vi povas nun fini laŭnorman instalproceduron.',
470
+    'info_texte' => 'Teksto',
471
+    'info_texte_explicatif' => 'Klariga teksto',
472
+    'info_texte_long' => '(la teksto estas longa : ĝi aperas do en pluraj partoj kiuj estos rekunigitaj post validigo.)',
473
+    'info_texte_message' => 'Teksto de via mesaĝo',
474
+    'info_texte_message_02' => 'Teksto de la mesaĝo',
475
+    'info_titre' => 'Titolo :',
476
+    'info_total' => 'totalo :',
477
+    'info_tous_articles_en_redaction' => 'Ĉiuj artikoloj redaktataj',
478
+    'info_tous_articles_presents' => 'Ĉiuj artikoloj publikigitaj en tiu ĉi rubriko',
479
+    'info_tous_articles_refuses' => 'Ĉiuj artikoloj rifuzitaj',
480
+    'info_tous_les' => 'ĉiuj :',
481
+    'info_tout_site' => 'La tuta retejo',
482
+    'info_tout_site2' => 'La artikolon oni ne tradukis al tiu lingvo.',
483
+    'info_tout_site3' => 'La artikolo jam haveblas en tiu lingvo, sed modifoj estis poste aldonitaj al la referenca artikolo. Bonvolu ĝisdatigi la tradukaĵon.',
484
+    'info_tout_site4' => 'La artikolo haveblas en tiu lingvo, kaj la tradukaĵo estas ĝisdatigita.',
485
+    'info_tout_site5' => 'Originala artikolo.',
486
+    'info_tout_site6' => '<b>Atentu :</b> nur la originalaj artikoloj estas afiŝitaj.
487 487
 La tradukoj estas kunligitaj al la originalo, kun koloro kiu indikas ties staton :',
488
-	'info_traductions' => 'Tradukoj',
489
-	'info_travail_colaboratif' => 'Kunlaborado pri la artikoloj',
490
-	'info_un_article' => 'unu artikolo,',
491
-	'info_un_site' => 'retejo,',
492
-	'info_une_rubrique' => 'unu rubriko,',
493
-	'info_une_rubrique_02' => '1 rubriko',
494
-	'info_url' => 'URL :',
495
-	'info_url_proxy' => 'URL de la prokura servilo',
496
-	'info_url_proxy_pas_conforme' => 'la retadreso (URL) de la prokura servilo ne validas.',
497
-	'info_url_site_pas_conforme' => 'la retadreso (URL) de la retejo ne validas.',
498
-	'info_url_test_proxy' => 'URL de testo',
499
-	'info_urlref' => 'Hiperligilo :',
500
-	'info_utilisation_spip' => 'Vi povas nun ekuzi la asistatan publikigilon...',
501
-	'info_visites_par_mois' => 'Afiŝado laŭ monato :',
502
-	'info_visiteur_1' => 'Vizitanto',
503
-	'info_visiteur_2' => 'de la publika spaco',
504
-	'info_visiteurs' => 'Vizitantoj',
505
-	'info_visiteurs_02' => 'Vizitantoj de la publika spaco',
506
-	'info_webmestre_forces' => 'La retejestroj nune estas difinita en <tt>@file_options@</tt>.',
507
-	'install_adresse_base_hebergeur' => 'Adreso de la datenbazo atribuita de la retejgastiganto',
508
-	'install_connect_ok' => 'La nova bazo estis bone deklarita kiel servilonomo @connect@.',
509
-	'install_echec_annonce' => 'Certe la instalado estas malsukcesonta, aŭ naskos ne funkciivan retejon...',
510
-	'install_extension_mbstring' => 'SPIP ne funkcias per :',
511
-	'install_extension_php_obligatoire' => 'SPIP postulas la php-kromprogramon :',
512
-	'install_login_base_hebergeur' => 'Salutnomo atribuita de la retejgastiganto',
513
-	'install_nom_base_hebergeur' => 'Baznomo atribuita de la retejgastiganto :',
514
-	'install_pas_table' => 'Tiu ĉi datumbazo nune enhavas neniun tabelo',
515
-	'install_pass_base_hebergeur' => 'Pasvorto atribuita de la retejgastiganto',
516
-	'install_php_version' => 'PHP-versio @version@ eksnuna (minimuma = @minimum@)',
517
-	'install_select_langue' => 'Elektu lingvon kaj poste musklaku la butonon « sekvanta » por lanĉi la instal-proceduron.',
518
-	'install_select_type_db' => 'Indiku la datumbazan tipon :',
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' => 'Servilo de datumbazo atribuita de la retgastiganto',
524
-	'install_table_prefix_hebergeur' => 'Prefikso de la tabelo atribuita de la retejgastiganto :',
525
-	'install_tables_base' => 'Tabeloj de la datumbazo',
526
-	'install_types_db_connus' => 'SPIP scipovas uzi <b>MySQL</b> (la plej kutime uzatan) kaj <b>SQLite</b>.',
527
-	'install_types_db_connus_avertissement' => 'La uzado de <b>PostgreSQL</b> estas ankaŭ proponita kiel eksperimenta',
528
-	'instituer_erreur_statut_a_change' => 'La statuso jam estis modifita',
529
-	'instituer_erreur_statut_non_autorise' => 'Vi ne povas elekti tiun statuson',
530
-	'intem_redacteur' => 'redaktanto',
531
-	'intitule_licence' => 'Licenco',
532
-	'item_accepter_inscriptions' => 'Akcepti la registropetojn',
533
-	'item_activer_messages_avertissement' => 'Aktivigi la averto-mesaĝojn',
534
-	'item_administrateur_2' => 'mastrumanto',
535
-	'item_afficher_calendrier' => 'Afiŝi en la kalendaro',
536
-	'item_autoriser_syndication_integrale' => 'Disponigi la tuton de la artikoloj en la abondosieroj',
537
-	'item_choix_administrateurs' => 'la mastrumantoj',
538
-	'item_choix_generation_miniature' => 'Aŭtomatigi miniaturigadon de la bildoj.',
539
-	'item_choix_non_generation_miniature' => 'Ne generi bildajn miniaturojn.',
540
-	'item_choix_redacteurs' => 'la redaktantoj',
541
-	'item_choix_visiteurs' => 'la vizitantoj de la publika spaco',
542
-	'item_creer_fichiers_authent' => 'Krei la dosierojn .htpasswd',
543
-	'item_login' => 'Salutnomo',
544
-	'item_messagerie_agenda' => 'Aktivigi la mesaĝilon kaj la agendon',
545
-	'item_mots_cles_association_articles' => 'al artikoloj',
546
-	'item_mots_cles_association_rubriques' => 'al rubrikoj',
547
-	'item_mots_cles_association_sites' => 'al referencigitaj aŭ abonligitaj retejoj.',
548
-	'item_non' => 'Ne',
549
-	'item_non_accepter_inscriptions' => 'Ne akcepti la registropetojn',
550
-	'item_non_activer_messages_avertissement' => 'Neniuj averto-mesaĝoj',
551
-	'item_non_afficher_calendrier' => 'Ne afiŝi en la kalendaro',
552
-	'item_non_autoriser_syndication_integrale' => 'Nur disponigi po unu resumo',
553
-	'item_non_creer_fichiers_authent' => 'Ne krei tiujn ĉi dosierojn',
554
-	'item_non_messagerie_agenda' => 'Malaktivigi la mesaĝilon kaj la agendon',
555
-	'item_non_publier_articles' => 'Ne publikigi la artikolojn antaŭ la fiksita publikig-dato.',
556
-	'item_nouvel_auteur' => 'Nova aŭtoro',
557
-	'item_nouvelle_rubrique' => 'Nova rubriko',
558
-	'item_oui' => 'Jes',
559
-	'item_publier_articles' => 'Publikigi la artikolojn, kiu ajn estas ties publikig-dato.',
560
-	'item_reponse_article' => 'Respondo al la artikolo',
561
-	'item_visiteur' => 'vizitanto',
488
+    'info_traductions' => 'Tradukoj',
489
+    'info_travail_colaboratif' => 'Kunlaborado pri la artikoloj',
490
+    'info_un_article' => 'unu artikolo,',
491
+    'info_un_site' => 'retejo,',
492
+    'info_une_rubrique' => 'unu rubriko,',
493
+    'info_une_rubrique_02' => '1 rubriko',
494
+    'info_url' => 'URL :',
495
+    'info_url_proxy' => 'URL de la prokura servilo',
496
+    'info_url_proxy_pas_conforme' => 'la retadreso (URL) de la prokura servilo ne validas.',
497
+    'info_url_site_pas_conforme' => 'la retadreso (URL) de la retejo ne validas.',
498
+    'info_url_test_proxy' => 'URL de testo',
499
+    'info_urlref' => 'Hiperligilo :',
500
+    'info_utilisation_spip' => 'Vi povas nun ekuzi la asistatan publikigilon...',
501
+    'info_visites_par_mois' => 'Afiŝado laŭ monato :',
502
+    'info_visiteur_1' => 'Vizitanto',
503
+    'info_visiteur_2' => 'de la publika spaco',
504
+    'info_visiteurs' => 'Vizitantoj',
505
+    'info_visiteurs_02' => 'Vizitantoj de la publika spaco',
506
+    'info_webmestre_forces' => 'La retejestroj nune estas difinita en <tt>@file_options@</tt>.',
507
+    'install_adresse_base_hebergeur' => 'Adreso de la datenbazo atribuita de la retejgastiganto',
508
+    'install_connect_ok' => 'La nova bazo estis bone deklarita kiel servilonomo @connect@.',
509
+    'install_echec_annonce' => 'Certe la instalado estas malsukcesonta, aŭ naskos ne funkciivan retejon...',
510
+    'install_extension_mbstring' => 'SPIP ne funkcias per :',
511
+    'install_extension_php_obligatoire' => 'SPIP postulas la php-kromprogramon :',
512
+    'install_login_base_hebergeur' => 'Salutnomo atribuita de la retejgastiganto',
513
+    'install_nom_base_hebergeur' => 'Baznomo atribuita de la retejgastiganto :',
514
+    'install_pas_table' => 'Tiu ĉi datumbazo nune enhavas neniun tabelo',
515
+    'install_pass_base_hebergeur' => 'Pasvorto atribuita de la retejgastiganto',
516
+    'install_php_version' => 'PHP-versio @version@ eksnuna (minimuma = @minimum@)',
517
+    'install_select_langue' => 'Elektu lingvon kaj poste musklaku la butonon « sekvanta » por lanĉi la instal-proceduron.',
518
+    'install_select_type_db' => 'Indiku la datumbazan tipon :',
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' => 'Servilo de datumbazo atribuita de la retgastiganto',
524
+    'install_table_prefix_hebergeur' => 'Prefikso de la tabelo atribuita de la retejgastiganto :',
525
+    'install_tables_base' => 'Tabeloj de la datumbazo',
526
+    'install_types_db_connus' => 'SPIP scipovas uzi <b>MySQL</b> (la plej kutime uzatan) kaj <b>SQLite</b>.',
527
+    'install_types_db_connus_avertissement' => 'La uzado de <b>PostgreSQL</b> estas ankaŭ proponita kiel eksperimenta',
528
+    'instituer_erreur_statut_a_change' => 'La statuso jam estis modifita',
529
+    'instituer_erreur_statut_non_autorise' => 'Vi ne povas elekti tiun statuson',
530
+    'intem_redacteur' => 'redaktanto',
531
+    'intitule_licence' => 'Licenco',
532
+    'item_accepter_inscriptions' => 'Akcepti la registropetojn',
533
+    'item_activer_messages_avertissement' => 'Aktivigi la averto-mesaĝojn',
534
+    'item_administrateur_2' => 'mastrumanto',
535
+    'item_afficher_calendrier' => 'Afiŝi en la kalendaro',
536
+    'item_autoriser_syndication_integrale' => 'Disponigi la tuton de la artikoloj en la abondosieroj',
537
+    'item_choix_administrateurs' => 'la mastrumantoj',
538
+    'item_choix_generation_miniature' => 'Aŭtomatigi miniaturigadon de la bildoj.',
539
+    'item_choix_non_generation_miniature' => 'Ne generi bildajn miniaturojn.',
540
+    'item_choix_redacteurs' => 'la redaktantoj',
541
+    'item_choix_visiteurs' => 'la vizitantoj de la publika spaco',
542
+    'item_creer_fichiers_authent' => 'Krei la dosierojn .htpasswd',
543
+    'item_login' => 'Salutnomo',
544
+    'item_messagerie_agenda' => 'Aktivigi la mesaĝilon kaj la agendon',
545
+    'item_mots_cles_association_articles' => 'al artikoloj',
546
+    'item_mots_cles_association_rubriques' => 'al rubrikoj',
547
+    'item_mots_cles_association_sites' => 'al referencigitaj aŭ abonligitaj retejoj.',
548
+    'item_non' => 'Ne',
549
+    'item_non_accepter_inscriptions' => 'Ne akcepti la registropetojn',
550
+    'item_non_activer_messages_avertissement' => 'Neniuj averto-mesaĝoj',
551
+    'item_non_afficher_calendrier' => 'Ne afiŝi en la kalendaro',
552
+    'item_non_autoriser_syndication_integrale' => 'Nur disponigi po unu resumo',
553
+    'item_non_creer_fichiers_authent' => 'Ne krei tiujn ĉi dosierojn',
554
+    'item_non_messagerie_agenda' => 'Malaktivigi la mesaĝilon kaj la agendon',
555
+    'item_non_publier_articles' => 'Ne publikigi la artikolojn antaŭ la fiksita publikig-dato.',
556
+    'item_nouvel_auteur' => 'Nova aŭtoro',
557
+    'item_nouvelle_rubrique' => 'Nova rubriko',
558
+    'item_oui' => 'Jes',
559
+    'item_publier_articles' => 'Publikigi la artikolojn, kiu ajn estas ties publikig-dato.',
560
+    'item_reponse_article' => 'Respondo al la artikolo',
561
+    'item_visiteur' => 'vizitanto',
562 562
 
563
-	// J
564
-	'jour_non_connu_nc' => 'ne konata',
563
+    // J
564
+    'jour_non_connu_nc' => 'ne konata',
565 565
 
566
-	// L
567
-	'label_bando_outils' => 'Ilobreto',
568
-	'label_bando_outils_afficher' => 'Afiŝi la ilojn',
569
-	'label_bando_outils_masquer' => 'Kaŝi la ilojn',
570
-	'label_choix_langue' => 'Elektu vian lingvon',
571
-	'label_nom_fichier_connect' => 'Indiku la nomon uzita por tiu servilo',
572
-	'label_slogan_site' => 'Devizo de la retejo',
573
-	'label_taille_ecran' => 'Larĝo de la ekrano',
574
-	'label_texte_et_icones_navigation' => 'Naviga menuo',
575
-	'label_texte_et_icones_page' => 'Afiŝado en paĝo',
576
-	'ldap_correspondance' => 'heredado de la kampo @champ@',
577
-	'ldap_correspondance_1' => 'Heredadoj de LDAP-kampoj',
578
-	'ldap_correspondance_2' => 'Por ĉiuj jenaj SPIP-kampoj, indiki la nomo de la rilata LDAP-kampo. Lasi malplenan por ne plenigis ĝin, apartigi per spacoj aŭ komoj por provi plurajn LDAP-kampoj.',
579
-	'lien_ajouter_auteur' => 'Aldoni tiun aŭtoron',
580
-	'lien_ajouter_une_rubrique' => 'Aldoni tiu rubriko',
581
-	'lien_email' => 'retpoŝtadreso',
582
-	'lien_nom_site' => 'NOMO DE LA RETEJO :',
583
-	'lien_rapide_contenu' => 'Iri al la enhavo',
584
-	'lien_rapide_navigation' => 'Iri al la navigado',
585
-	'lien_rapide_recherche' => 'Iri al la serĉo',
586
-	'lien_retirer_auteur' => 'Forviŝi la aŭtoron',
587
-	'lien_retirer_rubrique' => 'Forviŝi la rubrikon',
588
-	'lien_retirer_tous_auteurs' => 'Forviŝi ĉiujn aŭtorojn',
589
-	'lien_retirer_toutes_rubriques' => 'Forviŝi ĉiujn rubrikojn',
590
-	'lien_site' => 'retejo',
591
-	'lien_tout_decocher' => 'Ĉion malmarki',
592
-	'lien_tout_deplier' => 'Malfaldi ĉion',
593
-	'lien_tout_replier' => 'Refaldi ĉion',
594
-	'lien_tout_supprimer' => 'Ĉion forviŝi',
595
-	'lien_trier_nom' => 'Vicigi laŭ nomo',
596
-	'lien_trier_nombre_articles' => 'Vicigi laŭ nombro de artikoloj',
597
-	'lien_trier_statut' => 'Vicigi laŭ statuso',
598
-	'lien_voir_en_ligne' => 'VIDI ĈERETIGITE :',
599
-	'logo_article' => 'Vinjeto de la artikolo',
600
-	'logo_auteur' => 'Vinjeto de la aŭtoro',
601
-	'logo_rubrique' => 'Vinjeto de la rubriko',
602
-	'logo_site' => 'Vinjeto de la retejo
566
+    // L
567
+    'label_bando_outils' => 'Ilobreto',
568
+    'label_bando_outils_afficher' => 'Afiŝi la ilojn',
569
+    'label_bando_outils_masquer' => 'Kaŝi la ilojn',
570
+    'label_choix_langue' => 'Elektu vian lingvon',
571
+    'label_nom_fichier_connect' => 'Indiku la nomon uzita por tiu servilo',
572
+    'label_slogan_site' => 'Devizo de la retejo',
573
+    'label_taille_ecran' => 'Larĝo de la ekrano',
574
+    'label_texte_et_icones_navigation' => 'Naviga menuo',
575
+    'label_texte_et_icones_page' => 'Afiŝado en paĝo',
576
+    'ldap_correspondance' => 'heredado de la kampo @champ@',
577
+    'ldap_correspondance_1' => 'Heredadoj de LDAP-kampoj',
578
+    'ldap_correspondance_2' => 'Por ĉiuj jenaj SPIP-kampoj, indiki la nomo de la rilata LDAP-kampo. Lasi malplenan por ne plenigis ĝin, apartigi per spacoj aŭ komoj por provi plurajn LDAP-kampoj.',
579
+    'lien_ajouter_auteur' => 'Aldoni tiun aŭtoron',
580
+    'lien_ajouter_une_rubrique' => 'Aldoni tiu rubriko',
581
+    'lien_email' => 'retpoŝtadreso',
582
+    'lien_nom_site' => 'NOMO DE LA RETEJO :',
583
+    'lien_rapide_contenu' => 'Iri al la enhavo',
584
+    'lien_rapide_navigation' => 'Iri al la navigado',
585
+    'lien_rapide_recherche' => 'Iri al la serĉo',
586
+    'lien_retirer_auteur' => 'Forviŝi la aŭtoron',
587
+    'lien_retirer_rubrique' => 'Forviŝi la rubrikon',
588
+    'lien_retirer_tous_auteurs' => 'Forviŝi ĉiujn aŭtorojn',
589
+    'lien_retirer_toutes_rubriques' => 'Forviŝi ĉiujn rubrikojn',
590
+    'lien_site' => 'retejo',
591
+    'lien_tout_decocher' => 'Ĉion malmarki',
592
+    'lien_tout_deplier' => 'Malfaldi ĉion',
593
+    'lien_tout_replier' => 'Refaldi ĉion',
594
+    'lien_tout_supprimer' => 'Ĉion forviŝi',
595
+    'lien_trier_nom' => 'Vicigi laŭ nomo',
596
+    'lien_trier_nombre_articles' => 'Vicigi laŭ nombro de artikoloj',
597
+    'lien_trier_statut' => 'Vicigi laŭ statuso',
598
+    'lien_voir_en_ligne' => 'VIDI ĈERETIGITE :',
599
+    'logo_article' => 'Vinjeto de la artikolo',
600
+    'logo_auteur' => 'Vinjeto de la aŭtoro',
601
+    'logo_rubrique' => 'Vinjeto de la rubriko',
602
+    'logo_site' => 'Vinjeto de la retejo
603 603
 ',
604
-	'logo_standard_rubrique' => 'Laŭnorma vinjeto de rubrikoj',
605
-	'logo_survol' => 'Vinjeto por flugrigardo',
604
+    'logo_standard_rubrique' => 'Laŭnorma vinjeto de rubrikoj',
605
+    'logo_survol' => 'Vinjeto por flugrigardo',
606 606
 
607
-	// M
608
-	'menu_aide_installation_choix_base' => 'Elekto de via datenbazo',
609
-	'module_fichier_langue' => 'Lingva dosiero',
610
-	'module_raccourci' => 'Rapid-alirilo',
611
-	'module_texte_affiche' => 'Afiŝita teksto',
612
-	'module_texte_explicatif' => 'Vi povas inkludi la jenajn rapid-klakeblojn en la skeletojn de via publika retejo. Ili estos aŭtomate tradukitaj en la diversajn lingvojn, kiuj havas specifan lingvan dosieron.',
613
-	'module_texte_traduction' => 'La lingva dosiero « @module@ » disponeblas en :',
614
-	'mois_non_connu' => 'nekonata',
607
+    // M
608
+    'menu_aide_installation_choix_base' => 'Elekto de via datenbazo',
609
+    'module_fichier_langue' => 'Lingva dosiero',
610
+    'module_raccourci' => 'Rapid-alirilo',
611
+    'module_texte_affiche' => 'Afiŝita teksto',
612
+    'module_texte_explicatif' => 'Vi povas inkludi la jenajn rapid-klakeblojn en la skeletojn de via publika retejo. Ili estos aŭtomate tradukitaj en la diversajn lingvojn, kiuj havas specifan lingvan dosieron.',
613
+    'module_texte_traduction' => 'La lingva dosiero « @module@ » disponeblas en :',
614
+    'mois_non_connu' => 'nekonata',
615 615
 
616
-	// N
617
-	'nouvelle_version_spip' => 'La SPIP-ĝisdatigo @version@ estas disponebla',
618
-	'nouvelle_version_spip_majeure' => 'Nova SPIP-versio @version@ disponeblas',
616
+    // N
617
+    'nouvelle_version_spip' => 'La SPIP-ĝisdatigo @version@ estas disponebla',
618
+    'nouvelle_version_spip_majeure' => 'Nova SPIP-versio @version@ disponeblas',
619 619
 
620
-	// O
621
-	'onglet_contenu' => 'Enhavo',
622
-	'onglet_declarer_une_autre_base' => 'Deklari alian datumbazon',
623
-	'onglet_discuter' => 'Diskuti',
624
-	'onglet_interactivite' => 'Interago',
625
-	'onglet_proprietes' => 'Trajtoj',
626
-	'onglet_repartition_actuelle' => 'nun',
627
-	'onglet_sous_rubriques' => 'Subrubrikoj',
620
+    // O
621
+    'onglet_contenu' => 'Enhavo',
622
+    'onglet_declarer_une_autre_base' => 'Deklari alian datumbazon',
623
+    'onglet_discuter' => 'Diskuti',
624
+    'onglet_interactivite' => 'Interago',
625
+    'onglet_proprietes' => 'Trajtoj',
626
+    'onglet_repartition_actuelle' => 'nun',
627
+    'onglet_sous_rubriques' => 'Subrubrikoj',
628 628
 
629
-	// P
630
-	'page_pas_proxy' => 'Tiu ĉi paĝo ne ŝutiĝu tra la prokura servilo',
631
-	'pas_de_proxy_pour' => 'Laŭbezone, indiku komputilojn aŭ domajnojn por kiuj tiu prokurservilo ne devas aplikiĝi (ekzemple : @exemple@)',
632
-	'phpinfo' => 'PHP-agordo',
633
-	'plugin_charge_paquet' => 'Ŝargado de la pakaĵo @name@',
634
-	'plugin_charger' => 'Elŝuti',
635
-	'plugin_erreur_charger' => 'eraro : ne eblas ŝargi @zip@',
636
-	'plugin_erreur_droit1' => 'La dosierujo <code>@dest@</code> ne estas skribe alirebla.',
637
-	'plugin_erreur_droit2' => 'Bonvolu kontroli la rajtojn pri tiu ĉi dosierujo (kaj krei ĝin laŭkaze), aŭ instali la dosierojn per FTP.',
638
-	'plugin_erreur_zip' => 'malsukceso pclzip : eraro @status@',
639
-	'plugin_etat_developpement' => 'disvolvata',
640
-	'plugin_etat_experimental' => 'eksperimenta',
641
-	'plugin_etat_stable' => 'stabila',
642
-	'plugin_etat_test' => 'testata',
643
-	'plugin_impossible_activer' => 'Ne eblas aktivigi la kromprogramon @plugin@',
644
-	'plugin_info_automatique1' => 'Se vi deziras permesi la aŭtomatan instaladon de kromprogramoj, bonvolu :',
645
-	'plugin_info_automatique1_lib' => 'Se vi deziras permesi aŭtomata instalado de tiu biblioteko, bonvolu :',
646
-	'plugin_info_automatique2' => 'krei dosierujon <code>@rep@</code> ;',
647
-	'plugin_info_automatique3' => 'kontroli ke estas permesate al la servilo skribi en tiu ĉi dosierujo.',
648
-	'plugin_info_automatique_creer' => 'kreenda ĉe la reteja radiko.',
649
-	'plugin_info_automatique_exemples' => 'ekzemploj :',
650
-	'plugin_info_automatique_ftp' => 'Vi povas instali kromprogramojn, per FTP, en la dosierujon <tt>@rep@</tt>',
651
-	'plugin_info_automatique_lib' => 'Iuj kromprogramoj postulas ankaŭ la eblon elŝuti dosierojn en la dosierujon <code>lib/</code>. Tiu dosierujo estas laŭkaze kreenda ĉe la reteja radiko.',
652
-	'plugin_info_automatique_liste' => 'Viaj listoj de kromprogramoj :',
653
-	'plugin_info_automatique_liste_officielle' => 'la oficialaj kromprogramoj',
654
-	'plugin_info_automatique_liste_update' => 'Ĝisdatigi la listojn',
655
-	'plugin_info_automatique_ou' => 'aŭ...',
656
-	'plugin_info_automatique_select' => 'Elektu ĉi-sube kromprogramon : SPIP elŝutos ĝin kaj instalos ĝin en la dosierujo <code>@rep@</code> ; se tiu ĉi kromprogramo jam ekzistas, ĝi estos ĝisdatigita.',
657
-	'plugin_info_credit' => 'Kreditoj',
658
-	'plugin_info_erreur_xml' => 'Deklaro de tiu kromprogramo ne ĝustas',
659
-	'plugin_info_install_ok' => 'Sukcesa instalado',
660
-	'plugin_info_necessite' => 'Necesas :',
661
-	'plugin_info_non_compatible_spip' => 'Tiu ĉi kromprogramo ne estas kongrua kun tiu SPIP-versio',
662
-	'plugin_info_plugins_dist_1' => 'Kromprogramoj ĉi-sube estas ŝarĝitaj kaj aktivigitaj en la dosierujo @plugins_dist@.',
663
-	'plugin_info_plugins_dist_2' => 'Ili ne malaktivigas.',
664
-	'plugin_info_telecharger' => 'elŝutota de @url@ kaj instalota en @rep@',
665
-	'plugin_info_upgrade_ok' => 'Sukcesa ĝisdatigo',
666
-	'plugin_librairies_installees' => 'Instalitaj bibliotekoj',
667
-	'plugin_necessite_extension_php' => 'Postulas la PHP-kromprogramon @plugin@ laŭ versio @version@.',
668
-	'plugin_necessite_extension_php_sans_version' => 'Postulas la PHP-kromprogramon @plugin@',
669
-	'plugin_necessite_lib' => 'Tiu ĉi kromprogramo bezonas la bibliotekon @lib@',
670
-	'plugin_necessite_php' => 'Postulas @plugin@ laŭ versio @version@.',
671
-	'plugin_necessite_plugin' => 'Postulas la kromprogramon @plugin@ laŭ versio @version@.',
672
-	'plugin_necessite_plugin_sans_version' => 'Necesas la kromprogramon @plugin@',
673
-	'plugin_necessite_spip' => 'Necesas SPIP laŭ minimume versio @version@.',
674
-	'plugin_source' => 'fonto : ',
675
-	'plugin_titre_automatique' => 'Aŭtomata instalo',
676
-	'plugin_titre_automatique_ajouter' => 'Aldoni kromprogramojn',
677
-	'plugin_titre_installation' => 'Instalado de la kromprogramo @plugin@',
678
-	'plugin_titre_modifier' => 'Miaj kromprogramoj',
679
-	'plugin_utilise_extension_php' => 'Uzas la PHP-kromprogramon @plugin@ laŭ versio @version@.', # MODIF
680
-	'plugin_utilise_php' => 'Uzas @plugin@ laŭ versio @version@.', # MODIF
681
-	'plugin_utilise_plugin' => 'Uzas la kromprogramon @plugin@ de versio @version@.', # MODIF
682
-	'plugin_zip_active' => 'Daŭrigu por ĝin aktivigi',
683
-	'plugin_zip_adresse' => 'indiku ĉi-sube la retadreson de la maldensa dosiero de elŝutenda kromprogramo, aŭ la retadreson de kromprogramolisto.',
684
-	'plugin_zip_adresse_champ' => 'Retadreso de la kromprogramo aŭ de la listo ',
685
-	'plugin_zip_content' => 'Ĝi enhavas la jenajn dosierojn (@taille@),
629
+    // P
630
+    'page_pas_proxy' => 'Tiu ĉi paĝo ne ŝutiĝu tra la prokura servilo',
631
+    'pas_de_proxy_pour' => 'Laŭbezone, indiku komputilojn aŭ domajnojn por kiuj tiu prokurservilo ne devas aplikiĝi (ekzemple : @exemple@)',
632
+    'phpinfo' => 'PHP-agordo',
633
+    'plugin_charge_paquet' => 'Ŝargado de la pakaĵo @name@',
634
+    'plugin_charger' => 'Elŝuti',
635
+    'plugin_erreur_charger' => 'eraro : ne eblas ŝargi @zip@',
636
+    'plugin_erreur_droit1' => 'La dosierujo <code>@dest@</code> ne estas skribe alirebla.',
637
+    'plugin_erreur_droit2' => 'Bonvolu kontroli la rajtojn pri tiu ĉi dosierujo (kaj krei ĝin laŭkaze), aŭ instali la dosierojn per FTP.',
638
+    'plugin_erreur_zip' => 'malsukceso pclzip : eraro @status@',
639
+    'plugin_etat_developpement' => 'disvolvata',
640
+    'plugin_etat_experimental' => 'eksperimenta',
641
+    'plugin_etat_stable' => 'stabila',
642
+    'plugin_etat_test' => 'testata',
643
+    'plugin_impossible_activer' => 'Ne eblas aktivigi la kromprogramon @plugin@',
644
+    'plugin_info_automatique1' => 'Se vi deziras permesi la aŭtomatan instaladon de kromprogramoj, bonvolu :',
645
+    'plugin_info_automatique1_lib' => 'Se vi deziras permesi aŭtomata instalado de tiu biblioteko, bonvolu :',
646
+    'plugin_info_automatique2' => 'krei dosierujon <code>@rep@</code> ;',
647
+    'plugin_info_automatique3' => 'kontroli ke estas permesate al la servilo skribi en tiu ĉi dosierujo.',
648
+    'plugin_info_automatique_creer' => 'kreenda ĉe la reteja radiko.',
649
+    'plugin_info_automatique_exemples' => 'ekzemploj :',
650
+    'plugin_info_automatique_ftp' => 'Vi povas instali kromprogramojn, per FTP, en la dosierujon <tt>@rep@</tt>',
651
+    'plugin_info_automatique_lib' => 'Iuj kromprogramoj postulas ankaŭ la eblon elŝuti dosierojn en la dosierujon <code>lib/</code>. Tiu dosierujo estas laŭkaze kreenda ĉe la reteja radiko.',
652
+    'plugin_info_automatique_liste' => 'Viaj listoj de kromprogramoj :',
653
+    'plugin_info_automatique_liste_officielle' => 'la oficialaj kromprogramoj',
654
+    'plugin_info_automatique_liste_update' => 'Ĝisdatigi la listojn',
655
+    'plugin_info_automatique_ou' => 'aŭ...',
656
+    'plugin_info_automatique_select' => 'Elektu ĉi-sube kromprogramon : SPIP elŝutos ĝin kaj instalos ĝin en la dosierujo <code>@rep@</code> ; se tiu ĉi kromprogramo jam ekzistas, ĝi estos ĝisdatigita.',
657
+    'plugin_info_credit' => 'Kreditoj',
658
+    'plugin_info_erreur_xml' => 'Deklaro de tiu kromprogramo ne ĝustas',
659
+    'plugin_info_install_ok' => 'Sukcesa instalado',
660
+    'plugin_info_necessite' => 'Necesas :',
661
+    'plugin_info_non_compatible_spip' => 'Tiu ĉi kromprogramo ne estas kongrua kun tiu SPIP-versio',
662
+    'plugin_info_plugins_dist_1' => 'Kromprogramoj ĉi-sube estas ŝarĝitaj kaj aktivigitaj en la dosierujo @plugins_dist@.',
663
+    'plugin_info_plugins_dist_2' => 'Ili ne malaktivigas.',
664
+    'plugin_info_telecharger' => 'elŝutota de @url@ kaj instalota en @rep@',
665
+    'plugin_info_upgrade_ok' => 'Sukcesa ĝisdatigo',
666
+    'plugin_librairies_installees' => 'Instalitaj bibliotekoj',
667
+    'plugin_necessite_extension_php' => 'Postulas la PHP-kromprogramon @plugin@ laŭ versio @version@.',
668
+    'plugin_necessite_extension_php_sans_version' => 'Postulas la PHP-kromprogramon @plugin@',
669
+    'plugin_necessite_lib' => 'Tiu ĉi kromprogramo bezonas la bibliotekon @lib@',
670
+    'plugin_necessite_php' => 'Postulas @plugin@ laŭ versio @version@.',
671
+    'plugin_necessite_plugin' => 'Postulas la kromprogramon @plugin@ laŭ versio @version@.',
672
+    'plugin_necessite_plugin_sans_version' => 'Necesas la kromprogramon @plugin@',
673
+    'plugin_necessite_spip' => 'Necesas SPIP laŭ minimume versio @version@.',
674
+    'plugin_source' => 'fonto : ',
675
+    'plugin_titre_automatique' => 'Aŭtomata instalo',
676
+    'plugin_titre_automatique_ajouter' => 'Aldoni kromprogramojn',
677
+    'plugin_titre_installation' => 'Instalado de la kromprogramo @plugin@',
678
+    'plugin_titre_modifier' => 'Miaj kromprogramoj',
679
+    'plugin_utilise_extension_php' => 'Uzas la PHP-kromprogramon @plugin@ laŭ versio @version@.', # MODIF
680
+    'plugin_utilise_php' => 'Uzas @plugin@ laŭ versio @version@.', # MODIF
681
+    'plugin_utilise_plugin' => 'Uzas la kromprogramon @plugin@ de versio @version@.', # MODIF
682
+    'plugin_zip_active' => 'Daŭrigu por ĝin aktivigi',
683
+    'plugin_zip_adresse' => 'indiku ĉi-sube la retadreson de la maldensa dosiero de elŝutenda kromprogramo, aŭ la retadreson de kromprogramolisto.',
684
+    'plugin_zip_adresse_champ' => 'Retadreso de la kromprogramo aŭ de la listo ',
685
+    'plugin_zip_content' => 'Ĝi enhavas la jenajn dosierojn (@taille@),
686 686
 <br />pretajn por instali en la dosierujo <code>@rep@</code>',
687
-	'plugin_zip_installe_finie' => 'La dosiero @zip@ estis ekstraktita kaj instalita.',
688
-	'plugin_zip_installe_rep_finie' => 'La dosiero @zip@ estis ekstraktita kaj instalita en la dosierujo @rep@',
689
-	'plugin_zip_installer' => 'Vi nun povas instali ĝin',
690
-	'plugin_zip_telecharge' => 'La dosiero @zip@ estis elŝutita',
691
-	'plugins_actif_aucun' => 'Neniu aktivata kromprogramo.',
692
-	'plugins_actif_un' => 'Unu aktivata kromprogramo.',
693
-	'plugins_actifs' => '@count@ aktivataj kromprogramoj.',
694
-	'plugins_actifs_liste' => 'Aktivaj',
695
-	'plugins_compte' => '@count@ kromprogramoj',
696
-	'plugins_disponible_un' => 'Unu disponebla kromprogramo.',
697
-	'plugins_disponibles' => '@count@ disponeblaj kromprogramoj.',
698
-	'plugins_erreur' => 'Eraro en la kromprogramoj : @plugins@',
699
-	'plugins_liste' => 'Listo de kromprogramoj',
700
-	'plugins_liste_dist' => 'Ŝlositaj kromprogramoj',
701
-	'plugins_recents' => 'Freŝaj kromprogramoj.',
702
-	'plugins_tous_liste' => 'Ĉiuj',
703
-	'plugins_vue_hierarchie' => 'Hierarkio',
704
-	'plugins_vue_liste' => 'Listo',
705
-	'protocole_ldap' => 'Protokolversio :',
687
+    'plugin_zip_installe_finie' => 'La dosiero @zip@ estis ekstraktita kaj instalita.',
688
+    'plugin_zip_installe_rep_finie' => 'La dosiero @zip@ estis ekstraktita kaj instalita en la dosierujo @rep@',
689
+    'plugin_zip_installer' => 'Vi nun povas instali ĝin',
690
+    'plugin_zip_telecharge' => 'La dosiero @zip@ estis elŝutita',
691
+    'plugins_actif_aucun' => 'Neniu aktivata kromprogramo.',
692
+    'plugins_actif_un' => 'Unu aktivata kromprogramo.',
693
+    'plugins_actifs' => '@count@ aktivataj kromprogramoj.',
694
+    'plugins_actifs_liste' => 'Aktivaj',
695
+    'plugins_compte' => '@count@ kromprogramoj',
696
+    'plugins_disponible_un' => 'Unu disponebla kromprogramo.',
697
+    'plugins_disponibles' => '@count@ disponeblaj kromprogramoj.',
698
+    'plugins_erreur' => 'Eraro en la kromprogramoj : @plugins@',
699
+    'plugins_liste' => 'Listo de kromprogramoj',
700
+    'plugins_liste_dist' => 'Ŝlositaj kromprogramoj',
701
+    'plugins_recents' => 'Freŝaj kromprogramoj.',
702
+    'plugins_tous_liste' => 'Ĉiuj',
703
+    'plugins_vue_hierarchie' => 'Hierarkio',
704
+    'plugins_vue_liste' => 'Listo',
705
+    'protocole_ldap' => 'Protokolversio :',
706 706
 
707
-	// Q
708
-	'queue_executer_maintenant' => 'Lanĉi nun',
709
-	'queue_info_purger' => 'Vi povas forviŝi ĉiujn atendante taskojn kaj restarigi la liston kun la periodaj taskoj', # MODIF
710
-	'queue_nb_jobs_in_queue' => '@nb@ atendante taskoj', # MODIF
711
-	'queue_next_job_in_nb_sec' => 'Sekva tasko post @nb@ s', # MODIF
712
-	'queue_no_job_in_queue' => 'Neniu atendante tasko', # MODIF
713
-	'queue_one_job_in_queue' => '1 atendante tasko', # MODIF
714
-	'queue_priorite_tache' => 'prioritato',
715
-	'queue_purger_queue' => 'Restarigi la taskliston', # MODIF
716
-	'queue_titre' => 'Tasklisto', # MODIF
707
+    // Q
708
+    'queue_executer_maintenant' => 'Lanĉi nun',
709
+    'queue_info_purger' => 'Vi povas forviŝi ĉiujn atendante taskojn kaj restarigi la liston kun la periodaj taskoj', # MODIF
710
+    'queue_nb_jobs_in_queue' => '@nb@ atendante taskoj', # MODIF
711
+    'queue_next_job_in_nb_sec' => 'Sekva tasko post @nb@ s', # MODIF
712
+    'queue_no_job_in_queue' => 'Neniu atendante tasko', # MODIF
713
+    'queue_one_job_in_queue' => '1 atendante tasko', # MODIF
714
+    'queue_priorite_tache' => 'prioritato',
715
+    'queue_purger_queue' => 'Restarigi la taskliston', # MODIF
716
+    'queue_titre' => 'Tasklisto', # MODIF
717 717
 
718
-	// R
719
-	'repertoire_plugins' => 'Dosierujo :',
720
-	'required' => '(deviga)', # MODIF
718
+    // R
719
+    'repertoire_plugins' => 'Dosierujo :',
720
+    'required' => '(deviga)', # MODIF
721 721
 
722
-	// S
723
-	'sans_heure' => 'sen horo',
724
-	'statut_admin_restreint' => '(limigita mastrumanto)',
725
-	'statut_webmestre' => 'retejestro',
722
+    // S
723
+    'sans_heure' => 'sen horo',
724
+    'statut_admin_restreint' => '(limigita mastrumanto)',
725
+    'statut_webmestre' => 'retejestro',
726 726
 
727
-	// T
728
-	'tache_cron_asap' => 'Tasko CRON @function@ (ASAP)',
729
-	'tache_cron_secondes' => 'Tasko CRON @function@ (ĉiuj @nb@ s)',
730
-	'taille_cache_image' => 'La bildoj aŭtomate komputitaj de SPIP (vijnetoj de dokumentoj, titoloj prezentitaj laŭ grafika formo, matematikaj funkcioj laŭ TeX-formato...) okupas en dosierujo @dir@ spacon je @taille@.',
731
-	'taille_cache_infinie' => 'Tiu retejo ne ebligas limigi memorspacon de stapla dosierujo.',
732
-	'taille_cache_maxi' => 'SPIP provas limigi memorspacon de stapla dosierujo po cirkaŭ <b>@octets@</b> da datenoj.',
733
-	'taille_cache_moins_de' => 'Memorspaco de la staplo estas malpli ol @octets@.',
734
-	'taille_cache_octets' => 'Memorspaco de la staplo estas nun proksimume @octets@.',
735
-	'taille_cache_vide' => 'La staplo estas malplena.',
736
-	'taille_repertoire_cache' => 'Memorspaco de stapla dosierujo',
737
-	'text_article_propose_publication' => 'Artikolo proponita por publikigo.',
738
-	'texte_acces_ldap_anonyme_1' => 'Iuj LDAP-serviloj ne akceptas sennoman aliron. Tiukaze, necesas difini identecnomon por serĉi informojn en dosierujilo. Plejofte tamen, la sekvantaj tajpujoj povas resti malplenaj.',
739
-	'texte_admin_effacer_01' => 'Tiu komando forviŝas <i>la tutan</i> enhavon de la datenbazo,
727
+    // T
728
+    'tache_cron_asap' => 'Tasko CRON @function@ (ASAP)',
729
+    'tache_cron_secondes' => 'Tasko CRON @function@ (ĉiuj @nb@ s)',
730
+    'taille_cache_image' => 'La bildoj aŭtomate komputitaj de SPIP (vijnetoj de dokumentoj, titoloj prezentitaj laŭ grafika formo, matematikaj funkcioj laŭ TeX-formato...) okupas en dosierujo @dir@ spacon je @taille@.',
731
+    'taille_cache_infinie' => 'Tiu retejo ne ebligas limigi memorspacon de stapla dosierujo.',
732
+    'taille_cache_maxi' => 'SPIP provas limigi memorspacon de stapla dosierujo po cirkaŭ <b>@octets@</b> da datenoj.',
733
+    'taille_cache_moins_de' => 'Memorspaco de la staplo estas malpli ol @octets@.',
734
+    'taille_cache_octets' => 'Memorspaco de la staplo estas nun proksimume @octets@.',
735
+    'taille_cache_vide' => 'La staplo estas malplena.',
736
+    'taille_repertoire_cache' => 'Memorspaco de stapla dosierujo',
737
+    'text_article_propose_publication' => 'Artikolo proponita por publikigo.',
738
+    'texte_acces_ldap_anonyme_1' => 'Iuj LDAP-serviloj ne akceptas sennoman aliron. Tiukaze, necesas difini identecnomon por serĉi informojn en dosierujilo. Plejofte tamen, la sekvantaj tajpujoj povas resti malplenaj.',
739
+    'texte_admin_effacer_01' => 'Tiu komando forviŝas <i>la tutan</i> enhavon de la datenbazo,
740 740
 inkluzive de <i>ĉiuj</i> alirrajtoj de redaktantoj kaj mastrumantoj. Post ties efektivigo, vi devos lanĉi la
741 741
 SPIP-reinstalon por rekrei novan bazon kaj unuan mastrumulan alirrajton.',
742
-	'texte_adresse_annuaire_1' => '(Se via adresaro estas instalita ĉe la sama maŝino kiel la retejo, temas verŝajne pri « localhost ».)',
743
-	'texte_ajout_auteur' => 'La jena aŭtoro estis aldonita al la artikolo :',
744
-	'texte_annuaire_ldap_1' => 'Se vi havas aliron al dosierujilo (LDAP), vi povas uzi ĝin por aŭtomate importi uzantojn sub SPIP.',
745
-	'texte_article_statut' => 'Tiu artikolo estas :',
746
-	'texte_article_virtuel' => 'Virtuala artikolo',
747
-	'texte_article_virtuel_reference' => '<b>Virtuala artikolo :</b> artikolo referencigita ĉe via SPIP-retejo, sed alidirektita al alia retadreso. Por forigi la alidirekton, forviŝu la ĉi supran URL-n.',
748
-	'texte_aucun_resultat_auteur' => 'Neniu rezulto por "@cherche_auteur@"',
749
-	'texte_auteur_messagerie' => 'Tiu retejo povas konstante indiki la liston de la konektitaj redaktantoj. Tio ebligas al vi rekte interŝanĝi mesaĝojn. Vi povas decidi ne aperi en tia listo (vi estas « nevidebla » al la aliaj uzantoj).',
750
-	'texte_auteurs' => 'LA AŬTOROJ',
751
-	'texte_choix_base_1' => 'Elektu vian datenbazon :',
752
-	'texte_choix_base_2' => 'La SQL-servilo enhavas plurajn datenbazojn.',
753
-	'texte_choix_base_3' => '<b>Elektu</b> ĉi-poste tiun, kiun atribuis al vi via retejgastiganto :',
754
-	'texte_choix_table_prefix' => 'Prefikso de la tabeloj :',
755
-	'texte_compte_element' => '@count@ elemento',
756
-	'texte_compte_elements' => '@count@ elementoj',
757
-	'texte_conflit_edition_correction' => 'Bonvolu kontroli ĉi-sube la diferencojn inter ambaŭ versioj de la teksto, vi povas ankaŭ kopii viajn ŝanĝojn, poste restartu.',
758
-	'texte_connexion_mysql' => 'Konsultu la informojn donitajn de via retgastiganto : en ili, vi trovos la ensalutilojn necesajn por konektiĝi al la servilo de datumbazo kiun li proponas.',
759
-	'texte_contenu_article' => '(Kelkvorta enhavo-priskribo de la artikolo.)',
760
-	'texte_contenu_articles' => 'Laŭ la modelo adoptita por via retejo, vi povas decidi
742
+    'texte_adresse_annuaire_1' => '(Se via adresaro estas instalita ĉe la sama maŝino kiel la retejo, temas verŝajne pri « localhost ».)',
743
+    'texte_ajout_auteur' => 'La jena aŭtoro estis aldonita al la artikolo :',
744
+    'texte_annuaire_ldap_1' => 'Se vi havas aliron al dosierujilo (LDAP), vi povas uzi ĝin por aŭtomate importi uzantojn sub SPIP.',
745
+    'texte_article_statut' => 'Tiu artikolo estas :',
746
+    'texte_article_virtuel' => 'Virtuala artikolo',
747
+    'texte_article_virtuel_reference' => '<b>Virtuala artikolo :</b> artikolo referencigita ĉe via SPIP-retejo, sed alidirektita al alia retadreso. Por forigi la alidirekton, forviŝu la ĉi supran URL-n.',
748
+    'texte_aucun_resultat_auteur' => 'Neniu rezulto por "@cherche_auteur@"',
749
+    'texte_auteur_messagerie' => 'Tiu retejo povas konstante indiki la liston de la konektitaj redaktantoj. Tio ebligas al vi rekte interŝanĝi mesaĝojn. Vi povas decidi ne aperi en tia listo (vi estas « nevidebla » al la aliaj uzantoj).',
750
+    'texte_auteurs' => 'LA AŬTOROJ',
751
+    'texte_choix_base_1' => 'Elektu vian datenbazon :',
752
+    'texte_choix_base_2' => 'La SQL-servilo enhavas plurajn datenbazojn.',
753
+    'texte_choix_base_3' => '<b>Elektu</b> ĉi-poste tiun, kiun atribuis al vi via retejgastiganto :',
754
+    'texte_choix_table_prefix' => 'Prefikso de la tabeloj :',
755
+    'texte_compte_element' => '@count@ elemento',
756
+    'texte_compte_elements' => '@count@ elementoj',
757
+    'texte_conflit_edition_correction' => 'Bonvolu kontroli ĉi-sube la diferencojn inter ambaŭ versioj de la teksto, vi povas ankaŭ kopii viajn ŝanĝojn, poste restartu.',
758
+    'texte_connexion_mysql' => 'Konsultu la informojn donitajn de via retgastiganto : en ili, vi trovos la ensalutilojn necesajn por konektiĝi al la servilo de datumbazo kiun li proponas.',
759
+    'texte_contenu_article' => '(Kelkvorta enhavo-priskribo de la artikolo.)',
760
+    'texte_contenu_articles' => 'Laŭ la modelo adoptita por via retejo, vi povas decidi
761 761
   ke certaj elementoj de la artikoloj ne estu uzataj.
762 762
   Uzu la ĉi-suban liston por indiki kiuj elementoj disponeblas.',
763
-	'texte_crash_base' => 'Se via datenbazo kolapsis,
763
+    'texte_crash_base' => 'Se via datenbazo kolapsis,
764 764
    vi povas provi
765 765
    aŭtomatan riparon.',
766
-	'texte_creer_rubrique' => 'Antaŭ ol povi skribi artikolojn,<br /> vi devas krei rubrikon.',
767
-	'texte_date_creation_article' => 'KREO-DATO DE LA ARTIKOLO :',
768
-	'texte_date_creation_objet' => 'Kreo-dato :', # on ajoute le ":"
769
-	'texte_date_publication_anterieure' => 'DATO DE ANTAŬA REDAKTO :',
770
-	'texte_date_publication_anterieure_nonaffichee' => 'Ne afiŝi daton de antaŭa redakto.',
771
-	'texte_date_publication_article' => 'DATO DE RETA PUBLIKIGO :',
772
-	'texte_date_publication_objet' => 'Dato de reta publikigo :',
773
-	'texte_definir_comme_traduction_rubrique' => 'Tiu rubriko estas traduko de la rubriko numero :',
774
-	'texte_descriptif_rapide' => 'Konciza priskribo',
775
-	'texte_effacer_base' => 'Forviŝi la SPIP-datenbazon',
776
-	'texte_effacer_statistiques' => 'Forviŝi statistikojn',
777
-	'texte_en_cours_validation' => 'La enhavoj ĉi-subaj estas proponitaj por publikigo.',
778
-	'texte_enrichir_mise_a_jour' => 'Vi povas pliriĉigi la enpaĝigon de via teksto uzante « tipografiajn rapidklavojn ».',
779
-	'texte_fichier_authent' => '<b>Ĉu SPIP kreu la specialajn dosierojn <tt>.htpasswd</tt> kaj <tt>.htpasswd-admin</tt> en dosierujo @dossier@ ?</b>
766
+    'texte_creer_rubrique' => 'Antaŭ ol povi skribi artikolojn,<br /> vi devas krei rubrikon.',
767
+    'texte_date_creation_article' => 'KREO-DATO DE LA ARTIKOLO :',
768
+    'texte_date_creation_objet' => 'Kreo-dato :', # on ajoute le ":"
769
+    'texte_date_publication_anterieure' => 'DATO DE ANTAŬA REDAKTO :',
770
+    'texte_date_publication_anterieure_nonaffichee' => 'Ne afiŝi daton de antaŭa redakto.',
771
+    'texte_date_publication_article' => 'DATO DE RETA PUBLIKIGO :',
772
+    'texte_date_publication_objet' => 'Dato de reta publikigo :',
773
+    'texte_definir_comme_traduction_rubrique' => 'Tiu rubriko estas traduko de la rubriko numero :',
774
+    'texte_descriptif_rapide' => 'Konciza priskribo',
775
+    'texte_effacer_base' => 'Forviŝi la SPIP-datenbazon',
776
+    'texte_effacer_statistiques' => 'Forviŝi statistikojn',
777
+    'texte_en_cours_validation' => 'La enhavoj ĉi-subaj estas proponitaj por publikigo.',
778
+    'texte_enrichir_mise_a_jour' => 'Vi povas pliriĉigi la enpaĝigon de via teksto uzante « tipografiajn rapidklavojn ».',
779
+    'texte_fichier_authent' => '<b>Ĉu SPIP kreu la specialajn dosierojn <tt>.htpasswd</tt> kaj <tt>.htpasswd-admin</tt> en dosierujo @dossier@ ?</b>
780 780
 <p>Tiuj dosieroj ebligas limigi la alirrajton de aŭtoroj kaj administrantoj en aliaj lokoj de via retejo (ekzemple, ekstera statistik-programo).</p>
781 781
 <p>Se tio ne utilas al vi, vi povas lasi tiun opcion je ĝia defaŭlta valoro (neniu dosier-kreo).</p>',
782
-	'texte_informations_personnelles_1' => 'La sistemo kreos por vi nun personan alireblon al la retejo.',
783
-	'texte_informations_personnelles_2' => '(Noto : se temas pri reinstalo kaj se via aliro daŭre funkcias, vi povas',
784
-	'texte_introductif_article' => '(Enkonduka teksto al la artikolo.)',
785
-	'texte_jeu_caractere' => 'Ni konsilas al vi uzi, en via retejo, universalan alfabeton (<tt>utf-8</tt>) : tio ebligas afiŝadon de tekstoj en ĉiuj lingvoj kaj solvas problemojn de kongrueco se vi uzas modernajn retumilojn.',
786
-	'texte_jeu_caractere_3' => 'Via retejo estas nun instalita laŭ la litertiparo :',
787
-	'texte_jeu_caractere_4' => 'Se tio ne kongruas kun la realo de viaj datenoj (ekzemple, sekve de datenbazo-restaŭro), aŭ se <em>vi ĵus ekkreis tiun retejon</em> kaj deziras ekuzi novan litertiparon, bonvolu indiki ĝin ĉi tie :',
788
-	'texte_login_ldap_1' => 'Lasu malplena por sennoma aliro, aŭ entajpu la kompletan vojon, ekzemple « <tt>uid=nomo, ou=uzanto, dc=mia-domajno, dc=com</tt> ».)',
789
-	'texte_login_precaution' => 'Atentu ! Tio ĉi estas la salutnomo laŭ kiu vi ensalutis.
782
+    'texte_informations_personnelles_1' => 'La sistemo kreos por vi nun personan alireblon al la retejo.',
783
+    'texte_informations_personnelles_2' => '(Noto : se temas pri reinstalo kaj se via aliro daŭre funkcias, vi povas',
784
+    'texte_introductif_article' => '(Enkonduka teksto al la artikolo.)',
785
+    'texte_jeu_caractere' => 'Ni konsilas al vi uzi, en via retejo, universalan alfabeton (<tt>utf-8</tt>) : tio ebligas afiŝadon de tekstoj en ĉiuj lingvoj kaj solvas problemojn de kongrueco se vi uzas modernajn retumilojn.',
786
+    'texte_jeu_caractere_3' => 'Via retejo estas nun instalita laŭ la litertiparo :',
787
+    'texte_jeu_caractere_4' => 'Se tio ne kongruas kun la realo de viaj datenoj (ekzemple, sekve de datenbazo-restaŭro), aŭ se <em>vi ĵus ekkreis tiun retejon</em> kaj deziras ekuzi novan litertiparon, bonvolu indiki ĝin ĉi tie :',
788
+    'texte_login_ldap_1' => 'Lasu malplena por sennoma aliro, aŭ entajpu la kompletan vojon, ekzemple « <tt>uid=nomo, ou=uzanto, dc=mia-domajno, dc=com</tt> ».)',
789
+    'texte_login_precaution' => 'Atentu ! Tio ĉi estas la salutnomo laŭ kiu vi ensalutis.
790 790
  Uzu tiun ĉi formularon prudente...',
791
-	'texte_messagerie_agenda' => 'Mesaĝado permesas al retejaj redaktantoj komuniki inter si rekte en la privata spaco de la retejo. Ĝi estas asociita kun agendo.',
792
-	'texte_mise_a_niveau_base_1' => 'Vi ĵus ĝisdatigis la SPIP-dosierojn.
791
+    'texte_messagerie_agenda' => 'Mesaĝado permesas al retejaj redaktantoj komuniki inter si rekte en la privata spaco de la retejo. Ĝi estas asociita kun agendo.',
792
+    'texte_mise_a_niveau_base_1' => 'Vi ĵus ĝisdatigis la SPIP-dosierojn.
793 793
  Necesas nun alniveligi la datenbazon
794 794
  de la retejo.',
795
-	'texte_modifier_article' => 'Modifi la artikolon :',
796
-	'texte_multilinguisme' => 'Se vi deziras mastrumi la objektojn en pluraj lingvoj, per kompleksa retumado, vi povas aldoni menuon pri lingvoelekto en la objektojn, konforme al la organizo de via retejo.',
797
-	'texte_multilinguisme_trad' => 'Vi povas ankaŭ aktivigi sistemon por mastrumi la ligilojn inter la diversaj tradukoj sur iuj objektoj.',
798
-	'texte_non_compresse' => '<i>ne densigita</i> (ĉar via servilo ne eltenas tiun funkcion)',
799
-	'texte_nouvelle_version_spip_1' => 'Vi instalis novan version de SPIP.',
800
-	'texte_nouvelle_version_spip_2' => 'Tiu ĉi nova versio bezonas pli kompletan ĝisdatigon ol kutime. Se vi estas retejestro de la retejo, bonvolu forviŝi la dosieron @connect@ kaj restarigi la instalprocezon por ĝisdatigi viajn konekt-parametrojn al la datenbazo.<p> (Notu : se vi forgesis viajn konektparametrojn, legu la dosieron @connect@ antaŭ ol forviŝi ĝin...)</p>',
801
-	'texte_operation_echec' => 'Reiru al antaŭa paĝo, selektu alian datenbazon aŭ kreu novan. Kontrolu la informojn donitajn de via retgastiganto.',
802
-	'texte_plus_trois_car' => 'pli ol 3 literoj',
803
-	'texte_plusieurs_articles' => 'Pluraj aŭtoroj trovitaj por"@cherche_auteur@" :',
804
-	'texte_port_annuaire' => 'La defaŭlte indikita valoro ĝenerale taŭgas.)',
805
-	'texte_presente_plugin' => 'Tiu paĝo listigas kromprogramojn disponeblajn ĉe tiu retejo. Vi povas aktivigi la necesajn kromprogramojn noĉante la kongruan noĉujon.',
806
-	'texte_proposer_publication' => 'Kiam via artikolo estas finita,<br /> vi povas proponi ĝian publikigon.',
807
-	'texte_proxy' => 'En iuj okazoj (intrareto, protektitaj retoj...),
795
+    'texte_modifier_article' => 'Modifi la artikolon :',
796
+    'texte_multilinguisme' => 'Se vi deziras mastrumi la objektojn en pluraj lingvoj, per kompleksa retumado, vi povas aldoni menuon pri lingvoelekto en la objektojn, konforme al la organizo de via retejo.',
797
+    'texte_multilinguisme_trad' => 'Vi povas ankaŭ aktivigi sistemon por mastrumi la ligilojn inter la diversaj tradukoj sur iuj objektoj.',
798
+    'texte_non_compresse' => '<i>ne densigita</i> (ĉar via servilo ne eltenas tiun funkcion)',
799
+    'texte_nouvelle_version_spip_1' => 'Vi instalis novan version de SPIP.',
800
+    'texte_nouvelle_version_spip_2' => 'Tiu ĉi nova versio bezonas pli kompletan ĝisdatigon ol kutime. Se vi estas retejestro de la retejo, bonvolu forviŝi la dosieron @connect@ kaj restarigi la instalprocezon por ĝisdatigi viajn konekt-parametrojn al la datenbazo.<p> (Notu : se vi forgesis viajn konektparametrojn, legu la dosieron @connect@ antaŭ ol forviŝi ĝin...)</p>',
801
+    'texte_operation_echec' => 'Reiru al antaŭa paĝo, selektu alian datenbazon aŭ kreu novan. Kontrolu la informojn donitajn de via retgastiganto.',
802
+    'texte_plus_trois_car' => 'pli ol 3 literoj',
803
+    'texte_plusieurs_articles' => 'Pluraj aŭtoroj trovitaj por"@cherche_auteur@" :',
804
+    'texte_port_annuaire' => 'La defaŭlte indikita valoro ĝenerale taŭgas.)',
805
+    'texte_presente_plugin' => 'Tiu paĝo listigas kromprogramojn disponeblajn ĉe tiu retejo. Vi povas aktivigi la necesajn kromprogramojn noĉante la kongruan noĉujon.',
806
+    'texte_proposer_publication' => 'Kiam via artikolo estas finita,<br /> vi povas proponi ĝian publikigon.',
807
+    'texte_proxy' => 'En iuj okazoj (intrareto, protektitaj retoj...),
808 808
   povas esti necese uzi na <i>proxy HTTP</i> por atingi eksterajn retejojn (dokumentaron de SPIP, abonligitajn retejojn, ktp...).
809 809
   Se tio okazas, indiku ĉi-sube ties retadreson, laŭ la formo @proxy_en_cours@. Ĝenerale,
810 810
   lasu tiun tajpujon malplena.',
811
-	'texte_publication_articles_post_dates' => 'Kiel kondutu SPIP rilate la artikolojn
811
+    'texte_publication_articles_post_dates' => 'Kiel kondutu SPIP rilate la artikolojn
812 812
   kies publikig-dato estis fiksita
813 813
   por estonta templimo ?',
814
-	'texte_rappel_selection_champs' => '[Ne forgesu ĝuste selekti tiun kampon.]',
815
-	'texte_recalcul_page' => 'Se vi volas
814
+    'texte_rappel_selection_champs' => '[Ne forgesu ĝuste selekti tiun kampon.]',
815
+    'texte_recalcul_page' => 'Se vi volas
816 816
 rekalkuli ununuran paĝon, pasu prefere tra la publika spaco kaj tie uzu la butonon « rekalkuli ».',
817
-	'texte_recuperer_base' => 'Ripari la datenbazon',
818
-	'texte_reference_mais_redirige' => 'artikolo referencigita ĉe via SPIP-retejo, sed redirektita al alia URL.',
819
-	'texte_requetes_echouent' => '<b>Kiam iuj SQL-serĉpetoj ĉiufoje
817
+    'texte_recuperer_base' => 'Ripari la datenbazon',
818
+    'texte_reference_mais_redirige' => 'artikolo referencigita ĉe via SPIP-retejo, sed redirektita al alia URL.',
819
+    'texte_requetes_echouent' => '<b>Kiam iuj SQL-serĉpetoj ĉiufoje
820 820
 kaj senkiale malsukcesas, estas eble
821 821
 ke tio okazas pro la datenbazo
822 822
 mem.</b><p>
@@ -827,89 +827,89 @@  discard block
 block discarded – undo
827 827
 Ĝi eble entenas indicojn pri la misfunkcio...</p><p>
828 828
 Se la problemo daŭras, kontaktu
829 829
 vian retgastiganton.</p>',
830
-	'texte_selection_langue_principale' => 'Vi povas ĉi-sube elekti la « ĉefan lingvon » de la retejo. Tiu elekto ne devigas vin - bonŝance ! - verki viajn artikolojn en la elektita lingvo, sed ebligas determini :
830
+    'texte_selection_langue_principale' => 'Vi povas ĉi-sube elekti la « ĉefan lingvon » de la retejo. Tiu elekto ne devigas vin - bonŝance ! - verki viajn artikolojn en la elektita lingvo, sed ebligas determini :
831 831
  <ul><li> la defaŭltan formaton de la datenoj en la publika spaco ;</li>
832 832
  <li> kian tipografiilon SPIP devas uzi pri tekst-aspektigo ;</li>
833 833
  <li> la lingvon uzendan en la formularoj de la publika spaco ;</li>
834 834
  <li> la lingvon defaŭlte prezentitan en la privata spaco.</li></ul>',
835
-	'texte_sous_titre' => 'Subtitolo',
836
-	'texte_statistiques_visites' => '(Malhelaj stangoj : dimanĉo / malhela kurbo : evoluo de la meznombro)',
837
-	'texte_statut_attente_validation' => 'Atendantaj validigon',
838
-	'texte_statut_publies' => 'Rete publikigitaj',
839
-	'texte_statut_refuses' => 'rifuzitaj',
840
-	'texte_suppression_fichiers' => 'Uzu tiun ĉi komandon por forigi ĉiujn dosierojn troviĝantajn
835
+    'texte_sous_titre' => 'Subtitolo',
836
+    'texte_statistiques_visites' => '(Malhelaj stangoj : dimanĉo / malhela kurbo : evoluo de la meznombro)',
837
+    'texte_statut_attente_validation' => 'Atendantaj validigon',
838
+    'texte_statut_publies' => 'Rete publikigitaj',
839
+    'texte_statut_refuses' => 'rifuzitaj',
840
+    'texte_suppression_fichiers' => 'Uzu tiun ĉi komandon por forigi ĉiujn dosierojn troviĝantajn
841 841
 en la SPIP-staplo. Tio ebligas ekzemple devigi la sistemon rekalkuli ĉiujn paĝojn, se vi
842 842
 faris gravajn ŝanĝojn en la grafiko aŭ strukturo de la retejo.',
843
-	'texte_sur_titre' => 'Surtitolo',
844
-	'texte_table_ok' => ' : tiu tabelo estas en ordo.',
845
-	'texte_tentative_recuperation' => 'Ripar-provo',
846
-	'texte_tenter_reparation' => 'Provi riparon de la datenbazo',
847
-	'texte_test_proxy' => 'Por testi tiun prokuran servilon, indiku ĉi tie la adreson de retejo, kiun vi deziras testi.',
848
-	'texte_titre_02' => 'Titolo :',
849
-	'texte_titre_obligatoire' => '<b>Titolo</b> [Deviga]',
850
-	'texte_travail_article' => '@nom_auteur_modif@ prilaboris tiun artikolon antaŭ @date_diff@ minutoj',
851
-	'texte_travail_collaboratif' => 'Se pluraj redaktantoj laboras ofte
843
+    'texte_sur_titre' => 'Surtitolo',
844
+    'texte_table_ok' => ' : tiu tabelo estas en ordo.',
845
+    'texte_tentative_recuperation' => 'Ripar-provo',
846
+    'texte_tenter_reparation' => 'Provi riparon de la datenbazo',
847
+    'texte_test_proxy' => 'Por testi tiun prokuran servilon, indiku ĉi tie la adreson de retejo, kiun vi deziras testi.',
848
+    'texte_titre_02' => 'Titolo :',
849
+    'texte_titre_obligatoire' => '<b>Titolo</b> [Deviga]',
850
+    'texte_travail_article' => '@nom_auteur_modif@ prilaboris tiun artikolon antaŭ @date_diff@ minutoj',
851
+    'texte_travail_collaboratif' => 'Se pluraj redaktantoj laboras ofte
852 852
   pri sama artikolo, la sistemo
853 853
   povas afiŝi la ĵus « malfermitajn » artikolojn
854 854
   por eviti la sammomentajn modifojn.
855 855
   Tiu opcio estas defaŭlte malaktivigita
856 856
   por eviti maloportunajn
857 857
   averto-mesaĝojn.',
858
-	'texte_vide' => 'malplena',
859
-	'texte_vider_cache' => 'Malplenigi la staplon',
860
-	'titre_admin_tech' => 'Teknika bontenado',
861
-	'titre_admin_vider' => 'Teknika bontenado',
862
-	'titre_ajouter_un_auteur' => 'Aldoni aŭtoro',
863
-	'titre_ajouter_un_mot' => 'Aldoni ŝlosilvorto',
864
-	'titre_cadre_afficher_article' => 'Afiŝi la artikolojn',
865
-	'titre_cadre_afficher_traductions' => 'Afiŝi la traduk-staton por tiuj lingvoj :',
866
-	'titre_cadre_ajouter_auteur' => 'ALDONI AŬTORON :',
867
-	'titre_cadre_interieur_rubrique' => 'Ene de la rubriko',
868
-	'titre_cadre_numero_auteur' => 'AŬTORO NUMERO',
869
-	'titre_cadre_numero_objet' => '@objet@ NUMERO :',
870
-	'titre_cadre_signature_obligatoire' => '<b>Subskribo</b> [deviga]<br />',
871
-	'titre_config_contenu_notifications' => 'Avizoj',
872
-	'titre_config_contenu_prive' => 'En la privata spaco',
873
-	'titre_config_contenu_public' => 'Ĉe la publika retejo',
874
-	'titre_config_fonctions' => 'Agordo de la retejo',
875
-	'titre_config_langage' => 'Agordi la lingvon',
876
-	'titre_configuration' => 'Agordo de la retejo',
877
-	'titre_configurer_preferences' => 'Agordi viajn preferojn',
878
-	'titre_configurer_preferences_menus' => 'Agordi viajn preferatajn menuojn',
879
-	'titre_conflit_edition' => 'Konflikto dum redaktado',
880
-	'titre_connexion_ldap' => 'Opcioj : <b>Via konekto LDAP</b>',
881
-	'titre_groupe_mots' => 'GRUPO DE VORTOJ :',
882
-	'titre_identite_site' => 'Identeco de la retejo',
883
-	'titre_langue_article' => 'Lingvo de la artikolo',
884
-	'titre_langue_rubrique' => 'Lingvo de la rubriko',
885
-	'titre_langue_trad_article' => 'LINGVO KAJ TRADUKOJ DE LA ARTIKOLO',
886
-	'titre_les_articles' => 'LA ARTIKOLOJ',
887
-	'titre_messagerie_agenda' => 'Mesaĝilo kaj agendo',
888
-	'titre_naviguer_dans_le_site' => 'Retejumi...',
889
-	'titre_nouvelle_rubrique' => 'Nova rubriko',
890
-	'titre_numero_rubrique' => 'RUBRIKO NUMERO :',
891
-	'titre_page_articles_edit' => 'Modifi : @titre@',
892
-	'titre_page_articles_page' => 'La artikoloj',
893
-	'titre_page_articles_tous' => 'La tuta retejo',
894
-	'titre_page_calendrier' => 'Kalendaro @nom_mois@ @annee@',
895
-	'titre_page_config_contenu' => 'Agordo de la retejo',
896
-	'titre_page_delete_all' => 'tuta kaj malfarebla forviŝo',
897
-	'titre_page_recherche' => 'Serĉrezulto @recherche@',
898
-	'titre_page_statistiques_referers' => 'Statistikoj (eniraj ligiloj)',
899
-	'titre_page_upgrade' => 'SPIP-alniveligo',
900
-	'titre_preference_menus_favoris' => 'Preferataj menuoj',
901
-	'titre_publication_articles_post_dates' => 'Publikigo de la postdatitaj artikoloj',
902
-	'titre_reparation' => 'Riparo',
903
-	'titre_suivi_petition' => 'Kontrolo de la petskriboj',
904
-	'tls_ldap' => 'Transŝuta tavolsekureco (TLS) :',
905
-	'trad_article_traduction' => 'Ĉiuj versioj de tiu ĉi artikolo :',
906
-	'trad_delier' => 'Ne plu ligi al ties tradukoj',
907
-	'trad_lier' => 'Tiu artikolo estas traduko de la artikolo numero :',
908
-	'trad_new' => 'Skribi novan tradukon',
858
+    'texte_vide' => 'malplena',
859
+    'texte_vider_cache' => 'Malplenigi la staplon',
860
+    'titre_admin_tech' => 'Teknika bontenado',
861
+    'titre_admin_vider' => 'Teknika bontenado',
862
+    'titre_ajouter_un_auteur' => 'Aldoni aŭtoro',
863
+    'titre_ajouter_un_mot' => 'Aldoni ŝlosilvorto',
864
+    'titre_cadre_afficher_article' => 'Afiŝi la artikolojn',
865
+    'titre_cadre_afficher_traductions' => 'Afiŝi la traduk-staton por tiuj lingvoj :',
866
+    'titre_cadre_ajouter_auteur' => 'ALDONI AŬTORON :',
867
+    'titre_cadre_interieur_rubrique' => 'Ene de la rubriko',
868
+    'titre_cadre_numero_auteur' => 'AŬTORO NUMERO',
869
+    'titre_cadre_numero_objet' => '@objet@ NUMERO :',
870
+    'titre_cadre_signature_obligatoire' => '<b>Subskribo</b> [deviga]<br />',
871
+    'titre_config_contenu_notifications' => 'Avizoj',
872
+    'titre_config_contenu_prive' => 'En la privata spaco',
873
+    'titre_config_contenu_public' => 'Ĉe la publika retejo',
874
+    'titre_config_fonctions' => 'Agordo de la retejo',
875
+    'titre_config_langage' => 'Agordi la lingvon',
876
+    'titre_configuration' => 'Agordo de la retejo',
877
+    'titre_configurer_preferences' => 'Agordi viajn preferojn',
878
+    'titre_configurer_preferences_menus' => 'Agordi viajn preferatajn menuojn',
879
+    'titre_conflit_edition' => 'Konflikto dum redaktado',
880
+    'titre_connexion_ldap' => 'Opcioj : <b>Via konekto LDAP</b>',
881
+    'titre_groupe_mots' => 'GRUPO DE VORTOJ :',
882
+    'titre_identite_site' => 'Identeco de la retejo',
883
+    'titre_langue_article' => 'Lingvo de la artikolo',
884
+    'titre_langue_rubrique' => 'Lingvo de la rubriko',
885
+    'titre_langue_trad_article' => 'LINGVO KAJ TRADUKOJ DE LA ARTIKOLO',
886
+    'titre_les_articles' => 'LA ARTIKOLOJ',
887
+    'titre_messagerie_agenda' => 'Mesaĝilo kaj agendo',
888
+    'titre_naviguer_dans_le_site' => 'Retejumi...',
889
+    'titre_nouvelle_rubrique' => 'Nova rubriko',
890
+    'titre_numero_rubrique' => 'RUBRIKO NUMERO :',
891
+    'titre_page_articles_edit' => 'Modifi : @titre@',
892
+    'titre_page_articles_page' => 'La artikoloj',
893
+    'titre_page_articles_tous' => 'La tuta retejo',
894
+    'titre_page_calendrier' => 'Kalendaro @nom_mois@ @annee@',
895
+    'titre_page_config_contenu' => 'Agordo de la retejo',
896
+    'titre_page_delete_all' => 'tuta kaj malfarebla forviŝo',
897
+    'titre_page_recherche' => 'Serĉrezulto @recherche@',
898
+    'titre_page_statistiques_referers' => 'Statistikoj (eniraj ligiloj)',
899
+    'titre_page_upgrade' => 'SPIP-alniveligo',
900
+    'titre_preference_menus_favoris' => 'Preferataj menuoj',
901
+    'titre_publication_articles_post_dates' => 'Publikigo de la postdatitaj artikoloj',
902
+    'titre_reparation' => 'Riparo',
903
+    'titre_suivi_petition' => 'Kontrolo de la petskriboj',
904
+    'tls_ldap' => 'Transŝuta tavolsekureco (TLS) :',
905
+    'trad_article_traduction' => 'Ĉiuj versioj de tiu ĉi artikolo :',
906
+    'trad_delier' => 'Ne plu ligi al ties tradukoj',
907
+    'trad_lier' => 'Tiu artikolo estas traduko de la artikolo numero :',
908
+    'trad_new' => 'Skribi novan tradukon',
909 909
 
910
-	// U
911
-	'utf8_convert_erreur_orig' => 'Eraro : la litertiparo @charset@ ne estas eltenata.',
910
+    // U
911
+    'utf8_convert_erreur_orig' => 'Eraro : la litertiparo @charset@ ne estas eltenata.',
912 912
 
913
-	// V
914
-	'version' => 'Versio :'
913
+    // V
914
+    'version' => 'Versio :'
915 915
 );
Please login to merge, or discard this patch.
ecrire/lang/ecrire_it.php 1 patch
Indentation   +841 added lines, -841 removed lines patch added patch discarded remove patch
@@ -4,831 +4,831 @@  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
-	'activer_plugin' => 'Attiva l’estensione',
14
-	'affichage' => 'Visualizzazione',
15
-	'aide_non_disponible' => 'Questa parte della guida in linea non è ancora disponibile in italiano.',
16
-	'annuler_recherche' => 'Annullare la ricerca',
17
-	'auteur' => 'Autore:',
18
-	'avis_acces_interdit' => 'Accesso vietato.',
19
-	'avis_acces_interdit_prive' => 'Non hai i diritti di accesso per la pagina <b>@exec@</b>.',
20
-	'avis_article_modifie' => 'Attenzione, @nom_auteur_modif@ ha lavorato su quest’articolo @date_diff@ minuti fa',
21
-	'avis_aucun_resultat' => 'Nessun risultato.',
22
-	'avis_base_inaccessible' => 'Impossibile connettersi al database @base@.',
23
-	'avis_chemin_invalide_1' => 'il percorso che hai scelto',
24
-	'avis_chemin_invalide_2' => 'non sembra valido. Torna alla pagina precedente e verifica le informazioni fornite.',
25
-	'avis_connexion_echec_1' => 'Il collegamento alla base di dati  è fallito.',
26
-	'avis_connexion_echec_2' => 'Torna alla pagina precedente e verifica le informazioni fornite.',
27
-	'avis_connexion_echec_3' => '<b>N.B.</b> Su molti server si deve <b>chiedere</b> l’attivazione dell’accesso alla base di dati prima di poterlo utilizzare. Se è impossibile collegarsi, verificare che questo passo sia stato fatto.',
28
-	'avis_connexion_erreur_creer_base' => 'Non è stato possibile creare un database.',
29
-	'avis_connexion_erreur_fichier_cle_manquant_1' => 'L’installazione deve essere eseguita da un webmaster con un backup delle credenziali di accesso ',
30
-	'avis_connexion_erreur_fichier_cle_manquant_2' => 'L’installazione deve essere eseguita da un webmaster con un backup delle credenziali',
31
-	'avis_connexion_erreur_nom_base' => 'Il nome del database può contenere solo lettere, numeri e tratti.',
32
-	'avis_connexion_ldap_echec_1' => 'La connessione al server LDAP è fallita.',
33
-	'avis_connexion_ldap_echec_2' => 'Torna alla pagina precedente e verifica le informazioni fornite. ',
34
-	'avis_connexion_ldap_echec_3' => 'In alternativa, non utilizzare il supporto LDAP per importare utenti.',
35
-	'avis_deplacement_rubrique' => 'Attenzione! Questa rubrica contiene @contient_breves@ breve/i: se vuoi spostarla, spunta questa casella per confermare.',
36
-	'avis_erreur_connexion_mysql' => 'Errore di connessione SQL',
37
-	'avis_erreur_creation_compte' => 'Impossibile inizializzare l’account',
38
-	'avis_espace_interdit' => '<b>Area vietata</b> <div>SPIP è già installato.</div>',
39
-	'avis_lecture_noms_bases_1' => 'Il programma di installazione non ha potuto leggere i nomi dei database installati nel server.',
40
-	'avis_lecture_noms_bases_2' => 'Nessun database è disponibile, o la funzione che permette di accedere alla lista database è
12
+    // A
13
+    'activer_plugin' => 'Attiva l’estensione',
14
+    'affichage' => 'Visualizzazione',
15
+    'aide_non_disponible' => 'Questa parte della guida in linea non è ancora disponibile in italiano.',
16
+    'annuler_recherche' => 'Annullare la ricerca',
17
+    'auteur' => 'Autore:',
18
+    'avis_acces_interdit' => 'Accesso vietato.',
19
+    'avis_acces_interdit_prive' => 'Non hai i diritti di accesso per la pagina <b>@exec@</b>.',
20
+    'avis_article_modifie' => 'Attenzione, @nom_auteur_modif@ ha lavorato su quest’articolo @date_diff@ minuti fa',
21
+    'avis_aucun_resultat' => 'Nessun risultato.',
22
+    'avis_base_inaccessible' => 'Impossibile connettersi al database @base@.',
23
+    'avis_chemin_invalide_1' => 'il percorso che hai scelto',
24
+    'avis_chemin_invalide_2' => 'non sembra valido. Torna alla pagina precedente e verifica le informazioni fornite.',
25
+    'avis_connexion_echec_1' => 'Il collegamento alla base di dati  è fallito.',
26
+    'avis_connexion_echec_2' => 'Torna alla pagina precedente e verifica le informazioni fornite.',
27
+    'avis_connexion_echec_3' => '<b>N.B.</b> Su molti server si deve <b>chiedere</b> l’attivazione dell’accesso alla base di dati prima di poterlo utilizzare. Se è impossibile collegarsi, verificare che questo passo sia stato fatto.',
28
+    'avis_connexion_erreur_creer_base' => 'Non è stato possibile creare un database.',
29
+    'avis_connexion_erreur_fichier_cle_manquant_1' => 'L’installazione deve essere eseguita da un webmaster con un backup delle credenziali di accesso ',
30
+    'avis_connexion_erreur_fichier_cle_manquant_2' => 'L’installazione deve essere eseguita da un webmaster con un backup delle credenziali',
31
+    'avis_connexion_erreur_nom_base' => 'Il nome del database può contenere solo lettere, numeri e tratti.',
32
+    'avis_connexion_ldap_echec_1' => 'La connessione al server LDAP è fallita.',
33
+    'avis_connexion_ldap_echec_2' => 'Torna alla pagina precedente e verifica le informazioni fornite. ',
34
+    'avis_connexion_ldap_echec_3' => 'In alternativa, non utilizzare il supporto LDAP per importare utenti.',
35
+    'avis_deplacement_rubrique' => 'Attenzione! Questa rubrica contiene @contient_breves@ breve/i: se vuoi spostarla, spunta questa casella per confermare.',
36
+    'avis_erreur_connexion_mysql' => 'Errore di connessione SQL',
37
+    'avis_erreur_creation_compte' => 'Impossibile inizializzare l’account',
38
+    'avis_espace_interdit' => '<b>Area vietata</b> <div>SPIP è già installato.</div>',
39
+    'avis_lecture_noms_bases_1' => 'Il programma di installazione non ha potuto leggere i nomi dei database installati nel server.',
40
+    'avis_lecture_noms_bases_2' => 'Nessun database è disponibile, o la funzione che permette di accedere alla lista database è
41 41
 disattivata per motivi sicurezza (verifica con l’amministratore di sistema).',
42
-	'avis_lecture_noms_bases_3' => 'Nel secondo caso, è probabile che un database con il tuo nome di login sia utilizzabile:',
43
-	'avis_non_acces_page' => 'Non hai accesso a questa pagina.',
44
-	'avis_operation_echec' => 'L’operazione è fallita.',
45
-	'avis_operation_impossible' => 'Operazione impossibile',
46
-	'avis_suppression_base' => 'ATTENZIONE, la cancellazione dei dati è irreversibile',
42
+    'avis_lecture_noms_bases_3' => 'Nel secondo caso, è probabile che un database con il tuo nome di login sia utilizzabile:',
43
+    'avis_non_acces_page' => 'Non hai accesso a questa pagina.',
44
+    'avis_operation_echec' => 'L’operazione è fallita.',
45
+    'avis_operation_impossible' => 'Operazione impossibile',
46
+    'avis_suppression_base' => 'ATTENZIONE, la cancellazione dei dati è irreversibile',
47 47
 
48
-	// B
49
-	'bouton_acces_ldap' => 'Aggiungi l’accesso a LDAP ',
50
-	'bouton_ajouter' => 'Aggiungi',
51
-	'bouton_annuler' => 'Annulla',
52
-	'bouton_cache_activer' => 'Riattivare la cache',
53
-	'bouton_cache_desactiver' => 'Disabilita temporaneamente la cache',
54
-	'bouton_demande_publication' => 'Chiedi la pubblicazione di questo articolo',
55
-	'bouton_desactive_tout' => 'Disattiva tutto',
56
-	'bouton_desinstaller' => 'Disinstalla',
57
-	'bouton_effacer_tout' => 'Cancella TUTTO',
58
-	'bouton_envoyer_message' => 'Messaggio definitivo: Invia',
59
-	'bouton_fermer' => 'Chiudi',
60
-	'bouton_mettre_a_jour_base' => 'Aggiorna il database',
61
-	'bouton_modifier' => 'Modifica',
62
-	'bouton_radio_afficher' => 'Visualizza',
63
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Comparire nell’elenco dei redattori collegati',
64
-	'bouton_radio_envoi_annonces_adresse' => 'Invia gli annunci all’indirizzo:',
65
-	'bouton_radio_envoi_liste_nouveautes' => 'Invia l’elenco delle novità',
66
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Non comparire nell’elenco dei redattori collegati ',
67
-	'bouton_radio_non_envoi_annonces_editoriales' => 'Non inviare annunci editoriali ',
68
-	'bouton_redirection' => 'REINDIRIZZAMENTO',
69
-	'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Ripristina i valori predefiniti',
70
-	'bouton_relancer_inscription' => 'Riavvia l’iscrizione',
71
-	'bouton_relancer_inscriptions' => 'Riavvia le registrazioni',
72
-	'bouton_relancer_installation' => 'Rilanciare l’installazione',
73
-	'bouton_reset_password' => 'Genera una nuova password ed inviala per email',
74
-	'bouton_suivant' => 'Avanti',
75
-	'bouton_tenter_recuperation' => 'Tentare un ripristino',
76
-	'bouton_test_proxy' => 'Testare il proxy',
77
-	'bouton_vider_cache' => 'Svuota la cache',
48
+    // B
49
+    'bouton_acces_ldap' => 'Aggiungi l’accesso a LDAP ',
50
+    'bouton_ajouter' => 'Aggiungi',
51
+    'bouton_annuler' => 'Annulla',
52
+    'bouton_cache_activer' => 'Riattivare la cache',
53
+    'bouton_cache_desactiver' => 'Disabilita temporaneamente la cache',
54
+    'bouton_demande_publication' => 'Chiedi la pubblicazione di questo articolo',
55
+    'bouton_desactive_tout' => 'Disattiva tutto',
56
+    'bouton_desinstaller' => 'Disinstalla',
57
+    'bouton_effacer_tout' => 'Cancella TUTTO',
58
+    'bouton_envoyer_message' => 'Messaggio definitivo: Invia',
59
+    'bouton_fermer' => 'Chiudi',
60
+    'bouton_mettre_a_jour_base' => 'Aggiorna il database',
61
+    'bouton_modifier' => 'Modifica',
62
+    'bouton_radio_afficher' => 'Visualizza',
63
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Comparire nell’elenco dei redattori collegati',
64
+    'bouton_radio_envoi_annonces_adresse' => 'Invia gli annunci all’indirizzo:',
65
+    'bouton_radio_envoi_liste_nouveautes' => 'Invia l’elenco delle novità',
66
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Non comparire nell’elenco dei redattori collegati ',
67
+    'bouton_radio_non_envoi_annonces_editoriales' => 'Non inviare annunci editoriali ',
68
+    'bouton_redirection' => 'REINDIRIZZAMENTO',
69
+    'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Ripristina i valori predefiniti',
70
+    'bouton_relancer_inscription' => 'Riavvia l’iscrizione',
71
+    'bouton_relancer_inscriptions' => 'Riavvia le registrazioni',
72
+    'bouton_relancer_installation' => 'Rilanciare l’installazione',
73
+    'bouton_reset_password' => 'Genera una nuova password ed inviala per email',
74
+    'bouton_suivant' => 'Avanti',
75
+    'bouton_tenter_recuperation' => 'Tentare un ripristino',
76
+    'bouton_test_proxy' => 'Testare il proxy',
77
+    'bouton_vider_cache' => 'Svuota la cache',
78 78
 
79
-	// C
80
-	'cache_modifiable_webmestre' => 'Questo parametro può essere modificato dal webmaster del sito.',
81
-	'calendrier_synchro' => 'Se si utilizza un programma di agenda compatibile con <b>iCal</b>, è possibile sincronizzare i dati con le informazioni di questo sito',
82
-	'config_activer_champs' => 'Attiva i campi seguenti',
83
-	'config_choix_base_sup' => 'indicare un database su questo server',
84
-	'config_erreur_base_sup' => 'SPIP non ha accesso all’elenco dei database accessibili ',
85
-	'config_info_base_sup' => 'Se si hanno altri database da interrogare attraverso SPIP, con il proprio server SQL o altro, il form sottostante permette di dichiararli. Se si lasciano alcuni campi vuoti verranno utilizzati i dati della connessione al database principale.',
86
-	'config_info_base_sup_disponibles' => 'Database supplementari già dichiarati:',
87
-	'config_info_enregistree' => 'La nuova configurazione è stata registrata',
88
-	'config_info_logos' => 'Ogni elemento del sito può avere un logo, come pure un « logo per il roll-over »',
89
-	'config_info_logos_utiliser' => 'Utilizza i logo',
90
-	'config_info_logos_utiliser_non' => 'Non utilizzare i logo',
91
-	'config_info_logos_utiliser_survol' => 'Utilizzare i logo di roll-over',
92
-	'config_info_logos_utiliser_survol_non' => 'Non utilizzare i logo di roll-over',
93
-	'config_info_redirection' => 'Attivando questa opzione è possibile creare degli articoli virtuali, semplici riferimenti di articoli pubblicati su altri siti o al di fuori di SPIP.',
94
-	'config_redirection' => 'Articoli virtuali',
95
-	'config_titre_base_sup' => 'Dichiarazione di un database supplementare',
96
-	'config_titre_base_sup_choix' => 'Scegliere un database supplementare',
97
-	'connexion_ldap' => 'Connessione:',
98
-	'creer_et_associer_un_auteur' => 'Crea e associa un’autore',
79
+    // C
80
+    'cache_modifiable_webmestre' => 'Questo parametro può essere modificato dal webmaster del sito.',
81
+    'calendrier_synchro' => 'Se si utilizza un programma di agenda compatibile con <b>iCal</b>, è possibile sincronizzare i dati con le informazioni di questo sito',
82
+    'config_activer_champs' => 'Attiva i campi seguenti',
83
+    'config_choix_base_sup' => 'indicare un database su questo server',
84
+    'config_erreur_base_sup' => 'SPIP non ha accesso all’elenco dei database accessibili ',
85
+    'config_info_base_sup' => 'Se si hanno altri database da interrogare attraverso SPIP, con il proprio server SQL o altro, il form sottostante permette di dichiararli. Se si lasciano alcuni campi vuoti verranno utilizzati i dati della connessione al database principale.',
86
+    'config_info_base_sup_disponibles' => 'Database supplementari già dichiarati:',
87
+    'config_info_enregistree' => 'La nuova configurazione è stata registrata',
88
+    'config_info_logos' => 'Ogni elemento del sito può avere un logo, come pure un « logo per il roll-over »',
89
+    'config_info_logos_utiliser' => 'Utilizza i logo',
90
+    'config_info_logos_utiliser_non' => 'Non utilizzare i logo',
91
+    'config_info_logos_utiliser_survol' => 'Utilizzare i logo di roll-over',
92
+    'config_info_logos_utiliser_survol_non' => 'Non utilizzare i logo di roll-over',
93
+    'config_info_redirection' => 'Attivando questa opzione è possibile creare degli articoli virtuali, semplici riferimenti di articoli pubblicati su altri siti o al di fuori di SPIP.',
94
+    'config_redirection' => 'Articoli virtuali',
95
+    'config_titre_base_sup' => 'Dichiarazione di un database supplementare',
96
+    'config_titre_base_sup_choix' => 'Scegliere un database supplementare',
97
+    'connexion_ldap' => 'Connessione:',
98
+    'creer_et_associer_un_auteur' => 'Crea e associa un’autore',
99 99
 
100
-	// D
101
-	'date_mot_heures' => 'ore',
100
+    // D
101
+    'date_mot_heures' => 'ore',
102 102
 
103
-	// E
104
-	'ecran_connexion_couleur_principale' => 'Colore principale',
105
-	'ecran_connexion_image_fond' => 'Immagine di sfondo',
106
-	'ecran_connexion_image_fond_explication' => 'Usa un’immagine (formato JPEG, 1920x1080 pixel)',
107
-	'ecran_connexion_image_revenir_couleur_defaut' => 'Reimposta il colore predefinito',
108
-	'ecran_connexion_titre' => 'Schermata di accesso',
109
-	'ecran_securite' => ' + sicurezza dello schermo @version@',
110
-	'email' => 'email',
111
-	'email_2' => 'email:',
112
-	'en_savoir_plus' => 'Per saperne di più',
113
-	'entree_adresse_annuaire' => 'Indirizzo della rubrica',
114
-	'entree_adresse_email' => 'Il tuo indirizzo email',
115
-	'entree_adresse_email_2' => 'Indirizzo e-mail',
116
-	'entree_base_donnee_1' => 'Indirizzo del database',
117
-	'entree_base_donnee_2' => '(Spesso questo indirizzo coincide con quello dell’intero sito, qualche volta corrisponde a "localhost", altre volte invece non è necessario specificarlo.)',
118
-	'entree_biographie' => 'La tua biografia in breve.',
119
-	'entree_chemin_acces' => '<b>Inserire</b> il percorso d’accesso:',
120
-	'entree_cle_pgp' => 'Chiave PGP',
121
-	'entree_cle_pgp_2' => 'Chiave PGP',
122
-	'entree_contenu_rubrique' => '(Contenuto della rubrica in qualche parola)',
123
-	'entree_identifiants_connexion' => 'Identificativo di connessione...',
124
-	'entree_identifiants_connexion_2' => 'Indentificativo di connessione',
125
-	'entree_informations_connexion_ldap' => 'Inserisci in questo form gli estremi per la connessione alla tua rubrica LDAP.
103
+    // E
104
+    'ecran_connexion_couleur_principale' => 'Colore principale',
105
+    'ecran_connexion_image_fond' => 'Immagine di sfondo',
106
+    'ecran_connexion_image_fond_explication' => 'Usa un’immagine (formato JPEG, 1920x1080 pixel)',
107
+    'ecran_connexion_image_revenir_couleur_defaut' => 'Reimposta il colore predefinito',
108
+    'ecran_connexion_titre' => 'Schermata di accesso',
109
+    'ecran_securite' => ' + sicurezza dello schermo @version@',
110
+    'email' => 'email',
111
+    'email_2' => 'email:',
112
+    'en_savoir_plus' => 'Per saperne di più',
113
+    'entree_adresse_annuaire' => 'Indirizzo della rubrica',
114
+    'entree_adresse_email' => 'Il tuo indirizzo email',
115
+    'entree_adresse_email_2' => 'Indirizzo e-mail',
116
+    'entree_base_donnee_1' => 'Indirizzo del database',
117
+    'entree_base_donnee_2' => '(Spesso questo indirizzo coincide con quello dell’intero sito, qualche volta corrisponde a "localhost", altre volte invece non è necessario specificarlo.)',
118
+    'entree_biographie' => 'La tua biografia in breve.',
119
+    'entree_chemin_acces' => '<b>Inserire</b> il percorso d’accesso:',
120
+    'entree_cle_pgp' => 'Chiave PGP',
121
+    'entree_cle_pgp_2' => 'Chiave PGP',
122
+    'entree_contenu_rubrique' => '(Contenuto della rubrica in qualche parola)',
123
+    'entree_identifiants_connexion' => 'Identificativo di connessione...',
124
+    'entree_identifiants_connexion_2' => 'Indentificativo di connessione',
125
+    'entree_informations_connexion_ldap' => 'Inserisci in questo form gli estremi per la connessione alla tua rubrica LDAP.
126 126
 Se non conosci queste informazioni, richiedile all’amministratore del sistema o della rete.',
127
-	'entree_infos_perso' => 'Chi sei?',
128
-	'entree_infos_perso_2' => 'Chi è l’autore?',
129
-	'entree_interieur_rubrique' => 'All’interno della rubrica:',
130
-	'entree_liens_sites' => '<b>Link ipertestuale</b> (riferimento, sito da visitare...)',
131
-	'entree_login' => 'Login',
132
-	'entree_login_connexion_1' => 'Il login di connessione',
133
-	'entree_login_connexion_2' => '(Corrisponde a volte al login d’accesso via FTP; in alcuni casi non occorre specificare nulla)',
134
-	'entree_mot_passe' => 'Password',
135
-	'entree_mot_passe_1' => 'La password di connessione',
136
-	'entree_mot_passe_2' => '(Corrisponde a volte alla password d’accesso via FTP; in alcuni casi non occorre specificare nulla)',
137
-	'entree_nom_fichier' => 'Inserire il nome del file @texte_compresse@:',
138
-	'entree_nom_pseudo' => 'Nome o pseudonimo',
139
-	'entree_nom_pseudo_1' => '(Nome o pseudonimo)',
140
-	'entree_nom_pseudo_2' => 'Nome o alias',
141
-	'entree_nom_site' => 'Nome del tuo sito',
142
-	'entree_nom_site_2' => 'Nome del sito dell’autore',
143
-	'entree_nouveau_passe' => 'Nuova password',
144
-	'entree_passe_ldap' => 'Password',
145
-	'entree_port_annuaire' => 'Il numero di porta della rubrica',
146
-	'entree_signature' => 'Firma',
147
-	'entree_titre_obligatoire' => '<b>Titolo</b> [Obbligatorio]<br />',
148
-	'entree_url' => 'Indirizzo (URL) del sito',
149
-	'entree_url_2' => 'Indirizzo del sito',
150
-	'erreur_connect_deja_existant' => 'Esista già un server con quel nome',
151
-	'erreur_contenu_suspect' => 'Testo sfuggito',
152
-	'erreur_email_deja_existant' => 'Questo indirizzo email risulta già registrato.',
153
-	'erreur_nom_connect_incorrect' => 'Nome del server non consentito',
154
-	'erreur_plugin_attribut_balise_manquant' => 'Attributo @attribut@ mancante nel tag @balise@.',
155
-	'erreur_plugin_desinstalation_echouee' => 'La disinstallazione del plugin è fallita. In ogni caso potete disattivarlo.',
156
-	'erreur_plugin_fichier_absent' => 'File non presente',
157
-	'erreur_plugin_fichier_def_absent' => 'File di definizioni non presente',
158
-	'erreur_plugin_nom_fonction_interdit' => 'Nome di funzione non possibile',
159
-	'erreur_plugin_nom_manquant' => 'Nome del plugin mancante',
160
-	'erreur_plugin_prefix_manquant' => 'Spazio per il nome del plugin non definito',
161
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; mancante nel file di definizione',
162
-	'erreur_plugin_version_manquant' => 'Versione del plugin mancante',
163
-	'erreur_type_fichier' => 'Tipo di file non corretto',
127
+    'entree_infos_perso' => 'Chi sei?',
128
+    'entree_infos_perso_2' => 'Chi è l’autore?',
129
+    'entree_interieur_rubrique' => 'All’interno della rubrica:',
130
+    'entree_liens_sites' => '<b>Link ipertestuale</b> (riferimento, sito da visitare...)',
131
+    'entree_login' => 'Login',
132
+    'entree_login_connexion_1' => 'Il login di connessione',
133
+    'entree_login_connexion_2' => '(Corrisponde a volte al login d’accesso via FTP; in alcuni casi non occorre specificare nulla)',
134
+    'entree_mot_passe' => 'Password',
135
+    'entree_mot_passe_1' => 'La password di connessione',
136
+    'entree_mot_passe_2' => '(Corrisponde a volte alla password d’accesso via FTP; in alcuni casi non occorre specificare nulla)',
137
+    'entree_nom_fichier' => 'Inserire il nome del file @texte_compresse@:',
138
+    'entree_nom_pseudo' => 'Nome o pseudonimo',
139
+    'entree_nom_pseudo_1' => '(Nome o pseudonimo)',
140
+    'entree_nom_pseudo_2' => 'Nome o alias',
141
+    'entree_nom_site' => 'Nome del tuo sito',
142
+    'entree_nom_site_2' => 'Nome del sito dell’autore',
143
+    'entree_nouveau_passe' => 'Nuova password',
144
+    'entree_passe_ldap' => 'Password',
145
+    'entree_port_annuaire' => 'Il numero di porta della rubrica',
146
+    'entree_signature' => 'Firma',
147
+    'entree_titre_obligatoire' => '<b>Titolo</b> [Obbligatorio]<br />',
148
+    'entree_url' => 'Indirizzo (URL) del sito',
149
+    'entree_url_2' => 'Indirizzo del sito',
150
+    'erreur_connect_deja_existant' => 'Esista già un server con quel nome',
151
+    'erreur_contenu_suspect' => 'Testo sfuggito',
152
+    'erreur_email_deja_existant' => 'Questo indirizzo email risulta già registrato.',
153
+    'erreur_nom_connect_incorrect' => 'Nome del server non consentito',
154
+    'erreur_plugin_attribut_balise_manquant' => 'Attributo @attribut@ mancante nel tag @balise@.',
155
+    'erreur_plugin_desinstalation_echouee' => 'La disinstallazione del plugin è fallita. In ogni caso potete disattivarlo.',
156
+    'erreur_plugin_fichier_absent' => 'File non presente',
157
+    'erreur_plugin_fichier_def_absent' => 'File di definizioni non presente',
158
+    'erreur_plugin_nom_fonction_interdit' => 'Nome di funzione non possibile',
159
+    'erreur_plugin_nom_manquant' => 'Nome del plugin mancante',
160
+    'erreur_plugin_prefix_manquant' => 'Spazio per il nome del plugin non definito',
161
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; mancante nel file di definizione',
162
+    'erreur_plugin_version_manquant' => 'Versione del plugin mancante',
163
+    'erreur_type_fichier' => 'Tipo di file non corretto',
164 164
 
165
-	// H
166
-	'htaccess_a_simuler' => 'Attenzione: la configurazione del tuo HTTP server ignora il file @htaccess@. Per garantire un buon livello di sicurezza devi modificare la configurazione del server per questa impostazione, oppure devi assicurarti che la costante @constantes@ (definibile nel file mes_options.php) sia valorizzata con una perocorso di directory posta al di fuori di @document_root@.',
167
-	'htaccess_inoperant' => 'htaccess non attivo',
165
+    // H
166
+    'htaccess_a_simuler' => 'Attenzione: la configurazione del tuo HTTP server ignora il file @htaccess@. Per garantire un buon livello di sicurezza devi modificare la configurazione del server per questa impostazione, oppure devi assicurarti che la costante @constantes@ (definibile nel file mes_options.php) sia valorizzata con una perocorso di directory posta al di fuori di @document_root@.',
167
+    'htaccess_inoperant' => 'htaccess non attivo',
168 168
 
169
-	// I
170
-	'ical_info1' => 'Questa pagina elenca diversi metodi per rimanere in contatto con le varie attività del sito.',
171
-	'ical_info2' => 'Per ulteriori informazioni su tutte queste tecniche, non esitate a consultare <a href="@spipnet@">la documentazione di SPIP</a>.',
172
-	'ical_info_calendrier' => 'Sono disponibili due calendari. Il primo è una mappa del sito che annuncia tutti gli articoli pubblicati. Il secondo contiene gli annunci editoriali e gli ultimi messaggi privati: è un’area riservata, mediante identificativo personale, che è possibile modificare in qualsiasi momento rinnovando la password personale.',
173
-	'ical_methode_http' => 'Download',
174
-	'ical_methode_webcal' => 'Sincronizzazione (webcal://)',
175
-	'ical_texte_js' => 'Una linea in javascript permette di visualizzare, con molta semplicità e su qualsiasi tipo di sito, gli articoli recenti pubblicati su questo sito.',
176
-	'ical_texte_prive' => 'Questo calendario, ad uso strettamente privato, dà informazioni sull’attività redazionale privata di questo sito (impegni e appuntamenti personali, articoli e brevi proposti...).',
177
-	'ical_texte_public' => 'Questo calendario permette di monitorare l’attività pubblica del sito (articoli e brevi pubblicati).',
178
-	'ical_texte_rss' => 'È possibile mettere in syndication le novità di questo sito con qualsiasi lettore di file in formato XML/RSS (Rich Site Summary). Questo è il medesimo formato che permette a SPIP di leggere le novità pubblicate su altri siti che utilizzano un formato di scambio compatibile.',
179
-	'ical_titre_js' => 'Javascript',
180
-	'ical_titre_mailing' => 'Mailing-list',
181
-	'ical_titre_rss' => 'File di syndication',
182
-	'icone_accueil' => 'Pannello di controllo',
183
-	'icone_activer_cookie' => 'Attiva il cookie di corrispondenza',
184
-	'icone_activite' => 'Attività',
185
-	'icone_admin_plugin' => 'Gestione dei plugin',
186
-	'icone_administration' => 'Manutenzione',
187
-	'icone_afficher_auteurs' => 'Pubblica gli autori',
188
-	'icone_afficher_visiteurs' => 'Pubblica i visitatori',
189
-	'icone_arret_discussion' => 'Non partecipare più a questa discussione',
190
-	'icone_calendrier' => 'Calendario',
191
-	'icone_configuration' => 'Configurazione',
192
-	'icone_creer_auteur' => 'Crea un nuovo autore ed associalo a questo articolo',
193
-	'icone_creer_mot_cle' => 'Crea una nuova parola chiave e collegala a questo articolo',
194
-	'icone_creer_rubrique_2' => 'Crea una nuova rubrica',
195
-	'icone_developpement' => 'Sviluppo',
196
-	'icone_edition' => 'Modifica',
197
-	'icone_ma_langue' => 'La mia lingua',
198
-	'icone_mes_infos' => 'Le mie informazioni',
199
-	'icone_mes_preferences' => 'Le mie preferenze',
200
-	'icone_modifier_article' => 'Modifica l’articolo',
201
-	'icone_modifier_rubrique' => 'Modifica la rubrica',
202
-	'icone_publication' => 'Pubblicazione',
203
-	'icone_relancer_signataire' => 'Rilanciare il firmatario',
204
-	'icone_retour' => 'Indietro',
205
-	'icone_retour_article' => 'Torna all’articolo',
206
-	'icone_squelette' => 'Modelli',
207
-	'icone_suivi_publication' => 'Segui la pubblicazione',
208
-	'icone_supprimer_cookie' => 'Elimina il cookie di corrispondenza',
209
-	'icone_supprimer_rubrique' => 'Elimina la rubrica',
210
-	'icone_supprimer_signature' => 'Cancella l’adesione',
211
-	'icone_valider_signature' => 'Conferma l’adesione',
212
-	'image_administrer_rubrique' => 'Puoi amministrare questa rubrica',
213
-	'impossible_modifier_login_auteur' => 'Impossibile modificare le credenziali d’accesso',
214
-	'impossible_modifier_pass_auteur' => 'Impossibile modificare la password.', # Impossibile modificare la password
215
-	'info_1_article' => '1 articolo',
216
-	'info_1_auteur' => '1 autore',
217
-	'info_1_message' => '1 messaggio',
218
-	'info_1_mot_cle' => '1 parola chiave',
219
-	'info_1_rubrique' => '1 rubrica',
220
-	'info_1_visiteur' => '1 visitatore',
221
-	'info_activer_cookie' => 'Se vuoi puoi attivare un <b>cookie di corrispondenza</b>, che ti permetterà
169
+    // I
170
+    'ical_info1' => 'Questa pagina elenca diversi metodi per rimanere in contatto con le varie attività del sito.',
171
+    'ical_info2' => 'Per ulteriori informazioni su tutte queste tecniche, non esitate a consultare <a href="@spipnet@">la documentazione di SPIP</a>.',
172
+    'ical_info_calendrier' => 'Sono disponibili due calendari. Il primo è una mappa del sito che annuncia tutti gli articoli pubblicati. Il secondo contiene gli annunci editoriali e gli ultimi messaggi privati: è un’area riservata, mediante identificativo personale, che è possibile modificare in qualsiasi momento rinnovando la password personale.',
173
+    'ical_methode_http' => 'Download',
174
+    'ical_methode_webcal' => 'Sincronizzazione (webcal://)',
175
+    'ical_texte_js' => 'Una linea in javascript permette di visualizzare, con molta semplicità e su qualsiasi tipo di sito, gli articoli recenti pubblicati su questo sito.',
176
+    'ical_texte_prive' => 'Questo calendario, ad uso strettamente privato, dà informazioni sull’attività redazionale privata di questo sito (impegni e appuntamenti personali, articoli e brevi proposti...).',
177
+    'ical_texte_public' => 'Questo calendario permette di monitorare l’attività pubblica del sito (articoli e brevi pubblicati).',
178
+    'ical_texte_rss' => 'È possibile mettere in syndication le novità di questo sito con qualsiasi lettore di file in formato XML/RSS (Rich Site Summary). Questo è il medesimo formato che permette a SPIP di leggere le novità pubblicate su altri siti che utilizzano un formato di scambio compatibile.',
179
+    'ical_titre_js' => 'Javascript',
180
+    'ical_titre_mailing' => 'Mailing-list',
181
+    'ical_titre_rss' => 'File di syndication',
182
+    'icone_accueil' => 'Pannello di controllo',
183
+    'icone_activer_cookie' => 'Attiva il cookie di corrispondenza',
184
+    'icone_activite' => 'Attività',
185
+    'icone_admin_plugin' => 'Gestione dei plugin',
186
+    'icone_administration' => 'Manutenzione',
187
+    'icone_afficher_auteurs' => 'Pubblica gli autori',
188
+    'icone_afficher_visiteurs' => 'Pubblica i visitatori',
189
+    'icone_arret_discussion' => 'Non partecipare più a questa discussione',
190
+    'icone_calendrier' => 'Calendario',
191
+    'icone_configuration' => 'Configurazione',
192
+    'icone_creer_auteur' => 'Crea un nuovo autore ed associalo a questo articolo',
193
+    'icone_creer_mot_cle' => 'Crea una nuova parola chiave e collegala a questo articolo',
194
+    'icone_creer_rubrique_2' => 'Crea una nuova rubrica',
195
+    'icone_developpement' => 'Sviluppo',
196
+    'icone_edition' => 'Modifica',
197
+    'icone_ma_langue' => 'La mia lingua',
198
+    'icone_mes_infos' => 'Le mie informazioni',
199
+    'icone_mes_preferences' => 'Le mie preferenze',
200
+    'icone_modifier_article' => 'Modifica l’articolo',
201
+    'icone_modifier_rubrique' => 'Modifica la rubrica',
202
+    'icone_publication' => 'Pubblicazione',
203
+    'icone_relancer_signataire' => 'Rilanciare il firmatario',
204
+    'icone_retour' => 'Indietro',
205
+    'icone_retour_article' => 'Torna all’articolo',
206
+    'icone_squelette' => 'Modelli',
207
+    'icone_suivi_publication' => 'Segui la pubblicazione',
208
+    'icone_supprimer_cookie' => 'Elimina il cookie di corrispondenza',
209
+    'icone_supprimer_rubrique' => 'Elimina la rubrica',
210
+    'icone_supprimer_signature' => 'Cancella l’adesione',
211
+    'icone_valider_signature' => 'Conferma l’adesione',
212
+    'image_administrer_rubrique' => 'Puoi amministrare questa rubrica',
213
+    'impossible_modifier_login_auteur' => 'Impossibile modificare le credenziali d’accesso',
214
+    'impossible_modifier_pass_auteur' => 'Impossibile modificare la password.', # Impossibile modificare la password
215
+    'info_1_article' => '1 articolo',
216
+    'info_1_auteur' => '1 autore',
217
+    'info_1_message' => '1 messaggio',
218
+    'info_1_mot_cle' => '1 parola chiave',
219
+    'info_1_rubrique' => '1 rubrica',
220
+    'info_1_visiteur' => '1 visitatore',
221
+    'info_activer_cookie' => 'Se vuoi puoi attivare un <b>cookie di corrispondenza</b>, che ti permetterà
222 222
 di passare facilmente dal sito pubblico all’interfaccia privata.',
223
-	'info_activer_menu_developpement' => 'Mostra il menù Sviluppo',
224
-	'info_admin_etre_webmestre' => 'Concedimi i privilegi di webmaster',
225
-	'info_admin_je_suis_webmestre' => 'Sono <b>webmaster</b>',
226
-	'info_admin_statuer_webmestre' => 'Dai a questo amministratore i privilegi di webmaster',
227
-	'info_admin_webmestre' => 'Questo amministratore è un <b>webmaster</b>',
228
-	'info_administrateur' => 'Amministratore',
229
-	'info_administrateur_1' => 'Amministratore',
230
-	'info_administrateur_2' => 'del sito (<i>da utilizzare con prudenza</i>)',
231
-	'info_administrateur_site_01' => 'Se sei amministratore del sito,',
232
-	'info_administrateur_site_02' => 'clicca qui',
233
-	'info_administrateurs' => 'Amministratori',
234
-	'info_administrer_rubrique' => 'Puoi amministrare questa rubrica',
235
-	'info_adresse' => 'all’indirizzo:',
236
-	'info_adresse_desinscription' => 'Indirizzo per la cancellazione :',
237
-	'info_adresse_url' => 'Indirizzo (URL) del sito pubblico',
238
-	'info_afficher_par_nb' => 'Mostra',
239
-	'info_aide_en_ligne' => 'Guida in linea SPIP',
240
-	'info_ajout_image' => 'Quando aggiungi delle immagini come documenti allegati ad un articolo,
223
+    'info_activer_menu_developpement' => 'Mostra il menù Sviluppo',
224
+    'info_admin_etre_webmestre' => 'Concedimi i privilegi di webmaster',
225
+    'info_admin_je_suis_webmestre' => 'Sono <b>webmaster</b>',
226
+    'info_admin_statuer_webmestre' => 'Dai a questo amministratore i privilegi di webmaster',
227
+    'info_admin_webmestre' => 'Questo amministratore è un <b>webmaster</b>',
228
+    'info_administrateur' => 'Amministratore',
229
+    'info_administrateur_1' => 'Amministratore',
230
+    'info_administrateur_2' => 'del sito (<i>da utilizzare con prudenza</i>)',
231
+    'info_administrateur_site_01' => 'Se sei amministratore del sito,',
232
+    'info_administrateur_site_02' => 'clicca qui',
233
+    'info_administrateurs' => 'Amministratori',
234
+    'info_administrer_rubrique' => 'Puoi amministrare questa rubrica',
235
+    'info_adresse' => 'all’indirizzo:',
236
+    'info_adresse_desinscription' => 'Indirizzo per la cancellazione :',
237
+    'info_adresse_url' => 'Indirizzo (URL) del sito pubblico',
238
+    'info_afficher_par_nb' => 'Mostra',
239
+    'info_aide_en_ligne' => 'Guida in linea SPIP',
240
+    'info_ajout_image' => 'Quando aggiungi delle immagini come documenti allegati ad un articolo,
241 241
 SPIP può creare delle thumbnail (miniature) delle
242 242
 immagini inserite. Ciò permette ad esempio di creare in automatico una galleria di immagini o un portfolio.',
243
-	'info_ajouter_rubrique' => 'Aggiungi un’altra rubrica da amministrare:',
244
-	'info_annonce_nouveautes' => 'Annuncio delle novità',
245
-	'info_article' => 'articolo',
246
-	'info_article_2' => 'articoli',
247
-	'info_article_a_paraitre' => 'Gli articoli postdatati da pubblicare',
248
-	'info_articles_02' => 'articoli',
249
-	'info_articles_2' => 'Articoli',
250
-	'info_articles_auteur' => 'Articoli di questo autore',
251
-	'info_articles_miens' => 'I miei articoli',
252
-	'info_articles_tous' => 'Tutti gli articoli',
253
-	'info_articles_trouves' => 'Articoli trovati',
254
-	'info_attente_validation' => 'I tuoi articoli in attesa di convalida',
255
-	'info_aucun_article' => 'Nessun articolo',
256
-	'info_aucun_auteur' => 'Nessun autore',
257
-	'info_aucun_message' => 'Nessun messaggio',
258
-	'info_aucun_rubrique' => 'Nessuna rubrica',
259
-	'info_aujourdhui' => 'oggi: ',
260
-	'info_auteur_gere_rubriques' => 'Questo autore gestisce le rubriche seguenti:',
261
-	'info_auteur_gere_toutes_rubriques' => 'Questo autore gestisce <b>tutte le rubriche</b>',
262
-	'info_auteur_gere_toutes_rubriques_2' => 'Io modifico <b>tutte le rubriche</b>',
263
-	'info_auteurs' => 'Gli autori',
264
-	'info_auteurs_par_tri' => 'Autori@partri@',
265
-	'info_auteurs_trouves' => 'Autori trovati',
266
-	'info_authentification_externe' => 'Autenticazione esterna',
267
-	'info_avertissement' => 'Avvertimento',
268
-	'info_barre_outils' => 'con la barra degli strumenti?',
269
-	'info_base_installee' => 'La struttura del vostro database è installata.',
270
-	'info_bio' => 'Biografia',
271
-	'info_cache_desactive' => 'La cache è temporaneamente disattivata',
272
-	'info_chapeau' => 'Introduzione',
273
-	'info_chapeau_2' => 'Introduzione:',
274
-	'info_chemin_acces_1' => 'Opzioni: <b>Percorso d’accesso ai dati nell’elenco</b>',
275
-	'info_chemin_acces_2' => 'È necessario specificare il  percorso per accedere ai dati nell’elenco. Questa informazione è indispensabile al fine di leggere i profili utente in esso contenuti.',
276
-	'info_chemin_acces_annuaire' => 'Opzioni: <b>Percorso d’accesso ai dati nell’elenco</b>',
277
-	'info_choix_base' => 'Terza fase: ',
278
-	'info_classement_1' => '<sup>o</sup> su @liste@',
279
-	'info_classement_2' => '<sup>o</sup> su @liste@',
280
-	'info_code_acces' => 'Non dimenticare i tuoi codici d’accesso!',
281
-	'info_config_suivi' => 'Se questo indirizzo corrisponde a una mailing-list, è possibile indicare qui sotto l’indirizzo al quale i partecipanti del sito possono iscriversi. Questo indirizzo può essere una URL (per esempio la pagina di iscrizione via Web alla lista), oppure un indirizzo email che contiene un Oggetto specifico (per esempio: <tt>@adresse_suivi@?subject=subscribe</tt>):',
282
-	'info_config_suivi_explication' => 'È possibile abbonarsi alla mailing-list di questo sito. Verranno spedite per email le notifiche degli articoli e delle brevi proposte per la pubblicazione.',
283
-	'info_confirmer_passe' => 'Conferma la nuova password:',
284
-	'info_conflit_edition_avis_non_sauvegarde' => 'Attenzione, i campi seguenti sono già stati modificati. Quindi le vostre modifiche su questi campi non sono state registrate.',
285
-	'info_conflit_edition_differences' => 'Differenze:',
286
-	'info_conflit_edition_version_enregistree' => 'La versione registrata:',
287
-	'info_conflit_edition_votre_version' => 'La tua versione:',
288
-	'info_connexion_base' => 'Prova di connessione al database',
289
-	'info_connexion_base_donnee' => 'Connessione al proprio database',
290
-	'info_connexion_ldap_ok' => '<b>La connessione LDAP è riuscita.</b><p> È possibile passare alla fase successiva.</p>',
291
-	'info_connexion_mysql' => 'La connessione a SQL',
292
-	'info_connexion_ok' => 'La connessione è riuscita.',
293
-	'info_contact' => 'Contatti',
294
-	'info_contenu_articles' => 'Contentuto degli articoli',
295
-	'info_contributions' => 'Contributi',
296
-	'info_creation_paragraphe' => 'Per creare dei paragrafi indipendenti, lasciare fra loro delle righe vuote.',
297
-	'info_creation_rubrique' => 'Prima di poter scrivere degli articoli, <br />devi creare almeno una rubrica.<br />',
298
-	'info_creation_tables' => 'Creazione delle tabelle nel database',
299
-	'info_creer_base' => '<b>Creare</b> un nuovo database:',
300
-	'info_dans_rubrique' => 'Nella rubrica:',
301
-	'info_date_publication_anterieure' => 'Data di redazione anteriore:',
302
-	'info_date_referencement' => 'DATA DI INSERIMENTO IN REPERTORIO DI QUESTO SITO:',
303
-	'info_derniere_etape' => 'Finito!',
304
-	'info_descriptif' => 'Descrizione:',
305
-	'info_desinstaller_plugin' => 'elimina i dati e disattiva il plug-in',
306
-	'info_discussion_cours' => 'Discussioni in corso',
307
-	'info_ecrire_article' => 'Prima di poter scrivere degli articoli, devi creare almeno una rubrica.',
308
-	'info_email_envoi' => 'Indirizzo email del mittente (opzionale)',
309
-	'info_email_envoi_txt' => 'Indicare qui l’indirizzo da utilizzare per l’invio degli email (come impostazione predefinita l’indirizzo del destinatario sarà utilizzato come indirizzo del mittente):',
310
-	'info_email_webmestre' => 'Indirizzo email del webmaster',
311
-	'info_envoi_email_automatique' => 'Invio di email automatico',
312
-	'info_envoyer_maintenant' => 'Invia adesso',
313
-	'info_etape_suivante' => 'Passare alla fase successiva',
314
-	'info_etape_suivante_1' => 'Puoi passare alla fase successiva.',
315
-	'info_etape_suivante_2' => 'Puoi passare alla fase successiva.',
316
-	'info_exceptions_proxy' => 'Eccezioni per il proxy',
317
-	'info_exportation_base' => 'esportazione del database verso @archive@',
318
-	'info_facilite_suivi_activite' => 'Al fine di facilitare il monitoraggio dell’attività editoriale del sito, SPIP può far pervenire via email, per esempio ad una mailing-list dei redattori, l’annuncio delle domande di pubblicazione e di convalida degli articoli.
243
+    'info_ajouter_rubrique' => 'Aggiungi un’altra rubrica da amministrare:',
244
+    'info_annonce_nouveautes' => 'Annuncio delle novità',
245
+    'info_article' => 'articolo',
246
+    'info_article_2' => 'articoli',
247
+    'info_article_a_paraitre' => 'Gli articoli postdatati da pubblicare',
248
+    'info_articles_02' => 'articoli',
249
+    'info_articles_2' => 'Articoli',
250
+    'info_articles_auteur' => 'Articoli di questo autore',
251
+    'info_articles_miens' => 'I miei articoli',
252
+    'info_articles_tous' => 'Tutti gli articoli',
253
+    'info_articles_trouves' => 'Articoli trovati',
254
+    'info_attente_validation' => 'I tuoi articoli in attesa di convalida',
255
+    'info_aucun_article' => 'Nessun articolo',
256
+    'info_aucun_auteur' => 'Nessun autore',
257
+    'info_aucun_message' => 'Nessun messaggio',
258
+    'info_aucun_rubrique' => 'Nessuna rubrica',
259
+    'info_aujourdhui' => 'oggi: ',
260
+    'info_auteur_gere_rubriques' => 'Questo autore gestisce le rubriche seguenti:',
261
+    'info_auteur_gere_toutes_rubriques' => 'Questo autore gestisce <b>tutte le rubriche</b>',
262
+    'info_auteur_gere_toutes_rubriques_2' => 'Io modifico <b>tutte le rubriche</b>',
263
+    'info_auteurs' => 'Gli autori',
264
+    'info_auteurs_par_tri' => 'Autori@partri@',
265
+    'info_auteurs_trouves' => 'Autori trovati',
266
+    'info_authentification_externe' => 'Autenticazione esterna',
267
+    'info_avertissement' => 'Avvertimento',
268
+    'info_barre_outils' => 'con la barra degli strumenti?',
269
+    'info_base_installee' => 'La struttura del vostro database è installata.',
270
+    'info_bio' => 'Biografia',
271
+    'info_cache_desactive' => 'La cache è temporaneamente disattivata',
272
+    'info_chapeau' => 'Introduzione',
273
+    'info_chapeau_2' => 'Introduzione:',
274
+    'info_chemin_acces_1' => 'Opzioni: <b>Percorso d’accesso ai dati nell’elenco</b>',
275
+    'info_chemin_acces_2' => 'È necessario specificare il  percorso per accedere ai dati nell’elenco. Questa informazione è indispensabile al fine di leggere i profili utente in esso contenuti.',
276
+    'info_chemin_acces_annuaire' => 'Opzioni: <b>Percorso d’accesso ai dati nell’elenco</b>',
277
+    'info_choix_base' => 'Terza fase: ',
278
+    'info_classement_1' => '<sup>o</sup> su @liste@',
279
+    'info_classement_2' => '<sup>o</sup> su @liste@',
280
+    'info_code_acces' => 'Non dimenticare i tuoi codici d’accesso!',
281
+    'info_config_suivi' => 'Se questo indirizzo corrisponde a una mailing-list, è possibile indicare qui sotto l’indirizzo al quale i partecipanti del sito possono iscriversi. Questo indirizzo può essere una URL (per esempio la pagina di iscrizione via Web alla lista), oppure un indirizzo email che contiene un Oggetto specifico (per esempio: <tt>@adresse_suivi@?subject=subscribe</tt>):',
282
+    'info_config_suivi_explication' => 'È possibile abbonarsi alla mailing-list di questo sito. Verranno spedite per email le notifiche degli articoli e delle brevi proposte per la pubblicazione.',
283
+    'info_confirmer_passe' => 'Conferma la nuova password:',
284
+    'info_conflit_edition_avis_non_sauvegarde' => 'Attenzione, i campi seguenti sono già stati modificati. Quindi le vostre modifiche su questi campi non sono state registrate.',
285
+    'info_conflit_edition_differences' => 'Differenze:',
286
+    'info_conflit_edition_version_enregistree' => 'La versione registrata:',
287
+    'info_conflit_edition_votre_version' => 'La tua versione:',
288
+    'info_connexion_base' => 'Prova di connessione al database',
289
+    'info_connexion_base_donnee' => 'Connessione al proprio database',
290
+    'info_connexion_ldap_ok' => '<b>La connessione LDAP è riuscita.</b><p> È possibile passare alla fase successiva.</p>',
291
+    'info_connexion_mysql' => 'La connessione a SQL',
292
+    'info_connexion_ok' => 'La connessione è riuscita.',
293
+    'info_contact' => 'Contatti',
294
+    'info_contenu_articles' => 'Contentuto degli articoli',
295
+    'info_contributions' => 'Contributi',
296
+    'info_creation_paragraphe' => 'Per creare dei paragrafi indipendenti, lasciare fra loro delle righe vuote.',
297
+    'info_creation_rubrique' => 'Prima di poter scrivere degli articoli, <br />devi creare almeno una rubrica.<br />',
298
+    'info_creation_tables' => 'Creazione delle tabelle nel database',
299
+    'info_creer_base' => '<b>Creare</b> un nuovo database:',
300
+    'info_dans_rubrique' => 'Nella rubrica:',
301
+    'info_date_publication_anterieure' => 'Data di redazione anteriore:',
302
+    'info_date_referencement' => 'DATA DI INSERIMENTO IN REPERTORIO DI QUESTO SITO:',
303
+    'info_derniere_etape' => 'Finito!',
304
+    'info_descriptif' => 'Descrizione:',
305
+    'info_desinstaller_plugin' => 'elimina i dati e disattiva il plug-in',
306
+    'info_discussion_cours' => 'Discussioni in corso',
307
+    'info_ecrire_article' => 'Prima di poter scrivere degli articoli, devi creare almeno una rubrica.',
308
+    'info_email_envoi' => 'Indirizzo email del mittente (opzionale)',
309
+    'info_email_envoi_txt' => 'Indicare qui l’indirizzo da utilizzare per l’invio degli email (come impostazione predefinita l’indirizzo del destinatario sarà utilizzato come indirizzo del mittente):',
310
+    'info_email_webmestre' => 'Indirizzo email del webmaster',
311
+    'info_envoi_email_automatique' => 'Invio di email automatico',
312
+    'info_envoyer_maintenant' => 'Invia adesso',
313
+    'info_etape_suivante' => 'Passare alla fase successiva',
314
+    'info_etape_suivante_1' => 'Puoi passare alla fase successiva.',
315
+    'info_etape_suivante_2' => 'Puoi passare alla fase successiva.',
316
+    'info_exceptions_proxy' => 'Eccezioni per il proxy',
317
+    'info_exportation_base' => 'esportazione del database verso @archive@',
318
+    'info_facilite_suivi_activite' => 'Al fine di facilitare il monitoraggio dell’attività editoriale del sito, SPIP può far pervenire via email, per esempio ad una mailing-list dei redattori, l’annuncio delle domande di pubblicazione e di convalida degli articoli.
319 319
 Indicare uno o più indirizzi, separati da virgole.',
320
-	'info_fichiers_authent' => 'File d’autenticazione ".htpasswd"',
321
-	'info_forums_abo_invites' => 'Il sito comprende dei forum accessibili solo a utenti registrati. Nel sito pubblico è quindi presente una pagina d’iscrizione.',
322
-	'info_gauche_admin_tech' => '<b>Questa pagina è accessibile solo ai responsabili del sito.</b><p> Permette l’accesso alle diverse funzioni
320
+    'info_fichiers_authent' => 'File d’autenticazione ".htpasswd"',
321
+    'info_forums_abo_invites' => 'Il sito comprende dei forum accessibili solo a utenti registrati. Nel sito pubblico è quindi presente una pagina d’iscrizione.',
322
+    'info_gauche_admin_tech' => '<b>Questa pagina è accessibile solo ai responsabili del sito.</b><p> Permette l’accesso alle diverse funzioni
323 323
  di manutenzione tecnica. Alcune di esse richiedono una specifica procedura di identificazione, 
324 324
 eseguibile grazie a un accesso FTP.</p>',
325
-	'info_gauche_admin_vider' => '<b>Questa pagina è accessibile solo ai responsabili del sito.</b><p> Permette l’accesso alle diverse funzioni di manutenzione tecnica.
325
+    'info_gauche_admin_vider' => '<b>Questa pagina è accessibile solo ai responsabili del sito.</b><p> Permette l’accesso alle diverse funzioni di manutenzione tecnica.
326 326
  Alcune di esse richiedono una specifica procedura di identificazione, eseguibile grazie ad un accesso FTP.</p>',
327
-	'info_gauche_auteurs' => 'Elenco di tutti gli autori del sito.
327
+    'info_gauche_auteurs' => 'Elenco di tutti gli autori del sito.
328 328
 Il loro status è indicato dal colore dell’icona (redattore = giallo; amministratore = verde).',
329
-	'info_gauche_auteurs_exterieurs' => 'Gli autori esterni, senza accesso al sito, sono indicati da un’icona blu;
329
+    'info_gauche_auteurs_exterieurs' => 'Gli autori esterni, senza accesso al sito, sono indicati da un’icona blu;
330 330
 gli autori eliminati da un’icona grigia.',
331
-	'info_gauche_messagerie' => 'Il sistema di messaggistica permette di scambiare dei messaggi tra redattori, di conservare dei memo (promemoria ad uso personale) o di pubblicare degli annunci nel pannello di controllo dell’area riservata (se sei amministratore).',
332
-	'info_gauche_statistiques_referers' => 'Questa pagina presenta un elenco dei siti che contengono link verso il tuo (<i>referrer</i>). Questo elenco è valido però solo per oggi essendo azzerato ogni 24 ore.',
333
-	'info_gauche_visiteurs_enregistres' => 'Trovi qui i visitatori registrati allo spazio
331
+    'info_gauche_messagerie' => 'Il sistema di messaggistica permette di scambiare dei messaggi tra redattori, di conservare dei memo (promemoria ad uso personale) o di pubblicare degli annunci nel pannello di controllo dell’area riservata (se sei amministratore).',
332
+    'info_gauche_statistiques_referers' => 'Questa pagina presenta un elenco dei siti che contengono link verso il tuo (<i>referrer</i>). Questo elenco è valido però solo per oggi essendo azzerato ogni 24 ore.',
333
+    'info_gauche_visiteurs_enregistres' => 'Trovi qui i visitatori registrati allo spazio
334 334
 pubblico del sito (forum su abbonamento).',
335
-	'info_generation_miniatures_images' => 'Generazione di thumbnail di immagini',
336
-	'info_gerer_trad_objets' => '@objets@ : gestire i collegamenti alle traduzioni',
337
-	'info_hebergeur_desactiver_envoi_email' => 'Alcuni hoster disattivano  l’invio automatico di email
335
+    'info_generation_miniatures_images' => 'Generazione di thumbnail di immagini',
336
+    'info_gerer_trad_objets' => '@objets@ : gestire i collegamenti alle traduzioni',
337
+    'info_hebergeur_desactiver_envoi_email' => 'Alcuni hoster disattivano  l’invio automatico di email
338 338
 dai loro server. In questo caso, le funzionalità di SPIP di seguito riportate non funzioneranno.',
339
-	'info_hier' => 'ieri:',
340
-	'info_identification_publique' => 'La tua identità pubblica...',
341
-	'info_image_process' => 'Seleziona il metodo migliore per la creazione delle anteprime cliccando sull’immagine corrispondente.',
342
-	'info_image_process2' => 'Se non appare alcuna immagine, significa che la configurazione del server non permette l’uso di alcune funzioni grafiche. Se si desidera utilizzarle, rivolgersi al responsabile tecnico chiedendo di installare le estensioni «GD» o «Imagick».',
343
-	'info_images_auto' => 'Immagini elaborate automaticamente',
344
-	'info_informations_personnelles' => 'Informazioni personali',
345
-	'info_inscription' => 'Iscritto il',
346
-	'info_inscription_automatique' => 'Iscrizione automatica di nuovi redattori',
347
-	'info_jeu_caractere' => 'Set di caratteri del sito',
348
-	'info_jours' => 'giorni',
349
-	'info_laisser_champs_vides' => 'lasciare questi campi vuoti)',
350
-	'info_langues' => 'Lingua del sito',
351
-	'info_ldap_ok' => 'L’autenticazione LDAP è installata.',
352
-	'info_lien_hypertexte' => 'Link ipertestuale:',
353
-	'info_liste_nouveautes_envoyee' => 'La lista delle novità è stata inviata',
354
-	'info_liste_redacteurs_connectes' => 'Elenco dei redattori collegati',
355
-	'info_login_existant' => 'Questo login esiste già.',
356
-	'info_login_trop_court' => 'Login troppo corto.',
357
-	'info_login_trop_court_car_pluriel' => 'La login deve contenere almeno @nb@ caratteri.',
358
-	'info_logos' => 'I logo',
359
-	'info_maximum' => 'massimo:',
360
-	'info_meme_rubrique' => 'Nella stessa rubrica',
361
-	'info_message_en_redaction' => 'I tuoi messaggi in corso di redazione',
362
-	'info_message_technique' => 'Messaggio tecnico:',
363
-	'info_messagerie_interne' => 'Sistema di messaggistica interna',
364
-	'info_mise_a_niveau_base' => 'aggiornamento del database SQL',
365
-	'info_mise_a_niveau_base_2' => '{{Attenzione!}} È stata installata una versione
339
+    'info_hier' => 'ieri:',
340
+    'info_identification_publique' => 'La tua identità pubblica...',
341
+    'info_image_process' => 'Seleziona il metodo migliore per la creazione delle anteprime cliccando sull’immagine corrispondente.',
342
+    'info_image_process2' => 'Se non appare alcuna immagine, significa che la configurazione del server non permette l’uso di alcune funzioni grafiche. Se si desidera utilizzarle, rivolgersi al responsabile tecnico chiedendo di installare le estensioni «GD» o «Imagick».',
343
+    'info_images_auto' => 'Immagini elaborate automaticamente',
344
+    'info_informations_personnelles' => 'Informazioni personali',
345
+    'info_inscription' => 'Iscritto il',
346
+    'info_inscription_automatique' => 'Iscrizione automatica di nuovi redattori',
347
+    'info_jeu_caractere' => 'Set di caratteri del sito',
348
+    'info_jours' => 'giorni',
349
+    'info_laisser_champs_vides' => 'lasciare questi campi vuoti)',
350
+    'info_langues' => 'Lingua del sito',
351
+    'info_ldap_ok' => 'L’autenticazione LDAP è installata.',
352
+    'info_lien_hypertexte' => 'Link ipertestuale:',
353
+    'info_liste_nouveautes_envoyee' => 'La lista delle novità è stata inviata',
354
+    'info_liste_redacteurs_connectes' => 'Elenco dei redattori collegati',
355
+    'info_login_existant' => 'Questo login esiste già.',
356
+    'info_login_trop_court' => 'Login troppo corto.',
357
+    'info_login_trop_court_car_pluriel' => 'La login deve contenere almeno @nb@ caratteri.',
358
+    'info_logos' => 'I logo',
359
+    'info_maximum' => 'massimo:',
360
+    'info_meme_rubrique' => 'Nella stessa rubrica',
361
+    'info_message_en_redaction' => 'I tuoi messaggi in corso di redazione',
362
+    'info_message_technique' => 'Messaggio tecnico:',
363
+    'info_messagerie_interne' => 'Sistema di messaggistica interna',
364
+    'info_mise_a_niveau_base' => 'aggiornamento del database SQL',
365
+    'info_mise_a_niveau_base_2' => '{{Attenzione!}} È stata installata una versione
366 366
 dei file di SPIP {precedente} rispetto a quella che era in uso per questo sito:
367 367
 le informazioni contenute nel database sono probabilmente andate perse.<br />{{Reinstallare i file di SPIP.}}',
368
-	'info_modification_enregistree' => 'Le modifiche sono state salvate',
369
-	'info_modifier_auteur' => 'Modifica l’autore:',
370
-	'info_modifier_rubrique' => 'Modifica la rubrica:',
371
-	'info_modifier_titre' => 'Modifica: @titre@',
372
-	'info_mon_site_spip' => 'Il mio sito SPIP',
373
-	'info_moyenne' => 'media: ',
374
-	'info_multi_cet_article' => 'Lingua di questo articolo:',
375
-	'info_multi_langues_choisies' => 'Selezionare di seguito le lingue disponibili per i redattori del sito.
368
+    'info_modification_enregistree' => 'Le modifiche sono state salvate',
369
+    'info_modifier_auteur' => 'Modifica l’autore:',
370
+    'info_modifier_rubrique' => 'Modifica la rubrica:',
371
+    'info_modifier_titre' => 'Modifica: @titre@',
372
+    'info_mon_site_spip' => 'Il mio sito SPIP',
373
+    'info_moyenne' => 'media: ',
374
+    'info_multi_cet_article' => 'Lingua di questo articolo:',
375
+    'info_multi_langues_choisies' => 'Selezionare di seguito le lingue disponibili per i redattori del sito.
376 376
   Le lingue già utilizzate nel sito (visualizzate per prime) non possono essere disattivate.',
377
-	'info_multi_objets' => '@objets@ : attiva il menù delle lingue',
378
-	'info_multi_secteurs' => '... solo per le rubriche collocate nella {root} del sito?',
379
-	'info_nb_articles' => '@nb@ articoli',
380
-	'info_nb_auteurs' => '@nb@ autori',
381
-	'info_nb_messages' => '@nb@ messaggi',
382
-	'info_nb_mots_cles' => '@nb@ parole chiave',
383
-	'info_nb_rubriques' => '@nb@ rubriche',
384
-	'info_nb_visiteurs' => '@nb@ visitatori',
385
-	'info_nom' => 'Nome',
386
-	'info_nom_destinataire' => 'Nome del destinatario',
387
-	'info_nom_pas_conforme' => 'I tag html non sono consentiti',
388
-	'info_nom_site' => 'Nome del tuo sito',
389
-	'info_nombre_articles' => '@nb_articles@ articoli,',
390
-	'info_nombre_rubriques' => '@nb_rubriques@ rubriche,',
391
-	'info_nombre_sites' => '@nb_sites@ siti, ',
392
-	'info_non_deplacer' => 'Non spostare...',
393
-	'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP può inviare regolarmente annunci sulle ultime novità del sito
377
+    'info_multi_objets' => '@objets@ : attiva il menù delle lingue',
378
+    'info_multi_secteurs' => '... solo per le rubriche collocate nella {root} del sito?',
379
+    'info_nb_articles' => '@nb@ articoli',
380
+    'info_nb_auteurs' => '@nb@ autori',
381
+    'info_nb_messages' => '@nb@ messaggi',
382
+    'info_nb_mots_cles' => '@nb@ parole chiave',
383
+    'info_nb_rubriques' => '@nb@ rubriche',
384
+    'info_nb_visiteurs' => '@nb@ visitatori',
385
+    'info_nom' => 'Nome',
386
+    'info_nom_destinataire' => 'Nome del destinatario',
387
+    'info_nom_pas_conforme' => 'I tag html non sono consentiti',
388
+    'info_nom_site' => 'Nome del tuo sito',
389
+    'info_nombre_articles' => '@nb_articles@ articoli,',
390
+    'info_nombre_rubriques' => '@nb_rubriques@ rubriche,',
391
+    'info_nombre_sites' => '@nb_sites@ siti, ',
392
+    'info_non_deplacer' => 'Non spostare...',
393
+    'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP può inviare regolarmente annunci sulle ultime novità del sito
394 394
 (articoli e brevi recentemente pubblicati).',
395
-	'info_non_envoi_liste_nouveautes' => 'Non inviare l’elenco delle novità',
396
-	'info_non_modifiable' => 'non può essere modificato',
397
-	'info_non_suppression_mot_cle' => 'non voglio cancellare questa parola chiave.',
398
-	'info_notes' => 'Note',
399
-	'info_nouvel_article' => 'Nuovo articolo',
400
-	'info_nouvelle_traduction' => 'Nuova traduzione:',
401
-	'info_numero_article' => 'ARTICOLO NUMERO:',
402
-	'info_obligatoire_02' => '(Obbligatorio)',
403
-	'info_option_accepter_visiteurs' => 'Accetta l’iscrizione di utenti del sito pubblico',
404
-	'info_option_ne_pas_accepter_visiteurs' => 'Rifiuta l’iscrizione di utenti',
405
-	'info_options_avancees' => 'OPZIONE AVANZATA',
406
-	'info_ou' => 'o... ',
407
-	'info_page_interdite' => 'Pagina riservata',
408
-	'info_par_nom' => 'per nome',
409
-	'info_par_nombre_article' => 'per numero di articoli',
410
-	'info_par_statut' => 'per status',
411
-	'info_par_tri' => '’(per @tri@)’',
412
-	'info_passe_trop_court' => 'Password troppo corta.',
413
-	'info_passe_trop_court_car_pluriel' => 'La password deve contenere almeno @nb@ caratteri.',
414
-	'info_passes_identiques' => 'Le due password non sono uguali.',
415
-	'info_plus_cinq_car' => 'più di 5 caratteri',
416
-	'info_plus_cinq_car_2' => '(Più di 5 caratteri)',
417
-	'info_plus_trois_car' => '(Più di 3 caratteri)',
418
-	'info_popularite' => 'popolarità: @popularite@; visite: @visites@',
419
-	'info_post_scriptum' => 'Post Scriptum',
420
-	'info_post_scriptum_2' => 'Post Scriptum:',
421
-	'info_pour' => 'per',
422
-	'info_preview_texte' => 'È possibile visualizzare un’anteprima del sito comprendente anche gli articoli e le brevi "proposti" per la pubblicazione. Questa funzionalità può essere disattivata, consentita solo agli amministratori o a tutti i redattori.',
423
-	'info_procedez_par_etape' => 'procedere passo dopo passo',
424
-	'info_procedure_maj_version' => 'è necessario avviare la procedura di aggiornamento per adattare
395
+    'info_non_envoi_liste_nouveautes' => 'Non inviare l’elenco delle novità',
396
+    'info_non_modifiable' => 'non può essere modificato',
397
+    'info_non_suppression_mot_cle' => 'non voglio cancellare questa parola chiave.',
398
+    'info_notes' => 'Note',
399
+    'info_nouvel_article' => 'Nuovo articolo',
400
+    'info_nouvelle_traduction' => 'Nuova traduzione:',
401
+    'info_numero_article' => 'ARTICOLO NUMERO:',
402
+    'info_obligatoire_02' => '(Obbligatorio)',
403
+    'info_option_accepter_visiteurs' => 'Accetta l’iscrizione di utenti del sito pubblico',
404
+    'info_option_ne_pas_accepter_visiteurs' => 'Rifiuta l’iscrizione di utenti',
405
+    'info_options_avancees' => 'OPZIONE AVANZATA',
406
+    'info_ou' => 'o... ',
407
+    'info_page_interdite' => 'Pagina riservata',
408
+    'info_par_nom' => 'per nome',
409
+    'info_par_nombre_article' => 'per numero di articoli',
410
+    'info_par_statut' => 'per status',
411
+    'info_par_tri' => '’(per @tri@)’',
412
+    'info_passe_trop_court' => 'Password troppo corta.',
413
+    'info_passe_trop_court_car_pluriel' => 'La password deve contenere almeno @nb@ caratteri.',
414
+    'info_passes_identiques' => 'Le due password non sono uguali.',
415
+    'info_plus_cinq_car' => 'più di 5 caratteri',
416
+    'info_plus_cinq_car_2' => '(Più di 5 caratteri)',
417
+    'info_plus_trois_car' => '(Più di 3 caratteri)',
418
+    'info_popularite' => 'popolarità: @popularite@; visite: @visites@',
419
+    'info_post_scriptum' => 'Post Scriptum',
420
+    'info_post_scriptum_2' => 'Post Scriptum:',
421
+    'info_pour' => 'per',
422
+    'info_preview_texte' => 'È possibile visualizzare un’anteprima del sito comprendente anche gli articoli e le brevi "proposti" per la pubblicazione. Questa funzionalità può essere disattivata, consentita solo agli amministratori o a tutti i redattori.',
423
+    'info_procedez_par_etape' => 'procedere passo dopo passo',
424
+    'info_procedure_maj_version' => 'è necessario avviare la procedura di aggiornamento per adattare
425 425
 il database alla nuova versione di SPIP.',
426
-	'info_proxy_ok' => 'Test del proxy riuscito.',
427
-	'info_ps' => 'P.S.',
428
-	'info_publier' => 'pubblicare',
429
-	'info_publies' => 'I tuoi articoli pubblicati',
430
-	'info_question_accepter_visiteurs' => 'I modelli di pagina del sito prevedono la registrazione di utenti senza accesso all’area riservata. Attivare la seguente funzionalità:',
431
-	'info_question_inscription_nouveaux_redacteurs' => 'Vuoi accettare le iscrizioni di nuovi redattori direttamente dal sito pubblico? 
426
+    'info_proxy_ok' => 'Test del proxy riuscito.',
427
+    'info_ps' => 'P.S.',
428
+    'info_publier' => 'pubblicare',
429
+    'info_publies' => 'I tuoi articoli pubblicati',
430
+    'info_question_accepter_visiteurs' => 'I modelli di pagina del sito prevedono la registrazione di utenti senza accesso all’area riservata. Attivare la seguente funzionalità:',
431
+    'info_question_inscription_nouveaux_redacteurs' => 'Vuoi accettare le iscrizioni di nuovi redattori direttamente dal sito pubblico? 
432 432
 In caso affermativo, i visitatori potranno iscriversi grazie ad un modulo automatizzato e accedere all’area riservata per proporre i propri articoli. 
433 433
 <div class="notice">Durante il processo d’iscrizione, gli utenti riceveranno un email che fornisce loro i codici d’accesso all’area privata. Alcuni servizi di hosting disattivano l’invio di email dai propri server: in questo caso l’iscrizione automatica non può essere attivata.</div>',
434
-	'info_qui_edite' => '@nom_auteur_modif@ ha lavorato su questo contenuto @date_diff@ minuti fa',
435
-	'info_racine_site' => 'Root del sito',
436
-	'info_recharger_page' => 'Aggiorna questa pagina fra qualche istante.',
437
-	'info_recherche_auteur_zero' => 'Nessun risultato per "@cherche_auteur@".',
438
-	'info_recommencer' => 'Ricomincia.',
439
-	'info_redacteur_1' => 'Redattori',
440
-	'info_redacteur_2' => 'avendo accesso allo spazio privato (<i>raccommandato</i>)',
441
-	'info_redacteurs' => 'Redattori',
442
-	'info_redaction_en_cours' => 'IN CORSO DI REDAZIONE',
443
-	'info_redirection' => 'Reindirizzamento',
444
-	'info_redirection_activee' => 'Il reindirizzamento è attivato.',
445
-	'info_redirection_boucle' => 'Stai cercando di sovrascrivere l’articolo.',
446
-	'info_redirection_desactivee' => 'Il reindirizzamento è stato cancellato.',
447
-	'info_refuses' => 'I tuoi articoli rifiutati',
448
-	'info_reglage_ldap' => 'Opzioni: <b>Parametri per l’importazione LDAP</b>',
449
-	'info_renvoi_article' => '<b>Reindirizzamento.</b> Quest’articolo rimanda alla pagina:',
450
-	'info_reserve_admin' => 'Solo gli amministratori possono modificare quest’indirizzo.',
451
-	'info_restreindre_rubrique' => 'Limita la facoltà di gestione alla rubrica:',
452
-	'info_resultat_recherche' => 'Risultati della ricerca:',
453
-	'info_rubriques' => 'Rubriche',
454
-	'info_rubriques_02' => 'rubriche',
455
-	'info_rubriques_trouvees' => 'Rubriche trovate',
456
-	'info_sans_titre' => 'Senza titolo',
457
-	'info_selection_chemin_acces' => '<b>Seleziona</b> qui sotto il percorso d’accesso nell’elenco:',
458
-	'info_signatures' => 'firme',
459
-	'info_site' => 'Sito',
460
-	'info_site_2' => 'sito: ',
461
-	'info_site_min' => 'sito',
462
-	'info_site_reference_2' => 'Sito repertoriato',
463
-	'info_site_web' => 'Sito Web:',
464
-	'info_sites' => 'siti',
465
-	'info_sites_lies_mot' => 'I siti in repertorio legati a questa parola chiave',
466
-	'info_sites_proxy' => 'Utilizza un proxy',
467
-	'info_sites_trouves' => 'Siti trovati',
468
-	'info_sous_titre' => 'Sottotitolo:',
469
-	'info_statut_administrateur' => 'Amministratore',
470
-	'info_statut_auteur' => 'Status di questo autore:',
471
-	'info_statut_auteur_2' => 'Io sono',
472
-	'info_statut_auteur_a_confirmer' => 'Iscrizione da confermare',
473
-	'info_statut_auteur_autre' => 'Altro stato:',
474
-	'info_statut_redacteur' => 'Redattore',
475
-	'info_statut_utilisateurs_1' => 'Status predefinito degli utenti importati',
476
-	'info_statut_utilisateurs_2' => 'Scegli lo status da attribuire alle personne presenti nell’elenco LDAP quando si collegano per la prima volta. Potrai poi modificare questa impostazione per ogni singolo autore.',
477
-	'info_suivi_activite' => 'Monitoraggio dell’attività editoriale',
478
-	'info_surtitre' => 'Occhiello:',
479
-	'info_syndication_integrale_1' => 'Il tuo sito propone dei file di  syndication (vedi « <a href="@url@">@titre@</a> »).',
480
-	'info_syndication_integrale_2' => 'Si desidera trasmettere gli articoli in versione integrale oppure in versione riassunta di un centinaio di caratteri?',
481
-	'info_table_prefix' => 'È possibile modificare il prefisso del nome delle tabelle del database (cosa indispensabile se si desidera installare più siti usando il medesimo database). Questo prefisso si deve scrivere usando esclusivamente lettere minuscole, prive di accenti e senza alcuno spazio.',
482
-	'info_taille_maximale_images' => 'SPIP testerà la dimensione massima delle immagini che può manipolare (in milioni di pixel).<br /> Le immagini di dimensione maggiore non saranno ridotte.',
483
-	'info_taille_maximale_vignette' => 'Dimensione massima delle immagini create dal sistema:',
484
-	'info_terminer_installation' => 'Puoi ora terminare la procedura d’installazione standard.',
485
-	'info_texte' => 'Testo',
486
-	'info_texte_explicatif' => 'Testo esplicativo',
487
-	'info_texte_long' => '(il testo è lungo: è quindi visualizzato in più sezioni che verranno riunificate dopo la convalida)',
488
-	'info_texte_message' => 'Testo del tuo messaggio:',
489
-	'info_texte_message_02' => 'Testo del messaggio',
490
-	'info_titre' => 'Titolo:',
491
-	'info_total' => 'totale: ',
492
-	'info_tous_articles_en_redaction' => 'Tutti gli articoli in corso di redazione',
493
-	'info_tous_articles_presents' => 'Tutti gli articoli pubblicati in questa rubrica',
494
-	'info_tous_articles_refuses' => 'Tutti gli articoli rifiutati',
495
-	'info_tous_les' => 'tutti i:',
496
-	'info_tout_site' => 'Tutto il sito',
497
-	'info_tout_site2' => 'L’articolo non è stato tradotto in questa lingua.',
498
-	'info_tout_site3' => 'L’articolo è stato tradotto in questa lingua, ma sono state effettuate alcune modifiche all’articolo di riferimento. La traduzione deve quindi essere aggiornata.',
499
-	'info_tout_site4' => 'L’articolo è stato tradotto in questa lingua e la traduzione è aggiornata.',
500
-	'info_tout_site5' => 'Articolo originale.',
501
-	'info_tout_site6' => '<b>Attenzione:</b> solo gli articoli originali vengono visualizzati.
434
+    'info_qui_edite' => '@nom_auteur_modif@ ha lavorato su questo contenuto @date_diff@ minuti fa',
435
+    'info_racine_site' => 'Root del sito',
436
+    'info_recharger_page' => 'Aggiorna questa pagina fra qualche istante.',
437
+    'info_recherche_auteur_zero' => 'Nessun risultato per "@cherche_auteur@".',
438
+    'info_recommencer' => 'Ricomincia.',
439
+    'info_redacteur_1' => 'Redattori',
440
+    'info_redacteur_2' => 'avendo accesso allo spazio privato (<i>raccommandato</i>)',
441
+    'info_redacteurs' => 'Redattori',
442
+    'info_redaction_en_cours' => 'IN CORSO DI REDAZIONE',
443
+    'info_redirection' => 'Reindirizzamento',
444
+    'info_redirection_activee' => 'Il reindirizzamento è attivato.',
445
+    'info_redirection_boucle' => 'Stai cercando di sovrascrivere l’articolo.',
446
+    'info_redirection_desactivee' => 'Il reindirizzamento è stato cancellato.',
447
+    'info_refuses' => 'I tuoi articoli rifiutati',
448
+    'info_reglage_ldap' => 'Opzioni: <b>Parametri per l’importazione LDAP</b>',
449
+    'info_renvoi_article' => '<b>Reindirizzamento.</b> Quest’articolo rimanda alla pagina:',
450
+    'info_reserve_admin' => 'Solo gli amministratori possono modificare quest’indirizzo.',
451
+    'info_restreindre_rubrique' => 'Limita la facoltà di gestione alla rubrica:',
452
+    'info_resultat_recherche' => 'Risultati della ricerca:',
453
+    'info_rubriques' => 'Rubriche',
454
+    'info_rubriques_02' => 'rubriche',
455
+    'info_rubriques_trouvees' => 'Rubriche trovate',
456
+    'info_sans_titre' => 'Senza titolo',
457
+    'info_selection_chemin_acces' => '<b>Seleziona</b> qui sotto il percorso d’accesso nell’elenco:',
458
+    'info_signatures' => 'firme',
459
+    'info_site' => 'Sito',
460
+    'info_site_2' => 'sito: ',
461
+    'info_site_min' => 'sito',
462
+    'info_site_reference_2' => 'Sito repertoriato',
463
+    'info_site_web' => 'Sito Web:',
464
+    'info_sites' => 'siti',
465
+    'info_sites_lies_mot' => 'I siti in repertorio legati a questa parola chiave',
466
+    'info_sites_proxy' => 'Utilizza un proxy',
467
+    'info_sites_trouves' => 'Siti trovati',
468
+    'info_sous_titre' => 'Sottotitolo:',
469
+    'info_statut_administrateur' => 'Amministratore',
470
+    'info_statut_auteur' => 'Status di questo autore:',
471
+    'info_statut_auteur_2' => 'Io sono',
472
+    'info_statut_auteur_a_confirmer' => 'Iscrizione da confermare',
473
+    'info_statut_auteur_autre' => 'Altro stato:',
474
+    'info_statut_redacteur' => 'Redattore',
475
+    'info_statut_utilisateurs_1' => 'Status predefinito degli utenti importati',
476
+    'info_statut_utilisateurs_2' => 'Scegli lo status da attribuire alle personne presenti nell’elenco LDAP quando si collegano per la prima volta. Potrai poi modificare questa impostazione per ogni singolo autore.',
477
+    'info_suivi_activite' => 'Monitoraggio dell’attività editoriale',
478
+    'info_surtitre' => 'Occhiello:',
479
+    'info_syndication_integrale_1' => 'Il tuo sito propone dei file di  syndication (vedi « <a href="@url@">@titre@</a> »).',
480
+    'info_syndication_integrale_2' => 'Si desidera trasmettere gli articoli in versione integrale oppure in versione riassunta di un centinaio di caratteri?',
481
+    'info_table_prefix' => 'È possibile modificare il prefisso del nome delle tabelle del database (cosa indispensabile se si desidera installare più siti usando il medesimo database). Questo prefisso si deve scrivere usando esclusivamente lettere minuscole, prive di accenti e senza alcuno spazio.',
482
+    'info_taille_maximale_images' => 'SPIP testerà la dimensione massima delle immagini che può manipolare (in milioni di pixel).<br /> Le immagini di dimensione maggiore non saranno ridotte.',
483
+    'info_taille_maximale_vignette' => 'Dimensione massima delle immagini create dal sistema:',
484
+    'info_terminer_installation' => 'Puoi ora terminare la procedura d’installazione standard.',
485
+    'info_texte' => 'Testo',
486
+    'info_texte_explicatif' => 'Testo esplicativo',
487
+    'info_texte_long' => '(il testo è lungo: è quindi visualizzato in più sezioni che verranno riunificate dopo la convalida)',
488
+    'info_texte_message' => 'Testo del tuo messaggio:',
489
+    'info_texte_message_02' => 'Testo del messaggio',
490
+    'info_titre' => 'Titolo:',
491
+    'info_total' => 'totale: ',
492
+    'info_tous_articles_en_redaction' => 'Tutti gli articoli in corso di redazione',
493
+    'info_tous_articles_presents' => 'Tutti gli articoli pubblicati in questa rubrica',
494
+    'info_tous_articles_refuses' => 'Tutti gli articoli rifiutati',
495
+    'info_tous_les' => 'tutti i:',
496
+    'info_tout_site' => 'Tutto il sito',
497
+    'info_tout_site2' => 'L’articolo non è stato tradotto in questa lingua.',
498
+    'info_tout_site3' => 'L’articolo è stato tradotto in questa lingua, ma sono state effettuate alcune modifiche all’articolo di riferimento. La traduzione deve quindi essere aggiornata.',
499
+    'info_tout_site4' => 'L’articolo è stato tradotto in questa lingua e la traduzione è aggiornata.',
500
+    'info_tout_site5' => 'Articolo originale.',
501
+    'info_tout_site6' => '<b>Attenzione:</b> solo gli articoli originali vengono visualizzati.
502 502
 Le traduzioni sono associate all’originale,
503 503
  in un colore che indica il loro stato:',
504
-	'info_traductions' => 'Traduzioni',
505
-	'info_travail_colaboratif' => 'Lavoro di collaborazione sugli articoli',
506
-	'info_un_article' => 'un articolo, ',
507
-	'info_un_site' => 'un sito, ',
508
-	'info_une_rubrique' => 'una rubrica, ',
509
-	'info_une_rubrique_02' => '1 rubrica',
510
-	'info_url' => 'URL:',
511
-	'info_url_proxy' => 'URL del proxy',
512
-	'info_url_proxy_pas_conforme' => 'L’URL del proxy non è valido.',
513
-	'info_url_site_pas_conforme' => 'l’URL del sito non è valido.',
514
-	'info_url_test_proxy' => 'URL di test',
515
-	'info_urlref' => 'Link ipertestuale:',
516
-	'info_utilisation_spip' => 'Puoi ora cominciare ad utilizzare il sistema di pubblicazione assistita...',
517
-	'info_visites_par_mois' => 'Visualizzazione per mese:',
518
-	'info_visiteur_1' => 'Visitatori',
519
-	'info_visiteur_2' => 'del sito pubblico',
520
-	'info_visiteurs' => 'Visitatori',
521
-	'info_visiteurs_02' => 'Visitatori del sito pubblico',
522
-	'info_webmestre_forces' => 'I webmaster sono attualmente definiti in <tt>@file_options@</tt>.',
523
-	'install_adresse_base_hebergeur' => 'Indirizzo del database attribuito dal provider',
524
-	'install_connect_ok' => 'Il nuovo database è stato definito sul server @connect@.',
525
-	'install_echec_annonce' => 'L’installazione potrebbe fallire oppure causare problemi di funzionalità al sito...',
526
-	'install_extension_mbstring' => 'SPIP non funziona con:',
527
-	'install_extension_php_obligatoire' => 'SPIP esige l’estensione php:',
528
-	'install_login_base_hebergeur' => 'Login di connessione attribuito dal provider',
529
-	'install_nom_base_hebergeur' => 'Nome del database attribuito dal provider:',
530
-	'install_pas_table' => 'Database attualmente senza tabelle',
531
-	'install_pass_base_hebergeur' => 'Password di connessione attribuito dal provider',
532
-	'install_php_extension' => 'Mancano le seguenti estensioni: @extensions@',
533
-	'install_php_version' => 'PHP versione @version@ insufficiente (minimo = @minimum@)',
534
-	'install_php_version_max' => 'La versione @version@ di PHP é troppo recente (versione massima = @maximum@)',
535
-	'install_select_langue' => 'Seleziona una lingua e poi clicca sul bottone « Avanti » per lanciare la procedura di installazione.',
536
-	'install_select_type_db' => 'Indicare il tipo di database:',
537
-	'install_select_type_mysql' => 'MySQL',
538
-	'install_select_type_pg' => 'PostgreSQL',
539
-	'install_select_type_sqlite2' => 'SQLite 2',
540
-	'install_select_type_sqlite3' => 'SQLite 3',
541
-	'install_serveur_hebergeur' => 'Server del database attribuito dall’hoster',
542
-	'install_table_prefix_hebergeur' => 'Prefisso della tabella attribuito dal provider:',
543
-	'install_tables_base' => 'Tabelle del database',
544
-	'install_types_db_connus' => 'SPIP può utilizzare <b>MySQL</b> (il più diffuso) e <b>SQLite</b>.',
545
-	'install_types_db_connus_avertissement' => 'Il supporto a <b>PostgreSQL</b> è proposto a titolo sperimentale.',
546
-	'instituer_erreur_statut_a_change' => 'Lo status è già stato modificato',
547
-	'instituer_erreur_statut_non_autorise' => 'Non puoi selezionare questo stato',
548
-	'intem_redacteur' => 'redattore',
549
-	'intitule_licence' => 'Licenza',
550
-	'item_accepter_inscriptions' => 'Accetta le iscrizioni',
551
-	'item_activer_messages_avertissement' => 'Attiva i messaggi d’avvertimento',
552
-	'item_administrateur_2' => 'amministratore',
553
-	'item_afficher_calendrier' => 'Pubblica nel calendario',
554
-	'item_autoriser_syndication_integrale' => 'Diffondere la versione integrale degli articoli nei file di syndication',
555
-	'item_choix_administrateurs' => 'gli amministratori',
556
-	'item_choix_generation_miniature' => 'Genera automaticamente le thumbnail delle immagini.',
557
-	'item_choix_non_generation_miniature' => 'Non creare le thumbnail delle immagini.',
558
-	'item_choix_redacteurs' => 'i redattori',
559
-	'item_choix_visiteurs' => 'i visitatori del sito pubblico',
560
-	'item_creer_fichiers_authent' => 'Crea i file .htpasswd',
561
-	'item_login' => 'Login',
562
-	'item_messagerie_agenda' => 'Attiva la messaggistica e l’agenda',
563
-	'item_mots_cles_association_articles' => 'agli articoli',
564
-	'item_mots_cles_association_rubriques' => 'alle rubriche',
565
-	'item_mots_cles_association_sites' => 'ai siti repertoriati o in syndication.',
566
-	'item_non' => 'No',
567
-	'item_non_accepter_inscriptions' => 'Non accettare le iscrizioni',
568
-	'item_non_activer_messages_avertissement' => 'Nessun messaggio d’avvertimento',
569
-	'item_non_afficher_calendrier' => 'Non pubblicare nel calendario',
570
-	'item_non_autoriser_syndication_integrale' => 'Diffondere solo un riassunto',
571
-	'item_non_creer_fichiers_authent' => 'Non creare questi file',
572
-	'item_non_messagerie_agenda' => 'Disattiva la messaggistica e l’agenda',
573
-	'item_non_publier_articles' => 'Non pubblicare gli articoli prima della data impostata.',
574
-	'item_nouvel_auteur' => 'Nuovo autore',
575
-	'item_nouvelle_rubrique' => 'Nuova rubrica',
576
-	'item_oui' => 'Si',
577
-	'item_publier_articles' => 'Pubblica gli articoli indipendentemente dalla data impostata.',
578
-	'item_reponse_article' => 'Risposta all’articolo ',
579
-	'item_visiteur' => 'visitatore',
504
+    'info_traductions' => 'Traduzioni',
505
+    'info_travail_colaboratif' => 'Lavoro di collaborazione sugli articoli',
506
+    'info_un_article' => 'un articolo, ',
507
+    'info_un_site' => 'un sito, ',
508
+    'info_une_rubrique' => 'una rubrica, ',
509
+    'info_une_rubrique_02' => '1 rubrica',
510
+    'info_url' => 'URL:',
511
+    'info_url_proxy' => 'URL del proxy',
512
+    'info_url_proxy_pas_conforme' => 'L’URL del proxy non è valido.',
513
+    'info_url_site_pas_conforme' => 'l’URL del sito non è valido.',
514
+    'info_url_test_proxy' => 'URL di test',
515
+    'info_urlref' => 'Link ipertestuale:',
516
+    'info_utilisation_spip' => 'Puoi ora cominciare ad utilizzare il sistema di pubblicazione assistita...',
517
+    'info_visites_par_mois' => 'Visualizzazione per mese:',
518
+    'info_visiteur_1' => 'Visitatori',
519
+    'info_visiteur_2' => 'del sito pubblico',
520
+    'info_visiteurs' => 'Visitatori',
521
+    'info_visiteurs_02' => 'Visitatori del sito pubblico',
522
+    'info_webmestre_forces' => 'I webmaster sono attualmente definiti in <tt>@file_options@</tt>.',
523
+    'install_adresse_base_hebergeur' => 'Indirizzo del database attribuito dal provider',
524
+    'install_connect_ok' => 'Il nuovo database è stato definito sul server @connect@.',
525
+    'install_echec_annonce' => 'L’installazione potrebbe fallire oppure causare problemi di funzionalità al sito...',
526
+    'install_extension_mbstring' => 'SPIP non funziona con:',
527
+    'install_extension_php_obligatoire' => 'SPIP esige l’estensione php:',
528
+    'install_login_base_hebergeur' => 'Login di connessione attribuito dal provider',
529
+    'install_nom_base_hebergeur' => 'Nome del database attribuito dal provider:',
530
+    'install_pas_table' => 'Database attualmente senza tabelle',
531
+    'install_pass_base_hebergeur' => 'Password di connessione attribuito dal provider',
532
+    'install_php_extension' => 'Mancano le seguenti estensioni: @extensions@',
533
+    'install_php_version' => 'PHP versione @version@ insufficiente (minimo = @minimum@)',
534
+    'install_php_version_max' => 'La versione @version@ di PHP é troppo recente (versione massima = @maximum@)',
535
+    'install_select_langue' => 'Seleziona una lingua e poi clicca sul bottone « Avanti » per lanciare la procedura di installazione.',
536
+    'install_select_type_db' => 'Indicare il tipo di database:',
537
+    'install_select_type_mysql' => 'MySQL',
538
+    'install_select_type_pg' => 'PostgreSQL',
539
+    'install_select_type_sqlite2' => 'SQLite 2',
540
+    'install_select_type_sqlite3' => 'SQLite 3',
541
+    'install_serveur_hebergeur' => 'Server del database attribuito dall’hoster',
542
+    'install_table_prefix_hebergeur' => 'Prefisso della tabella attribuito dal provider:',
543
+    'install_tables_base' => 'Tabelle del database',
544
+    'install_types_db_connus' => 'SPIP può utilizzare <b>MySQL</b> (il più diffuso) e <b>SQLite</b>.',
545
+    'install_types_db_connus_avertissement' => 'Il supporto a <b>PostgreSQL</b> è proposto a titolo sperimentale.',
546
+    'instituer_erreur_statut_a_change' => 'Lo status è già stato modificato',
547
+    'instituer_erreur_statut_non_autorise' => 'Non puoi selezionare questo stato',
548
+    'intem_redacteur' => 'redattore',
549
+    'intitule_licence' => 'Licenza',
550
+    'item_accepter_inscriptions' => 'Accetta le iscrizioni',
551
+    'item_activer_messages_avertissement' => 'Attiva i messaggi d’avvertimento',
552
+    'item_administrateur_2' => 'amministratore',
553
+    'item_afficher_calendrier' => 'Pubblica nel calendario',
554
+    'item_autoriser_syndication_integrale' => 'Diffondere la versione integrale degli articoli nei file di syndication',
555
+    'item_choix_administrateurs' => 'gli amministratori',
556
+    'item_choix_generation_miniature' => 'Genera automaticamente le thumbnail delle immagini.',
557
+    'item_choix_non_generation_miniature' => 'Non creare le thumbnail delle immagini.',
558
+    'item_choix_redacteurs' => 'i redattori',
559
+    'item_choix_visiteurs' => 'i visitatori del sito pubblico',
560
+    'item_creer_fichiers_authent' => 'Crea i file .htpasswd',
561
+    'item_login' => 'Login',
562
+    'item_messagerie_agenda' => 'Attiva la messaggistica e l’agenda',
563
+    'item_mots_cles_association_articles' => 'agli articoli',
564
+    'item_mots_cles_association_rubriques' => 'alle rubriche',
565
+    'item_mots_cles_association_sites' => 'ai siti repertoriati o in syndication.',
566
+    'item_non' => 'No',
567
+    'item_non_accepter_inscriptions' => 'Non accettare le iscrizioni',
568
+    'item_non_activer_messages_avertissement' => 'Nessun messaggio d’avvertimento',
569
+    'item_non_afficher_calendrier' => 'Non pubblicare nel calendario',
570
+    'item_non_autoriser_syndication_integrale' => 'Diffondere solo un riassunto',
571
+    'item_non_creer_fichiers_authent' => 'Non creare questi file',
572
+    'item_non_messagerie_agenda' => 'Disattiva la messaggistica e l’agenda',
573
+    'item_non_publier_articles' => 'Non pubblicare gli articoli prima della data impostata.',
574
+    'item_nouvel_auteur' => 'Nuovo autore',
575
+    'item_nouvelle_rubrique' => 'Nuova rubrica',
576
+    'item_oui' => 'Si',
577
+    'item_publier_articles' => 'Pubblica gli articoli indipendentemente dalla data impostata.',
578
+    'item_reponse_article' => 'Risposta all’articolo ',
579
+    'item_visiteur' => 'visitatore',
580 580
 
581
-	// J
582
-	'jour_non_connu_nc' => 'n.c.',
581
+    // J
582
+    'jour_non_connu_nc' => 'n.c.',
583 583
 
584
-	// L
585
-	'label_bando_outils' => 'Barra degli strumenti',
586
-	'label_bando_outils_afficher' => 'Mostra gli strumenti',
587
-	'label_bando_outils_masquer' => 'Nascondi gli strumenti',
588
-	'label_choix_langue' => 'Seleziona la tua lingua',
589
-	'label_nom_fichier_connect' => 'Indica il nome per questo server',
590
-	'label_slogan_site' => 'Slogan del sito',
591
-	'label_taille_ecran' => 'Larghezza dello schermo',
592
-	'label_texte_et_icones_navigation' => 'Menù di naviagazione',
593
-	'label_texte_et_icones_page' => 'Visualizzazione nella pagina',
594
-	'ldap_correspondance' => 'mappa del campo @champ@',
595
-	'ldap_correspondance_1' => 'Mappa dei campi LDAP',
596
-	'ldap_correspondance_2' => 'Per ognuno dei seguenti campi SPIP, indicare il nome del campo LDAP corrispondente. Lasciare vuoto per non riempire, separare da spazi o da virgole per provare più campi LDAP.',
597
-	'lien_ajouter_auteur' => 'Aggiungi questo autore',
598
-	'lien_ajouter_une_rubrique' => 'Aggiungi questa rubrica',
599
-	'lien_email' => 'email',
600
-	'lien_nom_site' => 'NOME DEL SITO:',
601
-	'lien_rapide_contenu' => 'Vai al contenuto',
602
-	'lien_rapide_navigation' => 'Vai alla navigazione',
603
-	'lien_rapide_recherche' => 'Vai alla ricerca',
604
-	'lien_retirer_auteur' => 'Rimuovere l’autore',
605
-	'lien_retirer_rubrique' => 'Elimina la rubrica',
606
-	'lien_retirer_tous_auteurs' => 'Elimina tutti gli autori',
607
-	'lien_retirer_toutes_rubriques' => 'Rimuovi tutte le rubriche',
608
-	'lien_site' => 'sito',
609
-	'lien_tout_decocher' => 'Deselezionare tutto',
610
-	'lien_tout_deplier' => 'Espandi',
611
-	'lien_tout_replier' => 'Richiudi',
612
-	'lien_tout_supprimer' => 'Eliminare tutto',
613
-	'lien_trier_nom' => 'Ordina per nome',
614
-	'lien_trier_nombre_articles' => 'Ordina per numero di articoli',
615
-	'lien_trier_statut' => 'Ordina per status',
616
-	'lien_voir_en_ligne' => 'VEDI ON LINE:',
617
-	'logo_article' => 'Logo dell’articolo',
618
-	'logo_auteur' => 'Logo dell’autore',
619
-	'logo_rubrique' => 'Logo della rubrica',
620
-	'logo_site' => 'Logo di questo sito',
621
-	'logo_standard_rubrique' => 'Logo standard delle rubriche',
622
-	'logo_survol' => 'Logo per il rollover',
584
+    // L
585
+    'label_bando_outils' => 'Barra degli strumenti',
586
+    'label_bando_outils_afficher' => 'Mostra gli strumenti',
587
+    'label_bando_outils_masquer' => 'Nascondi gli strumenti',
588
+    'label_choix_langue' => 'Seleziona la tua lingua',
589
+    'label_nom_fichier_connect' => 'Indica il nome per questo server',
590
+    'label_slogan_site' => 'Slogan del sito',
591
+    'label_taille_ecran' => 'Larghezza dello schermo',
592
+    'label_texte_et_icones_navigation' => 'Menù di naviagazione',
593
+    'label_texte_et_icones_page' => 'Visualizzazione nella pagina',
594
+    'ldap_correspondance' => 'mappa del campo @champ@',
595
+    'ldap_correspondance_1' => 'Mappa dei campi LDAP',
596
+    'ldap_correspondance_2' => 'Per ognuno dei seguenti campi SPIP, indicare il nome del campo LDAP corrispondente. Lasciare vuoto per non riempire, separare da spazi o da virgole per provare più campi LDAP.',
597
+    'lien_ajouter_auteur' => 'Aggiungi questo autore',
598
+    'lien_ajouter_une_rubrique' => 'Aggiungi questa rubrica',
599
+    'lien_email' => 'email',
600
+    'lien_nom_site' => 'NOME DEL SITO:',
601
+    'lien_rapide_contenu' => 'Vai al contenuto',
602
+    'lien_rapide_navigation' => 'Vai alla navigazione',
603
+    'lien_rapide_recherche' => 'Vai alla ricerca',
604
+    'lien_retirer_auteur' => 'Rimuovere l’autore',
605
+    'lien_retirer_rubrique' => 'Elimina la rubrica',
606
+    'lien_retirer_tous_auteurs' => 'Elimina tutti gli autori',
607
+    'lien_retirer_toutes_rubriques' => 'Rimuovi tutte le rubriche',
608
+    'lien_site' => 'sito',
609
+    'lien_tout_decocher' => 'Deselezionare tutto',
610
+    'lien_tout_deplier' => 'Espandi',
611
+    'lien_tout_replier' => 'Richiudi',
612
+    'lien_tout_supprimer' => 'Eliminare tutto',
613
+    'lien_trier_nom' => 'Ordina per nome',
614
+    'lien_trier_nombre_articles' => 'Ordina per numero di articoli',
615
+    'lien_trier_statut' => 'Ordina per status',
616
+    'lien_voir_en_ligne' => 'VEDI ON LINE:',
617
+    'logo_article' => 'Logo dell’articolo',
618
+    'logo_auteur' => 'Logo dell’autore',
619
+    'logo_rubrique' => 'Logo della rubrica',
620
+    'logo_site' => 'Logo di questo sito',
621
+    'logo_standard_rubrique' => 'Logo standard delle rubriche',
622
+    'logo_survol' => 'Logo per il rollover',
623 623
 
624
-	// M
625
-	'menu_aide_installation_choix_base' => 'Scegliere il database',
626
-	'module_fichier_langue' => 'File lingua',
627
-	'module_raccourci' => 'Scorciatoia',
628
-	'module_texte_affiche' => 'Testo visualizzato',
629
-	'module_texte_explicatif' => 'È possibile inserire le scorciatoie nel modello di layout del proprio sito pubblico. Queste verranno tradotte automaticamente nelle diverse lingue (se esiste già un file lingua).',
630
-	'module_texte_traduction' => 'Il file lingua «@module@» è disponibile in:',
631
-	'mois_non_connu' => 'sconosciuto',
624
+    // M
625
+    'menu_aide_installation_choix_base' => 'Scegliere il database',
626
+    'module_fichier_langue' => 'File lingua',
627
+    'module_raccourci' => 'Scorciatoia',
628
+    'module_texte_affiche' => 'Testo visualizzato',
629
+    'module_texte_explicatif' => 'È possibile inserire le scorciatoie nel modello di layout del proprio sito pubblico. Queste verranno tradotte automaticamente nelle diverse lingue (se esiste già un file lingua).',
630
+    'module_texte_traduction' => 'Il file lingua «@module@» è disponibile in:',
631
+    'mois_non_connu' => 'sconosciuto',
632 632
 
633
-	// N
634
-	'nouvelle_version_spip' => 'L’aggiornamento alla versione @version@ di SPIP è disponibile',
635
-	'nouvelle_version_spip_majeure' => 'La nuova versione @version@ di SPIP è disponibile',
633
+    // N
634
+    'nouvelle_version_spip' => 'L’aggiornamento alla versione @version@ di SPIP è disponibile',
635
+    'nouvelle_version_spip_majeure' => 'La nuova versione @version@ di SPIP è disponibile',
636 636
 
637
-	// O
638
-	'onglet_contenu' => 'Contenuto',
639
-	'onglet_declarer_une_autre_base' => 'Dichiarare un altro database',
640
-	'onglet_discuter' => 'Discuti',
641
-	'onglet_interactivite' => 'Interattività',
642
-	'onglet_proprietes' => 'Proprietà',
643
-	'onglet_repartition_actuelle' => 'attualmente',
644
-	'onglet_sous_rubriques' => 'Sotto-rubriche',
637
+    // O
638
+    'onglet_contenu' => 'Contenuto',
639
+    'onglet_declarer_une_autre_base' => 'Dichiarare un altro database',
640
+    'onglet_discuter' => 'Discuti',
641
+    'onglet_interactivite' => 'Interattività',
642
+    'onglet_proprietes' => 'Proprietà',
643
+    'onglet_repartition_actuelle' => 'attualmente',
644
+    'onglet_sous_rubriques' => 'Sotto-rubriche',
645 645
 
646
-	// P
647
-	'page_pas_proxy' => 'Questa pagina non deve passare attraverso il proxy',
648
-	'pas_de_proxy_pour' => 'Se necessario, indicare i server o i domini per i quali non si deve applicare questo proxy (per esempio: @exemple@)',
649
-	'phpinfo' => 'Configurazione PHP',
650
-	'plugin_charge_paquet' => 'Caricamento del pacchetto @name@',
651
-	'plugin_charger' => 'Download',
652
-	'plugin_erreur_charger' => 'errore: impossibile caricare @zip@',
653
-	'plugin_erreur_droit1' => 'La directory <code>@dest@</code> non ha i permessi di scrittura.',
654
-	'plugin_erreur_droit2' => 'Verificare i diritti su questa directory (se necessario crearla), o installare i file tramite FTP.',
655
-	'plugin_erreur_zip' => 'fallimento pclzip: errore @status@',
656
-	'plugin_etat_developpement' => 'in corso di sviluppo',
657
-	'plugin_etat_experimental' => 'sperimentale',
658
-	'plugin_etat_stable' => 'stabile',
659
-	'plugin_etat_test' => 'in prova',
660
-	'plugin_impossible_activer' => 'Impossibile attivare l’estensione @plugin@',
661
-	'plugin_info_automatique1' => 'Se si desidera autorizzare l’installazione automatica dell’estensione è necessario: ',
662
-	'plugin_info_automatique1_lib' => 'Se vuoi autorizzare l’installazione automatica di questa libreria:',
663
-	'plugin_info_automatique2' => 'creare una directory <code>@rep@</code>;',
664
-	'plugin_info_automatique3' => 'verificare che il server sia autorizzato a scrivere in questa directory.',
665
-	'plugin_info_automatique_creer' => 'da creare alla radice del sito.',
666
-	'plugin_info_automatique_exemples' => 'esempi:',
667
-	'plugin_info_automatique_ftp' => 'È possibile installare plug-in tramite FTP, nella cartella <tt>@rep@</tt>',
668
-	'plugin_info_automatique_lib' => 'Alcune estensioni richiedono anche di poter trasferire dei file nella cartella <code>lib/</code>, da creare (se necessario) alla radice del sito.',
669
-	'plugin_info_automatique_liste' => 'Gli elenchi delle estensioni:',
670
-	'plugin_info_automatique_liste_officielle' => 'le estensioni ufficiali',
671
-	'plugin_info_automatique_liste_update' => 'Aggiornare gli elenchi',
672
-	'plugin_info_automatique_ou' => 'oppure...',
673
-	'plugin_info_automatique_select' => 'Selezionata un’estensione qui sotto: SPIP la scaricherà e la installerà nella cartella <code>@rep@</code>; se questo estensione è già presente verrà aggiornata.',
674
-	'plugin_info_credit' => 'Crediti',
675
-	'plugin_info_erreur_xml' => 'La dichiarazione del plugin è sbagliata',
676
-	'plugin_info_install_ok' => 'Installazione completata con successo',
677
-	'plugin_info_necessite' => 'Richiesto :',
678
-	'plugin_info_non_compatible_spip' => 'Questo plugin è incompatibile con questa versione di SPIP',
679
-	'plugin_info_plugins_dist_1' => 'Le estensioni sottostanti sono caricate e attivate nella directory @plugins_dist@.',
680
-	'plugin_info_plugins_dist_2' => 'Questi non possono essere disabilitati.',
681
-	'plugin_info_telecharger' => 'da scaricare da @url@ e da installare in @rep@',
682
-	'plugin_info_upgrade_ok' => 'Aggiornamento avvenuto',
683
-	'plugin_librairies_installees' => 'Librerie installate',
684
-	'plugin_necessite_extension_php' => 'Richiede l’estensione PHP @plugin@ in versione @version@.',
685
-	'plugin_necessite_extension_php_sans_version' => 'Richiede l’estensione PHP @plugin@',
686
-	'plugin_necessite_lib' => 'Questa estensione richiede la libreria @lib@',
687
-	'plugin_necessite_php' => 'Richiede @plugin@ in versione @version@.',
688
-	'plugin_necessite_plugin' => 'Necessita l’estensione @plugin@ con la versione @version@.',
689
-	'plugin_necessite_plugin_sans_version' => 'Necessita del plugin @plugin@',
690
-	'plugin_necessite_spip' => 'Necessita SPIP con almeno la versione @version@.',
691
-	'plugin_source' => 'origine: ',
692
-	'plugin_titre_automatique' => 'Installazione automatica',
693
-	'plugin_titre_automatique_ajouter' => 'Aggiungere dei plugin',
694
-	'plugin_titre_installation' => 'Installazione del plugin @plugin@',
695
-	'plugin_titre_modifier' => 'I miei plugin',
696
-	'plugin_utilise_extension_php' => 'Usa l’estensione PHP @plugin@ in versione @version@.',
697
-	'plugin_utilise_php' => 'Utilizza @plugin@ in versione @version@.',
698
-	'plugin_utilise_plugin' => 'Utilizza il plugin @plugin@ in versione @version@.',
699
-	'plugin_zip_active' => 'Continuare per attivarlo',
700
-	'plugin_zip_adresse' => 'indicate qui sotto l’indirizzo di un file zip del plug-in da scaricare, oppure l’indirizzo di un elenco di plug-in.',
701
-	'plugin_zip_adresse_champ' => 'Indirizzo del plug-in o dell’elenco ',
702
-	'plugin_zip_content' => 'Esso contiene i file seguenti (@taille@),<br />pronti per essere installati nella cartella <code>@rep@</code>',
703
-	'plugin_zip_installe_finie' => 'Il file @zip@ è stato decompresso e installato.',
704
-	'plugin_zip_installe_rep_finie' => 'Il file @zip@ è stato decompresso e installato nella cartella @rep@',
705
-	'plugin_zip_installer' => 'Ora è possibile installarlo.',
706
-	'plugin_zip_telecharge' => 'Il file @zip@ è stato scaricato',
707
-	'plugins_actif_aucun' => 'Nessun plugin attivo',
708
-	'plugins_actif_un' => 'Un plugin attivo',
709
-	'plugins_actifs' => '@count@ plug-in attivati.',
710
-	'plugins_actifs_liste' => 'Attivo',
711
-	'plugins_compte' => '@count@ plug-in',
712
-	'plugins_disponible_un' => 'Un plugin disponibile',
713
-	'plugins_disponibles' => '@count@ plug-in disponibili.',
714
-	'plugins_erreur' => 'Errore nei plug-in: @plugins@',
715
-	'plugins_liste' => 'Elenco dei plugin',
716
-	'plugins_liste_dist' => 'Plugin bloccato',
717
-	'plugins_recents' => 'Plugin aggiunti recentemente',
718
-	'plugins_tous_liste' => 'Tutto',
719
-	'plugins_vue_hierarchie' => 'Struttura gerarchica',
720
-	'plugins_vue_liste' => 'Elenco',
721
-	'protocole_ldap' => 'Versione del protocollo:',
646
+    // P
647
+    'page_pas_proxy' => 'Questa pagina non deve passare attraverso il proxy',
648
+    'pas_de_proxy_pour' => 'Se necessario, indicare i server o i domini per i quali non si deve applicare questo proxy (per esempio: @exemple@)',
649
+    'phpinfo' => 'Configurazione PHP',
650
+    'plugin_charge_paquet' => 'Caricamento del pacchetto @name@',
651
+    'plugin_charger' => 'Download',
652
+    'plugin_erreur_charger' => 'errore: impossibile caricare @zip@',
653
+    'plugin_erreur_droit1' => 'La directory <code>@dest@</code> non ha i permessi di scrittura.',
654
+    'plugin_erreur_droit2' => 'Verificare i diritti su questa directory (se necessario crearla), o installare i file tramite FTP.',
655
+    'plugin_erreur_zip' => 'fallimento pclzip: errore @status@',
656
+    'plugin_etat_developpement' => 'in corso di sviluppo',
657
+    'plugin_etat_experimental' => 'sperimentale',
658
+    'plugin_etat_stable' => 'stabile',
659
+    'plugin_etat_test' => 'in prova',
660
+    'plugin_impossible_activer' => 'Impossibile attivare l’estensione @plugin@',
661
+    'plugin_info_automatique1' => 'Se si desidera autorizzare l’installazione automatica dell’estensione è necessario: ',
662
+    'plugin_info_automatique1_lib' => 'Se vuoi autorizzare l’installazione automatica di questa libreria:',
663
+    'plugin_info_automatique2' => 'creare una directory <code>@rep@</code>;',
664
+    'plugin_info_automatique3' => 'verificare che il server sia autorizzato a scrivere in questa directory.',
665
+    'plugin_info_automatique_creer' => 'da creare alla radice del sito.',
666
+    'plugin_info_automatique_exemples' => 'esempi:',
667
+    'plugin_info_automatique_ftp' => 'È possibile installare plug-in tramite FTP, nella cartella <tt>@rep@</tt>',
668
+    'plugin_info_automatique_lib' => 'Alcune estensioni richiedono anche di poter trasferire dei file nella cartella <code>lib/</code>, da creare (se necessario) alla radice del sito.',
669
+    'plugin_info_automatique_liste' => 'Gli elenchi delle estensioni:',
670
+    'plugin_info_automatique_liste_officielle' => 'le estensioni ufficiali',
671
+    'plugin_info_automatique_liste_update' => 'Aggiornare gli elenchi',
672
+    'plugin_info_automatique_ou' => 'oppure...',
673
+    'plugin_info_automatique_select' => 'Selezionata un’estensione qui sotto: SPIP la scaricherà e la installerà nella cartella <code>@rep@</code>; se questo estensione è già presente verrà aggiornata.',
674
+    'plugin_info_credit' => 'Crediti',
675
+    'plugin_info_erreur_xml' => 'La dichiarazione del plugin è sbagliata',
676
+    'plugin_info_install_ok' => 'Installazione completata con successo',
677
+    'plugin_info_necessite' => 'Richiesto :',
678
+    'plugin_info_non_compatible_spip' => 'Questo plugin è incompatibile con questa versione di SPIP',
679
+    'plugin_info_plugins_dist_1' => 'Le estensioni sottostanti sono caricate e attivate nella directory @plugins_dist@.',
680
+    'plugin_info_plugins_dist_2' => 'Questi non possono essere disabilitati.',
681
+    'plugin_info_telecharger' => 'da scaricare da @url@ e da installare in @rep@',
682
+    'plugin_info_upgrade_ok' => 'Aggiornamento avvenuto',
683
+    'plugin_librairies_installees' => 'Librerie installate',
684
+    'plugin_necessite_extension_php' => 'Richiede l’estensione PHP @plugin@ in versione @version@.',
685
+    'plugin_necessite_extension_php_sans_version' => 'Richiede l’estensione PHP @plugin@',
686
+    'plugin_necessite_lib' => 'Questa estensione richiede la libreria @lib@',
687
+    'plugin_necessite_php' => 'Richiede @plugin@ in versione @version@.',
688
+    'plugin_necessite_plugin' => 'Necessita l’estensione @plugin@ con la versione @version@.',
689
+    'plugin_necessite_plugin_sans_version' => 'Necessita del plugin @plugin@',
690
+    'plugin_necessite_spip' => 'Necessita SPIP con almeno la versione @version@.',
691
+    'plugin_source' => 'origine: ',
692
+    'plugin_titre_automatique' => 'Installazione automatica',
693
+    'plugin_titre_automatique_ajouter' => 'Aggiungere dei plugin',
694
+    'plugin_titre_installation' => 'Installazione del plugin @plugin@',
695
+    'plugin_titre_modifier' => 'I miei plugin',
696
+    'plugin_utilise_extension_php' => 'Usa l’estensione PHP @plugin@ in versione @version@.',
697
+    'plugin_utilise_php' => 'Utilizza @plugin@ in versione @version@.',
698
+    'plugin_utilise_plugin' => 'Utilizza il plugin @plugin@ in versione @version@.',
699
+    'plugin_zip_active' => 'Continuare per attivarlo',
700
+    'plugin_zip_adresse' => 'indicate qui sotto l’indirizzo di un file zip del plug-in da scaricare, oppure l’indirizzo di un elenco di plug-in.',
701
+    'plugin_zip_adresse_champ' => 'Indirizzo del plug-in o dell’elenco ',
702
+    'plugin_zip_content' => 'Esso contiene i file seguenti (@taille@),<br />pronti per essere installati nella cartella <code>@rep@</code>',
703
+    'plugin_zip_installe_finie' => 'Il file @zip@ è stato decompresso e installato.',
704
+    'plugin_zip_installe_rep_finie' => 'Il file @zip@ è stato decompresso e installato nella cartella @rep@',
705
+    'plugin_zip_installer' => 'Ora è possibile installarlo.',
706
+    'plugin_zip_telecharge' => 'Il file @zip@ è stato scaricato',
707
+    'plugins_actif_aucun' => 'Nessun plugin attivo',
708
+    'plugins_actif_un' => 'Un plugin attivo',
709
+    'plugins_actifs' => '@count@ plug-in attivati.',
710
+    'plugins_actifs_liste' => 'Attivo',
711
+    'plugins_compte' => '@count@ plug-in',
712
+    'plugins_disponible_un' => 'Un plugin disponibile',
713
+    'plugins_disponibles' => '@count@ plug-in disponibili.',
714
+    'plugins_erreur' => 'Errore nei plug-in: @plugins@',
715
+    'plugins_liste' => 'Elenco dei plugin',
716
+    'plugins_liste_dist' => 'Plugin bloccato',
717
+    'plugins_recents' => 'Plugin aggiunti recentemente',
718
+    'plugins_tous_liste' => 'Tutto',
719
+    'plugins_vue_hierarchie' => 'Struttura gerarchica',
720
+    'plugins_vue_liste' => 'Elenco',
721
+    'protocole_ldap' => 'Versione del protocollo:',
722 722
 
723
-	// Q
724
-	'queue_executer_maintenant' => 'Esegui adesso',
725
-	'queue_info_purger' => 'È possibile eliminare tutti i lavori in sospeso e reinizializzare la lista con delle elaborazioni periodiche',
726
-	'queue_nb_jobs_in_queue' => '@nb@ processi in coda',
727
-	'queue_next_job_in_nb_sec' => 'Prossimo processo in @nb@ s',
728
-	'queue_no_job_in_queue' => 'Nessun processo appeso',
729
-	'queue_one_job_in_queue' => '1 processo in coda',
730
-	'queue_priorite_tache' => 'priorità',
731
-	'queue_purger_queue' => 'Pulisci la coda dei processi',
732
-	'queue_titre' => 'Lista dei processi',
723
+    // Q
724
+    'queue_executer_maintenant' => 'Esegui adesso',
725
+    'queue_info_purger' => 'È possibile eliminare tutti i lavori in sospeso e reinizializzare la lista con delle elaborazioni periodiche',
726
+    'queue_nb_jobs_in_queue' => '@nb@ processi in coda',
727
+    'queue_next_job_in_nb_sec' => 'Prossimo processo in @nb@ s',
728
+    'queue_no_job_in_queue' => 'Nessun processo appeso',
729
+    'queue_one_job_in_queue' => '1 processo in coda',
730
+    'queue_priorite_tache' => 'priorità',
731
+    'queue_purger_queue' => 'Pulisci la coda dei processi',
732
+    'queue_titre' => 'Lista dei processi',
733 733
 
734
-	// R
735
-	'repertoire_plugins' => 'Cartella:',
736
-	'required' => '(Obbligatorio)',
734
+    // R
735
+    'repertoire_plugins' => 'Cartella:',
736
+    'required' => '(Obbligatorio)',
737 737
 
738
-	// S
739
-	'sans_heure' => 'ora mancante',
740
-	'statut_admin_restreint' => 'ammin. parziale',
741
-	'statut_webmestre' => 'webmaster',
738
+    // S
739
+    'sans_heure' => 'ora mancante',
740
+    'statut_admin_restreint' => 'ammin. parziale',
741
+    'statut_webmestre' => 'webmaster',
742 742
 
743
-	// T
744
-	'tache_cron_asap' => 'Task CRON @function@ (ASAP)',
745
-	'tache_cron_secondes' => 'Task CRON @function@ (ogni @nb@ s)',
746
-	'taille_cache_image' => 'Le immagini elaborate automaticamente da SPIP (icone dei documenti, titoli in formato grafico, funzioni matematiche in formato TeX...) occupano nella cartella @dir@ in tutto @taille@.',
747
-	'taille_cache_infinie' => 'Questo sito non prevede limiti alle dimensioni della cartella della cache.',
748
-	'taille_cache_maxi' => 'SPIP tenta di limitare le dimensioni della cartella della cache di questo sito a circa <b>@octets@</b> di dati.',
749
-	'taille_cache_moins_de' => 'La dimensione della cache è inferiore a @octets@.',
750
-	'taille_cache_octets' => 'La cartella della cache occupa attualmente @octets@ su disco.',
751
-	'taille_cache_vide' => 'La cache è vuota.',
752
-	'taille_repertoire_cache' => 'Dimensioni della cartella di cache',
753
-	'text_article_propose_publication' => 'Articolo proposto per la pubblicazione. ',
754
-	'texte_acces_ldap_anonyme_1' => 'Alcuni server LDAP non consentono accessi anonimi. In questo caso si deve specificare un identificatore d’accesso iniziale al fine di poter poi ricercare delle informazioni nell’elenco. Nella maggior parte dei casi tuttavia, i campi seguenti potranno essere lasciati vuoti.',
755
-	'texte_admin_effacer_01' => 'Questo commando cancella <i>tutto</i> il contenuto del database,
743
+    // T
744
+    'tache_cron_asap' => 'Task CRON @function@ (ASAP)',
745
+    'tache_cron_secondes' => 'Task CRON @function@ (ogni @nb@ s)',
746
+    'taille_cache_image' => 'Le immagini elaborate automaticamente da SPIP (icone dei documenti, titoli in formato grafico, funzioni matematiche in formato TeX...) occupano nella cartella @dir@ in tutto @taille@.',
747
+    'taille_cache_infinie' => 'Questo sito non prevede limiti alle dimensioni della cartella della cache.',
748
+    'taille_cache_maxi' => 'SPIP tenta di limitare le dimensioni della cartella della cache di questo sito a circa <b>@octets@</b> di dati.',
749
+    'taille_cache_moins_de' => 'La dimensione della cache è inferiore a @octets@.',
750
+    'taille_cache_octets' => 'La cartella della cache occupa attualmente @octets@ su disco.',
751
+    'taille_cache_vide' => 'La cache è vuota.',
752
+    'taille_repertoire_cache' => 'Dimensioni della cartella di cache',
753
+    'text_article_propose_publication' => 'Articolo proposto per la pubblicazione. ',
754
+    'texte_acces_ldap_anonyme_1' => 'Alcuni server LDAP non consentono accessi anonimi. In questo caso si deve specificare un identificatore d’accesso iniziale al fine di poter poi ricercare delle informazioni nell’elenco. Nella maggior parte dei casi tuttavia, i campi seguenti potranno essere lasciati vuoti.',
755
+    'texte_admin_effacer_01' => 'Questo commando cancella <i>tutto</i> il contenuto del database,
756 756
  compresi <i>tutti</i> i login dei redattori e degli amministratori. Dopo averlo eseguito, dovrai riavviare la procedura di installazione per ricreare un nuovo database e un primo ID amministrativo.',
757
-	'texte_adresse_annuaire_1' => '(Se la rubrica è installata nella stessa macchina di questo sito, dovrai probabilmente inserire "localhost".)',
758
-	'texte_ajout_auteur' => 'Il seguente autore è stato aggiunto all’articolo:',
759
-	'texte_annuaire_ldap_1' => 'Se hai accesso ad una rubrica (LDAP), puoi utilizzarla per importare automaticamente degli utenti sotto SPIP.',
760
-	'texte_article_statut' => 'Questo articolo è:',
761
-	'texte_article_virtuel' => 'Articolo virtuale',
762
-	'texte_article_virtuel_reference' => '<b>Articolo virtuale:</b> articolo citato nel tuo sito SPIP, ma reindrizzato verso un’altro URL. Per eliminare il reindirizzamento, cancella l’URL qui sopra.',
763
-	'texte_aucun_resultat_auteur' => 'Nessun risultato per "@cherche_auteur@"',
764
-	'texte_auteur_messagerie' => 'Questo sito può costantemente visualizzare la lista dei redattori collegati, permettendo lo scambio di messaggi in tempo reale. Si può però decidere di non comparire in questo elenco (rendendosi quindi «invisibili» agli altri utenti).',
765
-	'texte_auteurs' => 'GLI AUTORI',
766
-	'texte_choix_base_1' => 'Scegli il database:',
767
-	'texte_choix_base_2' => 'Il server SQL contiene diversi database.',
768
-	'texte_choix_base_3' => '<b>Seleziona</b> quello che è stato attribuito al tuo dominio:',
769
-	'texte_choix_table_prefix' => 'Prefisso delle tabelle:',
770
-	'texte_compte_element' => '@count@ elemento',
771
-	'texte_compte_elements' => '@count@ elementi',
772
-	'texte_conflit_edition_correction' => 'Controllare qui sotto le differenze tra le due versioni del testo; è possibile anche copiare le modifiche e poi ricominciare.',
773
-	'texte_connexion_mysql' => 'Consulta le informazioni fornite dal tuo hoster: devi poterci trovare i codici di collegamento alla base di dati.',
774
-	'texte_contenu_article' => 'Contenuto dell’articolo in poche parole (<em>abstract</em>)',
775
-	'texte_contenu_articles' => 'A seconda del modello di presentazione adottato per il sito, puoi decidere
757
+    'texte_adresse_annuaire_1' => '(Se la rubrica è installata nella stessa macchina di questo sito, dovrai probabilmente inserire "localhost".)',
758
+    'texte_ajout_auteur' => 'Il seguente autore è stato aggiunto all’articolo:',
759
+    'texte_annuaire_ldap_1' => 'Se hai accesso ad una rubrica (LDAP), puoi utilizzarla per importare automaticamente degli utenti sotto SPIP.',
760
+    'texte_article_statut' => 'Questo articolo è:',
761
+    'texte_article_virtuel' => 'Articolo virtuale',
762
+    'texte_article_virtuel_reference' => '<b>Articolo virtuale:</b> articolo citato nel tuo sito SPIP, ma reindrizzato verso un’altro URL. Per eliminare il reindirizzamento, cancella l’URL qui sopra.',
763
+    'texte_aucun_resultat_auteur' => 'Nessun risultato per "@cherche_auteur@"',
764
+    'texte_auteur_messagerie' => 'Questo sito può costantemente visualizzare la lista dei redattori collegati, permettendo lo scambio di messaggi in tempo reale. Si può però decidere di non comparire in questo elenco (rendendosi quindi «invisibili» agli altri utenti).',
765
+    'texte_auteurs' => 'GLI AUTORI',
766
+    'texte_choix_base_1' => 'Scegli il database:',
767
+    'texte_choix_base_2' => 'Il server SQL contiene diversi database.',
768
+    'texte_choix_base_3' => '<b>Seleziona</b> quello che è stato attribuito al tuo dominio:',
769
+    'texte_choix_table_prefix' => 'Prefisso delle tabelle:',
770
+    'texte_compte_element' => '@count@ elemento',
771
+    'texte_compte_elements' => '@count@ elementi',
772
+    'texte_conflit_edition_correction' => 'Controllare qui sotto le differenze tra le due versioni del testo; è possibile anche copiare le modifiche e poi ricominciare.',
773
+    'texte_connexion_mysql' => 'Consulta le informazioni fornite dal tuo hoster: devi poterci trovare i codici di collegamento alla base di dati.',
774
+    'texte_contenu_article' => 'Contenuto dell’articolo in poche parole (<em>abstract</em>)',
775
+    'texte_contenu_articles' => 'A seconda del modello di presentazione adottato per il sito, puoi decidere
776 776
 che alcuni elementi degli articoli siano utilizzati oppure no.
777 777
 Serviti dell’elenco qui sotto per indicare quali elementi rendere disponibili.',
778
-	'texte_crash_base' => 'Se il database è stato danneggiato, puoi tentare un ripristino automatico.',
779
-	'texte_creer_rubrique' => 'Prima di poter scrivere degli articoli,<br /> devi creare una rubrica.',
780
-	'texte_date_creation_article' => 'DATA DI CREAZIONE DELL’ARTICOLO:',
781
-	'texte_date_creation_objet' => 'Data di creazione :', # on ajoute le &quot;:&quot;
782
-	'texte_date_publication_anterieure' => 'DATA DI REDAZIONE ANTERIORE',
783
-	'texte_date_publication_anterieure_nonaffichee' => 'Non visualizzare la data di redazione anteriore.',
784
-	'texte_date_publication_article' => 'DATA DI PUBBLICAZIONE:',
785
-	'texte_date_publication_objet' => 'Pubblicato il :',
786
-	'texte_definir_comme_traduction_rubrique' => 'Questa rubrica è una traduzione della rubrica numero:',
787
-	'texte_descriptif_rapide' => 'Descrizione rapida',
788
-	'texte_effacer_base' => 'Cancella il database SPIP',
789
-	'texte_effacer_statistiques' => 'Cancellare le statistiche',
790
-	'texte_en_cours_validation' => 'Gli articoli e le brevi elencati qui sotto sono stati proposti per la pubblicazione. ',
791
-	'texte_enrichir_mise_a_jour' => 'Puoi arricchire la formattazione del testo utilizzando le «scorciatoie tipografiche»',
792
-	'texte_fichier_authent' => '<b>SPIP deve creare i file speciali <tt>.htpasswd</tt>
778
+    'texte_crash_base' => 'Se il database è stato danneggiato, puoi tentare un ripristino automatico.',
779
+    'texte_creer_rubrique' => 'Prima di poter scrivere degli articoli,<br /> devi creare una rubrica.',
780
+    'texte_date_creation_article' => 'DATA DI CREAZIONE DELL’ARTICOLO:',
781
+    'texte_date_creation_objet' => 'Data di creazione :', # on ajoute le &quot;:&quot;
782
+    'texte_date_publication_anterieure' => 'DATA DI REDAZIONE ANTERIORE',
783
+    'texte_date_publication_anterieure_nonaffichee' => 'Non visualizzare la data di redazione anteriore.',
784
+    'texte_date_publication_article' => 'DATA DI PUBBLICAZIONE:',
785
+    'texte_date_publication_objet' => 'Pubblicato il :',
786
+    'texte_definir_comme_traduction_rubrique' => 'Questa rubrica è una traduzione della rubrica numero:',
787
+    'texte_descriptif_rapide' => 'Descrizione rapida',
788
+    'texte_effacer_base' => 'Cancella il database SPIP',
789
+    'texte_effacer_statistiques' => 'Cancellare le statistiche',
790
+    'texte_en_cours_validation' => 'Gli articoli e le brevi elencati qui sotto sono stati proposti per la pubblicazione. ',
791
+    'texte_enrichir_mise_a_jour' => 'Puoi arricchire la formattazione del testo utilizzando le «scorciatoie tipografiche»',
792
+    'texte_fichier_authent' => '<b>SPIP deve creare i file speciali <tt>.htpasswd</tt>
793 793
 e <tt>.htpasswd-admin</tt> nella cartella @dossier@?</b>
794 794
 <p> Questi file possono servire a limitare l’accesso agli autori
795 795
 e agli amministratori in particolari aree del sito
796 796
 (per esempio, per un programma esterno di statistiche).</p>
797 797
 <p> Se ciò non è necessario, lasciare quest’opzione al suo valore predefinito (nessuna creazione 
798 798
 di file).</p>',
799
-	'texte_informations_personnelles_1' => 'Il sistema creerà un tuo accesso personalizzato al sito.',
800
-	'texte_informations_personnelles_2' => '(Nota: se si tratta di una reinstallazione, e il tuo accesso funziona ancora, puoi ',
801
-	'texte_introductif_article' => 'Testo introduttivo dell’articolo',
802
-	'texte_jeu_caractere' => 'Si consiglia di utilizzare sul proprio sito l’alfabeto universale (<tt>utf-8</tt>): esso permette di visualizzare i testi in tutte le lingue e non pone problemi di compatibilità con i browser moderni.',
803
-	'texte_jeu_caractere_3' => 'Il tuo sito usa attualmente il set di caratteri:',
804
-	'texte_jeu_caractere_4' => 'Se ciò non corrisponde alla realtà dei propri dati (a causa, per esempio, di un ripristino del database), o se  <em>si avvia il sito</em> e si desidera partire con un altro set di caratteri è necessario indicare quest’ultimo qui:',
805
-	'texte_login_ldap_1' => '(Lascia vuoto per un accesso anonimo, o inserisci il percorso completo, per esempio «<tt>uid=rossi, ou=users, dc=mio-dominio, dc=com</tt> ».)',
806
-	'texte_login_precaution' => 'Attenzione! Questo è l’ID con il quale sei attualmente collegato.
799
+    'texte_informations_personnelles_1' => 'Il sistema creerà un tuo accesso personalizzato al sito.',
800
+    'texte_informations_personnelles_2' => '(Nota: se si tratta di una reinstallazione, e il tuo accesso funziona ancora, puoi ',
801
+    'texte_introductif_article' => 'Testo introduttivo dell’articolo',
802
+    'texte_jeu_caractere' => 'Si consiglia di utilizzare sul proprio sito l’alfabeto universale (<tt>utf-8</tt>): esso permette di visualizzare i testi in tutte le lingue e non pone problemi di compatibilità con i browser moderni.',
803
+    'texte_jeu_caractere_3' => 'Il tuo sito usa attualmente il set di caratteri:',
804
+    'texte_jeu_caractere_4' => 'Se ciò non corrisponde alla realtà dei propri dati (a causa, per esempio, di un ripristino del database), o se  <em>si avvia il sito</em> e si desidera partire con un altro set di caratteri è necessario indicare quest’ultimo qui:',
805
+    'texte_login_ldap_1' => '(Lascia vuoto per un accesso anonimo, o inserisci il percorso completo, per esempio «<tt>uid=rossi, ou=users, dc=mio-dominio, dc=com</tt> ».)',
806
+    'texte_login_precaution' => 'Attenzione! Questo è l’ID con il quale sei attualmente collegato.
807 807
 Utilizza questo modulo con cognizione di causa...',
808
-	'texte_messagerie_agenda' => 'La messageria permette ai redattori del sito di comunicare tra loro in maniera diretta nell’area riservata. Essa è associata a una agenda.',
809
-	'texte_mise_a_niveau_base_1' => 'Hai aggiornato i file SPIP.
808
+    'texte_messagerie_agenda' => 'La messageria permette ai redattori del sito di comunicare tra loro in maniera diretta nell’area riservata. Essa è associata a una agenda.',
809
+    'texte_mise_a_niveau_base_1' => 'Hai aggiornato i file SPIP.
810 810
 Adesso è necessario aggiornare il database.',
811
-	'texte_modifier_article' => 'Modifica l’articolo:',
812
-	'texte_multilinguisme' => 'Se desideri gestire gli articoli in diverse lingue, con un sistema di navigazione complesso, è possibile aggiungere un menu di selezione della lingua in funzione della struttura del sito.',
813
-	'texte_multilinguisme_trad' => 'È anche possibile attivare un sistema di gestione dei link fra le diverse traduzioni di un certo oggetto.',
814
-	'texte_non_compresse' => '<i>non compresso</i> (il tuo server non supporta questa funzionalità)',
815
-	'texte_nouvelle_version_spip_1' => 'Hai installato una nuova versione di SPIP.',
816
-	'texte_nouvelle_version_spip_2' => 'Questa nuova versione necessita un aggiornamento più radicale del solito. Se sei il webmaster del sito, cancella il file @connect@ e riprendi l’installazione al fine di aggiornare i parametri di connessione al database.<p> (NB: se hai dimenticato i parametri di connessione, rileggi il file @connect@ prima di cancellarlo!)</p>',
817
-	'texte_operation_echec' => 'Torna alla pagina precedente, seleziona un altro database o creane uno nuovo. Verifica le informazioni fornite dal tuo hoster.',
818
-	'texte_plus_trois_car' => 'più di tre caratteri',
819
-	'texte_plusieurs_articles' => 'Diversi autori trovati per "@cherche_auteur@":',
820
-	'texte_port_annuaire' => '(Il valore predefinito è in genere quello adatto.)',
821
-	'texte_presente_plugin' => 'Questa pagina elenca i plugin disponibili sul sito. È possibile attivare i plugin necessari selezionando la casella corrispondente.',
822
-	'texte_proposer_publication' => 'Quando l’articolo è completo,<br /> puoi proporne la pubblicazione.',
823
-	'texte_proxy' => 'In alcuni casi (intranet, reti protette...), i siti distanti (documetazione di SPIP, siti in syndication, ecc.) sono accessibili unicamente attraverso un <i>proxy HTTP</i>. In questo caso, va indicato l’indirizzo del server nella forma @proxy_en_cours@. In genere questa casella va lasciata vuota.',
824
-	'texte_publication_articles_post_dates' => 'Come si deve comportare SPIP quando gli articoli hanno
811
+    'texte_modifier_article' => 'Modifica l’articolo:',
812
+    'texte_multilinguisme' => 'Se desideri gestire gli articoli in diverse lingue, con un sistema di navigazione complesso, è possibile aggiungere un menu di selezione della lingua in funzione della struttura del sito.',
813
+    'texte_multilinguisme_trad' => 'È anche possibile attivare un sistema di gestione dei link fra le diverse traduzioni di un certo oggetto.',
814
+    'texte_non_compresse' => '<i>non compresso</i> (il tuo server non supporta questa funzionalità)',
815
+    'texte_nouvelle_version_spip_1' => 'Hai installato una nuova versione di SPIP.',
816
+    'texte_nouvelle_version_spip_2' => 'Questa nuova versione necessita un aggiornamento più radicale del solito. Se sei il webmaster del sito, cancella il file @connect@ e riprendi l’installazione al fine di aggiornare i parametri di connessione al database.<p> (NB: se hai dimenticato i parametri di connessione, rileggi il file @connect@ prima di cancellarlo!)</p>',
817
+    'texte_operation_echec' => 'Torna alla pagina precedente, seleziona un altro database o creane uno nuovo. Verifica le informazioni fornite dal tuo hoster.',
818
+    'texte_plus_trois_car' => 'più di tre caratteri',
819
+    'texte_plusieurs_articles' => 'Diversi autori trovati per "@cherche_auteur@":',
820
+    'texte_port_annuaire' => '(Il valore predefinito è in genere quello adatto.)',
821
+    'texte_presente_plugin' => 'Questa pagina elenca i plugin disponibili sul sito. È possibile attivare i plugin necessari selezionando la casella corrispondente.',
822
+    'texte_proposer_publication' => 'Quando l’articolo è completo,<br /> puoi proporne la pubblicazione.',
823
+    'texte_proxy' => 'In alcuni casi (intranet, reti protette...), i siti distanti (documetazione di SPIP, siti in syndication, ecc.) sono accessibili unicamente attraverso un <i>proxy HTTP</i>. In questo caso, va indicato l’indirizzo del server nella forma @proxy_en_cours@. In genere questa casella va lasciata vuota.',
824
+    'texte_publication_articles_post_dates' => 'Come si deve comportare SPIP quando gli articoli hanno
825 825
 una data di pubblicazione impostata nel futuro?',
826
-	'texte_rappel_selection_champs' => '[Non dimenticare di impostare correttamente questo campo]',
827
-	'texte_recalcul_page' => 'Se vuoi rigenerare
826
+    'texte_rappel_selection_champs' => '[Non dimenticare di impostare correttamente questo campo]',
827
+    'texte_recalcul_page' => 'Se vuoi rigenerare
828 828
 una sola pagina, utilizza piuttosto lo spazio pubblico e clicca sul pulsante «rigenera».',
829
-	'texte_recuperer_base' => 'Ripara il database',
830
-	'texte_reference_mais_redirige' => 'articolo catalogato nel tuo sito SPIP, ma con reindirizzamento verso un altro URL.',
831
-	'texte_requetes_echouent' => '<b>Quando alcune query SQL falliscono
829
+    'texte_recuperer_base' => 'Ripara il database',
830
+    'texte_reference_mais_redirige' => 'articolo catalogato nel tuo sito SPIP, ma con reindirizzamento verso un altro URL.',
831
+    'texte_requetes_echouent' => '<b>Quando alcune query SQL falliscono
832 832
 ripetutamente e senza un chiaro motivo, è possibile
833 833
 che sia per colpa del database stesso.</b><p>
834 834
 Il server SQL dispone di una funzione di ripristino delle tabelle
@@ -836,87 +836,87 @@  discard block
 block discarded – undo
836 836
 in caso di errore, conservare una copia del messaggio visualizzato che potrebbe contenere 
837 837
 delle informazioni utili per identificare il problema.</p><p>
838 838
 Se il problema persiste, contattare il proprio fornitore di hosting.</p>',
839
-	'texte_selection_langue_principale' => 'Puoi selezionare qui sotto la «lingua predefinita» del sito. Questa scelta non obbliga - fortunatamente! - a scrivere gli articoli nella stessa lingua, ma permette di determinare:
839
+    'texte_selection_langue_principale' => 'Puoi selezionare qui sotto la «lingua predefinita» del sito. Questa scelta non obbliga - fortunatamente! - a scrivere gli articoli nella stessa lingua, ma permette di determinare:
840 840
 <ul><li> il formato di default delle date sul sito pubblico;</li>
841 841
 <li> la tipologia di motore tipografico che SPIP deve utilizzare per la resa del testo;</li>
842 842
 <li> la lingua utilizzata nelle finestre di dialogo del sito pubblico;</li>
843 843
 <li> la lingua di default nell’area riservata all’amministrazione.</li></ul>',
844
-	'texte_sous_titre' => 'Sottotitolo',
845
-	'texte_statistiques_visites' => '(barre scure:  domenica / curve scure: evoluzione della media)',
846
-	'texte_statut_attente_validation' => 'in attesa di convalida',
847
-	'texte_statut_publies' => 'pubblicato on line',
848
-	'texte_statut_refuses' => 'rifiutati',
849
-	'texte_suppression_fichiers' => 'Utilizza questo commando per cancellare tutti i file presenti nella
844
+    'texte_sous_titre' => 'Sottotitolo',
845
+    'texte_statistiques_visites' => '(barre scure:  domenica / curve scure: evoluzione della media)',
846
+    'texte_statut_attente_validation' => 'in attesa di convalida',
847
+    'texte_statut_publies' => 'pubblicato on line',
848
+    'texte_statut_refuses' => 'rifiutati',
849
+    'texte_suppression_fichiers' => 'Utilizza questo commando per cancellare tutti i file presenti nella
850 850
 cache di SPIP. Ciò permette ad esempio di forzare la rigenerazione di tutte le pagine se hai fatto delle importanti modifiche di grafica o di struttura del sito.',
851
-	'texte_sur_titre' => 'Occhiello',
852
-	'texte_table_ok' => ': questa tabella è OK.',
853
-	'texte_tentative_recuperation' => 'Tentativo di ripristino',
854
-	'texte_tenter_reparation' => 'Tenta un ripristino del database',
855
-	'texte_test_proxy' => 'Per fare una prova di questo proxy, indicare qui l’indirizzo
851
+    'texte_sur_titre' => 'Occhiello',
852
+    'texte_table_ok' => ': questa tabella è OK.',
853
+    'texte_tentative_recuperation' => 'Tentativo di ripristino',
854
+    'texte_tenter_reparation' => 'Tenta un ripristino del database',
855
+    'texte_test_proxy' => 'Per fare una prova di questo proxy, indicare qui l’indirizzo
856 856
 di un sito Web da testare.',
857
-	'texte_titre_02' => 'Titolo:',
858
-	'texte_titre_obligatoire' => '<b>Titolo</b> [Obbligatorio]',
859
-	'texte_travail_article' => '@nom_auteur_modif@ ha lavorato su questo articolo @date_diff@ minuti fa',
860
-	'texte_travail_collaboratif' => 'Se diversi autori lavorano spesso sullo stesso articolo,
857
+    'texte_titre_02' => 'Titolo:',
858
+    'texte_titre_obligatoire' => '<b>Titolo</b> [Obbligatorio]',
859
+    'texte_travail_article' => '@nom_auteur_modif@ ha lavorato su questo articolo @date_diff@ minuti fa',
860
+    'texte_travail_collaboratif' => 'Se diversi autori lavorano spesso sullo stesso articolo,
861 861
 il sistema può segnalare gli articoli «aperti»
862 862
 di recente al fine di evitare modifiche simultanee.
863 863
 Questa opzione è disattivata di default
864 864
 per evitare di generare messaggi d’avvertimento intempestivi.',
865
-	'texte_vide' => 'vuoto',
866
-	'texte_vider_cache' => 'Svuota la cache',
867
-	'titre_admin_tech' => 'Manutenzione tecnica',
868
-	'titre_admin_vider' => 'Manutenzione tecnica',
869
-	'titre_ajouter_un_auteur' => 'Aggiungi un autore',
870
-	'titre_ajouter_un_mot' => 'Aggiungi una parola chiave',
871
-	'titre_cadre_afficher_article' => 'Visualizza gli articoli',
872
-	'titre_cadre_afficher_traductions' => 'Visualizzare lo stato delle traduzioni per le seguenti lingue:',
873
-	'titre_cadre_ajouter_auteur' => 'AGGIUNGI UN AUTORE: ',
874
-	'titre_cadre_interieur_rubrique' => 'All’interno della rubrica',
875
-	'titre_cadre_numero_auteur' => 'AUTORE NUMERO',
876
-	'titre_cadre_numero_objet' => '@objet@ NUMERO :',
877
-	'titre_cadre_signature_obligatoire' => '<b>Firma</b> [Obbligatoria]<br />',
878
-	'titre_config_contenu_notifications' => 'Notifiche',
879
-	'titre_config_contenu_prive' => 'Nell’area riservata',
880
-	'titre_config_contenu_public' => 'Sul sito pubblico',
881
-	'titre_config_fonctions' => 'Configurazione del sito',
882
-	'titre_config_langage' => 'Configura la lingua',
883
-	'titre_configuration' => 'Configurazione del sito',
884
-	'titre_configurer_preferences' => 'Configura le tue preferenze',
885
-	'titre_configurer_preferences_menus' => 'Imposta le tue preferenze di menù',
886
-	'titre_conflit_edition' => 'Conflitto all’atto dell’edizione',
887
-	'titre_connexion_ldap' => 'Opzioni: <b>La connessione LDAP</b>',
888
-	'titre_groupe_mots' => 'GRUPPO DI PAROLE CHIAVE:',
889
-	'titre_identite_site' => 'Identità del sito',
890
-	'titre_langue_article' => 'Lingua dell’articolo',
891
-	'titre_langue_rubrique' => 'Lingua della rubrica',
892
-	'titre_langue_trad_article' => 'LINGUA E TRADUZIONI DELL’ARTICOLO',
893
-	'titre_les_articles' => 'GLI ARTICOLI',
894
-	'titre_messagerie_agenda' => 'Messagistica e agenda',
895
-	'titre_naviguer_dans_le_site' => 'Navigare nel sito...',
896
-	'titre_nouvelle_rubrique' => 'Nuova rubrica',
897
-	'titre_numero_rubrique' => 'RUBRICA NUMERO:',
898
-	'titre_page_articles_edit' => 'Modifica: @titre@',
899
-	'titre_page_articles_page' => 'Gli articoli',
900
-	'titre_page_articles_tous' => 'Tutto il sito',
901
-	'titre_page_calendrier' => 'Calendario @nom_mois@ @annee@',
902
-	'titre_page_config_contenu' => 'Configurazione del sito',
903
-	'titre_page_delete_all' => 'eliminazione totale e irreversible',
904
-	'titre_page_recherche' => 'Risultati della ricerca @recherche@',
905
-	'titre_page_statistiques_referers' => 'Statistiche (link al tuo sito)',
906
-	'titre_page_upgrade' => 'Aggiornamento di SPIP',
907
-	'titre_preference_menus_favoris' => 'Menù preferiti',
908
-	'titre_publication_articles_post_dates' => 'Pubblicazione di articoli postdatati',
909
-	'titre_reparation' => 'Riparazione',
910
-	'titre_suivi_petition' => 'Monitoraggio delle petizioni',
911
-	'tls_ldap' => 'Transport Layer Security:',
912
-	'trad_article_traduction' => 'Tutte le versioni di questo articolo:',
913
-	'trad_delier' => 'Non collegare più questo articolo alle sue traduzioni',
914
-	'trad_lier' => 'Questo articolo è una traduzione dell’articolo numero:',
915
-	'trad_new' => 'Scrivere una nuova traduzione dell’articolo',
865
+    'texte_vide' => 'vuoto',
866
+    'texte_vider_cache' => 'Svuota la cache',
867
+    'titre_admin_tech' => 'Manutenzione tecnica',
868
+    'titre_admin_vider' => 'Manutenzione tecnica',
869
+    'titre_ajouter_un_auteur' => 'Aggiungi un autore',
870
+    'titre_ajouter_un_mot' => 'Aggiungi una parola chiave',
871
+    'titre_cadre_afficher_article' => 'Visualizza gli articoli',
872
+    'titre_cadre_afficher_traductions' => 'Visualizzare lo stato delle traduzioni per le seguenti lingue:',
873
+    'titre_cadre_ajouter_auteur' => 'AGGIUNGI UN AUTORE: ',
874
+    'titre_cadre_interieur_rubrique' => 'All’interno della rubrica',
875
+    'titre_cadre_numero_auteur' => 'AUTORE NUMERO',
876
+    'titre_cadre_numero_objet' => '@objet@ NUMERO :',
877
+    'titre_cadre_signature_obligatoire' => '<b>Firma</b> [Obbligatoria]<br />',
878
+    'titre_config_contenu_notifications' => 'Notifiche',
879
+    'titre_config_contenu_prive' => 'Nell’area riservata',
880
+    'titre_config_contenu_public' => 'Sul sito pubblico',
881
+    'titre_config_fonctions' => 'Configurazione del sito',
882
+    'titre_config_langage' => 'Configura la lingua',
883
+    'titre_configuration' => 'Configurazione del sito',
884
+    'titre_configurer_preferences' => 'Configura le tue preferenze',
885
+    'titre_configurer_preferences_menus' => 'Imposta le tue preferenze di menù',
886
+    'titre_conflit_edition' => 'Conflitto all’atto dell’edizione',
887
+    'titre_connexion_ldap' => 'Opzioni: <b>La connessione LDAP</b>',
888
+    'titre_groupe_mots' => 'GRUPPO DI PAROLE CHIAVE:',
889
+    'titre_identite_site' => 'Identità del sito',
890
+    'titre_langue_article' => 'Lingua dell’articolo',
891
+    'titre_langue_rubrique' => 'Lingua della rubrica',
892
+    'titre_langue_trad_article' => 'LINGUA E TRADUZIONI DELL’ARTICOLO',
893
+    'titre_les_articles' => 'GLI ARTICOLI',
894
+    'titre_messagerie_agenda' => 'Messagistica e agenda',
895
+    'titre_naviguer_dans_le_site' => 'Navigare nel sito...',
896
+    'titre_nouvelle_rubrique' => 'Nuova rubrica',
897
+    'titre_numero_rubrique' => 'RUBRICA NUMERO:',
898
+    'titre_page_articles_edit' => 'Modifica: @titre@',
899
+    'titre_page_articles_page' => 'Gli articoli',
900
+    'titre_page_articles_tous' => 'Tutto il sito',
901
+    'titre_page_calendrier' => 'Calendario @nom_mois@ @annee@',
902
+    'titre_page_config_contenu' => 'Configurazione del sito',
903
+    'titre_page_delete_all' => 'eliminazione totale e irreversible',
904
+    'titre_page_recherche' => 'Risultati della ricerca @recherche@',
905
+    'titre_page_statistiques_referers' => 'Statistiche (link al tuo sito)',
906
+    'titre_page_upgrade' => 'Aggiornamento di SPIP',
907
+    'titre_preference_menus_favoris' => 'Menù preferiti',
908
+    'titre_publication_articles_post_dates' => 'Pubblicazione di articoli postdatati',
909
+    'titre_reparation' => 'Riparazione',
910
+    'titre_suivi_petition' => 'Monitoraggio delle petizioni',
911
+    'tls_ldap' => 'Transport Layer Security:',
912
+    'trad_article_traduction' => 'Tutte le versioni di questo articolo:',
913
+    'trad_delier' => 'Non collegare più questo articolo alle sue traduzioni',
914
+    'trad_lier' => 'Questo articolo è una traduzione dell’articolo numero:',
915
+    'trad_new' => 'Scrivere una nuova traduzione dell’articolo',
916 916
 
917
-	// U
918
-	'utf8_convert_erreur_orig' => 'Errore: il set di caratteri @charset@ non è supportato.',
917
+    // U
918
+    'utf8_convert_erreur_orig' => 'Errore: il set di caratteri @charset@ non è supportato.',
919 919
 
920
-	// V
921
-	'version' => 'Versione:'
920
+    // V
921
+    'version' => 'Versione:'
922 922
 );
Please login to merge, or discard this patch.
ecrire/inc/filtres_mini.php 1 patch
Indentation   +99 added lines, -99 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 
@@ -35,20 +35,20 @@  discard block
 block discarded – undo
35 35
  * @return string URL nettoyée
36 36
  **/
37 37
 function resolve_path($url) {
38
-	[$url, $query] = array_pad(explode('?', $url, 2), 2, null);
39
-	while (
40
-		preg_match(',/\.?/,', $url, $regs)    # supprime // et /./
41
-		or preg_match(',/[^/]*/\.\./,S', $url, $regs)  # supprime /toto/../
42
-		or preg_match(',^/\.\./,S', $url, $regs) # supprime les /../ du haut
43
-	) {
44
-		$url = str_replace($regs[0], '/', $url);
45
-	}
38
+    [$url, $query] = array_pad(explode('?', $url, 2), 2, null);
39
+    while (
40
+        preg_match(',/\.?/,', $url, $regs)    # supprime // et /./
41
+        or preg_match(',/[^/]*/\.\./,S', $url, $regs)  # supprime /toto/../
42
+        or preg_match(',^/\.\./,S', $url, $regs) # supprime les /../ du haut
43
+    ) {
44
+        $url = str_replace($regs[0], '/', $url);
45
+    }
46 46
 
47
-	if ($query) {
48
-		$url .= '?' . $query;
49
-	}
47
+    if ($query) {
48
+        $url .= '?' . $query;
49
+    }
50 50
 
51
-	return '/' . preg_replace(',^/,S', '', $url);
51
+    return '/' . preg_replace(',^/,S', '', $url);
52 52
 }
53 53
 
54 54
 
@@ -69,44 +69,44 @@  discard block
 block discarded – undo
69 69
  **/
70 70
 function suivre_lien($url, $lien) {
71 71
 
72
-	$mot = null;
73
-	$get = null;
74
-	$hash = null;
75
-	if (preg_match(',^(mailto|javascript|data|tel|callto|file|ftp):,iS', $lien)) {
76
-		return $lien;
77
-	}
78
-	if (preg_match(';^((?:[a-z]{3,33}:)?//.*?)(/.*)?$;iS', $lien, $r)) {
79
-		$r = array_pad($r, 3, '');
72
+    $mot = null;
73
+    $get = null;
74
+    $hash = null;
75
+    if (preg_match(',^(mailto|javascript|data|tel|callto|file|ftp):,iS', $lien)) {
76
+        return $lien;
77
+    }
78
+    if (preg_match(';^((?:[a-z]{3,33}:)?//.*?)(/.*)?$;iS', $lien, $r)) {
79
+        $r = array_pad($r, 3, '');
80 80
 
81
-		return $r[1] . resolve_path($r[2]);
82
-	}
81
+        return $r[1] . resolve_path($r[2]);
82
+    }
83 83
 
84
-	# L'url site spip est un lien absolu aussi
85
-	if (isset($GLOBALS['meta']['adresse_site']) and $lien == $GLOBALS['meta']['adresse_site']) {
86
-		return $lien;
87
-	}
84
+    # L'url site spip est un lien absolu aussi
85
+    if (isset($GLOBALS['meta']['adresse_site']) and $lien == $GLOBALS['meta']['adresse_site']) {
86
+        return $lien;
87
+    }
88 88
 
89
-	# lien relatif, il faut verifier l'url de base
90
-	# commencer par virer la chaine de get de l'url de base
91
-	$dir = '/';
92
-	$debut = '';
93
-	if (preg_match(';^((?:[a-z]{3,7}:)?//[^/]+)(/.*?/?)?([^/#?]*)([?][^#]*)?(#.*)?$;S', $url, $regs)) {
94
-		$debut = $regs[1];
95
-		$dir = !strlen($regs[2]) ? '/' : $regs[2];
96
-		$mot = $regs[3];
97
-		$get = $regs[4] ?? '';
98
-		$hash = $regs[5] ?? '';
99
-	}
100
-	switch (substr($lien, 0, 1)) {
101
-		case '/':
102
-			return $debut . resolve_path($lien);
103
-		case '#':
104
-			return $debut . resolve_path($dir . $mot . $get . $lien);
105
-		case '':
106
-			return $debut . resolve_path($dir . $mot . $get . $hash);
107
-		default:
108
-			return $debut . resolve_path($dir . $lien);
109
-	}
89
+    # lien relatif, il faut verifier l'url de base
90
+    # commencer par virer la chaine de get de l'url de base
91
+    $dir = '/';
92
+    $debut = '';
93
+    if (preg_match(';^((?:[a-z]{3,7}:)?//[^/]+)(/.*?/?)?([^/#?]*)([?][^#]*)?(#.*)?$;S', $url, $regs)) {
94
+        $debut = $regs[1];
95
+        $dir = !strlen($regs[2]) ? '/' : $regs[2];
96
+        $mot = $regs[3];
97
+        $get = $regs[4] ?? '';
98
+        $hash = $regs[5] ?? '';
99
+    }
100
+    switch (substr($lien, 0, 1)) {
101
+        case '/':
102
+            return $debut . resolve_path($lien);
103
+        case '#':
104
+            return $debut . resolve_path($dir . $mot . $get . $lien);
105
+        case '':
106
+            return $debut . resolve_path($dir . $mot . $get . $hash);
107
+        default:
108
+            return $debut . resolve_path($dir . $lien);
109
+    }
110 110
 }
111 111
 
112 112
 
@@ -129,14 +129,14 @@  discard block
 block discarded – undo
129 129
  * @return string Texte ou URL (en absolus)
130 130
  **/
131 131
 function url_absolue($url, $base = '') {
132
-	if (strlen($url = trim($url)) == 0) {
133
-		return '';
134
-	}
135
-	if (!$base) {
136
-		$base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : '');
137
-	}
132
+    if (strlen($url = trim($url)) == 0) {
133
+        return '';
134
+    }
135
+    if (!$base) {
136
+        $base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : '');
137
+    }
138 138
 
139
-	return suivre_lien($base, $url);
139
+    return suivre_lien($base, $url);
140 140
 }
141 141
 
142 142
 /**
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
  * @return string
148 148
  */
149 149
 function protocole_implicite($url_absolue) {
150
-	return preg_replace(';^[a-z]{3,7}://;i', '//', $url_absolue);
150
+    return preg_replace(';^[a-z]{3,7}://;i', '//', $url_absolue);
151 151
 }
152 152
 
153 153
 /**
@@ -158,16 +158,16 @@  discard block
 block discarded – undo
158 158
  */
159 159
 function protocole_verifier($url_absolue, $protocoles_autorises = ['http','https']) {
160 160
 
161
-	if (preg_match(';^([a-z]{3,7})://;i', $url_absolue, $m)) {
162
-		$protocole = $m[1];
163
-		if (
164
-			in_array($protocole, $protocoles_autorises)
165
-			or in_array(strtolower($protocole), array_map('strtolower', $protocoles_autorises))
166
-		) {
167
-			return true;
168
-		}
169
-	}
170
-	return false;
161
+    if (preg_match(';^([a-z]{3,7})://;i', $url_absolue, $m)) {
162
+        $protocole = $m[1];
163
+        if (
164
+            in_array($protocole, $protocoles_autorises)
165
+            or in_array(strtolower($protocole), array_map('strtolower', $protocoles_autorises))
166
+        ) {
167
+            return true;
168
+        }
169
+    }
170
+    return false;
171 171
 }
172 172
 
173 173
 /**
@@ -184,27 +184,27 @@  discard block
 block discarded – undo
184 184
  * @return string Texte avec des URLs absolues
185 185
  **/
186 186
 function liens_absolus($texte, $base = '') {
187
-	if (preg_match_all(',(<(a|link|image|img|script)\s[^<>]*(href|src)=[^<>]*>),imsS', $texte, $liens, PREG_SET_ORDER)) {
188
-		if (!function_exists('extraire_attribut')) {
189
-			include_spip('inc/filtres');
190
-		}
191
-		foreach ($liens as $lien) {
192
-			foreach (['href', 'src'] as $attr) {
193
-				$href = extraire_attribut($lien[0], $attr) ?? '';
194
-				if (strlen($href) > 0) {
195
-					if (!preg_match(';^((?:[a-z]{3,7}:)?//);iS', $href)) {
196
-						$abs = url_absolue($href, $base);
197
-						if (rtrim($href, '/') !== rtrim($abs, '/') and !preg_match('/^#/', $href)) {
198
-							$texte_lien = inserer_attribut($lien[0], $attr, $abs);
199
-							$texte = str_replace($lien[0], $texte_lien, $texte);
200
-						}
201
-					}
202
-				}
203
-			}
204
-		}
205
-	}
187
+    if (preg_match_all(',(<(a|link|image|img|script)\s[^<>]*(href|src)=[^<>]*>),imsS', $texte, $liens, PREG_SET_ORDER)) {
188
+        if (!function_exists('extraire_attribut')) {
189
+            include_spip('inc/filtres');
190
+        }
191
+        foreach ($liens as $lien) {
192
+            foreach (['href', 'src'] as $attr) {
193
+                $href = extraire_attribut($lien[0], $attr) ?? '';
194
+                if (strlen($href) > 0) {
195
+                    if (!preg_match(';^((?:[a-z]{3,7}:)?//);iS', $href)) {
196
+                        $abs = url_absolue($href, $base);
197
+                        if (rtrim($href, '/') !== rtrim($abs, '/') and !preg_match('/^#/', $href)) {
198
+                            $texte_lien = inserer_attribut($lien[0], $attr, $abs);
199
+                            $texte = str_replace($lien[0], $texte_lien, $texte);
200
+                        }
201
+                    }
202
+                }
203
+            }
204
+        }
205
+    }
206 206
 
207
-	return $texte;
207
+    return $texte;
208 208
 }
209 209
 
210 210
 
@@ -220,11 +220,11 @@  discard block
 block discarded – undo
220 220
  * @return string Texte ou URL (en absolus)
221 221
  **/
222 222
 function abs_url($texte, $base = '') {
223
-	if ($GLOBALS['mode_abs_url'] == 'url') {
224
-		return url_absolue($texte, $base);
225
-	} else {
226
-		return liens_absolus($texte, $base);
227
-	}
223
+    if ($GLOBALS['mode_abs_url'] == 'url') {
224
+        return url_absolue($texte, $base);
225
+    } else {
226
+        return liens_absolus($texte, $base);
227
+    }
228 228
 }
229 229
 
230 230
 /**
@@ -237,11 +237,11 @@  discard block
 block discarded – undo
237 237
  * @return string
238 238
  */
239 239
 function spip_htmlspecialchars($string, $flags = null, $encoding = 'UTF-8', $double_encode = true) {
240
-	if (is_null($flags)) {
241
-		$flags = ENT_COMPAT | ENT_HTML401;
242
-	}
240
+    if (is_null($flags)) {
241
+        $flags = ENT_COMPAT | ENT_HTML401;
242
+    }
243 243
 
244
-	return htmlspecialchars($string, $flags, $encoding, $double_encode);
244
+    return htmlspecialchars($string, $flags, $encoding, $double_encode);
245 245
 }
246 246
 
247 247
 /**
@@ -254,9 +254,9 @@  discard block
 block discarded – undo
254 254
  * @return string
255 255
  */
256 256
 function spip_htmlentities($string, $flags = null, $encoding = 'UTF-8', $double_encode = true) {
257
-	if (is_null($flags)) {
258
-		$flags = ENT_COMPAT | ENT_HTML401;
259
-	}
257
+    if (is_null($flags)) {
258
+        $flags = ENT_COMPAT | ENT_HTML401;
259
+    }
260 260
 
261
-	return htmlentities($string, $flags, $encoding, $double_encode);
261
+    return htmlentities($string, $flags, $encoding, $double_encode);
262 262
 }
Please login to merge, or discard this patch.
ecrire/public/references.php 1 patch
Indentation   +546 added lines, -546 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Compilateur\References
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -41,14 +41,14 @@  discard block
 block discarded – undo
41 41
  *     - '' si une référence explicite incorrecte est envoyée
42 42
  */
43 43
 function index_boucle($p) {
44
-	if (strlen($p->nom_boucle)) {
45
-		// retourne l’index explicite demandé s’il existe
46
-		if (!empty($p->boucles[$p->nom_boucle])) {
47
-			return $p->nom_boucle;
48
-		}
49
-		return '';
50
-	}
51
-	return $p->id_boucle;
44
+    if (strlen($p->nom_boucle)) {
45
+        // retourne l’index explicite demandé s’il existe
46
+        if (!empty($p->boucles[$p->nom_boucle])) {
47
+            return $p->nom_boucle;
48
+        }
49
+        return '';
50
+    }
51
+    return $p->id_boucle;
52 52
 }
53 53
 
54 54
 
@@ -71,17 +71,17 @@  discard block
 block discarded – undo
71 71
  *     - '' si une référence explicite incorrecte est envoyée
72 72
  */
73 73
 function index_boucle_mere($p) {
74
-	if (strlen($p->nom_boucle)) {
75
-		// retourne l’index explicite demandé s’il existe
76
-		if (!empty($p->boucles[$p->nom_boucle])) {
77
-			return $p->nom_boucle;
78
-		}
79
-		return '';
80
-	}
81
-	if (!empty($p->descr['id_mere'])) {
82
-		return $p->descr['id_mere'];
83
-	}
84
-	return '';
74
+    if (strlen($p->nom_boucle)) {
75
+        // retourne l’index explicite demandé s’il existe
76
+        if (!empty($p->boucles[$p->nom_boucle])) {
77
+            return $p->nom_boucle;
78
+        }
79
+        return '';
80
+    }
81
+    if (!empty($p->descr['id_mere'])) {
82
+        return $p->descr['id_mere'];
83
+    }
84
+    return '';
85 85
 }
86 86
 
87 87
 /**
@@ -115,74 +115,74 @@  discard block
 block discarded – undo
115 115
  *     Code PHP pour obtenir le champ SQL
116 116
  */
117 117
 function index_pile(
118
-	$idb,
119
-	$nom_champ,
120
-	&$boucles,
121
-	$explicite = '',
122
-	$defaut = null,
123
-	$remonte_pile = true,
124
-	$select = true
118
+    $idb,
119
+    $nom_champ,
120
+    &$boucles,
121
+    $explicite = '',
122
+    $defaut = null,
123
+    $remonte_pile = true,
124
+    $select = true
125 125
 ) {
126
-	if (!is_string($defaut)) {
127
-		$defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)';
128
-	}
129
-
130
-	$idb_origine = $idb;
131
-	$nom_champ_origine = $nom_champ;
132
-
133
-	$i = 0;
134
-	if (strlen($explicite)) {
135
-		// Recherche d'un champ dans un etage superieur
136
-		while (($idb !== $explicite) && ($idb !== '')) {
137
-			#	spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
138
-			$i++;
139
-			$idb = $boucles[$idb]->id_parent;
140
-		}
141
-	}
142
-
143
-	#	spip_log("Cherche: $nom_champ a partir de '$idb'");
144
-	$nom_champ = strtolower($nom_champ);
145
-	$conditionnel = [];
146
-	// attention: entre la boucle nommee 0, "" et le tableau vide,
147
-	// il y a incoherences qu'il vaut mieux eviter
148
-	while (isset($boucles[$idb])) {
149
-		$joker = true;
150
-		// modifie $joker si tous les champs sont autorisés.
151
-		// $t = le select pour le champ, si on l'a trouvé (ou si joker)
152
-		// $c = le nom du champ demandé
153
-		[$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
154
-		if ($t) {
155
-			if ($select and !in_array($t, $boucles[$idb]->select)) {
156
-				$boucles[$idb]->select[] = $t;
157
-			}
158
-			// renseigner la boucle source de ce champ pour les traitements
159
-			$boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
160
-			$champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']';
161
-			if (!$joker) {
162
-				return index_compose($conditionnel, $champ);
163
-			}
164
-
165
-			// tant que l'on trouve des tables avec joker, on continue
166
-			// avec la boucle parente et on conditionne à l'exécution
167
-			// la présence du champ. Si le champ existe à l'exécution
168
-			// dans une boucle, il est pris, sinon on le cherche dans le parent...
169
-			$conditionnel[] = "isset($champ)?$champ";
170
-		}
171
-
172
-		if ($remonte_pile) {
173
-			#	spip_log("On remonte vers $i");
174
-			// Sinon on remonte d'un cran
175
-			$idb = $boucles[$idb]->id_parent;
176
-			$i++;
177
-		} else {
178
-			$idb = null;
179
-		}
180
-	}
181
-
182
-	#	spip_log("Pas vu $nom_champ");
183
-	// esperons qu'il y sera
184
-	// ou qu'on a fourni une valeur par "defaut" plus pertinent
185
-	return index_compose($conditionnel, $defaut);
126
+    if (!is_string($defaut)) {
127
+        $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)';
128
+    }
129
+
130
+    $idb_origine = $idb;
131
+    $nom_champ_origine = $nom_champ;
132
+
133
+    $i = 0;
134
+    if (strlen($explicite)) {
135
+        // Recherche d'un champ dans un etage superieur
136
+        while (($idb !== $explicite) && ($idb !== '')) {
137
+            #	spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
138
+            $i++;
139
+            $idb = $boucles[$idb]->id_parent;
140
+        }
141
+    }
142
+
143
+    #	spip_log("Cherche: $nom_champ a partir de '$idb'");
144
+    $nom_champ = strtolower($nom_champ);
145
+    $conditionnel = [];
146
+    // attention: entre la boucle nommee 0, "" et le tableau vide,
147
+    // il y a incoherences qu'il vaut mieux eviter
148
+    while (isset($boucles[$idb])) {
149
+        $joker = true;
150
+        // modifie $joker si tous les champs sont autorisés.
151
+        // $t = le select pour le champ, si on l'a trouvé (ou si joker)
152
+        // $c = le nom du champ demandé
153
+        [$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
154
+        if ($t) {
155
+            if ($select and !in_array($t, $boucles[$idb]->select)) {
156
+                $boucles[$idb]->select[] = $t;
157
+            }
158
+            // renseigner la boucle source de ce champ pour les traitements
159
+            $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
160
+            $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']';
161
+            if (!$joker) {
162
+                return index_compose($conditionnel, $champ);
163
+            }
164
+
165
+            // tant que l'on trouve des tables avec joker, on continue
166
+            // avec la boucle parente et on conditionne à l'exécution
167
+            // la présence du champ. Si le champ existe à l'exécution
168
+            // dans une boucle, il est pris, sinon on le cherche dans le parent...
169
+            $conditionnel[] = "isset($champ)?$champ";
170
+        }
171
+
172
+        if ($remonte_pile) {
173
+            #	spip_log("On remonte vers $i");
174
+            // Sinon on remonte d'un cran
175
+            $idb = $boucles[$idb]->id_parent;
176
+            $i++;
177
+        } else {
178
+            $idb = null;
179
+        }
180
+    }
181
+
182
+    #	spip_log("Pas vu $nom_champ");
183
+    // esperons qu'il y sera
184
+    // ou qu'on a fourni une valeur par "defaut" plus pertinent
185
+    return index_compose($conditionnel, $defaut);
186 186
 }
187 187
 
188 188
 /**
@@ -196,12 +196,12 @@  discard block
 block discarded – undo
196 196
  * @return string              Code PHP complet de recherche d'un champ
197 197
  */
198 198
 function index_compose($conditionnel, $defaut) {
199
-	while ($c = array_pop($conditionnel)) {
200
-		// si on passe defaut = '', ne pas générer d'erreur de compilation.
201
-		$defaut = "($c:(" . ($defaut ?: "''") . '))';
202
-	}
199
+    while ($c = array_pop($conditionnel)) {
200
+        // si on passe defaut = '', ne pas générer d'erreur de compilation.
201
+        $defaut = "($c:(" . ($defaut ?: "''") . '))';
202
+    }
203 203
 
204
-	return $defaut;
204
+    return $defaut;
205 205
 }
206 206
 
207 207
 /**
@@ -237,96 +237,96 @@  discard block
 block discarded – undo
237 237
  **/
238 238
 function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) {
239 239
 
240
-	$r = $boucles[$idb]->type_requete;
241
-	// boucle recursive, c'est foutu...
242
-	if ($r == TYPE_RECURSIF) {
243
-		return [];
244
-	}
245
-	if (!$r) {
246
-		$joker = false; // indiquer a l'appelant
247
-		# continuer pour chercher l'erreur suivante
248
-		return ["'#" . $r . ':' . $nom_champ . "'", ''];
249
-	}
250
-
251
-	$desc = $boucles[$idb]->show;
252
-	// le nom du champ est il une exception de la table ? un alias ?
253
-	$excep = $GLOBALS['exceptions_des_tables'][$r] ?? '';
254
-	if ($excep) {
255
-		$excep = $excep[$nom_champ] ?? '';
256
-	}
257
-
258
-	// il y a un alias connu pour ce champ
259
-	if ($excep) {
260
-		$joker = false; // indiquer a l'appelant
261
-		return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
262
-	}
263
-
264
-	// le champ existe dans la table, on le prend.
265
-	if (isset($desc['field'][$nom_champ])) {
266
-		$t = $boucles[$idb]->id_table;
267
-		$joker = false; // indiquer a l'appelant
268
-		return ["$t.$nom_champ", $nom_champ];
269
-	}
270
-
271
-	// Tous les champs sont-ils acceptés ?
272
-	// Si oui, on retourne le champ, et on lève le flag joker
273
-	// C'est le cas des itérateurs DATA qui acceptent tout
274
-	// et testent la présence du champ à l'exécution et non à la compilation
275
-	// car ils ne connaissent pas ici leurs contenus.
276
-	if (
277
-		/*$joker AND */
278
-		isset($desc['field']['*'])
279
-	) {
280
-		$joker = true; // indiquer a l'appelant
281
-		return [$nom_champ, $nom_champ];
282
-	}
283
-
284
-	$joker = false; // indiquer a l'appelant
285
-
286
-	// la table de jointure est explicitement indiquée (rubrique.titre)
287
-	if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) {
288
-		[, $_table, $_nom_champ] = $r;
289
-		if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) {
290
-			$_alias = $cle . '_' . $_nom_champ;
291
-			return index_exception(
292
-				$boucles[$idb],
293
-				$desc,
294
-				$_alias,
295
-				[$_table, $_nom_champ]
296
-			);
297
-		}
298
-		return ['', ''];
299
-	}
300
-
301
-	// pas d'alias, pas de champ, pas de joker...
302
-	// tenter via une jointure...
303
-
304
-	// regarder si le champ est deja dans une jointure existante
305
-	// sinon, si il y a des joitures explicites, la construire
306
-	if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
307
-		if ($boucles[$idb]->jointures_explicites) {
308
-			// [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
309
-			// fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
310
-			// mais est-ce ce qu'on veut ?
311
-			$jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites);
312
-			if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
313
-				$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
314
-			}
315
-		}
316
-	}
317
-
318
-	if ($t) {
319
-		// si on a trouvé une jointure possible, on fait comme
320
-		// si c'était une exception pour le champ demandé
321
-		return index_exception(
322
-			$boucles[$idb],
323
-			$desc,
324
-			$nom_champ,
325
-			[$t[1]['id_table'], reset($t[2])]
326
-		);
327
-	}
328
-
329
-	return ['', ''];
240
+    $r = $boucles[$idb]->type_requete;
241
+    // boucle recursive, c'est foutu...
242
+    if ($r == TYPE_RECURSIF) {
243
+        return [];
244
+    }
245
+    if (!$r) {
246
+        $joker = false; // indiquer a l'appelant
247
+        # continuer pour chercher l'erreur suivante
248
+        return ["'#" . $r . ':' . $nom_champ . "'", ''];
249
+    }
250
+
251
+    $desc = $boucles[$idb]->show;
252
+    // le nom du champ est il une exception de la table ? un alias ?
253
+    $excep = $GLOBALS['exceptions_des_tables'][$r] ?? '';
254
+    if ($excep) {
255
+        $excep = $excep[$nom_champ] ?? '';
256
+    }
257
+
258
+    // il y a un alias connu pour ce champ
259
+    if ($excep) {
260
+        $joker = false; // indiquer a l'appelant
261
+        return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
262
+    }
263
+
264
+    // le champ existe dans la table, on le prend.
265
+    if (isset($desc['field'][$nom_champ])) {
266
+        $t = $boucles[$idb]->id_table;
267
+        $joker = false; // indiquer a l'appelant
268
+        return ["$t.$nom_champ", $nom_champ];
269
+    }
270
+
271
+    // Tous les champs sont-ils acceptés ?
272
+    // Si oui, on retourne le champ, et on lève le flag joker
273
+    // C'est le cas des itérateurs DATA qui acceptent tout
274
+    // et testent la présence du champ à l'exécution et non à la compilation
275
+    // car ils ne connaissent pas ici leurs contenus.
276
+    if (
277
+        /*$joker AND */
278
+        isset($desc['field']['*'])
279
+    ) {
280
+        $joker = true; // indiquer a l'appelant
281
+        return [$nom_champ, $nom_champ];
282
+    }
283
+
284
+    $joker = false; // indiquer a l'appelant
285
+
286
+    // la table de jointure est explicitement indiquée (rubrique.titre)
287
+    if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) {
288
+        [, $_table, $_nom_champ] = $r;
289
+        if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) {
290
+            $_alias = $cle . '_' . $_nom_champ;
291
+            return index_exception(
292
+                $boucles[$idb],
293
+                $desc,
294
+                $_alias,
295
+                [$_table, $_nom_champ]
296
+            );
297
+        }
298
+        return ['', ''];
299
+    }
300
+
301
+    // pas d'alias, pas de champ, pas de joker...
302
+    // tenter via une jointure...
303
+
304
+    // regarder si le champ est deja dans une jointure existante
305
+    // sinon, si il y a des joitures explicites, la construire
306
+    if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
307
+        if ($boucles[$idb]->jointures_explicites) {
308
+            // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
309
+            // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
310
+            // mais est-ce ce qu'on veut ?
311
+            $jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites);
312
+            if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
313
+                $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
314
+            }
315
+        }
316
+    }
317
+
318
+    if ($t) {
319
+        // si on a trouvé une jointure possible, on fait comme
320
+        // si c'était une exception pour le champ demandé
321
+        return index_exception(
322
+            $boucles[$idb],
323
+            $desc,
324
+            $nom_champ,
325
+            [$t[1]['id_table'], reset($t[2])]
326
+        );
327
+    }
328
+
329
+    return ['', ''];
330 330
 }
331 331
 
332 332
 
@@ -354,52 +354,52 @@  discard block
 block discarded – undo
354 354
  *     est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot"
355 355
  **/
356 356
 function index_exception(&$boucle, $desc, $nom_champ, $excep) {
357
-	static $trouver_table;
358
-	if (!$trouver_table) {
359
-		$trouver_table = charger_fonction('trouver_table', 'base');
360
-	}
361
-
362
-	if (is_array($excep)) {
363
-		// permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
364
-		$t = null;
365
-		if (count($excep) == 3) {
366
-			$index_exception_derogatoire = array_pop($excep);
367
-			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
368
-		}
369
-		if ($t == null) {
370
-			[$e, $x] = $excep;  #PHP4 affecte de gauche a droite
371
-			$excep = $x;    #PHP5 de droite a gauche !
372
-			$j = $trouver_table($e, $boucle->sql_serveur);
373
-			if (!$j) {
374
-				return ['', ''];
375
-			}
376
-			$e = $j['table'];
377
-			if (!$t = array_search($e, $boucle->from)) {
378
-				$k = $j['key']['PRIMARY KEY'];
379
-				if (strpos($k, ',')) {
380
-					$l = (preg_split('/\s*,\s*/', $k));
381
-					$k = $desc['key']['PRIMARY KEY'];
382
-					if (!in_array($k, $l)) {
383
-						spip_log("jointure impossible $e " . join(',', $l));
384
-
385
-						return ['', ''];
386
-					}
387
-				}
388
-				$k = [$boucle->id_table, [$e], $k];
389
-				fabrique_jointures($boucle, [$k]);
390
-				$t = array_search($e, $boucle->from);
391
-			}
392
-		}
393
-	} else {
394
-		$t = $boucle->id_table;
395
-	}
396
-	// demander a SQL de gerer le synonyme
397
-	// ca permet que excep soit dynamique (Cedric, 2/3/06)
398
-	if ($excep != $nom_champ) {
399
-		$excep .= ' AS ' . $nom_champ;
400
-	}
401
-
402
-	return ["$t.$excep", $nom_champ];
357
+    static $trouver_table;
358
+    if (!$trouver_table) {
359
+        $trouver_table = charger_fonction('trouver_table', 'base');
360
+    }
361
+
362
+    if (is_array($excep)) {
363
+        // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
364
+        $t = null;
365
+        if (count($excep) == 3) {
366
+            $index_exception_derogatoire = array_pop($excep);
367
+            $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
368
+        }
369
+        if ($t == null) {
370
+            [$e, $x] = $excep;  #PHP4 affecte de gauche a droite
371
+            $excep = $x;    #PHP5 de droite a gauche !
372
+            $j = $trouver_table($e, $boucle->sql_serveur);
373
+            if (!$j) {
374
+                return ['', ''];
375
+            }
376
+            $e = $j['table'];
377
+            if (!$t = array_search($e, $boucle->from)) {
378
+                $k = $j['key']['PRIMARY KEY'];
379
+                if (strpos($k, ',')) {
380
+                    $l = (preg_split('/\s*,\s*/', $k));
381
+                    $k = $desc['key']['PRIMARY KEY'];
382
+                    if (!in_array($k, $l)) {
383
+                        spip_log("jointure impossible $e " . join(',', $l));
384
+
385
+                        return ['', ''];
386
+                    }
387
+                }
388
+                $k = [$boucle->id_table, [$e], $k];
389
+                fabrique_jointures($boucle, [$k]);
390
+                $t = array_search($e, $boucle->from);
391
+            }
392
+        }
393
+    } else {
394
+        $t = $boucle->id_table;
395
+    }
396
+    // demander a SQL de gerer le synonyme
397
+    // ca permet que excep soit dynamique (Cedric, 2/3/06)
398
+    if ($excep != $nom_champ) {
399
+        $excep .= ' AS ' . $nom_champ;
400
+    }
401
+
402
+    return ["$t.$excep", $nom_champ];
403 403
 }
404 404
 
405 405
 /**
@@ -424,7 +424,7 @@  discard block
 block discarded – undo
424 424
  *     Code PHP pour retrouver le champ
425 425
  */
426 426
 function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) {
427
-	return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
427
+    return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
428 428
 }
429 429
 
430 430
 
@@ -444,9 +444,9 @@  discard block
 block discarded – undo
444 444
  *     Code PHP pour d'exécution de la balise et de ses filtres
445 445
  **/
446 446
 function calculer_champ($p) {
447
-	$p = calculer_balise($p->nom_champ, $p);
447
+    $p = calculer_balise($p->nom_champ, $p);
448 448
 
449
-	return applique_filtres($p);
449
+    return applique_filtres($p);
450 450
 }
451 451
 
452 452
 
@@ -483,26 +483,26 @@  discard block
 block discarded – undo
483 483
  **/
484 484
 function calculer_balise(string $nom, \Champ $p): \Champ {
485 485
 
486
-	// S'agit-t-il d'une balise_XXXX[_dist]() ?
487
-	if ($f = charger_fonction($nom, 'balise', true)) {
488
-		$p->balise_calculee = true;
489
-		$res = $f($p);
490
-		if ($res !== null and is_object($res)) {
491
-			return $res;
492
-		}
493
-	}
494
-
495
-	// Certaines des balises comportant un _ sont generiques
496
-	if ($balise_generique = chercher_balise_generique($nom)) {
497
-		$res = $balise_generique['fonction_generique']($p);
498
-		if ($res !== null and is_object($res)) {
499
-			return $res;
500
-		}
501
-	}
502
-
503
-	$f = charger_fonction('DEFAUT', 'calculer_balise');
504
-
505
-	return $f($nom, $p);
486
+    // S'agit-t-il d'une balise_XXXX[_dist]() ?
487
+    if ($f = charger_fonction($nom, 'balise', true)) {
488
+        $p->balise_calculee = true;
489
+        $res = $f($p);
490
+        if ($res !== null and is_object($res)) {
491
+            return $res;
492
+        }
493
+    }
494
+
495
+    // Certaines des balises comportant un _ sont generiques
496
+    if ($balise_generique = chercher_balise_generique($nom)) {
497
+        $res = $balise_generique['fonction_generique']($p);
498
+        if ($res !== null and is_object($res)) {
499
+            return $res;
500
+        }
501
+    }
502
+
503
+    $f = charger_fonction('DEFAUT', 'calculer_balise');
504
+
505
+    return $f($nom, $p);
506 506
 }
507 507
 
508 508
 
@@ -530,37 +530,37 @@  discard block
 block discarded – undo
530 530
  **/
531 531
 function calculer_balise_DEFAUT_dist($nom, $p) {
532 532
 
533
-	// ca pourrait etre un champ SQL homonyme,
534
-	$p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
535
-
536
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
537
-	// il faut recracher {...} quand ce n'est finalement pas des args
538
-	if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
539
-		$code = addslashes($p->fonctions[0][1]);
540
-		$p->code .= " . '$code'";
541
-	}
542
-
543
-	// ne pas passer le filtre securite sur les id_xxx
544
-	if (strpos($nom, 'ID_') === 0) {
545
-		$p->interdire_scripts = false;
546
-	}
547
-
548
-	// Compatibilite ascendante avec les couleurs html (#FEFEFE) :
549
-	// SI le champ SQL n'est pas trouve
550
-	// ET si la balise a une forme de couleur
551
-	// ET s'il n'y a ni filtre ni etoile
552
-	// ALORS retourner la couleur.
553
-	// Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
554
-	if (
555
-		preg_match('/^[A-F]{1,6}$/i', $nom)
556
-		and !$p->etoile
557
-		and !$p->fonctions
558
-	) {
559
-		$p->code = "'#$nom'";
560
-		$p->interdire_scripts = false;
561
-	}
562
-
563
-	return $p;
533
+    // ca pourrait etre un champ SQL homonyme,
534
+    $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
535
+
536
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
537
+    // il faut recracher {...} quand ce n'est finalement pas des args
538
+    if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
539
+        $code = addslashes($p->fonctions[0][1]);
540
+        $p->code .= " . '$code'";
541
+    }
542
+
543
+    // ne pas passer le filtre securite sur les id_xxx
544
+    if (strpos($nom, 'ID_') === 0) {
545
+        $p->interdire_scripts = false;
546
+    }
547
+
548
+    // Compatibilite ascendante avec les couleurs html (#FEFEFE) :
549
+    // SI le champ SQL n'est pas trouve
550
+    // ET si la balise a une forme de couleur
551
+    // ET s'il n'y a ni filtre ni etoile
552
+    // ALORS retourner la couleur.
553
+    // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
554
+    if (
555
+        preg_match('/^[A-F]{1,6}$/i', $nom)
556
+        and !$p->etoile
557
+        and !$p->fonctions
558
+    ) {
559
+        $p->code = "'#$nom'";
560
+        $p->interdire_scripts = false;
561
+    }
562
+
563
+    return $p;
564 564
 }
565 565
 
566 566
 
@@ -603,39 +603,39 @@  discard block
 block discarded – undo
603 603
  **/
604 604
 function calculer_balise_dynamique($p, $nom, $l, $supp = []) {
605 605
 
606
-	if (!balise_distante_interdite($p)) {
607
-		$p->code = "''";
608
-
609
-		return $p;
610
-	}
611
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
612
-	// il faut recracher {...} quand ce n'est finalement pas des args
613
-	if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
614
-		$p->fonctions = null;
615
-	}
616
-
617
-	if ($p->param and ($c = $p->param[0])) {
618
-		// liste d'arguments commence toujours par la chaine vide
619
-		array_shift($c);
620
-		// construire la liste d'arguments comme pour un filtre
621
-		$param = compose_filtres_args($p, $c, ',');
622
-	} else {
623
-		$param = '';
624
-	}
625
-	$collecte = collecter_balise_dynamique($l, $p, $nom);
626
-
627
-	$p->code = sprintf(
628
-		CODE_EXECUTER_BALISE,
629
-		$nom,
630
-		join(',', $collecte),
631
-		($collecte ? $param : substr($param, 1)), # virer la virgule
632
-		memoriser_contexte_compil($p),
633
-		(!$supp ? '' : (', ' . join(',', $supp)))
634
-	);
635
-
636
-	$p->interdire_scripts = false;
637
-
638
-	return $p;
606
+    if (!balise_distante_interdite($p)) {
607
+        $p->code = "''";
608
+
609
+        return $p;
610
+    }
611
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
612
+    // il faut recracher {...} quand ce n'est finalement pas des args
613
+    if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
614
+        $p->fonctions = null;
615
+    }
616
+
617
+    if ($p->param and ($c = $p->param[0])) {
618
+        // liste d'arguments commence toujours par la chaine vide
619
+        array_shift($c);
620
+        // construire la liste d'arguments comme pour un filtre
621
+        $param = compose_filtres_args($p, $c, ',');
622
+    } else {
623
+        $param = '';
624
+    }
625
+    $collecte = collecter_balise_dynamique($l, $p, $nom);
626
+
627
+    $p->code = sprintf(
628
+        CODE_EXECUTER_BALISE,
629
+        $nom,
630
+        join(',', $collecte),
631
+        ($collecte ? $param : substr($param, 1)), # virer la virgule
632
+        memoriser_contexte_compil($p),
633
+        (!$supp ? '' : (', ' . join(',', $supp)))
634
+    );
635
+
636
+    $p->interdire_scripts = false;
637
+
638
+    return $p;
639 639
 }
640 640
 
641 641
 
@@ -665,17 +665,17 @@  discard block
 block discarded – undo
665 665
  *     Liste des codes PHP d'éxecution des balises collectées
666 666
  **/
667 667
 function collecter_balise_dynamique(array $l, \Champ &$p, string $nom): array {
668
-	$args = [];
669
-	foreach ($l as $c) {
670
-		if ($c === null) {
671
-			$args[] = 'null';
672
-		} else {
673
-			$x = calculer_balise($c, $p);
674
-			$args[] = $x->code;
675
-		}
676
-	}
677
-
678
-	return $args;
668
+    $args = [];
669
+    foreach ($l as $c) {
670
+        if ($c === null) {
671
+            $args[] = 'null';
672
+        } else {
673
+            $x = calculer_balise($c, $p);
674
+            $args[] = $x->code;
675
+        }
676
+    }
677
+
678
+    return $args;
679 679
 }
680 680
 
681 681
 
@@ -690,22 +690,22 @@  discard block
 block discarded – undo
690 690
  *     Nom de la connexion
691 691
  **/
692 692
 function trouver_nom_serveur_distant($p) {
693
-	$nom = $p->id_boucle;
694
-	if (
695
-		$nom
696
-		and isset($p->boucles[$nom])
697
-	) {
698
-		$s = $p->boucles[$nom]->sql_serveur;
699
-		if (
700
-			strlen($s)
701
-			and strlen($serveur = strtolower($s))
702
-			and !in_array($serveur, $GLOBALS['exception_des_connect'])
703
-		) {
704
-			return $serveur;
705
-		}
706
-	}
707
-
708
-	return '';
693
+    $nom = $p->id_boucle;
694
+    if (
695
+        $nom
696
+        and isset($p->boucles[$nom])
697
+    ) {
698
+        $s = $p->boucles[$nom]->sql_serveur;
699
+        if (
700
+            strlen($s)
701
+            and strlen($serveur = strtolower($s))
702
+            and !in_array($serveur, $GLOBALS['exception_des_connect'])
703
+        ) {
704
+            return $serveur;
705
+        }
706
+    }
707
+
708
+    return '';
709 709
 }
710 710
 
711 711
 
@@ -729,15 +729,15 @@  discard block
 block discarded – undo
729 729
  *     - false : La balise est interdite car le serveur est distant
730 730
  **/
731 731
 function balise_distante_interdite($p) {
732
-	$nom = $p->id_boucle;
732
+    $nom = $p->id_boucle;
733 733
 
734
-	if ($nom and trouver_nom_serveur_distant($p)) {
735
-		spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
734
+    if ($nom and trouver_nom_serveur_distant($p)) {
735
+        spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
736 736
 
737
-		return false;
738
-	}
737
+        return false;
738
+    }
739 739
 
740
-	return true;
740
+    return true;
741 741
 }
742 742
 
743 743
 
@@ -747,84 +747,84 @@  discard block
 block discarded – undo
747 747
 //
748 748
 function champs_traitements($p) {
749 749
 
750
-	if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
751
-		$ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
752
-	} else {
753
-		// quand on utilise un traitement catch-all *
754
-		// celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
755
-		// leur propre securite
756
-		if (!$p->balise_calculee) {
757
-			$ps = $GLOBALS['table_des_traitements']['*'];
758
-		} else {
759
-			$ps = false;
760
-		}
761
-	}
762
-
763
-	if (is_array($ps)) {
764
-		// Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
765
-		$idb = index_boucle($p);
766
-		// si le champ a ete trouve dans une boucle parente sa source est renseignee ici
767
-		if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
768
-			$idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
769
-		}
770
-
771
-		// mais on peut aussi etre hors boucle. Se mefier.
772
-		$type_requete = $p->boucles[$idb]->type_requete ?? false;
773
-		$table_sql = $p->boucles[$idb]->show['table_sql'] ?? false;
774
-
775
-		// bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
776
-		if ($type_requete and isset($GLOBALS['table_des_tables'][$type_requete])) {
777
-			$type_alias = $type_requete;
778
-			$type_requete = $GLOBALS['table_des_tables'][$type_requete];
779
-		} else {
780
-			$type_alias = false;
781
-		}
782
-
783
-		// le traitement peut n'etre defini que pour une table en particulier "spip_articles"
784
-		if ($table_sql and isset($ps[$table_sql])) {
785
-			$ps = $ps[$table_sql];
786
-		} // ou pour une boucle en particulier "DATA","articles"
787
-		elseif ($type_requete and isset($ps[$type_requete])) {
788
-			$ps = $ps[$type_requete];
789
-		} // ou pour une boucle utilisant un alias ("hierarchie")
790
-		elseif ($type_alias and isset($ps[$type_alias])) {
791
-			$ps = $ps[$type_alias];
792
-		} // ou pour indifféremment quelle que soit la boucle
793
-		elseif (isset($ps[0])) {
794
-			$ps = $ps[0];
795
-		} else {
796
-			$ps = false;
797
-		}
798
-	}
799
-
800
-	if (!$ps) {
801
-		return $p->code;
802
-	}
803
-
804
-	// Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
805
-	// ou si in INCLURE contient {doublons}
806
-	// on insere une fonction de remplissage du tableau des doublons
807
-	// dans les filtres propre() ou typo()
808
-	// (qui traitent les raccourcis <docXX> referencant les docs)
809
-
810
-	if (
811
-		isset($p->descr['documents'])
812
-		and
813
-		$p->descr['documents']
814
-		and (
815
-			(strpos($ps, 'propre') !== false)
816
-			or
817
-			(strpos($ps, 'typo') !== false)
818
-		)
819
-	) {
820
-		$ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
821
-	}
822
-
823
-	// La protection des champs par |safehtml est assuree par les extensions
824
-	// dans la declaration des traitements des champs sensibles
825
-
826
-	// Remplacer enfin le placeholder %s par le vrai code de la balise
827
-	return str_replace('%s', $p->code, $ps);
750
+    if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
751
+        $ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
752
+    } else {
753
+        // quand on utilise un traitement catch-all *
754
+        // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
755
+        // leur propre securite
756
+        if (!$p->balise_calculee) {
757
+            $ps = $GLOBALS['table_des_traitements']['*'];
758
+        } else {
759
+            $ps = false;
760
+        }
761
+    }
762
+
763
+    if (is_array($ps)) {
764
+        // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
765
+        $idb = index_boucle($p);
766
+        // si le champ a ete trouve dans une boucle parente sa source est renseignee ici
767
+        if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
768
+            $idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
769
+        }
770
+
771
+        // mais on peut aussi etre hors boucle. Se mefier.
772
+        $type_requete = $p->boucles[$idb]->type_requete ?? false;
773
+        $table_sql = $p->boucles[$idb]->show['table_sql'] ?? false;
774
+
775
+        // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
776
+        if ($type_requete and isset($GLOBALS['table_des_tables'][$type_requete])) {
777
+            $type_alias = $type_requete;
778
+            $type_requete = $GLOBALS['table_des_tables'][$type_requete];
779
+        } else {
780
+            $type_alias = false;
781
+        }
782
+
783
+        // le traitement peut n'etre defini que pour une table en particulier "spip_articles"
784
+        if ($table_sql and isset($ps[$table_sql])) {
785
+            $ps = $ps[$table_sql];
786
+        } // ou pour une boucle en particulier "DATA","articles"
787
+        elseif ($type_requete and isset($ps[$type_requete])) {
788
+            $ps = $ps[$type_requete];
789
+        } // ou pour une boucle utilisant un alias ("hierarchie")
790
+        elseif ($type_alias and isset($ps[$type_alias])) {
791
+            $ps = $ps[$type_alias];
792
+        } // ou pour indifféremment quelle que soit la boucle
793
+        elseif (isset($ps[0])) {
794
+            $ps = $ps[0];
795
+        } else {
796
+            $ps = false;
797
+        }
798
+    }
799
+
800
+    if (!$ps) {
801
+        return $p->code;
802
+    }
803
+
804
+    // Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
805
+    // ou si in INCLURE contient {doublons}
806
+    // on insere une fonction de remplissage du tableau des doublons
807
+    // dans les filtres propre() ou typo()
808
+    // (qui traitent les raccourcis <docXX> referencant les docs)
809
+
810
+    if (
811
+        isset($p->descr['documents'])
812
+        and
813
+        $p->descr['documents']
814
+        and (
815
+            (strpos($ps, 'propre') !== false)
816
+            or
817
+            (strpos($ps, 'typo') !== false)
818
+        )
819
+    ) {
820
+        $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
821
+    }
822
+
823
+    // La protection des champs par |safehtml est assuree par les extensions
824
+    // dans la declaration des traitements des champs sensibles
825
+
826
+    // Remplacer enfin le placeholder %s par le vrai code de la balise
827
+    return str_replace('%s', $p->code, $ps);
828 828
 }
829 829
 
830 830
 
@@ -836,110 +836,110 @@  discard block
 block discarded – undo
836 836
 //
837 837
 function applique_filtres($p) {
838 838
 
839
-	// Traitements standards (cf. supra)
840
-	if ($p->etoile == '') {
841
-		$code = champs_traitements($p);
842
-	} else {
843
-		$code = $p->code;
844
-	}
839
+    // Traitements standards (cf. supra)
840
+    if ($p->etoile == '') {
841
+        $code = champs_traitements($p);
842
+    } else {
843
+        $code = $p->code;
844
+    }
845 845
 
846
-	// Appliquer les filtres perso
847
-	if ($p->param) {
848
-		$code = compose_filtres($p, $code);
849
-	}
846
+    // Appliquer les filtres perso
847
+    if ($p->param) {
848
+        $code = compose_filtres($p, $code);
849
+    }
850 850
 
851
-	// S'il y a un lien avec la session, ajouter un code qui levera
852
-	// un drapeau dans la structure d'invalidation $Cache
853
-	if (isset($p->descr['session'])) {
854
-		$code = "invalideur_session(\$Cache, $code)";
855
-	}
851
+    // S'il y a un lien avec la session, ajouter un code qui levera
852
+    // un drapeau dans la structure d'invalidation $Cache
853
+    if (isset($p->descr['session'])) {
854
+        $code = "invalideur_session(\$Cache, $code)";
855
+    }
856 856
 
857
-	$code = sandbox_composer_interdire_scripts($code, $p);
857
+    $code = sandbox_composer_interdire_scripts($code, $p);
858 858
 
859
-	return $code;
859
+    return $code;
860 860
 }
861 861
 
862 862
 // Cf. function pipeline dans ecrire/inc_utils.php
863 863
 function compose_filtres(&$p, $code) {
864 864
 
865
-	$image_miette = false;
866
-	foreach ($p->param as $filtre) {
867
-		$fonc = array_shift($filtre);
868
-		if (!$fonc) {
869
-			continue;
870
-		} // normalement qu'au premier tour.
871
-		$is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver');
872
-		if ($image_miette and !$is_filtre_image) {
873
-			// il faut graver maintenant car apres le filtre en cours
874
-			// on est pas sur d'avoir encore le nom du fichier dans le pipe
875
-			$code = "filtrer('image_graver', $code)";
876
-			$image_miette = false;
877
-		}
878
-
879
-		// recuperer les arguments du filtre,
880
-		// a separer par "," ou ":" dans le cas du filtre "?{a,b}"
881
-		$countfiltre = is_countable($filtre) ? count($filtre) : 0;
882
-		if ($fonc !== '?') {
883
-			$sep = ',';
884
-		} else {
885
-			$sep = ':';
886
-			// |?{a,b} *doit* avoir exactement 2 arguments ; on les force
887
-			if ($countfiltre != 2) {
888
-				$filtre = [$filtre[0] ?? '', $filtre[1] ?? ''];
889
-				$countfiltre = 2;
890
-			}
891
-		}
892
-		$arglist = compose_filtres_args($p, $filtre, $sep);
893
-		$logique = filtre_logique($fonc, $code, substr($arglist, 1));
894
-		if ($logique) {
895
-			$code = $logique;
896
-		} else {
897
-			$code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre);
898
-			if ($is_filtre_image) {
899
-				$image_miette = true;
900
-			}
901
-		}
902
-	}
903
-	// ramasser les images intermediaires inutiles et graver l'image finale
904
-	if ($image_miette) {
905
-		$code = "filtrer('image_graver',$code)";
906
-	}
907
-
908
-	return $code;
865
+    $image_miette = false;
866
+    foreach ($p->param as $filtre) {
867
+        $fonc = array_shift($filtre);
868
+        if (!$fonc) {
869
+            continue;
870
+        } // normalement qu'au premier tour.
871
+        $is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver');
872
+        if ($image_miette and !$is_filtre_image) {
873
+            // il faut graver maintenant car apres le filtre en cours
874
+            // on est pas sur d'avoir encore le nom du fichier dans le pipe
875
+            $code = "filtrer('image_graver', $code)";
876
+            $image_miette = false;
877
+        }
878
+
879
+        // recuperer les arguments du filtre,
880
+        // a separer par "," ou ":" dans le cas du filtre "?{a,b}"
881
+        $countfiltre = is_countable($filtre) ? count($filtre) : 0;
882
+        if ($fonc !== '?') {
883
+            $sep = ',';
884
+        } else {
885
+            $sep = ':';
886
+            // |?{a,b} *doit* avoir exactement 2 arguments ; on les force
887
+            if ($countfiltre != 2) {
888
+                $filtre = [$filtre[0] ?? '', $filtre[1] ?? ''];
889
+                $countfiltre = 2;
890
+            }
891
+        }
892
+        $arglist = compose_filtres_args($p, $filtre, $sep);
893
+        $logique = filtre_logique($fonc, $code, substr($arglist, 1));
894
+        if ($logique) {
895
+            $code = $logique;
896
+        } else {
897
+            $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre);
898
+            if ($is_filtre_image) {
899
+                $image_miette = true;
900
+            }
901
+        }
902
+    }
903
+    // ramasser les images intermediaires inutiles et graver l'image finale
904
+    if ($image_miette) {
905
+        $code = "filtrer('image_graver',$code)";
906
+    }
907
+
908
+    return $code;
909 909
 }
910 910
 
911 911
 // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes
912 912
 // et comparateurs
913 913
 function filtre_logique($fonc, $code, $arg) {
914 914
 
915
-	switch (true) {
916
-		case in_array($fonc, $GLOBALS['table_criteres_infixes']):
917
-			return "($code $fonc $arg)";
918
-		case ($fonc == 'and') or ($fonc == 'et'):
919
-			return "((($code) AND ($arg)) ?' ' :'')";
920
-		case ($fonc == 'or') or ($fonc == 'ou'):
921
-			return "((($code) OR ($arg)) ?' ' :'')";
922
-		case ($fonc == 'xor') or ($fonc == 'xou'):
923
-			return "((($code) XOR ($arg)) ?' ' :'')";
924
-		case ($fonc == 'sinon'):
925
-			return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)";
926
-		case ($fonc == 'not') or ($fonc == 'non'):
927
-			return "(($code) ?'' :' ')";
928
-		case ($fonc == 'yes') or ($fonc == 'oui'):
929
-			return "(($code) ?' ' :'')";
930
-	}
931
-
932
-	return '';
915
+    switch (true) {
916
+        case in_array($fonc, $GLOBALS['table_criteres_infixes']):
917
+            return "($code $fonc $arg)";
918
+        case ($fonc == 'and') or ($fonc == 'et'):
919
+            return "((($code) AND ($arg)) ?' ' :'')";
920
+        case ($fonc == 'or') or ($fonc == 'ou'):
921
+            return "((($code) OR ($arg)) ?' ' :'')";
922
+        case ($fonc == 'xor') or ($fonc == 'xou'):
923
+            return "((($code) XOR ($arg)) ?' ' :'')";
924
+        case ($fonc == 'sinon'):
925
+            return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)";
926
+        case ($fonc == 'not') or ($fonc == 'non'):
927
+            return "(($code) ?'' :' ')";
928
+        case ($fonc == 'yes') or ($fonc == 'oui'):
929
+            return "(($code) ?' ' :'')";
930
+    }
931
+
932
+    return '';
933 933
 }
934 934
 
935 935
 function compose_filtres_args($p, $args, $sep) {
936
-	$arglist = '';
937
-	foreach ($args as $arg) {
938
-		$arglist .= $sep .
939
-			calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
940
-	}
936
+    $arglist = '';
937
+    foreach ($args as $arg) {
938
+        $arglist .= $sep .
939
+            calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
940
+    }
941 941
 
942
-	return $arglist;
942
+    return $arglist;
943 943
 }
944 944
 
945 945
 
@@ -957,15 +957,15 @@  discard block
 block discarded – undo
957 957
  **/
958 958
 function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) {
959 959
 
960
-	// si recursif, forcer l'extraction du champ SQL mais ignorer le code
961
-	if ($boucles[$idb]->externe) {
962
-		index_pile($idb, $nom_champ, $boucles, '', $defaut);
963
-		// retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
964
-		// on ignore le defaut fourni dans ce cas
965
-		$defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)";
966
-	}
960
+    // si recursif, forcer l'extraction du champ SQL mais ignorer le code
961
+    if ($boucles[$idb]->externe) {
962
+        index_pile($idb, $nom_champ, $boucles, '', $defaut);
963
+        // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
964
+        // on ignore le defaut fourni dans ce cas
965
+        $defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)";
966
+    }
967 967
 
968
-	return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
968
+    return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
969 969
 }
970 970
 
971 971
 //
@@ -979,30 +979,30 @@  discard block
 block discarded – undo
979 979
 //
980 980
 
981 981
 function rindex_pile($p, $champ, $motif) {
982
-	$n = 0;
983
-	$b = $p->id_boucle;
984
-	$p->code = '';
985
-	while ($b != '') {
986
-		foreach ($p->boucles[$b]->criteres as $critere) {
987
-			if ($critere->op == $motif) {
988
-				$p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") .
989
-					"]['$champ']";
990
-				$b = '';
991
-				break 2;
992
-			}
993
-		}
994
-		$n++;
995
-		$b = $p->boucles[$b]->id_parent;
996
-	}
997
-
998
-	// si on est hors d'une boucle de {recherche}, cette balise est vide
999
-	if (!$p->code) {
1000
-		$p->code = "''";
1001
-	}
1002
-
1003
-	$p->interdire_scripts = false;
1004
-
1005
-	return $p;
982
+    $n = 0;
983
+    $b = $p->id_boucle;
984
+    $p->code = '';
985
+    while ($b != '') {
986
+        foreach ($p->boucles[$b]->criteres as $critere) {
987
+            if ($critere->op == $motif) {
988
+                $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") .
989
+                    "]['$champ']";
990
+                $b = '';
991
+                break 2;
992
+            }
993
+        }
994
+        $n++;
995
+        $b = $p->boucles[$b]->id_parent;
996
+    }
997
+
998
+    // si on est hors d'une boucle de {recherche}, cette balise est vide
999
+    if (!$p->code) {
1000
+        $p->code = "''";
1001
+    }
1002
+
1003
+    $p->interdire_scripts = false;
1004
+
1005
+    return $p;
1006 1006
 }
1007 1007
 
1008 1008
 /**
@@ -1012,7 +1012,7 @@  discard block
 block discarded – undo
1012 1012
  * @return string Nom de la balise, avec indication de boucle explicite si présent.
1013 1013
  */
1014 1014
 function zbug_presenter_champ($p, $champ = '') {
1015
-	$balise = $champ ?: $p->nom_champ;
1016
-	$explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
1017
-	return "#{$explicite}{$balise}";
1015
+    $balise = $champ ?: $p->nom_champ;
1016
+    $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
1017
+    return "#{$explicite}{$balise}";
1018 1018
 }
Please login to merge, or discard this patch.
ecrire/public/criteres.php 1 patch
Indentation   +1716 added lines, -1716 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -43,12 +43,12 @@  discard block
 block discarded – undo
43 43
  **/
44 44
 function critere_racine_dist($idb, &$boucles, $crit) {
45 45
 
46
-	$not = $crit->not;
47
-	$boucle = &$boucles[$idb];
48
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
46
+    $not = $crit->not;
47
+    $boucle = &$boucles[$idb];
48
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
49 49
 
50
-	$c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
51
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
50
+    $c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
51
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
52 52
 }
53 53
 
54 54
 
@@ -65,15 +65,15 @@  discard block
 block discarded – undo
65 65
  * @return void|array
66 66
  **/
67 67
 function critere_exclus_dist($idb, &$boucles, $crit) {
68
-	$not = $crit->not;
69
-	$boucle = &$boucles[$idb];
70
-	$id = $boucle->primary;
71
-
72
-	if ($not or !$id) {
73
-		return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]];
74
-	}
75
-	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
76
-	$boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
68
+    $not = $crit->not;
69
+    $boucle = &$boucles[$idb];
70
+    $id = $boucle->primary;
71
+
72
+    if ($not or !$id) {
73
+        return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]];
74
+    }
75
+    $arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
76
+    $boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
77 77
 }
78 78
 
79 79
 
@@ -93,73 +93,73 @@  discard block
 block discarded – undo
93 93
  * @return void|array
94 94
  **/
95 95
 function critere_doublons_dist($idb, &$boucles, $crit) {
96
-	$boucle = &$boucles[$idb];
97
-	$primary = $boucle->primary;
98
-
99
-	// la table nécessite une clé primaire, non composée
100
-	if (!$primary or strpos($primary, ',')) {
101
-		return ['zbug_doublon_sur_table_sans_cle_primaire'];
102
-	}
103
-
104
-	$not = ($crit->not ? '' : 'NOT');
105
-
106
-	// le doublon s'applique sur un type de boucle (article)
107
-	$nom = "'" . $boucle->type_requete . "'";
108
-
109
-	// compléter le nom avec un nom précisé {doublons nom}
110
-	// on obtient $nom = "'article' . 'nom'"
111
-	if (isset($crit->param[0])) {
112
-		$nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
113
-	}
114
-
115
-	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
116
-	$init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
117
-	$init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
118
-
119
-	// on crée un sql_in avec la clé primaire de la table
120
-	// et la collection des doublons déjà emmagasinés dans le tableau
121
-	// $doublons et son index, ici $nom
122
-
123
-	// debut du code "sql_in('articles.id_article', "
124
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
125
-	// lecture des données du doublon "$doublons[$doublon_index[] = "
126
-	// Attention : boucle->doublons désigne une variable qu'on affecte
127
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= '));
128
-
129
-	// le debut complet du code des doublons
130
-	$debut_doub = $debut_in . $debut_doub;
131
-
132
-	// nom du doublon "('article' . 'nom')]"
133
-	$fin_doub = "($nom)]";
134
-
135
-	// si on trouve un autre critère doublon,
136
-	// on fusionne pour avoir un seul IN, et on s'en va !
137
-	foreach ($boucle->where as $k => $w) {
138
-		if (strpos($w[0], $debut_doub) === 0) {
139
-			// fusionner le sql_in (du where)
140
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
141
-			// fusionner l'initialisation (du hash) pour faire plus joli
142
-			$x = strpos($boucle->hash, $init_comment);
143
-			$len = strlen($init_comment);
144
-			$boucle->hash =
145
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
146
-
147
-			return;
148
-		}
149
-	}
150
-
151
-	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
152
-	$boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
153
-
154
-	// déclarer le doublon s'il n'existe pas encore
155
-	$boucle->hash .= $init_comment . $init_code;
156
-
157
-
158
-	# la ligne suivante avait l'intention d'eviter une collecte deja faite
159
-	# mais elle fait planter une boucle a 2 critere doublons:
160
-	# {!doublons A}{doublons B}
161
-	# (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
162
-	#	if ($crit->not) $boucle->doublons = "";
96
+    $boucle = &$boucles[$idb];
97
+    $primary = $boucle->primary;
98
+
99
+    // la table nécessite une clé primaire, non composée
100
+    if (!$primary or strpos($primary, ',')) {
101
+        return ['zbug_doublon_sur_table_sans_cle_primaire'];
102
+    }
103
+
104
+    $not = ($crit->not ? '' : 'NOT');
105
+
106
+    // le doublon s'applique sur un type de boucle (article)
107
+    $nom = "'" . $boucle->type_requete . "'";
108
+
109
+    // compléter le nom avec un nom précisé {doublons nom}
110
+    // on obtient $nom = "'article' . 'nom'"
111
+    if (isset($crit->param[0])) {
112
+        $nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
113
+    }
114
+
115
+    // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
116
+    $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
117
+    $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
118
+
119
+    // on crée un sql_in avec la clé primaire de la table
120
+    // et la collection des doublons déjà emmagasinés dans le tableau
121
+    // $doublons et son index, ici $nom
122
+
123
+    // debut du code "sql_in('articles.id_article', "
124
+    $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
125
+    // lecture des données du doublon "$doublons[$doublon_index[] = "
126
+    // Attention : boucle->doublons désigne une variable qu'on affecte
127
+    $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= '));
128
+
129
+    // le debut complet du code des doublons
130
+    $debut_doub = $debut_in . $debut_doub;
131
+
132
+    // nom du doublon "('article' . 'nom')]"
133
+    $fin_doub = "($nom)]";
134
+
135
+    // si on trouve un autre critère doublon,
136
+    // on fusionne pour avoir un seul IN, et on s'en va !
137
+    foreach ($boucle->where as $k => $w) {
138
+        if (strpos($w[0], $debut_doub) === 0) {
139
+            // fusionner le sql_in (du where)
140
+            $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
141
+            // fusionner l'initialisation (du hash) pour faire plus joli
142
+            $x = strpos($boucle->hash, $init_comment);
143
+            $len = strlen($init_comment);
144
+            $boucle->hash =
145
+                substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
146
+
147
+            return;
148
+        }
149
+    }
150
+
151
+    // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
152
+    $boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
153
+
154
+    // déclarer le doublon s'il n'existe pas encore
155
+    $boucle->hash .= $init_comment . $init_code;
156
+
157
+
158
+    # la ligne suivante avait l'intention d'eviter une collecte deja faite
159
+    # mais elle fait planter une boucle a 2 critere doublons:
160
+    # {!doublons A}{doublons B}
161
+    # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
162
+    #	if ($crit->not) $boucle->doublons = "";
163 163
 }
164 164
 
165 165
 
@@ -180,14 +180,14 @@  discard block
 block discarded – undo
180 180
  * @return void
181 181
  **/
182 182
 function critere_lang_select_dist($idb, &$boucles, $crit) {
183
-	if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
184
-		$param = 'oui';
185
-	}
186
-	if ($crit->not) {
187
-		$param = ($param == 'oui') ? 'non' : 'oui';
188
-	}
189
-	$boucle = &$boucles[$idb];
190
-	$boucle->lang_select = $param;
183
+    if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
184
+        $param = 'oui';
185
+    }
186
+    if ($crit->not) {
187
+        $param = ($param == 'oui') ? 'non' : 'oui';
188
+    }
189
+    $boucle = &$boucles[$idb];
190
+    $boucle->lang_select = $param;
191 191
 }
192 192
 
193 193
 
@@ -209,15 +209,15 @@  discard block
 block discarded – undo
209 209
  * @return void
210 210
  **/
211 211
 function critere_debut_dist($idb, &$boucles, $crit) {
212
-	[$un, $deux] = $crit->param;
213
-	$un = $un[0]->texte;
214
-	$deux = $deux[0]->texte;
215
-	if ($deux) {
216
-		$boucles[$idb]->limit =
217
-			'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
218
-	} else {
219
-		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
220
-	}
212
+    [$un, $deux] = $crit->param;
213
+    $un = $un[0]->texte;
214
+    $deux = $deux[0]->texte;
215
+    if ($deux) {
216
+        $boucles[$idb]->limit =
217
+            'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
218
+    } else {
219
+        calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
220
+    }
221 221
 }
222 222
 
223 223
 
@@ -251,58 +251,58 @@  discard block
 block discarded – undo
251 251
  **/
252 252
 function critere_pagination_dist($idb, &$boucles, $crit) {
253 253
 
254
-	$boucle = &$boucles[$idb];
255
-	// definition de la taille de la page
256
-	$pas = !isset($crit->param[0][0]) ? "''"
257
-		: calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
258
-
259
-	if (!preg_match(_CODE_QUOTE, $pas, $r)) {
260
-		$pas = "((\$a = intval($pas)) ? \$a : 10)";
261
-	} else {
262
-		$r = intval($r[2]);
263
-		$pas = strval($r ?: 10);
264
-	}
265
-
266
-	// Calcul du nommage de la pagination si il existe.
267
-	// La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
268
-	// compatible avec l'ancienne car certains cas fonctionnent correctement
269
-	$type = "'$idb'";
270
-	// Calcul d'un nommage spécifique de la pagination si précisé.
271
-	// Syntaxe {pagination 20, nom}
272
-	if (isset($crit->param[0][1])) {
273
-		$type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
274
-	} // Ancienne syntaxe {pagination 20 nom} pour compatibilité
275
-	elseif (isset($crit->param[1][0])) {
276
-		$type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
277
-	}
278
-
279
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
280
-	$boucle->modificateur['debut_nom'] = $type;
281
-	$partie =
282
-		// tester si le numero de page demande est de la forme '@yyy'
283
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
284
-		. "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
285
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
286
-		. "\t\t" . '$iter->seek(0);' . "\n"
287
-		. "\t}\n"
288
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
289
-
290
-	$boucle->hash .= '
254
+    $boucle = &$boucles[$idb];
255
+    // definition de la taille de la page
256
+    $pas = !isset($crit->param[0][0]) ? "''"
257
+        : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
258
+
259
+    if (!preg_match(_CODE_QUOTE, $pas, $r)) {
260
+        $pas = "((\$a = intval($pas)) ? \$a : 10)";
261
+    } else {
262
+        $r = intval($r[2]);
263
+        $pas = strval($r ?: 10);
264
+    }
265
+
266
+    // Calcul du nommage de la pagination si il existe.
267
+    // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
268
+    // compatible avec l'ancienne car certains cas fonctionnent correctement
269
+    $type = "'$idb'";
270
+    // Calcul d'un nommage spécifique de la pagination si précisé.
271
+    // Syntaxe {pagination 20, nom}
272
+    if (isset($crit->param[0][1])) {
273
+        $type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
274
+    } // Ancienne syntaxe {pagination 20 nom} pour compatibilité
275
+    elseif (isset($crit->param[1][0])) {
276
+        $type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
277
+    }
278
+
279
+    $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
280
+    $boucle->modificateur['debut_nom'] = $type;
281
+    $partie =
282
+        // tester si le numero de page demande est de la forme '@yyy'
283
+        'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
284
+        . "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
285
+        . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
286
+        . "\t\t" . '$iter->seek(0);' . "\n"
287
+        . "\t}\n"
288
+        . "\t" . '$debut_boucle = intval($debut_boucle)';
289
+
290
+    $boucle->hash .= '
291 291
 	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
292 292
 
293
-	$boucle->total_parties = $pas;
294
-	calculer_parties($boucles, $idb, $partie, 'p+');
295
-	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
296
-	// sauf si pas de primaire, ou si primaire composee
297
-	// dans ce cas, on ne sait pas gerer une pagination indirecte
298
-	$t = $boucle->id_table . '.' . $boucle->primary;
299
-	if (
300
-		$boucle->primary
301
-		and !preg_match('/[,\s]/', $boucle->primary)
302
-		and !in_array($t, $boucle->select)
303
-	) {
304
-		$boucle->select[] = $t;
305
-	}
293
+    $boucle->total_parties = $pas;
294
+    calculer_parties($boucles, $idb, $partie, 'p+');
295
+    // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
296
+    // sauf si pas de primaire, ou si primaire composee
297
+    // dans ce cas, on ne sait pas gerer une pagination indirecte
298
+    $t = $boucle->id_table . '.' . $boucle->primary;
299
+    if (
300
+        $boucle->primary
301
+        and !preg_match('/[,\s]/', $boucle->primary)
302
+        and !in_array($t, $boucle->select)
303
+    ) {
304
+        $boucle->select[] = $t;
305
+    }
306 306
 }
307 307
 
308 308
 
@@ -324,24 +324,24 @@  discard block
 block discarded – undo
324 324
  **/
325 325
 function critere_recherche_dist($idb, &$boucles, $crit) {
326 326
 
327
-	$boucle = &$boucles[$idb];
327
+    $boucle = &$boucles[$idb];
328 328
 
329
-	if (!$boucle->primary or strpos($boucle->primary, ',')) {
330
-		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
329
+    if (!$boucle->primary or strpos($boucle->primary, ',')) {
330
+        erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
331 331
 
332
-		return;
333
-	}
332
+        return;
333
+    }
334 334
 
335
-	if (isset($crit->param[0])) {
336
-		$quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
337
-	} else {
338
-		$quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
339
-	}
335
+    if (isset($crit->param[0])) {
336
+        $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
337
+    } else {
338
+        $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
339
+    }
340 340
 
341
-	$_modificateur = var_export($boucle->modificateur, true);
342
-	$boucle->hash .= '
341
+    $_modificateur = var_export($boucle->modificateur, true);
342
+    $boucle->hash .= '
343 343
 	// RECHERCHE'
344
-		. ($crit->cond ? '
344
+        . ($crit->cond ? '
345 345
 	if (!strlen(' . $quoi . ')){
346 346
 		list($rech_select, $rech_where) = array("0 as points","");
347 347
 	} else' : '') . '
@@ -352,21 +352,21 @@  discard block
 block discarded – undo
352 352
 	';
353 353
 
354 354
 
355
-	$t = $boucle->id_table . '.' . $boucle->primary;
356
-	if (!in_array($t, $boucles[$idb]->select)) {
357
-		$boucle->select[] = $t;
358
-	} # pour postgres, neuneu ici
359
-	// jointure uniquement sur le serveur principal
360
-	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
361
-	if (!$boucle->sql_serveur) {
362
-		$boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
363
-		$boucle->from['resultats'] = 'spip_resultats';
364
-	}
365
-	$boucle->select[] = '$rech_select';
366
-	//$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
367
-
368
-	// et la recherche trouve
369
-	$boucle->where[] = '$rech_where?$rech_where:\'\'';
355
+    $t = $boucle->id_table . '.' . $boucle->primary;
356
+    if (!in_array($t, $boucles[$idb]->select)) {
357
+        $boucle->select[] = $t;
358
+    } # pour postgres, neuneu ici
359
+    // jointure uniquement sur le serveur principal
360
+    // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
361
+    if (!$boucle->sql_serveur) {
362
+        $boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
363
+        $boucle->from['resultats'] = 'spip_resultats';
364
+    }
365
+    $boucle->select[] = '$rech_select';
366
+    //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
367
+
368
+    // et la recherche trouve
369
+    $boucle->where[] = '$rech_where?$rech_where:\'\'';
370 370
 }
371 371
 
372 372
 /**
@@ -383,25 +383,25 @@  discard block
 block discarded – undo
383 383
  * @return void
384 384
  **/
385 385
 function critere_traduction_dist($idb, &$boucles, $crit) {
386
-	$boucle = &$boucles[$idb];
387
-	$prim = $boucle->primary;
388
-	$table = $boucle->id_table;
389
-	$arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
390
-	$dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
391
-	$boucle->where[] =
392
-		[
393
-			"'OR'",
394
-			[
395
-				"'AND'",
396
-				["'='", "'$table.id_trad'", 0],
397
-				["'='", "'$table.$prim'", $dprim]
398
-			],
399
-			[
400
-				"'AND'",
401
-				["'>'", "'$table.id_trad'", 0],
402
-				["'='", "'$table.id_trad'", $arg]
403
-			]
404
-		];
386
+    $boucle = &$boucles[$idb];
387
+    $prim = $boucle->primary;
388
+    $table = $boucle->id_table;
389
+    $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
390
+    $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
391
+    $boucle->where[] =
392
+        [
393
+            "'OR'",
394
+            [
395
+                "'AND'",
396
+                ["'='", "'$table.id_trad'", 0],
397
+                ["'='", "'$table.$prim'", $dprim]
398
+            ],
399
+            [
400
+                "'AND'",
401
+                ["'>'", "'$table.id_trad'", 0],
402
+                ["'='", "'$table.id_trad'", $arg]
403
+            ]
404
+        ];
405 405
 }
406 406
 
407 407
 
@@ -419,17 +419,17 @@  discard block
 block discarded – undo
419 419
  * @return void
420 420
  **/
421 421
 function critere_origine_traduction_dist($idb, &$boucles, $crit) {
422
-	$boucle = &$boucles[$idb];
423
-	$prim = $boucle->primary;
424
-	$table = $boucle->id_table;
425
-
426
-	$c =
427
-		[
428
-			"'OR'",
429
-			["'='", "'$table." . "id_trad'", "'$table.$prim'"],
430
-			["'='", "'$table.id_trad'", "'0'"]
431
-		];
432
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
422
+    $boucle = &$boucles[$idb];
423
+    $prim = $boucle->primary;
424
+    $table = $boucle->id_table;
425
+
426
+    $c =
427
+        [
428
+            "'OR'",
429
+            ["'='", "'$table." . "id_trad'", "'$table.$prim'"],
430
+            ["'='", "'$table.id_trad'", "'0'"]
431
+        ];
432
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
433 433
 }
434 434
 
435 435
 
@@ -446,17 +446,17 @@  discard block
 block discarded – undo
446 446
  **/
447 447
 function critere_meme_parent_dist($idb, &$boucles, $crit) {
448 448
 
449
-	$boucle = &$boucles[$idb];
450
-	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
451
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
452
-	$mparent = $boucle->id_table . '.' . $id_parent;
453
-
454
-	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
455
-		$boucle->where[] = ["'='", "'$mparent'", $arg];
456
-	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
457
-	else {
458
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]];
459
-	}
449
+    $boucle = &$boucles[$idb];
450
+    $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
451
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
452
+    $mparent = $boucle->id_table . '.' . $id_parent;
453
+
454
+    if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
455
+        $boucle->where[] = ["'='", "'$mparent'", $arg];
456
+    } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
457
+    else {
458
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]];
459
+    }
460 460
 }
461 461
 
462 462
 
@@ -487,37 +487,37 @@  discard block
 block discarded – undo
487 487
  **/
488 488
 function critere_branche_dist($idb, &$boucles, $crit) {
489 489
 
490
-	$not = $crit->not;
491
-	$boucle = &$boucles[$idb];
492
-	// prendre en priorite un identifiant en parametre {branche XX}
493
-	if (isset($crit->param[0])) {
494
-		$arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
495
-		// sinon on le prend chez une boucle parente
496
-	} else {
497
-		$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
498
-	}
499
-
500
-	//Trouver une jointure
501
-	$champ = 'id_rubrique';
502
-	$desc = $boucle->show;
503
-	//Seulement si necessaire
504
-	if (!array_key_exists($champ, $desc['field'])) {
505
-		$cle = trouver_jointure_champ($champ, $boucle);
506
-		$trouver_table = charger_fonction('trouver_table', 'base');
507
-		$desc = $trouver_table($boucle->from[$cle]);
508
-		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
509
-			$decompose = decompose_champ_id_objet($champ);
510
-			$champ = array_shift($decompose);
511
-			$boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
512
-		}
513
-	} else {
514
-		$cle = $boucle->id_table;
515
-	}
516
-
517
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
518
-		. ($not ? ", 'NOT'" : '') . ')';
519
-	$boucle->where[] = !$crit->cond ? $c :
520
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
490
+    $not = $crit->not;
491
+    $boucle = &$boucles[$idb];
492
+    // prendre en priorite un identifiant en parametre {branche XX}
493
+    if (isset($crit->param[0])) {
494
+        $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
495
+        // sinon on le prend chez une boucle parente
496
+    } else {
497
+        $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
498
+    }
499
+
500
+    //Trouver une jointure
501
+    $champ = 'id_rubrique';
502
+    $desc = $boucle->show;
503
+    //Seulement si necessaire
504
+    if (!array_key_exists($champ, $desc['field'])) {
505
+        $cle = trouver_jointure_champ($champ, $boucle);
506
+        $trouver_table = charger_fonction('trouver_table', 'base');
507
+        $desc = $trouver_table($boucle->from[$cle]);
508
+        if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
509
+            $decompose = decompose_champ_id_objet($champ);
510
+            $champ = array_shift($decompose);
511
+            $boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
512
+        }
513
+    } else {
514
+        $cle = $boucle->id_table;
515
+    }
516
+
517
+    $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
518
+        . ($not ? ", 'NOT'" : '') . ')';
519
+    $boucle->where[] = !$crit->cond ? $c :
520
+        ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
521 521
 }
522 522
 
523 523
 /**
@@ -533,15 +533,15 @@  discard block
 block discarded – undo
533 533
  **/
534 534
 function critere_logo_dist($idb, &$boucles, $crit) {
535 535
 
536
-	$boucle = &$boucles[$idb];
537
-	$not = ($crit->not ? 'NOT' : '');
538
-	$serveur = $boucle->sql_serveur;
536
+    $boucle = &$boucles[$idb];
537
+    $not = ($crit->not ? 'NOT' : '');
538
+    $serveur = $boucle->sql_serveur;
539 539
 
540
-	$c = "sql_in('" .
541
-		$boucle->id_table . '.' . $boucle->primary
542
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
540
+    $c = "sql_in('" .
541
+        $boucle->id_table . '.' . $boucle->primary
542
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
543 543
 
544
-	$boucle->where[] = $c;
544
+    $boucle->where[] = $c;
545 545
 }
546 546
 
547 547
 
@@ -563,31 +563,31 @@  discard block
 block discarded – undo
563 563
  * @return void|array
564 564
  **/
565 565
 function critere_fusion_dist($idb, &$boucles, $crit) {
566
-	if ($t = isset($crit->param[0])) {
567
-		$t = $crit->param[0];
568
-		if ($t[0]->type == 'texte') {
569
-			$t = $t[0]->texte;
570
-			if (preg_match('/^(.*)\.(.*)$/', $t, $r)) {
571
-				$t = table_objet_sql($r[1]);
572
-				$t = array_search($t, $boucles[$idb]->from);
573
-				if ($t) {
574
-					$t .= '.' . $r[2];
575
-				}
576
-			}
577
-		} else {
578
-			$t = '".'
579
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
580
-				. '."';
581
-		}
582
-	}
583
-	if ($t) {
584
-		$boucles[$idb]->group[] = $t;
585
-		if (!in_array($t, $boucles[$idb]->select)) {
586
-			$boucles[$idb]->select[] = $t;
587
-		}
588
-	} else {
589
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
590
-	}
566
+    if ($t = isset($crit->param[0])) {
567
+        $t = $crit->param[0];
568
+        if ($t[0]->type == 'texte') {
569
+            $t = $t[0]->texte;
570
+            if (preg_match('/^(.*)\.(.*)$/', $t, $r)) {
571
+                $t = table_objet_sql($r[1]);
572
+                $t = array_search($t, $boucles[$idb]->from);
573
+                if ($t) {
574
+                    $t .= '.' . $r[2];
575
+                }
576
+            }
577
+        } else {
578
+            $t = '".'
579
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
580
+                . '."';
581
+        }
582
+    }
583
+    if ($t) {
584
+        $boucles[$idb]->group[] = $t;
585
+        if (!in_array($t, $boucles[$idb]->select)) {
586
+            $boucles[$idb]->select[] = $t;
587
+        }
588
+    } else {
589
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
590
+    }
591 591
 }
592 592
 
593 593
 /**
@@ -607,7 +607,7 @@  discard block
 block discarded – undo
607 607
  * @return void
608 608
  **/
609 609
 function critere_fusion_supprimer_dist($idb, &$boucles, $crit) {
610
-	$boucles[$idb]->group = [];
610
+    $boucles[$idb]->group = [];
611 611
 }
612 612
 
613 613
 /**
@@ -644,44 +644,44 @@  discard block
 block discarded – undo
644 644
  * @param Critere $crit Paramètres du critère dans cette boucle
645 645
  */
646 646
 function critere_collecte_dist($idb, &$boucles, $crit) {
647
-	if (isset($crit->param[0])) {
648
-		$_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
649
-		$boucle = $boucles[$idb];
650
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
651
-		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
652
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
653
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
654
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
655
-			if (
656
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
657
-				or (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
658
-			) {
659
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
660
-			} else {
661
-				$boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
662
-			}
663
-		}
664
-	} else {
665
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
666
-	}
647
+    if (isset($crit->param[0])) {
648
+        $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
649
+        $boucle = $boucles[$idb];
650
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
651
+        $n = is_countable($boucle->order) ? count($boucle->order) : 0;
652
+        if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
653
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
654
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
655
+            if (
656
+                (false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
657
+                or (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
658
+            ) {
659
+                $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
660
+            } else {
661
+                $boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
662
+            }
663
+        }
664
+    } else {
665
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
666
+    }
667 667
 }
668 668
 
669 669
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
670
-	$boucle = $boucles[$idb];
671
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
672
-	$var = '$champs_' . $idb;
673
-	$desc = (strpos($boucle->in, (string) "static $var =") !== false);
674
-	if (!$desc) {
675
-		$desc = $boucle->show['field'];
676
-		$desc = implode(',', array_map('_q', array_keys($desc)));
677
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
678
-	}
679
-	if ($desc) {
680
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
681
-	}
682
-	$arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
683
-
684
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
670
+    $boucle = $boucles[$idb];
671
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
672
+    $var = '$champs_' . $idb;
673
+    $desc = (strpos($boucle->in, (string) "static $var =") !== false);
674
+    if (!$desc) {
675
+        $desc = $boucle->show['field'];
676
+        $desc = implode(',', array_map('_q', array_keys($desc)));
677
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
678
+    }
679
+    if ($desc) {
680
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
681
+    }
682
+    $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
683
+
684
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
685 685
 }
686 686
 
687 687
 /**
@@ -720,7 +720,7 @@  discard block
 block discarded – undo
720 720
  * @param Critere $crit Paramètres du critère dans cette boucle
721 721
  */
722 722
 function critere_par_dist($idb, &$boucles, $crit) {
723
-	return critere_parinverse($idb, $boucles, $crit);
723
+    return critere_parinverse($idb, $boucles, $crit);
724 724
 }
725 725
 
726 726
 /**
@@ -742,93 +742,93 @@  discard block
 block discarded – undo
742 742
  * @param Critere $crit Paramètres du critère dans cette boucle
743 743
  */
744 744
 function critere_parinverse($idb, &$boucles, $crit) {
745
-	$boucle = &$boucles[$idb];
746
-
747
-	$sens = $collecte = '';
748
-	if ($crit->not) {
749
-		$sens = " . ' DESC'";
750
-	}
751
-	if (isset($boucle->modificateur['collate'])) {
752
-		$collecte = ' . ' . $boucle->modificateur['collate'];
753
-	}
754
-
755
-	// Pour chaque paramètre du critère
756
-	foreach ($crit->param as $tri) {
757
-		$order = $fct = '';
758
-		// tris specifiés dynamiquement {par #ENV{tri}}
759
-		if ($tri[0]->type != 'texte') {
760
-			// calculer le order dynamique qui verifie les champs
761
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
762
-			// ajouter 'hasard' comme possibilité de tri dynamique
763
-			calculer_critere_par_hasard($idb, $boucles, $crit);
764
-		}
765
-		// tris textuels {par titre}
766
-		else {
767
-			$par = array_shift($tri);
768
-			$par = $par->texte;
769
-
770
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
771
-			if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) {
772
-				$expression = trim($m[1]);
773
-				$champ = trim($m[2]);
774
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
775
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
776
-				} else {
777
-					return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
778
-				}
779
-
780
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
781
-			} elseif ($boucle->type_requete == 'DATA' or preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
782
-				// {par FONCTION(champ)}
783
-				if (isset($match) and count($match) > 2) {
784
-					$par = substr($match[2], 1, -1);
785
-					$fct = $match[1];
786
-				}
787
-				// quelques cas spécifiques {par hasard}, {par date}
788
-				if ($par == 'hasard') {
789
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
790
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
791
-					$order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
792
-				} else {
793
-					// cas général {par champ}, {par table.champ}, ...
794
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
795
-				}
796
-			}
797
-
798
-			// on ne sait pas traiter…
799
-			else {
800
-				return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
801
-			}
802
-
803
-			// En cas d'erreur de squelette retournée par une fonction
804
-			if (is_array($order)) {
805
-				return $order;
806
-			}
807
-		}
808
-
809
-		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
810
-			$t = $m[1];
811
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
812
-				$boucle->select[] = $t;
813
-			}
814
-		} else {
815
-			$sens = '';
816
-		}
817
-
818
-		if ($fct) {
819
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
820
-				$order = "'$fct(" . $r[1] . ")'";
821
-			} else {
822
-				$order = "'$fct(' . $order . ')'";
823
-			}
824
-		}
825
-		$t = $order . $collecte . $sens;
826
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
827
-			$t = $r[1] . $r[2];
828
-		}
829
-
830
-		$boucle->order[] = $t;
831
-	}
745
+    $boucle = &$boucles[$idb];
746
+
747
+    $sens = $collecte = '';
748
+    if ($crit->not) {
749
+        $sens = " . ' DESC'";
750
+    }
751
+    if (isset($boucle->modificateur['collate'])) {
752
+        $collecte = ' . ' . $boucle->modificateur['collate'];
753
+    }
754
+
755
+    // Pour chaque paramètre du critère
756
+    foreach ($crit->param as $tri) {
757
+        $order = $fct = '';
758
+        // tris specifiés dynamiquement {par #ENV{tri}}
759
+        if ($tri[0]->type != 'texte') {
760
+            // calculer le order dynamique qui verifie les champs
761
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
762
+            // ajouter 'hasard' comme possibilité de tri dynamique
763
+            calculer_critere_par_hasard($idb, $boucles, $crit);
764
+        }
765
+        // tris textuels {par titre}
766
+        else {
767
+            $par = array_shift($tri);
768
+            $par = $par->texte;
769
+
770
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
771
+            if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) {
772
+                $expression = trim($m[1]);
773
+                $champ = trim($m[2]);
774
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
775
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
776
+                } else {
777
+                    return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
778
+                }
779
+
780
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
781
+            } elseif ($boucle->type_requete == 'DATA' or preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
782
+                // {par FONCTION(champ)}
783
+                if (isset($match) and count($match) > 2) {
784
+                    $par = substr($match[2], 1, -1);
785
+                    $fct = $match[1];
786
+                }
787
+                // quelques cas spécifiques {par hasard}, {par date}
788
+                if ($par == 'hasard') {
789
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
790
+                } elseif ($par == 'date' and !empty($boucle->show['date'])) {
791
+                    $order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
792
+                } else {
793
+                    // cas général {par champ}, {par table.champ}, ...
794
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
795
+                }
796
+            }
797
+
798
+            // on ne sait pas traiter…
799
+            else {
800
+                return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
801
+            }
802
+
803
+            // En cas d'erreur de squelette retournée par une fonction
804
+            if (is_array($order)) {
805
+                return $order;
806
+            }
807
+        }
808
+
809
+        if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
810
+            $t = $m[1];
811
+            if (strpos($t, '.') and !in_array($t, $boucle->select)) {
812
+                $boucle->select[] = $t;
813
+            }
814
+        } else {
815
+            $sens = '';
816
+        }
817
+
818
+        if ($fct) {
819
+            if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
820
+                $order = "'$fct(" . $r[1] . ")'";
821
+            } else {
822
+                $order = "'$fct(' . $order . ')'";
823
+            }
824
+        }
825
+        $t = $order . $collecte . $sens;
826
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
827
+            $t = $r[1] . $r[2];
828
+        }
829
+
830
+        $boucle->order[] = $t;
831
+    }
832 832
 }
833 833
 
834 834
 /**
@@ -842,13 +842,13 @@  discard block
 block discarded – undo
842 842
  * @return string Clause pour le Order by
843 843
  */
844 844
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
845
-	$boucle = &$boucles[$idb];
846
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
847
-	$parha = 'rand() AS hasard';
848
-	if (!in_array($parha, $boucle->select)) {
849
-		$boucle->select[] = $parha;
850
-	}
851
-	return "'hasard'";
845
+    $boucle = &$boucles[$idb];
846
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
847
+    $parha = 'rand() AS hasard';
848
+    if (!in_array($parha, $boucle->select)) {
849
+        $boucle->select[] = $parha;
850
+    }
851
+    return "'hasard'";
852 852
 }
853 853
 
854 854
 /**
@@ -872,24 +872,24 @@  discard block
 block discarded – undo
872 872
  * @return string|array Clause pour le Order by (array si erreur)
873 873
  */
874 874
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
875
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
876
-	if (is_array($_champ)) {
877
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
878
-	}
879
-	$boucle = &$boucles[$idb];
880
-	$texte = '0+' . $_champ;
881
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
882
-	if ($suite !== "''") {
883
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
884
-	}
885
-	$asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
886
-	$boucle->select[] = $texte . " AS $asnum";
887
-
888
-	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
889
-	$orderassinum = trim($orderassinum, "'");
890
-
891
-	$order = "'$orderassinum, $asnum'";
892
-	return $order;
875
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
876
+    if (is_array($_champ)) {
877
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
878
+    }
879
+    $boucle = &$boucles[$idb];
880
+    $texte = '0+' . $_champ;
881
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
882
+    if ($suite !== "''") {
883
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
884
+    }
885
+    $asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
886
+    $boucle->select[] = $texte . " AS $asnum";
887
+
888
+    $orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
889
+    $orderassinum = trim($orderassinum, "'");
890
+
891
+    $order = "'$orderassinum, $asnum'";
892
+    return $order;
893 893
 }
894 894
 
895 895
 /**
@@ -910,35 +910,35 @@  discard block
 block discarded – undo
910 910
  * @return string|array Clause pour le Order by (array si erreur)
911 911
  */
912 912
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
913
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
914
-	if (is_array($_champ)) {
915
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
916
-	}
917
-	$boucle = &$boucles[$idb];
918
-	$texte = '0+' . $_champ;
919
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
920
-	if ($suite !== "''") {
921
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
922
-	}
923
-
924
-	$as = false;
925
-	$select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
926
-	foreach ($boucle->select as $s) {
927
-		if (strpos($s, $select) === 0) {
928
-			$as = trim(substr($s, strlen($select)));
929
-			if (!preg_match(',\W,', $as)) {
930
-				break;
931
-			}
932
-			$as = false;
933
-		}
934
-	}
935
-
936
-	if (!$as) {
937
-		$as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
938
-		$boucle->select[] = $select . $as;
939
-	}
940
-	$order = "'$as'";
941
-	return $order;
913
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
914
+    if (is_array($_champ)) {
915
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
916
+    }
917
+    $boucle = &$boucles[$idb];
918
+    $texte = '0+' . $_champ;
919
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
920
+    if ($suite !== "''") {
921
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
922
+    }
923
+
924
+    $as = false;
925
+    $select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
926
+    foreach ($boucle->select as $s) {
927
+        if (strpos($s, $select) === 0) {
928
+            $as = trim(substr($s, strlen($select)));
929
+            if (!preg_match(',\W,', $as)) {
930
+                break;
931
+            }
932
+            $as = false;
933
+        }
934
+    }
935
+
936
+    if (!$as) {
937
+        $as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
938
+        $boucle->select[] = $select . $as;
939
+    }
940
+    $order = "'$as'";
941
+    return $order;
942 942
 }
943 943
 
944 944
 
@@ -958,14 +958,14 @@  discard block
 block discarded – undo
958 958
  * @return string|array Clause pour le Order by (array si erreur)
959 959
  */
960 960
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
961
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
962
-	if (is_array($_champ)) {
963
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
964
-	}
965
-	$boucle = &$boucles[$idb];
966
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
967
-	$order = "'multi'";
968
-	return $order;
961
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
962
+    if (is_array($_champ)) {
963
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
964
+    }
965
+    $boucle = &$boucles[$idb];
966
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
967
+    $order = "'multi'";
968
+    return $order;
969 969
 }
970 970
 
971 971
 /**
@@ -984,56 +984,56 @@  discard block
 block discarded – undo
984 984
  * @return array|string
985 985
  */
986 986
 function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) {
987
-	$boucle = &$boucles[$idb];
988
-	$desc = $boucle->show;
989
-
990
-	// le champ existe dans la table, pas de souci (le plus commun)
991
-	if (isset($desc['field'][$par])) {
992
-		$par = $boucle->id_table . '.' . $par;
993
-	}
994
-	// le champ est peut être une jointure
995
-	else {
996
-		$table = $table_alias = false; // toutes les tables de jointure possibles
997
-		$champ = $par;
998
-
999
-		// le champ demandé est une exception de jointure {par titre_mot}
1000
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1001
-			[$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par];
1002
-		} // la table de jointure est explicitement indiquée {par truc.muche}
1003
-		elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1004
-			[, $table, $champ] = $r;
1005
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1006
-			$table = table_objet_sql($table);
1007
-		}
1008
-
1009
-		// Si on connait la table d'arrivée, on la demande donc explicitement
1010
-		// Sinon on cherche le champ dans les tables possibles de jointures
1011
-		// Si la table est déjà dans le from, on la réutilise.
1012
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1013
-			$par = $infos['alias'] . '.' . $champ;
1014
-		} elseif (
1015
-			$boucle->jointures_explicites
1016
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1017
-		) {
1018
-			$par = $alias . '.' . $champ;
1019
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1020
-			$par = $alias . '.' . $champ;
1021
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1022
-		} elseif (
1023
-			$table_alias
1024
-			and isset($boucle->from[$table_alias])
1025
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1026
-		) {
1027
-			$par = $infos['alias'] . '.' . $champ;
1028
-		} elseif ($table) {
1029
-			// On avait table + champ, mais on ne les a pas trouvés
1030
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1031
-		} else {
1032
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1033
-		}
1034
-	}
1035
-
1036
-	return $raw ? $par : "'$par'";
987
+    $boucle = &$boucles[$idb];
988
+    $desc = $boucle->show;
989
+
990
+    // le champ existe dans la table, pas de souci (le plus commun)
991
+    if (isset($desc['field'][$par])) {
992
+        $par = $boucle->id_table . '.' . $par;
993
+    }
994
+    // le champ est peut être une jointure
995
+    else {
996
+        $table = $table_alias = false; // toutes les tables de jointure possibles
997
+        $champ = $par;
998
+
999
+        // le champ demandé est une exception de jointure {par titre_mot}
1000
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1001
+            [$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par];
1002
+        } // la table de jointure est explicitement indiquée {par truc.muche}
1003
+        elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1004
+            [, $table, $champ] = $r;
1005
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1006
+            $table = table_objet_sql($table);
1007
+        }
1008
+
1009
+        // Si on connait la table d'arrivée, on la demande donc explicitement
1010
+        // Sinon on cherche le champ dans les tables possibles de jointures
1011
+        // Si la table est déjà dans le from, on la réutilise.
1012
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1013
+            $par = $infos['alias'] . '.' . $champ;
1014
+        } elseif (
1015
+            $boucle->jointures_explicites
1016
+            and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1017
+        ) {
1018
+            $par = $alias . '.' . $champ;
1019
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1020
+            $par = $alias . '.' . $champ;
1021
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1022
+        } elseif (
1023
+            $table_alias
1024
+            and isset($boucle->from[$table_alias])
1025
+            and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1026
+        ) {
1027
+            $par = $infos['alias'] . '.' . $champ;
1028
+        } elseif ($table) {
1029
+            // On avait table + champ, mais on ne les a pas trouvés
1030
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1031
+        } else {
1032
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1033
+        }
1034
+    }
1035
+
1036
+    return $raw ? $par : "'$par'";
1037 1037
 }
1038 1038
 
1039 1039
 /**
@@ -1047,11 +1047,11 @@  discard block
 block discarded – undo
1047 1047
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1048 1048
  */
1049 1049
 function critere_par_joint($table, $champ, &$boucle) {
1050
-	$t = array_search($table, $boucle->from);
1051
-	if (!$t) {
1052
-		$t = trouver_jointure_champ($champ, $boucle);
1053
-	}
1054
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1050
+    $t = array_search($table, $boucle->from);
1051
+    if (!$t) {
1052
+        $t = trouver_jointure_champ($champ, $boucle);
1053
+    }
1054
+    return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1055 1055
 }
1056 1056
 
1057 1057
 /**
@@ -1076,33 +1076,33 @@  discard block
 block discarded – undo
1076 1076
  */
1077 1077
 function critere_inverse_dist($idb, &$boucles, $crit) {
1078 1078
 
1079
-	$boucle = &$boucles[$idb];
1080
-	// Classement par ordre inverse
1081
-	if ($crit->not) {
1082
-		critere_parinverse($idb, $boucles, $crit);
1083
-	} else {
1084
-		$order = "' DESC'";
1085
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1086
-		if (isset($crit->param[0])) {
1087
-			$critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1088
-			$order = "(($critere)?' DESC':'')";
1089
-		}
1090
-
1091
-		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
1092
-		if (!$n) {
1093
-			if (isset($boucle->default_order[0])) {
1094
-				$boucle->default_order[0] .= ' . " DESC"';
1095
-			} else {
1096
-				$boucle->default_order[] = ' DESC';
1097
-			}
1098
-		} else {
1099
-			$t = $boucle->order[$n - 1] . " . $order";
1100
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1101
-				$t = $r[1] . $r[2];
1102
-			}
1103
-			$boucle->order[$n - 1] = $t;
1104
-		}
1105
-	}
1079
+    $boucle = &$boucles[$idb];
1080
+    // Classement par ordre inverse
1081
+    if ($crit->not) {
1082
+        critere_parinverse($idb, $boucles, $crit);
1083
+    } else {
1084
+        $order = "' DESC'";
1085
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1086
+        if (isset($crit->param[0])) {
1087
+            $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1088
+            $order = "(($critere)?' DESC':'')";
1089
+        }
1090
+
1091
+        $n = is_countable($boucle->order) ? count($boucle->order) : 0;
1092
+        if (!$n) {
1093
+            if (isset($boucle->default_order[0])) {
1094
+                $boucle->default_order[0] .= ' . " DESC"';
1095
+            } else {
1096
+                $boucle->default_order[] = ' DESC';
1097
+            }
1098
+        } else {
1099
+            $t = $boucle->order[$n - 1] . " . $order";
1100
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1101
+                $t = $r[1] . $r[2];
1102
+            }
1103
+            $boucle->order[$n - 1] = $t;
1104
+        }
1105
+    }
1106 1106
 }
1107 1107
 
1108 1108
 /**
@@ -1113,137 +1113,137 @@  discard block
 block discarded – undo
1113 1113
  * @return void|array
1114 1114
  */
1115 1115
 function critere_par_ordre_liste_dist($idb, &$boucles, $crit) {
1116
-	$boucle = &$boucles[$idb];
1116
+    $boucle = &$boucles[$idb];
1117 1117
 
1118
-	$sens = $collecte = '';
1119
-	if ($crit->not) {
1120
-		$sens = " . ' DESC'";
1121
-	}
1118
+    $sens = $collecte = '';
1119
+    if ($crit->not) {
1120
+        $sens = " . ' DESC'";
1121
+    }
1122 1122
 
1123
-	$crit2 = clone $crit;
1124
-	$crit2->not = false;
1125
-	$crit2->param = [reset($crit->param)];
1126
-	$res = critere_parinverse($idb, $boucles, $crit2);
1123
+    $crit2 = clone $crit;
1124
+    $crit2->not = false;
1125
+    $crit2->param = [reset($crit->param)];
1126
+    $res = critere_parinverse($idb, $boucles, $crit2);
1127 1127
 
1128
-	// erreur ?
1129
-	if (is_array($res)) {
1130
-		return $res;
1131
-	}
1128
+    // erreur ?
1129
+    if (is_array($res)) {
1130
+        return $res;
1131
+    }
1132 1132
 
1133
-	$_order = array_pop($boucle->order);
1133
+    $_order = array_pop($boucle->order);
1134 1134
 
1135
-	$_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1136
-	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1135
+    $_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1136
+    $boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1137 1137
 }
1138 1138
 
1139 1139
 
1140 1140
 function critere_agenda_dist($idb, &$boucles, $crit) {
1141
-	$params = $crit->param;
1142
-
1143
-	if ((is_countable($params) ? count($params) : 0) < 1) {
1144
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1145
-	}
1146
-
1147
-	$boucle = &$boucles[$idb];
1148
-	$parent = $boucle->id_parent;
1149
-	$fields = $boucle->show['field'];
1150
-
1151
-	$date = array_shift($params);
1152
-	$type = array_shift($params);
1153
-
1154
-	// la valeur $type doit etre connue a la compilation
1155
-	// donc etre forcement reduite a un litteral unique dans le source
1156
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1157
-
1158
-	// La valeur date doit designer un champ de la table SQL.
1159
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1160
-	// sinon synthetiser le test de verif pour execution ulterieure
1161
-	// On prendra arbitrairement le premier champ si test negatif.
1162
-	if (((is_countable($date) ? count($date) : 0) == 1) and ($date[0]->type == 'texte')) {
1163
-		$date = $date[0]->texte;
1164
-		if (!isset($fields[$date])) {
1165
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1166
-		}
1167
-	} else {
1168
-		$a = calculer_liste($date, $idb, $boucles, $parent);
1169
-		$noms = array_keys($fields);
1170
-		$defaut = $noms[0];
1171
-		$noms = join(' ', $noms);
1172
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1173
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1174
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1175
-	}
1176
-	$annee = $params ? array_shift($params) : '';
1177
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1178
-		calculer_liste($annee, $idb, $boucles, $parent) .
1179
-		') ? $x : date("Y"))';
1180
-
1181
-	$mois = $params ? array_shift($params) : '';
1182
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1183
-		calculer_liste($mois, $idb, $boucles, $parent) .
1184
-		') ? $x : date("m"))';
1185
-
1186
-	$jour = $params ? array_shift($params) : '';
1187
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1188
-		calculer_liste($jour, $idb, $boucles, $parent) .
1189
-		') ? $x : date("d"))';
1190
-
1191
-	$annee2 = $params ? array_shift($params) : '';
1192
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1193
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1194
-		') ? $x : date("Y"))';
1195
-
1196
-	$mois2 = $params ? array_shift($params) : '';
1197
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1198
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1199
-		') ? $x : date("m"))';
1200
-
1201
-	$jour2 = $params ? array_shift($params) : '';
1202
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1203
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1204
-		') ? $x : date("d"))';
1205
-
1206
-	$date = $boucle->id_table . ".$date";
1207
-
1208
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1209
-	if ($type == 'jour') {
1210
-		$boucle->where[] = [
1211
-			"'='",
1212
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1213
-			("sql_quote($annee . $mois . $jour$quote_end)")
1214
-		];
1215
-	} elseif ($type == 'mois') {
1216
-		$boucle->where[] = [
1217
-			"'='",
1218
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1219
-			("sql_quote($annee . $mois$quote_end)")
1220
-		];
1221
-	} elseif ($type == 'semaine') {
1222
-		$boucle->where[] = [
1223
-			"'AND'",
1224
-			[
1225
-				"'>='",
1226
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1227
-				("date_debut_semaine($annee, $mois, $jour)")
1228
-			],
1229
-			[
1230
-				"'<='",
1231
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1232
-				("date_fin_semaine($annee, $mois, $jour)")
1233
-			]
1234
-		];
1235
-	} elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) {
1236
-		$boucle->where[] = [
1237
-			"'AND'",
1238
-			[
1239
-				"'>='",
1240
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1241
-				("sql_quote($annee . $mois . $jour$quote_end)")
1242
-			],
1243
-			["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1244
-		];
1245
-	}
1246
-	// sinon on prend tout
1141
+    $params = $crit->param;
1142
+
1143
+    if ((is_countable($params) ? count($params) : 0) < 1) {
1144
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1145
+    }
1146
+
1147
+    $boucle = &$boucles[$idb];
1148
+    $parent = $boucle->id_parent;
1149
+    $fields = $boucle->show['field'];
1150
+
1151
+    $date = array_shift($params);
1152
+    $type = array_shift($params);
1153
+
1154
+    // la valeur $type doit etre connue a la compilation
1155
+    // donc etre forcement reduite a un litteral unique dans le source
1156
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1157
+
1158
+    // La valeur date doit designer un champ de la table SQL.
1159
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1160
+    // sinon synthetiser le test de verif pour execution ulterieure
1161
+    // On prendra arbitrairement le premier champ si test negatif.
1162
+    if (((is_countable($date) ? count($date) : 0) == 1) and ($date[0]->type == 'texte')) {
1163
+        $date = $date[0]->texte;
1164
+        if (!isset($fields[$date])) {
1165
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1166
+        }
1167
+    } else {
1168
+        $a = calculer_liste($date, $idb, $boucles, $parent);
1169
+        $noms = array_keys($fields);
1170
+        $defaut = $noms[0];
1171
+        $noms = join(' ', $noms);
1172
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1173
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1174
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1175
+    }
1176
+    $annee = $params ? array_shift($params) : '';
1177
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1178
+        calculer_liste($annee, $idb, $boucles, $parent) .
1179
+        ') ? $x : date("Y"))';
1180
+
1181
+    $mois = $params ? array_shift($params) : '';
1182
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1183
+        calculer_liste($mois, $idb, $boucles, $parent) .
1184
+        ') ? $x : date("m"))';
1185
+
1186
+    $jour = $params ? array_shift($params) : '';
1187
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1188
+        calculer_liste($jour, $idb, $boucles, $parent) .
1189
+        ') ? $x : date("d"))';
1190
+
1191
+    $annee2 = $params ? array_shift($params) : '';
1192
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1193
+        calculer_liste($annee2, $idb, $boucles, $parent) .
1194
+        ') ? $x : date("Y"))';
1195
+
1196
+    $mois2 = $params ? array_shift($params) : '';
1197
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1198
+        calculer_liste($mois2, $idb, $boucles, $parent) .
1199
+        ') ? $x : date("m"))';
1200
+
1201
+    $jour2 = $params ? array_shift($params) : '';
1202
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1203
+        calculer_liste($jour2, $idb, $boucles, $parent) .
1204
+        ') ? $x : date("d"))';
1205
+
1206
+    $date = $boucle->id_table . ".$date";
1207
+
1208
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1209
+    if ($type == 'jour') {
1210
+        $boucle->where[] = [
1211
+            "'='",
1212
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1213
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1214
+        ];
1215
+    } elseif ($type == 'mois') {
1216
+        $boucle->where[] = [
1217
+            "'='",
1218
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1219
+            ("sql_quote($annee . $mois$quote_end)")
1220
+        ];
1221
+    } elseif ($type == 'semaine') {
1222
+        $boucle->where[] = [
1223
+            "'AND'",
1224
+            [
1225
+                "'>='",
1226
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1227
+                ("date_debut_semaine($annee, $mois, $jour)")
1228
+            ],
1229
+            [
1230
+                "'<='",
1231
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1232
+                ("date_fin_semaine($annee, $mois, $jour)")
1233
+            ]
1234
+        ];
1235
+    } elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) {
1236
+        $boucle->where[] = [
1237
+            "'AND'",
1238
+            [
1239
+                "'>='",
1240
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1241
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1242
+            ],
1243
+            ["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1244
+        ];
1245
+    }
1246
+    // sinon on prend tout
1247 1247
 }
1248 1248
 
1249 1249
 
@@ -1268,33 +1268,33 @@  discard block
 block discarded – undo
1268 1268
  * @return void
1269 1269
  **/
1270 1270
 function calculer_critere_parties($idb, &$boucles, $crit) {
1271
-	$boucle = &$boucles[$idb];
1272
-	$a1 = $crit->param[0];
1273
-	$a2 = $crit->param[1];
1274
-	$op = $crit->op;
1275
-
1276
-	[$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1);
1277
-	[$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1278
-
1279
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1280
-		$boucle->limit = $a11 . ',' . $a21;
1281
-	} else {
1282
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1283
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1284
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1285
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1286
-		$mode = (($op == '/') ? '/' :
1287
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1288
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1289
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') {
1290
-			$boucle->limit =
1291
-				(is_numeric($a11) ? "'$a11'" : $a11)
1292
-				. ".','."
1293
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1294
-		} else {
1295
-			calculer_parties($boucles, $idb, $partie, $mode);
1296
-		}
1297
-	}
1271
+    $boucle = &$boucles[$idb];
1272
+    $a1 = $crit->param[0];
1273
+    $a2 = $crit->param[1];
1274
+    $op = $crit->op;
1275
+
1276
+    [$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1);
1277
+    [$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1278
+
1279
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1280
+        $boucle->limit = $a11 . ',' . $a21;
1281
+    } else {
1282
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1283
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1284
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1285
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1286
+        $mode = (($op == '/') ? '/' :
1287
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1288
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1289
+        if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') {
1290
+            $boucle->limit =
1291
+                (is_numeric($a11) ? "'$a11'" : $a11)
1292
+                . ".','."
1293
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1294
+        } else {
1295
+            calculer_parties($boucles, $idb, $partie, $mode);
1296
+        }
1297
+    }
1298 1298
 }
1299 1299
 
1300 1300
 /**
@@ -1322,63 +1322,63 @@  discard block
 block discarded – undo
1322 1322
  * @return void
1323 1323
  **/
1324 1324
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1325
-	$total_parties = $boucles[$id_boucle]->total_parties;
1326
-
1327
-	preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1328
-	[, $op1, $op2] = array_pad($regs, 3, null);
1329
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1330
-	// {1/3}
1331
-	if ($op1 == '/') {
1332
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1333
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1334
-			"($total_parties ? $total_parties : 1)";
1335
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1336
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1337
-	} else {
1338
-		// cas {n-1,x}
1339
-		if ($op1 == '-') {
1340
-			$debut = "$nombre_boucle - $debut;";
1341
-		}
1342
-
1343
-		// cas {x,n-1}
1344
-		if ($op2 == '-') {
1345
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1346
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1347
-					($total_parties . ' - 1'));
1348
-		} else {
1349
-			// {x,1} ou {pagination}
1350
-			$fin = '$debut_boucle'
1351
-				. (is_numeric($total_parties) ?
1352
-					(($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1353
-					('+' . $total_parties . ' - 1'));
1354
-		}
1355
-
1356
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1357
-		if ($op1 == 'p') {
1358
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1359
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1360
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1361
-		}
1362
-	}
1363
-
1364
-	// Notes :
1365
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1366
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1367
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1368
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1369
-
1370
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1371
-		. '$debut_boucle = ' . $debut . ";\n	"
1372
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1373
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1374
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1375
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1376
-		. "\n\tif (\$debut_boucle>0"
1377
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1378
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1379
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1380
-
1381
-	$boucles[$id_boucle]->partie = "
1325
+    $total_parties = $boucles[$id_boucle]->total_parties;
1326
+
1327
+    preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1328
+    [, $op1, $op2] = array_pad($regs, 3, null);
1329
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1330
+    // {1/3}
1331
+    if ($op1 == '/') {
1332
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1333
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1334
+            "($total_parties ? $total_parties : 1)";
1335
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1336
+        $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1337
+    } else {
1338
+        // cas {n-1,x}
1339
+        if ($op1 == '-') {
1340
+            $debut = "$nombre_boucle - $debut;";
1341
+        }
1342
+
1343
+        // cas {x,n-1}
1344
+        if ($op2 == '-') {
1345
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1346
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1347
+                    ($total_parties . ' - 1'));
1348
+        } else {
1349
+            // {x,1} ou {pagination}
1350
+            $fin = '$debut_boucle'
1351
+                . (is_numeric($total_parties) ?
1352
+                    (($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1353
+                    ('+' . $total_parties . ' - 1'));
1354
+        }
1355
+
1356
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1357
+        if ($op1 == 'p') {
1358
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1359
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1360
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1361
+        }
1362
+    }
1363
+
1364
+    // Notes :
1365
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1366
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1367
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1368
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1369
+
1370
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1371
+        . '$debut_boucle = ' . $debut . ";\n	"
1372
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1373
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1374
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1375
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1376
+        . "\n\tif (\$debut_boucle>0"
1377
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1378
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1379
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1380
+
1381
+    $boucles[$id_boucle]->partie = "
1382 1382
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1383 1383
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1384 1384
 }
@@ -1395,26 +1395,26 @@  discard block
 block discarded – undo
1395 1395
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1396 1396
  **/
1397 1397
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1398
-	if ($param[0]->type != 'texte') {
1399
-		$a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1400
-		if (isset($param[1]->texte)) {
1401
-			preg_match(',^\s*(-([0-9]+))?\s*$,', $param[1]->texte, $m);
1402
-
1403
-			return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)];
1404
-		} else {
1405
-			return ["intval($a1)", 0];
1406
-		}
1407
-	} else {
1408
-		preg_match(',^\s*(([0-9]+)|n)\s*(-\s*([0-9]+)?\s*)?$,', $param[0]->texte, $m);
1409
-		$a1 = $m[1];
1410
-		if (empty($m[3])) {
1411
-			return [$a1, 0];
1412
-		} elseif (!empty($m[4])) {
1413
-			return [$a1, $m[4]];
1414
-		} else {
1415
-			return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1416
-		}
1417
-	}
1398
+    if ($param[0]->type != 'texte') {
1399
+        $a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1400
+        if (isset($param[1]->texte)) {
1401
+            preg_match(',^\s*(-([0-9]+))?\s*$,', $param[1]->texte, $m);
1402
+
1403
+            return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)];
1404
+        } else {
1405
+            return ["intval($a1)", 0];
1406
+        }
1407
+    } else {
1408
+        preg_match(',^\s*(([0-9]+)|n)\s*(-\s*([0-9]+)?\s*)?$,', $param[0]->texte, $m);
1409
+        $a1 = $m[1];
1410
+        if (empty($m[3])) {
1411
+            return [$a1, 0];
1412
+        } elseif (!empty($m[4])) {
1413
+            return [$a1, $m[4]];
1414
+        } else {
1415
+            return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1416
+        }
1417
+    }
1418 1418
 }
1419 1419
 
1420 1420
 
@@ -1441,47 +1441,47 @@  discard block
 block discarded – undo
1441 1441
  *     array : Erreur sur un des critères
1442 1442
  **/
1443 1443
 function calculer_criteres($idb, &$boucles) {
1444
-	$msg = '';
1445
-	$boucle = $boucles[$idb];
1446
-	$table = strtoupper($boucle->type_requete);
1447
-	$serveur = strtolower($boucle->sql_serveur);
1448
-
1449
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1450
-	// s'il y avait une erreur de syntaxe, propager cette info
1451
-	if (!is_array($boucle->criteres)) {
1452
-		return [];
1453
-	}
1454
-
1455
-	foreach ($boucle->criteres as $crit) {
1456
-		$critere = $crit->op;
1457
-		// critere personnalise ?
1458
-		if (
1459
-			(!$serveur or
1460
-				((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere))
1461
-					and (!function_exists($f = $f . '_dist'))
1462
-					and (!function_exists($f = 'critere_' . $serveur . '_' . $critere))
1463
-					and (!function_exists($f = $f . '_dist'))
1464
-				)
1465
-			)
1466
-			and (!function_exists($f = 'critere_' . $table . '_' . $critere))
1467
-			and (!function_exists($f = $f . '_dist'))
1468
-			and (!function_exists($f = 'critere_' . $critere))
1469
-			and (!function_exists($f = $f . '_dist'))
1470
-		) {
1471
-			// fonction critere standard
1472
-			$f = $defaut;
1473
-		}
1474
-		// compile le critere
1475
-		$res = $f($idb, $boucles, $crit);
1476
-
1477
-		// Gestion centralisee des erreurs pour pouvoir propager
1478
-		if (is_array($res)) {
1479
-			$msg = $res;
1480
-			erreur_squelette($msg, $boucle);
1481
-		}
1482
-	}
1483
-
1484
-	return $msg;
1444
+    $msg = '';
1445
+    $boucle = $boucles[$idb];
1446
+    $table = strtoupper($boucle->type_requete);
1447
+    $serveur = strtolower($boucle->sql_serveur);
1448
+
1449
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1450
+    // s'il y avait une erreur de syntaxe, propager cette info
1451
+    if (!is_array($boucle->criteres)) {
1452
+        return [];
1453
+    }
1454
+
1455
+    foreach ($boucle->criteres as $crit) {
1456
+        $critere = $crit->op;
1457
+        // critere personnalise ?
1458
+        if (
1459
+            (!$serveur or
1460
+                ((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere))
1461
+                    and (!function_exists($f = $f . '_dist'))
1462
+                    and (!function_exists($f = 'critere_' . $serveur . '_' . $critere))
1463
+                    and (!function_exists($f = $f . '_dist'))
1464
+                )
1465
+            )
1466
+            and (!function_exists($f = 'critere_' . $table . '_' . $critere))
1467
+            and (!function_exists($f = $f . '_dist'))
1468
+            and (!function_exists($f = 'critere_' . $critere))
1469
+            and (!function_exists($f = $f . '_dist'))
1470
+        ) {
1471
+            // fonction critere standard
1472
+            $f = $defaut;
1473
+        }
1474
+        // compile le critere
1475
+        $res = $f($idb, $boucles, $crit);
1476
+
1477
+        // Gestion centralisee des erreurs pour pouvoir propager
1478
+        if (is_array($res)) {
1479
+            $msg = $res;
1480
+            erreur_squelette($msg, $boucle);
1481
+        }
1482
+    }
1483
+
1484
+    return $msg;
1485 1485
 }
1486 1486
 
1487 1487
 /**
@@ -1496,11 +1496,11 @@  discard block
 block discarded – undo
1496 1496
  * @return string         Code compilé rééchappé
1497 1497
  */
1498 1498
 function kwote($lisp, $serveur = '', $type = '') {
1499
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1500
-		return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1501
-	} else {
1502
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1503
-	}
1499
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1500
+        return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1501
+    } else {
1502
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1503
+    }
1504 1504
 }
1505 1505
 
1506 1506
 
@@ -1519,81 +1519,81 @@  discard block
 block discarded – undo
1519 1519
  * @return void|array
1520 1520
  **/
1521 1521
 function critere_IN_dist($idb, &$boucles, $crit) {
1522
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1523
-	if (!$r) {
1524
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1525
-	}
1526
-	[$arg, $op, $val, $col, $where_complement] = $r;
1527
-
1528
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1529
-
1530
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1531
-	$where = $in;
1532
-	if ($crit->cond) {
1533
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1534
-		$where = ["'?'", $pred, $where, "''"];
1535
-		if ($where_complement) { // condition annexe du type "AND (objet='article')"
1536
-		$where_complement = ["'?'", $pred, $where_complement, "''"];
1537
-		}
1538
-	}
1539
-	if ($crit->exclus) {
1540
-		if (!preg_match(',^L[0-9]+[.],', $arg)) {
1541
-			$where = ["'NOT'", $where];
1542
-		} else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1543
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1544
-		{
1545
-			$where = [
1546
-				"'NOT'",
1547
-				[
1548
-					"'IN'",
1549
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1550
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1551
-				]
1552
-			];
1553
-		}
1554
-	}
1555
-
1556
-	$boucles[$idb]->where[] = $where;
1557
-	if ($where_complement) { // condition annexe du type "AND (objet='article')"
1558
-	$boucles[$idb]->where[] = $where_complement;
1559
-	}
1522
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1523
+    if (!$r) {
1524
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1525
+    }
1526
+    [$arg, $op, $val, $col, $where_complement] = $r;
1527
+
1528
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1529
+
1530
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1531
+    $where = $in;
1532
+    if ($crit->cond) {
1533
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1534
+        $where = ["'?'", $pred, $where, "''"];
1535
+        if ($where_complement) { // condition annexe du type "AND (objet='article')"
1536
+        $where_complement = ["'?'", $pred, $where_complement, "''"];
1537
+        }
1538
+    }
1539
+    if ($crit->exclus) {
1540
+        if (!preg_match(',^L[0-9]+[.],', $arg)) {
1541
+            $where = ["'NOT'", $where];
1542
+        } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1543
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1544
+        {
1545
+            $where = [
1546
+                "'NOT'",
1547
+                [
1548
+                    "'IN'",
1549
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1550
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1551
+                ]
1552
+            ];
1553
+        }
1554
+    }
1555
+
1556
+    $boucles[$idb]->where[] = $where;
1557
+    if ($where_complement) { // condition annexe du type "AND (objet='article')"
1558
+    $boucles[$idb]->where[] = $where_complement;
1559
+    }
1560 1560
 }
1561 1561
 
1562 1562
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1563
-	static $num = [];
1564
-	$descr = $boucles[$idb]->descr;
1565
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1566
-
1567
-	$var = '$in' . $cpt++;
1568
-	$x = "\n\t$var = array();";
1569
-	foreach ($val as $k => $v) {
1570
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1571
-			// optimiser le traitement des constantes
1572
-			if (is_numeric($r[2])) {
1573
-				$x .= "\n\t$var" . "[]= $r[2];";
1574
-			} else {
1575
-				$x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1576
-			}
1577
-		} else {
1578
-			// Pour permettre de passer des tableaux de valeurs
1579
-			// on repere l'utilisation brute de #ENV**{X},
1580
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1581
-			// et on deballe mais en rajoutant l'anti XSS
1582
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1583
-		}
1584
-	}
1585
-
1586
-	$boucles[$idb]->in .= $x;
1587
-
1588
-	// inserer le tri par defaut selon les ordres du IN ...
1589
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1590
-	// et que l'on limite donc strictement aux cas necessaires :
1591
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1592
-	if (!$crit2) {
1593
-		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1594
-	}
1595
-
1596
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1563
+    static $num = [];
1564
+    $descr = $boucles[$idb]->descr;
1565
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1566
+
1567
+    $var = '$in' . $cpt++;
1568
+    $x = "\n\t$var = array();";
1569
+    foreach ($val as $k => $v) {
1570
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1571
+            // optimiser le traitement des constantes
1572
+            if (is_numeric($r[2])) {
1573
+                $x .= "\n\t$var" . "[]= $r[2];";
1574
+            } else {
1575
+                $x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1576
+            }
1577
+        } else {
1578
+            // Pour permettre de passer des tableaux de valeurs
1579
+            // on repere l'utilisation brute de #ENV**{X},
1580
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1581
+            // et on deballe mais en rajoutant l'anti XSS
1582
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1583
+        }
1584
+    }
1585
+
1586
+    $boucles[$idb]->in .= $x;
1587
+
1588
+    // inserer le tri par defaut selon les ordres du IN ...
1589
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1590
+    // et que l'on limite donc strictement aux cas necessaires :
1591
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1592
+    if (!$crit2) {
1593
+        $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1594
+    }
1595
+
1596
+    return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1597 1597
 }
1598 1598
 
1599 1599
 /**
@@ -1609,22 +1609,22 @@  discard block
 block discarded – undo
1609 1609
  * @return void
1610 1610
  */
1611 1611
 function critere_where_dist($idb, &$boucles, $crit) {
1612
-	$boucle = &$boucles[$idb];
1613
-	if (isset($crit->param[0])) {
1614
-		$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1615
-	} else {
1616
-		$_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1617
-	}
1618
-
1619
-	if ($crit->cond) {
1620
-		$_where = "((\$zzw = $_where) ? \$zzw : '')";
1621
-	}
1622
-
1623
-	if ($crit->not) {
1624
-		$_where = "array('NOT',$_where)";
1625
-	}
1626
-
1627
-	$boucle->where[] = $_where;
1612
+    $boucle = &$boucles[$idb];
1613
+    if (isset($crit->param[0])) {
1614
+        $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1615
+    } else {
1616
+        $_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1617
+    }
1618
+
1619
+    if ($crit->cond) {
1620
+        $_where = "((\$zzw = $_where) ? \$zzw : '')";
1621
+    }
1622
+
1623
+    if ($crit->not) {
1624
+        $_where = "array('NOT',$_where)";
1625
+    }
1626
+
1627
+    $boucle->where[] = $_where;
1628 1628
 }
1629 1629
 
1630 1630
 /**
@@ -1652,31 +1652,31 @@  discard block
 block discarded – undo
1652 1652
  * @return void
1653 1653
  */
1654 1654
 function critere_id__dist($idb, &$boucles, $crit) {
1655
-	/** @var Boucle $boucle */
1656
-	$boucle = $boucles[$idb];
1657
-
1658
-	$champs = lister_champs_id_conditionnel(
1659
-		$boucle->show['table'],
1660
-		$boucle->show,
1661
-		$boucle->sql_serveur
1662
-	);
1663
-
1664
-	// ne pas tenir compte des critères identiques déjà présents.
1665
-	if (!empty($boucle->modificateur['criteres'])) {
1666
-		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1667
-	}
1668
-	// nous aider en mode debug.
1669
-	$boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1670
-	$boucle->modificateur['id_'] = $champs;
1671
-
1672
-	// créer un critère {id_xxx?} de chaque champ retenu
1673
-	foreach ($champs as $champ) {
1674
-		$critere_id_table = new Critere();
1675
-		$critere_id_table->op = $champ;
1676
-		$critere_id_table->cond = '?';
1677
-		$critere_id_table->ligne = $crit->ligne;
1678
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1679
-	}
1655
+    /** @var Boucle $boucle */
1656
+    $boucle = $boucles[$idb];
1657
+
1658
+    $champs = lister_champs_id_conditionnel(
1659
+        $boucle->show['table'],
1660
+        $boucle->show,
1661
+        $boucle->sql_serveur
1662
+    );
1663
+
1664
+    // ne pas tenir compte des critères identiques déjà présents.
1665
+    if (!empty($boucle->modificateur['criteres'])) {
1666
+        $champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1667
+    }
1668
+    // nous aider en mode debug.
1669
+    $boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1670
+    $boucle->modificateur['id_'] = $champs;
1671
+
1672
+    // créer un critère {id_xxx?} de chaque champ retenu
1673
+    foreach ($champs as $champ) {
1674
+        $critere_id_table = new Critere();
1675
+        $critere_id_table->op = $champ;
1676
+        $critere_id_table->cond = '?';
1677
+        $critere_id_table->ligne = $crit->ligne;
1678
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1679
+    }
1680 1680
 }
1681 1681
 
1682 1682
 /**
@@ -1696,75 +1696,75 @@  discard block
 block discarded – undo
1696 1696
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1697 1697
  */
1698 1698
 function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
1699
-	// calculer la description de la table
1700
-	if (!is_array($desc)) {
1701
-		$desc = description_table($table, $serveur);
1702
-	}
1703
-	if (!$desc) {
1704
-		return [];
1705
-	}
1706
-
1707
-	// Les champs id_xx de la table demandée
1708
-	$champs = array_filter(
1709
-		array_keys($desc['field']),
1710
-		fn($champ) => strpos($champ, 'id_') === 0 or (in_array($champ, ['objet']))
1711
-	);
1712
-
1713
-	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1714
-	if (
1715
-		in_array('id_rubrique', $champs)
1716
-		and !in_array('id_secteur', $champs)
1717
-	) {
1718
-		$champs[] = 'id_secteur';
1719
-	}
1720
-
1721
-	// On ne fera pas mieux pour les tables d’un autre serveur
1722
-	if ($serveur) {
1723
-		return $champs;
1724
-	}
1725
-
1726
-	$primary = false;
1727
-	$associable = false;
1728
-	include_spip('action/editer_liens');
1729
-
1730
-	if (isset($desc['type'])) {
1731
-		$primary = id_table_objet($desc['type']);
1732
-		$associable = objet_associable($desc['type']);
1733
-	}
1734
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1735
-		$associable = true;
1736
-	}
1737
-
1738
-	// liste de toutes les tables principales, sauf la notre
1739
-	$tables = lister_tables_objets_sql();
1740
-	unset($tables[$table]);
1741
-
1742
-	foreach ($tables as $_table => $_desc) {
1743
-		if (
1744
-			$associable
1745
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
1746
-			or objet_associable($_desc['type'])
1747
-		) {
1748
-			$champs[] = id_table_objet($_table);
1749
-		}
1750
-	}
1751
-	$champs = array_values(array_unique($champs));
1752
-
1753
-	// Exclusions de certains id
1754
-	$exclusions = pipeline(
1755
-		'exclure_id_conditionnel',
1756
-		[
1757
-			'args' => [
1758
-				'table' => $table,
1759
-				'id_table_objet' => $primary,
1760
-				'associable' => $associable,
1761
-			],
1762
-			'data' => [],
1763
-		]
1764
-	);
1765
-	$champs = array_diff($champs, $exclusions);
1766
-
1767
-	return $champs;
1699
+    // calculer la description de la table
1700
+    if (!is_array($desc)) {
1701
+        $desc = description_table($table, $serveur);
1702
+    }
1703
+    if (!$desc) {
1704
+        return [];
1705
+    }
1706
+
1707
+    // Les champs id_xx de la table demandée
1708
+    $champs = array_filter(
1709
+        array_keys($desc['field']),
1710
+        fn($champ) => strpos($champ, 'id_') === 0 or (in_array($champ, ['objet']))
1711
+    );
1712
+
1713
+    // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1714
+    if (
1715
+        in_array('id_rubrique', $champs)
1716
+        and !in_array('id_secteur', $champs)
1717
+    ) {
1718
+        $champs[] = 'id_secteur';
1719
+    }
1720
+
1721
+    // On ne fera pas mieux pour les tables d’un autre serveur
1722
+    if ($serveur) {
1723
+        return $champs;
1724
+    }
1725
+
1726
+    $primary = false;
1727
+    $associable = false;
1728
+    include_spip('action/editer_liens');
1729
+
1730
+    if (isset($desc['type'])) {
1731
+        $primary = id_table_objet($desc['type']);
1732
+        $associable = objet_associable($desc['type']);
1733
+    }
1734
+    if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1735
+        $associable = true;
1736
+    }
1737
+
1738
+    // liste de toutes les tables principales, sauf la notre
1739
+    $tables = lister_tables_objets_sql();
1740
+    unset($tables[$table]);
1741
+
1742
+    foreach ($tables as $_table => $_desc) {
1743
+        if (
1744
+            $associable
1745
+            or ($primary and in_array($primary, array_keys($_desc['field'])))
1746
+            or objet_associable($_desc['type'])
1747
+        ) {
1748
+            $champs[] = id_table_objet($_table);
1749
+        }
1750
+    }
1751
+    $champs = array_values(array_unique($champs));
1752
+
1753
+    // Exclusions de certains id
1754
+    $exclusions = pipeline(
1755
+        'exclure_id_conditionnel',
1756
+        [
1757
+            'args' => [
1758
+                'table' => $table,
1759
+                'id_table_objet' => $primary,
1760
+                'associable' => $associable,
1761
+            ],
1762
+            'data' => [],
1763
+        ]
1764
+    );
1765
+    $champs = array_diff($champs, $exclusions);
1766
+
1767
+    return $champs;
1768 1768
 }
1769 1769
 
1770 1770
 /**
@@ -1819,28 +1819,28 @@  discard block
 block discarded – undo
1819 1819
  * @return void
1820 1820
  */
1821 1821
 function critere_tri_dist($idb, &$boucles, $crit) {
1822
-	$boucle = &$boucles[$idb];
1823
-
1824
-	// definition du champ par defaut
1825
-	$_champ_defaut = !isset($crit->param[0][0]) ? "''"
1826
-		: calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
1827
-	$_liste_sens_defaut = !isset($crit->param[1][0]) ? '1'
1828
-		: calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
1829
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
1830
-		: calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent);
1831
-
1832
-	$_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):'')";
1833
-
1834
-	$_sens_defaut = "(is_array(\$s=$_liste_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1835
-	$_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)";
1836
-
1837
-	$boucle->modificateur['tri_champ'] = $_tri;
1838
-	$boucle->modificateur['tri_sens'] = $_sens;
1839
-	$boucle->modificateur['tri_liste_sens_defaut'] = $_liste_sens_defaut;
1840
-	$boucle->modificateur['tri_nom'] = $_variable;
1841
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1842
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1843
-	$boucle->hash .= "
1822
+    $boucle = &$boucles[$idb];
1823
+
1824
+    // definition du champ par defaut
1825
+    $_champ_defaut = !isset($crit->param[0][0]) ? "''"
1826
+        : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
1827
+    $_liste_sens_defaut = !isset($crit->param[1][0]) ? '1'
1828
+        : calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
1829
+    $_variable = !isset($crit->param[2][0]) ? "'$idb'"
1830
+        : calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent);
1831
+
1832
+    $_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):'')";
1833
+
1834
+    $_sens_defaut = "(is_array(\$s=$_liste_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1835
+    $_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)";
1836
+
1837
+    $boucle->modificateur['tri_champ'] = $_tri;
1838
+    $boucle->modificateur['tri_sens'] = $_sens;
1839
+    $boucle->modificateur['tri_liste_sens_defaut'] = $_liste_sens_defaut;
1840
+    $boucle->modificateur['tri_nom'] = $_variable;
1841
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1842
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1843
+    $boucle->hash .= "
1844 1844
 	\$senstri = '';
1845 1845
 	\$tri = $_tri;
1846 1846
 	if (\$tri){
@@ -1848,8 +1848,8 @@  discard block
 block discarded – undo
1848 1848
 		\$senstri = (\$senstri<0)?' DESC':'';
1849 1849
 	};
1850 1850
 	";
1851
-	$boucle->select[] = '".tri_champ_select($tri)."';
1852
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1851
+    $boucle->select[] = '".tri_champ_select($tri)."';
1852
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1853 1853
 }
1854 1854
 
1855 1855
 # Criteres de comparaison
@@ -1866,20 +1866,20 @@  discard block
 block discarded – undo
1866 1866
  * @return void|array
1867 1867
  **/
1868 1868
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1869
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1870
-	if (($crit->op == ',') or ($crit->op == '/')) {
1871
-		return calculer_critere_parties($idb, $boucles, $crit);
1872
-	}
1873
-
1874
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1875
-	if (!$r) {
1876
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1877
-		#	if (!$crit->cond) {
1878
-		return ['zbug_critere_inconnu', ['critere' => $crit->op]];
1879
-		#	}
1880
-	} else {
1881
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1882
-	}
1869
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1870
+    if (($crit->op == ',') or ($crit->op == '/')) {
1871
+        return calculer_critere_parties($idb, $boucles, $crit);
1872
+    }
1873
+
1874
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1875
+    if (!$r) {
1876
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1877
+        #	if (!$crit->cond) {
1878
+        return ['zbug_critere_inconnu', ['critere' => $crit->op]];
1879
+        #	}
1880
+    } else {
1881
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1882
+    }
1883 1883
 }
1884 1884
 
1885 1885
 
@@ -1899,62 +1899,62 @@  discard block
 block discarded – undo
1899 1899
  * @return void
1900 1900
  **/
1901 1901
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1902
-	[$arg, $op, $val, $col, $where_complement] = $args;
1903
-
1904
-	$where = ["'$op'", "'$arg'", $val[0]];
1905
-
1906
-	// inserer la negation (cf !...)
1907
-
1908
-	if ($crit->not) {
1909
-		$where = ["'NOT'", $where];
1910
-	}
1911
-	if ($crit->exclus) {
1912
-		if (!preg_match(',^L[0-9]+[.],', $arg)) {
1913
-			$where = ["'NOT'", $where];
1914
-		} else {
1915
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1916
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1917
-			$where = [
1918
-				"'NOT'",
1919
-				[
1920
-					"'IN'",
1921
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1922
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1923
-				]
1924
-			];
1925
-		}
1926
-	}
1927
-
1928
-	// inserer la condition (cf {lang?})
1929
-	// traiter a part la date, elle est mise d'office par SPIP,
1930
-	if ($crit->cond) {
1931
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1932
-		if ($col === 'date' or $col === 'date_redac') {
1933
-			if ($pred === "\$Pile[0]['" . $col . "']") {
1934
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1935
-			}
1936
-		}
1937
-
1938
-		if ($op === '=' and !$crit->not) {
1939
-			$where = [
1940
-				"'?'",
1941
-				"(is_array($pred))",
1942
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
1943
-				$where
1944
-			];
1945
-		}
1946
-		$where = ["'?'", "!is_whereable($pred)", "''", $where];
1947
-		if ($where_complement) {
1948
-			// condition annexe du type "AND (objet='article')"
1949
-			$where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement];
1950
-		}
1951
-	}
1952
-
1953
-	$boucles[$idb]->where[] = $where;
1954
-	if ($where_complement) {
1955
-		// condition annexe du type "AND (objet='article')"
1956
-		$boucles[$idb]->where[] = $where_complement;
1957
-	}
1902
+    [$arg, $op, $val, $col, $where_complement] = $args;
1903
+
1904
+    $where = ["'$op'", "'$arg'", $val[0]];
1905
+
1906
+    // inserer la negation (cf !...)
1907
+
1908
+    if ($crit->not) {
1909
+        $where = ["'NOT'", $where];
1910
+    }
1911
+    if ($crit->exclus) {
1912
+        if (!preg_match(',^L[0-9]+[.],', $arg)) {
1913
+            $where = ["'NOT'", $where];
1914
+        } else {
1915
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1916
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1917
+            $where = [
1918
+                "'NOT'",
1919
+                [
1920
+                    "'IN'",
1921
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1922
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1923
+                ]
1924
+            ];
1925
+        }
1926
+    }
1927
+
1928
+    // inserer la condition (cf {lang?})
1929
+    // traiter a part la date, elle est mise d'office par SPIP,
1930
+    if ($crit->cond) {
1931
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1932
+        if ($col === 'date' or $col === 'date_redac') {
1933
+            if ($pred === "\$Pile[0]['" . $col . "']") {
1934
+                $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1935
+            }
1936
+        }
1937
+
1938
+        if ($op === '=' and !$crit->not) {
1939
+            $where = [
1940
+                "'?'",
1941
+                "(is_array($pred))",
1942
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
1943
+                $where
1944
+            ];
1945
+        }
1946
+        $where = ["'?'", "!is_whereable($pred)", "''", $where];
1947
+        if ($where_complement) {
1948
+            // condition annexe du type "AND (objet='article')"
1949
+            $where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement];
1950
+        }
1951
+    }
1952
+
1953
+    $boucles[$idb]->where[] = $where;
1954
+    if ($where_complement) {
1955
+        // condition annexe du type "AND (objet='article')"
1956
+        $boucles[$idb]->where[] = $where_complement;
1957
+    }
1958 1958
 }
1959 1959
 
1960 1960
 
@@ -1995,165 +1995,165 @@  discard block
 block discarded – undo
1995 1995
  **/
1996 1996
 function calculer_critere_infixe($idb, &$boucles, $crit) {
1997 1997
 
1998
-	$boucle = &$boucles[$idb];
1999
-	$type = $boucle->type_requete;
2000
-	$table = $boucle->id_table ?? '';
2001
-	$desc = $boucle->show;
2002
-	$col_vraie = null;
2003
-
2004
-	[$fct, $col, $op, $val, $args_sql] =
2005
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
2006
-
2007
-	$col_alias = $col;
2008
-	$where_complement = false;
2009
-
2010
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
2011
-	if ($col == 'id_enfant') {
2012
-		$col = $boucle->primary;
2013
-	}
2014
-
2015
-	// Cas particulier : id_parent => verifier les exceptions de tables
2016
-	if (
2017
-		(in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2018
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2019
-	) {
2020
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
2021
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2022
-	else {
2023
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2024
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
2025
-		}
2026
-
2027
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2028
-		// sauf si exception declaree : sauter cette etape
2029
-		else {
2030
-			if (
2031
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2032
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
2033
-				and count(trouver_champs_decomposes($col, $desc)) > 1
2034
-			) {
2035
-				$e = decompose_champ_id_objet($col);
2036
-				$col = array_shift($e);
2037
-				$where_complement = primary_doublee($e, $table);
2038
-			} // Cas particulier : expressions de date
2039
-			else {
2040
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2041
-					[$col, $col_vraie] = $c;
2042
-					$table = '';
2043
-				} // table explicitée {mots.titre}
2044
-				else {
2045
-					if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2046
-						[, $table, $col] = $r;
2047
-						$col_alias = $col;
2048
-
2049
-						$trouver_table = charger_fonction('trouver_table', 'base');
2050
-						if (
2051
-							$desc = $trouver_table($table, $boucle->sql_serveur)
2052
-							and isset($desc['field'][$col])
2053
-							and $cle = array_search($desc['table'], $boucle->from)
2054
-						) {
2055
-							$table = $cle;
2056
-						} else {
2057
-							$table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '='));
2058
-						}
2059
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2060
-						if (!$table) {
2061
-							return '';
2062
-						}
2063
-					}
2064
-					// si le champ n'est pas trouvé dans la table,
2065
-					// on cherche si une jointure peut l'obtenir
2066
-					elseif (@!array_key_exists($col, $desc['field'])) {
2067
-						// Champ joker * des iterateurs DATA qui accepte tout
2068
-						if (@array_key_exists('*', $desc['field'])) {
2069
-							$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
2070
-						}
2071
-						else {
2072
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2073
-							if (!$r) {
2074
-								return '';
2075
-							}
2076
-							[$col, $col_alias, $table, $where_complement, $desc] = $r;
2077
-						}
2078
-					}
2079
-				}
2080
-			}
2081
-		}
2082
-	}
2083
-
2084
-	$col_vraie = ($col_vraie ?: $col);
2085
-	// Dans tous les cas,
2086
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2087
-	// et passer dans sql_quote avec le type si connu
2088
-	// et int sinon si la valeur est numerique
2089
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2090
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2091
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2092
-		$type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
2093
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2094
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2095
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2096
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2097
-		}
2098
-		// sinon expliciter les
2099
-		// sql_quote(truc) en sql_quote(truc,'',type)
2100
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2101
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2102
-		// sans toucher aux
2103
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2104
-		// sql_quote(truc,'','varchar')
2105
-		elseif (
2106
-			preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2107
-			// si pas deja un type
2108
-			and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2109
-		) {
2110
-			$r = $r[1]
2111
-				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2112
-				. ",'" . addslashes($type_cast_quote) . "'";
2113
-			$val[0] = "sql_quote($r)";
2114
-		}
2115
-		elseif (
2116
-			strpos($val[0], '@@defaultcast@@') !== false
2117
-			and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2118
-		) {
2119
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2120
-		}
2121
-	}
2122
-
2123
-	if (
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])) . "'char')";
2128
-	}
2129
-
2130
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2131
-	// leurs requetes par defaut, notamment le champ statut
2132
-	// Ne pas confondre champs de la table principale et des jointures
2133
-	if ($table === $boucle->id_table) {
2134
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2135
-		if ($col_alias != $col_vraie) {
2136
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2137
-		}
2138
-	}
2139
-
2140
-	// inserer le nom de la table SQL devant le nom du champ
2141
-	if ($table) {
2142
-		if ($col[0] == '`') {
2143
-			$arg = "$table." . substr($col, 1, -1);
2144
-		} else {
2145
-			$arg = "$table.$col";
2146
-		}
2147
-	} else {
2148
-		$arg = $col;
2149
-	}
2150
-
2151
-	// inserer la fonction SQL
2152
-	if ($fct) {
2153
-		$arg = "$fct($arg$args_sql)";
2154
-	}
2155
-
2156
-	return [$arg, $op, $val, $col_alias, $where_complement];
1998
+    $boucle = &$boucles[$idb];
1999
+    $type = $boucle->type_requete;
2000
+    $table = $boucle->id_table ?? '';
2001
+    $desc = $boucle->show;
2002
+    $col_vraie = null;
2003
+
2004
+    [$fct, $col, $op, $val, $args_sql] =
2005
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
2006
+
2007
+    $col_alias = $col;
2008
+    $where_complement = false;
2009
+
2010
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
2011
+    if ($col == 'id_enfant') {
2012
+        $col = $boucle->primary;
2013
+    }
2014
+
2015
+    // Cas particulier : id_parent => verifier les exceptions de tables
2016
+    if (
2017
+        (in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2018
+        or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2019
+    ) {
2020
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
2021
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2022
+    else {
2023
+        if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2024
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
2025
+        }
2026
+
2027
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2028
+        // sauf si exception declaree : sauter cette etape
2029
+        else {
2030
+            if (
2031
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2032
+                and !isset($GLOBALS['exceptions_des_jointures'][$col])
2033
+                and count(trouver_champs_decomposes($col, $desc)) > 1
2034
+            ) {
2035
+                $e = decompose_champ_id_objet($col);
2036
+                $col = array_shift($e);
2037
+                $where_complement = primary_doublee($e, $table);
2038
+            } // Cas particulier : expressions de date
2039
+            else {
2040
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2041
+                    [$col, $col_vraie] = $c;
2042
+                    $table = '';
2043
+                } // table explicitée {mots.titre}
2044
+                else {
2045
+                    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2046
+                        [, $table, $col] = $r;
2047
+                        $col_alias = $col;
2048
+
2049
+                        $trouver_table = charger_fonction('trouver_table', 'base');
2050
+                        if (
2051
+                            $desc = $trouver_table($table, $boucle->sql_serveur)
2052
+                            and isset($desc['field'][$col])
2053
+                            and $cle = array_search($desc['table'], $boucle->from)
2054
+                        ) {
2055
+                            $table = $cle;
2056
+                        } else {
2057
+                            $table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '='));
2058
+                        }
2059
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2060
+                        if (!$table) {
2061
+                            return '';
2062
+                        }
2063
+                    }
2064
+                    // si le champ n'est pas trouvé dans la table,
2065
+                    // on cherche si une jointure peut l'obtenir
2066
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2067
+                        // Champ joker * des iterateurs DATA qui accepte tout
2068
+                        if (@array_key_exists('*', $desc['field'])) {
2069
+                            $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
2070
+                        }
2071
+                        else {
2072
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2073
+                            if (!$r) {
2074
+                                return '';
2075
+                            }
2076
+                            [$col, $col_alias, $table, $where_complement, $desc] = $r;
2077
+                        }
2078
+                    }
2079
+                }
2080
+            }
2081
+        }
2082
+    }
2083
+
2084
+    $col_vraie = ($col_vraie ?: $col);
2085
+    // Dans tous les cas,
2086
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2087
+    // et passer dans sql_quote avec le type si connu
2088
+    // et int sinon si la valeur est numerique
2089
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2090
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2091
+    if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2092
+        $type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
2093
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2094
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2095
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2096
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2097
+        }
2098
+        // sinon expliciter les
2099
+        // sql_quote(truc) en sql_quote(truc,'',type)
2100
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2101
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2102
+        // sans toucher aux
2103
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2104
+        // sql_quote(truc,'','varchar')
2105
+        elseif (
2106
+            preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2107
+            // si pas deja un type
2108
+            and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2109
+        ) {
2110
+            $r = $r[1]
2111
+                . ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2112
+                . ",'" . addslashes($type_cast_quote) . "'";
2113
+            $val[0] = "sql_quote($r)";
2114
+        }
2115
+        elseif (
2116
+            strpos($val[0], '@@defaultcast@@') !== false
2117
+            and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2118
+        ) {
2119
+            $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2120
+        }
2121
+    }
2122
+
2123
+    if (
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])) . "'char')";
2128
+    }
2129
+
2130
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2131
+    // leurs requetes par defaut, notamment le champ statut
2132
+    // Ne pas confondre champs de la table principale et des jointures
2133
+    if ($table === $boucle->id_table) {
2134
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2135
+        if ($col_alias != $col_vraie) {
2136
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2137
+        }
2138
+    }
2139
+
2140
+    // inserer le nom de la table SQL devant le nom du champ
2141
+    if ($table) {
2142
+        if ($col[0] == '`') {
2143
+            $arg = "$table." . substr($col, 1, -1);
2144
+        } else {
2145
+            $arg = "$table.$col";
2146
+        }
2147
+    } else {
2148
+        $arg = $col;
2149
+    }
2150
+
2151
+    // inserer la fonction SQL
2152
+    if ($fct) {
2153
+        $arg = "$fct($arg$args_sql)";
2154
+    }
2155
+
2156
+    return [$arg, $op, $val, $col_alias, $where_complement];
2157 2157
 }
2158 2158
 
2159 2159
 
@@ -2182,77 +2182,77 @@  discard block
 block discarded – undo
2182 2182
  **/
2183 2183
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2184 2184
 
2185
-	$where = '';
2186
-
2187
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2188
-	// gestion par les plugins des jointures tordues
2189
-	// pas automatiques mais necessaires
2190
-	$table_sql = table_objet_sql($table);
2191
-	if (
2192
-		isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2193
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2194
-		and
2195
-		(
2196
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2197
-			or
2198
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2199
-		)
2200
-	) {
2201
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2202
-		$index = $t[$col] ?? $t[''] ?? [];
2203
-
2204
-		if ((is_countable($index) ? count($index) : 0) == 3) {
2205
-			[$t, $col, $calculer_critere_externe] = $index;
2206
-		} elseif ((is_countable($index) ? count($index) : 0) == 2) {
2207
-			[$t, $col] = $t[$col];
2208
-		} elseif ((is_countable($index) ? count($index) : 0) == 1) {
2209
-			[$calculer_critere_externe] = $index;
2210
-			$t = $table;
2211
-		} else {
2212
-			$t = '';
2213
-		} // jointure non declaree. La trouver.
2214
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2215
-		[$t, $col] = $GLOBALS['exceptions_des_jointures'][$col];
2216
-	} else {
2217
-		$t = '';
2218
-	} // jointure non declaree. La trouver.
2219
-
2220
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2221
-
2222
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2223
-	// permet de forcer une table de lien quand il y a ambiguite
2224
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2225
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2226
-	$table = '';
2227
-	if ($boucle->jointures_explicites) {
2228
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2229
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2230
-	}
2231
-
2232
-	// et sinon on cherche parmi toutes les jointures declarees
2233
-	if (!$table) {
2234
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2235
-	}
2236
-
2237
-	if (!$table) {
2238
-		return '';
2239
-	}
2240
-
2241
-	// il ne reste plus qu'a trouver le champ dans les from
2242
-	[$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
2243
-
2244
-	if ((is_countable($cle) ? count($cle) : 0) > 1 or reset($cle) !== $col) {
2245
-		$col_alias = $col; // id_article devient juste le nom d'origine
2246
-		if ((is_countable($cle) ? count($cle) : 0) > 1 and reset($cle) == 'id_objet') {
2247
-			$e = decompose_champ_id_objet($col);
2248
-			$col = array_shift($e);
2249
-			$where = primary_doublee($e, $table);
2250
-		} else {
2251
-			$col = reset($cle);
2252
-		}
2253
-	}
2254
-
2255
-	return [$col, $col_alias, $table, $where, $desc];
2185
+    $where = '';
2186
+
2187
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2188
+    // gestion par les plugins des jointures tordues
2189
+    // pas automatiques mais necessaires
2190
+    $table_sql = table_objet_sql($table);
2191
+    if (
2192
+        isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2193
+        and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2194
+        and
2195
+        (
2196
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2197
+            or
2198
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2199
+        )
2200
+    ) {
2201
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2202
+        $index = $t[$col] ?? $t[''] ?? [];
2203
+
2204
+        if ((is_countable($index) ? count($index) : 0) == 3) {
2205
+            [$t, $col, $calculer_critere_externe] = $index;
2206
+        } elseif ((is_countable($index) ? count($index) : 0) == 2) {
2207
+            [$t, $col] = $t[$col];
2208
+        } elseif ((is_countable($index) ? count($index) : 0) == 1) {
2209
+            [$calculer_critere_externe] = $index;
2210
+            $t = $table;
2211
+        } else {
2212
+            $t = '';
2213
+        } // jointure non declaree. La trouver.
2214
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2215
+        [$t, $col] = $GLOBALS['exceptions_des_jointures'][$col];
2216
+    } else {
2217
+        $t = '';
2218
+    } // jointure non declaree. La trouver.
2219
+
2220
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2221
+
2222
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2223
+    // permet de forcer une table de lien quand il y a ambiguite
2224
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2225
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2226
+    $table = '';
2227
+    if ($boucle->jointures_explicites) {
2228
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2229
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2230
+    }
2231
+
2232
+    // et sinon on cherche parmi toutes les jointures declarees
2233
+    if (!$table) {
2234
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2235
+    }
2236
+
2237
+    if (!$table) {
2238
+        return '';
2239
+    }
2240
+
2241
+    // il ne reste plus qu'a trouver le champ dans les from
2242
+    [$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
2243
+
2244
+    if ((is_countable($cle) ? count($cle) : 0) > 1 or reset($cle) !== $col) {
2245
+        $col_alias = $col; // id_article devient juste le nom d'origine
2246
+        if ((is_countable($cle) ? count($cle) : 0) > 1 and reset($cle) == 'id_objet') {
2247
+            $e = decompose_champ_id_objet($col);
2248
+            $col = array_shift($e);
2249
+            $where = primary_doublee($e, $table);
2250
+        } else {
2251
+            $col = reset($cle);
2252
+        }
2253
+    }
2254
+
2255
+    return [$col, $col_alias, $table, $where, $desc];
2256 2256
 }
2257 2257
 
2258 2258
 
@@ -2273,10 +2273,10 @@  discard block
 block discarded – undo
2273 2273
  *     - valeur
2274 2274
  **/
2275 2275
 function primary_doublee($decompose, $table) {
2276
-	$e1 = reset($decompose);
2277
-	$e2 = "sql_quote('" . end($decompose) . "')";
2276
+    $e1 = reset($decompose);
2277
+    $e2 = "sql_quote('" . end($decompose) . "')";
2278 2278
 
2279
-	return ["'='", "'$table." . $e1 . "'", $e2];
2279
+    return ["'='", "'$table." . $e1 . "'", $e2];
2280 2280
 }
2281 2281
 
2282 2282
 /**
@@ -2307,57 +2307,57 @@  discard block
 block discarded – undo
2307 2307
  *     Vide sinon.
2308 2308
  */
2309 2309
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2310
-	// si on demande un truc du genre spip_mots
2311
-	// avec aussi spip_mots_liens dans les jointures dispo
2312
-	// et qu'on est la
2313
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2314
-	if (
2315
-		$checkarrivee
2316
-		and is_string($checkarrivee)
2317
-		and $a = table_objet($checkarrivee)
2318
-		and in_array($a . '_liens', $joints)
2319
-	) {
2320
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2321
-			return $res;
2322
-		}
2323
-	}
2324
-	foreach ($joints as $joint) {
2325
-		if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2326
-			// alias de table dans le from
2327
-			$t = array_search($arrivee[0], $boucle->from);
2328
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2329
-			$cols = $arrivee[2];
2330
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2331
-			if ((is_countable($cols) ? count($cols) : 0) > 2) {
2332
-				array_pop($cols);
2333
-			}
2334
-			if ($t) {
2335
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2336
-				$joindre = false;
2337
-				foreach ($cols as $col) {
2338
-					$c = '/\b' . $t . ".$col" . '\b/';
2339
-					if (trouver_champ($c, $boucle->where)) {
2340
-						$joindre = true;
2341
-					} else {
2342
-						// mais ca peut etre dans le FIELD pour le Having
2343
-						$c = "/FIELD.$t" . ".$col,/";
2344
-						if (trouver_champ($c, $boucle->select)) {
2345
-							$joindre = true;
2346
-						}
2347
-					}
2348
-				}
2349
-				if (!$joindre) {
2350
-					return $t;
2351
-				}
2352
-			}
2353
-			array_pop($arrivee);
2354
-			if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2355
-				return $res;
2356
-			}
2357
-		}
2358
-	}
2359
-
2360
-	return '';
2310
+    // si on demande un truc du genre spip_mots
2311
+    // avec aussi spip_mots_liens dans les jointures dispo
2312
+    // et qu'on est la
2313
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2314
+    if (
2315
+        $checkarrivee
2316
+        and is_string($checkarrivee)
2317
+        and $a = table_objet($checkarrivee)
2318
+        and in_array($a . '_liens', $joints)
2319
+    ) {
2320
+        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2321
+            return $res;
2322
+        }
2323
+    }
2324
+    foreach ($joints as $joint) {
2325
+        if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2326
+            // alias de table dans le from
2327
+            $t = array_search($arrivee[0], $boucle->from);
2328
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2329
+            $cols = $arrivee[2];
2330
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2331
+            if ((is_countable($cols) ? count($cols) : 0) > 2) {
2332
+                array_pop($cols);
2333
+            }
2334
+            if ($t) {
2335
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2336
+                $joindre = false;
2337
+                foreach ($cols as $col) {
2338
+                    $c = '/\b' . $t . ".$col" . '\b/';
2339
+                    if (trouver_champ($c, $boucle->where)) {
2340
+                        $joindre = true;
2341
+                    } else {
2342
+                        // mais ca peut etre dans le FIELD pour le Having
2343
+                        $c = "/FIELD.$t" . ".$col,/";
2344
+                        if (trouver_champ($c, $boucle->select)) {
2345
+                            $joindre = true;
2346
+                        }
2347
+                    }
2348
+                }
2349
+                if (!$joindre) {
2350
+                    return $t;
2351
+                }
2352
+            }
2353
+            array_pop($arrivee);
2354
+            if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2355
+                return $res;
2356
+            }
2357
+        }
2358
+    }
2359
+
2360
+    return '';
2361 2361
 }
2362 2362
 
2363 2363
 /**
@@ -2383,35 +2383,35 @@  discard block
 block discarded – undo
2383 2383
  *     Alias de la table de jointure (Lx)
2384 2384
  */
2385 2385
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2386
-	$primary_arrivee = id_table_objet($checkarrivee);
2387
-
2388
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2389
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2390
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2391
-
2392
-	if (!$intermediaire or !$arrivee) {
2393
-		return '';
2394
-	}
2395
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2396
-	array_pop($arrivee); // enlever la cle en 3eme argument
2397
-
2398
-	$res = fabrique_jointures(
2399
-		$boucle,
2400
-		[
2401
-			[
2402
-				$boucle->id_table,
2403
-				$intermediaire,
2404
-				[id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2405
-			],
2406
-			[reset($intermediaire), $arrivee, $primary_arrivee]
2407
-		],
2408
-		$cond,
2409
-		$desc,
2410
-		$boucle->id_table,
2411
-		[$col]
2412
-	);
2413
-
2414
-	return $res;
2386
+    $primary_arrivee = id_table_objet($checkarrivee);
2387
+
2388
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2389
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2390
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2391
+
2392
+    if (!$intermediaire or !$arrivee) {
2393
+        return '';
2394
+    }
2395
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2396
+    array_pop($arrivee); // enlever la cle en 3eme argument
2397
+
2398
+    $res = fabrique_jointures(
2399
+        $boucle,
2400
+        [
2401
+            [
2402
+                $boucle->id_table,
2403
+                $intermediaire,
2404
+                [id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2405
+            ],
2406
+            [reset($intermediaire), $arrivee, $primary_arrivee]
2407
+        ],
2408
+        $cond,
2409
+        $desc,
2410
+        $boucle->id_table,
2411
+        [$col]
2412
+    );
2413
+
2414
+    return $res;
2415 2415
 }
2416 2416
 
2417 2417
 
@@ -2428,17 +2428,17 @@  discard block
 block discarded – undo
2428 2428
  *     false sinon.
2429 2429
  **/
2430 2430
 function trouver_champ($champ, $where) {
2431
-	if (!is_array($where)) {
2432
-		return preg_match($champ, $where);
2433
-	} else {
2434
-		foreach ($where as $clause) {
2435
-			if (trouver_champ($champ, $clause)) {
2436
-				return true;
2437
-			}
2438
-		}
2439
-
2440
-		return false;
2441
-	}
2431
+    if (!is_array($where)) {
2432
+        return preg_match($champ, $where);
2433
+    } else {
2434
+        foreach ($where as $clause) {
2435
+            if (trouver_champ($champ, $clause)) {
2436
+                return true;
2437
+            }
2438
+        }
2439
+
2440
+        return false;
2441
+    }
2442 2442
 }
2443 2443
 
2444 2444
 
@@ -2464,129 +2464,129 @@  discard block
 block discarded – undo
2464 2464
  *     - string $args_sql  Suite des arguments du critère. ?
2465 2465
  **/
2466 2466
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2467
-	// cas d'une valeur comparee a elle-meme ou son referent
2468
-	if (count($crit->param) == 0) {
2469
-		$op = '=';
2470
-		$col = $val = $crit->op;
2471
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2472
-			$val = $r[2];
2473
-		}
2474
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2475
-		if ($val == 'lang') {
2476
-			$val = [kwote('$GLOBALS[\'spip_lang\']')];
2477
-		} else {
2478
-			$defaut = null;
2479
-			if ($val == 'id_parent') {
2480
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2481
-				// de la boucle superieure.... faudrait verifier qu'il existe
2482
-				// pour eviter l'erreur SQL
2483
-				$val = $boucles[$idb]->primary;
2484
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2485
-				$defaut = "(\$Pile[0]['id_parent'] ?? null)";
2486
-			} elseif ($val == 'id_enfant') {
2487
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2488
-				// de la boucle superieure
2489
-				$val = 'id_parent';
2490
-			} elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) {
2491
-				// un critere conditionnel sur date est traite a part
2492
-				// car la date est mise d'office par SPIP,
2493
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2494
-			}
2495
-
2496
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2497
-			$val = [kwote($val)];
2498
-		}
2499
-	} else {
2500
-		// comparaison explicite
2501
-		// le phraseur impose que le premier param soit du texte
2502
-		$params = $crit->param;
2503
-		$op = $crit->op;
2504
-		if ($op == '==') {
2505
-			$op = 'REGEXP';
2506
-		}
2507
-		$col = array_shift($params);
2508
-		$col = $col[0]->texte;
2509
-
2510
-		$val = [];
2511
-		$parent = $boucles[$idb]->id_parent;
2512
-
2513
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2514
-		// celui ne sachant pas ce qu'est un critere infixe
2515
-		// et a fortiori son 2e operande qu'entoure " ou '
2516
-		if (
2517
-			count($params) == 1
2518
-			and (is_countable($params[0]) ? count($params[0]) : 0) == 3
2519
-			and $params[0][0]->type == 'texte'
2520
-			and $params[0][2]->type == 'texte'
2521
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
2522
-			and (($p == "'") or ($p == '"'))
2523
-			and $params[0][1]->type == 'champ'
2524
-		) {
2525
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2526
-		} else {
2527
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2528
-				$a = calculer_liste($p, $idb, $boucles, $parent);
2529
-				if (strcasecmp($op, 'IN') == 0) {
2530
-					$val[] = $a;
2531
-				} else {
2532
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2533
-				} // toujours quoter en char ici
2534
-			}
2535
-		}
2536
-	}
2537
-
2538
-	$fct = $args_sql = '';
2539
-	// fonction SQL ?
2540
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2541
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2542
-		$fct = $m[1];
2543
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2544
-		$col = $a[1];
2545
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2546
-			$col = $m[1];
2547
-			$args_sql = $m[2];
2548
-		}
2549
-		$args_sql .= $a[2];
2550
-	}
2551
-
2552
-	return [$fct, $col, $op, $val, $args_sql];
2467
+    // cas d'une valeur comparee a elle-meme ou son referent
2468
+    if (count($crit->param) == 0) {
2469
+        $op = '=';
2470
+        $col = $val = $crit->op;
2471
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2472
+            $val = $r[2];
2473
+        }
2474
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2475
+        if ($val == 'lang') {
2476
+            $val = [kwote('$GLOBALS[\'spip_lang\']')];
2477
+        } else {
2478
+            $defaut = null;
2479
+            if ($val == 'id_parent') {
2480
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2481
+                // de la boucle superieure.... faudrait verifier qu'il existe
2482
+                // pour eviter l'erreur SQL
2483
+                $val = $boucles[$idb]->primary;
2484
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2485
+                $defaut = "(\$Pile[0]['id_parent'] ?? null)";
2486
+            } elseif ($val == 'id_enfant') {
2487
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2488
+                // de la boucle superieure
2489
+                $val = 'id_parent';
2490
+            } elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) {
2491
+                // un critere conditionnel sur date est traite a part
2492
+                // car la date est mise d'office par SPIP,
2493
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2494
+            }
2495
+
2496
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2497
+            $val = [kwote($val)];
2498
+        }
2499
+    } else {
2500
+        // comparaison explicite
2501
+        // le phraseur impose que le premier param soit du texte
2502
+        $params = $crit->param;
2503
+        $op = $crit->op;
2504
+        if ($op == '==') {
2505
+            $op = 'REGEXP';
2506
+        }
2507
+        $col = array_shift($params);
2508
+        $col = $col[0]->texte;
2509
+
2510
+        $val = [];
2511
+        $parent = $boucles[$idb]->id_parent;
2512
+
2513
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2514
+        // celui ne sachant pas ce qu'est un critere infixe
2515
+        // et a fortiori son 2e operande qu'entoure " ou '
2516
+        if (
2517
+            count($params) == 1
2518
+            and (is_countable($params[0]) ? count($params[0]) : 0) == 3
2519
+            and $params[0][0]->type == 'texte'
2520
+            and $params[0][2]->type == 'texte'
2521
+            and ($p = $params[0][0]->texte) == $params[0][2]->texte
2522
+            and (($p == "'") or ($p == '"'))
2523
+            and $params[0][1]->type == 'champ'
2524
+        ) {
2525
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2526
+        } else {
2527
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2528
+                $a = calculer_liste($p, $idb, $boucles, $parent);
2529
+                if (strcasecmp($op, 'IN') == 0) {
2530
+                    $val[] = $a;
2531
+                } else {
2532
+                    $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2533
+                } // toujours quoter en char ici
2534
+            }
2535
+        }
2536
+    }
2537
+
2538
+    $fct = $args_sql = '';
2539
+    // fonction SQL ?
2540
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2541
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2542
+        $fct = $m[1];
2543
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2544
+        $col = $a[1];
2545
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2546
+            $col = $m[1];
2547
+            $args_sql = $m[2];
2548
+        }
2549
+        $args_sql .= $a[2];
2550
+    }
2551
+
2552
+    return [$fct, $col, $op, $val, $args_sql];
2553 2553
 }
2554 2554
 
2555 2555
 // compatibilite ancienne version
2556 2556
 
2557 2557
 function calculer_vieux_in($params) {
2558
-	$deb = $params[0][0];
2559
-	$k = (is_countable($params) ? count($params) : 0) - 1;
2560
-	$last = $params[$k];
2561
-	$j = (is_countable($last) ? count($last) : 0) - 1;
2562
-	$last = $last[$j];
2563
-	$n = isset($last->texte) ? strlen($last->texte) : 0;
2564
-
2565
-	if (
2566
-		!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2567
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2568
-	) {
2569
-		return $params;
2570
-	}
2571
-	$params[0][0]->texte = substr($deb->texte, 1);
2572
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2573
-	$last = $params[$k][$j];
2574
-	$n = strlen($last->texte);
2575
-	$params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2576
-	$newp = [];
2577
-	foreach ($params as $v) {
2578
-		if ($v[0]->type != 'texte') {
2579
-			$newp[] = $v;
2580
-		} else {
2581
-			foreach (explode(',', $v[0]->texte) as $x) {
2582
-				$t = new Texte();
2583
-				$t->texte = $x;
2584
-				$newp[] = [$t];
2585
-			}
2586
-		}
2587
-	}
2588
-
2589
-	return $newp;
2558
+    $deb = $params[0][0];
2559
+    $k = (is_countable($params) ? count($params) : 0) - 1;
2560
+    $last = $params[$k];
2561
+    $j = (is_countable($last) ? count($last) : 0) - 1;
2562
+    $last = $last[$j];
2563
+    $n = isset($last->texte) ? strlen($last->texte) : 0;
2564
+
2565
+    if (
2566
+        !((isset($deb->texte[0]) and $deb->texte[0] == '(')
2567
+        && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2568
+    ) {
2569
+        return $params;
2570
+    }
2571
+    $params[0][0]->texte = substr($deb->texte, 1);
2572
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2573
+    $last = $params[$k][$j];
2574
+    $n = strlen($last->texte);
2575
+    $params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2576
+    $newp = [];
2577
+    foreach ($params as $v) {
2578
+        if ($v[0]->type != 'texte') {
2579
+            $newp[] = $v;
2580
+        } else {
2581
+            foreach (explode(',', $v[0]->texte) as $x) {
2582
+                $t = new Texte();
2583
+                $t->texte = $x;
2584
+                $newp[] = [$t];
2585
+            }
2586
+        }
2587
+    }
2588
+
2589
+    return $newp;
2590 2590
 }
2591 2591
 
2592 2592
 /**
@@ -2605,95 +2605,95 @@  discard block
 block discarded – undo
2605 2605
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2606 2606
  **/
2607 2607
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2608
-	if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2609
-		return '';
2610
-	}
2611
-
2612
-	$boucle = $boucles[$idb];
2613
-	$table = $boucle->show;
2614
-
2615
-	// si c'est une colonne de la table, ne rien faire
2616
-	if (isset($table['field'][$col])) {
2617
-		return '';
2618
-	}
2619
-
2620
-	// Le type de critère à prendre en compte
2621
-	$col = $regs[1];
2622
-
2623
-	// Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet
2624
-	if (isset($regs[3]) and $suite = $regs[3]) {
2625
-		# Recherche de l'existence du champ date_xxxx,
2626
-		# si oui choisir ce champ, sinon choisir xxxx
2627
-		if (isset($table['field']["date$suite"])) {
2628
-			$date_orig = 'date' . $suite;
2629
-		} else {
2630
-			$date_orig = substr($suite, 1);
2631
-		}
2632
-
2633
-		$pred = $date_orig;
2634
-	} else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet
2635
-		// Si aucune déclaration trouvée, on quitte
2636
-		if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2637
-			return '';
2638
-		}
2639
-		// Par défaut, on prend le champ date déclaré dans l'API
2640
-		$pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
2641
-
2642
-		// Si c'est pour du relatif
2643
-		if (isset($regs[2]) and $rel = $regs[2]) {
2644
-			$pred = 'date';
2645
-		}
2646
-	}
2647
-
2648
-	$date_compare = "\"' . normaliser_date(" .
2649
-		calculer_argument_precedent($idb, $pred, $boucles) .
2650
-		") . '\"";
2651
-
2652
-	$col_vraie = $date_orig;
2653
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2654
-
2655
-	switch ($col) {
2656
-		case 'date':
2657
-			$col = $date_orig;
2658
-			break;
2659
-		case 'jour':
2660
-			$col = "DAYOFMONTH($date_orig)";
2661
-			break;
2662
-		case 'mois':
2663
-			$col = "MONTH($date_orig)";
2664
-			break;
2665
-		case 'annee':
2666
-			$col = "YEAR($date_orig)";
2667
-			break;
2668
-		case 'heure':
2669
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2670
-			break;
2671
-		case 'age':
2672
-			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2673
-			$col_vraie = '';// comparer a un int (par defaut)
2674
-			break;
2675
-		case 'age_relatif':
2676
-			$col = calculer_param_date($date_compare, $date_orig);
2677
-			$col_vraie = '';// comparer a un int (par defaut)
2678
-			break;
2679
-		case 'jour_relatif':
2680
-			$col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2681
-			$col_vraie = '';// comparer a un int (par defaut)
2682
-			break;
2683
-		case 'mois_relatif':
2684
-			$col = 'MONTH(' . $date_compare . ')-MONTH(' .
2685
-				$date_orig . ')+12*(YEAR(' . $date_compare .
2686
-				')-YEAR(' . $date_orig . '))';
2687
-			$col_vraie = '';// comparer a un int (par defaut)
2688
-			break;
2689
-		case 'annee_relatif':
2690
-			$col = 'YEAR(' . $date_compare . ')-YEAR(' .
2691
-				$date_orig . ')';
2692
-			$col_vraie = '';// comparer a un int (par defaut)
2693
-			break;
2694
-	}
2695
-
2696
-	return [$col, $col_vraie];
2608
+    if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2609
+        return '';
2610
+    }
2611
+
2612
+    $boucle = $boucles[$idb];
2613
+    $table = $boucle->show;
2614
+
2615
+    // si c'est une colonne de la table, ne rien faire
2616
+    if (isset($table['field'][$col])) {
2617
+        return '';
2618
+    }
2619
+
2620
+    // Le type de critère à prendre en compte
2621
+    $col = $regs[1];
2622
+
2623
+    // Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet
2624
+    if (isset($regs[3]) and $suite = $regs[3]) {
2625
+        # Recherche de l'existence du champ date_xxxx,
2626
+        # si oui choisir ce champ, sinon choisir xxxx
2627
+        if (isset($table['field']["date$suite"])) {
2628
+            $date_orig = 'date' . $suite;
2629
+        } else {
2630
+            $date_orig = substr($suite, 1);
2631
+        }
2632
+
2633
+        $pred = $date_orig;
2634
+    } else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet
2635
+        // Si aucune déclaration trouvée, on quitte
2636
+        if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2637
+            return '';
2638
+        }
2639
+        // Par défaut, on prend le champ date déclaré dans l'API
2640
+        $pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
2641
+
2642
+        // Si c'est pour du relatif
2643
+        if (isset($regs[2]) and $rel = $regs[2]) {
2644
+            $pred = 'date';
2645
+        }
2646
+    }
2647
+
2648
+    $date_compare = "\"' . normaliser_date(" .
2649
+        calculer_argument_precedent($idb, $pred, $boucles) .
2650
+        ") . '\"";
2651
+
2652
+    $col_vraie = $date_orig;
2653
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2654
+
2655
+    switch ($col) {
2656
+        case 'date':
2657
+            $col = $date_orig;
2658
+            break;
2659
+        case 'jour':
2660
+            $col = "DAYOFMONTH($date_orig)";
2661
+            break;
2662
+        case 'mois':
2663
+            $col = "MONTH($date_orig)";
2664
+            break;
2665
+        case 'annee':
2666
+            $col = "YEAR($date_orig)";
2667
+            break;
2668
+        case 'heure':
2669
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2670
+            break;
2671
+        case 'age':
2672
+            $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2673
+            $col_vraie = '';// comparer a un int (par defaut)
2674
+            break;
2675
+        case 'age_relatif':
2676
+            $col = calculer_param_date($date_compare, $date_orig);
2677
+            $col_vraie = '';// comparer a un int (par defaut)
2678
+            break;
2679
+        case 'jour_relatif':
2680
+            $col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2681
+            $col_vraie = '';// comparer a un int (par defaut)
2682
+            break;
2683
+        case 'mois_relatif':
2684
+            $col = 'MONTH(' . $date_compare . ')-MONTH(' .
2685
+                $date_orig . ')+12*(YEAR(' . $date_compare .
2686
+                ')-YEAR(' . $date_orig . '))';
2687
+            $col_vraie = '';// comparer a un int (par defaut)
2688
+            break;
2689
+        case 'annee_relatif':
2690
+            $col = 'YEAR(' . $date_compare . ')-YEAR(' .
2691
+                $date_orig . ')';
2692
+            $col_vraie = '';// comparer a un int (par defaut)
2693
+            break;
2694
+    }
2695
+
2696
+    return [$col, $col_vraie];
2697 2697
 }
2698 2698
 
2699 2699
 /**
@@ -2712,16 +2712,16 @@  discard block
 block discarded – undo
2712 2712
  *     de colonne SQL et une date.
2713 2713
  **/
2714 2714
 function calculer_param_date($date_compare, $date_orig) {
2715
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2716
-		$init = "'\" . (\$x = $r[1]) . \"'";
2717
-		$date_compare = '\'$x\'';
2718
-	} else {
2719
-		$init = $date_compare;
2720
-	}
2721
-
2722
-	return
2723
-		// optimisation : mais prevoir le support SQLite avant
2724
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2715
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2716
+        $init = "'\" . (\$x = $r[1]) . \"'";
2717
+        $date_compare = '\'$x\'';
2718
+    } else {
2719
+        $init = $date_compare;
2720
+    }
2721
+
2722
+    return
2723
+        // optimisation : mais prevoir le support SQLite avant
2724
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2725 2725
 }
2726 2726
 
2727 2727
 /**
@@ -2739,20 +2739,20 @@  discard block
 block discarded – undo
2739 2739
  * @param Critere $crit Paramètres du critère dans cette boucle
2740 2740
  */
2741 2741
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2742
-	$boucle = &$boucles[$idb];
2743
-
2744
-	$args = [];
2745
-	foreach ($crit->param as &$param) {
2746
-		array_push(
2747
-			$args,
2748
-			calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent)
2749
-		);
2750
-	}
2742
+    $boucle = &$boucles[$idb];
2751 2743
 
2752
-	$boucle->hash .= '
2744
+    $args = [];
2745
+    foreach ($crit->param as &$param) {
2746
+        array_push(
2747
+            $args,
2748
+            calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent)
2749
+        );
2750
+    }
2751
+
2752
+    $boucle->hash .= '
2753 2753
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2754 2754
 
2755
-	$boucle->hash .= '
2755
+    $boucle->hash .= '
2756 2756
 	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2757 2757
 }
2758 2758
 
@@ -2770,8 +2770,8 @@  discard block
 block discarded – undo
2770 2770
  * @param Critere $crit Paramètres du critère dans cette boucle
2771 2771
  */
2772 2772
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2773
-	$boucle = &$boucles[$idb];
2774
-	$boucle->hash .= '
2773
+    $boucle = &$boucles[$idb];
2774
+    $boucle->hash .= '
2775 2775
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2776 2776
 }
2777 2777
 
@@ -2787,12 +2787,12 @@  discard block
 block discarded – undo
2787 2787
  * @param Critere $crit Paramètres du critère dans cette boucle
2788 2788
  */
2789 2789
 function critere_php_args_dist($idb, &$boucles, $crit) {
2790
-	$boucle = &$boucles[$idb];
2791
-	$boucle->hash .= '$command[\'args\']=array();';
2792
-	foreach ($crit->param as $param) {
2793
-		$boucle->hash .= '
2790
+    $boucle = &$boucles[$idb];
2791
+    $boucle->hash .= '$command[\'args\']=array();';
2792
+    foreach ($crit->param as $param) {
2793
+        $boucle->hash .= '
2794 2794
 			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2795
-	}
2795
+    }
2796 2796
 }
2797 2797
 
2798 2798
 /**
@@ -2809,16 +2809,16 @@  discard block
 block discarded – undo
2809 2809
  * @param Critere $crit Paramètres du critère dans cette boucle
2810 2810
  */
2811 2811
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2812
-	$boucle = &$boucles[$idb];
2813
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2814
-	foreach ($crit->param as $param) {
2815
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2816
-			$param,
2817
-			$idb,
2818
-			$boucles,
2819
-			$boucles[$idb]->id_parent
2820
-		) . ";\n";
2821
-	}
2812
+    $boucle = &$boucles[$idb];
2813
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2814
+    foreach ($crit->param as $param) {
2815
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2816
+            $param,
2817
+            $idb,
2818
+            $boucles,
2819
+            $boucles[$idb]->id_parent
2820
+        ) . ";\n";
2821
+    }
2822 2822
 }
2823 2823
 
2824 2824
 /**
@@ -2843,16 +2843,16 @@  discard block
 block discarded – undo
2843 2843
  * @param Critere $crit Paramètres du critère dans cette boucle
2844 2844
  */
2845 2845
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2846
-	$boucle = &$boucles[$idb];
2847
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2848
-	foreach ($crit->param as $param) {
2849
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2850
-			$param,
2851
-			$idb,
2852
-			$boucles,
2853
-			$boucles[$idb]->id_parent
2854
-		) . ";\n";
2855
-	}
2846
+    $boucle = &$boucles[$idb];
2847
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2848
+    foreach ($crit->param as $param) {
2849
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2850
+            $param,
2851
+            $idb,
2852
+            $boucles,
2853
+            $boucles[$idb]->id_parent
2854
+        ) . ";\n";
2855
+    }
2856 2856
 }
2857 2857
 
2858 2858
 /**
@@ -2867,11 +2867,11 @@  discard block
 block discarded – undo
2867 2867
  * @param Critere $crit Paramètres du critère dans cette boucle
2868 2868
  */
2869 2869
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2870
-	$boucle = &$boucles[$idb];
2871
-	foreach ($crit->param as $param) {
2872
-		$boucle->hash .= '
2870
+    $boucle = &$boucles[$idb];
2871
+    foreach ($crit->param as $param) {
2872
+        $boucle->hash .= '
2873 2873
 			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2874
-	}
2874
+    }
2875 2875
 }
2876 2876
 
2877 2877
 
@@ -2903,20 +2903,20 @@  discard block
 block discarded – undo
2903 2903
  * @param Critere $crit Paramètres du critère dans cette boucle
2904 2904
  */
2905 2905
 function critere_si_dist($idb, &$boucles, $crit) {
2906
-	$boucle = &$boucles[$idb];
2907
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2908
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2909
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2910
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2911
-	if ($crit->param) {
2912
-		foreach ($crit->param as $param) {
2913
-			$boucle->hash .= "\t\$command['si'][] = "
2914
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2915
-		}
2916
-		// interdire {si 0} aussi !
2917
-	} else {
2918
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2919
-	}
2906
+    $boucle = &$boucles[$idb];
2907
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2908
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2909
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2910
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2911
+    if ($crit->param) {
2912
+        foreach ($crit->param as $param) {
2913
+            $boucle->hash .= "\t\$command['si'][] = "
2914
+                . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2915
+        }
2916
+        // interdire {si 0} aussi !
2917
+    } else {
2918
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2919
+    }
2920 2920
 }
2921 2921
 
2922 2922
 /**
@@ -2933,8 +2933,8 @@  discard block
 block discarded – undo
2933 2933
  * @param Critere $crit Paramètres du critère dans cette boucle
2934 2934
  */
2935 2935
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2936
-	$boucle = &$boucles[$idb];
2937
-	$boucle->hash .= '
2936
+    $boucle = &$boucles[$idb];
2937
+    $boucle->hash .= '
2938 2938
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2939 2939
 	$command[\'sourcemode\'] = \'table\';';
2940 2940
 }
@@ -2955,27 +2955,27 @@  discard block
 block discarded – undo
2955 2955
  */
2956 2956
 function critere_noeud_dist($idb, &$boucles, $crit) {
2957 2957
 
2958
-	$not = $crit->not;
2959
-	$boucle = &$boucles[$idb];
2960
-	$primary = $boucle->primary;
2958
+    $not = $crit->not;
2959
+    $boucle = &$boucles[$idb];
2960
+    $primary = $boucle->primary;
2961 2961
 
2962
-	if (!$primary or strpos($primary, ',')) {
2963
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2962
+    if (!$primary or strpos($primary, ',')) {
2963
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2964 2964
 
2965
-		return;
2966
-	}
2967
-	$table = $boucle->type_requete;
2968
-	$table_sql = table_objet_sql(objet_type($table));
2965
+        return;
2966
+    }
2967
+    $table = $boucle->type_requete;
2968
+    $table_sql = table_objet_sql(objet_type($table));
2969 2969
 
2970
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2970
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2971 2971
 
2972
-	$in = 'IN';
2973
-	$where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2974
-	if ($not) {
2975
-		$where = ["'NOT'", $where];
2976
-	}
2972
+    $in = 'IN';
2973
+    $where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2974
+    if ($not) {
2975
+        $where = ["'NOT'", $where];
2976
+    }
2977 2977
 
2978
-	$boucle->where[] = $where;
2978
+    $boucle->where[] = $where;
2979 2979
 }
2980 2980
 
2981 2981
 /**
@@ -2991,8 +2991,8 @@  discard block
 block discarded – undo
2991 2991
  * @param Critere $crit Paramètres du critère dans cette boucle
2992 2992
  */
2993 2993
 function critere_feuille_dist($idb, &$boucles, $crit) {
2994
-	$not = $crit->not;
2995
-	$crit->not = $not ? false : true;
2996
-	critere_noeud_dist($idb, $boucles, $crit);
2997
-	$crit->not = $not;
2994
+    $not = $crit->not;
2995
+    $crit->not = $not ? false : true;
2996
+    critere_noeud_dist($idb, $boucles, $crit);
2997
+    $crit->not = $not;
2998 2998
 }
Please login to merge, or discard this patch.
ecrire/public/balises.php 1 patch
Indentation   +941 added lines, -941 removed lines patch added patch discarded remove patch
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
  **/
27 27
 
28 28
 if (!defined('_ECRIRE_INC_VERSION')) {
29
-	return;
29
+    return;
30 30
 }
31 31
 
32 32
 /**
@@ -48,16 +48,16 @@  discard block
 block discarded – undo
48 48
  *     Code PHP si cet argument est présent, sinon null
49 49
  **/
50 50
 function interprete_argument_balise(int $n, Champ $p): ?string {
51
-	if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) {
52
-		return calculer_liste(
53
-			$p->param[0][$n],
54
-			$p->descr,
55
-			$p->boucles,
56
-			$p->id_boucle
57
-		);
58
-	} else {
59
-		return null;
60
-	}
51
+    if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) {
52
+        return calculer_liste(
53
+            $p->param[0][$n],
54
+            $p->descr,
55
+            $p->boucles,
56
+            $p->id_boucle
57
+        );
58
+    } else {
59
+        return null;
60
+    }
61 61
 }
62 62
 
63 63
 
@@ -77,10 +77,10 @@  discard block
 block discarded – undo
77 77
  *     Pile complétée par le code à générer
78 78
  **/
79 79
 function balise_NOM_SITE_SPIP_dist($p) {
80
-	$p->code = "\$GLOBALS['meta']['nom_site']";
80
+    $p->code = "\$GLOBALS['meta']['nom_site']";
81 81
 
82
-	#$p->interdire_scripts = true;
83
-	return $p;
82
+    #$p->interdire_scripts = true;
83
+    return $p;
84 84
 }
85 85
 
86 86
 /**
@@ -96,10 +96,10 @@  discard block
 block discarded – undo
96 96
  *     Pile complétée par le code à générer
97 97
  **/
98 98
 function balise_EMAIL_WEBMASTER_dist($p) {
99
-	$p->code = "\$GLOBALS['meta']['email_webmaster']";
99
+    $p->code = "\$GLOBALS['meta']['email_webmaster']";
100 100
 
101
-	#$p->interdire_scripts = true;
102
-	return $p;
101
+    #$p->interdire_scripts = true;
102
+    return $p;
103 103
 }
104 104
 
105 105
 /**
@@ -115,10 +115,10 @@  discard block
 block discarded – undo
115 115
  *     Pile complétée par le code à générer
116 116
  **/
117 117
 function balise_DESCRIPTIF_SITE_SPIP_dist($p) {
118
-	$p->code = "\$GLOBALS['meta']['descriptif_site']";
118
+    $p->code = "\$GLOBALS['meta']['descriptif_site']";
119 119
 
120
-	#$p->interdire_scripts = true;
121
-	return $p;
120
+    #$p->interdire_scripts = true;
121
+    return $p;
122 122
 }
123 123
 
124 124
 
@@ -139,10 +139,10 @@  discard block
 block discarded – undo
139 139
  *     Pile complétée par le code à générer
140 140
  **/
141 141
 function balise_CHARSET_dist($p) {
142
-	$p->code = "\$GLOBALS['meta']['charset']";
142
+    $p->code = "\$GLOBALS['meta']['charset']";
143 143
 
144
-	#$p->interdire_scripts = true;
145
-	return $p;
144
+    #$p->interdire_scripts = true;
145
+    return $p;
146 146
 }
147 147
 
148 148
 /**
@@ -167,11 +167,11 @@  discard block
 block discarded – undo
167 167
  *     Pile complétée par le code à générer
168 168
  **/
169 169
 function balise_LANG_LEFT_dist($p) {
170
-	$_lang = champ_sql('lang', $p);
171
-	$p->code = "lang_dir($_lang, 'left','right')";
172
-	$p->interdire_scripts = false;
170
+    $_lang = champ_sql('lang', $p);
171
+    $p->code = "lang_dir($_lang, 'left','right')";
172
+    $p->interdire_scripts = false;
173 173
 
174
-	return $p;
174
+    return $p;
175 175
 }
176 176
 
177 177
 /**
@@ -191,11 +191,11 @@  discard block
 block discarded – undo
191 191
  *     Pile complétée par le code à générer
192 192
  **/
193 193
 function balise_LANG_RIGHT_dist($p) {
194
-	$_lang = champ_sql('lang', $p);
195
-	$p->code = "lang_dir($_lang, 'right','left')";
196
-	$p->interdire_scripts = false;
194
+    $_lang = champ_sql('lang', $p);
195
+    $p->code = "lang_dir($_lang, 'right','left')";
196
+    $p->interdire_scripts = false;
197 197
 
198
-	return $p;
198
+    return $p;
199 199
 }
200 200
 
201 201
 /**
@@ -220,11 +220,11 @@  discard block
 block discarded – undo
220 220
  *     Pile complétée par le code à générer
221 221
  **/
222 222
 function balise_LANG_DIR_dist($p) {
223
-	$_lang = champ_sql('lang', $p);
224
-	$p->code = "lang_dir($_lang, 'ltr','rtl')";
225
-	$p->interdire_scripts = false;
223
+    $_lang = champ_sql('lang', $p);
224
+    $p->code = "lang_dir($_lang, 'ltr','rtl')";
225
+    $p->interdire_scripts = false;
226 226
 
227
-	return $p;
227
+    return $p;
228 228
 }
229 229
 
230 230
 
@@ -241,10 +241,10 @@  discard block
 block discarded – undo
241 241
  *     Pile complétée par le code à générer
242 242
  **/
243 243
 function balise_PUCE_dist($p) {
244
-	$p->code = 'definir_puce()';
245
-	$p->interdire_scripts = false;
244
+    $p->code = 'definir_puce()';
245
+    $p->interdire_scripts = false;
246 246
 
247
-	return $p;
247
+    return $p;
248 248
 }
249 249
 
250 250
 
@@ -268,9 +268,9 @@  discard block
 block discarded – undo
268 268
  *     Pile completée du code PHP d'exécution de la balise
269 269
  */
270 270
 function balise_DATE_dist($p) {
271
-	$p->code = champ_sql('date', $p);
271
+    $p->code = champ_sql('date', $p);
272 272
 
273
-	return $p;
273
+    return $p;
274 274
 }
275 275
 
276 276
 
@@ -290,10 +290,10 @@  discard block
 block discarded – undo
290 290
  *     Pile completée du code PHP d'exécution de la balise
291 291
  */
292 292
 function balise_DATE_REDAC_dist($p) {
293
-	$p->code = champ_sql('date_redac', $p);
294
-	$p->interdire_scripts = false;
293
+    $p->code = champ_sql('date_redac', $p);
294
+    $p->interdire_scripts = false;
295 295
 
296
-	return $p;
296
+    return $p;
297 297
 }
298 298
 
299 299
 /**
@@ -312,10 +312,10 @@  discard block
 block discarded – undo
312 312
  *     Pile completée du code PHP d'exécution de la balise
313 313
  */
314 314
 function balise_DATE_MODIF_dist($p) {
315
-	$p->code = champ_sql('date_modif', $p);
316
-	$p->interdire_scripts = false;
315
+    $p->code = champ_sql('date_modif', $p);
316
+    $p->interdire_scripts = false;
317 317
 
318
-	return $p;
318
+    return $p;
319 319
 }
320 320
 
321 321
 /**
@@ -333,13 +333,13 @@  discard block
 block discarded – undo
333 333
  *     Pile completée du code PHP d'exécution de la balise
334 334
  */
335 335
 function balise_DATE_NOUVEAUTES_dist($p) {
336
-	$p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
336
+    $p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
337 337
 	AND isset(\$GLOBALS['meta']['dernier_envoi_neuf'])) ?
338 338
 	\$GLOBALS['meta']['dernier_envoi_neuf'] :
339 339
 	\"'0000-00-00'\")";
340
-	$p->interdire_scripts = false;
340
+    $p->interdire_scripts = false;
341 341
 
342
-	return $p;
342
+    return $p;
343 343
 }
344 344
 
345 345
 
@@ -357,11 +357,11 @@  discard block
 block discarded – undo
357 357
  *     Pile completée du code PHP d'exécution de la balise
358 358
  */
359 359
 function balise_DOSSIER_SQUELETTE_dist($p) {
360
-	$code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
361
-	$p->code = "_DIR_RACINE . '$code'" .
362
-		$p->interdire_scripts = false;
360
+    $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
361
+    $p->code = "_DIR_RACINE . '$code'" .
362
+        $p->interdire_scripts = false;
363 363
 
364
-	return $p;
364
+    return $p;
365 365
 }
366 366
 
367 367
 /**
@@ -376,11 +376,11 @@  discard block
 block discarded – undo
376 376
  *     Pile completée du code PHP d'exécution de la balise
377 377
  */
378 378
 function balise_SQUELETTE_dist($p) {
379
-	$code = addslashes($p->descr['sourcefile']);
380
-	$p->code = "'$code'" .
381
-		$p->interdire_scripts = false;
379
+    $code = addslashes($p->descr['sourcefile']);
380
+    $p->code = "'$code'" .
381
+        $p->interdire_scripts = false;
382 382
 
383
-	return $p;
383
+    return $p;
384 384
 }
385 385
 
386 386
 /**
@@ -399,10 +399,10 @@  discard block
 block discarded – undo
399 399
  *     Pile completée du code PHP d'exécution de la balise
400 400
  */
401 401
 function balise_SPIP_VERSION_dist($p) {
402
-	$p->code = 'spip_version()';
403
-	$p->interdire_scripts = false;
402
+    $p->code = 'spip_version()';
403
+    $p->interdire_scripts = false;
404 404
 
405
-	return $p;
405
+    return $p;
406 406
 }
407 407
 
408 408
 
@@ -428,18 +428,18 @@  discard block
 block discarded – undo
428 428
  *     Pile complétée par le code à générer
429 429
  **/
430 430
 function balise_NOM_SITE_dist($p) {
431
-	if (!$p->etoile) {
432
-		$p->code = 'supprimer_numero(calculer_url(' .
433
-			champ_sql('url_site', $p) . ',' .
434
-			champ_sql('nom_site', $p) .
435
-			", 'titre', \$connect, false))";
436
-	} else {
437
-		$p->code = champ_sql('nom_site', $p);
438
-	}
431
+    if (!$p->etoile) {
432
+        $p->code = 'supprimer_numero(calculer_url(' .
433
+            champ_sql('url_site', $p) . ',' .
434
+            champ_sql('nom_site', $p) .
435
+            ", 'titre', \$connect, false))";
436
+    } else {
437
+        $p->code = champ_sql('nom_site', $p);
438
+    }
439 439
 
440
-	$p->interdire_scripts = true;
440
+    $p->interdire_scripts = true;
441 441
 
442
-	return $p;
442
+    return $p;
443 443
 }
444 444
 
445 445
 
@@ -456,11 +456,11 @@  discard block
 block discarded – undo
456 456
  *     Pile complétée par le code à générer
457 457
  **/
458 458
 function balise_NOTES_dist($p) {
459
-	// Recuperer les notes
460
-	$p->code = 'calculer_notes()';
459
+    // Recuperer les notes
460
+    $p->code = 'calculer_notes()';
461 461
 
462
-	#$p->interdire_scripts = true;
463
-	return $p;
462
+    #$p->interdire_scripts = true;
463
+    return $p;
464 464
 }
465 465
 
466 466
 
@@ -482,10 +482,10 @@  discard block
 block discarded – undo
482 482
  *     Pile complétée par le code à générer
483 483
  **/
484 484
 function balise_RECHERCHE_dist($p) {
485
-	$p->code = 'entites_html(_request("recherche"))';
486
-	$p->interdire_scripts = false;
485
+    $p->code = 'entites_html(_request("recherche"))';
486
+    $p->interdire_scripts = false;
487 487
 
488
-	return $p;
488
+    return $p;
489 489
 }
490 490
 
491 491
 
@@ -503,17 +503,17 @@  discard block
 block discarded – undo
503 503
  *     Pile complétée par le code à générer
504 504
  **/
505 505
 function balise_COMPTEUR_BOUCLE_dist($p) {
506
-	$b = index_boucle_mere($p);
507
-	if ($b === '') {
508
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
509
-		erreur_squelette($msg, $p);
510
-	} else {
511
-		$p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)";
512
-		$p->boucles[$b]->cptrows = true;
513
-		$p->interdire_scripts = false;
506
+    $b = index_boucle_mere($p);
507
+    if ($b === '') {
508
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
509
+        erreur_squelette($msg, $p);
510
+    } else {
511
+        $p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)";
512
+        $p->boucles[$b]->cptrows = true;
513
+        $p->interdire_scripts = false;
514 514
 
515
-		return $p;
516
-	}
515
+        return $p;
516
+    }
517 517
 }
518 518
 
519 519
 /**
@@ -531,17 +531,17 @@  discard block
 block discarded – undo
531 531
  *     Pile complétée par le code à générer
532 532
  **/
533 533
 function balise_TOTAL_BOUCLE_dist($p) {
534
-	$b = index_boucle_mere($p);
535
-	if ($b === '') {
536
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
537
-		erreur_squelette($msg, $p);
538
-	} else {
539
-		$p->code = "(\$Numrows['$b']['total'] ?? 0)";
540
-		$p->boucles[$b]->numrows = true;
541
-		$p->interdire_scripts = false;
542
-	}
534
+    $b = index_boucle_mere($p);
535
+    if ($b === '') {
536
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
537
+        erreur_squelette($msg, $p);
538
+    } else {
539
+        $p->code = "(\$Numrows['$b']['total'] ?? 0)";
540
+        $p->boucles[$b]->numrows = true;
541
+        $p->interdire_scripts = false;
542
+    }
543 543
 
544
-	return $p;
544
+    return $p;
545 545
 }
546 546
 
547 547
 
@@ -561,7 +561,7 @@  discard block
 block discarded – undo
561 561
  *     Pile complétée par le code à générer
562 562
  **/
563 563
 function balise_POINTS_dist($p) {
564
-	return rindex_pile($p, 'points', 'recherche');
564
+    return rindex_pile($p, 'points', 'recherche');
565 565
 }
566 566
 
567 567
 
@@ -582,12 +582,12 @@  discard block
 block discarded – undo
582 582
  *     Pile complétée par le code à générer
583 583
  **/
584 584
 function balise_POPULARITE_ABSOLUE_dist($p) {
585
-	$p->code = 'ceil(' .
586
-		champ_sql('popularite', $p) .
587
-		')';
588
-	$p->interdire_scripts = false;
585
+    $p->code = 'ceil(' .
586
+        champ_sql('popularite', $p) .
587
+        ')';
588
+    $p->interdire_scripts = false;
589 589
 
590
-	return $p;
590
+    return $p;
591 591
 }
592 592
 
593 593
 /**
@@ -607,10 +607,10 @@  discard block
 block discarded – undo
607 607
  *     Pile complétée par le code à générer
608 608
  **/
609 609
 function balise_POPULARITE_SITE_dist($p) {
610
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
611
-	$p->interdire_scripts = false;
610
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
611
+    $p->interdire_scripts = false;
612 612
 
613
-	return $p;
613
+    return $p;
614 614
 }
615 615
 
616 616
 /**
@@ -631,10 +631,10 @@  discard block
 block discarded – undo
631 631
  *     Pile complétée par le code à générer
632 632
  **/
633 633
 function balise_POPULARITE_MAX_dist($p) {
634
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
635
-	$p->interdire_scripts = false;
634
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
635
+    $p->interdire_scripts = false;
636 636
 
637
-	return $p;
637
+    return $p;
638 638
 }
639 639
 
640 640
 
@@ -660,15 +660,15 @@  discard block
 block discarded – undo
660 660
  *     Pile complétée par le code à générer
661 661
  **/
662 662
 function balise_VALEUR_dist($p) {
663
-	$b = $p->nom_boucle ?: $p->id_boucle;
664
-	$p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
663
+    $b = $p->nom_boucle ?: $p->id_boucle;
664
+    $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
665 665
 ;
666
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
667
-		$p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
668
-	}
669
-	$p->interdire_scripts = true;
666
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
667
+        $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
668
+    }
669
+    $p->interdire_scripts = true;
670 670
 
671
-	return $p;
671
+    return $p;
672 672
 }
673 673
 
674 674
 /**
@@ -697,16 +697,16 @@  discard block
 block discarded – undo
697 697
  *     Pile complétée par le code à générer
698 698
  **/
699 699
 function balise_EXPOSE_dist($p) {
700
-	$on = "'on'";
701
-	$off = "''";
702
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
703
-		$on = $v;
704
-		if (($v = interprete_argument_balise(2, $p)) !== null) {
705
-			$off = $v;
706
-		}
707
-	}
700
+    $on = "'on'";
701
+    $off = "''";
702
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
703
+        $on = $v;
704
+        if (($v = interprete_argument_balise(2, $p)) !== null) {
705
+            $off = $v;
706
+        }
707
+    }
708 708
 
709
-	return calculer_balise_expose($p, $on, $off);
709
+    return calculer_balise_expose($p, $on, $off);
710 710
 }
711 711
 
712 712
 /**
@@ -724,35 +724,35 @@  discard block
 block discarded – undo
724 724
  *     Pile complétée par le code à générer
725 725
  **/
726 726
 function calculer_balise_expose($p, $on, $off) {
727
-	$b = index_boucle($p);
728
-	if (empty($p->boucles[$b]->primary)) {
729
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
730
-		erreur_squelette($msg, $p);
731
-	} else {
732
-		$key = $p->boucles[$b]->primary;
733
-		$type = $p->boucles[$p->id_boucle]->primary;
734
-		$desc = $p->boucles[$b]->show;
735
-		$connect = sql_quote($p->boucles[$b]->sql_serveur);
727
+    $b = index_boucle($p);
728
+    if (empty($p->boucles[$b]->primary)) {
729
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
730
+        erreur_squelette($msg, $p);
731
+    } else {
732
+        $key = $p->boucles[$b]->primary;
733
+        $type = $p->boucles[$p->id_boucle]->primary;
734
+        $desc = $p->boucles[$b]->show;
735
+        $connect = sql_quote($p->boucles[$b]->sql_serveur);
736 736
 
737
-		// Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
738
-		$c = index_pile($p->id_boucle, $type, $p->boucles);
737
+        // Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
738
+        $c = index_pile($p->id_boucle, $type, $p->boucles);
739 739
 
740
-		if (isset($desc['field']['id_parent'])) {
741
-			$parent = 0; // pour if (!$parent) dans calculer_expose
742
-		} elseif (isset($desc['field']['id_rubrique'])) {
743
-			$parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
744
-		} elseif (isset($desc['field']['id_groupe'])) {
745
-			$parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
746
-		} else {
747
-			$parent = "''";
748
-		}
740
+        if (isset($desc['field']['id_parent'])) {
741
+            $parent = 0; // pour if (!$parent) dans calculer_expose
742
+        } elseif (isset($desc['field']['id_rubrique'])) {
743
+            $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
744
+        } elseif (isset($desc['field']['id_groupe'])) {
745
+            $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
746
+        } else {
747
+            $parent = "''";
748
+        }
749 749
 
750
-		$p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
751
-	}
750
+        $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
751
+    }
752 752
 
753
-	$p->interdire_scripts = false;
753
+    $p->interdire_scripts = false;
754 754
 
755
-	return $p;
755
+    return $p;
756 756
 }
757 757
 
758 758
 
@@ -793,46 +793,46 @@  discard block
 block discarded – undo
793 793
  **/
794 794
 function balise_INTRODUCTION_dist($p) {
795 795
 
796
-	$type_objet = $p->type_requete;
797
-	$cle_objet = id_table_objet($type_objet);
798
-	$_id_objet = champ_sql($cle_objet, $p);
799
-
800
-	// Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
801
-	// ainsi que le longueur d'introduction donnée dans la description de l'objet.
802
-	$_introduction_longueur = 'null';
803
-	$_ligne = 'array(';
804
-	$trouver_table = charger_fonction('trouver_table', 'base');
805
-	if ($desc = $trouver_table(table_objet_sql($type_objet))) {
806
-		if (isset($desc['field']['descriptif'])) {
807
-			$_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
808
-		}
809
-		if (isset($desc['field']['texte'])) {
810
-			$_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
811
-		}
812
-		if (isset($desc['field']['chapo'])) {
813
-			$_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
814
-		}
815
-		if (isset($desc['introduction_longueur'])) {
816
-			$_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
817
-		}
818
-	}
819
-	$_ligne .= ')';
820
-
821
-	// Récupérer la longueur et la suite passés en paramètres
822
-	$_longueur_ou_suite = 'null';
823
-	if (($v1 = interprete_argument_balise(1, $p)) !== null) {
824
-		$_longueur_ou_suite = $v1;
825
-	}
826
-	$_suite = 'null';
827
-	if (($v2 = interprete_argument_balise(2, $p)) !== null) {
828
-		$_suite = $v2;
829
-	}
830
-
831
-	$p->code = "generer_objet_introduction($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
832
-
833
-	#$p->interdire_scripts = true;
834
-	$p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
835
-	return $p;
796
+    $type_objet = $p->type_requete;
797
+    $cle_objet = id_table_objet($type_objet);
798
+    $_id_objet = champ_sql($cle_objet, $p);
799
+
800
+    // Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
801
+    // ainsi que le longueur d'introduction donnée dans la description de l'objet.
802
+    $_introduction_longueur = 'null';
803
+    $_ligne = 'array(';
804
+    $trouver_table = charger_fonction('trouver_table', 'base');
805
+    if ($desc = $trouver_table(table_objet_sql($type_objet))) {
806
+        if (isset($desc['field']['descriptif'])) {
807
+            $_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
808
+        }
809
+        if (isset($desc['field']['texte'])) {
810
+            $_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
811
+        }
812
+        if (isset($desc['field']['chapo'])) {
813
+            $_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
814
+        }
815
+        if (isset($desc['introduction_longueur'])) {
816
+            $_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
817
+        }
818
+    }
819
+    $_ligne .= ')';
820
+
821
+    // Récupérer la longueur et la suite passés en paramètres
822
+    $_longueur_ou_suite = 'null';
823
+    if (($v1 = interprete_argument_balise(1, $p)) !== null) {
824
+        $_longueur_ou_suite = $v1;
825
+    }
826
+    $_suite = 'null';
827
+    if (($v2 = interprete_argument_balise(2, $p)) !== null) {
828
+        $_suite = $v2;
829
+    }
830
+
831
+    $p->code = "generer_objet_introduction($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
832
+
833
+    #$p->interdire_scripts = true;
834
+    $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
835
+    return $p;
836 836
 }
837 837
 
838 838
 
@@ -852,15 +852,15 @@  discard block
 block discarded – undo
852 852
  *     Pile complétée par le code à générer
853 853
  **/
854 854
 function balise_LANG_dist($p) {
855
-	$_lang = champ_sql('lang', $p);
856
-	if (!$p->etoile) {
857
-		$p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
858
-	} else {
859
-		$p->code = "spip_htmlentities($_lang)";
860
-	}
861
-	$p->interdire_scripts = false;
855
+    $_lang = champ_sql('lang', $p);
856
+    if (!$p->etoile) {
857
+        $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
858
+    } else {
859
+        $p->code = "spip_htmlentities($_lang)";
860
+    }
861
+    $p->interdire_scripts = false;
862 862
 
863
-	return $p;
863
+    return $p;
864 864
 }
865 865
 
866 866
 /**
@@ -882,45 +882,45 @@  discard block
 block discarded – undo
882 882
  *     Pile complétée par le code à générer
883 883
  */
884 884
 function balise_LESAUTEURS_dist($p) {
885
-	// Cherche le champ 'lesauteurs' dans la pile
886
-	$_lesauteurs = champ_sql('lesauteurs', $p, '');
887
-
888
-	// Si le champ n'existe pas (cas de spip_articles), on applique
889
-	// le modele lesauteurs.html en passant id_article dans le contexte;
890
-	// dans le cas contraire on prend le champ 'lesauteurs'
891
-	// (cf extension sites/)
892
-	if ($_lesauteurs) {
893
-		$p->code = "safehtml($_lesauteurs)";
894
-		// $p->interdire_scripts = true;
895
-	} else {
896
-		if (!$p->id_boucle) {
897
-			$connect = '';
898
-			$objet = 'article';
899
-			$id_table_objet = 'id_article';
900
-		} else {
901
-			$b = $p->nom_boucle ?: $p->id_boucle;
902
-			$connect = $p->boucles[$b]->sql_serveur;
903
-			$type_boucle = $p->boucles[$b]->type_requete;
904
-			$objet = objet_type($type_boucle);
905
-			$id_table_objet = id_table_objet($type_boucle);
906
-		}
907
-		$c = memoriser_contexte_compil($p);
908
-
909
-		$p->code = sprintf(
910
-			CODE_RECUPERER_FOND,
911
-			"'modeles/lesauteurs'",
912
-			"array('objet'=>'" . $objet .
913
-			"','id_objet' => " . champ_sql($id_table_objet, $p) .
914
-			",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
915
-			($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
916
-			')',
917
-			"'trim'=>true, 'compil'=>array($c)",
918
-			_q($connect)
919
-		);
920
-		$p->interdire_scripts = false; // securite apposee par recuperer_fond()
921
-	}
922
-
923
-	return $p;
885
+    // Cherche le champ 'lesauteurs' dans la pile
886
+    $_lesauteurs = champ_sql('lesauteurs', $p, '');
887
+
888
+    // Si le champ n'existe pas (cas de spip_articles), on applique
889
+    // le modele lesauteurs.html en passant id_article dans le contexte;
890
+    // dans le cas contraire on prend le champ 'lesauteurs'
891
+    // (cf extension sites/)
892
+    if ($_lesauteurs) {
893
+        $p->code = "safehtml($_lesauteurs)";
894
+        // $p->interdire_scripts = true;
895
+    } else {
896
+        if (!$p->id_boucle) {
897
+            $connect = '';
898
+            $objet = 'article';
899
+            $id_table_objet = 'id_article';
900
+        } else {
901
+            $b = $p->nom_boucle ?: $p->id_boucle;
902
+            $connect = $p->boucles[$b]->sql_serveur;
903
+            $type_boucle = $p->boucles[$b]->type_requete;
904
+            $objet = objet_type($type_boucle);
905
+            $id_table_objet = id_table_objet($type_boucle);
906
+        }
907
+        $c = memoriser_contexte_compil($p);
908
+
909
+        $p->code = sprintf(
910
+            CODE_RECUPERER_FOND,
911
+            "'modeles/lesauteurs'",
912
+            "array('objet'=>'" . $objet .
913
+            "','id_objet' => " . champ_sql($id_table_objet, $p) .
914
+            ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
915
+            ($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
916
+            ')',
917
+            "'trim'=>true, 'compil'=>array($c)",
918
+            _q($connect)
919
+        );
920
+        $p->interdire_scripts = false; // securite apposee par recuperer_fond()
921
+    }
922
+
923
+    return $p;
924 924
 }
925 925
 
926 926
 
@@ -947,76 +947,76 @@  discard block
 block discarded – undo
947 947
  *     Pile complétée par le code à générer
948 948
  */
949 949
 function balise_RANG_dist($p) {
950
-	$b = index_boucle($p);
951
-	if ($b === '') {
952
-		$msg = [
953
-			'zbug_champ_hors_boucle',
954
-			['champ' => '#RANG']
955
-		];
956
-		erreur_squelette($msg, $p);
957
-	} else {
958
-		// chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
959
-		// dans la boucle immediatement englobante uniquement
960
-		// sinon on compose le champ calcule
961
-		$_rang = champ_sql('rang', $p, '', false);
962
-
963
-		// si pas trouve de champ sql rang :
964
-		if (!$_rang or $_rang == "''") {
965
-			$boucle = &$p->boucles[$b];
966
-
967
-			// on gere le cas ou #RANG est une extraction du numero dans le titre
968
-			$trouver_table = charger_fonction('trouver_table', 'base');
969
-			$desc = $trouver_table($boucle->id_table);
970
-			$_titre = ''; # où extraire le numero ?
971
-
972
-			if (isset($desc['titre'])) {
973
-				$t = $desc['titre'];
974
-				if (
975
-					// Soit on trouve avec la déclaration de la lang AVANT
976
-					preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
977
-					// Soit on prend depuis le début
978
-					or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
979
-				) {
980
-					$m = preg_replace(',as\s+titre$,i', '', $m[1]);
981
-					$m = trim($m);
982
-					if ($m != "''") {
983
-						if (!preg_match(',\W,', $m)) {
984
-							$m = $boucle->id_table . ".$m";
985
-						}
986
-
987
-						$m .= ' AS titre_rang';
988
-
989
-						$boucle->select[] = $m;
990
-						$_titre = '$Pile[$SP][\'titre_rang\']';
991
-					}
992
-				}
993
-			}
994
-
995
-			// si on n'a rien trouvé, on utilise le champ titre classique
996
-			if (!$_titre) {
997
-				$_titre = champ_sql('titre', $p);
998
-			}
999
-
1000
-			// et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1001
-			// cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1002
-			$type_boucle = $boucle->type_requete;
1003
-			$objet = objet_type($type_boucle);
1004
-			$id_table_objet = id_table_objet($type_boucle);
1005
-			$_primary = champ_sql($id_table_objet, $p, '', false);
1006
-			$_env = '$Pile[0]';
1007
-
1008
-			if (!$_titre) {$_titre = "''";
1009
-			}
1010
-			if (!$_primary) {$_primary = "''";
1011
-			}
1012
-			$_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1013
-		}
1014
-
1015
-		$p->code = $_rang;
1016
-		$p->interdire_scripts = false;
1017
-	}
1018
-
1019
-	return $p;
950
+    $b = index_boucle($p);
951
+    if ($b === '') {
952
+        $msg = [
953
+            'zbug_champ_hors_boucle',
954
+            ['champ' => '#RANG']
955
+        ];
956
+        erreur_squelette($msg, $p);
957
+    } else {
958
+        // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
959
+        // dans la boucle immediatement englobante uniquement
960
+        // sinon on compose le champ calcule
961
+        $_rang = champ_sql('rang', $p, '', false);
962
+
963
+        // si pas trouve de champ sql rang :
964
+        if (!$_rang or $_rang == "''") {
965
+            $boucle = &$p->boucles[$b];
966
+
967
+            // on gere le cas ou #RANG est une extraction du numero dans le titre
968
+            $trouver_table = charger_fonction('trouver_table', 'base');
969
+            $desc = $trouver_table($boucle->id_table);
970
+            $_titre = ''; # où extraire le numero ?
971
+
972
+            if (isset($desc['titre'])) {
973
+                $t = $desc['titre'];
974
+                if (
975
+                    // Soit on trouve avec la déclaration de la lang AVANT
976
+                    preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
977
+                    // Soit on prend depuis le début
978
+                    or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
979
+                ) {
980
+                    $m = preg_replace(',as\s+titre$,i', '', $m[1]);
981
+                    $m = trim($m);
982
+                    if ($m != "''") {
983
+                        if (!preg_match(',\W,', $m)) {
984
+                            $m = $boucle->id_table . ".$m";
985
+                        }
986
+
987
+                        $m .= ' AS titre_rang';
988
+
989
+                        $boucle->select[] = $m;
990
+                        $_titre = '$Pile[$SP][\'titre_rang\']';
991
+                    }
992
+                }
993
+            }
994
+
995
+            // si on n'a rien trouvé, on utilise le champ titre classique
996
+            if (!$_titre) {
997
+                $_titre = champ_sql('titre', $p);
998
+            }
999
+
1000
+            // et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1001
+            // cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1002
+            $type_boucle = $boucle->type_requete;
1003
+            $objet = objet_type($type_boucle);
1004
+            $id_table_objet = id_table_objet($type_boucle);
1005
+            $_primary = champ_sql($id_table_objet, $p, '', false);
1006
+            $_env = '$Pile[0]';
1007
+
1008
+            if (!$_titre) {$_titre = "''";
1009
+            }
1010
+            if (!$_primary) {$_primary = "''";
1011
+            }
1012
+            $_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1013
+        }
1014
+
1015
+        $p->code = $_rang;
1016
+        $p->interdire_scripts = false;
1017
+    }
1018
+
1019
+    return $p;
1020 1020
 }
1021 1021
 
1022 1022
 
@@ -1038,12 +1038,12 @@  discard block
 block discarded – undo
1038 1038
  *     Pile complétée par le code à générer
1039 1039
  **/
1040 1040
 function balise_POPULARITE_dist($p) {
1041
-	$_popularite = champ_sql('popularite', $p);
1042
-	$p->code = "(ceil(min(100, 100 * $_popularite
1041
+    $_popularite = champ_sql('popularite', $p);
1042
+    $p->code = "(ceil(min(100, 100 * $_popularite
1043 1043
 	/ max(1 , 0 + \$GLOBALS['meta']['popularite_max']))))";
1044
-	$p->interdire_scripts = false;
1044
+    $p->interdire_scripts = false;
1045 1045
 
1046
-	return $p;
1046
+    return $p;
1047 1047
 }
1048 1048
 
1049 1049
 /**
@@ -1054,8 +1054,8 @@  discard block
 block discarded – undo
1054 1054
  * l'absence peut-être due à une faute de frappe dans le contexte inclus.
1055 1055
  */
1056 1056
 define(
1057
-	'CODE_PAGINATION',
1058
-	'%s($Numrows["%s"]["grand_total"],
1057
+    'CODE_PAGINATION',
1058
+    '%s($Numrows["%s"]["grand_total"],
1059 1059
  		%s,
1060 1060
 		isset($Pile[0][%4$s])?$Pile[0][%4$s]:intval(_request(%4$s)),
1061 1061
 		%5$s, %6$s, %7$s, %8$s, array(%9$s))'
@@ -1092,75 +1092,75 @@  discard block
 block discarded – undo
1092 1092
  *     Pile complétée par le code à générer
1093 1093
  */
1094 1094
 function balise_PAGINATION_dist($p, $liste = 'true') {
1095
-	$b = index_boucle_mere($p);
1096
-
1097
-	// s'il n'y a pas de nom de boucle, on ne peut pas paginer
1098
-	if ($b === '') {
1099
-		$msg = [
1100
-			'zbug_champ_hors_boucle',
1101
-			['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1102
-		];
1103
-		erreur_squelette($msg, $p);
1104
-
1105
-		return $p;
1106
-	}
1107
-
1108
-	// s'il n'y a pas de mode_partie, c'est qu'on se trouve
1109
-	// dans un boucle recursive ou qu'on a oublie le critere {pagination}
1110
-	if (!$p->boucles[$b]->mode_partie) {
1111
-		if (!$p->boucles[$b]->table_optionnelle) {
1112
-			$msg = [
1113
-				'zbug_pagination_sans_critere',
1114
-				['champ' => '#PAGINATION']
1115
-			];
1116
-			erreur_squelette($msg, $p);
1117
-		}
1118
-
1119
-		return $p;
1120
-	}
1121
-
1122
-	// a priori true
1123
-	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1124
-	// si true, les arguments simples (sans truc=chose) vont degager
1125
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1126
-	if (is_countable($_contexte) ? count($_contexte) : 0) {
1127
-		$key = key($_contexte);
1128
-		if (is_numeric($key)) {
1129
-			array_shift($_contexte);
1130
-			$__modele = interprete_argument_balise(1, $p);
1131
-		}
1132
-	}
1133
-
1134
-	if (is_countable($_contexte) ? count($_contexte) : 0) {
1135
-		$code_contexte = implode(',', $_contexte);
1136
-	} else {
1137
-		$code_contexte = '';
1138
-	}
1139
-
1140
-	$connect = $p->boucles[$b]->sql_serveur;
1141
-	$pas = $p->boucles[$b]->total_parties;
1142
-	$f_pagination = chercher_filtre('pagination');
1143
-	$type = $p->boucles[$b]->modificateur['debut_nom'];
1144
-	$modif = ($type[0] !== "'") ? "'debut'.$type"
1145
-		: ("'debut" . substr($type, 1));
1146
-
1147
-	$p->code = sprintf(
1148
-		CODE_PAGINATION,
1149
-		$f_pagination,
1150
-		$b,
1151
-		$type,
1152
-		$modif,
1153
-		$pas,
1154
-		$liste,
1155
-		((isset($__modele) and $__modele) ? $__modele : "''"),
1156
-		_q($connect),
1157
-		$code_contexte
1158
-	);
1159
-
1160
-	$p->boucles[$b]->numrows = true;
1161
-	$p->interdire_scripts = false;
1162
-
1163
-	return $p;
1095
+    $b = index_boucle_mere($p);
1096
+
1097
+    // s'il n'y a pas de nom de boucle, on ne peut pas paginer
1098
+    if ($b === '') {
1099
+        $msg = [
1100
+            'zbug_champ_hors_boucle',
1101
+            ['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1102
+        ];
1103
+        erreur_squelette($msg, $p);
1104
+
1105
+        return $p;
1106
+    }
1107
+
1108
+    // s'il n'y a pas de mode_partie, c'est qu'on se trouve
1109
+    // dans un boucle recursive ou qu'on a oublie le critere {pagination}
1110
+    if (!$p->boucles[$b]->mode_partie) {
1111
+        if (!$p->boucles[$b]->table_optionnelle) {
1112
+            $msg = [
1113
+                'zbug_pagination_sans_critere',
1114
+                ['champ' => '#PAGINATION']
1115
+            ];
1116
+            erreur_squelette($msg, $p);
1117
+        }
1118
+
1119
+        return $p;
1120
+    }
1121
+
1122
+    // a priori true
1123
+    // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1124
+    // si true, les arguments simples (sans truc=chose) vont degager
1125
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1126
+    if (is_countable($_contexte) ? count($_contexte) : 0) {
1127
+        $key = key($_contexte);
1128
+        if (is_numeric($key)) {
1129
+            array_shift($_contexte);
1130
+            $__modele = interprete_argument_balise(1, $p);
1131
+        }
1132
+    }
1133
+
1134
+    if (is_countable($_contexte) ? count($_contexte) : 0) {
1135
+        $code_contexte = implode(',', $_contexte);
1136
+    } else {
1137
+        $code_contexte = '';
1138
+    }
1139
+
1140
+    $connect = $p->boucles[$b]->sql_serveur;
1141
+    $pas = $p->boucles[$b]->total_parties;
1142
+    $f_pagination = chercher_filtre('pagination');
1143
+    $type = $p->boucles[$b]->modificateur['debut_nom'];
1144
+    $modif = ($type[0] !== "'") ? "'debut'.$type"
1145
+        : ("'debut" . substr($type, 1));
1146
+
1147
+    $p->code = sprintf(
1148
+        CODE_PAGINATION,
1149
+        $f_pagination,
1150
+        $b,
1151
+        $type,
1152
+        $modif,
1153
+        $pas,
1154
+        $liste,
1155
+        ((isset($__modele) and $__modele) ? $__modele : "''"),
1156
+        _q($connect),
1157
+        $code_contexte
1158
+    );
1159
+
1160
+    $p->boucles[$b]->numrows = true;
1161
+    $p->interdire_scripts = false;
1162
+
1163
+    return $p;
1164 1164
 }
1165 1165
 
1166 1166
 
@@ -1187,11 +1187,11 @@  discard block
 block discarded – undo
1187 1187
  *     Pile complétée par le code à générer
1188 1188
  **/
1189 1189
 function balise_ANCRE_PAGINATION_dist($p) {
1190
-	if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1191
-		return $f($p, $liste = 'false');
1192
-	} else {
1193
-		return null;
1194
-	} // ou une erreur ?
1190
+    if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1191
+        return $f($p, $liste = 'false');
1192
+    } else {
1193
+        return null;
1194
+    } // ou une erreur ?
1195 1195
 }
1196 1196
 
1197 1197
 
@@ -1212,17 +1212,17 @@  discard block
 block discarded – undo
1212 1212
  *     Pile complétée par le code à générer
1213 1213
  **/
1214 1214
 function balise_GRAND_TOTAL_dist($p) {
1215
-	$b = index_boucle_mere($p);
1216
-	if ($b === '') {
1217
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1218
-		erreur_squelette($msg, $p);
1219
-	} else {
1220
-		$p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)";
1221
-		$p->boucles[$b]->numrows = true;
1222
-		$p->interdire_scripts = false;
1223
-	}
1215
+    $b = index_boucle_mere($p);
1216
+    if ($b === '') {
1217
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1218
+        erreur_squelette($msg, $p);
1219
+    } else {
1220
+        $p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)";
1221
+        $p->boucles[$b]->numrows = true;
1222
+        $p->interdire_scripts = false;
1223
+    }
1224 1224
 
1225
-	return $p;
1225
+    return $p;
1226 1226
 }
1227 1227
 
1228 1228
 
@@ -1250,10 +1250,10 @@  discard block
 block discarded – undo
1250 1250
  *     Pile complétée par le code à générer
1251 1251
  **/
1252 1252
 function balise_SELF_dist($p) {
1253
-	$p->code = 'self()';
1254
-	$p->interdire_scripts = false;
1253
+    $p->code = 'self()';
1254
+    $p->interdire_scripts = false;
1255 1255
 
1256
-	return $p;
1256
+    return $p;
1257 1257
 }
1258 1258
 
1259 1259
 
@@ -1280,17 +1280,17 @@  discard block
 block discarded – undo
1280 1280
  *     Pile complétée par le code à générer
1281 1281
  **/
1282 1282
 function balise_CHEMIN_dist($p) {
1283
-	$arg = interprete_argument_balise(1, $p);
1284
-	if (!$arg) {
1285
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1286
-		erreur_squelette($msg, $p);
1287
-	} else {
1288
-		$p->code = 'find_in_path((string)' . $arg . ')';
1289
-	}
1283
+    $arg = interprete_argument_balise(1, $p);
1284
+    if (!$arg) {
1285
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1286
+        erreur_squelette($msg, $p);
1287
+    } else {
1288
+        $p->code = 'find_in_path((string)' . $arg . ')';
1289
+    }
1290 1290
 
1291
-	$p->interdire_scripts = false;
1291
+    $p->interdire_scripts = false;
1292 1292
 
1293
-	return $p;
1293
+    return $p;
1294 1294
 }
1295 1295
 
1296 1296
 /**
@@ -1315,16 +1315,16 @@  discard block
 block discarded – undo
1315 1315
  *     Pile complétée par le code à générer
1316 1316
  **/
1317 1317
 function balise_CHEMIN_IMAGE_dist($p) {
1318
-	$arg = interprete_argument_balise(1, $p);
1319
-	if (!$arg) {
1320
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1321
-		erreur_squelette($msg, $p);
1322
-	} else {
1323
-		$p->code = 'chemin_image((string)' . $arg . ')';
1324
-	}
1318
+    $arg = interprete_argument_balise(1, $p);
1319
+    if (!$arg) {
1320
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1321
+        erreur_squelette($msg, $p);
1322
+    } else {
1323
+        $p->code = 'chemin_image((string)' . $arg . ')';
1324
+    }
1325 1325
 
1326
-	$p->interdire_scripts = false;
1327
-	return $p;
1326
+    $p->interdire_scripts = false;
1327
+    return $p;
1328 1328
 }
1329 1329
 
1330 1330
 
@@ -1362,36 +1362,36 @@  discard block
 block discarded – undo
1362 1362
  **/
1363 1363
 function balise_ENV_dist($p, $src = null) {
1364 1364
 
1365
-	// cle du tableau desiree
1366
-	$_nom = interprete_argument_balise(1, $p);
1367
-	// valeur par defaut
1368
-	$_sinon = interprete_argument_balise(2, $p);
1365
+    // cle du tableau desiree
1366
+    $_nom = interprete_argument_balise(1, $p);
1367
+    // valeur par defaut
1368
+    $_sinon = interprete_argument_balise(2, $p);
1369 1369
 
1370
-	// $src est un tableau de donnees sources eventuellement transmis
1371
-	// en absence, on utilise l'environnement du squelette $Pile[0]
1370
+    // $src est un tableau de donnees sources eventuellement transmis
1371
+    // en absence, on utilise l'environnement du squelette $Pile[0]
1372 1372
 
1373
-	if (!$_nom) {
1374
-		// cas de #ENV sans argument : on retourne le serialize() du tableau
1375
-		// une belle fonction [(#ENV|affiche_env)] serait pratique
1376
-		if ($src) {
1377
-			$p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1378
-		} else {
1379
-			$p->code = 'serialize($Pile[0]??[])';
1380
-		}
1381
-	} else {
1382
-		if (!$src) {
1383
-			$src = '$Pile[0]??[]';
1384
-		}
1385
-		if ($_sinon) {
1386
-			$p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1387
-		} else {
1388
-			$p->code = "table_valeur($src, (string)$_nom, null)";
1389
-		}
1390
-	}
1373
+    if (!$_nom) {
1374
+        // cas de #ENV sans argument : on retourne le serialize() du tableau
1375
+        // une belle fonction [(#ENV|affiche_env)] serait pratique
1376
+        if ($src) {
1377
+            $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1378
+        } else {
1379
+            $p->code = 'serialize($Pile[0]??[])';
1380
+        }
1381
+    } else {
1382
+        if (!$src) {
1383
+            $src = '$Pile[0]??[]';
1384
+        }
1385
+        if ($_sinon) {
1386
+            $p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1387
+        } else {
1388
+            $p->code = "table_valeur($src, (string)$_nom, null)";
1389
+        }
1390
+    }
1391 1391
 
1392
-	#$p->interdire_scripts = true;
1392
+    #$p->interdire_scripts = true;
1393 1393
 
1394
-	return $p;
1394
+    return $p;
1395 1395
 }
1396 1396
 
1397 1397
 /**
@@ -1421,16 +1421,16 @@  discard block
 block discarded – undo
1421 1421
  *     Pile completée du code PHP d'exécution de la balise
1422 1422
  */
1423 1423
 function balise_CONFIG_dist($p) {
1424
-	if (!$arg = interprete_argument_balise(1, $p)) {
1425
-		$arg = "''";
1426
-	}
1427
-	$_sinon = interprete_argument_balise(2, $p);
1428
-	$_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1424
+    if (!$arg = interprete_argument_balise(1, $p)) {
1425
+        $arg = "''";
1426
+    }
1427
+    $_sinon = interprete_argument_balise(2, $p);
1428
+    $_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1429 1429
 
1430
-	$p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1431
-		($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1430
+    $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1431
+        ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1432 1432
 
1433
-	return $p;
1433
+    return $p;
1434 1434
 }
1435 1435
 
1436 1436
 
@@ -1453,10 +1453,10 @@  discard block
 block discarded – undo
1453 1453
  *     Pile completée du code PHP d'exécution de la balise
1454 1454
  */
1455 1455
 function balise_CONNECT_dist($p) {
1456
-	$p->code = '($connect ? $connect : NULL)';
1457
-	$p->interdire_scripts = false;
1456
+    $p->code = '($connect ? $connect : NULL)';
1457
+    $p->interdire_scripts = false;
1458 1458
 
1459
-	return $p;
1459
+    return $p;
1460 1460
 }
1461 1461
 
1462 1462
 
@@ -1484,15 +1484,15 @@  discard block
 block discarded – undo
1484 1484
  *     Pile completée du code PHP d'exécution de la balise
1485 1485
  **/
1486 1486
 function balise_SESSION_dist($p) {
1487
-	$p->descr['session'] = true;
1487
+    $p->descr['session'] = true;
1488 1488
 
1489
-	$f = function_exists('balise_ENV')
1490
-		? 'balise_ENV'
1491
-		: 'balise_ENV_dist';
1489
+    $f = function_exists('balise_ENV')
1490
+        ? 'balise_ENV'
1491
+        : 'balise_ENV_dist';
1492 1492
 
1493
-	$p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1493
+    $p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1494 1494
 
1495
-	return $p;
1495
+    return $p;
1496 1496
 }
1497 1497
 
1498 1498
 
@@ -1515,18 +1515,18 @@  discard block
 block discarded – undo
1515 1515
  *     Pile completée du code PHP d'exécution de la balise
1516 1516
  **/
1517 1517
 function balise_SESSION_SET_dist($p) {
1518
-	$_nom = interprete_argument_balise(1, $p);
1519
-	$_val = interprete_argument_balise(2, $p);
1520
-	if (!$_nom or !$_val) {
1521
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1522
-		erreur_squelette($err_b_s_a, $p);
1523
-	} else {
1524
-		$p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1525
-	}
1518
+    $_nom = interprete_argument_balise(1, $p);
1519
+    $_val = interprete_argument_balise(2, $p);
1520
+    if (!$_nom or !$_val) {
1521
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1522
+        erreur_squelette($err_b_s_a, $p);
1523
+    } else {
1524
+        $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1525
+    }
1526 1526
 
1527
-	$p->interdire_scripts = false;
1527
+    $p->interdire_scripts = false;
1528 1528
 
1529
-	return $p;
1529
+    return $p;
1530 1530
 }
1531 1531
 
1532 1532
 
@@ -1557,30 +1557,30 @@  discard block
 block discarded – undo
1557 1557
  *     Pile completée du code PHP d'exécution de la balise
1558 1558
  **/
1559 1559
 function balise_EVAL_dist($p) {
1560
-	$php = interprete_argument_balise(1, $p);
1561
-	if ($php) {
1562
-		# optimisation sur les #EVAL{une expression sans #BALISE}
1563
-		# attention au commentaire "// x signes" qui precede
1564
-		if (
1565
-			preg_match(
1566
-				",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1567
-				$php,
1568
-				$r
1569
-			)
1570
-		) {
1571
-			$p->code = /* $r[1]. */
1572
-				'(' . $r[2] . ')';
1573
-		} else {
1574
-			$p->code = "eval('return '.$php.';')";
1575
-		}
1576
-	} else {
1577
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1578
-		erreur_squelette($msg, $p);
1579
-	}
1580
-
1581
-	#$p->interdire_scripts = true;
1582
-
1583
-	return $p;
1560
+    $php = interprete_argument_balise(1, $p);
1561
+    if ($php) {
1562
+        # optimisation sur les #EVAL{une expression sans #BALISE}
1563
+        # attention au commentaire "// x signes" qui precede
1564
+        if (
1565
+            preg_match(
1566
+                ",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1567
+                $php,
1568
+                $r
1569
+            )
1570
+        ) {
1571
+            $p->code = /* $r[1]. */
1572
+                '(' . $r[2] . ')';
1573
+        } else {
1574
+            $p->code = "eval('return '.$php.';')";
1575
+        }
1576
+    } else {
1577
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1578
+        erreur_squelette($msg, $p);
1579
+    }
1580
+
1581
+    #$p->interdire_scripts = true;
1582
+
1583
+    return $p;
1584 1584
 }
1585 1585
 
1586 1586
 
@@ -1610,19 +1610,19 @@  discard block
 block discarded – undo
1610 1610
  **/
1611 1611
 function balise_CHAMP_SQL_dist($p) {
1612 1612
 
1613
-	if (
1614
-		$p->param
1615
-		and isset($p->param[0][1][0])
1616
-		and $champ = ($p->param[0][1][0]->texte)
1617
-	) {
1618
-		$p->code = champ_sql($champ, $p);
1619
-	} else {
1620
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1621
-		erreur_squelette($err_b_s_a, $p);
1622
-	}
1613
+    if (
1614
+        $p->param
1615
+        and isset($p->param[0][1][0])
1616
+        and $champ = ($p->param[0][1][0]->texte)
1617
+    ) {
1618
+        $p->code = champ_sql($champ, $p);
1619
+    } else {
1620
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1621
+        erreur_squelette($err_b_s_a, $p);
1622
+    }
1623 1623
 
1624
-	#$p->interdire_scripts = true;
1625
-	return $p;
1624
+    #$p->interdire_scripts = true;
1625
+    return $p;
1626 1626
 }
1627 1627
 
1628 1628
 /**
@@ -1648,13 +1648,13 @@  discard block
 block discarded – undo
1648 1648
  *     Pile complétée par le code à générer
1649 1649
  **/
1650 1650
 function balise_VAL_dist($p) {
1651
-	$p->code = interprete_argument_balise(1, $p);
1652
-	if ($p->code === null || !strlen($p->code)) {
1653
-		$p->code = "''";
1654
-	}
1655
-	$p->interdire_scripts = false;
1651
+    $p->code = interprete_argument_balise(1, $p);
1652
+    if ($p->code === null || !strlen($p->code)) {
1653
+        $p->code = "''";
1654
+    }
1655
+    $p->interdire_scripts = false;
1656 1656
 
1657
-	return $p;
1657
+    return $p;
1658 1658
 }
1659 1659
 
1660 1660
 /**
@@ -1683,10 +1683,10 @@  discard block
 block discarded – undo
1683 1683
  *     Pile complétée par le code à générer
1684 1684
  **/
1685 1685
 function balise_REM_dist($p) {
1686
-	$p->code = "''";
1687
-	$p->interdire_scripts = false;
1686
+    $p->code = "''";
1687
+    $p->interdire_scripts = false;
1688 1688
 
1689
-	return $p;
1689
+    return $p;
1690 1690
 }
1691 1691
 
1692 1692
 /**
@@ -1696,10 +1696,10 @@  discard block
 block discarded – undo
1696 1696
  * @return mixed
1697 1697
  */
1698 1698
 function balise_NULL_dist($p) {
1699
-	$p->code = 'null';
1700
-	$p->interdire_scripts = false;
1699
+    $p->code = 'null';
1700
+    $p->interdire_scripts = false;
1701 1701
 
1702
-	return $p;
1702
+    return $p;
1703 1703
 }
1704 1704
 
1705 1705
 
@@ -1723,18 +1723,18 @@  discard block
 block discarded – undo
1723 1723
  **/
1724 1724
 function balise_HTTP_HEADER_dist($p) {
1725 1725
 
1726
-	$header = interprete_argument_balise(1, $p);
1727
-	if (!$header) {
1728
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1729
-		erreur_squelette($err_b_s_a, $p);
1730
-	} else {
1731
-		$p->code = "'<'.'?php header(' . _q("
1732
-			. $header
1733
-			. ") . '); ?'.'>'";
1734
-	}
1735
-	$p->interdire_scripts = false;
1726
+    $header = interprete_argument_balise(1, $p);
1727
+    if (!$header) {
1728
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1729
+        erreur_squelette($err_b_s_a, $p);
1730
+    } else {
1731
+        $p->code = "'<'.'?php header(' . _q("
1732
+            . $header
1733
+            . ") . '); ?'.'>'";
1734
+    }
1735
+    $p->interdire_scripts = false;
1736 1736
 
1737
-	return $p;
1737
+    return $p;
1738 1738
 }
1739 1739
 
1740 1740
 
@@ -1759,20 +1759,20 @@  discard block
 block discarded – undo
1759 1759
  *     Pile complétée par le code à générer
1760 1760
  **/
1761 1761
 function balise_FILTRE_dist($p) {
1762
-	if ($p->param) {
1763
-		$args = [];
1764
-		foreach ($p->param as $i => $ignore) {
1765
-			$args[] = interprete_argument_balise($i + 1, $p);
1766
-		}
1767
-		$p->code = "'<' . '"
1768
-			. '?php header("X-Spip-Filtre: \'.'
1769
-			. join('.\'|\'.', $args)
1770
-			. " . '\"); ?'.'>'";
1762
+    if ($p->param) {
1763
+        $args = [];
1764
+        foreach ($p->param as $i => $ignore) {
1765
+            $args[] = interprete_argument_balise($i + 1, $p);
1766
+        }
1767
+        $p->code = "'<' . '"
1768
+            . '?php header("X-Spip-Filtre: \'.'
1769
+            . join('.\'|\'.', $args)
1770
+            . " . '\"); ?'.'>'";
1771 1771
 
1772
-		$p->interdire_scripts = false;
1772
+        $p->interdire_scripts = false;
1773 1773
 
1774
-		return $p;
1775
-	}
1774
+        return $p;
1775
+    }
1776 1776
 }
1777 1777
 
1778 1778
 
@@ -1808,55 +1808,55 @@  discard block
 block discarded – undo
1808 1808
  **/
1809 1809
 function balise_CACHE_dist($p) {
1810 1810
 
1811
-	if ($p->param) {
1812
-		$duree = valeur_numerique($p->param[0][1][0]->texte);
1813
-
1814
-		// noter la duree du cache dans un entete proprietaire
1815
-
1816
-		$code = "'<'.'" . '?php header("X-Spip-Cache: '
1817
-			. $duree
1818
-			. '"); ?' . "'.'>'";
1819
-
1820
-		// Remplir le header Cache-Control
1821
-		// cas #CACHE{0}
1822
-		if ($duree == 0) {
1823
-			$code .= ".'<'.'"
1824
-				. '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1825
-				. "'.'><'.'"
1826
-				. '?php header("Pragma: no-cache"); ?'
1827
-				. "'.'>'";
1828
-		}
1829
-
1830
-		// recuperer les parametres suivants
1831
-		$i = 1;
1832
-		while (isset($p->param[0][++$i])) {
1833
-			$pa = ($p->param[0][$i][0]->texte);
1834
-
1835
-			if (
1836
-				$pa == 'cache-client'
1837
-				and $duree > 0
1838
-			) {
1839
-				$code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1840
-					. $duree
1841
-					. '"); ?' . "'.'>'";
1842
-				// il semble logique, si on cache-client, de ne pas invalider
1843
-				$pa = 'statique';
1844
-			}
1845
-
1846
-			if (
1847
-				$pa == 'statique'
1848
-				and $duree > 0
1849
-			) {
1850
-				$code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1851
-			}
1852
-		}
1853
-	} else {
1854
-		$code = "''";
1855
-	}
1856
-	$p->code = $code;
1857
-	$p->interdire_scripts = false;
1858
-
1859
-	return $p;
1811
+    if ($p->param) {
1812
+        $duree = valeur_numerique($p->param[0][1][0]->texte);
1813
+
1814
+        // noter la duree du cache dans un entete proprietaire
1815
+
1816
+        $code = "'<'.'" . '?php header("X-Spip-Cache: '
1817
+            . $duree
1818
+            . '"); ?' . "'.'>'";
1819
+
1820
+        // Remplir le header Cache-Control
1821
+        // cas #CACHE{0}
1822
+        if ($duree == 0) {
1823
+            $code .= ".'<'.'"
1824
+                . '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1825
+                . "'.'><'.'"
1826
+                . '?php header("Pragma: no-cache"); ?'
1827
+                . "'.'>'";
1828
+        }
1829
+
1830
+        // recuperer les parametres suivants
1831
+        $i = 1;
1832
+        while (isset($p->param[0][++$i])) {
1833
+            $pa = ($p->param[0][$i][0]->texte);
1834
+
1835
+            if (
1836
+                $pa == 'cache-client'
1837
+                and $duree > 0
1838
+            ) {
1839
+                $code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1840
+                    . $duree
1841
+                    . '"); ?' . "'.'>'";
1842
+                // il semble logique, si on cache-client, de ne pas invalider
1843
+                $pa = 'statique';
1844
+            }
1845
+
1846
+            if (
1847
+                $pa == 'statique'
1848
+                and $duree > 0
1849
+            ) {
1850
+                $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1851
+            }
1852
+        }
1853
+    } else {
1854
+        $code = "''";
1855
+    }
1856
+    $p->code = $code;
1857
+    $p->interdire_scripts = false;
1858
+
1859
+    return $p;
1860 1860
 }
1861 1861
 
1862 1862
 
@@ -1888,13 +1888,13 @@  discard block
 block discarded – undo
1888 1888
  *     Pile complétée par le code à générer
1889 1889
  */
1890 1890
 function balise_INSERT_HEAD_dist($p) {
1891
-	$p->code = "'<'.'"
1892
-		. '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1893
-		. "'.'>'";
1894
-	$p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1895
-	$p->interdire_scripts = false;
1891
+    $p->code = "'<'.'"
1892
+        . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1893
+        . "'.'>'";
1894
+    $p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1895
+    $p->interdire_scripts = false;
1896 1896
 
1897
-	return $p;
1897
+    return $p;
1898 1898
 }
1899 1899
 
1900 1900
 /**
@@ -1912,10 +1912,10 @@  discard block
 block discarded – undo
1912 1912
  *     Pile complétée par le code à générer
1913 1913
  */
1914 1914
 function balise_INSERT_HEAD_CSS_dist($p) {
1915
-	$p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1916
-	$p->interdire_scripts = false;
1915
+    $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1916
+    $p->interdire_scripts = false;
1917 1917
 
1918
-	return $p;
1918
+    return $p;
1919 1919
 }
1920 1920
 
1921 1921
 /**
@@ -1930,11 +1930,11 @@  discard block
 block discarded – undo
1930 1930
  *     Pile complétée par le code à générer
1931 1931
  **/
1932 1932
 function balise_INCLUDE_dist($p) {
1933
-	if (function_exists('balise_INCLURE')) {
1934
-		return balise_INCLURE($p);
1935
-	} else {
1936
-		return balise_INCLURE_dist($p);
1937
-	}
1933
+    if (function_exists('balise_INCLURE')) {
1934
+        return balise_INCLURE($p);
1935
+    } else {
1936
+        return balise_INCLURE_dist($p);
1937
+    }
1938 1938
 }
1939 1939
 
1940 1940
 /**
@@ -1968,66 +1968,66 @@  discard block
 block discarded – undo
1968 1968
  *     Pile complétée par le code à générer
1969 1969
  **/
1970 1970
 function balise_INCLURE_dist($p) {
1971
-	$id_boucle = $p->id_boucle;
1972
-	// la lang n'est pas passe de facon automatique par argumenter
1973
-	// mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1974
-	// en option
1975
-
1976
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1977
-
1978
-	// erreur de syntaxe = fond absent
1979
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1980
-	if (!$_contexte) {
1981
-		$contexte = [];
1982
-	}
1983
-
1984
-	if (isset($_contexte['fond'])) {
1985
-		$f = $_contexte['fond'];
1986
-		// toujours vrai :
1987
-		if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1988
-			$f = $r[1];
1989
-			unset($_contexte['fond']);
1990
-		} else {
1991
-			spip_log('compilation de #INCLURE a revoir');
1992
-		}
1993
-
1994
-		// #INCLURE{doublons}
1995
-		if (isset($_contexte['doublons'])) {
1996
-			$_contexte['doublons'] = "'doublons' => \$doublons";
1997
-		}
1998
-
1999
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2000
-		$flag_env = false;
2001
-		if (isset($_contexte['env']) or isset($_contexte['self'])) {
2002
-			$flag_env = true;
2003
-			unset($_contexte['env']);
2004
-		}
2005
-
2006
-		$_options = [];
2007
-		if (isset($_contexte['ajax'])) {
2008
-			$_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2009
-			unset($_contexte['ajax']);
2010
-		}
2011
-		if ($p->etoile) {
2012
-			$_options[] = "'etoile'=>true";
2013
-		}
2014
-		$_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2015
-
2016
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2017
-		if ($flag_env) {
2018
-			$_l = "array_merge(\$Pile[0],$_l)";
2019
-		}
2020
-
2021
-		$p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''");
2022
-	} elseif (!isset($_contexte[1])) {
2023
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2024
-		erreur_squelette($msg, $p);
2025
-	} else {
2026
-		$p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2027
-	}
2028
-
2029
-	$p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2030
-	return $p;
1971
+    $id_boucle = $p->id_boucle;
1972
+    // la lang n'est pas passe de facon automatique par argumenter
1973
+    // mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1974
+    // en option
1975
+
1976
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1977
+
1978
+    // erreur de syntaxe = fond absent
1979
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1980
+    if (!$_contexte) {
1981
+        $contexte = [];
1982
+    }
1983
+
1984
+    if (isset($_contexte['fond'])) {
1985
+        $f = $_contexte['fond'];
1986
+        // toujours vrai :
1987
+        if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1988
+            $f = $r[1];
1989
+            unset($_contexte['fond']);
1990
+        } else {
1991
+            spip_log('compilation de #INCLURE a revoir');
1992
+        }
1993
+
1994
+        // #INCLURE{doublons}
1995
+        if (isset($_contexte['doublons'])) {
1996
+            $_contexte['doublons'] = "'doublons' => \$doublons";
1997
+        }
1998
+
1999
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2000
+        $flag_env = false;
2001
+        if (isset($_contexte['env']) or isset($_contexte['self'])) {
2002
+            $flag_env = true;
2003
+            unset($_contexte['env']);
2004
+        }
2005
+
2006
+        $_options = [];
2007
+        if (isset($_contexte['ajax'])) {
2008
+            $_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2009
+            unset($_contexte['ajax']);
2010
+        }
2011
+        if ($p->etoile) {
2012
+            $_options[] = "'etoile'=>true";
2013
+        }
2014
+        $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2015
+
2016
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2017
+        if ($flag_env) {
2018
+            $_l = "array_merge(\$Pile[0],$_l)";
2019
+        }
2020
+
2021
+        $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''");
2022
+    } elseif (!isset($_contexte[1])) {
2023
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2024
+        erreur_squelette($msg, $p);
2025
+    } else {
2026
+        $p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2027
+    }
2028
+
2029
+    $p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2030
+    return $p;
2031 2031
 }
2032 2032
 
2033 2033
 
@@ -2055,69 +2055,69 @@  discard block
 block discarded – undo
2055 2055
  **/
2056 2056
 function balise_MODELE_dist($p) {
2057 2057
 
2058
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2059
-
2060
-	// erreur de syntaxe = fond absent
2061
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2062
-	if (!$_contexte) {
2063
-		$_contexte = [];
2064
-	}
2065
-
2066
-	if (!isset($_contexte[1])) {
2067
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2068
-		erreur_squelette($msg, $p);
2069
-	} else {
2070
-		$nom = $_contexte[1];
2071
-		unset($_contexte[1]);
2072
-
2073
-		if (preg_match("/^\s*'[^']*'/s", $nom)) {
2074
-			$nom = "'modeles/" . substr($nom, 1);
2075
-		} else {
2076
-			$nom = "'modeles/' . $nom";
2077
-		}
2078
-
2079
-		$flag_env = false;
2080
-		if (isset($_contexte['env'])) {
2081
-			$flag_env = true;
2082
-			unset($_contexte['env']);
2083
-		}
2084
-
2085
-		// Incoherence dans la syntaxe du contexte. A revoir.
2086
-		// Reserver la cle primaire de la boucle courante si elle existe
2087
-		if (isset($p->boucles[$p->id_boucle]->primary)) {
2088
-			$primary = $p->boucles[$p->id_boucle]->primary;
2089
-			if (!strpos($primary, ',')) {
2090
-				$id = champ_sql($primary, $p);
2091
-				$_contexte[] = "'$primary'=>" . $id;
2092
-				$_contexte[] = "'id'=>" . $id;
2093
-			}
2094
-		}
2095
-		$_contexte[] = "'recurs'=>(++\$recurs)";
2096
-		$connect = '';
2097
-		if (isset($p->boucles[$p->id_boucle])) {
2098
-			$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2099
-		}
2100
-
2101
-		$_options = memoriser_contexte_compil($p);
2102
-		$_options = "'compil'=>array($_options), 'trim'=>true";
2103
-		if (isset($_contexte['ajax'])) {
2104
-			$_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2105
-			unset($_contexte['ajax']);
2106
-		}
2107
-
2108
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2109
-		if ($flag_env) {
2110
-			$_l = "array_merge(\$Pile[0],$_l)";
2111
-		}
2112
-
2113
-		$page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2114
-
2115
-		$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2116
-
2117
-		$p->interdire_scripts = false; // securite assuree par le squelette
2118
-	}
2119
-
2120
-	return $p;
2058
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2059
+
2060
+    // erreur de syntaxe = fond absent
2061
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2062
+    if (!$_contexte) {
2063
+        $_contexte = [];
2064
+    }
2065
+
2066
+    if (!isset($_contexte[1])) {
2067
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2068
+        erreur_squelette($msg, $p);
2069
+    } else {
2070
+        $nom = $_contexte[1];
2071
+        unset($_contexte[1]);
2072
+
2073
+        if (preg_match("/^\s*'[^']*'/s", $nom)) {
2074
+            $nom = "'modeles/" . substr($nom, 1);
2075
+        } else {
2076
+            $nom = "'modeles/' . $nom";
2077
+        }
2078
+
2079
+        $flag_env = false;
2080
+        if (isset($_contexte['env'])) {
2081
+            $flag_env = true;
2082
+            unset($_contexte['env']);
2083
+        }
2084
+
2085
+        // Incoherence dans la syntaxe du contexte. A revoir.
2086
+        // Reserver la cle primaire de la boucle courante si elle existe
2087
+        if (isset($p->boucles[$p->id_boucle]->primary)) {
2088
+            $primary = $p->boucles[$p->id_boucle]->primary;
2089
+            if (!strpos($primary, ',')) {
2090
+                $id = champ_sql($primary, $p);
2091
+                $_contexte[] = "'$primary'=>" . $id;
2092
+                $_contexte[] = "'id'=>" . $id;
2093
+            }
2094
+        }
2095
+        $_contexte[] = "'recurs'=>(++\$recurs)";
2096
+        $connect = '';
2097
+        if (isset($p->boucles[$p->id_boucle])) {
2098
+            $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2099
+        }
2100
+
2101
+        $_options = memoriser_contexte_compil($p);
2102
+        $_options = "'compil'=>array($_options), 'trim'=>true";
2103
+        if (isset($_contexte['ajax'])) {
2104
+            $_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2105
+            unset($_contexte['ajax']);
2106
+        }
2107
+
2108
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2109
+        if ($flag_env) {
2110
+            $_l = "array_merge(\$Pile[0],$_l)";
2111
+        }
2112
+
2113
+        $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2114
+
2115
+        $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2116
+
2117
+        $p->interdire_scripts = false; // securite assuree par le squelette
2118
+    }
2119
+
2120
+    return $p;
2121 2121
 }
2122 2122
 
2123 2123
 
@@ -2141,21 +2141,21 @@  discard block
 block discarded – undo
2141 2141
  *     Pile complétée par le code à générer
2142 2142
  **/
2143 2143
 function balise_SET_dist($p) {
2144
-	$_nom = interprete_argument_balise(1, $p);
2145
-	$_val = interprete_argument_balise(2, $p);
2144
+    $_nom = interprete_argument_balise(1, $p);
2145
+    $_val = interprete_argument_balise(2, $p);
2146 2146
 
2147
-	if (!$_nom or !$_val) {
2148
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2149
-		erreur_squelette($err_b_s_a, $p);
2150
-	}
2151
-	// affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2152
-	// cf https://bugs.php.net/bug.php?id=65845
2153
-	else {
2154
-		$p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2155
-	}
2147
+    if (!$_nom or !$_val) {
2148
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2149
+        erreur_squelette($err_b_s_a, $p);
2150
+    }
2151
+    // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2152
+    // cf https://bugs.php.net/bug.php?id=65845
2153
+    else {
2154
+        $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2155
+    }
2156 2156
 
2157
-	$p->interdire_scripts = false; // la balise ne renvoie rien
2158
-	return $p;
2157
+    $p->interdire_scripts = false; // la balise ne renvoie rien
2158
+    return $p;
2159 2159
 }
2160 2160
 
2161 2161
 
@@ -2185,12 +2185,12 @@  discard block
 block discarded – undo
2185 2185
  *     Pile complétée par le code à générer
2186 2186
  **/
2187 2187
 function balise_GET_dist($p) {
2188
-	$p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2189
-	if (function_exists('balise_ENV')) {
2190
-		return balise_ENV($p, '$Pile["vars"]??[]');
2191
-	} else {
2192
-		return balise_ENV_dist($p, '$Pile["vars"]??[]');
2193
-	}
2188
+    $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2189
+    if (function_exists('balise_ENV')) {
2190
+        return balise_ENV($p, '$Pile["vars"]??[]');
2191
+    } else {
2192
+        return balise_ENV_dist($p, '$Pile["vars"]??[]');
2193
+    }
2194 2194
 }
2195 2195
 
2196 2196
 
@@ -2213,22 +2213,22 @@  discard block
 block discarded – undo
2213 2213
  *     Pile complétée par le code à générer
2214 2214
  **/
2215 2215
 function balise_DOUBLONS_dist($p) {
2216
-	if ($type = interprete_argument_balise(1, $p)) {
2217
-		if ($famille = interprete_argument_balise(2, $p)) {
2218
-			$type .= '.' . $famille;
2219
-		}
2220
-		$p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2221
-		if (!$p->etoile) {
2222
-			$p->code = 'array_filter(array_map("intval",explode(",",'
2223
-				. $p->code . ')))';
2224
-		}
2225
-	} else {
2226
-		$p->code = '$doublons';
2227
-	}
2216
+    if ($type = interprete_argument_balise(1, $p)) {
2217
+        if ($famille = interprete_argument_balise(2, $p)) {
2218
+            $type .= '.' . $famille;
2219
+        }
2220
+        $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2221
+        if (!$p->etoile) {
2222
+            $p->code = 'array_filter(array_map("intval",explode(",",'
2223
+                . $p->code . ')))';
2224
+        }
2225
+    } else {
2226
+        $p->code = '$doublons';
2227
+    }
2228 2228
 
2229
-	$p->interdire_scripts = false;
2229
+    $p->interdire_scripts = false;
2230 2230
 
2231
-	return $p;
2231
+    return $p;
2232 2232
 }
2233 2233
 
2234 2234
 
@@ -2251,18 +2251,18 @@  discard block
 block discarded – undo
2251 2251
  *     Pile complétée par le code à générer
2252 2252
  **/
2253 2253
 function balise_PIPELINE_dist($p) {
2254
-	$_pipe = interprete_argument_balise(1, $p);
2255
-	if (!$_pipe) {
2256
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2257
-		erreur_squelette($err_b_s_a, $p);
2258
-	} else {
2259
-		$_flux = interprete_argument_balise(2, $p);
2260
-		$_flux = $_flux ?: "''";
2261
-		$p->code = "pipeline( $_pipe , $_flux )";
2262
-		$p->interdire_scripts = false;
2263
-	}
2254
+    $_pipe = interprete_argument_balise(1, $p);
2255
+    if (!$_pipe) {
2256
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2257
+        erreur_squelette($err_b_s_a, $p);
2258
+    } else {
2259
+        $_flux = interprete_argument_balise(2, $p);
2260
+        $_flux = $_flux ?: "''";
2261
+        $p->code = "pipeline( $_pipe , $_flux )";
2262
+        $p->interdire_scripts = false;
2263
+    }
2264 2264
 
2265
-	return $p;
2265
+    return $p;
2266 2266
 }
2267 2267
 
2268 2268
 
@@ -2287,10 +2287,10 @@  discard block
 block discarded – undo
2287 2287
  *     Pile complétée par le code à générer
2288 2288
  **/
2289 2289
 function balise_EDIT_dist($p) {
2290
-	$p->code = "''";
2291
-	$p->interdire_scripts = false;
2290
+    $p->code = "''";
2291
+    $p->interdire_scripts = false;
2292 2292
 
2293
-	return $p;
2293
+    return $p;
2294 2294
 }
2295 2295
 
2296 2296
 
@@ -2313,11 +2313,11 @@  discard block
 block discarded – undo
2313 2313
  *     Pile complétée par le code à générer
2314 2314
  **/
2315 2315
 function balise_TOTAL_UNIQUE_dist($p) {
2316
-	$_famille = interprete_argument_balise(1, $p);
2317
-	$_famille = $_famille ?: "''";
2318
-	$p->code = "unique('', $_famille, true)";
2316
+    $_famille = interprete_argument_balise(1, $p);
2317
+    $_famille = $_famille ?: "''";
2318
+    $p->code = "unique('', $_famille, true)";
2319 2319
 
2320
-	return $p;
2320
+    return $p;
2321 2321
 }
2322 2322
 
2323 2323
 /**
@@ -2340,19 +2340,19 @@  discard block
 block discarded – undo
2340 2340
  *     Pile complétée par le code à générer
2341 2341
  **/
2342 2342
 function balise_ARRAY_dist($p) {
2343
-	$_code = [];
2344
-	$n = 1;
2345
-	do {
2346
-		$_key = interprete_argument_balise($n++, $p);
2347
-		$_val = interprete_argument_balise($n++, $p);
2348
-		if ($_key and $_val) {
2349
-			$_code[] = "$_key => $_val";
2350
-		}
2351
-	} while ($_key && $_val);
2352
-	$p->code = 'array(' . join(', ', $_code) . ')';
2353
-	$p->interdire_scripts = false;
2343
+    $_code = [];
2344
+    $n = 1;
2345
+    do {
2346
+        $_key = interprete_argument_balise($n++, $p);
2347
+        $_val = interprete_argument_balise($n++, $p);
2348
+        if ($_key and $_val) {
2349
+            $_code[] = "$_key => $_val";
2350
+        }
2351
+    } while ($_key && $_val);
2352
+    $p->code = 'array(' . join(', ', $_code) . ')';
2353
+    $p->interdire_scripts = false;
2354 2354
 
2355
-	return $p;
2355
+    return $p;
2356 2356
 }
2357 2357
 
2358 2358
 /**
@@ -2371,15 +2371,15 @@  discard block
 block discarded – undo
2371 2371
  *     Pile complétée par le code à générer
2372 2372
  */
2373 2373
 function balise_LISTE_dist($p) {
2374
-	$_code = [];
2375
-	$n = 1;
2376
-	while ($_val = interprete_argument_balise($n++, $p)) {
2377
-		$_code[] = $_val;
2378
-	}
2379
-	$p->code = 'array(' . join(', ', $_code) . ')';
2380
-	$p->interdire_scripts = false;
2374
+    $_code = [];
2375
+    $n = 1;
2376
+    while ($_val = interprete_argument_balise($n++, $p)) {
2377
+        $_code[] = $_val;
2378
+    }
2379
+    $p->code = 'array(' . join(', ', $_code) . ')';
2380
+    $p->interdire_scripts = false;
2381 2381
 
2382
-	return $p;
2382
+    return $p;
2383 2383
 }
2384 2384
 
2385 2385
 
@@ -2413,21 +2413,21 @@  discard block
 block discarded – undo
2413 2413
  *     Pile complétée par le code à générer
2414 2414
  **/
2415 2415
 function balise_AUTORISER_dist($p) {
2416
-	$_code = [];
2417
-	$p->descr['session'] = true; // faire un cache par session
2416
+    $_code = [];
2417
+    $p->descr['session'] = true; // faire un cache par session
2418 2418
 
2419
-	$n = 1;
2420
-	while ($_v = interprete_argument_balise($n++, $p)) {
2421
-		$_code[] = $_v;
2422
-	}
2419
+    $n = 1;
2420
+    while ($_v = interprete_argument_balise($n++, $p)) {
2421
+        $_code[] = $_v;
2422
+    }
2423 2423
 
2424
-	$p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2425
-		', ',
2426
-		$_code
2427
-	) . ')?" ":"")';
2428
-	$p->interdire_scripts = false;
2424
+    $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2425
+        ', ',
2426
+        $_code
2427
+    ) . ')?" ":"")';
2428
+    $p->interdire_scripts = false;
2429 2429
 
2430
-	return $p;
2430
+    return $p;
2431 2431
 }
2432 2432
 
2433 2433
 
@@ -2451,15 +2451,15 @@  discard block
 block discarded – undo
2451 2451
  *     Pile complétée par le code à générer
2452 2452
  **/
2453 2453
 function balise_PLUGIN_dist($p) {
2454
-	$plugin = interprete_argument_balise(1, $p);
2455
-	$plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2456
-	$type_info = interprete_argument_balise(2, $p);
2457
-	$type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2454
+    $plugin = interprete_argument_balise(1, $p);
2455
+    $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2456
+    $type_info = interprete_argument_balise(2, $p);
2457
+    $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2458 2458
 
2459
-	$f = chercher_filtre('info_plugin');
2460
-	$p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2459
+    $f = chercher_filtre('info_plugin');
2460
+    $p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2461 2461
 
2462
-	return $p;
2462
+    return $p;
2463 2463
 }
2464 2464
 
2465 2465
 /**
@@ -2480,9 +2480,9 @@  discard block
 block discarded – undo
2480 2480
  *     Pile complétée par le code à générer
2481 2481
  **/
2482 2482
 function balise_AIDER_dist($p) {
2483
-	$_motif = interprete_argument_balise(1, $p);
2484
-	$p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2485
-	return $p;
2483
+    $_motif = interprete_argument_balise(1, $p);
2484
+    $p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2485
+    return $p;
2486 2486
 }
2487 2487
 
2488 2488
 /**
@@ -2508,16 +2508,16 @@  discard block
 block discarded – undo
2508 2508
  *     Pile complétée par le code à générer
2509 2509
  **/
2510 2510
 function balise_ACTION_FORMULAIRE($p) {
2511
-	if (!$_url = interprete_argument_balise(1, $p)) {
2512
-		$_url = "(\$Pile[0]['action'] ?? '')";
2513
-	}
2514
-	if (!$_form = interprete_argument_balise(2, $p)) {
2515
-		$_form = "(\$Pile[0]['form'] ?? '')";
2516
-	}
2517
-
2518
-	// envoyer le nom du formulaire que l'on traite
2519
-	// transmettre les eventuels args de la balise formulaire
2520
-	$p->code = "	'<span class=\"form-hidden\">' .
2511
+    if (!$_url = interprete_argument_balise(1, $p)) {
2512
+        $_url = "(\$Pile[0]['action'] ?? '')";
2513
+    }
2514
+    if (!$_form = interprete_argument_balise(2, $p)) {
2515
+        $_form = "(\$Pile[0]['form'] ?? '')";
2516
+    }
2517
+
2518
+    // envoyer le nom du formulaire que l'on traite
2519
+    // transmettre les eventuels args de la balise formulaire
2520
+    $p->code = "	'<span class=\"form-hidden\">' .
2521 2521
 	form_hidden($_url) .
2522 2522
 	'<input name=\'formulaire_action\' type=\'hidden\'
2523 2523
 		value=\'' . $_form . '\' />' .
@@ -2528,9 +2528,9 @@  discard block
 block discarded – undo
2528 2528
 	(\$Pile[0]['_hidden'] ?? '') .
2529 2529
 	'</span>'";
2530 2530
 
2531
-	$p->interdire_scripts = false;
2531
+    $p->interdire_scripts = false;
2532 2532
 
2533
-	return $p;
2533
+    return $p;
2534 2534
 }
2535 2535
 
2536 2536
 
@@ -2571,25 +2571,25 @@  discard block
 block discarded – undo
2571 2571
  */
2572 2572
 function balise_BOUTON_ACTION_dist($p) {
2573 2573
 
2574
-	$args = [];
2575
-	for ($k = 1; $k <= 6; $k++) {
2576
-		$_a = interprete_argument_balise($k, $p);
2577
-		if (!$_a) {
2578
-			$_a = "''";
2579
-		}
2580
-		$args[] = $_a;
2581
-	}
2582
-	// supprimer les args vides
2583
-	while (end($args) == "''" and count($args) > 2) {
2584
-		array_pop($args);
2585
-	}
2586
-	$args = implode(',', $args);
2574
+    $args = [];
2575
+    for ($k = 1; $k <= 6; $k++) {
2576
+        $_a = interprete_argument_balise($k, $p);
2577
+        if (!$_a) {
2578
+            $_a = "''";
2579
+        }
2580
+        $args[] = $_a;
2581
+    }
2582
+    // supprimer les args vides
2583
+    while (end($args) == "''" and count($args) > 2) {
2584
+        array_pop($args);
2585
+    }
2586
+    $args = implode(',', $args);
2587 2587
 
2588
-	$bouton_action = chercher_filtre('bouton_action');
2589
-	$p->code = "$bouton_action($args)";
2590
-	$p->interdire_scripts = false;
2588
+    $bouton_action = chercher_filtre('bouton_action');
2589
+    $p->code = "$bouton_action($args)";
2590
+    $p->interdire_scripts = false;
2591 2591
 
2592
-	return $p;
2592
+    return $p;
2593 2593
 }
2594 2594
 
2595 2595
 
@@ -2608,10 +2608,10 @@  discard block
 block discarded – undo
2608 2608
  *     Pile complétée par le code à générer
2609 2609
  */
2610 2610
 function balise_SLOGAN_SITE_SPIP_dist($p) {
2611
-	$p->code = "\$GLOBALS['meta']['slogan_site']";
2611
+    $p->code = "\$GLOBALS['meta']['slogan_site']";
2612 2612
 
2613
-	#$p->interdire_scripts = true;
2614
-	return $p;
2613
+    #$p->interdire_scripts = true;
2614
+    return $p;
2615 2615
 }
2616 2616
 
2617 2617
 
@@ -2635,10 +2635,10 @@  discard block
 block discarded – undo
2635 2635
  *     Pile complétée par le code à générer
2636 2636
  */
2637 2637
 function balise_HTML5_dist($p) {
2638
-	$p->code = html5_permis() ? "' '" : "''";
2639
-	$p->interdire_scripts = false;
2638
+    $p->code = html5_permis() ? "' '" : "''";
2639
+    $p->interdire_scripts = false;
2640 2640
 
2641
-	return $p;
2641
+    return $p;
2642 2642
 }
2643 2643
 
2644 2644
 
@@ -2664,58 +2664,58 @@  discard block
 block discarded – undo
2664 2664
  *     Pile complétée par le code à générer
2665 2665
  */
2666 2666
 function balise_TRI_dist($p, $liste = 'true') {
2667
-	$b = index_boucle_mere($p);
2668
-	// s'il n'y a pas de nom de boucle, on ne peut pas trier
2669
-	if ($b === '') {
2670
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2671
-		erreur_squelette($msg, $p);
2672
-		$p->code = "''";
2667
+    $b = index_boucle_mere($p);
2668
+    // s'il n'y a pas de nom de boucle, on ne peut pas trier
2669
+    if ($b === '') {
2670
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2671
+        erreur_squelette($msg, $p);
2672
+        $p->code = "''";
2673 2673
 
2674
-		return $p;
2675
-	}
2676
-	$boucle = $p->boucles[$b];
2674
+        return $p;
2675
+    }
2676
+    $boucle = $p->boucles[$b];
2677 2677
 
2678
-	// s'il n'y a pas de tri_champ, c'est qu'on se trouve
2679
-	// dans un boucle recursive ou qu'on a oublie le critere {tri}
2680
-	if (!isset($boucle->modificateur['tri_champ'])) {
2681
-		$msg = ['zbug_champ_hors_critere', [
2682
-			'champ' => zbug_presenter_champ($p),
2683
-			'critere' => 'tri'
2684
-		]];
2685
-		erreur_squelette($msg, $p);
2686
-		$p->code = "''";
2678
+    // s'il n'y a pas de tri_champ, c'est qu'on se trouve
2679
+    // dans un boucle recursive ou qu'on a oublie le critere {tri}
2680
+    if (!isset($boucle->modificateur['tri_champ'])) {
2681
+        $msg = ['zbug_champ_hors_critere', [
2682
+            'champ' => zbug_presenter_champ($p),
2683
+            'critere' => 'tri'
2684
+        ]];
2685
+        erreur_squelette($msg, $p);
2686
+        $p->code = "''";
2687 2687
 
2688
-		return $p;
2689
-	}
2688
+        return $p;
2689
+    }
2690 2690
 
2691
-	// Différentes infos relatives au tri présentes dans les modificateurs
2692
-	$_tri_nom = $boucle->modificateur['tri_nom'] ; // nom du paramètre définissant le tri
2693
-	$_tri_champ = $boucle->modificateur['tri_champ']; // champ actuel utilisé le tri
2694
-	$_tri_sens = $boucle->modificateur['tri_sens']; // sens de tri actuel
2695
-	$_tri_liste_sens_defaut = $boucle->modificateur['tri_liste_sens_defaut']; // sens par défaut pour chaque champ
2691
+    // Différentes infos relatives au tri présentes dans les modificateurs
2692
+    $_tri_nom = $boucle->modificateur['tri_nom'] ; // nom du paramètre définissant le tri
2693
+    $_tri_champ = $boucle->modificateur['tri_champ']; // champ actuel utilisé le tri
2694
+    $_tri_sens = $boucle->modificateur['tri_sens']; // sens de tri actuel
2695
+    $_tri_liste_sens_defaut = $boucle->modificateur['tri_liste_sens_defaut']; // sens par défaut pour chaque champ
2696 2696
 
2697
-	$_champ_ou_sens = interprete_argument_balise(1, $p);
2698
-	// si pas de champ, renvoyer le critère de tri actuel
2699
-	if (!$_champ_ou_sens) {
2700
-		$p->code = $_tri_champ;
2697
+    $_champ_ou_sens = interprete_argument_balise(1, $p);
2698
+    // si pas de champ, renvoyer le critère de tri actuel
2699
+    if (!$_champ_ou_sens) {
2700
+        $p->code = $_tri_champ;
2701 2701
 
2702
-		return $p;
2703
-	}
2704
-	// forcer la jointure si besoin, et si le champ est statique
2705
-	if (preg_match(",^'([\w.]+)'$,i", $_champ_ou_sens, $m)) {
2706
-		index_pile($b, $m[1], $p->boucles, '', null, true, false);
2707
-	}
2702
+        return $p;
2703
+    }
2704
+    // forcer la jointure si besoin, et si le champ est statique
2705
+    if (preg_match(",^'([\w.]+)'$,i", $_champ_ou_sens, $m)) {
2706
+        index_pile($b, $m[1], $p->boucles, '', null, true, false);
2707
+    }
2708 2708
 
2709
-	$_libelle = interprete_argument_balise(2, $p);
2710
-	$_libelle = $_libelle ?: $_champ_ou_sens;
2709
+    $_libelle = interprete_argument_balise(2, $p);
2710
+    $_libelle = $_libelle ?: $_champ_ou_sens;
2711 2711
 
2712
-	$_class = interprete_argument_balise(3, $p) ?? "''";
2712
+    $_class = interprete_argument_balise(3, $p) ?? "''";
2713 2713
 
2714
-	$p->code = "calculer_balise_tri($_champ_ou_sens, $_libelle, $_class, $_tri_nom, $_tri_champ, $_tri_sens, $_tri_liste_sens_defaut)";
2714
+    $p->code = "calculer_balise_tri($_champ_ou_sens, $_libelle, $_class, $_tri_nom, $_tri_champ, $_tri_sens, $_tri_liste_sens_defaut)";
2715 2715
 
2716
-	$p->interdire_scripts = false;
2716
+    $p->interdire_scripts = false;
2717 2717
 
2718
-	return $p;
2718
+    return $p;
2719 2719
 }
2720 2720
 
2721 2721
 
@@ -2736,21 +2736,21 @@  discard block
 block discarded – undo
2736 2736
  *     Pile complétée par le code à générer
2737 2737
  */
2738 2738
 function balise_SAUTER_dist($p) {
2739
-	$id_boucle = $p->id_boucle;
2739
+    $id_boucle = $p->id_boucle;
2740 2740
 
2741
-	if (empty($p->boucles[$id_boucle])) {
2742
-		$msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2743
-		erreur_squelette($msg, $p);
2744
-	} else {
2745
-		$_saut = interprete_argument_balise(1, $p);
2746
-		$_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2747
-		$_total = "(\$Numrows['$id_boucle']['total'] ?? null)";
2741
+    if (empty($p->boucles[$id_boucle])) {
2742
+        $msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2743
+        erreur_squelette($msg, $p);
2744
+    } else {
2745
+        $_saut = interprete_argument_balise(1, $p);
2746
+        $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2747
+        $_total = "(\$Numrows['$id_boucle']['total'] ?? null)";
2748 2748
 
2749
-		$p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2750
-	}
2751
-	$p->interdire_scripts = false;
2749
+        $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2750
+    }
2751
+    $p->interdire_scripts = false;
2752 2752
 
2753
-	return $p;
2753
+    return $p;
2754 2754
 }
2755 2755
 
2756 2756
 
@@ -2772,22 +2772,22 @@  discard block
 block discarded – undo
2772 2772
  *     Pile complétée par le code à générer
2773 2773
  */
2774 2774
 function balise_PUBLIE_dist($p) {
2775
-	if (!$_type = interprete_argument_balise(1, $p)) {
2776
-		$_type = _q($p->type_requete);
2777
-		$_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2778
-	} else {
2779
-		$_id = interprete_argument_balise(2, $p);
2780
-	}
2775
+    if (!$_type = interprete_argument_balise(1, $p)) {
2776
+        $_type = _q($p->type_requete);
2777
+        $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2778
+    } else {
2779
+        $_id = interprete_argument_balise(2, $p);
2780
+    }
2781 2781
 
2782
-	$connect = '';
2783
-	if (isset($p->boucles[$p->id_boucle])) {
2784
-		$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2785
-	}
2782
+    $connect = '';
2783
+    if (isset($p->boucles[$p->id_boucle])) {
2784
+        $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2785
+    }
2786 2786
 
2787
-	$p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2788
-	$p->interdire_scripts = false;
2787
+    $p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2788
+    $p->interdire_scripts = false;
2789 2789
 
2790
-	return $p;
2790
+    return $p;
2791 2791
 }
2792 2792
 
2793 2793
 /**
@@ -2816,12 +2816,12 @@  discard block
 block discarded – undo
2816 2816
  *     Pile complétée par le code à générer
2817 2817
  */
2818 2818
 function balise_PRODUIRE_dist($p) {
2819
-	$balise_inclure = charger_fonction('INCLURE', 'balise');
2820
-	$p = $balise_inclure($p);
2819
+    $balise_inclure = charger_fonction('INCLURE', 'balise');
2820
+    $p = $balise_inclure($p);
2821 2821
 
2822
-	$p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2822
+    $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2823 2823
 
2824
-	return $p;
2824
+    return $p;
2825 2825
 }
2826 2826
 
2827 2827
 /**
@@ -2840,13 +2840,13 @@  discard block
 block discarded – undo
2840 2840
  *     Pile complétée par le code à générer
2841 2841
  */
2842 2842
 function balise_LARGEUR_ECRAN_dist($p) {
2843
-	$_class = interprete_argument_balise(1, $p);
2844
-	if (!$_class) {
2845
-		$_class = 'null';
2846
-	}
2847
-	$p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2843
+    $_class = interprete_argument_balise(1, $p);
2844
+    if (!$_class) {
2845
+        $_class = 'null';
2846
+    }
2847
+    $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2848 2848
 
2849
-	return $p;
2849
+    return $p;
2850 2850
 }
2851 2851
 
2852 2852
 
@@ -2862,14 +2862,14 @@  discard block
 block discarded – undo
2862 2862
  *     Pile complétée par le code à générer
2863 2863
  **/
2864 2864
 function balise_CONST_dist($p) {
2865
-	$_const = interprete_argument_balise(1, $p);
2866
-	if (!strlen($_const ?? '')) {
2867
-		$p->code = "''";
2868
-	}
2869
-	else {
2870
-		$p->code = "(defined($_const)?constant($_const):'')";
2871
-	}
2872
-	$p->interdire_scripts = false;
2873
-
2874
-	return $p;
2865
+    $_const = interprete_argument_balise(1, $p);
2866
+    if (!strlen($_const ?? '')) {
2867
+        $p->code = "''";
2868
+    }
2869
+    else {
2870
+        $p->code = "(defined($_const)?constant($_const):'')";
2871
+    }
2872
+    $p->interdire_scripts = false;
2873
+
2874
+    return $p;
2875 2875
 }
Please login to merge, or discard this patch.
ecrire/auth/spip.php 1 patch
Indentation   +413 added lines, -413 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
 use Spip\Chiffrer\SpipCles;
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 /**
@@ -34,171 +34,171 @@  discard block
 block discarded – undo
34 34
  */
35 35
 function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) {
36 36
 
37
-	// retrouver le login
38
-	$login = auth_spip_retrouver_login($login);
39
-	// login inconnu, n'allons pas plus loin
40
-	if (!$login) {
41
-		return [];
42
-	}
43
-
44
-	$md5pass = '';
45
-	$shapass = $shanext = '';
46
-	$auteur_peut_sauver_cles = false;
47
-
48
-	if ($pass) {
49
-		$row = sql_fetsel(
50
-			'*',
51
-			'spip_auteurs',
52
-			'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
53
-			'',
54
-			'',
55
-			'',
56
-			'',
57
-			$serveur
58
-		);
59
-
60
-		// lever un flag si cet auteur peut sauver les cles
61
-		if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) {
62
-			$auteur_peut_sauver_cles = true;
63
-		}
64
-	}
65
-
66
-	// login inexistant ou mot de passe vide
67
-	if (!$pass or !$row) {
68
-		return [];
69
-	}
70
-
71
-	include_spip('inc/chiffrer');
72
-	$cles = SpipCles::instance();
73
-	$secret = $cles->getSecretAuth();
74
-
75
-	$hash = null;
76
-	switch (strlen($row['pass'])) {
77
-
78
-		// legacy = md5 ou sha256
79
-		case 32:
80
-			// tres anciens mots de passe encodes en md5(alea.pass)
81
-			$hash = md5($row['alea_actuel'] . $pass);
82
-			$methode = 'md5';
83
-		case 64:
84
-			if (empty($hash)) {
85
-				// anciens mots de passe encodes en sha256(alea.pass)
86
-				include_spip('auth/sha256.inc');
87
-				$hash = spip_sha256($row['alea_actuel'] . $pass);
88
-				$methode = 'sha256';
89
-			}
90
-			if ($row['pass'] === $hash) {
91
-				spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via $methode", 'auth' . _LOG_DEBUG);
92
-				// ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
93
-				if (!empty($row['backup_cles'])) {
94
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
95
-				}
96
-				break;
97
-			}
98
-
99
-		// on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
100
-
101
-		case 60:
102
-		case 98:
103
-		default:
104
-			// doit-on restaurer un backup des cles ?
105
-			// si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
106
-			if (
107
-				!$secret
108
-				and $auteur_peut_sauver_cles
109
-				and !empty($row['backup_cles'])
110
-			) {
111
-				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
112
-					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
113
-					if ($cles->save()) {
114
-						$secret = $cles->getSecretAuth();
115
-					}
116
-					else {
117
-						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
118
-						// et on echoue car on ne veut pas que la situation reste telle quelle
119
-						raler_fichier(_DIR_ETC . 'cles.php');
120
-					}
121
-				}
122
-				else {
123
-					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
124
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
125
-				}
126
-			}
127
-
128
-			if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
129
-				unset($row);
130
-			}
131
-			else {
132
-				spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via Password::verifier", 'auth' . _LOG_DEBUG);
133
-			}
134
-			break;
135
-	}
136
-
137
-	// Migration depuis ancienne version : si on a pas encore de cle
138
-	// ET si c'est le login d'un auteur qui peut sauver la cle
139
-	// créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
140
-	// si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre
141
-	if (!$secret and $auteur_peut_sauver_cles) {
142
-		if (auth_spip_initialiser_secret()) {
143
-			$secret = $cles->getSecretAuth();
144
-		}
145
-	}
146
-
147
-	// login/mot de passe incorrect
148
-	if (empty($row)) {
149
-		return [];
150
-	}
151
-
152
-	// fait tourner le codage du pass dans la base
153
-	// sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
154
-	if (!$phpauth and $secret) {
155
-		include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
156
-		$pass_hash_next = Password::hacher($pass, $secret);
157
-		if ($pass_hash_next) {
158
-			$set = [
159
-				'alea_actuel' => 'alea_futur', // @deprecated 4.1
160
-				'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
161
-				'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
162
-			];
163
-
164
-			// regenerer un htpass si on a active/desactive le plugin htpasswd
165
-			// et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
166
-			$htpass = generer_htpass($pass);
167
-			if (strlen($htpass) !== strlen($row['htpass'])) {
168
-				$set['htpass'] = sql_quote($htpass, $serveur, 'text');
169
-			}
170
-
171
-			// a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
172
-			if ($auteur_peut_sauver_cles) {
173
-				$set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
174
-			}
175
-
176
-			@sql_update(
177
-				'spip_auteurs',
178
-				$set,
179
-				'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
180
-					$row['pass'],
181
-					$serveur,
182
-					'text'
183
-				),
184
-				[],
185
-				$serveur
186
-			);
187
-
188
-			// si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
189
-			if (isset($set['htpass'])) {
190
-				ecrire_acces();
191
-			}
192
-		}
193
-
194
-		// En profiter pour verifier la securite de tmp/
195
-		// Si elle ne fonctionne pas a l'installation, prevenir
196
-		if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
197
-			return false;
198
-		}
199
-	}
200
-
201
-	return $row;
37
+    // retrouver le login
38
+    $login = auth_spip_retrouver_login($login);
39
+    // login inconnu, n'allons pas plus loin
40
+    if (!$login) {
41
+        return [];
42
+    }
43
+
44
+    $md5pass = '';
45
+    $shapass = $shanext = '';
46
+    $auteur_peut_sauver_cles = false;
47
+
48
+    if ($pass) {
49
+        $row = sql_fetsel(
50
+            '*',
51
+            'spip_auteurs',
52
+            'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
53
+            '',
54
+            '',
55
+            '',
56
+            '',
57
+            $serveur
58
+        );
59
+
60
+        // lever un flag si cet auteur peut sauver les cles
61
+        if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) {
62
+            $auteur_peut_sauver_cles = true;
63
+        }
64
+    }
65
+
66
+    // login inexistant ou mot de passe vide
67
+    if (!$pass or !$row) {
68
+        return [];
69
+    }
70
+
71
+    include_spip('inc/chiffrer');
72
+    $cles = SpipCles::instance();
73
+    $secret = $cles->getSecretAuth();
74
+
75
+    $hash = null;
76
+    switch (strlen($row['pass'])) {
77
+
78
+        // legacy = md5 ou sha256
79
+        case 32:
80
+            // tres anciens mots de passe encodes en md5(alea.pass)
81
+            $hash = md5($row['alea_actuel'] . $pass);
82
+            $methode = 'md5';
83
+        case 64:
84
+            if (empty($hash)) {
85
+                // anciens mots de passe encodes en sha256(alea.pass)
86
+                include_spip('auth/sha256.inc');
87
+                $hash = spip_sha256($row['alea_actuel'] . $pass);
88
+                $methode = 'sha256';
89
+            }
90
+            if ($row['pass'] === $hash) {
91
+                spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via $methode", 'auth' . _LOG_DEBUG);
92
+                // ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
93
+                if (!empty($row['backup_cles'])) {
94
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
95
+                }
96
+                break;
97
+            }
98
+
99
+        // on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
100
+
101
+        case 60:
102
+        case 98:
103
+        default:
104
+            // doit-on restaurer un backup des cles ?
105
+            // si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
106
+            if (
107
+                !$secret
108
+                and $auteur_peut_sauver_cles
109
+                and !empty($row['backup_cles'])
110
+            ) {
111
+                if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
112
+                    spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
113
+                    if ($cles->save()) {
114
+                        $secret = $cles->getSecretAuth();
115
+                    }
116
+                    else {
117
+                        spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
118
+                        // et on echoue car on ne veut pas que la situation reste telle quelle
119
+                        raler_fichier(_DIR_ETC . 'cles.php');
120
+                    }
121
+                }
122
+                else {
123
+                    spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
124
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
125
+                }
126
+            }
127
+
128
+            if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
129
+                unset($row);
130
+            }
131
+            else {
132
+                spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via Password::verifier", 'auth' . _LOG_DEBUG);
133
+            }
134
+            break;
135
+    }
136
+
137
+    // Migration depuis ancienne version : si on a pas encore de cle
138
+    // ET si c'est le login d'un auteur qui peut sauver la cle
139
+    // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
140
+    // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre
141
+    if (!$secret and $auteur_peut_sauver_cles) {
142
+        if (auth_spip_initialiser_secret()) {
143
+            $secret = $cles->getSecretAuth();
144
+        }
145
+    }
146
+
147
+    // login/mot de passe incorrect
148
+    if (empty($row)) {
149
+        return [];
150
+    }
151
+
152
+    // fait tourner le codage du pass dans la base
153
+    // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
154
+    if (!$phpauth and $secret) {
155
+        include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
156
+        $pass_hash_next = Password::hacher($pass, $secret);
157
+        if ($pass_hash_next) {
158
+            $set = [
159
+                'alea_actuel' => 'alea_futur', // @deprecated 4.1
160
+                'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
161
+                'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
162
+            ];
163
+
164
+            // regenerer un htpass si on a active/desactive le plugin htpasswd
165
+            // et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
166
+            $htpass = generer_htpass($pass);
167
+            if (strlen($htpass) !== strlen($row['htpass'])) {
168
+                $set['htpass'] = sql_quote($htpass, $serveur, 'text');
169
+            }
170
+
171
+            // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
172
+            if ($auteur_peut_sauver_cles) {
173
+                $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
174
+            }
175
+
176
+            @sql_update(
177
+                'spip_auteurs',
178
+                $set,
179
+                'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
180
+                    $row['pass'],
181
+                    $serveur,
182
+                    'text'
183
+                ),
184
+                [],
185
+                $serveur
186
+            );
187
+
188
+            // si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
189
+            if (isset($set['htpass'])) {
190
+                ecrire_acces();
191
+            }
192
+        }
193
+
194
+        // En profiter pour verifier la securite de tmp/
195
+        // Si elle ne fonctionne pas a l'installation, prevenir
196
+        if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
197
+            return false;
198
+        }
199
+    }
200
+
201
+    return $row;
202 202
 }
203 203
 
204 204
 /**
@@ -213,37 +213,37 @@  discard block
 block discarded – undo
213 213
  * @return bool
214 214
  */
215 215
 function auth_spip_initialiser_secret(bool $force = false): bool {
216
-	include_spip('inc/chiffrer');
217
-	$cles = SpipCles::instance();
218
-	$secret = $cles->getSecretAuth();
219
-
220
-	// on ne fait rien si on a un secret dispo
221
-	if ($secret) {
222
-		return false;
223
-	}
224
-
225
-	// si force, on ne verifie pas la presence d'un backup chez un webmestre
226
-	if ($force) {
227
-		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
228
-		$secret = $cles->getSecretAuth(true);
229
-		return true;
230
-	}
231
-
232
-	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
233
-	$has_backup = array_column($has_backup, 'id_auteur');
234
-	if (empty($has_backup)) {
235
-		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
236
-		if ($secret = $cles->getSecretAuth(true)) {
237
-			return true;
238
-		}
239
-		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
240
-		// et on echoue car on ne veut pas que la situation reste telle quelle
241
-		raler_fichier(_DIR_ETC . 'cles.php');
242
-	}
243
-	else {
244
-		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
245
-	}
246
-	return false;
216
+    include_spip('inc/chiffrer');
217
+    $cles = SpipCles::instance();
218
+    $secret = $cles->getSecretAuth();
219
+
220
+    // on ne fait rien si on a un secret dispo
221
+    if ($secret) {
222
+        return false;
223
+    }
224
+
225
+    // si force, on ne verifie pas la presence d'un backup chez un webmestre
226
+    if ($force) {
227
+        spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
228
+        $secret = $cles->getSecretAuth(true);
229
+        return true;
230
+    }
231
+
232
+    $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
233
+    $has_backup = array_column($has_backup, 'id_auteur');
234
+    if (empty($has_backup)) {
235
+        spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
236
+        if ($secret = $cles->getSecretAuth(true)) {
237
+            return true;
238
+        }
239
+        spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
240
+        // et on echoue car on ne veut pas que la situation reste telle quelle
241
+        raler_fichier(_DIR_ETC . 'cles.php');
242
+    }
243
+    else {
244
+        spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
245
+    }
246
+    return false;
247 247
 }
248 248
 
249 249
 /**
@@ -253,19 +253,19 @@  discard block
 block discarded – undo
253 253
  * @return array
254 254
  */
255 255
 function auth_spip_formulaire_login($flux) {
256
-	// javascript qui gere la securite du login en evitant de faire circuler le pass en clair
257
-	$js = file_get_contents(find_in_path('prive/javascript/login.js'));
258
-	$flux['data'] .=
259
-		  '<script type="text/javascript">/*<![CDATA[*/'
260
-		. "$js\n"
261
-		. "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
262
-		. "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
263
-		. "'informe_auteur_en_cours':false,"
264
-		. "'attente_informe':0};"
265
-		. "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
266
-		. '/*]]>*/</script>';
267
-
268
-	return $flux;
256
+    // javascript qui gere la securite du login en evitant de faire circuler le pass en clair
257
+    $js = file_get_contents(find_in_path('prive/javascript/login.js'));
258
+    $flux['data'] .=
259
+            '<script type="text/javascript">/*<![CDATA[*/'
260
+        . "$js\n"
261
+        . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
262
+        . "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
263
+        . "'informe_auteur_en_cours':false,"
264
+        . "'attente_informe':0};"
265
+        . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
266
+        . '/*]]>*/</script>';
267
+
268
+    return $flux;
269 269
 }
270 270
 
271 271
 
@@ -277,11 +277,11 @@  discard block
 block discarded – undo
277 277
  *   toujours true pour un auteur cree dans SPIP
278 278
  */
279 279
 function auth_spip_autoriser_modifier_login(string $serveur = ''): bool {
280
-	// les fonctions d'ecriture sur base distante sont encore incompletes
281
-	if (strlen($serveur)) {
282
-		return false;
283
-	}
284
-	return true;
280
+    // les fonctions d'ecriture sur base distante sont encore incompletes
281
+    if (strlen($serveur)) {
282
+        return false;
283
+    }
284
+    return true;
285 285
 }
286 286
 
287 287
 /**
@@ -295,25 +295,25 @@  discard block
 block discarded – undo
295 295
  *  message d'erreur si login non valide, chaine vide sinon
296 296
  */
297 297
 function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = '') {
298
-	// login et mot de passe
299
-	if (strlen($new_login)) {
300
-		if (strlen($new_login) < _LOGIN_TROP_COURT) {
301
-			return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
302
-		} else {
303
-			$n = sql_countsel(
304
-				'spip_auteurs',
305
-				'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
306
-				'',
307
-				'',
308
-				$serveur
309
-			);
310
-			if ($n) {
311
-				return _T('info_login_existant');
312
-			}
313
-		}
314
-	}
315
-
316
-	return '';
298
+    // login et mot de passe
299
+    if (strlen($new_login)) {
300
+        if (strlen($new_login) < _LOGIN_TROP_COURT) {
301
+            return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
302
+        } else {
303
+            $n = sql_countsel(
304
+                'spip_auteurs',
305
+                'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
306
+                '',
307
+                '',
308
+                $serveur
309
+            );
310
+            if ($n) {
311
+                return _T('info_login_existant');
312
+            }
313
+        }
314
+    }
315
+
316
+    return '';
317 317
 }
318 318
 
319 319
 /**
@@ -325,41 +325,41 @@  discard block
 block discarded – undo
325 325
  * @return bool
326 326
  */
327 327
 function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') {
328
-	if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
329
-		return false;
330
-	}
331
-	if (
332
-		!$id_auteur = intval($id_auteur)
333
-		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
334
-	) {
335
-		return false;
336
-	}
337
-	if ($new_login == $auteur['login']) {
338
-		return true;
339
-	} // on a rien fait mais c'est bon !
340
-
341
-	include_spip('action/editer_auteur');
342
-
343
-	// vider le login des auteurs a la poubelle qui avaient ce meme login
344
-	if (strlen($new_login)) {
345
-		$anciens = sql_allfetsel(
346
-			'id_auteur',
347
-			'spip_auteurs',
348
-			'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
349
-			'',
350
-			'',
351
-			'',
352
-			'',
353
-			$serveur
354
-		);
355
-		while ($row = array_pop($anciens)) {
356
-			auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
357
-		}
358
-	}
359
-
360
-	auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
361
-
362
-	return true;
328
+    if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
329
+        return false;
330
+    }
331
+    if (
332
+        !$id_auteur = intval($id_auteur)
333
+        or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
334
+    ) {
335
+        return false;
336
+    }
337
+    if ($new_login == $auteur['login']) {
338
+        return true;
339
+    } // on a rien fait mais c'est bon !
340
+
341
+    include_spip('action/editer_auteur');
342
+
343
+    // vider le login des auteurs a la poubelle qui avaient ce meme login
344
+    if (strlen($new_login)) {
345
+        $anciens = sql_allfetsel(
346
+            'id_auteur',
347
+            'spip_auteurs',
348
+            'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
349
+            '',
350
+            '',
351
+            '',
352
+            '',
353
+            $serveur
354
+        );
355
+        while ($row = array_pop($anciens)) {
356
+            auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
357
+        }
358
+    }
359
+
360
+    auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
361
+
362
+    return true;
363 363
 }
364 364
 
365 365
 /**
@@ -371,44 +371,44 @@  discard block
 block discarded – undo
371 371
  * @return string
372 372
  */
373 373
 function auth_spip_retrouver_login($login, $serveur = '') {
374
-	if (!strlen($login)) {
375
-		return null;
376
-	} // pas la peine de requeter
377
-	$l = sql_quote($login, $serveur, 'text');
378
-	if (
379
-		$r = sql_getfetsel(
380
-			'login',
381
-			'spip_auteurs',
382
-			"statut<>'5poubelle'" .
383
-			' AND (length(pass)>0)' .
384
-			" AND (login=$l)",
385
-			'',
386
-			'',
387
-			'',
388
-			'',
389
-			$serveur
390
-		)
391
-	) {
392
-		return $r;
393
-	}
394
-	// Si pas d'auteur avec ce login
395
-	// regarder s'il a saisi son nom ou son mail.
396
-	// Ne pas fusionner avec la requete precedente
397
-	// car un nom peut etre homonyme d'un autre login
398
-	else {
399
-		return sql_getfetsel(
400
-			'login',
401
-			'spip_auteurs',
402
-			"statut<>'5poubelle'" .
403
-			' AND (length(pass)>0)' .
404
-			" AND (login<>'' AND (nom=$l OR email=$l))",
405
-			'',
406
-			'',
407
-			'',
408
-			'',
409
-			$serveur
410
-		);
411
-	}
374
+    if (!strlen($login)) {
375
+        return null;
376
+    } // pas la peine de requeter
377
+    $l = sql_quote($login, $serveur, 'text');
378
+    if (
379
+        $r = sql_getfetsel(
380
+            'login',
381
+            'spip_auteurs',
382
+            "statut<>'5poubelle'" .
383
+            ' AND (length(pass)>0)' .
384
+            " AND (login=$l)",
385
+            '',
386
+            '',
387
+            '',
388
+            '',
389
+            $serveur
390
+        )
391
+    ) {
392
+        return $r;
393
+    }
394
+    // Si pas d'auteur avec ce login
395
+    // regarder s'il a saisi son nom ou son mail.
396
+    // Ne pas fusionner avec la requete precedente
397
+    // car un nom peut etre homonyme d'un autre login
398
+    else {
399
+        return sql_getfetsel(
400
+            'login',
401
+            'spip_auteurs',
402
+            "statut<>'5poubelle'" .
403
+            ' AND (length(pass)>0)' .
404
+            " AND (login<>'' AND (nom=$l OR email=$l))",
405
+            '',
406
+            '',
407
+            '',
408
+            '',
409
+            $serveur
410
+        );
411
+    }
412 412
 }
413 413
 
414 414
 /**
@@ -419,11 +419,11 @@  discard block
 block discarded – undo
419 419
  *  toujours true pour un auteur cree dans SPIP
420 420
  */
421 421
 function auth_spip_autoriser_modifier_pass(string $serveur = ''): bool {
422
-	// les fonctions d'ecriture sur base distante sont encore incompletes
423
-	if (strlen($serveur)) {
424
-		return false;
425
-	}
426
-	return true;
422
+    // les fonctions d'ecriture sur base distante sont encore incompletes
423
+    if (strlen($serveur)) {
424
+        return false;
425
+    }
426
+    return true;
427 427
 }
428 428
 
429 429
 
@@ -444,12 +444,12 @@  discard block
 block discarded – undo
444 444
  *  message d'erreur si login non valide, chaine vide sinon
445 445
  */
446 446
 function auth_spip_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = '') {
447
-	// login et mot de passe
448
-	if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
449
-		return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
450
-	}
447
+    // login et mot de passe
448
+    if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
449
+        return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
450
+    }
451 451
 
452
-	return '';
452
+    return '';
453 453
 }
454 454
 
455 455
 /**
@@ -463,48 +463,48 @@  discard block
 block discarded – undo
463 463
  * @return bool
464 464
  */
465 465
 function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') {
466
-	if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
467
-		return false;
468
-	}
469
-
470
-	if (
471
-		!$id_auteur = intval($id_auteur)
472
-		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
473
-	) {
474
-		return false;
475
-	}
476
-
477
-	include_spip('inc/chiffrer');
478
-	$cles = SpipCles::instance();
479
-	$secret = $cles->getSecretAuth();
480
-	if (!$secret) {
481
-		if (auth_spip_initialiser_secret()) {
482
-			$secret = $cles->getSecretAuth();
483
-		}
484
-		else {
485
-			return false;
486
-		}
487
-	}
488
-
489
-
490
-	include_spip('inc/acces');
491
-	$set = [
492
-		'pass' => Password::hacher($new_pass, $secret),
493
-		'htpass' => generer_htpass($new_pass),
494
-		'alea_actuel' => creer_uniqid(), // @deprecated 4.1
495
-		'alea_futur' => creer_uniqid(), // @deprecated 4.1
496
-		'low_sec' => '',
497
-	];
498
-
499
-	// si c'est un webmestre, on met a jour son backup des cles
500
-	if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') {
501
-		$set['backup_cles'] = $cles->backup($new_pass);
502
-	}
503
-
504
-	include_spip('action/editer_auteur');
505
-	auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
506
-
507
-	return true; // on a bien modifie le pass
466
+    if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
467
+        return false;
468
+    }
469
+
470
+    if (
471
+        !$id_auteur = intval($id_auteur)
472
+        or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
473
+    ) {
474
+        return false;
475
+    }
476
+
477
+    include_spip('inc/chiffrer');
478
+    $cles = SpipCles::instance();
479
+    $secret = $cles->getSecretAuth();
480
+    if (!$secret) {
481
+        if (auth_spip_initialiser_secret()) {
482
+            $secret = $cles->getSecretAuth();
483
+        }
484
+        else {
485
+            return false;
486
+        }
487
+    }
488
+
489
+
490
+    include_spip('inc/acces');
491
+    $set = [
492
+        'pass' => Password::hacher($new_pass, $secret),
493
+        'htpass' => generer_htpass($new_pass),
494
+        'alea_actuel' => creer_uniqid(), // @deprecated 4.1
495
+        'alea_futur' => creer_uniqid(), // @deprecated 4.1
496
+        'low_sec' => '',
497
+    ];
498
+
499
+    // si c'est un webmestre, on met a jour son backup des cles
500
+    if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') {
501
+        $set['backup_cles'] = $cles->backup($new_pass);
502
+    }
503
+
504
+    include_spip('action/editer_auteur');
505
+    auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
506
+
507
+    return true; // on a bien modifie le pass
508 508
 }
509 509
 
510 510
 /**
@@ -518,58 +518,58 @@  discard block
 block discarded – undo
518 518
  * @return void
519 519
  */
520 520
 function auth_spip_synchroniser_distant($id_auteur, $champs, $options = [], string $serveur = ''): void {
521
-	// ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
522
-	if (strlen($serveur)) {
523
-		return;
524
-	}
525
-	// si un login, pass ou statut a ete modifie
526
-	// regenerer les fichier htpass
527
-	if (
528
-		isset($champs['login'])
529
-		or isset($champs['pass'])
530
-		or isset($champs['statut'])
531
-		or (isset($options['all']) and $options['all'])
532
-	) {
533
-		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
534
-		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
535
-
536
-		// Cette variable de configuration peut etre posee par un plugin
537
-		// par exemple acces_restreint ;
538
-		// si .htaccess existe, outrepasser spip_meta
539
-		if (
540
-			(!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
541
-			and !@file_exists($htaccess)
542
-		) {
543
-			spip_unlink($htpasswd);
544
-			spip_unlink($htpasswd . '-admin');
545
-
546
-			return;
547
-		}
548
-
549
-		# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
550
-		# de devenir redacteur le cas echeant (auth http)... a nettoyer
551
-		// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
552
-
553
-		$p1 = ''; // login:htpass pour tous
554
-		$p2 = ''; // login:htpass pour les admins
555
-		$s = sql_select(
556
-			'login, htpass, statut',
557
-			'spip_auteurs',
558
-			sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
559
-		);
560
-		while ($t = sql_fetch($s)) {
561
-			if (strlen($t['login']) and strlen($t['htpass'])) {
562
-				$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
563
-				if ($t['statut'] == '0minirezo') {
564
-					$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
565
-				}
566
-			}
567
-		}
568
-		sql_free($s);
569
-		if ($p1) {
570
-			ecrire_fichier($htpasswd, $p1);
571
-			ecrire_fichier($htpasswd . '-admin', $p2);
572
-			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
573
-		}
574
-	}
521
+    // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
522
+    if (strlen($serveur)) {
523
+        return;
524
+    }
525
+    // si un login, pass ou statut a ete modifie
526
+    // regenerer les fichier htpass
527
+    if (
528
+        isset($champs['login'])
529
+        or isset($champs['pass'])
530
+        or isset($champs['statut'])
531
+        or (isset($options['all']) and $options['all'])
532
+    ) {
533
+        $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
534
+        $htpasswd = _DIR_TMP . _AUTH_USER_FILE;
535
+
536
+        // Cette variable de configuration peut etre posee par un plugin
537
+        // par exemple acces_restreint ;
538
+        // si .htaccess existe, outrepasser spip_meta
539
+        if (
540
+            (!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
541
+            and !@file_exists($htaccess)
542
+        ) {
543
+            spip_unlink($htpasswd);
544
+            spip_unlink($htpasswd . '-admin');
545
+
546
+            return;
547
+        }
548
+
549
+        # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
550
+        # de devenir redacteur le cas echeant (auth http)... a nettoyer
551
+        // attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
552
+
553
+        $p1 = ''; // login:htpass pour tous
554
+        $p2 = ''; // login:htpass pour les admins
555
+        $s = sql_select(
556
+            'login, htpass, statut',
557
+            'spip_auteurs',
558
+            sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
559
+        );
560
+        while ($t = sql_fetch($s)) {
561
+            if (strlen($t['login']) and strlen($t['htpass'])) {
562
+                $p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
563
+                if ($t['statut'] == '0minirezo') {
564
+                    $p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
565
+                }
566
+            }
567
+        }
568
+        sql_free($s);
569
+        if ($p1) {
570
+            ecrire_fichier($htpasswd, $p1);
571
+            ecrire_fichier($htpasswd . '-admin', $p2);
572
+            spip_log("Ecriture de $htpasswd et $htpasswd-admin");
573
+        }
574
+    }
575 575
 }
Please login to merge, or discard this patch.
ecrire/src/Chiffrer/Chiffrement.php 1 patch
Indentation   +70 added lines, -70 removed lines patch added patch discarded remove patch
@@ -19,78 +19,78 @@
 block discarded – undo
19 19
  * @link https://www.php.net/manual/fr/book.sodium.php
20 20
  */
21 21
 class Chiffrement {
22
-	/** Chiffre un message en utilisant une clé ou un mot de passe */
23
-	public static function chiffrer(
24
-		string $message,
25
-		#[\SensitiveParameter]
26
-		string $key
27
-	): ?string {
28
-		// create a random salt for key derivation
29
-		$salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES);
30
-		$key = self::deriveKeyFromPassword($key, $salt);
31
-		$nonce = random_bytes(\SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
32
-		$padded_message = sodium_pad($message, 16);
33
-		$encrypted = sodium_crypto_secretbox($padded_message, $nonce, $key);
34
-		$encoded = base64_encode($salt . $nonce . $encrypted);
35
-		sodium_memzero($key);
36
-		sodium_memzero($nonce);
37
-		sodium_memzero($salt);
38
-		#spip_log("chiffrer($message)=$encoded", 'chiffrer' . _LOG_DEBUG);
39
-		return $encoded;
40
-	}
22
+    /** Chiffre un message en utilisant une clé ou un mot de passe */
23
+    public static function chiffrer(
24
+        string $message,
25
+        #[\SensitiveParameter]
26
+        string $key
27
+    ): ?string {
28
+        // create a random salt for key derivation
29
+        $salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES);
30
+        $key = self::deriveKeyFromPassword($key, $salt);
31
+        $nonce = random_bytes(\SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
32
+        $padded_message = sodium_pad($message, 16);
33
+        $encrypted = sodium_crypto_secretbox($padded_message, $nonce, $key);
34
+        $encoded = base64_encode($salt . $nonce . $encrypted);
35
+        sodium_memzero($key);
36
+        sodium_memzero($nonce);
37
+        sodium_memzero($salt);
38
+        #spip_log("chiffrer($message)=$encoded", 'chiffrer' . _LOG_DEBUG);
39
+        return $encoded;
40
+    }
41 41
 
42
-	/** Déchiffre un message en utilisant une clé ou un mot de passe */
43
-	public static function dechiffrer(
44
-		string $encoded,
45
-		#[\SensitiveParameter]
46
-		string $key
47
-	): ?string {
48
-		$decoded = base64_decode($encoded);
49
-		$salt = substr($decoded, 0, \SODIUM_CRYPTO_PWHASH_SALTBYTES);
50
-		$nonce = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES, \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
51
-		$encrypted = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES + \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
52
-		$key = self::deriveKeyFromPassword($key, $salt);
53
-		$padded_message = sodium_crypto_secretbox_open($encrypted, $nonce, $key);
54
-		sodium_memzero($key);
55
-		sodium_memzero($nonce);
56
-		sodium_memzero($salt);
57
-		if ($padded_message === false) {
58
-			spip_log("dechiffrer() chiffre corrompu `$encoded`", 'chiffrer' . _LOG_DEBUG);
59
-			return null;
60
-		}
61
-		$message = sodium_unpad($padded_message, 16);
62
-		#spip_log("dechiffrer($encoded)=$message", 'chiffrer' . _LOG_DEBUG);
63
-		return $message;
64
-	}
42
+    /** Déchiffre un message en utilisant une clé ou un mot de passe */
43
+    public static function dechiffrer(
44
+        string $encoded,
45
+        #[\SensitiveParameter]
46
+        string $key
47
+    ): ?string {
48
+        $decoded = base64_decode($encoded);
49
+        $salt = substr($decoded, 0, \SODIUM_CRYPTO_PWHASH_SALTBYTES);
50
+        $nonce = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES, \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
51
+        $encrypted = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES + \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
52
+        $key = self::deriveKeyFromPassword($key, $salt);
53
+        $padded_message = sodium_crypto_secretbox_open($encrypted, $nonce, $key);
54
+        sodium_memzero($key);
55
+        sodium_memzero($nonce);
56
+        sodium_memzero($salt);
57
+        if ($padded_message === false) {
58
+            spip_log("dechiffrer() chiffre corrompu `$encoded`", 'chiffrer' . _LOG_DEBUG);
59
+            return null;
60
+        }
61
+        $message = sodium_unpad($padded_message, 16);
62
+        #spip_log("dechiffrer($encoded)=$message", 'chiffrer' . _LOG_DEBUG);
63
+        return $message;
64
+    }
65 65
 
66
-	/** Génère une clé de la taille attendue pour le chiffrement */
67
-	public static function keygen(): string {
68
-		return sodium_crypto_secretbox_keygen();
69
-	}
66
+    /** Génère une clé de la taille attendue pour le chiffrement */
67
+    public static function keygen(): string {
68
+        return sodium_crypto_secretbox_keygen();
69
+    }
70 70
 
71
-	/**
72
-	 * Retourne une clé de la taille attendue pour le chiffrement
73
-	 *
74
-	 * Notamment si on utilise un mot de passe comme clé, il faut le hacher
75
-	 * pour servir de clé à la taille correspondante.
76
-	 */
77
-	private static function deriveKeyFromPassword(
78
-		#[\SensitiveParameter]
79
-		string $password,
80
-		string $salt
81
-	): string {
82
-		if (strlen($password) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
83
-			return $password;
84
-		}
85
-		$key = sodium_crypto_pwhash(
86
-			\SODIUM_CRYPTO_SECRETBOX_KEYBYTES,
87
-			$password,
88
-			$salt,
89
-			\SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
90
-			\SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
91
-		);
92
-		sodium_memzero($password);
71
+    /**
72
+     * Retourne une clé de la taille attendue pour le chiffrement
73
+     *
74
+     * Notamment si on utilise un mot de passe comme clé, il faut le hacher
75
+     * pour servir de clé à la taille correspondante.
76
+     */
77
+    private static function deriveKeyFromPassword(
78
+        #[\SensitiveParameter]
79
+        string $password,
80
+        string $salt
81
+    ): string {
82
+        if (strlen($password) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
83
+            return $password;
84
+        }
85
+        $key = sodium_crypto_pwhash(
86
+            \SODIUM_CRYPTO_SECRETBOX_KEYBYTES,
87
+            $password,
88
+            $salt,
89
+            \SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
90
+            \SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
91
+        );
92
+        sodium_memzero($password);
93 93
 
94
-		return $key;
95
-	}
94
+        return $key;
95
+    }
96 96
 }
Please login to merge, or discard this patch.
ecrire/src/Chiffrer/SpipCles.php 1 patch
Indentation   +167 added lines, -167 removed lines patch added patch discarded remove patch
@@ -14,171 +14,171 @@
 block discarded – undo
14 14
 
15 15
 /** Gestion des clés d’authentification / chiffrement de SPIP */
16 16
 final class SpipCles {
17
-	private static array $instances = [];
18
-
19
-	private string $file = _DIR_ETC . 'cles.php';
20
-	private Cles $cles;
21
-
22
-	public static function instance(string $file = ''): self {
23
-		if (empty(self::$instances[$file])) {
24
-			self::$instances[$file] = new self($file);
25
-		}
26
-		return self::$instances[$file];
27
-	}
28
-
29
-	/**
30
-	 * Retourne le secret du site (shorthand)
31
-	 * @uses self::getSecretSite()
32
-	 */
33
-	public static function secret_du_site(): ?string {
34
-		return (self::instance())->getSecretSite();
35
-	}
36
-
37
-	private function __construct(string $file = '') {
38
-		if ($file) {
39
-			$this->file = $file;
40
-		}
41
-		$this->cles = new Cles($this->read());
42
-	}
43
-
44
-	/**
45
-	 * Renvoyer le secret du site
46
-	 *
47
-	 * Le secret du site doit rester aussi secret que possible, et est eternel
48
-	 * On ne doit pas l'exporter
49
-	 *
50
-	 * Le secret est partagé entre une clé disque et une clé bdd
51
-	 *
52
-	 * @return string
53
-	 */
54
-	public function getSecretSite(bool $autoInit = true): ?string {
55
-		$key = $this->getKey('secret_du_site', $autoInit);
56
-		$meta = $this->getMetaKey('secret_du_site', $autoInit);
57
-		// conserve la même longeur.
58
-		return $key ^ $meta;
59
-	}
60
-
61
-	/** Renvoyer le secret des authentifications */
62
-	public function getSecretAuth(bool $autoInit = false): ?string {
63
-		return $this->getKey('secret_des_auth', $autoInit);
64
-	}
65
-	public function save(): bool {
66
-		return ecrire_fichier_securise($this->file, $this->cles->toJson());
67
-	}
68
-
69
-	/**
70
-	 * Fournir une sauvegarde chiffree des cles (a l'aide d'une autre clé, comme le pass d'un auteur)
71
-	 *
72
-	 * @param string $withKey Clé de chiffrage de la sauvegarde
73
-	 * @return string Contenu de la sauvegarde chiffrée générée
74
-	 */
75
-	public function backup(
76
-		#[\SensitiveParameter]
77
-		string $withKey
78
-	): string {
79
-		if (count($this->cles)) {
80
-			return Chiffrement::chiffrer($this->cles->toJson(), $withKey);
81
-		}
82
-		return '';
83
-	}
84
-
85
-	/**
86
-	 * Restaurer les cles manquantes depuis une sauvegarde chiffree des cles
87
-	 * (si la sauvegarde est bien valide)
88
-	 *
89
-	 * @param string $backup Sauvegarde chiffrée (générée par backup())
90
-	 * @param int $id_auteur
91
-	 * @param string $pass
92
-	 * @return void
93
-	 */
94
-	public function restore(
95
-		string $backup,
96
-		#[\SensitiveParameter]
97
-		string $password_clair,
98
-		#[\SensitiveParameter]
99
-		string $password_hash,
100
-		int $id_auteur
101
-	): bool {
102
-		if (empty($backup)) {
103
-			return false;
104
-		}
105
-
106
-		$sauvegarde = Chiffrement::dechiffrer($backup, $password_clair);
107
-		$json = json_decode($sauvegarde, true);
108
-		if (!$json) {
109
-			return false;
110
-		}
111
-
112
-		// cela semble une sauvegarde valide
113
-		$cles_potentielles = array_map('base64_decode', $json);
114
-
115
-		// il faut faire une double verif sur secret_des_auth
116
-		// pour s'assurer qu'elle permet bien de decrypter le pass de l'auteur qui fournit la sauvegarde
117
-		// et par extension tous les passwords
118
-		if (!empty($cles_potentielles['secret_des_auth'])) {
119
-			if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) {
120
-				spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE);
121
-				unset($cles_potentielles['secret_des_auth']);
122
-			}
123
-		}
124
-
125
-		// on merge les cles pour recuperer les cles manquantes
126
-		$restauration = false;
127
-		foreach ($cles_potentielles as $name => $key) {
128
-			if (!$this->cles->has($name)) {
129
-				$this->cles->set($name, $key);
130
-				spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE);
131
-				$restauration = true;
132
-			}
133
-		}
134
-		return $restauration;
135
-	}
136
-
137
-	private function getKey(string $name, bool $autoInit): ?string {
138
-		if ($this->cles->has($name)) {
139
-			return $this->cles->get($name);
140
-		}
141
-		if ($autoInit) {
142
-			$this->cles->generate($name);
143
-			// si l'ecriture de fichier a bien marche on peut utiliser la cle
144
-			if ($this->save()) {
145
-				return $this->cles->get($name);
146
-			}
147
-			// sinon loger et annule la cle generee car il ne faut pas l'utiliser
148
-			spip_log("Echec ecriture du fichier cle ".$this->file." ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR);
149
-			$this->cles->delete($name);
150
-		}
151
-		return null;
152
-	}
153
-
154
-	private function getMetaKey(string $name, bool $autoInit = true): ?string {
155
-		if (!isset($GLOBALS['meta'][$name])) {
156
-			include_spip('base/abstract_sql');
157
-			$GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string'));
158
-		}
159
-		$key = base64_decode($GLOBALS['meta'][$name] ?? '');
160
-		if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
161
-			return $key;
162
-		}
163
-		if (!$autoInit) {
164
-			return null;
165
-		}
166
-		$key = Chiffrement::keygen();
167
-		ecrire_meta($name, base64_encode($key), 'non');
168
-		lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas
169
-
170
-		return $key;
171
-	}
172
-
173
-	private function read(): array {
174
-		lire_fichier_securise($this->file, $json);
175
-		if (
176
-			$json
177
-			and $json = \json_decode($json, true)
178
-			and is_array($json)
179
-		) {
180
-			return array_map('base64_decode', $json);
181
-		}
182
-		return [];
183
-	}
17
+    private static array $instances = [];
18
+
19
+    private string $file = _DIR_ETC . 'cles.php';
20
+    private Cles $cles;
21
+
22
+    public static function instance(string $file = ''): self {
23
+        if (empty(self::$instances[$file])) {
24
+            self::$instances[$file] = new self($file);
25
+        }
26
+        return self::$instances[$file];
27
+    }
28
+
29
+    /**
30
+     * Retourne le secret du site (shorthand)
31
+     * @uses self::getSecretSite()
32
+     */
33
+    public static function secret_du_site(): ?string {
34
+        return (self::instance())->getSecretSite();
35
+    }
36
+
37
+    private function __construct(string $file = '') {
38
+        if ($file) {
39
+            $this->file = $file;
40
+        }
41
+        $this->cles = new Cles($this->read());
42
+    }
43
+
44
+    /**
45
+     * Renvoyer le secret du site
46
+     *
47
+     * Le secret du site doit rester aussi secret que possible, et est eternel
48
+     * On ne doit pas l'exporter
49
+     *
50
+     * Le secret est partagé entre une clé disque et une clé bdd
51
+     *
52
+     * @return string
53
+     */
54
+    public function getSecretSite(bool $autoInit = true): ?string {
55
+        $key = $this->getKey('secret_du_site', $autoInit);
56
+        $meta = $this->getMetaKey('secret_du_site', $autoInit);
57
+        // conserve la même longeur.
58
+        return $key ^ $meta;
59
+    }
60
+
61
+    /** Renvoyer le secret des authentifications */
62
+    public function getSecretAuth(bool $autoInit = false): ?string {
63
+        return $this->getKey('secret_des_auth', $autoInit);
64
+    }
65
+    public function save(): bool {
66
+        return ecrire_fichier_securise($this->file, $this->cles->toJson());
67
+    }
68
+
69
+    /**
70
+     * Fournir une sauvegarde chiffree des cles (a l'aide d'une autre clé, comme le pass d'un auteur)
71
+     *
72
+     * @param string $withKey Clé de chiffrage de la sauvegarde
73
+     * @return string Contenu de la sauvegarde chiffrée générée
74
+     */
75
+    public function backup(
76
+        #[\SensitiveParameter]
77
+        string $withKey
78
+    ): string {
79
+        if (count($this->cles)) {
80
+            return Chiffrement::chiffrer($this->cles->toJson(), $withKey);
81
+        }
82
+        return '';
83
+    }
84
+
85
+    /**
86
+     * Restaurer les cles manquantes depuis une sauvegarde chiffree des cles
87
+     * (si la sauvegarde est bien valide)
88
+     *
89
+     * @param string $backup Sauvegarde chiffrée (générée par backup())
90
+     * @param int $id_auteur
91
+     * @param string $pass
92
+     * @return void
93
+     */
94
+    public function restore(
95
+        string $backup,
96
+        #[\SensitiveParameter]
97
+        string $password_clair,
98
+        #[\SensitiveParameter]
99
+        string $password_hash,
100
+        int $id_auteur
101
+    ): bool {
102
+        if (empty($backup)) {
103
+            return false;
104
+        }
105
+
106
+        $sauvegarde = Chiffrement::dechiffrer($backup, $password_clair);
107
+        $json = json_decode($sauvegarde, true);
108
+        if (!$json) {
109
+            return false;
110
+        }
111
+
112
+        // cela semble une sauvegarde valide
113
+        $cles_potentielles = array_map('base64_decode', $json);
114
+
115
+        // il faut faire une double verif sur secret_des_auth
116
+        // pour s'assurer qu'elle permet bien de decrypter le pass de l'auteur qui fournit la sauvegarde
117
+        // et par extension tous les passwords
118
+        if (!empty($cles_potentielles['secret_des_auth'])) {
119
+            if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) {
120
+                spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE);
121
+                unset($cles_potentielles['secret_des_auth']);
122
+            }
123
+        }
124
+
125
+        // on merge les cles pour recuperer les cles manquantes
126
+        $restauration = false;
127
+        foreach ($cles_potentielles as $name => $key) {
128
+            if (!$this->cles->has($name)) {
129
+                $this->cles->set($name, $key);
130
+                spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE);
131
+                $restauration = true;
132
+            }
133
+        }
134
+        return $restauration;
135
+    }
136
+
137
+    private function getKey(string $name, bool $autoInit): ?string {
138
+        if ($this->cles->has($name)) {
139
+            return $this->cles->get($name);
140
+        }
141
+        if ($autoInit) {
142
+            $this->cles->generate($name);
143
+            // si l'ecriture de fichier a bien marche on peut utiliser la cle
144
+            if ($this->save()) {
145
+                return $this->cles->get($name);
146
+            }
147
+            // sinon loger et annule la cle generee car il ne faut pas l'utiliser
148
+            spip_log("Echec ecriture du fichier cle ".$this->file." ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR);
149
+            $this->cles->delete($name);
150
+        }
151
+        return null;
152
+    }
153
+
154
+    private function getMetaKey(string $name, bool $autoInit = true): ?string {
155
+        if (!isset($GLOBALS['meta'][$name])) {
156
+            include_spip('base/abstract_sql');
157
+            $GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string'));
158
+        }
159
+        $key = base64_decode($GLOBALS['meta'][$name] ?? '');
160
+        if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
161
+            return $key;
162
+        }
163
+        if (!$autoInit) {
164
+            return null;
165
+        }
166
+        $key = Chiffrement::keygen();
167
+        ecrire_meta($name, base64_encode($key), 'non');
168
+        lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas
169
+
170
+        return $key;
171
+    }
172
+
173
+    private function read(): array {
174
+        lire_fichier_securise($this->file, $json);
175
+        if (
176
+            $json
177
+            and $json = \json_decode($json, true)
178
+            and is_array($json)
179
+        ) {
180
+            return array_map('base64_decode', $json);
181
+        }
182
+        return [];
183
+    }
184 184
 }
Please login to merge, or discard this patch.