Completed
Push — master ( e9ce2d...38e4b2 )
by cam
01:04
created
ecrire/lang/spip_fr_tu.php 1 patch
Indentation   +668 added lines, -668 removed lines patch added patch discarded remove patch
@@ -4,247 +4,247 @@  discard block
 block discarded – undo
4 4
 // ** ne pas modifier le fichier **
5 5
 
6 6
 if (!defined('_ECRIRE_INC_VERSION')) {
7
-	return;
7
+    return;
8 8
 }
9 9
 
10 10
 $GLOBALS[$GLOBALS['idx_lang']] = array(
11 11
 
12
-	// A
13
-	'access_interface_graphique' => 'Retour à l’interface graphique complète',
14
-	'access_mode_texte' => 'Afficher l’interface textuelle simplifiée',
15
-	'admin_debug' => 'debug',
16
-	'admin_modifier_article' => 'Modifier cet article',
17
-	'admin_modifier_auteur' => 'Modifier cet auteur',
18
-	'admin_modifier_breve' => 'Modifier cette brève',
19
-	'admin_modifier_mot' => 'Modifier ce mot-clé',
20
-	'admin_modifier_rubrique' => 'Modifier cette rubrique',
21
-	'admin_recalculer' => 'Recalculer cette page',
22
-	'afficher_calendrier' => 'Afficher le calendrier',
23
-	'afficher_trad' => 'afficher les traductions',
24
-	'alerte_maj_impossible' => '<b>Alerte !</b> La mise à jour de la base SQL vers la version @version@ est impossible, peut-être à cause d’un problème de droit de modification sur la base de données. Contacte ton hébergeur.',
25
-	'alerte_modif_info_concourante' => 'ATTENTION : Cette information a été modifiée par ailleurs. La valeur actuelle est :',
26
-	'analyse_xml' => 'Analyse XML',
27
-	'annuler' => 'Annuler',
28
-	'antispam_champ_vide' => 'Laisse ce champ vide :',
29
-	'articles_recents' => 'Articles les plus récents',
30
-	'attention_champ_mini_nb_caractères' => 'Attention ! @nb@ caractères au minimum',
31
-	'avis_1_erreur_saisie' => 'Il y a 1 erreur dans dans ta saisie, vérifie les informations.',
32
-	'avis_archive_incorrect' => 'le fichier archive n’est pas un fichier SPIP',
33
-	'avis_archive_invalide' => 'le fichier archive n’est pas valide',
34
-	'avis_attention' => 'ATTENTION !',
35
-	'avis_champ_incorrect_type_objet' => 'Nom de champ incorrect @name@ pour objet de type @type@',
36
-	'avis_colonne_inexistante' => 'La colonne @col@ n’existe pas',
37
-	'avis_erreur' => 'Erreur : voir ci-dessous',
38
-	'avis_erreur_connexion' => 'Erreur de connexion',
39
-	'avis_erreur_cookie' => 'problème de cookie',
40
-	'avis_erreur_fonction_contexte' => 'Erreur de programmation. Cette fonction ne doit pas être appelée dans ce contexte.',
41
-	'avis_erreur_mysql' => 'Erreur SQL',
42
-	'avis_erreur_sauvegarde' => 'Erreur dans la sauvegarde (@type@ @id_objet@) !',
43
-	'avis_erreur_visiteur' => 'Problème d’accès à l’espace privé',
44
-	'avis_nb_erreurs_saisie' => 'Il y a @nb@ erreurs dans ta saisie, vérifie les informations.',
12
+    // A
13
+    'access_interface_graphique' => 'Retour à l’interface graphique complète',
14
+    'access_mode_texte' => 'Afficher l’interface textuelle simplifiée',
15
+    'admin_debug' => 'debug',
16
+    'admin_modifier_article' => 'Modifier cet article',
17
+    'admin_modifier_auteur' => 'Modifier cet auteur',
18
+    'admin_modifier_breve' => 'Modifier cette brève',
19
+    'admin_modifier_mot' => 'Modifier ce mot-clé',
20
+    'admin_modifier_rubrique' => 'Modifier cette rubrique',
21
+    'admin_recalculer' => 'Recalculer cette page',
22
+    'afficher_calendrier' => 'Afficher le calendrier',
23
+    'afficher_trad' => 'afficher les traductions',
24
+    'alerte_maj_impossible' => '<b>Alerte !</b> La mise à jour de la base SQL vers la version @version@ est impossible, peut-être à cause d’un problème de droit de modification sur la base de données. Contacte ton hébergeur.',
25
+    'alerte_modif_info_concourante' => 'ATTENTION : Cette information a été modifiée par ailleurs. La valeur actuelle est :',
26
+    'analyse_xml' => 'Analyse XML',
27
+    'annuler' => 'Annuler',
28
+    'antispam_champ_vide' => 'Laisse ce champ vide :',
29
+    'articles_recents' => 'Articles les plus récents',
30
+    'attention_champ_mini_nb_caractères' => 'Attention ! @nb@ caractères au minimum',
31
+    'avis_1_erreur_saisie' => 'Il y a 1 erreur dans dans ta saisie, vérifie les informations.',
32
+    'avis_archive_incorrect' => 'le fichier archive n’est pas un fichier SPIP',
33
+    'avis_archive_invalide' => 'le fichier archive n’est pas valide',
34
+    'avis_attention' => 'ATTENTION !',
35
+    'avis_champ_incorrect_type_objet' => 'Nom de champ incorrect @name@ pour objet de type @type@',
36
+    'avis_colonne_inexistante' => 'La colonne @col@ n’existe pas',
37
+    'avis_erreur' => 'Erreur : voir ci-dessous',
38
+    'avis_erreur_connexion' => 'Erreur de connexion',
39
+    'avis_erreur_cookie' => 'problème de cookie',
40
+    'avis_erreur_fonction_contexte' => 'Erreur de programmation. Cette fonction ne doit pas être appelée dans ce contexte.',
41
+    'avis_erreur_mysql' => 'Erreur SQL',
42
+    'avis_erreur_sauvegarde' => 'Erreur dans la sauvegarde (@type@ @id_objet@) !',
43
+    'avis_erreur_visiteur' => 'Problème d’accès à l’espace privé',
44
+    'avis_nb_erreurs_saisie' => 'Il y a @nb@ erreurs dans ta saisie, vérifie les informations.',
45 45
 
46
-	// B
47
-	'barre_a_accent_grave' => 'Insérer un A accent grave majuscule',
48
-	'barre_aide' => 'Utilise les raccourcis typographiques pour enrichir ta mise en page',
49
-	'barre_e_accent_aigu' => 'Insérer un E accent aigu majuscule',
50
-	'barre_eo' => 'Insérer un E dans l’O',
51
-	'barre_eo_maj' => 'Insérer un E dans l’O majuscule',
52
-	'barre_euro' => 'Insérer le symbole ?',
53
-	'barre_gras' => 'Mettre en {{gras}}',
54
-	'barre_guillemets' => 'Entourer de « guillemets français »',
55
-	'barre_guillemets_simples' => 'Entourer de ?guillemets de second niveau ?',
56
-	'barre_intertitre' => 'Transformer en {{{intertitre}}}',
57
-	'barre_italic' => 'Mettre en {italique}',
58
-	'barre_lien' => 'Transformer en [lien hypertexte->http://...]',
59
-	'barre_lien_input' => 'Indiquer l’adresse de ton lien (tu peux indiquer une adresse Web sous la forme http://www.monsite/com ou simplement indiquer le numéro d’un article de ce site.',
60
-	'barre_note' => 'Transformer en [[Note de bas de page]]',
61
-	'barre_paragraphe' => 'Crée un paragraphe',
62
-	'barre_quote' => '<quote>Citer un message</quote>',
63
-	'bouton_changer' => 'Changer',
64
-	'bouton_chercher' => 'Chercher',
65
-	'bouton_choisir' => 'Choisir',
66
-	'bouton_deplacer' => 'Déplacer',
67
-	'bouton_download' => 'Télécharger',
68
-	'bouton_enregistrer' => 'Enregistrer',
69
-	'bouton_radio_desactiver_messagerie_interne' => 'Désactiver la messagerie interne',
70
-	'bouton_radio_envoi_annonces' => 'Envoyer les annonces éditoriales',
71
-	'bouton_radio_non_envoi_annonces' => 'Ne pas envoyer d’annonces',
72
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
73
-	'bouton_recharger_page' => 'recharger cette page',
74
-	'bouton_telecharger' => 'Télécharger',
75
-	'bouton_upload' => 'Téléverser',
76
-	'bouton_valider' => 'Valider',
46
+    // B
47
+    'barre_a_accent_grave' => 'Insérer un A accent grave majuscule',
48
+    'barre_aide' => 'Utilise les raccourcis typographiques pour enrichir ta mise en page',
49
+    'barre_e_accent_aigu' => 'Insérer un E accent aigu majuscule',
50
+    'barre_eo' => 'Insérer un E dans l’O',
51
+    'barre_eo_maj' => 'Insérer un E dans l’O majuscule',
52
+    'barre_euro' => 'Insérer le symbole ?',
53
+    'barre_gras' => 'Mettre en {{gras}}',
54
+    'barre_guillemets' => 'Entourer de « guillemets français »',
55
+    'barre_guillemets_simples' => 'Entourer de ?guillemets de second niveau ?',
56
+    'barre_intertitre' => 'Transformer en {{{intertitre}}}',
57
+    'barre_italic' => 'Mettre en {italique}',
58
+    'barre_lien' => 'Transformer en [lien hypertexte->http://...]',
59
+    'barre_lien_input' => 'Indiquer l’adresse de ton lien (tu peux indiquer une adresse Web sous la forme http://www.monsite/com ou simplement indiquer le numéro d’un article de ce site.',
60
+    'barre_note' => 'Transformer en [[Note de bas de page]]',
61
+    'barre_paragraphe' => 'Crée un paragraphe',
62
+    'barre_quote' => '<quote>Citer un message</quote>',
63
+    'bouton_changer' => 'Changer',
64
+    'bouton_chercher' => 'Chercher',
65
+    'bouton_choisir' => 'Choisir',
66
+    'bouton_deplacer' => 'Déplacer',
67
+    'bouton_download' => 'Télécharger',
68
+    'bouton_enregistrer' => 'Enregistrer',
69
+    'bouton_radio_desactiver_messagerie_interne' => 'Désactiver la messagerie interne',
70
+    'bouton_radio_envoi_annonces' => 'Envoyer les annonces éditoriales',
71
+    'bouton_radio_non_envoi_annonces' => 'Ne pas envoyer d’annonces',
72
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
73
+    'bouton_recharger_page' => 'recharger cette page',
74
+    'bouton_telecharger' => 'Télécharger',
75
+    'bouton_upload' => 'Téléverser',
76
+    'bouton_valider' => 'Valider',
77 77
 
78
-	// C
79
-	'cal_apresmidi' => 'après-midi',
80
-	'cal_jour_entier' => 'jour entier',
81
-	'cal_matin' => 'matin',
82
-	'cal_par_jour' => 'calendrier par jour',
83
-	'cal_par_mois' => 'calendrier par mois',
84
-	'cal_par_semaine' => 'calendrier par semaine',
85
-	'choix_couleur_interface' => 'couleur ',
86
-	'choix_interface' => 'choix  de l’interface',
87
-	'colonne' => 'Colonne',
88
-	'confirm_changer_statut' => 'Attention, tu as demandé à changer le statut de cet élément. Souhaites-tu continuer ?',
89
-	'correcte' => 'correcte',
78
+    // C
79
+    'cal_apresmidi' => 'après-midi',
80
+    'cal_jour_entier' => 'jour entier',
81
+    'cal_matin' => 'matin',
82
+    'cal_par_jour' => 'calendrier par jour',
83
+    'cal_par_mois' => 'calendrier par mois',
84
+    'cal_par_semaine' => 'calendrier par semaine',
85
+    'choix_couleur_interface' => 'couleur ',
86
+    'choix_interface' => 'choix  de l’interface',
87
+    'colonne' => 'Colonne',
88
+    'confirm_changer_statut' => 'Attention, tu as demandé à changer le statut de cet élément. Souhaites-tu continuer ?',
89
+    'correcte' => 'correcte',
90 90
 
91
-	// D
92
-	'date_aujourdhui' => 'aujourd’hui',
93
-	'date_avant_jc' => 'av. J.C.',
94
-	'date_dans' => 'dans @delai@',
95
-	'date_de_mois_1' => '@j@ @nommois@',
96
-	'date_de_mois_10' => '@j@ @nommois@',
97
-	'date_de_mois_11' => '@j@ @nommois@',
98
-	'date_de_mois_12' => '@j@ @nommois@',
99
-	'date_de_mois_2' => '@j@ @nommois@',
100
-	'date_de_mois_3' => '@j@ @nommois@',
101
-	'date_de_mois_4' => '@j@ @nommois@',
102
-	'date_de_mois_5' => '@j@ @nommois@',
103
-	'date_de_mois_6' => '@j@ @nommois@',
104
-	'date_de_mois_7' => '@j@ @nommois@',
105
-	'date_de_mois_8' => '@j@ @nommois@',
106
-	'date_de_mois_9' => '@j@ @nommois@',
107
-	'date_demain' => 'demain',
108
-	'date_fmt_heures_minutes' => '@h@h@m@min',
109
-	'date_fmt_heures_minutes_court' => '@h@h@m@',
110
-	'date_fmt_jour' => '@nomjour@ @jour@',
111
-	'date_fmt_jour_heure' => '@jour@ à @heure@',
112
-	'date_fmt_jour_heure_debut_fin' => 'le @jour@ de @heure_debut@ à @heure_fin@',
113
-	'date_fmt_jour_heure_debut_fin_abbr' => 'le @dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtstart@@heure_fin@@dtend@',
114
-	'date_fmt_jour_mois' => '@jour@ @nommois@',
115
-	'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
116
-	'date_fmt_mois_annee' => '@nommois@ @annee@',
117
-	'date_fmt_nomjour' => '@nomjour@ @date@',
118
-	'date_fmt_nomjour_date' => 'le @nomjour@ @date@',
119
-	'date_fmt_periode' => 'Du @date_debut@ au @date_fin@',
120
-	'date_fmt_periode_abbr' => 'Du @dtart@@date_debut@@dtabbr@ au @dtend@@date_fin@@dtabbr@',
121
-	'date_fmt_periode_from' => 'Du',
122
-	'date_fmt_periode_to' => 'au',
123
-	'date_fmt_saison_annee' => '@saison@ @annee@',
124
-	'date_heures' => 'heures',
125
-	'date_hier' => 'hier',
126
-	'date_il_y_a' => 'il y a @delai@',
127
-	'date_jnum1' => '1er',
128
-	'date_jnum10' => '10',
129
-	'date_jnum11' => '11',
130
-	'date_jnum12' => '12',
131
-	'date_jnum13' => '13',
132
-	'date_jnum14' => '14',
133
-	'date_jnum15' => '15',
134
-	'date_jnum16' => '16',
135
-	'date_jnum17' => '17',
136
-	'date_jnum18' => '18',
137
-	'date_jnum19' => '19',
138
-	'date_jnum2' => '2',
139
-	'date_jnum20' => '20',
140
-	'date_jnum21' => '21',
141
-	'date_jnum22' => '22',
142
-	'date_jnum23' => '23',
143
-	'date_jnum24' => '24',
144
-	'date_jnum25' => '25',
145
-	'date_jnum26' => '26',
146
-	'date_jnum27' => '27',
147
-	'date_jnum28' => '28',
148
-	'date_jnum29' => '29',
149
-	'date_jnum3' => '3',
150
-	'date_jnum30' => '30',
151
-	'date_jnum31' => '31',
152
-	'date_jnum4' => '4',
153
-	'date_jnum5' => '5',
154
-	'date_jnum6' => '6',
155
-	'date_jnum7' => '7',
156
-	'date_jnum8' => '8',
157
-	'date_jnum9' => '9',
158
-	'date_jour_1' => 'dimanche',
159
-	'date_jour_1_abbr' => 'dim.',
160
-	'date_jour_1_initiale' => 'd.',
161
-	'date_jour_2' => 'lundi',
162
-	'date_jour_2_abbr' => 'lun.',
163
-	'date_jour_2_initiale' => 'l.',
164
-	'date_jour_3' => 'mardi',
165
-	'date_jour_3_abbr' => 'mar.',
166
-	'date_jour_3_initiale' => 'm.',
167
-	'date_jour_4' => 'mercredi',
168
-	'date_jour_4_abbr' => 'mer.',
169
-	'date_jour_4_initiale' => 'm.',
170
-	'date_jour_5' => 'jeudi',
171
-	'date_jour_5_abbr' => 'jeu.',
172
-	'date_jour_5_initiale' => 'j.',
173
-	'date_jour_6' => 'vendredi',
174
-	'date_jour_6_abbr' => 'ven.',
175
-	'date_jour_6_initiale' => 'v.',
176
-	'date_jour_7' => 'samedi',
177
-	'date_jour_7_abbr' => 'sam.',
178
-	'date_jour_7_initiale' => 's.',
179
-	'date_jours' => 'jours',
180
-	'date_minutes' => 'minutes',
181
-	'date_mois' => 'mois',
182
-	'date_mois_1' => 'janvier',
183
-	'date_mois_10' => 'octobre',
184
-	'date_mois_10_abbr' => 'oct.',
185
-	'date_mois_11' => 'novembre',
186
-	'date_mois_11_abbr' => 'nov.',
187
-	'date_mois_12' => 'décembre',
188
-	'date_mois_12_abbr' => 'déc.',
189
-	'date_mois_1_abbr' => 'janv.',
190
-	'date_mois_2' => 'février',
191
-	'date_mois_2_abbr' => 'févr.',
192
-	'date_mois_3' => 'mars',
193
-	'date_mois_3_abbr' => 'mars',
194
-	'date_mois_4' => 'avril',
195
-	'date_mois_4_abbr' => 'avr.',
196
-	'date_mois_5' => 'mai',
197
-	'date_mois_5_abbr' => 'mai',
198
-	'date_mois_6' => 'juin',
199
-	'date_mois_6_abbr' => 'juin',
200
-	'date_mois_7' => 'juillet',
201
-	'date_mois_7_abbr' => 'juil.',
202
-	'date_mois_8' => 'août',
203
-	'date_mois_8_abbr' => 'août',
204
-	'date_mois_9' => 'septembre',
205
-	'date_mois_9_abbr' => 'sept.',
206
-	'date_saison_1' => 'hiver',
207
-	'date_saison_2' => 'printemps',
208
-	'date_saison_3' => 'été',
209
-	'date_saison_4' => 'automne',
210
-	'date_secondes' => 'secondes',
211
-	'date_semaines' => 'semaines',
212
-	'date_un_mois' => 'mois',
213
-	'date_une_heure' => 'heure',
214
-	'date_une_minute' => 'minute',
215
-	'date_une_seconde' => 'seconde',
216
-	'date_une_semaine' => 'semaine',
217
-	'dirs_commencer' => ' afin de commencer réellement l’installation',
218
-	'dirs_preliminaire' => 'Préliminaire : <b>Régler les droits d’accès</b>',
219
-	'dirs_probleme_droits' => 'Problème de droits d’accès',
220
-	'dirs_repertoires_absents' => '<p><b>Les répertoires suivants n’ont pas été trouvés :</b></p><ul>@bad_dirs@.</ul>
91
+    // D
92
+    'date_aujourdhui' => 'aujourd’hui',
93
+    'date_avant_jc' => 'av. J.C.',
94
+    'date_dans' => 'dans @delai@',
95
+    'date_de_mois_1' => '@j@ @nommois@',
96
+    'date_de_mois_10' => '@j@ @nommois@',
97
+    'date_de_mois_11' => '@j@ @nommois@',
98
+    'date_de_mois_12' => '@j@ @nommois@',
99
+    'date_de_mois_2' => '@j@ @nommois@',
100
+    'date_de_mois_3' => '@j@ @nommois@',
101
+    'date_de_mois_4' => '@j@ @nommois@',
102
+    'date_de_mois_5' => '@j@ @nommois@',
103
+    'date_de_mois_6' => '@j@ @nommois@',
104
+    'date_de_mois_7' => '@j@ @nommois@',
105
+    'date_de_mois_8' => '@j@ @nommois@',
106
+    'date_de_mois_9' => '@j@ @nommois@',
107
+    'date_demain' => 'demain',
108
+    'date_fmt_heures_minutes' => '@h@h@m@min',
109
+    'date_fmt_heures_minutes_court' => '@h@h@m@',
110
+    'date_fmt_jour' => '@nomjour@ @jour@',
111
+    'date_fmt_jour_heure' => '@jour@ à @heure@',
112
+    'date_fmt_jour_heure_debut_fin' => 'le @jour@ de @heure_debut@ à @heure_fin@',
113
+    'date_fmt_jour_heure_debut_fin_abbr' => 'le @dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtstart@@heure_fin@@dtend@',
114
+    'date_fmt_jour_mois' => '@jour@ @nommois@',
115
+    'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
116
+    'date_fmt_mois_annee' => '@nommois@ @annee@',
117
+    'date_fmt_nomjour' => '@nomjour@ @date@',
118
+    'date_fmt_nomjour_date' => 'le @nomjour@ @date@',
119
+    'date_fmt_periode' => 'Du @date_debut@ au @date_fin@',
120
+    'date_fmt_periode_abbr' => 'Du @dtart@@date_debut@@dtabbr@ au @dtend@@date_fin@@dtabbr@',
121
+    'date_fmt_periode_from' => 'Du',
122
+    'date_fmt_periode_to' => 'au',
123
+    'date_fmt_saison_annee' => '@saison@ @annee@',
124
+    'date_heures' => 'heures',
125
+    'date_hier' => 'hier',
126
+    'date_il_y_a' => 'il y a @delai@',
127
+    'date_jnum1' => '1er',
128
+    'date_jnum10' => '10',
129
+    'date_jnum11' => '11',
130
+    'date_jnum12' => '12',
131
+    'date_jnum13' => '13',
132
+    'date_jnum14' => '14',
133
+    'date_jnum15' => '15',
134
+    'date_jnum16' => '16',
135
+    'date_jnum17' => '17',
136
+    'date_jnum18' => '18',
137
+    'date_jnum19' => '19',
138
+    'date_jnum2' => '2',
139
+    'date_jnum20' => '20',
140
+    'date_jnum21' => '21',
141
+    'date_jnum22' => '22',
142
+    'date_jnum23' => '23',
143
+    'date_jnum24' => '24',
144
+    'date_jnum25' => '25',
145
+    'date_jnum26' => '26',
146
+    'date_jnum27' => '27',
147
+    'date_jnum28' => '28',
148
+    'date_jnum29' => '29',
149
+    'date_jnum3' => '3',
150
+    'date_jnum30' => '30',
151
+    'date_jnum31' => '31',
152
+    'date_jnum4' => '4',
153
+    'date_jnum5' => '5',
154
+    'date_jnum6' => '6',
155
+    'date_jnum7' => '7',
156
+    'date_jnum8' => '8',
157
+    'date_jnum9' => '9',
158
+    'date_jour_1' => 'dimanche',
159
+    'date_jour_1_abbr' => 'dim.',
160
+    'date_jour_1_initiale' => 'd.',
161
+    'date_jour_2' => 'lundi',
162
+    'date_jour_2_abbr' => 'lun.',
163
+    'date_jour_2_initiale' => 'l.',
164
+    'date_jour_3' => 'mardi',
165
+    'date_jour_3_abbr' => 'mar.',
166
+    'date_jour_3_initiale' => 'm.',
167
+    'date_jour_4' => 'mercredi',
168
+    'date_jour_4_abbr' => 'mer.',
169
+    'date_jour_4_initiale' => 'm.',
170
+    'date_jour_5' => 'jeudi',
171
+    'date_jour_5_abbr' => 'jeu.',
172
+    'date_jour_5_initiale' => 'j.',
173
+    'date_jour_6' => 'vendredi',
174
+    'date_jour_6_abbr' => 'ven.',
175
+    'date_jour_6_initiale' => 'v.',
176
+    'date_jour_7' => 'samedi',
177
+    'date_jour_7_abbr' => 'sam.',
178
+    'date_jour_7_initiale' => 's.',
179
+    'date_jours' => 'jours',
180
+    'date_minutes' => 'minutes',
181
+    'date_mois' => 'mois',
182
+    'date_mois_1' => 'janvier',
183
+    'date_mois_10' => 'octobre',
184
+    'date_mois_10_abbr' => 'oct.',
185
+    'date_mois_11' => 'novembre',
186
+    'date_mois_11_abbr' => 'nov.',
187
+    'date_mois_12' => 'décembre',
188
+    'date_mois_12_abbr' => 'déc.',
189
+    'date_mois_1_abbr' => 'janv.',
190
+    'date_mois_2' => 'février',
191
+    'date_mois_2_abbr' => 'févr.',
192
+    'date_mois_3' => 'mars',
193
+    'date_mois_3_abbr' => 'mars',
194
+    'date_mois_4' => 'avril',
195
+    'date_mois_4_abbr' => 'avr.',
196
+    'date_mois_5' => 'mai',
197
+    'date_mois_5_abbr' => 'mai',
198
+    'date_mois_6' => 'juin',
199
+    'date_mois_6_abbr' => 'juin',
200
+    'date_mois_7' => 'juillet',
201
+    'date_mois_7_abbr' => 'juil.',
202
+    'date_mois_8' => 'août',
203
+    'date_mois_8_abbr' => 'août',
204
+    'date_mois_9' => 'septembre',
205
+    'date_mois_9_abbr' => 'sept.',
206
+    'date_saison_1' => 'hiver',
207
+    'date_saison_2' => 'printemps',
208
+    'date_saison_3' => 'été',
209
+    'date_saison_4' => 'automne',
210
+    'date_secondes' => 'secondes',
211
+    'date_semaines' => 'semaines',
212
+    'date_un_mois' => 'mois',
213
+    'date_une_heure' => 'heure',
214
+    'date_une_minute' => 'minute',
215
+    'date_une_seconde' => 'seconde',
216
+    'date_une_semaine' => 'semaine',
217
+    'dirs_commencer' => ' afin de commencer réellement l’installation',
218
+    'dirs_preliminaire' => 'Préliminaire : <b>Régler les droits d’accès</b>',
219
+    'dirs_probleme_droits' => 'Problème de droits d’accès',
220
+    'dirs_repertoires_absents' => '<p><b>Les répertoires suivants n’ont pas été trouvés :</b></p><ul>@bad_dirs@.</ul>
221 221
   <p>Il est probable que cela soit dû à un problème de mauvaise mise en majuscules ou minuscules.
222 222
   Vérifie que les minuscules et majuscules de ces répertoires concordent bien avec ce qui est affiché
223 223
   ci-dessus ; si ce n’est pas le cas, renomme les répertoires avec ton logiciel FTP de façon à corriger l’erreur.</p>
224 224
   <p>Une fois cette manipulation effectuée, tu pourras ',
225
-	'dirs_repertoires_suivants' => '<p><b>Les répertoires suivants ne sont pas accessibles en écriture :</b></p> <ul>@bad_dirs@</ul>
225
+    'dirs_repertoires_suivants' => '<p><b>Les répertoires suivants ne sont pas accessibles en écriture :</b></p> <ul>@bad_dirs@</ul>
226 226
   <p>Pour y remédier, utilise ton client FTP afin de régler les droits d’accès de chacun
227 227
   de ces répertoires. La procédure est expliquée en détail dans le guide d’installation.</p>
228 228
   <p>Une fois cette manipulation effectuée, tu pourras ',
229
-	'double_occurrence' => 'Double occurrence de @balise@',
229
+    'double_occurrence' => 'Double occurrence de @balise@',
230 230
 
231
-	// E
232
-	'en_cours' => 'en cours',
233
-	'envoi_via_le_site' => 'Envoi via le site',
234
-	'erreur' => 'Erreur',
235
-	'erreur_balise_non_fermee' => 'dernière balise non refermée :',
236
-	'erreur_technique_ajaxform' => 'Ooops. Une erreur innatendue a empêché de soumettre le formulaire. Tu peux essayer à nouveau.',
237
-	'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l’enregistrement correct du champ @champs@.',
238
-	'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l’enregistrement.',
239
-	'erreur_texte' => 'erreur(s)',
240
-	'etape' => 'Étape',
231
+    // E
232
+    'en_cours' => 'en cours',
233
+    'envoi_via_le_site' => 'Envoi via le site',
234
+    'erreur' => 'Erreur',
235
+    'erreur_balise_non_fermee' => 'dernière balise non refermée :',
236
+    'erreur_technique_ajaxform' => 'Ooops. Une erreur innatendue a empêché de soumettre le formulaire. Tu peux essayer à nouveau.',
237
+    'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l’enregistrement correct du champ @champs@.',
238
+    'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l’enregistrement.',
239
+    'erreur_texte' => 'erreur(s)',
240
+    'etape' => 'Étape',
241 241
 
242
-	// F
243
-	'fichier_introuvable' => 'Fichier @fichier@ introuvable',
244
-	'form_auteur_confirmation' => 'Confirme ton adresse email',
245
-	'form_auteur_email_modifie' => 'Ton adresse email a été modifiée.',
246
-	'form_auteur_envoi_mail_confirmation' => 'Un courrier électronique de confirmation vient d’être envoyé à @email@. Visite l’adresse Web mentionnée dans ce courrier pour valider ton adresse mail.',
247
-	'form_auteur_mail_confirmation' => 'Salut,
242
+    // F
243
+    'fichier_introuvable' => 'Fichier @fichier@ introuvable',
244
+    'form_auteur_confirmation' => 'Confirme ton adresse email',
245
+    'form_auteur_email_modifie' => 'Ton adresse email a été modifiée.',
246
+    'form_auteur_envoi_mail_confirmation' => 'Un courrier électronique de confirmation vient d’être envoyé à @email@. Visite l’adresse Web mentionnée dans ce courrier pour valider ton adresse mail.',
247
+    'form_auteur_mail_confirmation' => 'Salut,
248 248
 
249 249
 Tu as demandé à changer ton adresse email.
250 250
 Pour confirmer ta nouvelle adresse, il suffit de te connecter à
@@ -253,346 +253,346 @@  discard block
 block discarded – undo
253 253
 
254 254
     @url@
255 255
 ',
256
-	'form_deja_inscrit' => 'Tu es déjà inscrit.',
257
-	'form_email_non_valide' => 'Ton adresse email n’est pas valide.',
258
-	'form_forum_access_refuse' => 'Tu n’as plus accès à ce site.',
259
-	'form_forum_bonjour' => 'Salut @nom@,',
260
-	'form_forum_confirmer_email' => 'Pour confirmer ton adresse email, va à cette adresse : @url_confirm@',
261
-	'form_forum_email_deja_enregistre' => 'Cette adresse email est déjà enregistrée, tu peux donc utiliser ton mot de passe habituel.',
262
-	'form_forum_identifiant_mail' => 'Ton nouvel identifiant vient de t’être envoyé par email.',
263
-	'form_forum_identifiants' => 'Identifiants personnels',
264
-	'form_forum_indiquer_nom_email' => 'Indique ici ton nom et ton adresse email. Ton identifiant personnel te parviendra rapidement, par courrier électronique.',
265
-	'form_forum_login' => 'login :',
266
-	'form_forum_message_auto' => '(ceci est un message automatique)',
267
-	'form_forum_pass' => 'mot de passe :',
268
-	'form_forum_probleme_mail' => 'Problème de mail : l’identifiant ne peut pas être envoyé.',
269
-	'form_forum_voici1' => 'Voici tes identifiants pour pouvoir participer à la vie du site "@nom_site_spip@" (@adresse_site@) :',
270
-	'form_forum_voici2' => 'Voici tes identifiants pour proposer des articles sur
256
+    'form_deja_inscrit' => 'Tu es déjà inscrit.',
257
+    'form_email_non_valide' => 'Ton adresse email n’est pas valide.',
258
+    'form_forum_access_refuse' => 'Tu n’as plus accès à ce site.',
259
+    'form_forum_bonjour' => 'Salut @nom@,',
260
+    'form_forum_confirmer_email' => 'Pour confirmer ton adresse email, va à cette adresse : @url_confirm@',
261
+    'form_forum_email_deja_enregistre' => 'Cette adresse email est déjà enregistrée, tu peux donc utiliser ton mot de passe habituel.',
262
+    'form_forum_identifiant_mail' => 'Ton nouvel identifiant vient de t’être envoyé par email.',
263
+    'form_forum_identifiants' => 'Identifiants personnels',
264
+    'form_forum_indiquer_nom_email' => 'Indique ici ton nom et ton adresse email. Ton identifiant personnel te parviendra rapidement, par courrier électronique.',
265
+    'form_forum_login' => 'login :',
266
+    'form_forum_message_auto' => '(ceci est un message automatique)',
267
+    'form_forum_pass' => 'mot de passe :',
268
+    'form_forum_probleme_mail' => 'Problème de mail : l’identifiant ne peut pas être envoyé.',
269
+    'form_forum_voici1' => 'Voici tes identifiants pour pouvoir participer à la vie du site "@nom_site_spip@" (@adresse_site@) :',
270
+    'form_forum_voici2' => 'Voici tes identifiants pour proposer des articles sur
271 271
 le site "@nom_site_spip@" (@adresse_login@) :',
272
-	'form_indiquer_email' => 'Indique ton adresse email.',
273
-	'form_indiquer_nom' => 'Indique ton nom.',
274
-	'form_indiquer_nom_site' => 'Indique le nom de ton site.',
275
-	'form_pet_deja_enregistre' => 'Ce site est déjà enregistré',
276
-	'form_pet_signature_pasprise' => 'Ta signature n’est pas prise en compte.',
277
-	'form_prop_confirmer_envoi' => 'Confirmer l’envoi',
278
-	'form_prop_description' => 'Description/commentaire',
279
-	'form_prop_enregistre' => 'Ta proposition est enregistrée, elle apparaîtra en ligne après validation par les responsables de ce site.',
280
-	'form_prop_envoyer' => 'Envoyer un message',
281
-	'form_prop_indiquer_email' => 'Indiquer une adresse email valide',
282
-	'form_prop_indiquer_nom_site' => 'Indiquer le nom du site.',
283
-	'form_prop_indiquer_sujet' => 'Indiquer un sujet',
284
-	'form_prop_message_envoye' => 'Message envoyé',
285
-	'form_prop_non_enregistre' => 'Ta proposition n’a pas été enregistrée.',
286
-	'form_prop_sujet' => 'Sujet',
287
-	'form_prop_url_site' => 'Adresse URL du site',
288
-	'format_date_attendu' => 'Saisir une date au format jj/mm/aaaa.',
289
-	'format_date_incorrecte' => 'La date ou son format est incorrect',
290
-	'format_heure_attendu' => 'Saisir une heure au format hh:mm.',
291
-	'format_heure_incorrecte' => 'L’heure ou son format est incorrect',
292
-	'forum_non_inscrit' => 'Tu n’es pas inscrit, ou l’adresse ou le mot de passe sont erronés.',
293
-	'forum_par_auteur' => 'par @auteur@',
294
-	'forum_titre_erreur' => 'Erreur...',
272
+    'form_indiquer_email' => 'Indique ton adresse email.',
273
+    'form_indiquer_nom' => 'Indique ton nom.',
274
+    'form_indiquer_nom_site' => 'Indique le nom de ton site.',
275
+    'form_pet_deja_enregistre' => 'Ce site est déjà enregistré',
276
+    'form_pet_signature_pasprise' => 'Ta signature n’est pas prise en compte.',
277
+    'form_prop_confirmer_envoi' => 'Confirmer l’envoi',
278
+    'form_prop_description' => 'Description/commentaire',
279
+    'form_prop_enregistre' => 'Ta proposition est enregistrée, elle apparaîtra en ligne après validation par les responsables de ce site.',
280
+    'form_prop_envoyer' => 'Envoyer un message',
281
+    'form_prop_indiquer_email' => 'Indiquer une adresse email valide',
282
+    'form_prop_indiquer_nom_site' => 'Indiquer le nom du site.',
283
+    'form_prop_indiquer_sujet' => 'Indiquer un sujet',
284
+    'form_prop_message_envoye' => 'Message envoyé',
285
+    'form_prop_non_enregistre' => 'Ta proposition n’a pas été enregistrée.',
286
+    'form_prop_sujet' => 'Sujet',
287
+    'form_prop_url_site' => 'Adresse URL du site',
288
+    'format_date_attendu' => 'Saisir une date au format jj/mm/aaaa.',
289
+    'format_date_incorrecte' => 'La date ou son format est incorrect',
290
+    'format_heure_attendu' => 'Saisir une heure au format hh:mm.',
291
+    'format_heure_incorrecte' => 'L’heure ou son format est incorrect',
292
+    'forum_non_inscrit' => 'Tu n’es pas inscrit, ou l’adresse ou le mot de passe sont erronés.',
293
+    'forum_par_auteur' => 'par @auteur@',
294
+    'forum_titre_erreur' => 'Erreur...',
295 295
 
296
-	// I
297
-	'ical_texte_rss_articles' => 'Le fichier « backend » des articles de ce site se trouve à l’adresse :',
298
-	'ical_texte_rss_articles2' => 'Tu peux également obtenir des fichiers « backend » pour les articles de chaque rubrique du site :',
299
-	'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les brèves du site. En précisant un numéro de rubrique, tu obtiendras uniquement les brèves de cette rubrique.',
300
-	'icone_a_suivre' => 'À suivre',
301
-	'icone_admin_site' => 'Administration du site',
302
-	'icone_agenda' => 'Agenda',
303
-	'icone_aide_ligne' => 'Aide',
304
-	'icone_articles' => 'Articles',
305
-	'icone_auteurs' => 'Auteurs',
306
-	'icone_brouteur' => 'Navigation rapide',
307
-	'icone_configuration_site' => 'Configuration',
308
-	'icone_configurer_site' => 'Configurer ton site',
309
-	'icone_creer_nouvel_auteur' => 'Créer un nouvel auteur',
310
-	'icone_creer_rubrique' => 'Créer une rubrique',
311
-	'icone_creer_sous_rubrique' => 'Créer une sous-rubrique',
312
-	'icone_deconnecter' => 'Se déconnecter',
313
-	'icone_discussions' => 'Discussions',
314
-	'icone_doc_rubrique' => 'Documents des rubriques',
315
-	'icone_ecrire_article' => 'Écrire un nouvel article',
316
-	'icone_edition_site' => 'Édition',
317
-	'icone_gestion_langues' => 'Gestion des langues',
318
-	'icone_informations_personnelles' => 'Informations personnelles',
319
-	'icone_interface_complet' => 'interface complète',
320
-	'icone_interface_simple' => 'Interface simplifiée',
321
-	'icone_maintenance_site' => 'Maintenance du site',
322
-	'icone_messagerie_personnelle' => 'Messagerie personnelle',
323
-	'icone_repartition_debut' => 'Afficher la répartition depuis le début',
324
-	'icone_rubriques' => 'Rubriques',
325
-	'icone_sauver_site' => 'Sauvegarde du site',
326
-	'icone_site_entier' => 'Tout le site',
327
-	'icone_sites_references' => 'Sites référencés',
328
-	'icone_statistiques' => 'Statistiques du site',
329
-	'icone_suivi_activite' => 'Suivre la vie du site',
330
-	'icone_suivi_actualite' => 'Évolution du site',
331
-	'icone_suivi_pettions' => 'Suivre/gérer les pétitions',
332
-	'icone_suivi_revisions' => 'Modifications des articles',
333
-	'icone_supprimer_document' => 'Supprimer ce document',
334
-	'icone_supprimer_image' => 'Supprimer cette image',
335
-	'icone_tous_articles' => 'Tous tes articles',
336
-	'icone_tous_auteur' => 'Tous les auteurs',
337
-	'icone_tous_visiteur' => 'Tous les visiteurs',
338
-	'icone_visiter_site' => 'Voir le site public',
339
-	'icone_voir_en_ligne' => 'Voir en ligne',
340
-	'img_indisponible' => 'image indisponible',
341
-	'impossible' => 'impossible',
342
-	'info_a_suivre' => 'À SUIVRE »',
343
-	'info_acces_interdit' => 'Accès interdit',
344
-	'info_acces_refuse' => 'Accès refusé',
345
-	'info_action' => 'Action : @action@',
346
-	'info_administrer_rubriques' => 'Tu peux administrer cette rubrique et ses sous-rubriques',
347
-	'info_adresse_non_indiquee' => 'Tu n’as pas indiqué d’adresse à tester !',
348
-	'info_aide' => 'AIDE :',
349
-	'info_ajouter_mot' => 'Ajouter ce mot',
350
-	'info_annonce' => 'ANNONCE',
351
-	'info_annonces_generales' => 'Annonces générales :',
352
-	'info_article_propose' => 'Article proposé',
353
-	'info_article_publie' => 'Article publié',
354
-	'info_article_redaction' => 'Article en cours de rédaction',
355
-	'info_article_refuse' => 'Article refusé',
356
-	'info_article_supprime' => 'Article supprimé',
357
-	'info_articles' => 'Articles',
358
-	'info_articles_a_valider' => 'Les articles à valider',
359
-	'info_articles_nb' => '@nb@ articles',
360
-	'info_articles_proposes' => 'Articles proposés',
361
-	'info_articles_un' => '1 article',
362
-	'info_auteurs_nombre' => 'auteur(s) :',
363
-	'info_authentification_ftp' => 'Authentification (par FTP).',
364
-	'info_breves_2' => 'brèves',
365
-	'info_breves_nb' => '@nb@ brèves',
366
-	'info_breves_un' => '1 brève',
367
-	'info_connexion_refusee' => 'Connexion refusée',
368
-	'info_contact_developpeur' => 'Contacte un développeur.',
369
-	'info_contenance' => 'Ce site contient :',
370
-	'info_contribution' => 'contributions',
371
-	'info_copyright' => '@spip@ est un logiciel libre distribué @lien_gpl@.',
372
-	'info_copyright_doc' => 'Pour plus d’informations, voir le site <a href="@spipnet@">@spipnet_affiche@</a>.',
373
-	'info_copyright_gpl' => 'sous licence GPL',
374
-	'info_cours_edition' => 'En cours de modification',
375
-	'info_creer_repertoire' => 'Crée un fichier ou un répertoire nommé :',
376
-	'info_creer_repertoire_2' => 'à l’intérieur du sous-répertoire <b>@repertoire@</b>, puis :',
377
-	'info_creer_vignette' => 'création automatique de la vignette',
378
-	'info_creerdansrubrique_non_autorise' => 'Tu n’as pas de droits suffisants pour créer un contenu dans cette rubrique',
379
-	'info_deplier' => 'Déplier',
380
-	'info_descriptif_nombre' => 'descriptif(s) :',
381
-	'info_description' => 'Description :',
382
-	'info_description_2' => 'Description :',
383
-	'info_dimension' => 'Dimensions :',
384
-	'info_documents_nb' => '@nb@ documents',
385
-	'info_documents_un' => '1 document',
386
-	'info_ecire_message_prive' => 'Écrire un message privé',
387
-	'info_email_invalide' => 'Adresse email invalide.',
388
-	'info_en_cours_validation' => 'Tes articles en cours de rédaction',
389
-	'info_en_ligne' => 'Actuellement en ligne :',
390
-	'info_envoyer_message_prive' => 'Envoyer un message privé à cet auteur',
391
-	'info_erreur_requete' => 'Erreur dans la requête :',
392
-	'info_erreur_squelette2' => 'Aucun squelette <b>@fichier@</b> n’est disponible...',
393
-	'info_erreur_systeme' => 'Erreur système (errno @errsys@)',
394
-	'info_erreur_systeme2' => 'Le disque dur est peut-être plein, ou la base de données endommagée.<br />
296
+    // I
297
+    'ical_texte_rss_articles' => 'Le fichier « backend » des articles de ce site se trouve à l’adresse :',
298
+    'ical_texte_rss_articles2' => 'Tu peux également obtenir des fichiers « backend » pour les articles de chaque rubrique du site :',
299
+    'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les brèves du site. En précisant un numéro de rubrique, tu obtiendras uniquement les brèves de cette rubrique.',
300
+    'icone_a_suivre' => 'À suivre',
301
+    'icone_admin_site' => 'Administration du site',
302
+    'icone_agenda' => 'Agenda',
303
+    'icone_aide_ligne' => 'Aide',
304
+    'icone_articles' => 'Articles',
305
+    'icone_auteurs' => 'Auteurs',
306
+    'icone_brouteur' => 'Navigation rapide',
307
+    'icone_configuration_site' => 'Configuration',
308
+    'icone_configurer_site' => 'Configurer ton site',
309
+    'icone_creer_nouvel_auteur' => 'Créer un nouvel auteur',
310
+    'icone_creer_rubrique' => 'Créer une rubrique',
311
+    'icone_creer_sous_rubrique' => 'Créer une sous-rubrique',
312
+    'icone_deconnecter' => 'Se déconnecter',
313
+    'icone_discussions' => 'Discussions',
314
+    'icone_doc_rubrique' => 'Documents des rubriques',
315
+    'icone_ecrire_article' => 'Écrire un nouvel article',
316
+    'icone_edition_site' => 'Édition',
317
+    'icone_gestion_langues' => 'Gestion des langues',
318
+    'icone_informations_personnelles' => 'Informations personnelles',
319
+    'icone_interface_complet' => 'interface complète',
320
+    'icone_interface_simple' => 'Interface simplifiée',
321
+    'icone_maintenance_site' => 'Maintenance du site',
322
+    'icone_messagerie_personnelle' => 'Messagerie personnelle',
323
+    'icone_repartition_debut' => 'Afficher la répartition depuis le début',
324
+    'icone_rubriques' => 'Rubriques',
325
+    'icone_sauver_site' => 'Sauvegarde du site',
326
+    'icone_site_entier' => 'Tout le site',
327
+    'icone_sites_references' => 'Sites référencés',
328
+    'icone_statistiques' => 'Statistiques du site',
329
+    'icone_suivi_activite' => 'Suivre la vie du site',
330
+    'icone_suivi_actualite' => 'Évolution du site',
331
+    'icone_suivi_pettions' => 'Suivre/gérer les pétitions',
332
+    'icone_suivi_revisions' => 'Modifications des articles',
333
+    'icone_supprimer_document' => 'Supprimer ce document',
334
+    'icone_supprimer_image' => 'Supprimer cette image',
335
+    'icone_tous_articles' => 'Tous tes articles',
336
+    'icone_tous_auteur' => 'Tous les auteurs',
337
+    'icone_tous_visiteur' => 'Tous les visiteurs',
338
+    'icone_visiter_site' => 'Voir le site public',
339
+    'icone_voir_en_ligne' => 'Voir en ligne',
340
+    'img_indisponible' => 'image indisponible',
341
+    'impossible' => 'impossible',
342
+    'info_a_suivre' => 'À SUIVRE »',
343
+    'info_acces_interdit' => 'Accès interdit',
344
+    'info_acces_refuse' => 'Accès refusé',
345
+    'info_action' => 'Action : @action@',
346
+    'info_administrer_rubriques' => 'Tu peux administrer cette rubrique et ses sous-rubriques',
347
+    'info_adresse_non_indiquee' => 'Tu n’as pas indiqué d’adresse à tester !',
348
+    'info_aide' => 'AIDE :',
349
+    'info_ajouter_mot' => 'Ajouter ce mot',
350
+    'info_annonce' => 'ANNONCE',
351
+    'info_annonces_generales' => 'Annonces générales :',
352
+    'info_article_propose' => 'Article proposé',
353
+    'info_article_publie' => 'Article publié',
354
+    'info_article_redaction' => 'Article en cours de rédaction',
355
+    'info_article_refuse' => 'Article refusé',
356
+    'info_article_supprime' => 'Article supprimé',
357
+    'info_articles' => 'Articles',
358
+    'info_articles_a_valider' => 'Les articles à valider',
359
+    'info_articles_nb' => '@nb@ articles',
360
+    'info_articles_proposes' => 'Articles proposés',
361
+    'info_articles_un' => '1 article',
362
+    'info_auteurs_nombre' => 'auteur(s) :',
363
+    'info_authentification_ftp' => 'Authentification (par FTP).',
364
+    'info_breves_2' => 'brèves',
365
+    'info_breves_nb' => '@nb@ brèves',
366
+    'info_breves_un' => '1 brève',
367
+    'info_connexion_refusee' => 'Connexion refusée',
368
+    'info_contact_developpeur' => 'Contacte un développeur.',
369
+    'info_contenance' => 'Ce site contient :',
370
+    'info_contribution' => 'contributions',
371
+    'info_copyright' => '@spip@ est un logiciel libre distribué @lien_gpl@.',
372
+    'info_copyright_doc' => 'Pour plus d’informations, voir le site <a href="@spipnet@">@spipnet_affiche@</a>.',
373
+    'info_copyright_gpl' => 'sous licence GPL',
374
+    'info_cours_edition' => 'En cours de modification',
375
+    'info_creer_repertoire' => 'Crée un fichier ou un répertoire nommé :',
376
+    'info_creer_repertoire_2' => 'à l’intérieur du sous-répertoire <b>@repertoire@</b>, puis :',
377
+    'info_creer_vignette' => 'création automatique de la vignette',
378
+    'info_creerdansrubrique_non_autorise' => 'Tu n’as pas de droits suffisants pour créer un contenu dans cette rubrique',
379
+    'info_deplier' => 'Déplier',
380
+    'info_descriptif_nombre' => 'descriptif(s) :',
381
+    'info_description' => 'Description :',
382
+    'info_description_2' => 'Description :',
383
+    'info_dimension' => 'Dimensions :',
384
+    'info_documents_nb' => '@nb@ documents',
385
+    'info_documents_un' => '1 document',
386
+    'info_ecire_message_prive' => 'Écrire un message privé',
387
+    'info_email_invalide' => 'Adresse email invalide.',
388
+    'info_en_cours_validation' => 'Tes articles en cours de rédaction',
389
+    'info_en_ligne' => 'Actuellement en ligne :',
390
+    'info_envoyer_message_prive' => 'Envoyer un message privé à cet auteur',
391
+    'info_erreur_requete' => 'Erreur dans la requête :',
392
+    'info_erreur_squelette2' => 'Aucun squelette <b>@fichier@</b> n’est disponible...',
393
+    'info_erreur_systeme' => 'Erreur système (errno @errsys@)',
394
+    'info_erreur_systeme2' => 'Le disque dur est peut-être plein, ou la base de données endommagée.<br />
395 395
 <span style="color:red;">Essaie de <a href=\'@script@\'>réparer la base</a>, ou contacte ton hébergeur.</span>',
396
-	'info_fini' => 'C’est fini !',
397
-	'info_format_image' => 'Formats d’images pouvant être utilisées pour créer des vignettes : @gd_formats@.',
398
-	'info_format_non_defini' => 'format non défini',
399
-	'info_grand_ecran' => 'Grand écran',
400
-	'info_image_aide' => 'AIDE',
401
-	'info_image_process_titre' => 'Comment faire de nouveaux signets',
402
-	'info_impossible_lire_page' => '<b>Erreur !</b> Impossible de lire la page <tt><html>@test_proxy@</html></tt> à travers le proxy ',
403
-	'info_installation_systeme_publication' => 'Installation du système de publication...',
404
-	'info_installer_documents' => 'Tu peux installer automatiquement tous les documents contenus dans le dossier @upload@.',
405
-	'info_installer_ftp' => 'En tant qu’administrateur, tu peux installer (par FTP) des fichiers dans le dossier @upload@ pour ensuite les sélectionner directement ici.',
406
-	'info_installer_images' => 'Tu peux installer des images aux formats JPEG, GIF et PNG.',
407
-	'info_installer_images_dossier' => 'Installer des images dans le dossier @upload@ pour pouvoir les sélectionner ici.',
408
-	'info_interface_complete' => 'interface complète',
409
-	'info_interface_simple' => 'Interface simplifiée',
410
-	'info_joindre_document_article' => 'Tu peux joindre à cet article des documents de type',
411
-	'info_joindre_document_rubrique' => 'Tu peux ajouter dans cette rubrique des documents de type',
412
-	'info_joindre_documents_article' => 'Tu peux joindre à ton article des documents de type :',
413
-	'info_l_article' => 'l’article',
414
-	'info_la_breve' => 'la brève',
415
-	'info_la_rubrique' => 'la rubrique',
416
-	'info_langue_principale' => 'Langue principale du site',
417
-	'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
418
-	'info_les_auteurs_1' => 'par @les_auteurs@',
419
-	'info_logo_format_interdit' => 'Seuls les logos aux formats @formats@ sont autorisés.',
420
-	'info_logo_max_poids' => 'Les logos doivent obligatoirement faire moins de @maxi@ (ce fichier fait @actuel@).',
421
-	'info_mail_fournisseur' => '[email protected]',
422
-	'info_message_2' => 'MESSAGE',
423
-	'info_message_supprime' => 'MESSAGE SUPPRIMÉ',
424
-	'info_messages_nb' => '@nb@ messages',
425
-	'info_messages_un' => '1 message',
426
-	'info_mise_en_ligne' => 'Date de mise en ligne :',
427
-	'info_modification_parametres_securite' => 'modifications des paramètres de sécurité',
428
-	'info_mois_courant' => 'Dans le courant du mois :',
429
-	'info_mot_cle_ajoute' => 'Le mot-clé suivant a été ajouté à',
430
-	'info_multi_herit' => 'Langue par défaut',
431
-	'info_multi_langues_soulignees' => 'Les <u>langues soulignées</u> bénéficient d’une traduction totale ou partielle des textes de l’interface. Si tu sélectionnes ces langues, de nombreux éléments du site public (dates, formulaires) seront automatiquement traduits. Pour les langues non soulignées, ces éléments apparaîtront dans la langue principale du site.',
432
-	'info_multilinguisme' => 'Multilinguisme',
433
-	'info_nom_non_utilisateurs_connectes' => 'Ton nom n’apparaît pas dans la liste des utilisateurs connectés.',
434
-	'info_nom_utilisateurs_connectes' => 'Ton nom apparaît dans la liste des utilisateurs connectés.',
435
-	'info_nombre_en_ligne' => 'Actuellement en ligne :',
436
-	'info_non_resultat' => 'Aucun résultat pour "@cherche_mot@"',
437
-	'info_non_utilisation_messagerie' => 'Tu n’utilise pas la messagerie interne de ce site.',
438
-	'info_nouveau_message' => 'TU AS UN NOUVEAU MESSAGE',
439
-	'info_nouveaux_messages' => 'TU AS @total_messages@ NOUVEAUX MESSAGES',
440
-	'info_numero_abbreviation' => 'N° ',
441
-	'info_obligatoire' => 'Cette information est obligatoire',
442
-	'info_page_actuelle' => 'Page actuelle',
443
-	'info_pense_bete' => 'PENSE-BÊTE',
444
-	'info_petit_ecran' => 'Petit écran',
445
-	'info_petition_close' => 'Pétition close',
446
-	'info_pixels' => 'pixels',
447
-	'info_plusieurs_mots_trouves' => 'Plusieurs mots-clés trouvés pour "@cherche_mot@" :',
448
-	'info_portfolio_automatique' => 'Portfolio automatique :',
449
-	'info_premier_resultat' => '[@debut_limit@ premiers résultats sur @total@]',
450
-	'info_premier_resultat_sur' => '[@debut_limit@ premiers résultats sur @total@]',
451
-	'info_propose_1' => '[@nom_site_spip@] Propose : @titre@',
452
-	'info_propose_2' => 'Article proposé
396
+    'info_fini' => 'C’est fini !',
397
+    'info_format_image' => 'Formats d’images pouvant être utilisées pour créer des vignettes : @gd_formats@.',
398
+    'info_format_non_defini' => 'format non défini',
399
+    'info_grand_ecran' => 'Grand écran',
400
+    'info_image_aide' => 'AIDE',
401
+    'info_image_process_titre' => 'Comment faire de nouveaux signets',
402
+    'info_impossible_lire_page' => '<b>Erreur !</b> Impossible de lire la page <tt><html>@test_proxy@</html></tt> à travers le proxy ',
403
+    'info_installation_systeme_publication' => 'Installation du système de publication...',
404
+    'info_installer_documents' => 'Tu peux installer automatiquement tous les documents contenus dans le dossier @upload@.',
405
+    'info_installer_ftp' => 'En tant qu’administrateur, tu peux installer (par FTP) des fichiers dans le dossier @upload@ pour ensuite les sélectionner directement ici.',
406
+    'info_installer_images' => 'Tu peux installer des images aux formats JPEG, GIF et PNG.',
407
+    'info_installer_images_dossier' => 'Installer des images dans le dossier @upload@ pour pouvoir les sélectionner ici.',
408
+    'info_interface_complete' => 'interface complète',
409
+    'info_interface_simple' => 'Interface simplifiée',
410
+    'info_joindre_document_article' => 'Tu peux joindre à cet article des documents de type',
411
+    'info_joindre_document_rubrique' => 'Tu peux ajouter dans cette rubrique des documents de type',
412
+    'info_joindre_documents_article' => 'Tu peux joindre à ton article des documents de type :',
413
+    'info_l_article' => 'l’article',
414
+    'info_la_breve' => 'la brève',
415
+    'info_la_rubrique' => 'la rubrique',
416
+    'info_langue_principale' => 'Langue principale du site',
417
+    'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
418
+    'info_les_auteurs_1' => 'par @les_auteurs@',
419
+    'info_logo_format_interdit' => 'Seuls les logos aux formats @formats@ sont autorisés.',
420
+    'info_logo_max_poids' => 'Les logos doivent obligatoirement faire moins de @maxi@ (ce fichier fait @actuel@).',
421
+    'info_mail_fournisseur' => '[email protected]',
422
+    'info_message_2' => 'MESSAGE',
423
+    'info_message_supprime' => 'MESSAGE SUPPRIMÉ',
424
+    'info_messages_nb' => '@nb@ messages',
425
+    'info_messages_un' => '1 message',
426
+    'info_mise_en_ligne' => 'Date de mise en ligne :',
427
+    'info_modification_parametres_securite' => 'modifications des paramètres de sécurité',
428
+    'info_mois_courant' => 'Dans le courant du mois :',
429
+    'info_mot_cle_ajoute' => 'Le mot-clé suivant a été ajouté à',
430
+    'info_multi_herit' => 'Langue par défaut',
431
+    'info_multi_langues_soulignees' => 'Les <u>langues soulignées</u> bénéficient d’une traduction totale ou partielle des textes de l’interface. Si tu sélectionnes ces langues, de nombreux éléments du site public (dates, formulaires) seront automatiquement traduits. Pour les langues non soulignées, ces éléments apparaîtront dans la langue principale du site.',
432
+    'info_multilinguisme' => 'Multilinguisme',
433
+    'info_nom_non_utilisateurs_connectes' => 'Ton nom n’apparaît pas dans la liste des utilisateurs connectés.',
434
+    'info_nom_utilisateurs_connectes' => 'Ton nom apparaît dans la liste des utilisateurs connectés.',
435
+    'info_nombre_en_ligne' => 'Actuellement en ligne :',
436
+    'info_non_resultat' => 'Aucun résultat pour "@cherche_mot@"',
437
+    'info_non_utilisation_messagerie' => 'Tu n’utilise pas la messagerie interne de ce site.',
438
+    'info_nouveau_message' => 'TU AS UN NOUVEAU MESSAGE',
439
+    'info_nouveaux_messages' => 'TU AS @total_messages@ NOUVEAUX MESSAGES',
440
+    'info_numero_abbreviation' => 'N° ',
441
+    'info_obligatoire' => 'Cette information est obligatoire',
442
+    'info_page_actuelle' => 'Page actuelle',
443
+    'info_pense_bete' => 'PENSE-BÊTE',
444
+    'info_petit_ecran' => 'Petit écran',
445
+    'info_petition_close' => 'Pétition close',
446
+    'info_pixels' => 'pixels',
447
+    'info_plusieurs_mots_trouves' => 'Plusieurs mots-clés trouvés pour "@cherche_mot@" :',
448
+    'info_portfolio_automatique' => 'Portfolio automatique :',
449
+    'info_premier_resultat' => '[@debut_limit@ premiers résultats sur @total@]',
450
+    'info_premier_resultat_sur' => '[@debut_limit@ premiers résultats sur @total@]',
451
+    'info_propose_1' => '[@nom_site_spip@] Propose : @titre@',
452
+    'info_propose_2' => 'Article proposé
453 453
 ---------------',
454
-	'info_propose_3' => 'L’article "@titre@" est proposé à la publication.',
455
-	'info_propose_4' => 'Tu es invité à venir le consulter et à donner ton opinion',
456
-	'info_propose_5' => 'dans le forum qui lui est attaché. Il est disponible à l’adresse :',
457
-	'info_publie_01' => 'L’article "@titre@" a été validé par @connect_nom@.',
458
-	'info_publie_1' => '[@nom_site_spip@] PUBLIE : @titre@',
459
-	'info_publie_2' => 'Article publié
454
+    'info_propose_3' => 'L’article "@titre@" est proposé à la publication.',
455
+    'info_propose_4' => 'Tu es invité à venir le consulter et à donner ton opinion',
456
+    'info_propose_5' => 'dans le forum qui lui est attaché. Il est disponible à l’adresse :',
457
+    'info_publie_01' => 'L’article "@titre@" a été validé par @connect_nom@.',
458
+    'info_publie_1' => '[@nom_site_spip@] PUBLIE : @titre@',
459
+    'info_publie_2' => 'Article publié
460 460
 --------------',
461
-	'info_rechercher' => 'Rechercher',
462
-	'info_rechercher_02' => 'Rechercher :',
463
-	'info_remplacer_vignette' => 'Remplacer la vignette par défaut par un logo personnalisé :',
464
-	'info_rubriques_nb' => '@nb@ rubriques',
465
-	'info_rubriques_un' => '1 rubrique',
466
-	'info_sans_titre_2' => 'sans titre',
467
-	'info_selectionner_fichier' => 'Tu peux sélectionner un fichier du dossier @upload@',
468
-	'info_selectionner_fichier_2' => 'Sélectionner un fichier :',
469
-	'info_sites_nb' => '@nb@ sites',
470
-	'info_sites_un' => '1 site',
471
-	'info_supprimer_vignette' => 'supprimer la vignette',
472
-	'info_symbole_bleu' => 'Le symbole <b>bleu</b> indique un <b>pense-bête</b> : c’est-à-dire un message à ton usage personnel.',
473
-	'info_symbole_jaune' => 'Le symbole <b>jaune</b> indique une <b>annonce à tous les rédacteurs</b> : modifiable par tous les administrateurs, et visible par tous les rédacteurs.',
474
-	'info_symbole_vert' => 'Le symbole <b>vert</b> indique les <b>messages échangés avec d’autres utilisateurs</b> du site.',
475
-	'info_telecharger_nouveau_logo' => 'Télécharger un nouveau logo :',
476
-	'info_telecharger_ordinateur' => 'Télécharger depuis ton ordinateur :',
477
-	'info_tous_resultats_enregistres' => '[tous les résultats sont enregistrés]',
478
-	'info_tout_afficher' => 'Tout afficher',
479
-	'info_travaux_texte' => 'Ce site n’est pas encore configuré. Reviens plus tard...',
480
-	'info_travaux_titre' => 'Site en travaux',
481
-	'info_trop_resultat' => 'Trop de résultats pour "@cherche_mot@" ; affine la recherche.',
482
-	'info_utilisation_messagerie_interne' => 'Tu utilises la messagerie interne de ce site.',
483
-	'info_valider_lien' => 'valider ce lien',
484
-	'info_verifier_image' => ', vérifie que tes images ont été transférées correctement.',
485
-	'info_vignette_defaut' => 'Vignette par défaut',
486
-	'info_vignette_personnalisee' => 'Vignette personnalisée',
487
-	'info_visite' => 'visite :',
488
-	'info_vos_rendez_vous' => 'Tes rendez-vous à venir',
489
-	'infos_vos_pense_bete' => 'Tes pense-bêtes',
461
+    'info_rechercher' => 'Rechercher',
462
+    'info_rechercher_02' => 'Rechercher :',
463
+    'info_remplacer_vignette' => 'Remplacer la vignette par défaut par un logo personnalisé :',
464
+    'info_rubriques_nb' => '@nb@ rubriques',
465
+    'info_rubriques_un' => '1 rubrique',
466
+    'info_sans_titre_2' => 'sans titre',
467
+    'info_selectionner_fichier' => 'Tu peux sélectionner un fichier du dossier @upload@',
468
+    'info_selectionner_fichier_2' => 'Sélectionner un fichier :',
469
+    'info_sites_nb' => '@nb@ sites',
470
+    'info_sites_un' => '1 site',
471
+    'info_supprimer_vignette' => 'supprimer la vignette',
472
+    'info_symbole_bleu' => 'Le symbole <b>bleu</b> indique un <b>pense-bête</b> : c’est-à-dire un message à ton usage personnel.',
473
+    'info_symbole_jaune' => 'Le symbole <b>jaune</b> indique une <b>annonce à tous les rédacteurs</b> : modifiable par tous les administrateurs, et visible par tous les rédacteurs.',
474
+    'info_symbole_vert' => 'Le symbole <b>vert</b> indique les <b>messages échangés avec d’autres utilisateurs</b> du site.',
475
+    'info_telecharger_nouveau_logo' => 'Télécharger un nouveau logo :',
476
+    'info_telecharger_ordinateur' => 'Télécharger depuis ton ordinateur :',
477
+    'info_tous_resultats_enregistres' => '[tous les résultats sont enregistrés]',
478
+    'info_tout_afficher' => 'Tout afficher',
479
+    'info_travaux_texte' => 'Ce site n’est pas encore configuré. Reviens plus tard...',
480
+    'info_travaux_titre' => 'Site en travaux',
481
+    'info_trop_resultat' => 'Trop de résultats pour "@cherche_mot@" ; affine la recherche.',
482
+    'info_utilisation_messagerie_interne' => 'Tu utilises la messagerie interne de ce site.',
483
+    'info_valider_lien' => 'valider ce lien',
484
+    'info_verifier_image' => ', vérifie que tes images ont été transférées correctement.',
485
+    'info_vignette_defaut' => 'Vignette par défaut',
486
+    'info_vignette_personnalisee' => 'Vignette personnalisée',
487
+    'info_visite' => 'visite :',
488
+    'info_vos_rendez_vous' => 'Tes rendez-vous à venir',
489
+    'infos_vos_pense_bete' => 'Tes pense-bêtes',
490 490
 
491
-	// L
492
-	'label_ajout_id_rapide' => 'Ajout rapide',
493
-	'label_poids_fichier' => 'Taille',
494
-	'label_ponctuer' => '@label@ :',
495
-	'lien_afficher_icones_seuls' => 'Afficher uniquement les icones',
496
-	'lien_afficher_texte_icones' => 'Afficher les icones et le texte',
497
-	'lien_afficher_texte_seul' => 'Afficher uniquement le texte',
498
-	'lien_aller_a_la_derniere_page' => 'Aller à la dernière page',
499
-	'lien_aller_a_la_page_nb' => 'Aller à la page @nb@',
500
-	'lien_aller_a_la_page_precedente' => 'Aller à la page précédente',
501
-	'lien_aller_a_la_page_suivante' => 'Aller à la page suivante',
502
-	'lien_aller_a_la_premiere_page' => 'Aller à la première page',
503
-	'lien_liberer' => 'libérer',
504
-	'lien_liberer_tous' => 'Tout libérer',
505
-	'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-BÊTE',
506
-	'lien_nouveau_message' => 'NOUVEAU MESSAGE',
507
-	'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE',
508
-	'lien_petitions' => 'PÉTITION',
509
-	'lien_popularite' => 'popularité : @popularite@%',
510
-	'lien_racine_site' => 'RACINE DU SITE',
511
-	'lien_reessayer' => 'réessayer',
512
-	'lien_repondre_message' => 'Répondre à ce message',
513
-	'lien_supprimer' => 'supprimer',
514
-	'lien_tout_afficher' => 'Tout afficher',
515
-	'lien_visite_site' => 'visiter ce site',
516
-	'lien_visites' => '@visites@ visites',
517
-	'lien_voir_auteur' => 'Voir cet auteur',
518
-	'ligne' => 'Ligne',
519
-	'login' => 'Connexion',
520
-	'login_acces_prive' => 'accès à l’espace privé',
521
-	'login_autre_identifiant' => 'se connecter sous un autre identifiant',
522
-	'login_cookie_accepte' => 'Régle ton navigateur pour qu’il les accepte (au moins pour ce site).',
523
-	'login_cookie_oblige' => 'Pour t’identifier de façon sûre sur ce site, tu dois accepter les cookies.',
524
-	'login_deconnexion_ok' => 'Déconnexion effectuée.',
525
-	'login_erreur_pass' => 'Erreur de mot de passe.',
526
-	'login_espace_prive' => 'espace privé',
527
-	'login_identifiant_inconnu' => 'L’identifiant « @login@ » est inconnu.',
528
-	'login_login' => 'Login :',
529
-	'login_login2' => 'Login ou adresse email@circ@ :',
530
-	'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)',
531
-	'login_motpasseoublie' => 'mot de passe oublié ?',
532
-	'login_non_securise' => 'Attention, ce formulaire n’est pas sécurisé.
491
+    // L
492
+    'label_ajout_id_rapide' => 'Ajout rapide',
493
+    'label_poids_fichier' => 'Taille',
494
+    'label_ponctuer' => '@label@ :',
495
+    'lien_afficher_icones_seuls' => 'Afficher uniquement les icones',
496
+    'lien_afficher_texte_icones' => 'Afficher les icones et le texte',
497
+    'lien_afficher_texte_seul' => 'Afficher uniquement le texte',
498
+    'lien_aller_a_la_derniere_page' => 'Aller à la dernière page',
499
+    'lien_aller_a_la_page_nb' => 'Aller à la page @nb@',
500
+    'lien_aller_a_la_page_precedente' => 'Aller à la page précédente',
501
+    'lien_aller_a_la_page_suivante' => 'Aller à la page suivante',
502
+    'lien_aller_a_la_premiere_page' => 'Aller à la première page',
503
+    'lien_liberer' => 'libérer',
504
+    'lien_liberer_tous' => 'Tout libérer',
505
+    'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-BÊTE',
506
+    'lien_nouveau_message' => 'NOUVEAU MESSAGE',
507
+    'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE',
508
+    'lien_petitions' => 'PÉTITION',
509
+    'lien_popularite' => 'popularité : @popularite@%',
510
+    'lien_racine_site' => 'RACINE DU SITE',
511
+    'lien_reessayer' => 'réessayer',
512
+    'lien_repondre_message' => 'Répondre à ce message',
513
+    'lien_supprimer' => 'supprimer',
514
+    'lien_tout_afficher' => 'Tout afficher',
515
+    'lien_visite_site' => 'visiter ce site',
516
+    'lien_visites' => '@visites@ visites',
517
+    'lien_voir_auteur' => 'Voir cet auteur',
518
+    'ligne' => 'Ligne',
519
+    'login' => 'Connexion',
520
+    'login_acces_prive' => 'accès à l’espace privé',
521
+    'login_autre_identifiant' => 'se connecter sous un autre identifiant',
522
+    'login_cookie_accepte' => 'Régle ton navigateur pour qu’il les accepte (au moins pour ce site).',
523
+    'login_cookie_oblige' => 'Pour t’identifier de façon sûre sur ce site, tu dois accepter les cookies.',
524
+    'login_deconnexion_ok' => 'Déconnexion effectuée.',
525
+    'login_erreur_pass' => 'Erreur de mot de passe.',
526
+    'login_espace_prive' => 'espace privé',
527
+    'login_identifiant_inconnu' => 'L’identifiant « @login@ » est inconnu.',
528
+    'login_login' => 'Login :',
529
+    'login_login2' => 'Login ou adresse email@circ@ :',
530
+    'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)',
531
+    'login_motpasseoublie' => 'mot de passe oublié ?',
532
+    'login_non_securise' => 'Attention, ce formulaire n’est pas sécurisé.
533 533
 			Si tu ne veux pas que ton mot de passe puisse être
534 534
 			intercepté sur le réseau, active Javascript
535 535
 			dans ton navigateur et',
536
-	'login_nouvelle_tentative' => 'Nouvelle tentative',
537
-	'login_par_ici' => 'Tu es enregistré... par ici...',
538
-	'login_pass2' => 'Mot de passe :',
539
-	'login_preferez_refuser' => '<b>Si tu préfére refuser les cookies</b>, une autre méthode de connexion (moins sécurisée) est à ta disposition :',
540
-	'login_recharger' => 'recharger cette page',
541
-	'login_rester_identifie' => 'Se souvenir de moi',
542
-	'login_retour_public' => 'Retour au site public',
543
-	'login_retour_site' => 'Retour au site public',
544
-	'login_retoursitepublic' => 'retour au site public',
545
-	'login_sans_cookie' => 'Identification sans cookie',
546
-	'login_securise' => 'Login sécurisé',
547
-	'login_sinscrire' => 's’inscrire',
548
-	'login_test_navigateur' => 'test navigateur/reconnexion',
549
-	'login_verifiez_navigateur' => '(Vérifie toutefois que ton navigateur n’a pas mémorisé ton mot de passe...)',
536
+    'login_nouvelle_tentative' => 'Nouvelle tentative',
537
+    'login_par_ici' => 'Tu es enregistré... par ici...',
538
+    'login_pass2' => 'Mot de passe :',
539
+    'login_preferez_refuser' => '<b>Si tu préfére refuser les cookies</b>, une autre méthode de connexion (moins sécurisée) est à ta disposition :',
540
+    'login_recharger' => 'recharger cette page',
541
+    'login_rester_identifie' => 'Se souvenir de moi',
542
+    'login_retour_public' => 'Retour au site public',
543
+    'login_retour_site' => 'Retour au site public',
544
+    'login_retoursitepublic' => 'retour au site public',
545
+    'login_sans_cookie' => 'Identification sans cookie',
546
+    'login_securise' => 'Login sécurisé',
547
+    'login_sinscrire' => 's’inscrire',
548
+    'login_test_navigateur' => 'test navigateur/reconnexion',
549
+    'login_verifiez_navigateur' => '(Vérifie toutefois que ton navigateur n’a pas mémorisé ton mot de passe...)',
550 550
 
551
-	// M
552
-	'masquer_colonne' => 'Masquer cette colonne',
553
-	'masquer_trad' => 'masquer les traductions',
554
-	'message_nouveaux_identifiants_echec' => 'Impossible de générer de nouveaux identifiants.',
555
-	'message_nouveaux_identifiants_echec_envoi' => 'Les nouveaux identifiants de connexion n’ont pas pu être envoyés.',
556
-	'message_nouveaux_identifiants_ok' => 'Les nouveaux identifiants de connexion ont été envoyés à @email@.',
557
-	'module_fichiers_langues' => 'Fichiers de langue',
551
+    // M
552
+    'masquer_colonne' => 'Masquer cette colonne',
553
+    'masquer_trad' => 'masquer les traductions',
554
+    'message_nouveaux_identifiants_echec' => 'Impossible de générer de nouveaux identifiants.',
555
+    'message_nouveaux_identifiants_echec_envoi' => 'Les nouveaux identifiants de connexion n’ont pas pu être envoyés.',
556
+    'message_nouveaux_identifiants_ok' => 'Les nouveaux identifiants de connexion ont été envoyés à @email@.',
557
+    'module_fichiers_langues' => 'Fichiers de langue',
558 558
 
559
-	// N
560
-	'navigateur_pas_redirige' => 'Si votre navigateur n’est pas redirigé, cliquez ici pour continuer.',
561
-	'numero' => 'Numéro',
559
+    // N
560
+    'navigateur_pas_redirige' => 'Si votre navigateur n’est pas redirigé, cliquez ici pour continuer.',
561
+    'numero' => 'Numéro',
562 562
 
563
-	// O
564
-	'occurence' => 'Occurence',
565
-	'onglet_affacer_base' => 'Effacer la base',
566
-	'onglet_auteur' => 'L’auteur',
567
-	'onglet_contenu_site' => 'Contenu du site',
568
-	'onglet_evolution_visite_mod' => 'Évolution',
569
-	'onglet_fonctions_avances' => 'Fonctions avancées',
570
-	'onglet_informations_personnelles' => 'Informations personnelles',
571
-	'onglet_interactivite' => 'Interactivité',
572
-	'onglet_messagerie' => 'Messagerie',
573
-	'onglet_repartition_rubrique' => 'Répartition par rubriques',
574
-	'onglet_save_restaur_base' => 'Sauvegarder/restaurer la base',
575
-	'onglet_vider_cache' => 'Vider le cache',
563
+    // O
564
+    'occurence' => 'Occurence',
565
+    'onglet_affacer_base' => 'Effacer la base',
566
+    'onglet_auteur' => 'L’auteur',
567
+    'onglet_contenu_site' => 'Contenu du site',
568
+    'onglet_evolution_visite_mod' => 'Évolution',
569
+    'onglet_fonctions_avances' => 'Fonctions avancées',
570
+    'onglet_informations_personnelles' => 'Informations personnelles',
571
+    'onglet_interactivite' => 'Interactivité',
572
+    'onglet_messagerie' => 'Messagerie',
573
+    'onglet_repartition_rubrique' => 'Répartition par rubriques',
574
+    'onglet_save_restaur_base' => 'Sauvegarder/restaurer la base',
575
+    'onglet_vider_cache' => 'Vider le cache',
576 576
 
577
-	// P
578
-	'pass_choix_pass' => 'Choisis ton nouveau mot de passe :',
579
-	'pass_erreur' => 'Erreur',
580
-	'pass_erreur_acces_refuse' => '<b>Erreur :</b> tu n’as plus accès à ce site.',
581
-	'pass_erreur_code_inconnu' => '<b>Erreur :</b> ce code ne correspond à aucun des visiteurs ayant accès à ce site.',
582
-	'pass_erreur_non_enregistre' => '<b>Erreur :</b> l’adresse <tt>@email_oubli@</tt> n’est pas enregistrée sur ce site.',
583
-	'pass_erreur_non_valide' => '<b>Erreur :</b> cet email <tt>@email_oubli@</tt> n’est pas valide !',
584
-	'pass_erreur_probleme_technique' => '<b>Erreur :</b> à cause d’un problème technique, l’email ne peut pas être envoyé.',
585
-	'pass_espace_prive_bla' => 'L’espace privé de ce site est ouvert aux
577
+    // P
578
+    'pass_choix_pass' => 'Choisis ton nouveau mot de passe :',
579
+    'pass_erreur' => 'Erreur',
580
+    'pass_erreur_acces_refuse' => '<b>Erreur :</b> tu n’as plus accès à ce site.',
581
+    'pass_erreur_code_inconnu' => '<b>Erreur :</b> ce code ne correspond à aucun des visiteurs ayant accès à ce site.',
582
+    'pass_erreur_non_enregistre' => '<b>Erreur :</b> l’adresse <tt>@email_oubli@</tt> n’est pas enregistrée sur ce site.',
583
+    'pass_erreur_non_valide' => '<b>Erreur :</b> cet email <tt>@email_oubli@</tt> n’est pas valide !',
584
+    'pass_erreur_probleme_technique' => '<b>Erreur :</b> à cause d’un problème technique, l’email ne peut pas être envoyé.',
585
+    'pass_espace_prive_bla' => 'L’espace privé de ce site est ouvert aux
586 586
 		visiteurs, après inscription. Une fois enregistré,
587 587
 		tu pourras consulter les articles en cours de rédaction,
588 588
 		proposer des articles et participer à tous les forums.',
589
-	'pass_forum_bla' => 'Tu as demandé à intervenir sur un forum
589
+    'pass_forum_bla' => 'Tu as demandé à intervenir sur un forum
590 590
 		réservé aux visiteurs enregistrés.',
591
-	'pass_indiquez_cidessous' => 'Indique ci-dessous l’adresse email sous laquelle tu
591
+    'pass_indiquez_cidessous' => 'Indique ci-dessous l’adresse email sous laquelle tu
592 592
 			t’es précédemment enregistré. Tu
593 593
 			recevras un email t’indiquant la marche à suivre pour
594 594
 			récupérer ton accès.',
595
-	'pass_mail_passcookie' => '(ceci est un message automatique)
595
+    'pass_mail_passcookie' => '(ceci est un message automatique)
596 596
 Pour retrouver ton accès au site
597 597
 @nom_site_spip@ (@adresse_site@)
598 598
 Rends toi à l’adresse suivante :
@@ -603,146 +603,146 @@  discard block
 block discarded – undo
603 603
 et te reconnecter au site.
604 604
 
605 605
 ',
606
-	'pass_mot_oublie' => 'Mot de passe oublié',
607
-	'pass_nouveau_enregistre' => 'Ton nouveau mot de passe a été enregistré.',
608
-	'pass_nouveau_pass' => 'Nouveau mot de passe',
609
-	'pass_ok' => 'OK',
610
-	'pass_oubli_mot' => 'Oubli du mot de passe',
611
-	'pass_procedure_changer' => 'Pour changer ton mot de passe, merci d’indiquer l’adresse email associée à ton compte.',
612
-	'pass_quitter_fenetre' => 'Quitter cette fenêtre',
613
-	'pass_rappel_login' => 'Rappel : ton identifiant (login) est « @login@ ».',
614
-	'pass_recevoir_mail' => 'Un lien de réinitialisation de ton mot de passe t’a été envoyé sur ton adresse email (si celle-ci est valide).',
615
-	'pass_retour_public' => 'Retour sur le site public',
616
-	'pass_rien_a_faire_ici' => 'Rien à faire ici.',
617
-	'pass_vousinscrire' => 'T’inscrire sur ce site',
618
-	'precedent' => 'précédent',
619
-	'previsualisation' => 'Prévisualisation',
620
-	'previsualiser' => 'Prévisualiser',
606
+    'pass_mot_oublie' => 'Mot de passe oublié',
607
+    'pass_nouveau_enregistre' => 'Ton nouveau mot de passe a été enregistré.',
608
+    'pass_nouveau_pass' => 'Nouveau mot de passe',
609
+    'pass_ok' => 'OK',
610
+    'pass_oubli_mot' => 'Oubli du mot de passe',
611
+    'pass_procedure_changer' => 'Pour changer ton mot de passe, merci d’indiquer l’adresse email associée à ton compte.',
612
+    'pass_quitter_fenetre' => 'Quitter cette fenêtre',
613
+    'pass_rappel_login' => 'Rappel : ton identifiant (login) est « @login@ ».',
614
+    'pass_recevoir_mail' => 'Un lien de réinitialisation de ton mot de passe t’a été envoyé sur ton adresse email (si celle-ci est valide).',
615
+    'pass_retour_public' => 'Retour sur le site public',
616
+    'pass_rien_a_faire_ici' => 'Rien à faire ici.',
617
+    'pass_vousinscrire' => 'T’inscrire sur ce site',
618
+    'precedent' => 'précédent',
619
+    'previsualisation' => 'Prévisualisation',
620
+    'previsualiser' => 'Prévisualiser',
621 621
 
622
-	// R
623
-	'retour' => 'Retour',
622
+    // R
623
+    'retour' => 'Retour',
624 624
 
625
-	// S
626
-	'spip_conforme_dtd' => 'SPIP considère ce document comme conforme à son DOCTYPE :',
627
-	'squelette' => 'squelette',
628
-	'squelette_inclus_ligne' => 'squelette inclus, ligne',
629
-	'squelette_ligne' => 'squelette, ligne',
630
-	'stats_visites_et_popularite' => '@visites@ visites ; popularité : @popularite@',
631
-	'suivant' => 'suivant',
625
+    // S
626
+    'spip_conforme_dtd' => 'SPIP considère ce document comme conforme à son DOCTYPE :',
627
+    'squelette' => 'squelette',
628
+    'squelette_inclus_ligne' => 'squelette inclus, ligne',
629
+    'squelette_ligne' => 'squelette, ligne',
630
+    'stats_visites_et_popularite' => '@visites@ visites ; popularité : @popularite@',
631
+    'suivant' => 'suivant',
632 632
 
633
-	// T
634
-	'taille_go' => '@taille@ Go',
635
-	'taille_ko' => '@taille@ ko',
636
-	'taille_mo' => '@taille@ Mo',
637
-	'taille_octets' => '@taille@ octets',
638
-	'texte_actualite_site_1' => 'Quand tu seras familiarisé(e) avec l’interface, tu pourras cliquer sur « ',
639
-	'texte_actualite_site_2' => 'interface complète',
640
-	'texte_actualite_site_3' => ' » pour ouvrir plus de possibilités.',
641
-	'texte_creation_automatique_vignette' => 'La création automatique de vignettes de prévisualisation est activée sur ce site. Si tu installe à partir de ce formulaire des images au(x) format(s) @gd_formats@, elles seront accompagnées d’une vignette d’une taille maximale de @taille_preview@ pixels.',
642
-	'texte_documents_associes' => 'Les documents suivants sont associés à l’article,
633
+    // T
634
+    'taille_go' => '@taille@ Go',
635
+    'taille_ko' => '@taille@ ko',
636
+    'taille_mo' => '@taille@ Mo',
637
+    'taille_octets' => '@taille@ octets',
638
+    'texte_actualite_site_1' => 'Quand tu seras familiarisé(e) avec l’interface, tu pourras cliquer sur « ',
639
+    'texte_actualite_site_2' => 'interface complète',
640
+    'texte_actualite_site_3' => ' » pour ouvrir plus de possibilités.',
641
+    'texte_creation_automatique_vignette' => 'La création automatique de vignettes de prévisualisation est activée sur ce site. Si tu installe à partir de ce formulaire des images au(x) format(s) @gd_formats@, elles seront accompagnées d’une vignette d’une taille maximale de @taille_preview@ pixels.',
642
+    'texte_documents_associes' => 'Les documents suivants sont associés à l’article,
643 643
 				mais ils n’y ont pas été directement
644 644
 				insérés. Selon la mise en page du site public,
645 645
 				ils pourront apparaître sous forme de documents joints.',
646
-	'texte_erreur_mise_niveau_base' => 'Erreur de base de données lors de la mise à niveau.
646
+    'texte_erreur_mise_niveau_base' => 'Erreur de base de données lors de la mise à niveau.
647 647
   L’image <b>@fichier@</b> n’est pas passée (article @id_article@).
648 648
   Note bien cette référence, réessaye la mise à
649 649
   niveau, et enfin vérifie que les images apparaissent
650 650
   toujours dans les articles.',
651
-	'texte_erreur_visiteur' => 'Tu as tenté d’accéder à l’espace privé avec un login qui ne le permet pas.',
652
-	'texte_inc_auth_1' => 'Tu es identifié sous le
651
+    'texte_erreur_visiteur' => 'Tu as tenté d’accéder à l’espace privé avec un login qui ne le permet pas.',
652
+    'texte_inc_auth_1' => 'Tu es identifié sous le
653 653
   login <b>@auth_login@</b>, mais celui-ci n’existe pas/plus dans la base.
654 654
   Essaye de te',
655
-	'texte_inc_auth_2' => 'reconnecter',
656
-	'texte_inc_auth_3' => ', après avoir éventuellement quitté puis
655
+    'texte_inc_auth_2' => 'reconnecter',
656
+    'texte_inc_auth_3' => ', après avoir éventuellement quitté puis
657 657
 		redémarré ton navigateur.',
658
-	'texte_inc_config' => 'Les modifications effectuées dans ces pages influent notablement sur le
658
+    'texte_inc_config' => 'Les modifications effectuées dans ces pages influent notablement sur le
659 659
  fonctionnement de ton site. Nous te recommandons de ne pas y intervenir tant que tu n’es pas
660 660
  familier du fonctionnement du système SPIP. <br /><br /><b>Plus
661 661
  généralement, il est fortement conseillé
662 662
  de laisser la charge de ces pages au webmestre principal de ton site.</b>',
663
-	'texte_inc_meta_1' => 'Le système a rencontré une erreur lors de l’écriture du fichier <code>@fichier@</code>. En tant qu’administrateur du site,',
664
-	'texte_inc_meta_2' => 'vérifie les droits d’ecriture',
665
-	'texte_inc_meta_3' => 'sur le répertoire <code>@repertoire@</code>.',
666
-	'texte_statut_en_cours_redaction' => 'en cours de rédaction',
667
-	'texte_statut_poubelle' => 'à la poubelle',
668
-	'texte_statut_propose_evaluation' => 'proposé à l’évaluation',
669
-	'texte_statut_publie' => 'publié en ligne',
670
-	'texte_statut_refuse' => 'refusé',
671
-	'titre_ajouter_mot_cle' => 'AJOUTER UN MOT-CLÉ :',
672
-	'titre_cadre_raccourcis' => 'RACCOURCIS :',
673
-	'titre_changer_couleur_interface' => 'Changer la couleur de l’interface',
674
-	'titre_image_admin_article' => 'Tu peux administrer cet article',
675
-	'titre_image_administrateur' => 'Administrateur',
676
-	'titre_image_aide' => 'De l’aide sur cet élément',
677
-	'titre_image_auteur_supprime' => 'Auteur supprimé',
678
-	'titre_image_redacteur' => 'Rédacteur sans accès',
679
-	'titre_image_redacteur_02' => 'Rédacteur',
680
-	'titre_image_selecteur' => 'Afficher la liste',
681
-	'titre_image_visiteur' => 'Visiteur',
682
-	'titre_joindre_document' => 'JOINDRE UN DOCUMENT',
683
-	'titre_mots_cles' => 'MOTS-CLÉS',
684
-	'titre_probleme_technique' => 'Attention : un problème technique (serveur SQL) empêche l’accès à cette partie du site. Merci de ta compréhension.',
685
-	'titre_publier_document' => 'PUBLIER UN DOCUMENT DANS CETTE RUBRIQUE',
686
-	'titre_signatures_attente' => 'Signatures en attente de validation',
687
-	'titre_signatures_confirmees' => 'Signatures confirmées',
688
-	'titre_statistiques' => 'Statistiques du site',
689
-	'titre_titre_document' => 'Titre du document :',
690
-	'todo' => 'à venir',
691
-	'trad_definir_reference' => 'Choisir "@titre@" comme référence des traductions',
692
-	'trad_reference' => '(référence des traductions)',
663
+    'texte_inc_meta_1' => 'Le système a rencontré une erreur lors de l’écriture du fichier <code>@fichier@</code>. En tant qu’administrateur du site,',
664
+    'texte_inc_meta_2' => 'vérifie les droits d’ecriture',
665
+    'texte_inc_meta_3' => 'sur le répertoire <code>@repertoire@</code>.',
666
+    'texte_statut_en_cours_redaction' => 'en cours de rédaction',
667
+    'texte_statut_poubelle' => 'à la poubelle',
668
+    'texte_statut_propose_evaluation' => 'proposé à l’évaluation',
669
+    'texte_statut_publie' => 'publié en ligne',
670
+    'texte_statut_refuse' => 'refusé',
671
+    'titre_ajouter_mot_cle' => 'AJOUTER UN MOT-CLÉ :',
672
+    'titre_cadre_raccourcis' => 'RACCOURCIS :',
673
+    'titre_changer_couleur_interface' => 'Changer la couleur de l’interface',
674
+    'titre_image_admin_article' => 'Tu peux administrer cet article',
675
+    'titre_image_administrateur' => 'Administrateur',
676
+    'titre_image_aide' => 'De l’aide sur cet élément',
677
+    'titre_image_auteur_supprime' => 'Auteur supprimé',
678
+    'titre_image_redacteur' => 'Rédacteur sans accès',
679
+    'titre_image_redacteur_02' => 'Rédacteur',
680
+    'titre_image_selecteur' => 'Afficher la liste',
681
+    'titre_image_visiteur' => 'Visiteur',
682
+    'titre_joindre_document' => 'JOINDRE UN DOCUMENT',
683
+    'titre_mots_cles' => 'MOTS-CLÉS',
684
+    'titre_probleme_technique' => 'Attention : un problème technique (serveur SQL) empêche l’accès à cette partie du site. Merci de ta compréhension.',
685
+    'titre_publier_document' => 'PUBLIER UN DOCUMENT DANS CETTE RUBRIQUE',
686
+    'titre_signatures_attente' => 'Signatures en attente de validation',
687
+    'titre_signatures_confirmees' => 'Signatures confirmées',
688
+    'titre_statistiques' => 'Statistiques du site',
689
+    'titre_titre_document' => 'Titre du document :',
690
+    'todo' => 'à venir',
691
+    'trad_definir_reference' => 'Choisir "@titre@" comme référence des traductions',
692
+    'trad_reference' => '(référence des traductions)',
693 693
 
694
-	// U
695
-	'upload_limit' => 'Ce fichier est trop gros pour le serveur ; la taille maximum autorisée en <i>upload</i> est de @max@.',
694
+    // U
695
+    'upload_limit' => 'Ce fichier est trop gros pour le serveur ; la taille maximum autorisée en <i>upload</i> est de @max@.',
696 696
 
697
-	// Z
698
-	'zbug_balise_b_aval' => ' : balise B en aval',
699
-	'zbug_balise_inexistante' => 'Balise @balise@ mal déclarée pour @from@',
700
-	'zbug_balise_sans_argument' => 'Argument manquant dans la balise @balise@',
701
-	'zbug_boucle' => 'boucle',
702
-	'zbug_boucle_recursive_undef' => 'boucle récursive non définie',
703
-	'zbug_calcul' => 'calcul',
704
-	'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle',
705
-	'zbug_champ_hors_critere' => 'Champ @champ@ hors critère @critere@',
706
-	'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@',
707
-	'zbug_code' => 'code',
708
-	'zbug_critere_inconnu' => 'critère inconnu @critere@',
709
-	'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique',
710
-	'zbug_distant_interdit' => 'externe interdit',
711
-	'zbug_doublon_table_sans_cle_primaire' => 'doublons sur une table sans clef primaire atomique',
712
-	'zbug_doublon_table_sans_index' => 'doublons sur une table sans index',
713
-	'zbug_erreur_boucle_double' => 'BOUCLE@id@ : double définition',
714
-	'zbug_erreur_boucle_fermant' => 'BOUCLE@id@ : tag fermant manquant',
715
-	'zbug_erreur_boucle_syntaxe' => 'Syntaxe boucle incorrecte',
716
-	'zbug_erreur_compilation' => 'Erreur de compilation',
717
-	'zbug_erreur_execution_page' => 'erreur d’exécution de la page',
718
-	'zbug_erreur_filtre' => 'Erreur : filtre <b>« @filtre@ »</b> non défini',
719
-	'zbug_erreur_filtre_nbarg_min' => 'Filtre @filtre@ : il manque @nb@ argument(s)',
720
-	'zbug_erreur_meme_parent' => '{meme_parent} ne s’applique qu’aux boucles (FORUMS) ou (RUBRIQUES)',
721
-	'zbug_erreur_squelette' => 'Erreur(s) dans le squelette',
722
-	'zbug_hors_compilation' => 'Hors Compilation',
723
-	'zbug_info_erreur_squelette' => 'Erreur sur le site',
724
-	'zbug_inversion_ordre_inexistant' => 'inversion d’un ordre inexistant',
725
-	'zbug_pagination_sans_critere' => '#PAGINATION sans critère {pagination} ou employé dans une boucle récursive',
726
-	'zbug_parametres_inclus_incorrects' => 'Paramètre d’inclusion incorrect : @param@',
727
-	'zbug_profile' => 'Temps de calcul : @time@',
728
-	'zbug_resultat' => 'résultat',
729
-	'zbug_serveur_indefini' => 'serveur SQL indéfini',
730
-	'zbug_statistiques' => 'Statistiques des requêtes SQL classées par durée',
731
-	'zbug_table_inconnue' => 'Table SQL « @table@ » inconnue',
732
-	'zxml_connus_attributs' => 'attributs connus',
733
-	'zxml_de' => 'de',
734
-	'zxml_inconnu_attribut' => 'attribut inconnu',
735
-	'zxml_inconnu_balise' => 'balise inconnue',
736
-	'zxml_inconnu_entite' => 'entité inconnue',
737
-	'zxml_inconnu_id' => 'ID inconnu',
738
-	'zxml_mais_de' => 'mais de',
739
-	'zxml_non_conforme' => 'n’est pas conforme au motif',
740
-	'zxml_non_fils' => 'n’est pas un fils de',
741
-	'zxml_nonvide_balise' => 'balise non vide',
742
-	'zxml_obligatoire_attribut' => 'attribut obligatoire mais absent dans',
743
-	'zxml_succession_fils_incorrecte' => 'succession des fils incorrecte',
744
-	'zxml_survoler' => 'survoler pour voir les corrects',
745
-	'zxml_valeur_attribut' => 'valeur de l’attribut',
746
-	'zxml_vide_balise' => 'balise vide',
747
-	'zxml_vu' => 'vu auparavant'
697
+    // Z
698
+    'zbug_balise_b_aval' => ' : balise B en aval',
699
+    'zbug_balise_inexistante' => 'Balise @balise@ mal déclarée pour @from@',
700
+    'zbug_balise_sans_argument' => 'Argument manquant dans la balise @balise@',
701
+    'zbug_boucle' => 'boucle',
702
+    'zbug_boucle_recursive_undef' => 'boucle récursive non définie',
703
+    'zbug_calcul' => 'calcul',
704
+    'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle',
705
+    'zbug_champ_hors_critere' => 'Champ @champ@ hors critère @critere@',
706
+    'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@',
707
+    'zbug_code' => 'code',
708
+    'zbug_critere_inconnu' => 'critère inconnu @critere@',
709
+    'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique',
710
+    'zbug_distant_interdit' => 'externe interdit',
711
+    'zbug_doublon_table_sans_cle_primaire' => 'doublons sur une table sans clef primaire atomique',
712
+    'zbug_doublon_table_sans_index' => 'doublons sur une table sans index',
713
+    'zbug_erreur_boucle_double' => 'BOUCLE@id@ : double définition',
714
+    'zbug_erreur_boucle_fermant' => 'BOUCLE@id@ : tag fermant manquant',
715
+    'zbug_erreur_boucle_syntaxe' => 'Syntaxe boucle incorrecte',
716
+    'zbug_erreur_compilation' => 'Erreur de compilation',
717
+    'zbug_erreur_execution_page' => 'erreur d’exécution de la page',
718
+    'zbug_erreur_filtre' => 'Erreur : filtre <b>« @filtre@ »</b> non défini',
719
+    'zbug_erreur_filtre_nbarg_min' => 'Filtre @filtre@ : il manque @nb@ argument(s)',
720
+    'zbug_erreur_meme_parent' => '{meme_parent} ne s’applique qu’aux boucles (FORUMS) ou (RUBRIQUES)',
721
+    'zbug_erreur_squelette' => 'Erreur(s) dans le squelette',
722
+    'zbug_hors_compilation' => 'Hors Compilation',
723
+    'zbug_info_erreur_squelette' => 'Erreur sur le site',
724
+    'zbug_inversion_ordre_inexistant' => 'inversion d’un ordre inexistant',
725
+    'zbug_pagination_sans_critere' => '#PAGINATION sans critère {pagination} ou employé dans une boucle récursive',
726
+    'zbug_parametres_inclus_incorrects' => 'Paramètre d’inclusion incorrect : @param@',
727
+    'zbug_profile' => 'Temps de calcul : @time@',
728
+    'zbug_resultat' => 'résultat',
729
+    'zbug_serveur_indefini' => 'serveur SQL indéfini',
730
+    'zbug_statistiques' => 'Statistiques des requêtes SQL classées par durée',
731
+    'zbug_table_inconnue' => 'Table SQL « @table@ » inconnue',
732
+    'zxml_connus_attributs' => 'attributs connus',
733
+    'zxml_de' => 'de',
734
+    'zxml_inconnu_attribut' => 'attribut inconnu',
735
+    'zxml_inconnu_balise' => 'balise inconnue',
736
+    'zxml_inconnu_entite' => 'entité inconnue',
737
+    'zxml_inconnu_id' => 'ID inconnu',
738
+    'zxml_mais_de' => 'mais de',
739
+    'zxml_non_conforme' => 'n’est pas conforme au motif',
740
+    'zxml_non_fils' => 'n’est pas un fils de',
741
+    'zxml_nonvide_balise' => 'balise non vide',
742
+    'zxml_obligatoire_attribut' => 'attribut obligatoire mais absent dans',
743
+    'zxml_succession_fils_incorrecte' => 'succession des fils incorrecte',
744
+    'zxml_survoler' => 'survoler pour voir les corrects',
745
+    'zxml_valeur_attribut' => 'valeur de l’attribut',
746
+    'zxml_vide_balise' => 'balise vide',
747
+    'zxml_vu' => 'vu auparavant'
748 748
 );
Please login to merge, or discard this patch.
ecrire/lang/ecrire_pt.php 1 patch
Indentation   +836 added lines, -836 removed lines patch added patch discarded remove patch
@@ -4,925 +4,925 @@
 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' => 'Activar o plugin',
14
-	'affichage' => 'Mostrar',
15
-	'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.',
16
-	'annuler_recherche' => 'Cancelar a pesquisa',
17
-	'auteur' => 'Autor :',
18
-	'avis_acces_interdit' => 'Accesso interdito. ',
19
-	'avis_acces_interdit_prive' => 'Não está autorizado a aceder à página <b>@exec@</b>.',
20
-	'avis_article_modifie' => 'Atenção, @nom_auteur_modif@  trabalhou neste artigo há @date_diff@ minutes',
21
-	'avis_aucun_resultat' => 'Sem resultados. ',
22
-	'avis_base_inaccessible' => 'Impossível conectar-se à base de dados @base@.',
23
-	'avis_chemin_invalide_1' => 'O caminho que escolheu ',
24
-	'avis_chemin_invalide_2' => 'não parece ser válido. Por favor regresse à página anterior e verifique as informações fornecidas. ',
25
-	'avis_connexion_echec_1' => 'A ligação ao servidor SQL falhou.',
26
-	'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que forneceu. ',
27
-	'avis_connexion_echec_3' => '<b>N.B.</b> Em diversos servidores, precisa <b>solicitar</b> a activação do seu acesso à base de dados SQL antes de poder utilizá-la. Se não consegue ligar-se à sua base de dados, verifique se efectuou esse pedido.',
28
-	'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.',
29
-	'avis_connexion_erreur_nom_base' => 'O nome da base de dados só pode conter letras, números e hífen.',
30
-	'avis_connexion_ldap_echec_1' => 'A ligação ao servidor LDAP falhou.',
31
-	'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que forneceu ',
32
-	'avis_connexion_ldap_echec_3' => 'Alternativamente, não utilize o suporte LDAP para importar utilizadores.',
33
-	'avis_deplacement_rubrique' => 'Atenção ! Esta rubrica contém @contient_breves@ informação@scb@ : se a deslocar, por favor confirme-o nesta caixa.',
34
-	'avis_erreur_connexion_mysql' => 'Erro de ligação SQL',
35
-	'avis_espace_interdit' => '<b>Espaço interdito</b><p>SPIP já está instalado.',
36
-	'avis_lecture_noms_bases_1' => 'O programa de instalação não conseguiu ler os nomes das bases de dados instaladas. ',
37
-	'avis_lecture_noms_bases_2' => 'Ou nenhuma base de dados está disponível, ou a função que permite listá-las foi desactivada
12
+    // A
13
+    'activer_plugin' => 'Activar o plugin',
14
+    'affichage' => 'Mostrar',
15
+    'aide_non_disponible' => 'Esta parte da ajuda online ainda não está disponível neste idioma.',
16
+    'annuler_recherche' => 'Cancelar a pesquisa',
17
+    'auteur' => 'Autor :',
18
+    'avis_acces_interdit' => 'Accesso interdito. ',
19
+    'avis_acces_interdit_prive' => 'Não está autorizado a aceder à página <b>@exec@</b>.',
20
+    'avis_article_modifie' => 'Atenção, @nom_auteur_modif@  trabalhou neste artigo há @date_diff@ minutes',
21
+    'avis_aucun_resultat' => 'Sem resultados. ',
22
+    'avis_base_inaccessible' => 'Impossível conectar-se à base de dados @base@.',
23
+    'avis_chemin_invalide_1' => 'O caminho que escolheu ',
24
+    'avis_chemin_invalide_2' => 'não parece ser válido. Por favor regresse à página anterior e verifique as informações fornecidas. ',
25
+    'avis_connexion_echec_1' => 'A ligação ao servidor SQL falhou.',
26
+    'avis_connexion_echec_2' => 'Volte à página anterior e verifique as informações que forneceu. ',
27
+    'avis_connexion_echec_3' => '<b>N.B.</b> Em diversos servidores, precisa <b>solicitar</b> a activação do seu acesso à base de dados SQL antes de poder utilizá-la. Se não consegue ligar-se à sua base de dados, verifique se efectuou esse pedido.',
28
+    'avis_connexion_erreur_creer_base' => 'Não foi possível criar a base de dados.',
29
+    'avis_connexion_erreur_nom_base' => 'O nome da base de dados só pode conter letras, números e hífen.',
30
+    'avis_connexion_ldap_echec_1' => 'A ligação ao servidor LDAP falhou.',
31
+    'avis_connexion_ldap_echec_2' => 'Volte à página anterior e verifique as informações que forneceu ',
32
+    'avis_connexion_ldap_echec_3' => 'Alternativamente, não utilize o suporte LDAP para importar utilizadores.',
33
+    'avis_deplacement_rubrique' => 'Atenção ! Esta rubrica contém @contient_breves@ informação@scb@ : se a deslocar, por favor confirme-o nesta caixa.',
34
+    'avis_erreur_connexion_mysql' => 'Erro de ligação SQL',
35
+    'avis_espace_interdit' => '<b>Espaço interdito</b><p>SPIP já está instalado.',
36
+    'avis_lecture_noms_bases_1' => 'O programa de instalação não conseguiu ler os nomes das bases de dados instaladas. ',
37
+    'avis_lecture_noms_bases_2' => 'Ou nenhuma base de dados está disponível, ou a função que permite listá-las foi desactivada
38 38
 por razões de segurança (o que é o caso em muitos serviços de hospedagem).  ',
39
-	'avis_lecture_noms_bases_3' => 'Na segunda alternativa, é provável que uma base tendo o  seu nome de login seja utilizável :',
40
-	'avis_non_acces_page' => 'Não tem acesso a esta página. ',
41
-	'avis_operation_echec' => 'A operação falhou. ',
42
-	'avis_operation_impossible' => 'Operação impossivel',
43
-	'avis_suppression_base' => 'Atenção, a supressão dos dados é irreversível',
39
+    'avis_lecture_noms_bases_3' => 'Na segunda alternativa, é provável que uma base tendo o  seu nome de login seja utilizável :',
40
+    'avis_non_acces_page' => 'Não tem acesso a esta página. ',
41
+    'avis_operation_echec' => 'A operação falhou. ',
42
+    'avis_operation_impossible' => 'Operação impossivel',
43
+    'avis_suppression_base' => 'Atenção, a supressão dos dados é irreversível',
44 44
 
45
-	// B
46
-	'bouton_acces_ldap' => 'Acrescentar o acesso a LDAP >>',
47
-	'bouton_ajouter' => 'Acrescentar ',
48
-	'bouton_annuler' => 'Cancelar',
49
-	'bouton_cache_activer' => 'Reactivar a cache',
50
-	'bouton_cache_desactiver' => 'Desactivar temporariamente a cache',
51
-	'bouton_demande_publication' => 'Pedir a publicação deste artigo ',
52
-	'bouton_desactive_tout' => 'Desactivar tudo',
53
-	'bouton_desinstaller' => 'Desinstalar',
54
-	'bouton_effacer_tout' => 'Apagar TUDO',
55
-	'bouton_envoyer_message' => 'Mensagem definitiva: enviar',
56
-	'bouton_fermer' => 'Fechar',
57
-	'bouton_mettre_a_jour_base' => 'Actualizar a base de dados',
58
-	'bouton_modifier' => 'Modificar',
59
-	'bouton_radio_afficher' => 'Exibir',
60
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Aparecer na lista dos redactores ligados',
61
-	'bouton_radio_envoi_annonces_adresse' => 'Enviar os anúncios para o endereço:',
62
-	'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista das novidades',
63
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não aparecer na lista dos redactores online',
64
-	'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar anúncios editoriais',
65
-	'bouton_redirection' => 'REDIRECCIONAR',
66
-	'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Repor para valores padrão',
67
-	'bouton_relancer_inscription' => 'Relançar o registo',
68
-	'bouton_relancer_inscriptions' => 'Relançar os registos',
69
-	'bouton_relancer_installation' => 'Recomeçar a instalação',
70
-	'bouton_reset_password' => 'Gerar uma nova senha e enviá-la por e-mail',
71
-	'bouton_suivant' => 'Seguinte',
72
-	'bouton_tenter_recuperation' => 'Tentar uma reparação',
73
-	'bouton_test_proxy' => 'Testar o proxy',
74
-	'bouton_vider_cache' => 'Esvaziar a cache',
45
+    // B
46
+    'bouton_acces_ldap' => 'Acrescentar o acesso a LDAP >>',
47
+    'bouton_ajouter' => 'Acrescentar ',
48
+    'bouton_annuler' => 'Cancelar',
49
+    'bouton_cache_activer' => 'Reactivar a cache',
50
+    'bouton_cache_desactiver' => 'Desactivar temporariamente a cache',
51
+    'bouton_demande_publication' => 'Pedir a publicação deste artigo ',
52
+    'bouton_desactive_tout' => 'Desactivar tudo',
53
+    'bouton_desinstaller' => 'Desinstalar',
54
+    'bouton_effacer_tout' => 'Apagar TUDO',
55
+    'bouton_envoyer_message' => 'Mensagem definitiva: enviar',
56
+    'bouton_fermer' => 'Fechar',
57
+    'bouton_mettre_a_jour_base' => 'Actualizar a base de dados',
58
+    'bouton_modifier' => 'Modificar',
59
+    'bouton_radio_afficher' => 'Exibir',
60
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Aparecer na lista dos redactores ligados',
61
+    'bouton_radio_envoi_annonces_adresse' => 'Enviar os anúncios para o endereço:',
62
+    'bouton_radio_envoi_liste_nouveautes' => 'Enviar a lista das novidades',
63
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Não aparecer na lista dos redactores online',
64
+    'bouton_radio_non_envoi_annonces_editoriales' => 'Não enviar anúncios editoriais',
65
+    'bouton_redirection' => 'REDIRECCIONAR',
66
+    'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Repor para valores padrão',
67
+    'bouton_relancer_inscription' => 'Relançar o registo',
68
+    'bouton_relancer_inscriptions' => 'Relançar os registos',
69
+    'bouton_relancer_installation' => 'Recomeçar a instalação',
70
+    'bouton_reset_password' => 'Gerar uma nova senha e enviá-la por e-mail',
71
+    'bouton_suivant' => 'Seguinte',
72
+    'bouton_tenter_recuperation' => 'Tentar uma reparação',
73
+    'bouton_test_proxy' => 'Testar o proxy',
74
+    'bouton_vider_cache' => 'Esvaziar a cache',
75 75
 
76
-	// C
77
-	'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.',
78
-	'calendrier_synchro' => 'Se utilizar um software de agenda compatível <b>iCal</b>, pode sincronizá-lo com as informações deste sítio.',
79
-	'config_activer_champs' => 'Activar os campos seguintes',
80
-	'config_choix_base_sup' => 'Escolher uma base de dados neste servidor',
81
-	'config_erreur_base_sup' => 'SPIP não tem acesso à lista de bases de dados disponíveis',
82
-	'config_info_base_sup' => 'Se precisar de consultar outras bases de dados usando SPIP, quer seja neste servidor SQL ou noutro, use este formulário para as declarar. Se deixar alguns campos por preencher, os identificadores de conexão à base de dados principal serão usados.',
83
-	'config_info_base_sup_disponibles' => 'Bases de dados adicionais que se podem consultar:',
84
-	'config_info_enregistree' => 'A nova configuração foi guardada',
85
-	'config_info_logos' => 'Cada elemento do site pode ter o seu próprio logo, assim como um «mouseover»',
86
-	'config_info_logos_utiliser' => 'Utilizar os logos',
87
-	'config_info_logos_utiliser_non' => 'Não utilizar os logos',
88
-	'config_info_logos_utiliser_survol' => 'Usar os logos de "mouseover"',
89
-	'config_info_logos_utiliser_survol_non' => 'Não usar os logos de "mouseover"',
90
-	'config_info_redirection' => 'Activando esta opção, pode criar artigos virtuais, que são referências simples a artigos publicados noutros sítios, não necessariamente usando SPIP.',
91
-	'config_redirection' => 'Artigos virtuais',
92
-	'config_titre_base_sup' => 'Declaração de uma base de dados suplementar',
93
-	'config_titre_base_sup_choix' => 'Escolher uma base de dados suplementar',
94
-	'connexion_ldap' => 'Conexão:',
95
-	'creer_et_associer_un_auteur' => 'Criar e associar um autor',
76
+    // C
77
+    'cache_modifiable_webmestre' => 'Este parâmetro é modificável pelo webmaster do site.',
78
+    'calendrier_synchro' => 'Se utilizar um software de agenda compatível <b>iCal</b>, pode sincronizá-lo com as informações deste sítio.',
79
+    'config_activer_champs' => 'Activar os campos seguintes',
80
+    'config_choix_base_sup' => 'Escolher uma base de dados neste servidor',
81
+    'config_erreur_base_sup' => 'SPIP não tem acesso à lista de bases de dados disponíveis',
82
+    'config_info_base_sup' => 'Se precisar de consultar outras bases de dados usando SPIP, quer seja neste servidor SQL ou noutro, use este formulário para as declarar. Se deixar alguns campos por preencher, os identificadores de conexão à base de dados principal serão usados.',
83
+    'config_info_base_sup_disponibles' => 'Bases de dados adicionais que se podem consultar:',
84
+    'config_info_enregistree' => 'A nova configuração foi guardada',
85
+    'config_info_logos' => 'Cada elemento do site pode ter o seu próprio logo, assim como um «mouseover»',
86
+    'config_info_logos_utiliser' => 'Utilizar os logos',
87
+    'config_info_logos_utiliser_non' => 'Não utilizar os logos',
88
+    'config_info_logos_utiliser_survol' => 'Usar os logos de "mouseover"',
89
+    'config_info_logos_utiliser_survol_non' => 'Não usar os logos de "mouseover"',
90
+    'config_info_redirection' => 'Activando esta opção, pode criar artigos virtuais, que são referências simples a artigos publicados noutros sítios, não necessariamente usando SPIP.',
91
+    'config_redirection' => 'Artigos virtuais',
92
+    'config_titre_base_sup' => 'Declaração de uma base de dados suplementar',
93
+    'config_titre_base_sup_choix' => 'Escolher uma base de dados suplementar',
94
+    'connexion_ldap' => 'Conexão:',
95
+    'creer_et_associer_un_auteur' => 'Criar e associar um autor',
96 96
 
97
-	// D
98
-	'date_mot_heures' => 'horas',
97
+    // D
98
+    'date_mot_heures' => 'horas',
99 99
 
100
-	// E
101
-	'ecran_connexion_couleur_principale' => 'Cor principal',
102
-	'ecran_connexion_image_fond' => 'Imagem de fundo',
103
-	'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)',
104
-	'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão',
105
-	'ecran_connexion_titre' => 'Ecrã de ligação',
106
-	'ecran_securite' => ' + ecrã de segurança @version@',
107
-	'email' => 'email',
108
-	'email_2' => 'email :',
109
-	'en_savoir_plus' => 'Para saber mais',
110
-	'entree_adresse_annuaire' => 'Endereço do directório',
111
-	'entree_adresse_email' => 'O seu endereço email',
112
-	'entree_adresse_email_2' => 'Endereço electrónico',
113
-	'entree_base_donnee_1' => 'Endereço da base de dados',
114
-	'entree_base_donnee_2' => '(Muitas vezes, este endereço corresponde ao do seu sítio, outras vezes, corresponde à menção «localhost», às vezes, fica totalmente vazio.)',
115
-	'entree_biographie' => 'Curta biografia',
116
-	'entree_chemin_acces' => '<b>Introduzir</b> o caminho de acesso :',
117
-	'entree_cle_pgp' => 'A sua chave PGP',
118
-	'entree_cle_pgp_2' => 'Chave PGP',
119
-	'entree_contenu_rubrique' => '(Conteúdo da rubrica em poucas palavras.)',
120
-	'entree_identifiants_connexion' => 'Os seus identificadores de ligação',
121
-	'entree_identifiants_connexion_2' => 'Identifcadores de conexão',
122
-	'entree_informations_connexion_ldap' => 'Por favor preencha este formulário com as informações de ligação ao seu anuário LDAP.
100
+    // E
101
+    'ecran_connexion_couleur_principale' => 'Cor principal',
102
+    'ecran_connexion_image_fond' => 'Imagem de fundo',
103
+    'ecran_connexion_image_fond_explication' => 'Usar uma imagem (formato JPEG, 1920x1080 pixels)',
104
+    'ecran_connexion_image_revenir_couleur_defaut' => 'Reverter para a cor padrão',
105
+    'ecran_connexion_titre' => 'Ecrã de ligação',
106
+    'ecran_securite' => ' + ecrã de segurança @version@',
107
+    'email' => 'email',
108
+    'email_2' => 'email :',
109
+    'en_savoir_plus' => 'Para saber mais',
110
+    'entree_adresse_annuaire' => 'Endereço do directório',
111
+    'entree_adresse_email' => 'O seu endereço email',
112
+    'entree_adresse_email_2' => 'Endereço electrónico',
113
+    'entree_base_donnee_1' => 'Endereço da base de dados',
114
+    'entree_base_donnee_2' => '(Muitas vezes, este endereço corresponde ao do seu sítio, outras vezes, corresponde à menção «localhost», às vezes, fica totalmente vazio.)',
115
+    'entree_biographie' => 'Curta biografia',
116
+    'entree_chemin_acces' => '<b>Introduzir</b> o caminho de acesso :',
117
+    'entree_cle_pgp' => 'A sua chave PGP',
118
+    'entree_cle_pgp_2' => 'Chave PGP',
119
+    'entree_contenu_rubrique' => '(Conteúdo da rubrica em poucas palavras.)',
120
+    'entree_identifiants_connexion' => 'Os seus identificadores de ligação',
121
+    'entree_identifiants_connexion_2' => 'Identifcadores de conexão',
122
+    'entree_informations_connexion_ldap' => 'Por favor preencha este formulário com as informações de ligação ao seu anuário LDAP.
123 123
 Essas informações devem poder ser fornecidas pelo administrador do sistema ou da rede',
124
-	'entree_infos_perso' => 'Quem é você?',
125
-	'entree_infos_perso_2' => 'Quem é o autor?',
126
-	'entree_interieur_rubrique' => 'Dentro da rubrica :',
127
-	'entree_liens_sites' => '<b>Ligação hipertexto</b> (referência, sítio a visitar...)',
128
-	'entree_login' => 'O seu login',
129
-	'entree_login_connexion_1' => 'O login de ligação',
130
-	'entree_login_connexion_2' => '(Corresponde às vezes ao seu login de acesso ao FTP; outras vezes deixado vazio.)',
131
-	'entree_mot_passe' => 'A sua palavra-passe',
132
-	'entree_mot_passe_1' => 'A palavra-passe de ligação',
133
-	'entree_mot_passe_2' => '(Corresponde, às vezes, à sua palavra-passe para o FTP; outras vezes fica vazio)',
134
-	'entree_nom_fichier' => 'Por favor introduza o nome do ficheiro @texte_compresse@:',
135
-	'entree_nom_pseudo' => 'O seu nome ou o seu pseudónimo',
136
-	'entree_nom_pseudo_1' => '(O seu nome ou o seu pseudónimo)',
137
-	'entree_nom_pseudo_2' => 'Nome ou pseudónimo',
138
-	'entree_nom_site' => 'O nome do seu sítio',
139
-	'entree_nom_site_2' => 'Nome do sítio do autor',
140
-	'entree_nouveau_passe' => 'Nova palavra-passe',
141
-	'entree_passe_ldap' => 'Palavra-passe',
142
-	'entree_port_annuaire' => 'O número de porta do anuário',
143
-	'entree_signature' => 'Assinatura',
144
-	'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />',
145
-	'entree_url' => 'O endereço (URL) do seu sítio',
146
-	'entree_url_2' => 'Endereço (URL) do sítio',
147
-	'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome',
148
-	'erreur_contenu_suspect' => 'Texto de caracteres de escape',
149
-	'erreur_email_deja_existant' => 'Este endereço de correio electrónico já está registado.',
150
-	'erreur_nom_connect_incorrect' => 'O nome de servidor não é autorizado',
151
-	'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ em falta no marcador @balise@.',
152
-	'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, pode desactivá-lo.',
153
-	'erreur_plugin_fichier_absent' => 'Ficheiro inexistente',
154
-	'erreur_plugin_fichier_def_absent' => 'Ficheiro de definição inexistente',
155
-	'erreur_plugin_nom_fonction_interdit' => 'Nome de função interdito',
156
-	'erreur_plugin_nom_manquant' => 'Nome de plugin inexistente',
157
-	'erreur_plugin_prefix_manquant' => 'Espaço de criação de nome não definido para este plugin ',
158
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; inexistente no ficheiro de definição',
159
-	'erreur_plugin_version_manquant' => 'Versão de plugin inexistente',
160
-	'erreur_type_fichier' => 'Tipo de ficheiro incorrecto',
124
+    'entree_infos_perso' => 'Quem é você?',
125
+    'entree_infos_perso_2' => 'Quem é o autor?',
126
+    'entree_interieur_rubrique' => 'Dentro da rubrica :',
127
+    'entree_liens_sites' => '<b>Ligação hipertexto</b> (referência, sítio a visitar...)',
128
+    'entree_login' => 'O seu login',
129
+    'entree_login_connexion_1' => 'O login de ligação',
130
+    'entree_login_connexion_2' => '(Corresponde às vezes ao seu login de acesso ao FTP; outras vezes deixado vazio.)',
131
+    'entree_mot_passe' => 'A sua palavra-passe',
132
+    'entree_mot_passe_1' => 'A palavra-passe de ligação',
133
+    'entree_mot_passe_2' => '(Corresponde, às vezes, à sua palavra-passe para o FTP; outras vezes fica vazio)',
134
+    'entree_nom_fichier' => 'Por favor introduza o nome do ficheiro @texte_compresse@:',
135
+    'entree_nom_pseudo' => 'O seu nome ou o seu pseudónimo',
136
+    'entree_nom_pseudo_1' => '(O seu nome ou o seu pseudónimo)',
137
+    'entree_nom_pseudo_2' => 'Nome ou pseudónimo',
138
+    'entree_nom_site' => 'O nome do seu sítio',
139
+    'entree_nom_site_2' => 'Nome do sítio do autor',
140
+    'entree_nouveau_passe' => 'Nova palavra-passe',
141
+    'entree_passe_ldap' => 'Palavra-passe',
142
+    'entree_port_annuaire' => 'O número de porta do anuário',
143
+    'entree_signature' => 'Assinatura',
144
+    'entree_titre_obligatoire' => '<b>Título</b> [Obrigatório]<br />',
145
+    'entree_url' => 'O endereço (URL) do seu sítio',
146
+    'entree_url_2' => 'Endereço (URL) do sítio',
147
+    'erreur_connect_deja_existant' => 'Já existe um servidor com esse nome',
148
+    'erreur_contenu_suspect' => 'Texto de caracteres de escape',
149
+    'erreur_email_deja_existant' => 'Este endereço de correio electrónico já está registado.',
150
+    'erreur_nom_connect_incorrect' => 'O nome de servidor não é autorizado',
151
+    'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ em falta no marcador @balise@.',
152
+    'erreur_plugin_desinstalation_echouee' => 'A desinstalação do plugin falhou. No entanto, pode desactivá-lo.',
153
+    'erreur_plugin_fichier_absent' => 'Ficheiro inexistente',
154
+    'erreur_plugin_fichier_def_absent' => 'Ficheiro de definição inexistente',
155
+    'erreur_plugin_nom_fonction_interdit' => 'Nome de função interdito',
156
+    'erreur_plugin_nom_manquant' => 'Nome de plugin inexistente',
157
+    'erreur_plugin_prefix_manquant' => 'Espaço de criação de nome não definido para este plugin ',
158
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; inexistente no ficheiro de definição',
159
+    'erreur_plugin_version_manquant' => 'Versão de plugin inexistente',
160
+    'erreur_type_fichier' => 'Tipo de ficheiro incorrecto',
161 161
 
162
-	// H
163
-	'htaccess_a_simuler' => 'Atenção: a configuração do servidor HTTP ignora @htaccess@. Para garantir uma boa segurança, deve alterar esta configuração. Alternativamente, deve assegurar que as constantes @constantes@ (definíveis no ficheiro mes_options.php) têm como valores diretórios fora de @document_root@.',
164
-	'htaccess_inoperant' => 'htaccess inoperacional',
162
+    // H
163
+    'htaccess_a_simuler' => 'Atenção: a configuração do servidor HTTP ignora @htaccess@. Para garantir uma boa segurança, deve alterar esta configuração. Alternativamente, deve assegurar que as constantes @constantes@ (definíveis no ficheiro mes_options.php) têm como valores diretórios fora de @document_root@.',
164
+    'htaccess_inoperant' => 'htaccess inoperacional',
165 165
 
166
-	// I
167
-	'ical_info1' => 'Esta página apresenta muitos modos de permanecer em contacto com as actividades deste sítio.',
168
-	'ical_info2' => 'Para mais informações sobre estas técnicas, consultar  <a href="@spipnet@">a documentação de SPIP</a>.',
169
-	'ical_info_calendrier' => 'Estão disponíveis dois calendários. O primeiro é uma planta do sítio anunciando todos os artigos publicados. O segundo é pessoal e contém os anúncios editoriais assim como as últimas mensagens privadas : está reservado para si graças a uma chave pessoal, que pode modificar a qualquer momento com a renovação da sua palavra-passe.',
170
-	'ical_methode_http' => 'Download',
171
-	'ical_methode_webcal' => 'Sincronização (webcal://)',
172
-	'ical_texte_js' => 'Uma linha de javascript permite-lhe facilmente exibir, em qualquer sítio que lhe pertença, os artigos recentes publicados neste sítio.',
173
-	'ical_texte_prive' => 'Este calendário, de uso estritamente pessoal, informa sobre a actividade editorial privada deste sítio (tarefas e encontros pessoais, artigos e notícias propostos...).',
174
-	'ical_texte_public' => 'Este calendário permite acompanhar a actividade pública deste sítio (artigos e notícias publicados).',
175
-	'ical_texte_rss' => 'Pode vincular as novidades deste sítio em qualquer leitor de ficheiros de formato XML/RSS (Rich Site Summary). É também o formato que permite a SPIP ler as novidades publicadas em outros sítios que utilizam um formato de troca compatível.',
176
-	'ical_titre_js' => 'Javascript',
177
-	'ical_titre_mailing' => 'Mailing-list',
178
-	'ical_titre_rss' => 'Ficheiros « backend »',
179
-	'icone_accueil' => 'Início',
180
-	'icone_activer_cookie' => 'Activar o cookie de correspondência',
181
-	'icone_activite' => 'Actividade',
182
-	'icone_admin_plugin' => 'Gerir plugins',
183
-	'icone_administration' => 'Manutenção',
184
-	'icone_afficher_auteurs' => 'Exibir os autores',
185
-	'icone_afficher_visiteurs' => 'Exibir os visitantes',
186
-	'icone_arret_discussion' => 'Não voltar a participar nesta discussão',
187
-	'icone_calendrier' => 'Calendário',
188
-	'icone_configuration' => 'Configuração',
189
-	'icone_creer_auteur' => 'Criar um novo autor e associá-lo a este artigo',
190
-	'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a este artigo',
191
-	'icone_creer_rubrique_2' => 'Criar uma nova rubrica',
192
-	'icone_developpement' => 'Desenvolvimento',
193
-	'icone_edition' => 'Editar',
194
-	'icone_ma_langue' => 'Idioma',
195
-	'icone_mes_infos' => 'Minhas informações',
196
-	'icone_mes_preferences' => 'Preferências',
197
-	'icone_modifier_article' => 'Modificar este artigo',
198
-	'icone_modifier_rubrique' => 'Modificar esta rubrica',
199
-	'icone_publication' => 'Publicação',
200
-	'icone_relancer_signataire' => 'Contactar o signatário novamente',
201
-	'icone_retour' => 'Voltar',
202
-	'icone_retour_article' => 'Voltar ao artigo',
203
-	'icone_squelette' => 'Modelos',
204
-	'icone_suivi_publication' => 'Monitorização da publicação',
205
-	'icone_supprimer_cookie' => 'Suprimir o cookie de correspondência',
206
-	'icone_supprimer_rubrique' => 'Suprimir esta rubrica',
207
-	'icone_supprimer_signature' => 'Suprimir esta assinatura',
208
-	'icone_valider_signature' => 'Validar esta assinatura',
209
-	'image_administrer_rubrique' => 'Pode administrar esta rubrica',
210
-	'impossible_modifier_login_auteur' => 'Impossível alterar o login.',
211
-	'impossible_modifier_pass_auteur' => 'Impossível alterar a palavra-passe.',
212
-	'info_1_article' => '1 artigo',
213
-	'info_1_auteur' => '1 autor',
214
-	'info_1_message' => '1 mensagem',
215
-	'info_1_mot_cle' => '1 palavra-chave',
216
-	'info_1_rubrique' => '1 rubrica',
217
-	'info_1_visiteur' => '1 visitante',
218
-	'info_activer_cookie' => 'Pode activar um <b>cookie de correspondência</b>, o que lhe
166
+    // I
167
+    'ical_info1' => 'Esta página apresenta muitos modos de permanecer em contacto com as actividades deste sítio.',
168
+    'ical_info2' => 'Para mais informações sobre estas técnicas, consultar  <a href="@spipnet@">a documentação de SPIP</a>.',
169
+    'ical_info_calendrier' => 'Estão disponíveis dois calendários. O primeiro é uma planta do sítio anunciando todos os artigos publicados. O segundo é pessoal e contém os anúncios editoriais assim como as últimas mensagens privadas : está reservado para si graças a uma chave pessoal, que pode modificar a qualquer momento com a renovação da sua palavra-passe.',
170
+    'ical_methode_http' => 'Download',
171
+    'ical_methode_webcal' => 'Sincronização (webcal://)',
172
+    'ical_texte_js' => 'Uma linha de javascript permite-lhe facilmente exibir, em qualquer sítio que lhe pertença, os artigos recentes publicados neste sítio.',
173
+    'ical_texte_prive' => 'Este calendário, de uso estritamente pessoal, informa sobre a actividade editorial privada deste sítio (tarefas e encontros pessoais, artigos e notícias propostos...).',
174
+    'ical_texte_public' => 'Este calendário permite acompanhar a actividade pública deste sítio (artigos e notícias publicados).',
175
+    'ical_texte_rss' => 'Pode vincular as novidades deste sítio em qualquer leitor de ficheiros de formato XML/RSS (Rich Site Summary). É também o formato que permite a SPIP ler as novidades publicadas em outros sítios que utilizam um formato de troca compatível.',
176
+    'ical_titre_js' => 'Javascript',
177
+    'ical_titre_mailing' => 'Mailing-list',
178
+    'ical_titre_rss' => 'Ficheiros « backend »',
179
+    'icone_accueil' => 'Início',
180
+    'icone_activer_cookie' => 'Activar o cookie de correspondência',
181
+    'icone_activite' => 'Actividade',
182
+    'icone_admin_plugin' => 'Gerir plugins',
183
+    'icone_administration' => 'Manutenção',
184
+    'icone_afficher_auteurs' => 'Exibir os autores',
185
+    'icone_afficher_visiteurs' => 'Exibir os visitantes',
186
+    'icone_arret_discussion' => 'Não voltar a participar nesta discussão',
187
+    'icone_calendrier' => 'Calendário',
188
+    'icone_configuration' => 'Configuração',
189
+    'icone_creer_auteur' => 'Criar um novo autor e associá-lo a este artigo',
190
+    'icone_creer_mot_cle' => 'Criar uma nova palavra-chave e vinculá-la a este artigo',
191
+    'icone_creer_rubrique_2' => 'Criar uma nova rubrica',
192
+    'icone_developpement' => 'Desenvolvimento',
193
+    'icone_edition' => 'Editar',
194
+    'icone_ma_langue' => 'Idioma',
195
+    'icone_mes_infos' => 'Minhas informações',
196
+    'icone_mes_preferences' => 'Preferências',
197
+    'icone_modifier_article' => 'Modificar este artigo',
198
+    'icone_modifier_rubrique' => 'Modificar esta rubrica',
199
+    'icone_publication' => 'Publicação',
200
+    'icone_relancer_signataire' => 'Contactar o signatário novamente',
201
+    'icone_retour' => 'Voltar',
202
+    'icone_retour_article' => 'Voltar ao artigo',
203
+    'icone_squelette' => 'Modelos',
204
+    'icone_suivi_publication' => 'Monitorização da publicação',
205
+    'icone_supprimer_cookie' => 'Suprimir o cookie de correspondência',
206
+    'icone_supprimer_rubrique' => 'Suprimir esta rubrica',
207
+    'icone_supprimer_signature' => 'Suprimir esta assinatura',
208
+    'icone_valider_signature' => 'Validar esta assinatura',
209
+    'image_administrer_rubrique' => 'Pode administrar esta rubrica',
210
+    'impossible_modifier_login_auteur' => 'Impossível alterar o login.',
211
+    'impossible_modifier_pass_auteur' => 'Impossível alterar a palavra-passe.',
212
+    'info_1_article' => '1 artigo',
213
+    'info_1_auteur' => '1 autor',
214
+    'info_1_message' => '1 mensagem',
215
+    'info_1_mot_cle' => '1 palavra-chave',
216
+    'info_1_rubrique' => '1 rubrica',
217
+    'info_1_visiteur' => '1 visitante',
218
+    'info_activer_cookie' => 'Pode activar um <b>cookie de correspondência</b>, o que lhe
219 219
  permitirá passar facilmente do sítio público ao sítio privado ',
220
-	'info_activer_menu_developpement' => 'Mostrar o menu Desenvolvimento',
221
-	'info_admin_etre_webmestre' => 'Conceder-me os direitos de webmaster',
222
-	'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>',
223
-	'info_admin_statuer_webmestre' => 'Conceder ao administrador os direitos de webmaster',
224
-	'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>',
225
-	'info_administrateur' => 'Administrador',
226
-	'info_administrateur_1' => 'Administrador',
227
-	'info_administrateur_2' => 'do sítio (<i>utilize com precaução</i>)',
228
-	'info_administrateur_site_01' => 'Se for o administrador do sítio, por favor',
229
-	'info_administrateur_site_02' => 'clicar sobre esta ligação',
230
-	'info_administrateurs' => 'Administradores',
231
-	'info_administrer_rubrique' => 'Pode administrar esta rubrica',
232
-	'info_adresse' => 'ao endereço :',
233
-	'info_adresse_desinscription' => 'Endereço de cancelamento da subscrição: ',
234
-	'info_adresse_url' => 'Endereço (URL) do sítio público',
235
-	'info_afficher_par_nb' => 'Exibir',
236
-	'info_aide_en_ligne' => 'Ajuda online SPIP',
237
-	'info_ajout_image' => 'Quando acrescentar imagens como documentos ligados a um artigo,
220
+    'info_activer_menu_developpement' => 'Mostrar o menu Desenvolvimento',
221
+    'info_admin_etre_webmestre' => 'Conceder-me os direitos de webmaster',
222
+    'info_admin_je_suis_webmestre' => 'Eu sou <b>webmaster</b>',
223
+    'info_admin_statuer_webmestre' => 'Conceder ao administrador os direitos de webmaster',
224
+    'info_admin_webmestre' => 'Este administrador é <b>webmaster</b>',
225
+    'info_administrateur' => 'Administrador',
226
+    'info_administrateur_1' => 'Administrador',
227
+    'info_administrateur_2' => 'do sítio (<i>utilize com precaução</i>)',
228
+    'info_administrateur_site_01' => 'Se for o administrador do sítio, por favor',
229
+    'info_administrateur_site_02' => 'clicar sobre esta ligação',
230
+    'info_administrateurs' => 'Administradores',
231
+    'info_administrer_rubrique' => 'Pode administrar esta rubrica',
232
+    'info_adresse' => 'ao endereço :',
233
+    'info_adresse_desinscription' => 'Endereço de cancelamento da subscrição: ',
234
+    'info_adresse_url' => 'Endereço (URL) do sítio público',
235
+    'info_afficher_par_nb' => 'Exibir',
236
+    'info_aide_en_ligne' => 'Ajuda online SPIP',
237
+    'info_ajout_image' => 'Quando acrescentar imagens como documentos ligados a um artigo,
238 238
  SPIP pode criar para si, automaticamente, vinhetas (miniaturas) das
239 239
  imagens inseridas. Isso permite por exemplo criar
240 240
  automaticamente uma galeria ou um portfolio.',
241
-	'info_ajouter_rubrique' => 'Acrescentar uma rubrica a administrar :',
242
-	'info_annonce_nouveautes' => 'Anúncio das novidades',
243
-	'info_article' => 'artigo',
244
-	'info_article_2' => 'artigos',
245
-	'info_article_a_paraitre' => 'Os artigos pós-datados a publicar',
246
-	'info_articles_02' => 'artigos',
247
-	'info_articles_2' => 'Artigos',
248
-	'info_articles_auteur' => 'Os artigos deste autor',
249
-	'info_articles_miens' => 'Os meus artigos',
250
-	'info_articles_tous' => 'Todos os artigos',
251
-	'info_articles_trouves' => 'Artigos encontrados',
252
-	'info_attente_validation' => 'Os seus artigos à espera de validação',
253
-	'info_aucun_article' => 'Nenhum artigo',
254
-	'info_aucun_auteur' => 'Nenhum autor',
255
-	'info_aucun_message' => 'Sem mensagens',
256
-	'info_aucun_rubrique' => 'Sem rubricas',
257
-	'info_aujourdhui' => 'hoje :',
258
-	'info_auteur_gere_rubriques' => 'Este autor gere as seguintes secções:',
259
-	'info_auteur_gere_toutes_rubriques' => 'Este autor gere <b>todas as secções</b>',
260
-	'info_auteur_gere_toutes_rubriques_2' => 'Eu administro <b>todas as rubricas</b>',
261
-	'info_auteurs' => 'Os autores',
262
-	'info_auteurs_par_tri' => 'Autores@partri@',
263
-	'info_auteurs_trouves' => 'Autores encontrados',
264
-	'info_authentification_externe' => 'Autenticação externa',
265
-	'info_avertissement' => 'Aviso',
266
-	'info_barre_outils' => 'com a sua barra de ferramentas?',
267
-	'info_base_installee' => 'A estrutura da sua base de dados está instalada.',
268
-	'info_bio' => 'Biografia',
269
-	'info_cache_desactive' => 'A cache encontra-se temporariamente desactivada.',
270
-	'info_chapeau' => 'Cabeçalho',
271
-	'info_chapeau_2' => 'Cabeçalho :',
272
-	'info_chemin_acces_1' => 'Opções : <b>Caminho de acesso no diretório</b>',
273
-	'info_chemin_acces_2' => 'Doravante, deve configurar o caminho de acesso às informações no anuário. Esta informação é indispensável para ler os perfis de utilizador armazenados no anuário.',
274
-	'info_chemin_acces_annuaire' => 'Opções : <b>Caminho de acesso no diretório',
275
-	'info_choix_base' => 'Terceira etapa :',
276
-	'info_classement_1' => '<sup>er</sup> no @liste@',
277
-	'info_classement_2' => '<sup>e</sup> no @liste@',
278
-	'info_code_acces' => 'Não se esqueça dos seus próprios códigos de acesso !',
279
-	'info_config_suivi' => 'Se este endereço corresponder a uma mailing-list, pode indicar, a seguir, o endereço no qual os participantes no sítio podem inscrever-se. Este endereço pode ser uma URL (por exemplo a página de inscrição na lista pela Web), ou um endereço email com um assunto específico (por exemplo: <tt>@adresse_suivi@?subject=subscribe</tt>):',
280
-	'info_config_suivi_explication' => ' Pode assinar a  mailing-list deste sítio. Receberá então, por correio electrónico, os anúncios de artigos e de notícias propostos para publicação.',
281
-	'info_confirmer_passe' => 'Confirmar esta nova palavra-passe',
282
-	'info_conflit_edition_avis_non_sauvegarde' => 'Atenção: os campos seguintes foram modificados anteriormente. As suas alterações a estes campos não foram portanto guardadas. ',
283
-	'info_conflit_edition_differences' => 'Diferenças:',
284
-	'info_conflit_edition_version_enregistree' => 'Versão guardada :',
285
-	'info_conflit_edition_votre_version' => 'A sua versão:',
286
-	'info_connexion_base' => 'Segunda etapa: <b>Teste de ligação à base de dados</b>',
287
-	'info_connexion_base_donnee' => 'Ligação à sua base de dados',
288
-	'info_connexion_ldap_ok' => 'A ligação LDAP foi bem sucedida.</b><p> Pode passar para a etapa seguinte.</p>',
289
-	'info_connexion_mysql' => 'Primeira etapa : <b>A sua ligação SQL<b>',
290
-	'info_connexion_ok' => 'A ligação foi bem sucedida.',
291
-	'info_contact' => 'Contacto',
292
-	'info_contenu_articles' => 'Conteúdo dos artigos',
293
-	'info_contributions' => 'Contributos',
294
-	'info_creation_paragraphe' => 'Para criar parágrafos, deixe simplesmente linhas vazias.',
295
-	'info_creation_rubrique' => 'Antes de poder escrever artigos, <br />deve criar pelo menos uma rubrica.<br />',
296
-	'info_creation_tables' => 'Quarta etapa : <b>Criação das tabelas da base de dados<b>',
297
-	'info_creer_base' => '<b>Criar</b> uma nova base de dados',
298
-	'info_dans_rubrique' => 'Na rubrica :',
299
-	'info_date_publication_anterieure' => 'Data de publicação anterior:',
300
-	'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SÍTIO :',
301
-	'info_derniere_etape' => 'Última etapa : <b>Terminou !',
302
-	'info_descriptif' => 'Descrição:',
303
-	'info_desinstaller_plugin' => 'elimina os dados e desactiva o plugin',
304
-	'info_discussion_cours' => 'Discussões em curso',
305
-	'info_ecrire_article' => 'Antes de poder escrever artigos, deve criar pelo menos uma rubrica.',
306
-	'info_email_envoi' => 'Endereço de email de envio (opcional)',
307
-	'info_email_envoi_txt' => 'Indique aqui o endereço a utilizar para enviar os emails (se não for o caso, o endereço do destinatário será utilizado como endereço de envio) :',
308
-	'info_email_webmestre' => 'Endereço e-mail do webmaster ',
309
-	'info_envoi_email_automatique' => 'Envio automático de mails',
310
-	'info_envoyer_maintenant' => 'Enviar agora',
311
-	'info_etape_suivante' => 'Passar para a seguinte etapa',
312
-	'info_etape_suivante_1' => 'Pode passar para a etapa seguinte',
313
-	'info_etape_suivante_2' => 'Pode passar para a etapa seguinte',
314
-	'info_exceptions_proxy' => 'Excepções para o proxy',
315
-	'info_exportation_base' => 'exportação da base para @archive@',
316
-	'info_facilite_suivi_activite' => 'A fim de facilitar o acompanhamento da actividade
241
+    'info_ajouter_rubrique' => 'Acrescentar uma rubrica a administrar :',
242
+    'info_annonce_nouveautes' => 'Anúncio das novidades',
243
+    'info_article' => 'artigo',
244
+    'info_article_2' => 'artigos',
245
+    'info_article_a_paraitre' => 'Os artigos pós-datados a publicar',
246
+    'info_articles_02' => 'artigos',
247
+    'info_articles_2' => 'Artigos',
248
+    'info_articles_auteur' => 'Os artigos deste autor',
249
+    'info_articles_miens' => 'Os meus artigos',
250
+    'info_articles_tous' => 'Todos os artigos',
251
+    'info_articles_trouves' => 'Artigos encontrados',
252
+    'info_attente_validation' => 'Os seus artigos à espera de validação',
253
+    'info_aucun_article' => 'Nenhum artigo',
254
+    'info_aucun_auteur' => 'Nenhum autor',
255
+    'info_aucun_message' => 'Sem mensagens',
256
+    'info_aucun_rubrique' => 'Sem rubricas',
257
+    'info_aujourdhui' => 'hoje :',
258
+    'info_auteur_gere_rubriques' => 'Este autor gere as seguintes secções:',
259
+    'info_auteur_gere_toutes_rubriques' => 'Este autor gere <b>todas as secções</b>',
260
+    'info_auteur_gere_toutes_rubriques_2' => 'Eu administro <b>todas as rubricas</b>',
261
+    'info_auteurs' => 'Os autores',
262
+    'info_auteurs_par_tri' => 'Autores@partri@',
263
+    'info_auteurs_trouves' => 'Autores encontrados',
264
+    'info_authentification_externe' => 'Autenticação externa',
265
+    'info_avertissement' => 'Aviso',
266
+    'info_barre_outils' => 'com a sua barra de ferramentas?',
267
+    'info_base_installee' => 'A estrutura da sua base de dados está instalada.',
268
+    'info_bio' => 'Biografia',
269
+    'info_cache_desactive' => 'A cache encontra-se temporariamente desactivada.',
270
+    'info_chapeau' => 'Cabeçalho',
271
+    'info_chapeau_2' => 'Cabeçalho :',
272
+    'info_chemin_acces_1' => 'Opções : <b>Caminho de acesso no diretório</b>',
273
+    'info_chemin_acces_2' => 'Doravante, deve configurar o caminho de acesso às informações no anuário. Esta informação é indispensável para ler os perfis de utilizador armazenados no anuário.',
274
+    'info_chemin_acces_annuaire' => 'Opções : <b>Caminho de acesso no diretório',
275
+    'info_choix_base' => 'Terceira etapa :',
276
+    'info_classement_1' => '<sup>er</sup> no @liste@',
277
+    'info_classement_2' => '<sup>e</sup> no @liste@',
278
+    'info_code_acces' => 'Não se esqueça dos seus próprios códigos de acesso !',
279
+    'info_config_suivi' => 'Se este endereço corresponder a uma mailing-list, pode indicar, a seguir, o endereço no qual os participantes no sítio podem inscrever-se. Este endereço pode ser uma URL (por exemplo a página de inscrição na lista pela Web), ou um endereço email com um assunto específico (por exemplo: <tt>@adresse_suivi@?subject=subscribe</tt>):',
280
+    'info_config_suivi_explication' => ' Pode assinar a  mailing-list deste sítio. Receberá então, por correio electrónico, os anúncios de artigos e de notícias propostos para publicação.',
281
+    'info_confirmer_passe' => 'Confirmar esta nova palavra-passe',
282
+    'info_conflit_edition_avis_non_sauvegarde' => 'Atenção: os campos seguintes foram modificados anteriormente. As suas alterações a estes campos não foram portanto guardadas. ',
283
+    'info_conflit_edition_differences' => 'Diferenças:',
284
+    'info_conflit_edition_version_enregistree' => 'Versão guardada :',
285
+    'info_conflit_edition_votre_version' => 'A sua versão:',
286
+    'info_connexion_base' => 'Segunda etapa: <b>Teste de ligação à base de dados</b>',
287
+    'info_connexion_base_donnee' => 'Ligação à sua base de dados',
288
+    'info_connexion_ldap_ok' => 'A ligação LDAP foi bem sucedida.</b><p> Pode passar para a etapa seguinte.</p>',
289
+    'info_connexion_mysql' => 'Primeira etapa : <b>A sua ligação SQL<b>',
290
+    'info_connexion_ok' => 'A ligação foi bem sucedida.',
291
+    'info_contact' => 'Contacto',
292
+    'info_contenu_articles' => 'Conteúdo dos artigos',
293
+    'info_contributions' => 'Contributos',
294
+    'info_creation_paragraphe' => 'Para criar parágrafos, deixe simplesmente linhas vazias.',
295
+    'info_creation_rubrique' => 'Antes de poder escrever artigos, <br />deve criar pelo menos uma rubrica.<br />',
296
+    'info_creation_tables' => 'Quarta etapa : <b>Criação das tabelas da base de dados<b>',
297
+    'info_creer_base' => '<b>Criar</b> uma nova base de dados',
298
+    'info_dans_rubrique' => 'Na rubrica :',
299
+    'info_date_publication_anterieure' => 'Data de publicação anterior:',
300
+    'info_date_referencement' => 'DATA DE REFERENCIAMENTO DESTE SÍTIO :',
301
+    'info_derniere_etape' => 'Última etapa : <b>Terminou !',
302
+    'info_descriptif' => 'Descrição:',
303
+    'info_desinstaller_plugin' => 'elimina os dados e desactiva o plugin',
304
+    'info_discussion_cours' => 'Discussões em curso',
305
+    'info_ecrire_article' => 'Antes de poder escrever artigos, deve criar pelo menos uma rubrica.',
306
+    'info_email_envoi' => 'Endereço de email de envio (opcional)',
307
+    'info_email_envoi_txt' => 'Indique aqui o endereço a utilizar para enviar os emails (se não for o caso, o endereço do destinatário será utilizado como endereço de envio) :',
308
+    'info_email_webmestre' => 'Endereço e-mail do webmaster ',
309
+    'info_envoi_email_automatique' => 'Envio automático de mails',
310
+    'info_envoyer_maintenant' => 'Enviar agora',
311
+    'info_etape_suivante' => 'Passar para a seguinte etapa',
312
+    'info_etape_suivante_1' => 'Pode passar para a etapa seguinte',
313
+    'info_etape_suivante_2' => 'Pode passar para a etapa seguinte',
314
+    'info_exceptions_proxy' => 'Excepções para o proxy',
315
+    'info_exportation_base' => 'exportação da base para @archive@',
316
+    'info_facilite_suivi_activite' => 'A fim de facilitar o acompanhamento da actividade
317 317
  editorial do sítio, SPIP pode fazer chegar por email, por exemplo
318 318
  a uma <i>mailing-list</i> dos redactores, o anúncio dos pedidos de
319 319
  publicação e das validações de artigos.',
320
-	'info_fichiers_authent' => 'Ficheiros de autenticação « .htpasswd »',
321
-	'info_forums_abo_invites' => 'O seu sítio contém fóruns por assinatura; os visitantes são convidados a registar-se no sítio público.',
322
-	'info_gauche_admin_tech' => '<b>Esta página está acessível apenas aos responsáveis pelo site.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio.</p>',
323
-	'info_gauche_admin_vider' => '<b>Esta página é acessível apenas aos responsáveis pelo sítio.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio web</p>',
324
-	'info_gauche_auteurs' => 'Encontrará aqui todos os autores do sítio.
320
+    'info_fichiers_authent' => 'Ficheiros de autenticação « .htpasswd »',
321
+    'info_forums_abo_invites' => 'O seu sítio contém fóruns por assinatura; os visitantes são convidados a registar-se no sítio público.',
322
+    'info_gauche_admin_tech' => '<b>Esta página está acessível apenas aos responsáveis pelo site.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio.</p>',
323
+    'info_gauche_admin_vider' => '<b>Esta página é acessível apenas aos responsáveis pelo sítio.</b><p> Ela dá acesso às diferentes funções de manutenção técnica. Algumas dessas funções possuem um processo específico de autenticação que exige acesso FTP ao sítio web</p>',
324
+    'info_gauche_auteurs' => 'Encontrará aqui todos os autores do sítio.
325 325
 Os estatuto dos autores é indicado pela cor dos ícones (administrador = verde; redactor = amarelo).',
326
-	'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao sítio, são indicados por um ícone azul;
326
+    'info_gauche_auteurs_exterieurs' => 'Os autores externos, sem acesso ao sítio, são indicados por um ícone azul;
327 327
 os autores apagados, por um ícone cinzento.',
328
-	'info_gauche_messagerie' => 'A caixa de correio permite-lhe trocar mensagens entre redactores, conservar memorandos (para o seu uso pessoal) ou exibir anúncios na página de abertura do espaço privado (se for administrador).',
329
-	'info_gauche_statistiques_referers' => 'Esta página apresenta a lista dos  <i>referers</i>, ou seja, dos sítios que contêm links para o seu sítio, unicamente para ontem e hoje; esta lista é actualizada a cada 24 horas.',
330
-	'info_gauche_visiteurs_enregistres' => 'Encontrará aqui os visitantes registados
328
+    'info_gauche_messagerie' => 'A caixa de correio permite-lhe trocar mensagens entre redactores, conservar memorandos (para o seu uso pessoal) ou exibir anúncios na página de abertura do espaço privado (se for administrador).',
329
+    'info_gauche_statistiques_referers' => 'Esta página apresenta a lista dos  <i>referers</i>, ou seja, dos sítios que contêm links para o seu sítio, unicamente para ontem e hoje; esta lista é actualizada a cada 24 horas.',
330
+    'info_gauche_visiteurs_enregistres' => 'Encontrará aqui os visitantes registados
331 331
  no espaço público do sítio (fóruns por assinatura).',
332
-	'info_generation_miniatures_images' => 'Geração de miniaturas das imagens',
333
-	'info_gerer_trad_objets' => '@objets@ : gerir as ligações de tradução',
334
-	'info_hebergeur_desactiver_envoi_email' => 'Alguns serviços de hospedagem desactivam o envio automático de
332
+    'info_generation_miniatures_images' => 'Geração de miniaturas das imagens',
333
+    'info_gerer_trad_objets' => '@objets@ : gerir as ligações de tradução',
334
+    'info_hebergeur_desactiver_envoi_email' => 'Alguns serviços de hospedagem desactivam o envio automático de
335 335
  e-mails a partir dos seus  servidores. Nesse caso, as seguintes
336 336
  funcionalidades de SPIP não funcionarão.',
337
-	'info_hier' => 'ontem :',
338
-	'info_identification_publique' => 'A sua identidade pública...',
339
-	'info_image_process' => 'Seleccione o melhor método para criar as vinhetas clicando sobre a imagem correspondente.',
340
-	'info_image_process2' => '<b>N.B.</b> <i> Se nenhuma imagem aparece, então o servidor que alberga o seu sítio não foi configurado para utilizar tais ferramentas. Se deseja utilizar essas funções, contacte o responsavel técnico e peça as extensões  «GD» ou «Imagick».</i>',
341
-	'info_images_auto' => 'Imagens calculadas automaticamente',
342
-	'info_informations_personnelles' => 'Quinta etapa : <b>Informações pessoais<b>',
343
-	'info_inscription' => 'Inscrição em ',
344
-	'info_inscription_automatique' => 'Inscrição automática de novos redactores',
345
-	'info_jeu_caractere' => 'Conjunto de caracteres do sítio',
346
-	'info_jours' => 'dias',
347
-	'info_laisser_champs_vides' => 'deixar estes campos vazios)',
348
-	'info_langues' => 'Idiomas do sítio',
349
-	'info_ldap_ok' => 'A autenticação LDAP está instalada.',
350
-	'info_lien_hypertexte' => 'Hiperligação :',
351
-	'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada.',
352
-	'info_liste_redacteurs_connectes' => 'Lista dos redactores ligados',
353
-	'info_login_existant' => 'Este login já existe.',
354
-	'info_login_trop_court' => 'Login demasiado curto.',
355
-	'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.',
356
-	'info_logos' => 'Os logos',
357
-	'info_maximum' => 'máximo :',
358
-	'info_meme_rubrique' => 'Na mesma rubrica',
359
-	'info_message_en_redaction' => 'As suas mensagens em rascunho',
360
-	'info_message_technique' => 'Mensagem técnica:',
361
-	'info_messagerie_interne' => 'Correio interno',
362
-	'info_mise_a_niveau_base' => 'melhoramento da sua base de dados SQL',
363
-	'info_mise_a_niveau_base_2' => '{{Atenção!}} Instalou uma versão
337
+    'info_hier' => 'ontem :',
338
+    'info_identification_publique' => 'A sua identidade pública...',
339
+    'info_image_process' => 'Seleccione o melhor método para criar as vinhetas clicando sobre a imagem correspondente.',
340
+    'info_image_process2' => '<b>N.B.</b> <i> Se nenhuma imagem aparece, então o servidor que alberga o seu sítio não foi configurado para utilizar tais ferramentas. Se deseja utilizar essas funções, contacte o responsavel técnico e peça as extensões  «GD» ou «Imagick».</i>',
341
+    'info_images_auto' => 'Imagens calculadas automaticamente',
342
+    'info_informations_personnelles' => 'Quinta etapa : <b>Informações pessoais<b>',
343
+    'info_inscription' => 'Inscrição em ',
344
+    'info_inscription_automatique' => 'Inscrição automática de novos redactores',
345
+    'info_jeu_caractere' => 'Conjunto de caracteres do sítio',
346
+    'info_jours' => 'dias',
347
+    'info_laisser_champs_vides' => 'deixar estes campos vazios)',
348
+    'info_langues' => 'Idiomas do sítio',
349
+    'info_ldap_ok' => 'A autenticação LDAP está instalada.',
350
+    'info_lien_hypertexte' => 'Hiperligação :',
351
+    'info_liste_nouveautes_envoyee' => 'A lista de novidades foi enviada.',
352
+    'info_liste_redacteurs_connectes' => 'Lista dos redactores ligados',
353
+    'info_login_existant' => 'Este login já existe.',
354
+    'info_login_trop_court' => 'Login demasiado curto.',
355
+    'info_login_trop_court_car_pluriel' => 'O login deve conter pelo menos @nb@ caracteres.',
356
+    'info_logos' => 'Os logos',
357
+    'info_maximum' => 'máximo :',
358
+    'info_meme_rubrique' => 'Na mesma rubrica',
359
+    'info_message_en_redaction' => 'As suas mensagens em rascunho',
360
+    'info_message_technique' => 'Mensagem técnica:',
361
+    'info_messagerie_interne' => 'Correio interno',
362
+    'info_mise_a_niveau_base' => 'melhoramento da sua base de dados SQL',
363
+    'info_mise_a_niveau_base_2' => '{{Atenção!}} Instalou uma versão
364 364
  dos ficheiros SPIP {anterior} à que se encontrava
365 365
  antes neste sítio: a sua base de dados corre o risco de se perder
366 366
  e o seu sítio já não funcionará .<br />{{Re-instalar os
367 367
  ficheiros de SPIP.}}',
368
-	'info_modification_enregistree' => 'As suas modificações foram guardadas',
369
-	'info_modifier_auteur' => 'Modifcar o autor :',
370
-	'info_modifier_rubrique' => 'Modificar a rubrica :',
371
-	'info_modifier_titre' => 'Modificar : @titre@',
372
-	'info_mon_site_spip' => 'O meu sítio SPIP',
373
-	'info_moyenne' => 'média :',
374
-	'info_multi_cet_article' => 'Idioma deste artigo :',
375
-	'info_multi_langues_choisies' => 'Por favor seleccione a seguir os idiomas à disposição dos redactores do seu sítio.
368
+    'info_modification_enregistree' => 'As suas modificações foram guardadas',
369
+    'info_modifier_auteur' => 'Modifcar o autor :',
370
+    'info_modifier_rubrique' => 'Modificar a rubrica :',
371
+    'info_modifier_titre' => 'Modificar : @titre@',
372
+    'info_mon_site_spip' => 'O meu sítio SPIP',
373
+    'info_moyenne' => 'média :',
374
+    'info_multi_cet_article' => 'Idioma deste artigo :',
375
+    'info_multi_langues_choisies' => 'Por favor seleccione a seguir os idiomas à disposição dos redactores do seu sítio.
376 376
  Os idiomas já utilizados no seu sítio (exibidos em primeiro lugar) não podem ser desactivados.',
377
-	'info_multi_objets' => '@objets@ : activar o menu de idioma',
378
-	'info_multi_secteurs' => '... só para as rubricas situadas na raíz ?',
379
-	'info_nb_articles' => '@nb@ artigos',
380
-	'info_nb_auteurs' => '@nb@ autores',
381
-	'info_nb_messages' => '@nb@ mensagens',
382
-	'info_nb_mots_cles' => '@nb@ palavras-chave',
383
-	'info_nb_rubriques' => '@nb@ rubricas',
384
-	'info_nb_visiteurs' => '@nb@ visitantes',
385
-	'info_nom' => 'Nome',
386
-	'info_nom_destinataire' => 'Nome do destinatário',
387
-	'info_nom_pas_conforme' => 'as tags html não são autorizadas',
388
-	'info_nom_site' => 'Nome do seu sítio',
389
-	'info_nombre_articles' => '@nb_articles@ artigos,',
390
-	'info_nombre_rubriques' => '@nb_rubriques@ rubricas,',
391
-	'info_nombre_sites' => '@nb_sites@ sítios,',
392
-	'info_non_deplacer' => 'Não deslocar...',
393
-	'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP pode enviar regularmente o anúncio das últimas novidades do sítio
377
+    'info_multi_objets' => '@objets@ : activar o menu de idioma',
378
+    'info_multi_secteurs' => '... só para as rubricas situadas na raíz ?',
379
+    'info_nb_articles' => '@nb@ artigos',
380
+    'info_nb_auteurs' => '@nb@ autores',
381
+    'info_nb_messages' => '@nb@ mensagens',
382
+    'info_nb_mots_cles' => '@nb@ palavras-chave',
383
+    'info_nb_rubriques' => '@nb@ rubricas',
384
+    'info_nb_visiteurs' => '@nb@ visitantes',
385
+    'info_nom' => 'Nome',
386
+    'info_nom_destinataire' => 'Nome do destinatário',
387
+    'info_nom_pas_conforme' => 'as tags html não são autorizadas',
388
+    'info_nom_site' => 'Nome do seu sítio',
389
+    'info_nombre_articles' => '@nb_articles@ artigos,',
390
+    'info_nombre_rubriques' => '@nb_rubriques@ rubricas,',
391
+    'info_nombre_sites' => '@nb_sites@ sítios,',
392
+    'info_non_deplacer' => 'Não deslocar...',
393
+    'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP pode enviar regularmente o anúncio das últimas novidades do sítio
394 394
  (artigos e notícias recentemente publicados).',
395
-	'info_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades',
396
-	'info_non_modifiable' => 'não pode ser modificado',
397
-	'info_non_suppression_mot_cle' => 'Não quero suprimir esta palavra-chave.',
398
-	'info_notes' => 'Notas',
399
-	'info_nouvel_article' => 'Novo artigo',
400
-	'info_nouvelle_traduction' => 'Nova tradução :',
401
-	'info_numero_article' => 'ARTIGO NÚMERO :',
402
-	'info_obligatoire_02' => '(obrigatório)',
403
-	'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do sítio público',
404
-	'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição de visitantes',
405
-	'info_options_avancees' => 'OPÇÕES AVANÇADAS',
406
-	'info_ou' => 'ou...',
407
-	'info_page_interdite' => 'Página proibida',
408
-	'info_par_nom' => 'por nome',
409
-	'info_par_nombre_article' => 'por número de artigos',
410
-	'info_par_statut' => 'por estado',
411
-	'info_par_tri' => '’(por @tri@)’',
412
-	'info_passe_trop_court' => 'Palavra-passe demasiado curta.',
413
-	'info_passe_trop_court_car_pluriel' => 'A palavra-passe deve conter pelo menos @nb@ caracteres.',
414
-	'info_passes_identiques' => 'As duas palavras-passe não são idênticas.',
415
-	'info_plus_cinq_car' => 'mais de 5 caracteres',
416
-	'info_plus_cinq_car_2' => '(Mais de 5 caracteres)',
417
-	'info_plus_trois_car' => '(Mais de 3 caracteres)',
418
-	'info_popularite' => 'popularidade : @popularite@ ; visitas : @visites@',
419
-	'info_post_scriptum' => 'Post-Scriptum',
420
-	'info_post_scriptum_2' => 'Post-scriptum :',
421
-	'info_pour' => 'para',
422
-	'info_preview_texte' => 'É possível visualizar os vários elementos editoriais do site que têm pelo menos o estatuto "proposto", bem como os artigos em processo de escrita dos quais se é o autor. Esta funcionalidade deve estar disponível para administradores, editores ou para ninguém?',
423
-	'info_procedez_par_etape' => 'proceder etapa por etapa',
424
-	'info_procedure_maj_version' => 'o procedimento de actualização deve ser lançado para adaptar
395
+    'info_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades',
396
+    'info_non_modifiable' => 'não pode ser modificado',
397
+    'info_non_suppression_mot_cle' => 'Não quero suprimir esta palavra-chave.',
398
+    'info_notes' => 'Notas',
399
+    'info_nouvel_article' => 'Novo artigo',
400
+    'info_nouvelle_traduction' => 'Nova tradução :',
401
+    'info_numero_article' => 'ARTIGO NÚMERO :',
402
+    'info_obligatoire_02' => '(obrigatório)',
403
+    'info_option_accepter_visiteurs' => 'Aceitar a inscrição de visitantes do sítio público',
404
+    'info_option_ne_pas_accepter_visiteurs' => 'Recusar a inscrição de visitantes',
405
+    'info_options_avancees' => 'OPÇÕES AVANÇADAS',
406
+    'info_ou' => 'ou...',
407
+    'info_page_interdite' => 'Página proibida',
408
+    'info_par_nom' => 'por nome',
409
+    'info_par_nombre_article' => 'por número de artigos',
410
+    'info_par_statut' => 'por estado',
411
+    'info_par_tri' => '’(por @tri@)’',
412
+    'info_passe_trop_court' => 'Palavra-passe demasiado curta.',
413
+    'info_passe_trop_court_car_pluriel' => 'A palavra-passe deve conter pelo menos @nb@ caracteres.',
414
+    'info_passes_identiques' => 'As duas palavras-passe não são idênticas.',
415
+    'info_plus_cinq_car' => 'mais de 5 caracteres',
416
+    'info_plus_cinq_car_2' => '(Mais de 5 caracteres)',
417
+    'info_plus_trois_car' => '(Mais de 3 caracteres)',
418
+    'info_popularite' => 'popularidade : @popularite@ ; visitas : @visites@',
419
+    'info_post_scriptum' => 'Post-Scriptum',
420
+    'info_post_scriptum_2' => 'Post-scriptum :',
421
+    'info_pour' => 'para',
422
+    'info_preview_texte' => 'É possível visualizar os vários elementos editoriais do site que têm pelo menos o estatuto "proposto", bem como os artigos em processo de escrita dos quais se é o autor. Esta funcionalidade deve estar disponível para administradores, editores ou para ninguém?',
423
+    'info_procedez_par_etape' => 'proceder etapa por etapa',
424
+    'info_procedure_maj_version' => 'o procedimento de actualização deve ser lançado para adaptar
425 425
 a base de dados à nova versão de SPIP.',
426
-	'info_proxy_ok' => 'Proxy testado com sucesso.',
427
-	'info_ps' => 'P.S.',
428
-	'info_publier' => 'publicar',
429
-	'info_publies' => 'Os seus artigos publicados online',
430
-	'info_question_accepter_visiteurs' => 'Se os parâmetros do seu site prevêem o registo de visitantes sem acesso ao espaço privado, por favor, active a opção abaixo:',
431
-	'info_question_inscription_nouveaux_redacteurs' => 'Aceita as inscrições de novos redactores a
426
+    'info_proxy_ok' => 'Proxy testado com sucesso.',
427
+    'info_ps' => 'P.S.',
428
+    'info_publier' => 'publicar',
429
+    'info_publies' => 'Os seus artigos publicados online',
430
+    'info_question_accepter_visiteurs' => 'Se os parâmetros do seu site prevêem o registo de visitantes sem acesso ao espaço privado, por favor, active a opção abaixo:',
431
+    'info_question_inscription_nouveaux_redacteurs' => 'Aceita as inscrições de novos redactores a
432 432
  partir do sítio público? Se aceitar, os visitantes poderão inscrever-se
433 433
  a partir de um formulário automatizado e acederão então ao espaço privado para
434 434
 propor os seus próprios artigos. <blockquote><i>Durante a fase de inscrição, os utilizadores recebem um e-mail automático
435 435
 fornecendo-lhes os seus códigos de acesso ao sítio privado. Alguns
436 436
 serviços de hospedagem desactivam o envio de e-mails a partir dos seus
437 437
  servidores: nesse caso, a inscrição automática é impossível.',
438
-	'info_qui_edite' => '@nom_auteur_modif@ modificou o conteúdo há @date_diff@ minutos',
439
-	'info_racine_site' => 'Raiz do sítio',
440
-	'info_recharger_page' => 'Por favor volte a carregar esta página daqui a pouco.',
441
-	'info_recherche_auteur_zero' => 'Nenhum resultado para "@cherche_auteur@".',
442
-	'info_recommencer' => 'Por favor tente de novo.',
443
-	'info_redacteur_1' => 'Redactor',
444
-	'info_redacteur_2' => 'tendo acesso ao espaço privado(<i>recomendado</i>)',
445
-	'info_redacteurs' => 'Redactores',
446
-	'info_redaction_en_cours' => 'EM CURSO DE REDACÇÃO',
447
-	'info_redirection' => 'Redirigir',
448
-	'info_redirection_activee' => 'O redireccionamento está activado.',
449
-	'info_redirection_boucle' => 'Está a tentar redireccionar o artigo para este mesmo artigo.',
450
-	'info_redirection_desactivee' => 'O redireccionamento foi eliminado.',
451
-	'info_refuses' => 'Os seus artigos recusados',
452
-	'info_reglage_ldap' => 'Opções : <b>Acerto da importação LDAP</b>',
453
-	'info_renvoi_article' => '<b>Redireccionar.</b> Este artigo remete para a página:',
454
-	'info_reserve_admin' => 'Só os administradores podem modificar este endereço.',
455
-	'info_restreindre_rubrique' => 'Limitar a gestão à rubrica : ',
456
-	'info_resultat_recherche' => 'Resultados da pesquisa ;',
457
-	'info_rubriques' => 'Rubricas',
458
-	'info_rubriques_02' => 'rubricas',
459
-	'info_rubriques_trouvees' => 'Rubricas encontradas',
460
-	'info_sans_titre' => 'Sem título',
461
-	'info_selection_chemin_acces' => '<b>Seleccione</b> a seguir o caminho de acesso no anuário :',
462
-	'info_signatures' => 'assinaturas',
463
-	'info_site' => 'Sítio',
464
-	'info_site_2' => 'sítio :',
465
-	'info_site_min' => 'sítio',
466
-	'info_site_reference_2' => 'Sítio referenciado',
467
-	'info_site_web' => 'Sítio web :',
468
-	'info_sites' => 'sítios',
469
-	'info_sites_lies_mot' => 'Os sítios referenciados ligados a esta palavra-chave',
470
-	'info_sites_proxy' => 'Utilizar um proxy',
471
-	'info_sites_trouves' => 'Sítios encontrados',
472
-	'info_sous_titre' => 'Sub-título :',
473
-	'info_statut_administrateur' => 'Administrador',
474
-	'info_statut_auteur' => 'Estatuto deste autor :',
475
-	'info_statut_auteur_2' => 'Eu sou',
476
-	'info_statut_auteur_a_confirmer' => 'Registo a confirmar',
477
-	'info_statut_auteur_autre' => 'Outro estado:',
478
-	'info_statut_redacteur' => 'Redactor',
479
-	'info_statut_utilisateurs_1' => 'Estatuto por defeito dos utilizadores importados',
480
-	'info_statut_utilisateurs_2' => 'Escolha o estatuto atribuído às pessoas presentes no anuário LDAP quando elas se ligam pela primeira vez. Poderá depois modificar este valor para cada autor, caso a caso.',
481
-	'info_suivi_activite' => 'Acompanhamento da actividade editorial',
482
-	'info_surtitre' => 'Antetítulo',
483
-	'info_syndication_integrale_1' => 'O seu sítio propõe os ficheiros redifundidos (ver « <a href="@url@">@titre@</a> »).',
484
-	'info_syndication_integrale_2' => 'Deseja enviar os artigos completos ou apenas um resumo de algumas centenas de caracteres?',
485
-	'info_table_prefix' => 'Pode modificar o prefixo do nome das tabelas das bases de dados. (Precisa de o fazer se estiver a instalar vários sítios na mesma base de dados.) O prefixo tem de ser escrito sem acentos, em minúsculas e sem espaços.',
486
-	'info_taille_maximale_images' => 'SPIP testará o tamanho máximo de imagem que pode processar (em milhões de pixels).<br /> As imagens maiores não serão reduzidas.',
487
-	'info_taille_maximale_vignette' => 'Tamanho máximo das vinhetas geradas pelo sistema :',
488
-	'info_terminer_installation' => 'Pode agora acabar o procedimento de instalação tipo.',
489
-	'info_texte' => 'Texto',
490
-	'info_texte_explicatif' => 'Texto explicativo',
491
-	'info_texte_long' => '(o texto é comprido : aparece, por isso, em muitas partes que serão coladas depois da validação.)',
492
-	'info_texte_message' => 'Texto da sua mensagem :',
493
-	'info_texte_message_02' => 'Texto da mensagem',
494
-	'info_titre' => 'Título :',
495
-	'info_total' => 'total :',
496
-	'info_tous_articles_en_redaction' => 'Todos os artgos em curso de redacção',
497
-	'info_tous_articles_presents' => 'Todos os artigos publicados nesta rubrica',
498
-	'info_tous_articles_refuses' => 'Todos os artigos rejeitados',
499
-	'info_tous_les' => 'todos os',
500
-	'info_tout_site' => 'Todo o sítio',
501
-	'info_tout_site2' => 'O artigo não está traduzido neste idioma.',
502
-	'info_tout_site3' => 'O artigo foi traduzido neste idioma, mas foram feitas modificações ao artigo original. A tradução necessita ser actualizada.',
503
-	'info_tout_site4' => 'O artigo foi traduzido neste idioma e a tradução está actual.',
504
-	'info_tout_site5' => 'Artigo original.',
505
-	'info_tout_site6' => '<b>Atenção:</b> só os artigos originais são mostrados.
438
+    'info_qui_edite' => '@nom_auteur_modif@ modificou o conteúdo há @date_diff@ minutos',
439
+    'info_racine_site' => 'Raiz do sítio',
440
+    'info_recharger_page' => 'Por favor volte a carregar esta página daqui a pouco.',
441
+    'info_recherche_auteur_zero' => 'Nenhum resultado para "@cherche_auteur@".',
442
+    'info_recommencer' => 'Por favor tente de novo.',
443
+    'info_redacteur_1' => 'Redactor',
444
+    'info_redacteur_2' => 'tendo acesso ao espaço privado(<i>recomendado</i>)',
445
+    'info_redacteurs' => 'Redactores',
446
+    'info_redaction_en_cours' => 'EM CURSO DE REDACÇÃO',
447
+    'info_redirection' => 'Redirigir',
448
+    'info_redirection_activee' => 'O redireccionamento está activado.',
449
+    'info_redirection_boucle' => 'Está a tentar redireccionar o artigo para este mesmo artigo.',
450
+    'info_redirection_desactivee' => 'O redireccionamento foi eliminado.',
451
+    'info_refuses' => 'Os seus artigos recusados',
452
+    'info_reglage_ldap' => 'Opções : <b>Acerto da importação LDAP</b>',
453
+    'info_renvoi_article' => '<b>Redireccionar.</b> Este artigo remete para a página:',
454
+    'info_reserve_admin' => 'Só os administradores podem modificar este endereço.',
455
+    'info_restreindre_rubrique' => 'Limitar a gestão à rubrica : ',
456
+    'info_resultat_recherche' => 'Resultados da pesquisa ;',
457
+    'info_rubriques' => 'Rubricas',
458
+    'info_rubriques_02' => 'rubricas',
459
+    'info_rubriques_trouvees' => 'Rubricas encontradas',
460
+    'info_sans_titre' => 'Sem título',
461
+    'info_selection_chemin_acces' => '<b>Seleccione</b> a seguir o caminho de acesso no anuário :',
462
+    'info_signatures' => 'assinaturas',
463
+    'info_site' => 'Sítio',
464
+    'info_site_2' => 'sítio :',
465
+    'info_site_min' => 'sítio',
466
+    'info_site_reference_2' => 'Sítio referenciado',
467
+    'info_site_web' => 'Sítio web :',
468
+    'info_sites' => 'sítios',
469
+    'info_sites_lies_mot' => 'Os sítios referenciados ligados a esta palavra-chave',
470
+    'info_sites_proxy' => 'Utilizar um proxy',
471
+    'info_sites_trouves' => 'Sítios encontrados',
472
+    'info_sous_titre' => 'Sub-título :',
473
+    'info_statut_administrateur' => 'Administrador',
474
+    'info_statut_auteur' => 'Estatuto deste autor :',
475
+    'info_statut_auteur_2' => 'Eu sou',
476
+    'info_statut_auteur_a_confirmer' => 'Registo a confirmar',
477
+    'info_statut_auteur_autre' => 'Outro estado:',
478
+    'info_statut_redacteur' => 'Redactor',
479
+    'info_statut_utilisateurs_1' => 'Estatuto por defeito dos utilizadores importados',
480
+    'info_statut_utilisateurs_2' => 'Escolha o estatuto atribuído às pessoas presentes no anuário LDAP quando elas se ligam pela primeira vez. Poderá depois modificar este valor para cada autor, caso a caso.',
481
+    'info_suivi_activite' => 'Acompanhamento da actividade editorial',
482
+    'info_surtitre' => 'Antetítulo',
483
+    'info_syndication_integrale_1' => 'O seu sítio propõe os ficheiros redifundidos (ver « <a href="@url@">@titre@</a> »).',
484
+    'info_syndication_integrale_2' => 'Deseja enviar os artigos completos ou apenas um resumo de algumas centenas de caracteres?',
485
+    'info_table_prefix' => 'Pode modificar o prefixo do nome das tabelas das bases de dados. (Precisa de o fazer se estiver a instalar vários sítios na mesma base de dados.) O prefixo tem de ser escrito sem acentos, em minúsculas e sem espaços.',
486
+    'info_taille_maximale_images' => 'SPIP testará o tamanho máximo de imagem que pode processar (em milhões de pixels).<br /> As imagens maiores não serão reduzidas.',
487
+    'info_taille_maximale_vignette' => 'Tamanho máximo das vinhetas geradas pelo sistema :',
488
+    'info_terminer_installation' => 'Pode agora acabar o procedimento de instalação tipo.',
489
+    'info_texte' => 'Texto',
490
+    'info_texte_explicatif' => 'Texto explicativo',
491
+    'info_texte_long' => '(o texto é comprido : aparece, por isso, em muitas partes que serão coladas depois da validação.)',
492
+    'info_texte_message' => 'Texto da sua mensagem :',
493
+    'info_texte_message_02' => 'Texto da mensagem',
494
+    'info_titre' => 'Título :',
495
+    'info_total' => 'total :',
496
+    'info_tous_articles_en_redaction' => 'Todos os artgos em curso de redacção',
497
+    'info_tous_articles_presents' => 'Todos os artigos publicados nesta rubrica',
498
+    'info_tous_articles_refuses' => 'Todos os artigos rejeitados',
499
+    'info_tous_les' => 'todos os',
500
+    'info_tout_site' => 'Todo o sítio',
501
+    'info_tout_site2' => 'O artigo não está traduzido neste idioma.',
502
+    'info_tout_site3' => 'O artigo foi traduzido neste idioma, mas foram feitas modificações ao artigo original. A tradução necessita ser actualizada.',
503
+    'info_tout_site4' => 'O artigo foi traduzido neste idioma e a tradução está actual.',
504
+    'info_tout_site5' => 'Artigo original.',
505
+    'info_tout_site6' => '<b>Atenção:</b> só os artigos originais são mostrados.
506 506
 As traduções estão associadas ao original,
507 507
 numa cor que indica o seu estado:',
508
-	'info_traductions' => 'Traduções',
509
-	'info_travail_colaboratif' => 'Trabalho colaborativo sobre os artigos',
510
-	'info_un_article' => 'um artigo',
511
-	'info_un_site' => 'um sítio',
512
-	'info_une_rubrique' => 'uma rubrica,',
513
-	'info_une_rubrique_02' => '1 rubrica',
514
-	'info_url' => 'URL :',
515
-	'info_url_proxy' => 'URL do proxy',
516
-	'info_url_proxy_pas_conforme' => 'o URL do proxy não é válido.',
517
-	'info_url_site_pas_conforme' => 'O URL do sítio não é válido',
518
-	'info_url_test_proxy' => 'URL de teste',
519
-	'info_urlref' => 'Ligação hipertexto :',
520
-	'info_utilisation_spip' => 'Pode começar agora a utilizar o sistema de publicação assistida...',
521
-	'info_visites_par_mois' => 'Exibição por mês :',
522
-	'info_visiteur_1' => 'Visitante',
523
-	'info_visiteur_2' => 'do sítio público',
524
-	'info_visiteurs' => 'Visitantes',
525
-	'info_visiteurs_02' => 'Visitantes do sítio público',
526
-	'info_webmestre_forces' => 'Os webmasters são actualmente definidos em <tt>@file_options@</tt>.',
527
-	'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem',
528
-	'install_connect_ok' => 'A nova base de dados foi declarada usando o nome de servidor @connect@.',
529
-	'install_echec_annonce' => 'A instalação vai provavelmente falhar,ou criar um sítio não funcional',
530
-	'install_extension_mbstring' => 'O SPIP não funciona com :',
531
-	'install_extension_php_obligatoire' => 'O SPIP exige a extensão php :',
532
-	'install_login_base_hebergeur' => 'Login de ligação atribuído pelo serviço de hospedagem',
533
-	'install_nom_base_hebergeur' => 'Nome da base de dados atribuído pelo serviço de hospedagem:',
534
-	'install_pas_table' => 'A base de dados não tem tabelas',
535
-	'install_pass_base_hebergeur' => 'Palavra-passe atribuída pelo serviço de hospedagem',
536
-	'install_php_version' => 'Esta versão de PHP @version@ é demasiado curta (minimum = @minimum@)',
537
-	'install_select_langue' => 'Seleccione um idioma e depois clique no botão " seguinte " para lançar o procedimento de instalação.',
538
-	'install_select_type_db' => 'Indicar o tipo de base de dados :',
539
-	'install_select_type_mysql' => 'MySQL',
540
-	'install_select_type_pg' => 'PostgreSQL',
541
-	'install_select_type_sqlite2' => 'SQLite 2',
542
-	'install_select_type_sqlite3' => 'SQLite 3',
543
-	'install_serveur_hebergeur' => 'Servidor da base de dados atribuído pelo serviço de hospedagem',
544
-	'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:',
545
-	'install_tables_base' => 'Tabelas da base de dados',
546
-	'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (o mais comum), <b>PostgreSQL</b> e <b>SQLite</b>.',
547
-	'install_types_db_connus_avertissement' => 'O suporte de <b>PostgreSQL</b> está proposto a nível experimental',
548
-	'instituer_erreur_statut_a_change' => 'O estado já tinha sido modificado',
549
-	'instituer_erreur_statut_non_autorise' => 'Não pode seleccionar este estado',
550
-	'intem_redacteur' => 'redactor',
551
-	'intitule_licence' => 'Licença',
552
-	'item_accepter_inscriptions' => 'Aceitar as inscrições',
553
-	'item_activer_messages_avertissement' => 'Activar as mensagens de aviso',
554
-	'item_administrateur_2' => 'administrador',
555
-	'item_afficher_calendrier' => 'Exibir o calendário',
556
-	'item_autoriser_syndication_integrale' => 'Incluir artigos completos nos ficheiros de redifusão',
557
-	'item_choix_administrateurs' => 'os administradores',
558
-	'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.',
559
-	'item_choix_non_generation_miniature' => 'Não gerar miniaturas das imagens.',
560
-	'item_choix_redacteurs' => 'os redactores',
561
-	'item_choix_visiteurs' => 'os visitadores do sítio público',
562
-	'item_creer_fichiers_authent' => 'Criar os ficheiros .htpasswd',
563
-	'item_login' => 'Login',
564
-	'item_messagerie_agenda' => 'Activar as mensagens e a agenda',
565
-	'item_mots_cles_association_articles' => 'aos artigos',
566
-	'item_mots_cles_association_rubriques' => 'às rubricas',
567
-	'item_mots_cles_association_sites' => 'aos sítios referenciados ou vinculados.',
568
-	'item_non' => 'Não',
569
-	'item_non_accepter_inscriptions' => 'Não aceitar as inscrições',
570
-	'item_non_activer_messages_avertissement' => 'Não há mensagens de aviso',
571
-	'item_non_afficher_calendrier' => 'Não exibir no calendário',
572
-	'item_non_autoriser_syndication_integrale' => 'Enviar apenas um resumo',
573
-	'item_non_creer_fichiers_authent' => 'Não criar estes ficheiros',
574
-	'item_non_messagerie_agenda' => 'Desactivar as mensagens e a agenda',
575
-	'item_non_publier_articles' => 'Não publicar os artigos antes da data de publicação fixada.',
576
-	'item_nouvel_auteur' => 'Novo autor',
577
-	'item_nouvelle_rubrique' => 'Nova rubrica',
578
-	'item_oui' => 'Sim',
579
-	'item_publier_articles' => 'Publicar os artigos, seja qual for a sua data de publicação.',
580
-	'item_reponse_article' => 'Resposta ao artigo',
581
-	'item_visiteur' => 'visitante',
508
+    'info_traductions' => 'Traduções',
509
+    'info_travail_colaboratif' => 'Trabalho colaborativo sobre os artigos',
510
+    'info_un_article' => 'um artigo',
511
+    'info_un_site' => 'um sítio',
512
+    'info_une_rubrique' => 'uma rubrica,',
513
+    'info_une_rubrique_02' => '1 rubrica',
514
+    'info_url' => 'URL :',
515
+    'info_url_proxy' => 'URL do proxy',
516
+    'info_url_proxy_pas_conforme' => 'o URL do proxy não é válido.',
517
+    'info_url_site_pas_conforme' => 'O URL do sítio não é válido',
518
+    'info_url_test_proxy' => 'URL de teste',
519
+    'info_urlref' => 'Ligação hipertexto :',
520
+    'info_utilisation_spip' => 'Pode começar agora a utilizar o sistema de publicação assistida...',
521
+    'info_visites_par_mois' => 'Exibição por mês :',
522
+    'info_visiteur_1' => 'Visitante',
523
+    'info_visiteur_2' => 'do sítio público',
524
+    'info_visiteurs' => 'Visitantes',
525
+    'info_visiteurs_02' => 'Visitantes do sítio público',
526
+    'info_webmestre_forces' => 'Os webmasters são actualmente definidos em <tt>@file_options@</tt>.',
527
+    'install_adresse_base_hebergeur' => 'Endereço da base de dados atribuído pelo serviço de hospedagem',
528
+    'install_connect_ok' => 'A nova base de dados foi declarada usando o nome de servidor @connect@.',
529
+    'install_echec_annonce' => 'A instalação vai provavelmente falhar,ou criar um sítio não funcional',
530
+    'install_extension_mbstring' => 'O SPIP não funciona com :',
531
+    'install_extension_php_obligatoire' => 'O SPIP exige a extensão php :',
532
+    'install_login_base_hebergeur' => 'Login de ligação atribuído pelo serviço de hospedagem',
533
+    'install_nom_base_hebergeur' => 'Nome da base de dados atribuído pelo serviço de hospedagem:',
534
+    'install_pas_table' => 'A base de dados não tem tabelas',
535
+    'install_pass_base_hebergeur' => 'Palavra-passe atribuída pelo serviço de hospedagem',
536
+    'install_php_version' => 'Esta versão de PHP @version@ é demasiado curta (minimum = @minimum@)',
537
+    'install_select_langue' => 'Seleccione um idioma e depois clique no botão " seguinte " para lançar o procedimento de instalação.',
538
+    'install_select_type_db' => 'Indicar o tipo de base de dados :',
539
+    'install_select_type_mysql' => 'MySQL',
540
+    'install_select_type_pg' => 'PostgreSQL',
541
+    'install_select_type_sqlite2' => 'SQLite 2',
542
+    'install_select_type_sqlite3' => 'SQLite 3',
543
+    'install_serveur_hebergeur' => 'Servidor da base de dados atribuído pelo serviço de hospedagem',
544
+    'install_table_prefix_hebergeur' => 'Prefixo de tabela atribuído pelo serviço de hospedagem:',
545
+    'install_tables_base' => 'Tabelas da base de dados',
546
+    'install_types_db_connus' => 'SPIP pode usar <b>MySQL</b> (o mais comum), <b>PostgreSQL</b> e <b>SQLite</b>.',
547
+    'install_types_db_connus_avertissement' => 'O suporte de <b>PostgreSQL</b> está proposto a nível experimental',
548
+    'instituer_erreur_statut_a_change' => 'O estado já tinha sido modificado',
549
+    'instituer_erreur_statut_non_autorise' => 'Não pode seleccionar este estado',
550
+    'intem_redacteur' => 'redactor',
551
+    'intitule_licence' => 'Licença',
552
+    'item_accepter_inscriptions' => 'Aceitar as inscrições',
553
+    'item_activer_messages_avertissement' => 'Activar as mensagens de aviso',
554
+    'item_administrateur_2' => 'administrador',
555
+    'item_afficher_calendrier' => 'Exibir o calendário',
556
+    'item_autoriser_syndication_integrale' => 'Incluir artigos completos nos ficheiros de redifusão',
557
+    'item_choix_administrateurs' => 'os administradores',
558
+    'item_choix_generation_miniature' => 'Gerar automaticamente as miniaturas das imagens.',
559
+    'item_choix_non_generation_miniature' => 'Não gerar miniaturas das imagens.',
560
+    'item_choix_redacteurs' => 'os redactores',
561
+    'item_choix_visiteurs' => 'os visitadores do sítio público',
562
+    'item_creer_fichiers_authent' => 'Criar os ficheiros .htpasswd',
563
+    'item_login' => 'Login',
564
+    'item_messagerie_agenda' => 'Activar as mensagens e a agenda',
565
+    'item_mots_cles_association_articles' => 'aos artigos',
566
+    'item_mots_cles_association_rubriques' => 'às rubricas',
567
+    'item_mots_cles_association_sites' => 'aos sítios referenciados ou vinculados.',
568
+    'item_non' => 'Não',
569
+    'item_non_accepter_inscriptions' => 'Não aceitar as inscrições',
570
+    'item_non_activer_messages_avertissement' => 'Não há mensagens de aviso',
571
+    'item_non_afficher_calendrier' => 'Não exibir no calendário',
572
+    'item_non_autoriser_syndication_integrale' => 'Enviar apenas um resumo',
573
+    'item_non_creer_fichiers_authent' => 'Não criar estes ficheiros',
574
+    'item_non_messagerie_agenda' => 'Desactivar as mensagens e a agenda',
575
+    'item_non_publier_articles' => 'Não publicar os artigos antes da data de publicação fixada.',
576
+    'item_nouvel_auteur' => 'Novo autor',
577
+    'item_nouvelle_rubrique' => 'Nova rubrica',
578
+    'item_oui' => 'Sim',
579
+    'item_publier_articles' => 'Publicar os artigos, seja qual for a sua data de publicação.',
580
+    'item_reponse_article' => 'Resposta ao artigo',
581
+    'item_visiteur' => 'visitante',
582 582
 
583
-	// J
584
-	'jour_non_connu_nc' => 'n.c.',
583
+    // J
584
+    'jour_non_connu_nc' => 'n.c.',
585 585
 
586
-	// L
587
-	'label_bando_outils' => 'Barra de ferramentas',
588
-	'label_bando_outils_afficher' => 'Exibir as ferramentas',
589
-	'label_bando_outils_masquer' => 'Ocultar as ferramentas',
590
-	'label_choix_langue' => 'Seleccione o seu idioma',
591
-	'label_nom_fichier_connect' => 'Indique o nome para este servidor',
592
-	'label_slogan_site' => 'Slogan do sítio',
593
-	'label_taille_ecran' => 'Largura do ecrã',
594
-	'label_texte_et_icones_navigation' => 'Menu de navegação',
595
-	'label_texte_et_icones_page' => 'Exibição da página',
596
-	'ldap_correspondance' => 'sucessão do campo @champ@',
597
-	'ldap_correspondance_1' => 'Sucessão dos campos LDAP',
598
-	'ldap_correspondance_2' => 'Para cada um destes campos SPIP, indique o nome do campo LDAP correspondente. Deixe em branco se não o deseja preenchido. Separe com espaços ou vírgulas, para tentar vários campos LDAP.',
599
-	'lien_ajouter_auteur' => 'Acrescentar este autor',
600
-	'lien_ajouter_une_rubrique' => 'Adicionar esta rubrica',
601
-	'lien_email' => 'email',
602
-	'lien_nom_site' => 'NOME DO SÍTIO',
603
-	'lien_rapide_contenu' => 'Ir para o conteúdo',
604
-	'lien_rapide_navigation' => 'Ir para a navegação',
605
-	'lien_rapide_recherche' => 'Ir para a pesquisa',
606
-	'lien_retirer_auteur' => 'Remover o autor',
607
-	'lien_retirer_rubrique' => 'Eliminar a rubrica',
608
-	'lien_retirer_tous_auteurs' => 'Eliminar todos os autores',
609
-	'lien_retirer_toutes_rubriques' => 'Remover todas as rubricas',
610
-	'lien_site' => 'sítio',
611
-	'lien_tout_decocher' => 'Desmarcar tudo',
612
-	'lien_tout_deplier' => 'Expandir tudo',
613
-	'lien_tout_replier' => 'Recolher tudo',
614
-	'lien_tout_supprimer' => 'Eliminar tudo',
615
-	'lien_trier_nom' => 'Seleccionar por nome',
616
-	'lien_trier_nombre_articles' => 'seleccionar por número de artgos',
617
-	'lien_trier_statut' => 'Seleccionar por estatuto',
618
-	'lien_voir_en_ligne' => 'VER EM LINHA',
619
-	'logo_article' => 'Logotipo do artigo',
620
-	'logo_auteur' => 'Logotipo do autor ',
621
-	'logo_rubrique' => 'Logotipo da rubrica',
622
-	'logo_site' => 'Logotipo deste sítio',
623
-	'logo_standard_rubrique' => 'Logotipo modelo das rubricas',
624
-	'logo_survol' => 'Logotipo "mouseover"',
586
+    // L
587
+    'label_bando_outils' => 'Barra de ferramentas',
588
+    'label_bando_outils_afficher' => 'Exibir as ferramentas',
589
+    'label_bando_outils_masquer' => 'Ocultar as ferramentas',
590
+    'label_choix_langue' => 'Seleccione o seu idioma',
591
+    'label_nom_fichier_connect' => 'Indique o nome para este servidor',
592
+    'label_slogan_site' => 'Slogan do sítio',
593
+    'label_taille_ecran' => 'Largura do ecrã',
594
+    'label_texte_et_icones_navigation' => 'Menu de navegação',
595
+    'label_texte_et_icones_page' => 'Exibição da página',
596
+    'ldap_correspondance' => 'sucessão do campo @champ@',
597
+    'ldap_correspondance_1' => 'Sucessão dos campos LDAP',
598
+    'ldap_correspondance_2' => 'Para cada um destes campos SPIP, indique o nome do campo LDAP correspondente. Deixe em branco se não o deseja preenchido. Separe com espaços ou vírgulas, para tentar vários campos LDAP.',
599
+    'lien_ajouter_auteur' => 'Acrescentar este autor',
600
+    'lien_ajouter_une_rubrique' => 'Adicionar esta rubrica',
601
+    'lien_email' => 'email',
602
+    'lien_nom_site' => 'NOME DO SÍTIO',
603
+    'lien_rapide_contenu' => 'Ir para o conteúdo',
604
+    'lien_rapide_navigation' => 'Ir para a navegação',
605
+    'lien_rapide_recherche' => 'Ir para a pesquisa',
606
+    'lien_retirer_auteur' => 'Remover o autor',
607
+    'lien_retirer_rubrique' => 'Eliminar a rubrica',
608
+    'lien_retirer_tous_auteurs' => 'Eliminar todos os autores',
609
+    'lien_retirer_toutes_rubriques' => 'Remover todas as rubricas',
610
+    'lien_site' => 'sítio',
611
+    'lien_tout_decocher' => 'Desmarcar tudo',
612
+    'lien_tout_deplier' => 'Expandir tudo',
613
+    'lien_tout_replier' => 'Recolher tudo',
614
+    'lien_tout_supprimer' => 'Eliminar tudo',
615
+    'lien_trier_nom' => 'Seleccionar por nome',
616
+    'lien_trier_nombre_articles' => 'seleccionar por número de artgos',
617
+    'lien_trier_statut' => 'Seleccionar por estatuto',
618
+    'lien_voir_en_ligne' => 'VER EM LINHA',
619
+    'logo_article' => 'Logotipo do artigo',
620
+    'logo_auteur' => 'Logotipo do autor ',
621
+    'logo_rubrique' => 'Logotipo da rubrica',
622
+    'logo_site' => 'Logotipo deste sítio',
623
+    'logo_standard_rubrique' => 'Logotipo modelo das rubricas',
624
+    'logo_survol' => 'Logotipo "mouseover"',
625 625
 
626
-	// M
627
-	'menu_aide_installation_choix_base' => 'Escolha da sua base',
628
-	'module_fichier_langue' => 'Ficheiro de idioma',
629
-	'module_raccourci' => 'Atalhos',
630
-	'module_texte_affiche' => 'Texto exibido',
631
-	'module_texte_explicatif' => 'Pode inserir os seguintes atalhos nos esqueletos do seu sítio público. Serão automaticamente traduzidos para os vários idiomas nos quais há um ficheiro de idioma.',
632
-	'module_texte_traduction' => 'O ficheiro de idioma « @module@ » está disponível em :',
633
-	'mois_non_connu' => 'não conhecido',
626
+    // M
627
+    'menu_aide_installation_choix_base' => 'Escolha da sua base',
628
+    'module_fichier_langue' => 'Ficheiro de idioma',
629
+    'module_raccourci' => 'Atalhos',
630
+    'module_texte_affiche' => 'Texto exibido',
631
+    'module_texte_explicatif' => 'Pode inserir os seguintes atalhos nos esqueletos do seu sítio público. Serão automaticamente traduzidos para os vários idiomas nos quais há um ficheiro de idioma.',
632
+    'module_texte_traduction' => 'O ficheiro de idioma « @module@ » está disponível em :',
633
+    'mois_non_connu' => 'não conhecido',
634 634
 
635
-	// N
636
-	'nouvelle_version_spip' => 'A versão @version@ de SPIP está disponível',
637
-	'nouvelle_version_spip_majeure' => 'Um novo SPIP @version@ está disponível',
635
+    // N
636
+    'nouvelle_version_spip' => 'A versão @version@ de SPIP está disponível',
637
+    'nouvelle_version_spip_majeure' => 'Um novo SPIP @version@ está disponível',
638 638
 
639
-	// O
640
-	'onglet_contenu' => 'Conteúdo',
641
-	'onglet_declarer_une_autre_base' => 'Declarar outra base de dados',
642
-	'onglet_discuter' => 'Discussão',
643
-	'onglet_interactivite' => 'Interactividade',
644
-	'onglet_proprietes' => 'Propriedades',
645
-	'onglet_repartition_actuelle' => 'actualmente',
646
-	'onglet_sous_rubriques' => 'Sub-rubricas',
639
+    // O
640
+    'onglet_contenu' => 'Conteúdo',
641
+    'onglet_declarer_une_autre_base' => 'Declarar outra base de dados',
642
+    'onglet_discuter' => 'Discussão',
643
+    'onglet_interactivite' => 'Interactividade',
644
+    'onglet_proprietes' => 'Propriedades',
645
+    'onglet_repartition_actuelle' => 'actualmente',
646
+    'onglet_sous_rubriques' => 'Sub-rubricas',
647 647
 
648
-	// P
649
-	'page_pas_proxy' => 'Esta página não deve passar através do proxy',
650
-	'pas_de_proxy_pour' => 'Se necessário, indique a que máquinas ou domínios este proxy não se deve aplicar (por exemplo : @exemple@)',
651
-	'phpinfo' => 'Configuração PHP',
652
-	'plugin_charge_paquet' => 'Carregamento do ficheiro @name@',
653
-	'plugin_charger' => 'Download',
654
-	'plugin_erreur_charger' => 'erro : impossível carregar @zip@',
655
-	'plugin_erreur_droit1' => 'Não pode escrever no directório <code>@dest@</code>.',
656
-	'plugin_erreur_droit2' => 'Por favor verifique as autorizações para este directório (e crie o directório se necessário). Alternativamente, instale os ficheiros por FTP.',
657
-	'plugin_erreur_zip' => 'falha pclzip : erro @status@',
658
-	'plugin_etat_developpement' => 'em desenvolvimento',
659
-	'plugin_etat_experimental' => 'experimental',
660
-	'plugin_etat_stable' => 'estável',
661
-	'plugin_etat_test' => 'em teste',
662
-	'plugin_impossible_activer' => 'Impossível activar o plugin @plugin@',
663
-	'plugin_info_automatique1' => 'Se deseja autorizar a instalação automática de plugins, por favor:',
664
-	'plugin_info_automatique1_lib' => 'Se deseja que a biblioteca seja instalada automaticamente, por favor:',
665
-	'plugin_info_automatique2' => 'criar um directório <code>@rep@</code> ;',
666
-	'plugin_info_automatique3' => 'Verifique se o servidor está autorizado a escrever neste directório.',
667
-	'plugin_info_automatique_creer' => 'a criar na raiz do sítio.',
668
-	'plugin_info_automatique_exemples' => 'exemplos:',
669
-	'plugin_info_automatique_ftp' => 'Pode instalar os plugins, por FTP, no directório <tt>@rep@</tt>',
670
-	'plugin_info_automatique_lib' => 'Alguns plugins precisam de estar aptos a carregar ficheiros no directório <code>lib/</code>. Este directório deve ser criado na raiz do sítio.',
671
-	'plugin_info_automatique_liste' => 'As suas listas de plugins :',
672
-	'plugin_info_automatique_liste_officielle' => 'os plugins oficiais',
673
-	'plugin_info_automatique_liste_update' => 'Actualizar as listas',
674
-	'plugin_info_automatique_ou' => 'ou...',
675
-	'plugin_info_automatique_select' => 'Seleccione um plugin abaixo: SPIP irá carregá-lo e instalá-lo no directório <code>@rep@</code>. Se o plugin já existir, será actualizado.',
676
-	'plugin_info_credit' => 'Créditos',
677
-	'plugin_info_erreur_xml' => 'A declaração do plugin está incorrecta',
678
-	'plugin_info_install_ok' => 'Instalado com sucesso',
679
-	'plugin_info_necessite' => 'Requer:',
680
-	'plugin_info_non_compatible_spip' => 'O plugin é incompatível com esta versão de SPIP',
681
-	'plugin_info_plugins_dist_1' => 'Os plugins seguintes estão carregados e activados no directório @plugins_dist@.',
682
-	'plugin_info_plugins_dist_2' => 'Não podem ser desactivados.',
683
-	'plugin_info_telecharger' => 'carregar de @url@ e instalar em @rep@',
684
-	'plugin_info_upgrade_ok' => 'Actualizado com sucesso',
685
-	'plugin_librairies_installees' => 'Bibliotecas instaladas',
686
-	'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ em @version@.',
687
-	'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@',
688
-	'plugin_necessite_lib' => 'Este plugin requer a biblioteca @lib@',
689
-	'plugin_necessite_php' => 'Requer @plugin@ em versão @version@.',
690
-	'plugin_necessite_plugin' => 'Requer o plugin @plugin@ em versão @version@ ou mais recente.',
691
-	'plugin_necessite_plugin_sans_version' => 'Requer o plugin @plugin@',
692
-	'plugin_necessite_spip' => 'Requer SPIP em version @version@ ou mais recente.',
693
-	'plugin_source' => 'fonte: ',
694
-	'plugin_titre_automatique' => 'Instalação automática',
695
-	'plugin_titre_automatique_ajouter' => 'Adicionar plugins',
696
-	'plugin_titre_installation' => 'Instalação do plugin @plugin@',
697
-	'plugin_titre_modifier' => 'Os meus plugins',
698
-	'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.',
699
-	'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.',
700
-	'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.',
701
-	'plugin_zip_active' => 'Continue para activar',
702
-	'plugin_zip_adresse' => 'Para carregar um ficheiro zip de plugin, ou uma lista de plugins, introduza o caminho abaixo.',
703
-	'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista',
704
-	'plugin_zip_content' => 'Contém os seguintes ficheiros  (@taille@),<br /> prontos a ser instalados no directório <code>@rep@</code>',
705
-	'plugin_zip_installe_finie' => 'O ficheiro @zip@ foi descomprimido e instalado.',
706
-	'plugin_zip_installe_rep_finie' => 'O ficheiro @zip@ foi descompactado e instalado no directório @rep@',
707
-	'plugin_zip_installer' => 'Agora pode instalar.',
708
-	'plugin_zip_telecharge' => 'O ficheiro @zip@ foi carregado',
709
-	'plugins_actif_aucun' => 'Sem plugins activados.',
710
-	'plugins_actif_un' => 'Um plugin activado.',
711
-	'plugins_actifs' => '@count@ plugins activados.',
712
-	'plugins_actifs_liste' => 'Activados',
713
-	'plugins_compte' => '@count@ plugins',
714
-	'plugins_disponible_un' => 'Um plugin disponível.',
715
-	'plugins_disponibles' => '@count@ plugins disponíveis.',
716
-	'plugins_erreur' => 'Erro nos plugins : @plugins@',
717
-	'plugins_liste' => 'Lista de plugins',
718
-	'plugins_liste_dist' => 'Plugins bloqueados',
719
-	'plugins_recents' => 'Plugins recentes.',
720
-	'plugins_tous_liste' => 'Todos',
721
-	'plugins_vue_hierarchie' => 'Hierarquia',
722
-	'plugins_vue_liste' => 'Lista',
723
-	'protocole_ldap' => 'Versão do protocolo:',
648
+    // P
649
+    'page_pas_proxy' => 'Esta página não deve passar através do proxy',
650
+    'pas_de_proxy_pour' => 'Se necessário, indique a que máquinas ou domínios este proxy não se deve aplicar (por exemplo : @exemple@)',
651
+    'phpinfo' => 'Configuração PHP',
652
+    'plugin_charge_paquet' => 'Carregamento do ficheiro @name@',
653
+    'plugin_charger' => 'Download',
654
+    'plugin_erreur_charger' => 'erro : impossível carregar @zip@',
655
+    'plugin_erreur_droit1' => 'Não pode escrever no directório <code>@dest@</code>.',
656
+    'plugin_erreur_droit2' => 'Por favor verifique as autorizações para este directório (e crie o directório se necessário). Alternativamente, instale os ficheiros por FTP.',
657
+    'plugin_erreur_zip' => 'falha pclzip : erro @status@',
658
+    'plugin_etat_developpement' => 'em desenvolvimento',
659
+    'plugin_etat_experimental' => 'experimental',
660
+    'plugin_etat_stable' => 'estável',
661
+    'plugin_etat_test' => 'em teste',
662
+    'plugin_impossible_activer' => 'Impossível activar o plugin @plugin@',
663
+    'plugin_info_automatique1' => 'Se deseja autorizar a instalação automática de plugins, por favor:',
664
+    'plugin_info_automatique1_lib' => 'Se deseja que a biblioteca seja instalada automaticamente, por favor:',
665
+    'plugin_info_automatique2' => 'criar um directório <code>@rep@</code> ;',
666
+    'plugin_info_automatique3' => 'Verifique se o servidor está autorizado a escrever neste directório.',
667
+    'plugin_info_automatique_creer' => 'a criar na raiz do sítio.',
668
+    'plugin_info_automatique_exemples' => 'exemplos:',
669
+    'plugin_info_automatique_ftp' => 'Pode instalar os plugins, por FTP, no directório <tt>@rep@</tt>',
670
+    'plugin_info_automatique_lib' => 'Alguns plugins precisam de estar aptos a carregar ficheiros no directório <code>lib/</code>. Este directório deve ser criado na raiz do sítio.',
671
+    'plugin_info_automatique_liste' => 'As suas listas de plugins :',
672
+    'plugin_info_automatique_liste_officielle' => 'os plugins oficiais',
673
+    'plugin_info_automatique_liste_update' => 'Actualizar as listas',
674
+    'plugin_info_automatique_ou' => 'ou...',
675
+    'plugin_info_automatique_select' => 'Seleccione um plugin abaixo: SPIP irá carregá-lo e instalá-lo no directório <code>@rep@</code>. Se o plugin já existir, será actualizado.',
676
+    'plugin_info_credit' => 'Créditos',
677
+    'plugin_info_erreur_xml' => 'A declaração do plugin está incorrecta',
678
+    'plugin_info_install_ok' => 'Instalado com sucesso',
679
+    'plugin_info_necessite' => 'Requer:',
680
+    'plugin_info_non_compatible_spip' => 'O plugin é incompatível com esta versão de SPIP',
681
+    'plugin_info_plugins_dist_1' => 'Os plugins seguintes estão carregados e activados no directório @plugins_dist@.',
682
+    'plugin_info_plugins_dist_2' => 'Não podem ser desactivados.',
683
+    'plugin_info_telecharger' => 'carregar de @url@ e instalar em @rep@',
684
+    'plugin_info_upgrade_ok' => 'Actualizado com sucesso',
685
+    'plugin_librairies_installees' => 'Bibliotecas instaladas',
686
+    'plugin_necessite_extension_php' => 'Requer a extensão PHP @plugin@ em @version@.',
687
+    'plugin_necessite_extension_php_sans_version' => 'Requer a extensão PHP @plugin@',
688
+    'plugin_necessite_lib' => 'Este plugin requer a biblioteca @lib@',
689
+    'plugin_necessite_php' => 'Requer @plugin@ em versão @version@.',
690
+    'plugin_necessite_plugin' => 'Requer o plugin @plugin@ em versão @version@ ou mais recente.',
691
+    'plugin_necessite_plugin_sans_version' => 'Requer o plugin @plugin@',
692
+    'plugin_necessite_spip' => 'Requer SPIP em version @version@ ou mais recente.',
693
+    'plugin_source' => 'fonte: ',
694
+    'plugin_titre_automatique' => 'Instalação automática',
695
+    'plugin_titre_automatique_ajouter' => 'Adicionar plugins',
696
+    'plugin_titre_installation' => 'Instalação do plugin @plugin@',
697
+    'plugin_titre_modifier' => 'Os meus plugins',
698
+    'plugin_utilise_extension_php' => 'A extensão PHP @plugin@ deve estar na versão @version@.',
699
+    'plugin_utilise_php' => '@plugin@ deve estar na versão @version@.',
700
+    'plugin_utilise_plugin' => 'O plugin @plugin@ deve estar na versão @version@.',
701
+    'plugin_zip_active' => 'Continue para activar',
702
+    'plugin_zip_adresse' => 'Para carregar um ficheiro zip de plugin, ou uma lista de plugins, introduza o caminho abaixo.',
703
+    'plugin_zip_adresse_champ' => 'Endereço do plugin ou da lista',
704
+    'plugin_zip_content' => 'Contém os seguintes ficheiros  (@taille@),<br /> prontos a ser instalados no directório <code>@rep@</code>',
705
+    'plugin_zip_installe_finie' => 'O ficheiro @zip@ foi descomprimido e instalado.',
706
+    'plugin_zip_installe_rep_finie' => 'O ficheiro @zip@ foi descompactado e instalado no directório @rep@',
707
+    'plugin_zip_installer' => 'Agora pode instalar.',
708
+    'plugin_zip_telecharge' => 'O ficheiro @zip@ foi carregado',
709
+    'plugins_actif_aucun' => 'Sem plugins activados.',
710
+    'plugins_actif_un' => 'Um plugin activado.',
711
+    'plugins_actifs' => '@count@ plugins activados.',
712
+    'plugins_actifs_liste' => 'Activados',
713
+    'plugins_compte' => '@count@ plugins',
714
+    'plugins_disponible_un' => 'Um plugin disponível.',
715
+    'plugins_disponibles' => '@count@ plugins disponíveis.',
716
+    'plugins_erreur' => 'Erro nos plugins : @plugins@',
717
+    'plugins_liste' => 'Lista de plugins',
718
+    'plugins_liste_dist' => 'Plugins bloqueados',
719
+    'plugins_recents' => 'Plugins recentes.',
720
+    'plugins_tous_liste' => 'Todos',
721
+    'plugins_vue_hierarchie' => 'Hierarquia',
722
+    'plugins_vue_liste' => 'Lista',
723
+    'protocole_ldap' => 'Versão do protocolo:',
724 724
 
725
-	// Q
726
-	'queue_executer_maintenant' => 'Executar agora',
727
-	'queue_info_purger' => 'Pode eliminar todas as tarefas em espera e pôr a zeros a lista de tarefas periódicas',
728
-	'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera',
729
-	'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s',
730
-	'queue_no_job_in_queue' => 'Sem tarefas em espera',
731
-	'queue_one_job_in_queue' => '1 tarefa em espera',
732
-	'queue_priorite_tache' => 'prioridade',
733
-	'queue_purger_queue' => 'Pôr a zeros a lista de tarefas',
734
-	'queue_titre' => 'Lista de tarefas',
725
+    // Q
726
+    'queue_executer_maintenant' => 'Executar agora',
727
+    'queue_info_purger' => 'Pode eliminar todas as tarefas em espera e pôr a zeros a lista de tarefas periódicas',
728
+    'queue_nb_jobs_in_queue' => '@nb@ tarefas em espera',
729
+    'queue_next_job_in_nb_sec' => 'Próxima tarefa em @nb@ s',
730
+    'queue_no_job_in_queue' => 'Sem tarefas em espera',
731
+    'queue_one_job_in_queue' => '1 tarefa em espera',
732
+    'queue_priorite_tache' => 'prioridade',
733
+    'queue_purger_queue' => 'Pôr a zeros a lista de tarefas',
734
+    'queue_titre' => 'Lista de tarefas',
735 735
 
736
-	// R
737
-	'repertoire_plugins' => 'Directório :',
738
-	'required' => '(obrigatório)',
736
+    // R
737
+    'repertoire_plugins' => 'Directório :',
738
+    'required' => '(obrigatório)',
739 739
 
740
-	// S
741
-	'sans_heure' => 'tempo não especificado',
742
-	'statut_admin_restreint' => 'administrador restrito',
743
-	'statut_webmestre' => 'webmaster',
740
+    // S
741
+    'sans_heure' => 'tempo não especificado',
742
+    'statut_admin_restreint' => 'administrador restrito',
743
+    'statut_webmestre' => 'webmaster',
744 744
 
745
-	// T
746
-	'tache_cron_asap' => 'Tarefas CRON @function@ (ASAP)',
747
-	'tache_cron_secondes' => 'Tarefa CRON @function@ (todas as @nb@ s)',
748
-	'taille_cache_image' => 'As imagens calculadas automaticamente pelo SPIP (miniaturas dos documentos, títulos apresentados sob forma gráfica, funções matemáticas no formato TeX...) ocupam no directório @dir@ um total de @taille@.',
749
-	'taille_cache_infinie' => 'Este sítio não prevê limitação de tamanho do directório de cache <code>CACHE/</code>.',
750
-	'taille_cache_maxi' => 'SPIP tenta limitar o tamanho do diretório cache <code>CACHE/</code> deste sítio em cerca de <b>@octets@</b>.',
751
-	'taille_cache_moins_de' => 'O tamanho da cache é menor do que @octets@.',
752
-	'taille_cache_octets' => 'O tamanho da cache é actualmente cerca de  @octets@.',
753
-	'taille_cache_vide' => 'A cache está vazia.',
754
-	'taille_repertoire_cache' => 'Tamanho do directório cache',
755
-	'text_article_propose_publication' => 'Artigo proposto para publicação. Não hesite em dar a sua opinião graças ao fórum ligado a este artigo (no fundo da página).',
756
-	'texte_acces_ldap_anonyme_1' => 'Alguns servidores LDAP não aceitam nenhum acesso anónimo. Nesse caso, é preciso especificar um identificador de acesso inicial a fim de poder depois procurar informações no anuário. Na maior parte dos casos, porém, os seguintes campos poderão ser deixados vazios.',
757
-	'texte_admin_effacer_01' => 'Este comando apaga <i>todo</i> o conteúdo da base de dados,
745
+    // T
746
+    'tache_cron_asap' => 'Tarefas CRON @function@ (ASAP)',
747
+    'tache_cron_secondes' => 'Tarefa CRON @function@ (todas as @nb@ s)',
748
+    'taille_cache_image' => 'As imagens calculadas automaticamente pelo SPIP (miniaturas dos documentos, títulos apresentados sob forma gráfica, funções matemáticas no formato TeX...) ocupam no directório @dir@ um total de @taille@.',
749
+    'taille_cache_infinie' => 'Este sítio não prevê limitação de tamanho do directório de cache <code>CACHE/</code>.',
750
+    'taille_cache_maxi' => 'SPIP tenta limitar o tamanho do diretório cache <code>CACHE/</code> deste sítio em cerca de <b>@octets@</b>.',
751
+    'taille_cache_moins_de' => 'O tamanho da cache é menor do que @octets@.',
752
+    'taille_cache_octets' => 'O tamanho da cache é actualmente cerca de  @octets@.',
753
+    'taille_cache_vide' => 'A cache está vazia.',
754
+    'taille_repertoire_cache' => 'Tamanho do directório cache',
755
+    'text_article_propose_publication' => 'Artigo proposto para publicação. Não hesite em dar a sua opinião graças ao fórum ligado a este artigo (no fundo da página).',
756
+    'texte_acces_ldap_anonyme_1' => 'Alguns servidores LDAP não aceitam nenhum acesso anónimo. Nesse caso, é preciso especificar um identificador de acesso inicial a fim de poder depois procurar informações no anuário. Na maior parte dos casos, porém, os seguintes campos poderão ser deixados vazios.',
757
+    'texte_admin_effacer_01' => 'Este comando apaga <i>todo</i> o conteúdo da base de dados,
758 758
 inclusive <i>todos</i> os acessos de redactores e administradores. Depois de o ter executado, deverá
759 759
 reinstalar SPIP para recriar uma nova base assim como uma primeira conta de administrador.',
760
-	'texte_adresse_annuaire_1' => '(Se o seu anuário está instalado na mesma máquina que este sítio Web, trata-se de «localhost».)',
761
-	'texte_ajout_auteur' => 'O seguinte autor foi acrescentado ao artigo :',
762
-	'texte_annuaire_ldap_1' => 'Se tiver acesso a um anuário (LDAP), pode utilizá-lo para importar automaticamente utilizadores sob SPIP.',
763
-	'texte_article_statut' => 'Este artigo está:',
764
-	'texte_article_virtuel' => 'Artigo virtual',
765
-	'texte_article_virtuel_reference' => '<b>Artigo virtual :</b> artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL. Para suprimir a redirecção, apague a URL acima.',
766
-	'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"',
767
-	'texte_auteur_messagerie' => 'Este site pode indicar permanentemente a lista dos redactores ligados, o que lhe permite trocar mensagens  em directo ( quando o correio está desactivado mais acima, a lista dos redactores está desactivada). Pode decidir não aparecer nesta lista (estando « invisível » para os outros utilizadores).',
768
-	'texte_auteurs' => 'OS AUTORES',
769
-	'texte_choix_base_1' => 'Escolha a sua base de dados :',
770
-	'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.',
771
-	'texte_choix_base_3' => '<b>Seleccione</b> a seguir a que lhe foi atribuida pelo seu serviço de hospedagem.',
772
-	'texte_choix_table_prefix' => 'Prefixo das tabelas:',
773
-	'texte_compte_element' => '@count@ elemento',
774
-	'texte_compte_elements' => '@count@ elementos',
775
-	'texte_conflit_edition_correction' => 'Por favor compare as diferenças entre as duas versões. Pode também copiar as suas alterações e recomeçar.',
776
-	'texte_connexion_mysql' => 'Consulte as informações fornecidas pelo seu serviço de hospedagem: deve encontrar nelas, se o seu hospedeiro suporta SQL, os códigos de ligação ao servidor SQL.',
777
-	'texte_contenu_article' => '(Conteúdo do artigo em poucas palavras.)',
778
-	'texte_contenu_articles' => 'Segundo a maqueta adoptada para o seu sítio, pode decidir
760
+    'texte_adresse_annuaire_1' => '(Se o seu anuário está instalado na mesma máquina que este sítio Web, trata-se de «localhost».)',
761
+    'texte_ajout_auteur' => 'O seguinte autor foi acrescentado ao artigo :',
762
+    'texte_annuaire_ldap_1' => 'Se tiver acesso a um anuário (LDAP), pode utilizá-lo para importar automaticamente utilizadores sob SPIP.',
763
+    'texte_article_statut' => 'Este artigo está:',
764
+    'texte_article_virtuel' => 'Artigo virtual',
765
+    'texte_article_virtuel_reference' => '<b>Artigo virtual :</b> artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL. Para suprimir a redirecção, apague a URL acima.',
766
+    'texte_aucun_resultat_auteur' => 'Nenhum resultado para "@cherche_auteur@"',
767
+    'texte_auteur_messagerie' => 'Este site pode indicar permanentemente a lista dos redactores ligados, o que lhe permite trocar mensagens  em directo ( quando o correio está desactivado mais acima, a lista dos redactores está desactivada). Pode decidir não aparecer nesta lista (estando « invisível » para os outros utilizadores).',
768
+    'texte_auteurs' => 'OS AUTORES',
769
+    'texte_choix_base_1' => 'Escolha a sua base de dados :',
770
+    'texte_choix_base_2' => 'O servidor SQL contém várias bases de dados.',
771
+    'texte_choix_base_3' => '<b>Seleccione</b> a seguir a que lhe foi atribuida pelo seu serviço de hospedagem.',
772
+    'texte_choix_table_prefix' => 'Prefixo das tabelas:',
773
+    'texte_compte_element' => '@count@ elemento',
774
+    'texte_compte_elements' => '@count@ elementos',
775
+    'texte_conflit_edition_correction' => 'Por favor compare as diferenças entre as duas versões. Pode também copiar as suas alterações e recomeçar.',
776
+    'texte_connexion_mysql' => 'Consulte as informações fornecidas pelo seu serviço de hospedagem: deve encontrar nelas, se o seu hospedeiro suporta SQL, os códigos de ligação ao servidor SQL.',
777
+    'texte_contenu_article' => '(Conteúdo do artigo em poucas palavras.)',
778
+    'texte_contenu_articles' => 'Segundo a maqueta adoptada para o seu sítio, pode decidir
779 779
 que alguns elementos dos artigos não são utilizados.
780 780
    Utilize a lista a seguir para indicar quais são os elementos disponíveis.',
781
-	'texte_crash_base' => 'Se a sua base de dados foi
781
+    'texte_crash_base' => 'Se a sua base de dados foi
782 782
  destruída, pode tentar uma reparação
783 783
  automática.',
784
-	'texte_creer_rubrique' => 'Antes de poder escrever artigos, <br /> deve criar uma rubrica.',
785
-	'texte_date_creation_article' => 'DATA DE CRIAÇÃO DO ARTIGO:',
786
-	'texte_date_creation_objet' => 'Data de criação:', # on ajoute le ":"
787
-	'texte_date_publication_anterieure' => 'Data de redacção anterior :',
788
-	'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redacção anterior',
789
-	'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:',
790
-	'texte_date_publication_objet' => 'Data de publicação online:',
791
-	'texte_definir_comme_traduction_rubrique' => 'Esta secção é uma tradução da secção número: ',
792
-	'texte_descriptif_rapide' => 'Descrição rápida',
793
-	'texte_effacer_base' => 'Apagar a base de dados SPIP',
794
-	'texte_effacer_statistiques' => 'Apagar as estatísticas',
795
-	'texte_en_cours_validation' => 'Os artigos e notícias seguintes estão propostos para publicação. Não hesite em dar a sua opinião graças aos fóruns que lhes estão ligados.',
796
-	'texte_enrichir_mise_a_jour' => 'Pode enriquecer a paginação do seu texto, utilizando « atalhos tipográficos ».',
797
-	'texte_fichier_authent' => '<b>Deverá o SPIP criar os ficheiros especiais<tt>.htpasswd-admin</tt> no directório @dossier@?</b>
784
+    'texte_creer_rubrique' => 'Antes de poder escrever artigos, <br /> deve criar uma rubrica.',
785
+    'texte_date_creation_article' => 'DATA DE CRIAÇÃO DO ARTIGO:',
786
+    'texte_date_creation_objet' => 'Data de criação:', # on ajoute le ":"
787
+    'texte_date_publication_anterieure' => 'Data de redacção anterior :',
788
+    'texte_date_publication_anterieure_nonaffichee' => 'Não exibir a data de redacção anterior',
789
+    'texte_date_publication_article' => 'DATA DE PUBLICAÇÃO ONLINE:',
790
+    'texte_date_publication_objet' => 'Data de publicação online:',
791
+    'texte_definir_comme_traduction_rubrique' => 'Esta secção é uma tradução da secção número: ',
792
+    'texte_descriptif_rapide' => 'Descrição rápida',
793
+    'texte_effacer_base' => 'Apagar a base de dados SPIP',
794
+    'texte_effacer_statistiques' => 'Apagar as estatísticas',
795
+    'texte_en_cours_validation' => 'Os artigos e notícias seguintes estão propostos para publicação. Não hesite em dar a sua opinião graças aos fóruns que lhes estão ligados.',
796
+    'texte_enrichir_mise_a_jour' => 'Pode enriquecer a paginação do seu texto, utilizando « atalhos tipográficos ».',
797
+    'texte_fichier_authent' => '<b>Deverá o SPIP criar os ficheiros especiais<tt>.htpasswd-admin</tt> no directório @dossier@?</b>
798 798
 <p>Estes ficheiros podem servir-lhe para restringir o acesso aos autores
799 799
 e administradores a outras partes do seu sítio (por exemplo, um programa externo de estatísticas).<p>
800 800
 Se não utilizar os ficheiros especiais, pode deixar esta opção no seu valor por omissão (não há criação de ficheiros).',
801
-	'texte_informations_personnelles_1' => 'O sistema vai agora criar-lhe um acesso personalizado ao sítio',
802
-	'texte_informations_personnelles_2' => '(Nota : se se tratar de uma reinstalação e se o seu acesso continua funcional, pode',
803
-	'texte_introductif_article' => '(Texto introdutório do artigo.)',
804
-	'texte_jeu_caractere' => 'Esta opção é útil se o seu sítio precisa de exibir alfabetos diferentes do alfabeto romano (ou  «ocidental») e seus derivados. Nesse caso, pode ser preferível mudar a definição por defeito para utilizar um conjunto de carácteres adequado; aconselhamos, em todos os casos, a proceder a experiências a fim de encontrar uma solução satisfatória. Se modificar este parâmetro, não esqueça também de adaptar o sítio público (balisa<tt>#CHARSET</tt>).',
805
-	'texte_jeu_caractere_3' => 'O seu sítio usa actualmente o conjunto de caracteres:',
806
-	'texte_jeu_caractere_4' => 'Se não corresponde aos seus dados actuais (pode ocorrer após restaurar a base de dados a partir de uma cópia de segurança), ou se <em> estiver a configurar este sítio </em> e deseja usar um conjunto diferente de caracteres, por favor indique-o aqui :',
807
-	'texte_login_ldap_1' => '(Deixar vazio para um acesso anónimo, ou introduzir o caminho completo, por exemplo, « <tt>uid=silva, ou=users, dc=meu-dominio, dc=com</tt> ».)',
808
-	'texte_login_precaution' => 'Atenção ! Isto é o login sob o qual está ligado actualmente.
801
+    'texte_informations_personnelles_1' => 'O sistema vai agora criar-lhe um acesso personalizado ao sítio',
802
+    'texte_informations_personnelles_2' => '(Nota : se se tratar de uma reinstalação e se o seu acesso continua funcional, pode',
803
+    'texte_introductif_article' => '(Texto introdutório do artigo.)',
804
+    'texte_jeu_caractere' => 'Esta opção é útil se o seu sítio precisa de exibir alfabetos diferentes do alfabeto romano (ou  «ocidental») e seus derivados. Nesse caso, pode ser preferível mudar a definição por defeito para utilizar um conjunto de carácteres adequado; aconselhamos, em todos os casos, a proceder a experiências a fim de encontrar uma solução satisfatória. Se modificar este parâmetro, não esqueça também de adaptar o sítio público (balisa<tt>#CHARSET</tt>).',
805
+    'texte_jeu_caractere_3' => 'O seu sítio usa actualmente o conjunto de caracteres:',
806
+    'texte_jeu_caractere_4' => 'Se não corresponde aos seus dados actuais (pode ocorrer após restaurar a base de dados a partir de uma cópia de segurança), ou se <em> estiver a configurar este sítio </em> e deseja usar um conjunto diferente de caracteres, por favor indique-o aqui :',
807
+    'texte_login_ldap_1' => '(Deixar vazio para um acesso anónimo, ou introduzir o caminho completo, por exemplo, « <tt>uid=silva, ou=users, dc=meu-dominio, dc=com</tt> ».)',
808
+    'texte_login_precaution' => 'Atenção ! Isto é o login sob o qual está ligado actualmente.
809 809
 Utilize este formulário com precaução...',
810
-	'texte_messagerie_agenda' => 'Um sistema de mensagens permite aos redactores deste sítio comunicar directamente entre si na área privada. Está associado a uma agenda.',
811
-	'texte_mise_a_niveau_base_1' => 'Acaba de actualizar os ficheiros SPIP.
810
+    'texte_messagerie_agenda' => 'Um sistema de mensagens permite aos redactores deste sítio comunicar directamente entre si na área privada. Está associado a uma agenda.',
811
+    'texte_mise_a_niveau_base_1' => 'Acaba de actualizar os ficheiros SPIP.
812 812
 Agora é preciso pôr a nível a base de dados do sítio. ',
813
-	'texte_modifier_article' => 'Modificar o artigo :',
814
-	'texte_multilinguisme' => 'Se desejar gerir artigos em muitos idiomas, com uma navegação complexa, pode acrescentar um menu de idioma aos artigos e/ou às rubricas, em função da organização do seu sítio.',
815
-	'texte_multilinguisme_trad' => 'Pode também activar um sistema de gestão de ligações entre as diferentes traduções de um artigo.',
816
-	'texte_non_compresse' => '<i>não comprimido</i> ( o seu servidor não suporta esta funcionalidade)',
817
-	'texte_nouvelle_version_spip_1' => 'Instalou uma nova versão de SPIP.',
818
-	'texte_nouvelle_version_spip_2' => 'Esta nova versão precisa de uma actualização mais completa do que o normal. Se é o webmaster do sítio, por favor, apague o ficheiro <tt>inc_connect.php3</tt> do directório <tt>ecrire</tt> e retome a instalação de modo a incluir os seus parâmetros de ligação à base de dados.<p> (NB.: se não se lembra dos seus parâmetros de ligação, consulte o arquivo @connect@ antes de o apagar...)</p>',
819
-	'texte_operation_echec' => 'Volte à página anterior, seleccione uma outra base de dados ou crie uma nova. Verifique as informações fornecidas pelo seu serviço de hospedagem.',
820
-	'texte_plus_trois_car' => 'mais de 3 carácteres',
821
-	'texte_plusieurs_articles' => 'Muitos autores encontrados para "@cherche_auteur@":',
822
-	'texte_port_annuaire' => '(O valor indicado por defeito geralmente convém.)',
823
-	'texte_presente_plugin' => 'Esta página mostra os plugins disponíveis neste sítio. Pode activar os plugins necessários selaccionando a caixa correspondente.',
824
-	'texte_proposer_publication' => 'Quando terminar o seu artigo, <br /> pode propor a sua publicação.',
825
-	'texte_proxy' => 'Em alguns caso (intranet, redes protegidas...),
813
+    'texte_modifier_article' => 'Modificar o artigo :',
814
+    'texte_multilinguisme' => 'Se desejar gerir artigos em muitos idiomas, com uma navegação complexa, pode acrescentar um menu de idioma aos artigos e/ou às rubricas, em função da organização do seu sítio.',
815
+    'texte_multilinguisme_trad' => 'Pode também activar um sistema de gestão de ligações entre as diferentes traduções de um artigo.',
816
+    'texte_non_compresse' => '<i>não comprimido</i> ( o seu servidor não suporta esta funcionalidade)',
817
+    'texte_nouvelle_version_spip_1' => 'Instalou uma nova versão de SPIP.',
818
+    'texte_nouvelle_version_spip_2' => 'Esta nova versão precisa de uma actualização mais completa do que o normal. Se é o webmaster do sítio, por favor, apague o ficheiro <tt>inc_connect.php3</tt> do directório <tt>ecrire</tt> e retome a instalação de modo a incluir os seus parâmetros de ligação à base de dados.<p> (NB.: se não se lembra dos seus parâmetros de ligação, consulte o arquivo @connect@ antes de o apagar...)</p>',
819
+    'texte_operation_echec' => 'Volte à página anterior, seleccione uma outra base de dados ou crie uma nova. Verifique as informações fornecidas pelo seu serviço de hospedagem.',
820
+    'texte_plus_trois_car' => 'mais de 3 carácteres',
821
+    'texte_plusieurs_articles' => 'Muitos autores encontrados para "@cherche_auteur@":',
822
+    'texte_port_annuaire' => '(O valor indicado por defeito geralmente convém.)',
823
+    'texte_presente_plugin' => 'Esta página mostra os plugins disponíveis neste sítio. Pode activar os plugins necessários selaccionando a caixa correspondente.',
824
+    'texte_proposer_publication' => 'Quando terminar o seu artigo, <br /> pode propor a sua publicação.',
825
+    'texte_proxy' => 'Em alguns caso (intranet, redes protegidas...),
826 826
  pode ser necessário utilizar um <i>proxy HTTP</i>  para atingir os sítios vinculados.
827 827
  Se for o caso, indique a seguir o endereço, sob a forma
828 828
  @proxy_en_cours@. Em geral,
829 829
  poderá deixar esta caixa vazia.',
830
-	'texte_publication_articles_post_dates' => 'Que comportamento SPIP deve adoptar perante os artigos cuja
830
+    'texte_publication_articles_post_dates' => 'Que comportamento SPIP deve adoptar perante os artigos cuja
831 831
  data de publicação foi fixada para um prazo futuro ?',
832
-	'texte_rappel_selection_champs' => '[Não esquecer de seleccionar correctamente este campo.]',
833
-	'texte_recalcul_page' => 'Se quiser
832
+    'texte_rappel_selection_champs' => '[Não esquecer de seleccionar correctamente este campo.]',
833
+    'texte_recalcul_page' => 'Se quiser
834 834
 recompor uma única página, passe pelo espaço público e utilize o botão «recompor».',
835
-	'texte_recuperer_base' => 'Reparar a base de dados',
836
-	'texte_reference_mais_redirige' => 'artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL.',
837
-	'texte_requetes_echouent' => '<b>Quando algumas consultas SQL falharem sistematicamente e sem razão aparente, é possível que seja por causa da  própria base de dados
835
+    'texte_recuperer_base' => 'Reparar a base de dados',
836
+    'texte_reference_mais_redirige' => 'artigo referenciado no seu sítio SPIP, mas redirigido para uma outra URL.',
837
+    'texte_requetes_echouent' => '<b>Quando algumas consultas SQL falharem sistematicamente e sem razão aparente, é possível que seja por causa da  própria base de dados
838 838
 .</b><p>
839 839
 SQL dispõe de uma funcionalidade de reparação das suas tabelas quando forem acidententalmente danificadas. Pode tentar aqui essa reparação: se falhar, conserve uma cópia da exibição que talvez contenha
840 840
 indícios daquilo que não funciona...<p>
841 841
 Se o problema persistir, contacte o seu serviço de hospedagem.',
842
-	'texte_selection_langue_principale' => 'Pode seleccionar a seguir o  « idioma principal » do sítio. Esta opção não o obriga - felizmente ! - a escrever os seus artigos no idioma seleccionado, mas permite determinar :
842
+    'texte_selection_langue_principale' => 'Pode seleccionar a seguir o  « idioma principal » do sítio. Esta opção não o obriga - felizmente ! - a escrever os seus artigos no idioma seleccionado, mas permite determinar :
843 843
  <u><li> o formato por defeito das datas no sítio público ;</li>
844 844
  <li> a natureza do motor tipográfico que SPIP deve utilizar para a restituição dos textos ;</li>
845 845
   <li> o idioma utilizado nos formulários do sítio público ;</li>
846 846
   <li> o idioma apresentado por defeito no espaço privado.</li></ul> ',
847
-	'texte_sous_titre' => 'Sub-título',
848
-	'texte_statistiques_visites' => '(barras escuras : domingo / curva escura : evolução da média)',
849
-	'texte_statut_attente_validation' => 'à espera de validação',
850
-	'texte_statut_publies' => 'publicados online',
851
-	'texte_statut_refuses' => 'recusados',
852
-	'texte_suppression_fichiers' => 'Utilize este comando para suprimir todos os ficheiros presentes
847
+    'texte_sous_titre' => 'Sub-título',
848
+    'texte_statistiques_visites' => '(barras escuras : domingo / curva escura : evolução da média)',
849
+    'texte_statut_attente_validation' => 'à espera de validação',
850
+    'texte_statut_publies' => 'publicados online',
851
+    'texte_statut_refuses' => 'recusados',
852
+    'texte_suppression_fichiers' => 'Utilize este comando para suprimir todos os ficheiros presentes
853 853
 na cache SPIP. Isso permite, por exemplo, obrigar uma recomposição de todas as páginas se você
854 854
  fez modificações importantes de grafismo ou de estrutura do sítio.',
855
-	'texte_sur_titre' => 'Supra-título',
856
-	'texte_table_ok' => ': esta tabela está OK.',
857
-	'texte_tentative_recuperation' => 'Tentativa de reparação',
858
-	'texte_tenter_reparation' => 'Tentar uma reparação da base de dados',
859
-	'texte_test_proxy' => 'Para experimentar este proxy, indique aqui o endereço de um sítio Web
855
+    'texte_sur_titre' => 'Supra-título',
856
+    'texte_table_ok' => ': esta tabela está OK.',
857
+    'texte_tentative_recuperation' => 'Tentativa de reparação',
858
+    'texte_tenter_reparation' => 'Tentar uma reparação da base de dados',
859
+    'texte_test_proxy' => 'Para experimentar este proxy, indique aqui o endereço de um sítio Web
860 860
   que deseje testar;',
861
-	'texte_titre_02' => 'Título',
862
-	'texte_titre_obligatoire' => '<b>Título</b> [Obrigatório]',
863
-	'texte_travail_article' => '@nom_auteur_modif@ trabalhou sobre este artigo há @date_diff@ minutes',
864
-	'texte_travail_collaboratif' => 'Se é frequente muitos redactores
861
+    'texte_titre_02' => 'Título',
862
+    'texte_titre_obligatoire' => '<b>Título</b> [Obrigatório]',
863
+    'texte_travail_article' => '@nom_auteur_modif@ trabalhou sobre este artigo há @date_diff@ minutes',
864
+    'texte_travail_collaboratif' => 'Se é frequente muitos redactores
865 865
  trabalharem no mesmo artigo, o sistema
866 866
  pode exibir os artigos recentemente « abertos »
867 867
 a fim de evitar as modificações simultâneas.
868 868
   Esta opção está desactivada por defeito
869 869
   a fim de evitar exibir mensagens de aviso
870 870
  intempestivas.',
871
-	'texte_vide' => 'vazio',
872
-	'texte_vider_cache' => 'Esvaziar a cache',
873
-	'titre_admin_tech' => 'Manutenção técnica',
874
-	'titre_admin_vider' => 'Manutenção técnica',
875
-	'titre_ajouter_un_auteur' => 'Adicionar um autor',
876
-	'titre_ajouter_un_mot' => 'Adicionar uma palavra-chave',
877
-	'titre_cadre_afficher_article' => 'Exibir os artigos',
878
-	'titre_cadre_afficher_traductions' => 'Exibir o estado das traduções para estes idiomas:',
879
-	'titre_cadre_ajouter_auteur' => 'ACRESCENTAR UM AUTOR :',
880
-	'titre_cadre_interieur_rubrique' => 'Dentro da rubrica',
881
-	'titre_cadre_numero_auteur' => 'AUTOR NÚMERO',
882
-	'titre_cadre_numero_objet' => '@objet@ NÚMERO:',
883
-	'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [Obrigatória]<br />',
884
-	'titre_config_contenu_notifications' => 'Notificações',
885
-	'titre_config_contenu_prive' => 'Na área privada',
886
-	'titre_config_contenu_public' => 'No sítio público',
887
-	'titre_config_fonctions' => 'Configuração do sítio',
888
-	'titre_config_langage' => 'Configurar o idioma',
889
-	'titre_configuration' => 'Configuração do sítio',
890
-	'titre_configurer_preferences' => 'Configure as suas preferências',
891
-	'titre_configurer_preferences_menus' => 'Definir as suas preferências de menu',
892
-	'titre_conflit_edition' => 'Conflito durante a redacção',
893
-	'titre_connexion_ldap' => 'Opções: <b>Sua ligação LDAP</b>',
894
-	'titre_groupe_mots' => 'GRUPO DE PALAVRAS :',
895
-	'titre_identite_site' => 'Identidade do sítio',
896
-	'titre_langue_article' => 'IDIOMA DO ARTIGO ',
897
-	'titre_langue_rubrique' => 'Idioma da rubrica',
898
-	'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DO ARTIGO',
899
-	'titre_les_articles' => 'OS ARTIGOS',
900
-	'titre_messagerie_agenda' => 'Mensagens e agenda',
901
-	'titre_naviguer_dans_le_site' => 'Navegar no sítio',
902
-	'titre_nouvelle_rubrique' => 'Nova rubrica',
903
-	'titre_numero_rubrique' => 'RUBRICA NÚMERO :',
904
-	'titre_page_articles_edit' => 'Modificar : @titre@',
905
-	'titre_page_articles_page' => 'Os artigos',
906
-	'titre_page_articles_tous' => 'Todo o sítio',
907
-	'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@',
908
-	'titre_page_config_contenu' => 'Configuração do sítio',
909
-	'titre_page_delete_all' => 'Supressão total e irreversível',
910
-	'titre_page_recherche' => 'Resultados da pesquisa @recherche@',
911
-	'titre_page_statistiques_referers' => 'Estatísticas (ligações de entrada)',
912
-	'titre_page_upgrade' => 'Reactualização de SPIP',
913
-	'titre_preference_menus_favoris' => 'Menus de marcadores',
914
-	'titre_publication_articles_post_dates' => 'Publicação dos artigos pós-datados',
915
-	'titre_reparation' => 'Reparação',
916
-	'titre_suivi_petition' => 'Seguimento dos abaixo-assinados',
917
-	'tls_ldap' => 'Transport Layer Security :',
918
-	'trad_article_traduction' => 'Todas as versões deste artigo :',
919
-	'trad_delier' => 'Não voltar a ligar este artigo a estas traduções',
920
-	'trad_lier' => 'Este artigo é uma tradução do artigo número :',
921
-	'trad_new' => 'Escrever uma nova tradução deste artigo',
871
+    'texte_vide' => 'vazio',
872
+    'texte_vider_cache' => 'Esvaziar a cache',
873
+    'titre_admin_tech' => 'Manutenção técnica',
874
+    'titre_admin_vider' => 'Manutenção técnica',
875
+    'titre_ajouter_un_auteur' => 'Adicionar um autor',
876
+    'titre_ajouter_un_mot' => 'Adicionar uma palavra-chave',
877
+    'titre_cadre_afficher_article' => 'Exibir os artigos',
878
+    'titre_cadre_afficher_traductions' => 'Exibir o estado das traduções para estes idiomas:',
879
+    'titre_cadre_ajouter_auteur' => 'ACRESCENTAR UM AUTOR :',
880
+    'titre_cadre_interieur_rubrique' => 'Dentro da rubrica',
881
+    'titre_cadre_numero_auteur' => 'AUTOR NÚMERO',
882
+    'titre_cadre_numero_objet' => '@objet@ NÚMERO:',
883
+    'titre_cadre_signature_obligatoire' => '<b>Assinatura</b> [Obrigatória]<br />',
884
+    'titre_config_contenu_notifications' => 'Notificações',
885
+    'titre_config_contenu_prive' => 'Na área privada',
886
+    'titre_config_contenu_public' => 'No sítio público',
887
+    'titre_config_fonctions' => 'Configuração do sítio',
888
+    'titre_config_langage' => 'Configurar o idioma',
889
+    'titre_configuration' => 'Configuração do sítio',
890
+    'titre_configurer_preferences' => 'Configure as suas preferências',
891
+    'titre_configurer_preferences_menus' => 'Definir as suas preferências de menu',
892
+    'titre_conflit_edition' => 'Conflito durante a redacção',
893
+    'titre_connexion_ldap' => 'Opções: <b>Sua ligação LDAP</b>',
894
+    'titre_groupe_mots' => 'GRUPO DE PALAVRAS :',
895
+    'titre_identite_site' => 'Identidade do sítio',
896
+    'titre_langue_article' => 'IDIOMA DO ARTIGO ',
897
+    'titre_langue_rubrique' => 'Idioma da rubrica',
898
+    'titre_langue_trad_article' => 'IDIOMA E TRADUÇÕES DO ARTIGO',
899
+    'titre_les_articles' => 'OS ARTIGOS',
900
+    'titre_messagerie_agenda' => 'Mensagens e agenda',
901
+    'titre_naviguer_dans_le_site' => 'Navegar no sítio',
902
+    'titre_nouvelle_rubrique' => 'Nova rubrica',
903
+    'titre_numero_rubrique' => 'RUBRICA NÚMERO :',
904
+    'titre_page_articles_edit' => 'Modificar : @titre@',
905
+    'titre_page_articles_page' => 'Os artigos',
906
+    'titre_page_articles_tous' => 'Todo o sítio',
907
+    'titre_page_calendrier' => 'Calendário @nom_mois@ @annee@',
908
+    'titre_page_config_contenu' => 'Configuração do sítio',
909
+    'titre_page_delete_all' => 'Supressão total e irreversível',
910
+    'titre_page_recherche' => 'Resultados da pesquisa @recherche@',
911
+    'titre_page_statistiques_referers' => 'Estatísticas (ligações de entrada)',
912
+    'titre_page_upgrade' => 'Reactualização de SPIP',
913
+    'titre_preference_menus_favoris' => 'Menus de marcadores',
914
+    'titre_publication_articles_post_dates' => 'Publicação dos artigos pós-datados',
915
+    'titre_reparation' => 'Reparação',
916
+    'titre_suivi_petition' => 'Seguimento dos abaixo-assinados',
917
+    'tls_ldap' => 'Transport Layer Security :',
918
+    'trad_article_traduction' => 'Todas as versões deste artigo :',
919
+    'trad_delier' => 'Não voltar a ligar este artigo a estas traduções',
920
+    'trad_lier' => 'Este artigo é uma tradução do artigo número :',
921
+    'trad_new' => 'Escrever uma nova tradução deste artigo',
922 922
 
923
-	// U
924
-	'utf8_convert_erreur_orig' => 'Erro : o conjunto de caracteres @charset@ não é suportado.',
923
+    // U
924
+    'utf8_convert_erreur_orig' => 'Erro : o conjunto de caracteres @charset@ não é suportado.',
925 925
 
926
-	// V
927
-	'version' => 'Versão:'
926
+    // V
927
+    'version' => 'Versão:'
928 928
 );
Please login to merge, or discard this patch.
ecrire/lang/spip_pt.php 1 patch
Indentation   +643 added lines, -643 removed lines patch added patch discarded remove patch
@@ -4,571 +4,571 @@  discard block
 block discarded – undo
4 4
 // ** ne pas modifier le fichier **
5 5
 
6 6
 if (!defined('_ECRIRE_INC_VERSION')) {
7
-	return;
7
+    return;
8 8
 }
9 9
 
10 10
 $GLOBALS[$GLOBALS['idx_lang']] = array(
11 11
 
12
-	// A
13
-	'access_interface_graphique' => 'Voltar à interface gráfica completa',
14
-	'access_mode_texte' => 'Exibir a interface textual simplificada',
15
-	'admin_debug' => 'debug',
16
-	'admin_modifier_article' => 'Modificar este artigo',
17
-	'admin_modifier_auteur' => 'Modificar este autor',
18
-	'admin_modifier_breve' => 'Modificar esta notícia',
19
-	'admin_modifier_mot' => 'Modificar esta palavra-chave',
20
-	'admin_modifier_rubrique' => 'Modificar esta rubrica',
21
-	'admin_recalculer' => 'Recompor esta página',
22
-	'afficher_calendrier' => 'Exibir o calendário',
23
-	'afficher_trad' => 'exibir as traduções',
24
-	'alerte_maj_impossible' => '<b>Alerta !</b> A actualização da base de dados SQL para a versão @version@ é impossível, talvez por causa de um problema de permissão de modificação na base de dados. Por favor contacte o seu serviço de hospedagem.',
25
-	'alerte_modif_info_concourante' => 'ATTENÇÃO : Esta informação já foi modificada noutro menu. O valor actual é :',
26
-	'analyse_xml' => 'Análise XML',
27
-	'annuler' => 'Cancelar',
28
-	'antispam_champ_vide' => 'Por favor deixe este campo vazio :',
29
-	'articles_recents' => 'Artigos mais recentes',
30
-	'avis_archive_incorrect' => 'o ficheiro arquivo não é um ficheiro SPIP',
31
-	'avis_archive_invalide' => 'o ficheiro arquivo não é válido ',
32
-	'avis_attention' => ' ATENÇÂO!',
33
-	'avis_champ_incorrect_type_objet' => 'Nome de campo incorrecto @name@ para objecto de tipo @type@',
34
-	'avis_colonne_inexistante' => 'A coluna  @col@ não existe',
35
-	'avis_erreur' => 'Erro: ver mais abaixo',
36
-	'avis_erreur_connexion' => 'Erro de ligação ',
37
-	'avis_erreur_cookie' => 'problema de cookie',
38
-	'avis_erreur_fonction_contexte' => 'Erro de programação. Não se pode chamar esta função neste contexto.',
39
-	'avis_erreur_mysql' => 'Erro SQL',
40
-	'avis_erreur_sauvegarde' => 'Erro na cópia de segurança  (@type@ @id_objet@) !',
41
-	'avis_erreur_visiteur' => 'Problema de acesso à área privada',
12
+    // A
13
+    'access_interface_graphique' => 'Voltar à interface gráfica completa',
14
+    'access_mode_texte' => 'Exibir a interface textual simplificada',
15
+    'admin_debug' => 'debug',
16
+    'admin_modifier_article' => 'Modificar este artigo',
17
+    'admin_modifier_auteur' => 'Modificar este autor',
18
+    'admin_modifier_breve' => 'Modificar esta notícia',
19
+    'admin_modifier_mot' => 'Modificar esta palavra-chave',
20
+    'admin_modifier_rubrique' => 'Modificar esta rubrica',
21
+    'admin_recalculer' => 'Recompor esta página',
22
+    'afficher_calendrier' => 'Exibir o calendário',
23
+    'afficher_trad' => 'exibir as traduções',
24
+    'alerte_maj_impossible' => '<b>Alerta !</b> A actualização da base de dados SQL para a versão @version@ é impossível, talvez por causa de um problema de permissão de modificação na base de dados. Por favor contacte o seu serviço de hospedagem.',
25
+    'alerte_modif_info_concourante' => 'ATTENÇÃO : Esta informação já foi modificada noutro menu. O valor actual é :',
26
+    'analyse_xml' => 'Análise XML',
27
+    'annuler' => 'Cancelar',
28
+    'antispam_champ_vide' => 'Por favor deixe este campo vazio :',
29
+    'articles_recents' => 'Artigos mais recentes',
30
+    'avis_archive_incorrect' => 'o ficheiro arquivo não é um ficheiro SPIP',
31
+    'avis_archive_invalide' => 'o ficheiro arquivo não é válido ',
32
+    'avis_attention' => ' ATENÇÂO!',
33
+    'avis_champ_incorrect_type_objet' => 'Nome de campo incorrecto @name@ para objecto de tipo @type@',
34
+    'avis_colonne_inexistante' => 'A coluna  @col@ não existe',
35
+    'avis_erreur' => 'Erro: ver mais abaixo',
36
+    'avis_erreur_connexion' => 'Erro de ligação ',
37
+    'avis_erreur_cookie' => 'problema de cookie',
38
+    'avis_erreur_fonction_contexte' => 'Erro de programação. Não se pode chamar esta função neste contexto.',
39
+    'avis_erreur_mysql' => 'Erro SQL',
40
+    'avis_erreur_sauvegarde' => 'Erro na cópia de segurança  (@type@ @id_objet@) !',
41
+    'avis_erreur_visiteur' => 'Problema de acesso à área privada',
42 42
 
43
-	// B
44
-	'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave',
45
-	'barre_aide' => 'Utilize as abreviaturas tipográficas para enriquecer a sua paginação.',
46
-	'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo ',
47
-	'barre_eo' => 'Inserir um E no O',
48
-	'barre_eo_maj' => 'Inserir um E no O maiúsculo',
49
-	'barre_euro' => 'Inserir o símbolo €',
50
-	'barre_gras' => '  Escrever em {{negro}}',
51
-	'barre_guillemets' => 'Colocar entre "aspas" ',
52
-	'barre_guillemets_simples' => 'Colocar entre ’aspas simples’',
53
-	'barre_intertitre' => 'Transfomar em  {{{intertítulo}}} ',
54
-	'barre_italic' => 'Pôr em itálico ',
55
-	'barre_lien' => 'Transformar em [ligação hipertexto->http://...]',
56
-	'barre_lien_input' => 'Por favor indique o endereço da sua ligação (pode indicar um endereço Web sob a forma  http://www.monsite/com ou simplesmente indicar o número de um artigo deste sítio.) ',
57
-	'barre_note' => 'Transformar em  [[Nota de rodapé ]]',
58
-	'barre_paragraphe' => 'Criar um parágrafo',
59
-	'barre_quote' => '<quote>Citar uma  mensagem</quote>',
60
-	'bouton_changer' => 'Modificar',
61
-	'bouton_chercher' => 'Procurar',
62
-	'bouton_choisir' => 'Seleccionar',
63
-	'bouton_deplacer' => 'Mover',
64
-	'bouton_download' => 'Download',
65
-	'bouton_enregistrer' => 'Guardar',
66
-	'bouton_radio_desactiver_messagerie_interne' => 'Desactivar a caixa de correio interno',
67
-	'bouton_radio_envoi_annonces' => 'Enviar os anúncios editoriais',
68
-	'bouton_radio_non_envoi_annonces' => 'Não enviar anúncios',
69
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades',
70
-	'bouton_recharger_page' => 'recarregar esta página',
71
-	'bouton_telecharger' => 'Carregar',
72
-	'bouton_upload' => 'Carregar',
73
-	'bouton_valider' => 'Submeter',
43
+    // B
44
+    'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave',
45
+    'barre_aide' => 'Utilize as abreviaturas tipográficas para enriquecer a sua paginação.',
46
+    'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo ',
47
+    'barre_eo' => 'Inserir um E no O',
48
+    'barre_eo_maj' => 'Inserir um E no O maiúsculo',
49
+    'barre_euro' => 'Inserir o símbolo €',
50
+    'barre_gras' => '  Escrever em {{negro}}',
51
+    'barre_guillemets' => 'Colocar entre "aspas" ',
52
+    'barre_guillemets_simples' => 'Colocar entre ’aspas simples’',
53
+    'barre_intertitre' => 'Transfomar em  {{{intertítulo}}} ',
54
+    'barre_italic' => 'Pôr em itálico ',
55
+    'barre_lien' => 'Transformar em [ligação hipertexto->http://...]',
56
+    'barre_lien_input' => 'Por favor indique o endereço da sua ligação (pode indicar um endereço Web sob a forma  http://www.monsite/com ou simplesmente indicar o número de um artigo deste sítio.) ',
57
+    'barre_note' => 'Transformar em  [[Nota de rodapé ]]',
58
+    'barre_paragraphe' => 'Criar um parágrafo',
59
+    'barre_quote' => '<quote>Citar uma  mensagem</quote>',
60
+    'bouton_changer' => 'Modificar',
61
+    'bouton_chercher' => 'Procurar',
62
+    'bouton_choisir' => 'Seleccionar',
63
+    'bouton_deplacer' => 'Mover',
64
+    'bouton_download' => 'Download',
65
+    'bouton_enregistrer' => 'Guardar',
66
+    'bouton_radio_desactiver_messagerie_interne' => 'Desactivar a caixa de correio interno',
67
+    'bouton_radio_envoi_annonces' => 'Enviar os anúncios editoriais',
68
+    'bouton_radio_non_envoi_annonces' => 'Não enviar anúncios',
69
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades',
70
+    'bouton_recharger_page' => 'recarregar esta página',
71
+    'bouton_telecharger' => 'Carregar',
72
+    'bouton_upload' => 'Carregar',
73
+    'bouton_valider' => 'Submeter',
74 74
 
75
-	// C
76
-	'cal_apresmidi' => 'tarde',
77
-	'cal_jour_entier' => 'dia todo',
78
-	'cal_matin' => 'manhã',
79
-	'cal_par_jour' => 'calendário por dia',
80
-	'cal_par_mois' => 'calendário por mês',
81
-	'cal_par_semaine' => 'calendário por semana',
82
-	'choix_couleur_interface' => 'cor',
83
-	'choix_interface' => 'escolha da interface',
84
-	'colonne' => 'Coluna',
85
-	'confirm_changer_statut' => 'Atenção, solicitou a alteração do estatuto deste elemento. Deseja continuar?',
86
-	'correcte' => 'correcto',
75
+    // C
76
+    'cal_apresmidi' => 'tarde',
77
+    'cal_jour_entier' => 'dia todo',
78
+    'cal_matin' => 'manhã',
79
+    'cal_par_jour' => 'calendário por dia',
80
+    'cal_par_mois' => 'calendário por mês',
81
+    'cal_par_semaine' => 'calendário por semana',
82
+    'choix_couleur_interface' => 'cor',
83
+    'choix_interface' => 'escolha da interface',
84
+    'colonne' => 'Coluna',
85
+    'confirm_changer_statut' => 'Atenção, solicitou a alteração do estatuto deste elemento. Deseja continuar?',
86
+    'correcte' => 'correcto',
87 87
 
88
-	// D
89
-	'date_aujourdhui' => 'hoje',
90
-	'date_avant_jc' => 'a. J.C.',
91
-	'date_dans' => 'entre @delai@',
92
-	'date_de_mois_1' => '@j@ de @nommois@',
93
-	'date_de_mois_10' => '@j@ de @nommois@',
94
-	'date_de_mois_11' => '@j@ de @nommois@',
95
-	'date_de_mois_12' => '@j@ de @nommois@',
96
-	'date_de_mois_2' => '@j@ de @nommois@',
97
-	'date_de_mois_3' => '@j@ de @nommois@',
98
-	'date_de_mois_4' => '@j@ de @nommois@',
99
-	'date_de_mois_5' => '@j@ de @nommois@',
100
-	'date_de_mois_6' => '@j@ de @nommois@',
101
-	'date_de_mois_7' => '@j@ de @nommois@',
102
-	'date_de_mois_8' => '@j@ de @nommois@',
103
-	'date_de_mois_9' => '@j@ de @nommois@',
104
-	'date_demain' => 'amanhã',
105
-	'date_fmt_heures_minutes' => '@h@h@m@min',
106
-	'date_fmt_heures_minutes_court' => '@h@:@m@',
107
-	'date_fmt_jour' => '@nomjour@ @jour@',
108
-	'date_fmt_jour_heure' => '@jour@ a @heure@',
109
-	'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ a @heure_fin@', # MODIF
110
-	'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@', # MODIF
111
-	'date_fmt_jour_mois' => '@jour@ de @nommois@',
112
-	'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@',
113
-	'date_fmt_mois_annee' => '@nommois@ de @annee@',
114
-	'date_fmt_nomjour' => '@nomjour@ @date@',
115
-	'date_fmt_nomjour_date' => ' @nomjour@ @date@',
116
-	'date_fmt_periode' => 'De @date_debut@ a @date_fin@',
117
-	'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@',
118
-	'date_fmt_periode_from' => 'De',
119
-	'date_fmt_periode_to' => 'a',
120
-	'date_heures' => 'horas',
121
-	'date_hier' => 'ontem',
122
-	'date_il_y_a' => 'há @delai@',
123
-	'date_jnum1' => '1',
124
-	'date_jnum10' => '10',
125
-	'date_jnum11' => '11',
126
-	'date_jnum12' => '12',
127
-	'date_jnum13' => '13',
128
-	'date_jnum14' => '14',
129
-	'date_jnum15' => '15',
130
-	'date_jnum16' => '16',
131
-	'date_jnum17' => '17',
132
-	'date_jnum18' => '18',
133
-	'date_jnum19' => '19',
134
-	'date_jnum2' => '2',
135
-	'date_jnum20' => '20',
136
-	'date_jnum21' => '21',
137
-	'date_jnum22' => '22',
138
-	'date_jnum23' => '23',
139
-	'date_jnum24' => '24',
140
-	'date_jnum25' => '25',
141
-	'date_jnum26' => '26',
142
-	'date_jnum27' => '27',
143
-	'date_jnum28' => '28',
144
-	'date_jnum29' => '29',
145
-	'date_jnum3' => '3',
146
-	'date_jnum30' => '30',
147
-	'date_jnum31' => '31',
148
-	'date_jnum4' => '4',
149
-	'date_jnum5' => '5',
150
-	'date_jnum6' => '6',
151
-	'date_jnum7' => '7',
152
-	'date_jnum8' => '8',
153
-	'date_jnum9' => '9',
154
-	'date_jour_1' => 'domingo',
155
-	'date_jour_1_abbr' => 'Dom.',
156
-	'date_jour_1_initiale' => 'D.',
157
-	'date_jour_2' => 'segunda-feira',
158
-	'date_jour_2_abbr' => 'Seg.',
159
-	'date_jour_2_initiale' => 'S.',
160
-	'date_jour_3' => 'terça-feira',
161
-	'date_jour_3_abbr' => 'Ter.',
162
-	'date_jour_3_initiale' => 'T.',
163
-	'date_jour_4' => 'quarta-feira',
164
-	'date_jour_4_abbr' => 'Qua.',
165
-	'date_jour_4_initiale' => 'Q.',
166
-	'date_jour_5' => 'quinta-feira',
167
-	'date_jour_5_abbr' => 'Qui.',
168
-	'date_jour_5_initiale' => 'Q.',
169
-	'date_jour_6' => 'sexta-feira',
170
-	'date_jour_6_abbr' => 'Sex.',
171
-	'date_jour_6_initiale' => 'S.',
172
-	'date_jour_7' => 'sábado',
173
-	'date_jour_7_abbr' => 'Sab.',
174
-	'date_jour_7_initiale' => 'S.',
175
-	'date_jours' => 'dias',
176
-	'date_minutes' => 'minutos',
177
-	'date_mois' => 'meses',
178
-	'date_mois_1' => 'Janeiro',
179
-	'date_mois_10' => 'Outubro',
180
-	'date_mois_10_abbr' => 'Out.',
181
-	'date_mois_11' => 'Novembro',
182
-	'date_mois_11_abbr' => 'Nov.',
183
-	'date_mois_12' => 'Dezembro',
184
-	'date_mois_12_abbr' => 'Dez.',
185
-	'date_mois_1_abbr' => 'Jan.',
186
-	'date_mois_2' => 'Fevereiro',
187
-	'date_mois_2_abbr' => 'Feb.',
188
-	'date_mois_3' => 'Março',
189
-	'date_mois_3_abbr' => 'Mar',
190
-	'date_mois_4' => 'Abril',
191
-	'date_mois_4_abbr' => 'Abr.',
192
-	'date_mois_5' => 'Maio',
193
-	'date_mois_5_abbr' => 'Mai',
194
-	'date_mois_6' => 'Junho',
195
-	'date_mois_6_abbr' => 'Jun',
196
-	'date_mois_7' => 'Julho',
197
-	'date_mois_7_abbr' => 'Jul',
198
-	'date_mois_8' => 'Agosto',
199
-	'date_mois_8_abbr' => 'Ago',
200
-	'date_mois_9' => 'Setembro',
201
-	'date_mois_9_abbr' => 'Set',
202
-	'date_saison_1' => 'inverno',
203
-	'date_saison_2' => 'primavera',
204
-	'date_saison_3' => 'verão',
205
-	'date_saison_4' => 'outono',
206
-	'date_secondes' => 'segundos',
207
-	'date_semaines' => 'semanas',
208
-	'date_un_mois' => 'mês',
209
-	'date_une_heure' => 'hora',
210
-	'date_une_minute' => 'minuto',
211
-	'date_une_seconde' => 'segundo',
212
-	'date_une_semaine' => 'semana',
213
-	'dirs_commencer' => 'a fim de começar realmente a instalação',
214
-	'dirs_preliminaire' => 'Preliminar : <b>Configurar os direitos de acesso</b>',
215
-	'dirs_probleme_droits' => 'Problema de direitos de acesso',
216
-	'dirs_repertoires_absents' => '<b>Os seguintes directórios não foram encontrados : <ul>@bad_dirs@.</ul> </b>
88
+    // D
89
+    'date_aujourdhui' => 'hoje',
90
+    'date_avant_jc' => 'a. J.C.',
91
+    'date_dans' => 'entre @delai@',
92
+    'date_de_mois_1' => '@j@ de @nommois@',
93
+    'date_de_mois_10' => '@j@ de @nommois@',
94
+    'date_de_mois_11' => '@j@ de @nommois@',
95
+    'date_de_mois_12' => '@j@ de @nommois@',
96
+    'date_de_mois_2' => '@j@ de @nommois@',
97
+    'date_de_mois_3' => '@j@ de @nommois@',
98
+    'date_de_mois_4' => '@j@ de @nommois@',
99
+    'date_de_mois_5' => '@j@ de @nommois@',
100
+    'date_de_mois_6' => '@j@ de @nommois@',
101
+    'date_de_mois_7' => '@j@ de @nommois@',
102
+    'date_de_mois_8' => '@j@ de @nommois@',
103
+    'date_de_mois_9' => '@j@ de @nommois@',
104
+    'date_demain' => 'amanhã',
105
+    'date_fmt_heures_minutes' => '@h@h@m@min',
106
+    'date_fmt_heures_minutes_court' => '@h@:@m@',
107
+    'date_fmt_jour' => '@nomjour@ @jour@',
108
+    'date_fmt_jour_heure' => '@jour@ a @heure@',
109
+    'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ a @heure_fin@', # MODIF
110
+    'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@', # MODIF
111
+    'date_fmt_jour_mois' => '@jour@ de @nommois@',
112
+    'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@',
113
+    'date_fmt_mois_annee' => '@nommois@ de @annee@',
114
+    'date_fmt_nomjour' => '@nomjour@ @date@',
115
+    'date_fmt_nomjour_date' => ' @nomjour@ @date@',
116
+    'date_fmt_periode' => 'De @date_debut@ a @date_fin@',
117
+    'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@',
118
+    'date_fmt_periode_from' => 'De',
119
+    'date_fmt_periode_to' => 'a',
120
+    'date_heures' => 'horas',
121
+    'date_hier' => 'ontem',
122
+    'date_il_y_a' => 'há @delai@',
123
+    'date_jnum1' => '1',
124
+    'date_jnum10' => '10',
125
+    'date_jnum11' => '11',
126
+    'date_jnum12' => '12',
127
+    'date_jnum13' => '13',
128
+    'date_jnum14' => '14',
129
+    'date_jnum15' => '15',
130
+    'date_jnum16' => '16',
131
+    'date_jnum17' => '17',
132
+    'date_jnum18' => '18',
133
+    'date_jnum19' => '19',
134
+    'date_jnum2' => '2',
135
+    'date_jnum20' => '20',
136
+    'date_jnum21' => '21',
137
+    'date_jnum22' => '22',
138
+    'date_jnum23' => '23',
139
+    'date_jnum24' => '24',
140
+    'date_jnum25' => '25',
141
+    'date_jnum26' => '26',
142
+    'date_jnum27' => '27',
143
+    'date_jnum28' => '28',
144
+    'date_jnum29' => '29',
145
+    'date_jnum3' => '3',
146
+    'date_jnum30' => '30',
147
+    'date_jnum31' => '31',
148
+    'date_jnum4' => '4',
149
+    'date_jnum5' => '5',
150
+    'date_jnum6' => '6',
151
+    'date_jnum7' => '7',
152
+    'date_jnum8' => '8',
153
+    'date_jnum9' => '9',
154
+    'date_jour_1' => 'domingo',
155
+    'date_jour_1_abbr' => 'Dom.',
156
+    'date_jour_1_initiale' => 'D.',
157
+    'date_jour_2' => 'segunda-feira',
158
+    'date_jour_2_abbr' => 'Seg.',
159
+    'date_jour_2_initiale' => 'S.',
160
+    'date_jour_3' => 'terça-feira',
161
+    'date_jour_3_abbr' => 'Ter.',
162
+    'date_jour_3_initiale' => 'T.',
163
+    'date_jour_4' => 'quarta-feira',
164
+    'date_jour_4_abbr' => 'Qua.',
165
+    'date_jour_4_initiale' => 'Q.',
166
+    'date_jour_5' => 'quinta-feira',
167
+    'date_jour_5_abbr' => 'Qui.',
168
+    'date_jour_5_initiale' => 'Q.',
169
+    'date_jour_6' => 'sexta-feira',
170
+    'date_jour_6_abbr' => 'Sex.',
171
+    'date_jour_6_initiale' => 'S.',
172
+    'date_jour_7' => 'sábado',
173
+    'date_jour_7_abbr' => 'Sab.',
174
+    'date_jour_7_initiale' => 'S.',
175
+    'date_jours' => 'dias',
176
+    'date_minutes' => 'minutos',
177
+    'date_mois' => 'meses',
178
+    'date_mois_1' => 'Janeiro',
179
+    'date_mois_10' => 'Outubro',
180
+    'date_mois_10_abbr' => 'Out.',
181
+    'date_mois_11' => 'Novembro',
182
+    'date_mois_11_abbr' => 'Nov.',
183
+    'date_mois_12' => 'Dezembro',
184
+    'date_mois_12_abbr' => 'Dez.',
185
+    'date_mois_1_abbr' => 'Jan.',
186
+    'date_mois_2' => 'Fevereiro',
187
+    'date_mois_2_abbr' => 'Feb.',
188
+    'date_mois_3' => 'Março',
189
+    'date_mois_3_abbr' => 'Mar',
190
+    'date_mois_4' => 'Abril',
191
+    'date_mois_4_abbr' => 'Abr.',
192
+    'date_mois_5' => 'Maio',
193
+    'date_mois_5_abbr' => 'Mai',
194
+    'date_mois_6' => 'Junho',
195
+    'date_mois_6_abbr' => 'Jun',
196
+    'date_mois_7' => 'Julho',
197
+    'date_mois_7_abbr' => 'Jul',
198
+    'date_mois_8' => 'Agosto',
199
+    'date_mois_8_abbr' => 'Ago',
200
+    'date_mois_9' => 'Setembro',
201
+    'date_mois_9_abbr' => 'Set',
202
+    'date_saison_1' => 'inverno',
203
+    'date_saison_2' => 'primavera',
204
+    'date_saison_3' => 'verão',
205
+    'date_saison_4' => 'outono',
206
+    'date_secondes' => 'segundos',
207
+    'date_semaines' => 'semanas',
208
+    'date_un_mois' => 'mês',
209
+    'date_une_heure' => 'hora',
210
+    'date_une_minute' => 'minuto',
211
+    'date_une_seconde' => 'segundo',
212
+    'date_une_semaine' => 'semana',
213
+    'dirs_commencer' => 'a fim de começar realmente a instalação',
214
+    'dirs_preliminaire' => 'Preliminar : <b>Configurar os direitos de acesso</b>',
215
+    'dirs_probleme_droits' => 'Problema de direitos de acesso',
216
+    'dirs_repertoires_absents' => '<b>Os seguintes directórios não foram encontrados : <ul>@bad_dirs@.</ul> </b>
217 217
   <p>É provável que resulte de um problema de má colocação de maiúsculas ou minúsculas.
218 218
   Verifique que as minúsculas e maiúsculas destes directórios concordam com o que está exibido
219 219
  acima; se não for o caso, renomeie os repertórios com o seu software FTP de modo a corrigir o erro.
220 220
   <p>Terminada esta operação, poderá</p>',
221
-	'dirs_repertoires_suivants' => '<b>Os seguintes directórios não estão acessíveis para escrita: <ul>@bad_dirs@.</ul> </b>
221
+    'dirs_repertoires_suivants' => '<b>Os seguintes directórios não estão acessíveis para escrita: <ul>@bad_dirs@.</ul> </b>
222 222
   <p>Para corrigir, utilize o seu programa de FTP para configurar os direitos de acesso de cada um
223 223
   destes directórios. O procedimento está explicado em detalhe no manual de instalação.
224 224
   <p>Uma vez efectuada esta alteração, poderá',
225
-	'double_occurrence' => 'Dupla ocorrência de @balise@',
225
+    'double_occurrence' => 'Dupla ocorrência de @balise@',
226 226
 
227
-	// E
228
-	'en_cours' => 'em curso',
229
-	'envoi_via_le_site' => 'Envio pelo sítio',
230
-	'erreur' => 'Erro',
231
-	'erreur_balise_non_fermee' => 'última tag não fechada :',
232
-	'erreur_technique_ajaxform' => 'Ooops. Uum erro inesperado impediu o formulário de ser enviado. Por favor tente novamente.',
233
-	'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu o registo correcto do campo @champs@.',
234
-	'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu o registo.',
235
-	'erreur_texte' => 'erro(s)',
236
-	'etape' => 'Etapa',
227
+    // E
228
+    'en_cours' => 'em curso',
229
+    'envoi_via_le_site' => 'Envio pelo sítio',
230
+    'erreur' => 'Erro',
231
+    'erreur_balise_non_fermee' => 'última tag não fechada :',
232
+    'erreur_technique_ajaxform' => 'Ooops. Uum erro inesperado impediu o formulário de ser enviado. Por favor tente novamente.',
233
+    'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu o registo correcto do campo @champs@.',
234
+    'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu o registo.',
235
+    'erreur_texte' => 'erro(s)',
236
+    'etape' => 'Etapa',
237 237
 
238
-	// F
239
-	'fichier_introuvable' => 'Ficheiro @fichier@ não localizado',
240
-	'form_auteur_confirmation' => 'Confirme o seu endereço e-mail',
241
-	'form_auteur_email_modifie' => 'O seu endereço e-mail foi alterado.',
242
-	'form_auteur_envoi_mail_confirmation' => 'Um e-mail de confirmação foi enviado para @email@. Para validar o seu endereço de e-mail, deve abrir o endereço Web mencionado na mensagem.',
243
-	'form_auteur_mail_confirmation' => 'Olá,
238
+    // F
239
+    'fichier_introuvable' => 'Ficheiro @fichier@ não localizado',
240
+    'form_auteur_confirmation' => 'Confirme o seu endereço e-mail',
241
+    'form_auteur_email_modifie' => 'O seu endereço e-mail foi alterado.',
242
+    'form_auteur_envoi_mail_confirmation' => 'Um e-mail de confirmação foi enviado para @email@. Para validar o seu endereço de e-mail, deve abrir o endereço Web mencionado na mensagem.',
243
+    'form_auteur_mail_confirmation' => 'Olá,
244 244
 
245 245
 Pediu para alterar o seu endereço e-mail. Para confirmar o seu novo endereço, precisa de se conectar ao endereço abaixo (caso contrário, o seu pedido será ignorado) :
246 246
 
247 247
     @url@
248 248
 ',
249
-	'form_deja_inscrit' => 'Já está inscrito.',
250
-	'form_email_non_valide' => 'O seu endereço email não é válido',
251
-	'form_forum_access_refuse' => 'Você já não tem acesso a este sítio',
252
-	'form_forum_bonjour' => 'Bom dia @nom@,',
253
-	'form_forum_confirmer_email' => 'Para confirmar o seu endereço e-maill, abra esta ligação : @url_confirm@',
254
-	'form_forum_email_deja_enregistre' => 'Este endereço e-mail já está registado,pode portanto utilizar a sua palavra-passe habitual',
255
-	'form_forum_identifiant_mail' => 'O seu novo identificador acabou de lhe ser enviado por email.',
256
-	'form_forum_identifiants' => 'Identificadores pessoais',
257
-	'form_forum_indiquer_nom_email' => 'Indicar aqui o seu nome e o seu endereço email. O seu identificador pessoal ser-lhe-á enviado rapidamente por correio electrónico.',
258
-	'form_forum_login' => 'login:',
259
-	'form_forum_message_auto' => '(esta é uma mensagem automática)',
260
-	'form_forum_pass' => 'palavra-passe',
261
-	'form_forum_probleme_mail' => 'Problema de mail :o identificador não pôde ser enviado',
262
-	'form_forum_voici1' => 'Aqui estão os seus dados para poder aceder ao sítio Internet do  "@nom_site_spip@" (@adresse_site@):',
263
-	'form_forum_voici2' => 'Eis os seus identificadores para propor artigos no
249
+    'form_deja_inscrit' => 'Já está inscrito.',
250
+    'form_email_non_valide' => 'O seu endereço email não é válido',
251
+    'form_forum_access_refuse' => 'Você já não tem acesso a este sítio',
252
+    'form_forum_bonjour' => 'Bom dia @nom@,',
253
+    'form_forum_confirmer_email' => 'Para confirmar o seu endereço e-maill, abra esta ligação : @url_confirm@',
254
+    'form_forum_email_deja_enregistre' => 'Este endereço e-mail já está registado,pode portanto utilizar a sua palavra-passe habitual',
255
+    'form_forum_identifiant_mail' => 'O seu novo identificador acabou de lhe ser enviado por email.',
256
+    'form_forum_identifiants' => 'Identificadores pessoais',
257
+    'form_forum_indiquer_nom_email' => 'Indicar aqui o seu nome e o seu endereço email. O seu identificador pessoal ser-lhe-á enviado rapidamente por correio electrónico.',
258
+    'form_forum_login' => 'login:',
259
+    'form_forum_message_auto' => '(esta é uma mensagem automática)',
260
+    'form_forum_pass' => 'palavra-passe',
261
+    'form_forum_probleme_mail' => 'Problema de mail :o identificador não pôde ser enviado',
262
+    'form_forum_voici1' => 'Aqui estão os seus dados para poder aceder ao sítio Internet do  "@nom_site_spip@" (@adresse_site@):',
263
+    'form_forum_voici2' => 'Eis os seus identificadores para propor artigos no
264 264
  sítio "@nom_site_spip@" (@adresse_login@):',
265
-	'form_indiquer_email' => 'Por favor indique o seu endereço email.',
266
-	'form_indiquer_nom' => 'Por favor indique o seu nome.',
267
-	'form_indiquer_nom_site' => 'Por favor indique o nome do seu sítio.',
268
-	'form_pet_deja_enregistre' => 'Este sítio já está registado',
269
-	'form_pet_signature_pasprise' => 'A sua assinatura não está tomada em conta.',
270
-	'form_prop_confirmer_envoi' => 'Confirmar o envio',
271
-	'form_prop_description' => 'Descrição/comentário',
272
-	'form_prop_enregistre' => 'A sua proposta foi registada. Aparecerá online após a validação pelos responsáveis deste sítio.',
273
-	'form_prop_envoyer' => 'Enviar uma mensagem',
274
-	'form_prop_indiquer_email' => 'Por favor indique um endereço email válido',
275
-	'form_prop_indiquer_nom_site' => 'Por favor indique o nome do sítio.',
276
-	'form_prop_indiquer_sujet' => 'Por favor indique um tema',
277
-	'form_prop_message_envoye' => 'Mensagem enviada',
278
-	'form_prop_non_enregistre' => 'A sua proposta não foi registada.',
279
-	'form_prop_sujet' => 'Tema',
280
-	'form_prop_url_site' => 'Endereço (URL) do sítio',
281
-	'forum_non_inscrit' => 'Não está inscrito, ou o endereço ou a palavra-passe estão errados.',
282
-	'forum_par_auteur' => 'por @auteur@',
283
-	'forum_titre_erreur' => 'Erro...',
265
+    'form_indiquer_email' => 'Por favor indique o seu endereço email.',
266
+    'form_indiquer_nom' => 'Por favor indique o seu nome.',
267
+    'form_indiquer_nom_site' => 'Por favor indique o nome do seu sítio.',
268
+    'form_pet_deja_enregistre' => 'Este sítio já está registado',
269
+    'form_pet_signature_pasprise' => 'A sua assinatura não está tomada em conta.',
270
+    'form_prop_confirmer_envoi' => 'Confirmar o envio',
271
+    'form_prop_description' => 'Descrição/comentário',
272
+    'form_prop_enregistre' => 'A sua proposta foi registada. Aparecerá online após a validação pelos responsáveis deste sítio.',
273
+    'form_prop_envoyer' => 'Enviar uma mensagem',
274
+    'form_prop_indiquer_email' => 'Por favor indique um endereço email válido',
275
+    'form_prop_indiquer_nom_site' => 'Por favor indique o nome do sítio.',
276
+    'form_prop_indiquer_sujet' => 'Por favor indique um tema',
277
+    'form_prop_message_envoye' => 'Mensagem enviada',
278
+    'form_prop_non_enregistre' => 'A sua proposta não foi registada.',
279
+    'form_prop_sujet' => 'Tema',
280
+    'form_prop_url_site' => 'Endereço (URL) do sítio',
281
+    'forum_non_inscrit' => 'Não está inscrito, ou o endereço ou a palavra-passe estão errados.',
282
+    'forum_par_auteur' => 'por @auteur@',
283
+    'forum_titre_erreur' => 'Erro...',
284 284
 
285
-	// I
286
-	'ical_texte_rss_articles' => 'O ficheiro «backend» dos artigos deste sítio encontra-se neste endereço:',
287
-	'ical_texte_rss_articles2' => 'Pode igualmente obter os ficheiros «backend» para os artigos de cada rubrica do sítio:',
288
-	'ical_texte_rss_breves' => 'Existe também um ficheiro contendo notícias do sítio. Especificando um número de rubrica, obterá unicamente as notícias dessa rubrica.',
289
-	'icone_a_suivre' => 'Continua',
290
-	'icone_admin_site' => 'Administração do sítio',
291
-	'icone_agenda' => 'Agenda e correio',
292
-	'icone_aide_ligne' => 'Ajuda',
293
-	'icone_articles' => 'Artigos',
294
-	'icone_auteurs' => 'Autores',
295
-	'icone_brouteur' => 'Navegação rápida',
296
-	'icone_configuration_site' => 'Configuração',
297
-	'icone_configurer_site' => 'Configurar o seu sítio',
298
-	'icone_creer_nouvel_auteur' => 'Criar um novo autor',
299
-	'icone_creer_rubrique' => 'Criar uma rubrica',
300
-	'icone_creer_sous_rubrique' => 'Criar uma sub-rubrica',
301
-	'icone_deconnecter' => 'Sair',
302
-	'icone_discussions' => 'Discussões',
303
-	'icone_doc_rubrique' => 'Documentos das rubricas',
304
-	'icone_ecrire_article' => 'Escrever um novo artigo',
305
-	'icone_edition_site' => 'Edição',
306
-	'icone_gestion_langues' => 'Opções de idiomas',
307
-	'icone_informations_personnelles' => 'Informações pessoais',
308
-	'icone_interface_complet' => 'interface completa',
309
-	'icone_interface_simple' => 'Interface simplificada',
310
-	'icone_maintenance_site' => 'Manutenção do sítio',
311
-	'icone_messagerie_personnelle' => 'Mensagens privadas',
312
-	'icone_repartition_debut' => 'Exibir a distribuição desde o início',
313
-	'icone_rubriques' => 'Rubricas',
314
-	'icone_sauver_site' => 'Cópia de segurança do sítio',
315
-	'icone_site_entier' => 'Todo o sítio',
316
-	'icone_sites_references' => 'Sítios referenciados',
317
-	'icone_statistiques' => 'Estatísticas do sítio',
318
-	'icone_suivi_activite' => 'Acompanhar a actividade do sítio',
319
-	'icone_suivi_actualite' => 'Evolução do sítio',
320
-	'icone_suivi_pettions' => 'Seguir/gerir os abaixo-assinados',
321
-	'icone_suivi_revisions' => 'Modificações dos artigos',
322
-	'icone_supprimer_document' => 'Suprimir este documento',
323
-	'icone_supprimer_image' => 'Suprimir esta imagem',
324
-	'icone_tous_articles' => 'Todos os seus artigos',
325
-	'icone_tous_auteur' => 'Todos os autores',
326
-	'icone_tous_visiteur' => 'Todos os visitantes',
327
-	'icone_visiter_site' => 'Visitar o sítio público',
328
-	'icone_voir_en_ligne' => 'Ver online',
329
-	'img_indisponible' => 'imagem indisponível',
330
-	'impossible' => 'impossível',
331
-	'info_a_suivre' => 'A SEGUIR »',
332
-	'info_acces_interdit' => 'Acesso proibido',
333
-	'info_acces_refuse' => 'Acesso recusado',
334
-	'info_action' => 'Acção : @action@',
335
-	'info_administrer_rubriques' => 'Pode administrar esta rubrica e as suas sub-rubricas',
336
-	'info_adresse_non_indiquee' => 'Não indicou endereço a testar !',
337
-	'info_aide' => 'AJUDA',
338
-	'info_ajouter_mot' => 'Acrescentar esta palavra',
339
-	'info_annonce' => 'ANÚNCIO',
340
-	'info_annonces_generales' => 'Anúncios gerais :',
341
-	'info_article_propose' => 'Artigo proposto',
342
-	'info_article_publie' => 'Artigo publicado',
343
-	'info_article_redaction' => 'Artigo em curso de redacção',
344
-	'info_article_refuse' => 'Artigo recusado',
345
-	'info_article_supprime' => 'Artigo suprimido',
346
-	'info_articles' => 'Artigos',
347
-	'info_articles_a_valider' => 'Os artigos a validar',
348
-	'info_articles_nb' => '@nb@ artigos',
349
-	'info_articles_proposes' => 'Artigos propostos',
350
-	'info_articles_un' => '1 artigo',
351
-	'info_auteurs_nombre' => 'autor(es) :',
352
-	'info_authentification_ftp' => 'Autenticação (por FTP)',
353
-	'info_breves_2' => 'notícias',
354
-	'info_breves_nb' => '@nb@ notícias',
355
-	'info_breves_un' => '1 notícia',
356
-	'info_connexion_refusee' => 'Ligação recusada',
357
-	'info_contact_developpeur' => 'Por favor contacte um programador',
358
-	'info_contenance' => 'Este sítio contém:',
359
-	'info_contribution' => 'contribuições de fórum',
360
-	'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.',
361
-	'info_copyright_doc' => 'Para mais informações, visite o sítio <a href="@spipnet@">@spipnet_affiche@</a',
362
-	'info_copyright_gpl' => 'sob licença GPL',
363
-	'info_cours_edition' => 'Os seus artigos em curso de redacção', # MODIF
364
-	'info_creer_repertoire' => 'Por favor crie um ficheiro ou um directório chamado :',
365
-	'info_creer_repertoire_2' => 'dentro do sub-directório <b>@repertoire@</b>, depois :',
366
-	'info_creer_vignette' => 'criação automática de miniatura',
367
-	'info_creerdansrubrique_non_autorise' => 'Não tem direitos suficientes para criar conteúdo nesta rubrica.',
368
-	'info_deplier' => 'Desenvolver',
369
-	'info_descriptif_nombre' => 'descritivo(s) :',
370
-	'info_description' => 'Descrição :',
371
-	'info_description_2' => 'Descrição :',
372
-	'info_dimension' => 'Dimensões :',
373
-	'info_documents_nb' => '@nb@ documentos',
374
-	'info_documents_un' => '1 documento',
375
-	'info_ecire_message_prive' => 'Escrever uma mensagem privada',
376
-	'info_email_invalide' => 'Endereço email inválido.',
377
-	'info_en_cours_validation' => 'Os seus artigos em curso de redação',
378
-	'info_en_ligne' => 'Actualmente online:',
379
-	'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor',
380
-	'info_erreur_requete' => 'Erro no pedido :',
381
-	'info_erreur_squelette2' => 'Modelo <b>@fichier@</b> não disponível...',
382
-	'info_erreur_systeme' => 'Erro de Sistema (errno @errsys@)',
383
-	'info_erreur_systeme2' => 'O disco rígido poderá estar cheio, ou a base de dados danificada.<br />
285
+    // I
286
+    'ical_texte_rss_articles' => 'O ficheiro «backend» dos artigos deste sítio encontra-se neste endereço:',
287
+    'ical_texte_rss_articles2' => 'Pode igualmente obter os ficheiros «backend» para os artigos de cada rubrica do sítio:',
288
+    'ical_texte_rss_breves' => 'Existe também um ficheiro contendo notícias do sítio. Especificando um número de rubrica, obterá unicamente as notícias dessa rubrica.',
289
+    'icone_a_suivre' => 'Continua',
290
+    'icone_admin_site' => 'Administração do sítio',
291
+    'icone_agenda' => 'Agenda e correio',
292
+    'icone_aide_ligne' => 'Ajuda',
293
+    'icone_articles' => 'Artigos',
294
+    'icone_auteurs' => 'Autores',
295
+    'icone_brouteur' => 'Navegação rápida',
296
+    'icone_configuration_site' => 'Configuração',
297
+    'icone_configurer_site' => 'Configurar o seu sítio',
298
+    'icone_creer_nouvel_auteur' => 'Criar um novo autor',
299
+    'icone_creer_rubrique' => 'Criar uma rubrica',
300
+    'icone_creer_sous_rubrique' => 'Criar uma sub-rubrica',
301
+    'icone_deconnecter' => 'Sair',
302
+    'icone_discussions' => 'Discussões',
303
+    'icone_doc_rubrique' => 'Documentos das rubricas',
304
+    'icone_ecrire_article' => 'Escrever um novo artigo',
305
+    'icone_edition_site' => 'Edição',
306
+    'icone_gestion_langues' => 'Opções de idiomas',
307
+    'icone_informations_personnelles' => 'Informações pessoais',
308
+    'icone_interface_complet' => 'interface completa',
309
+    'icone_interface_simple' => 'Interface simplificada',
310
+    'icone_maintenance_site' => 'Manutenção do sítio',
311
+    'icone_messagerie_personnelle' => 'Mensagens privadas',
312
+    'icone_repartition_debut' => 'Exibir a distribuição desde o início',
313
+    'icone_rubriques' => 'Rubricas',
314
+    'icone_sauver_site' => 'Cópia de segurança do sítio',
315
+    'icone_site_entier' => 'Todo o sítio',
316
+    'icone_sites_references' => 'Sítios referenciados',
317
+    'icone_statistiques' => 'Estatísticas do sítio',
318
+    'icone_suivi_activite' => 'Acompanhar a actividade do sítio',
319
+    'icone_suivi_actualite' => 'Evolução do sítio',
320
+    'icone_suivi_pettions' => 'Seguir/gerir os abaixo-assinados',
321
+    'icone_suivi_revisions' => 'Modificações dos artigos',
322
+    'icone_supprimer_document' => 'Suprimir este documento',
323
+    'icone_supprimer_image' => 'Suprimir esta imagem',
324
+    'icone_tous_articles' => 'Todos os seus artigos',
325
+    'icone_tous_auteur' => 'Todos os autores',
326
+    'icone_tous_visiteur' => 'Todos os visitantes',
327
+    'icone_visiter_site' => 'Visitar o sítio público',
328
+    'icone_voir_en_ligne' => 'Ver online',
329
+    'img_indisponible' => 'imagem indisponível',
330
+    'impossible' => 'impossível',
331
+    'info_a_suivre' => 'A SEGUIR »',
332
+    'info_acces_interdit' => 'Acesso proibido',
333
+    'info_acces_refuse' => 'Acesso recusado',
334
+    'info_action' => 'Acção : @action@',
335
+    'info_administrer_rubriques' => 'Pode administrar esta rubrica e as suas sub-rubricas',
336
+    'info_adresse_non_indiquee' => 'Não indicou endereço a testar !',
337
+    'info_aide' => 'AJUDA',
338
+    'info_ajouter_mot' => 'Acrescentar esta palavra',
339
+    'info_annonce' => 'ANÚNCIO',
340
+    'info_annonces_generales' => 'Anúncios gerais :',
341
+    'info_article_propose' => 'Artigo proposto',
342
+    'info_article_publie' => 'Artigo publicado',
343
+    'info_article_redaction' => 'Artigo em curso de redacção',
344
+    'info_article_refuse' => 'Artigo recusado',
345
+    'info_article_supprime' => 'Artigo suprimido',
346
+    'info_articles' => 'Artigos',
347
+    'info_articles_a_valider' => 'Os artigos a validar',
348
+    'info_articles_nb' => '@nb@ artigos',
349
+    'info_articles_proposes' => 'Artigos propostos',
350
+    'info_articles_un' => '1 artigo',
351
+    'info_auteurs_nombre' => 'autor(es) :',
352
+    'info_authentification_ftp' => 'Autenticação (por FTP)',
353
+    'info_breves_2' => 'notícias',
354
+    'info_breves_nb' => '@nb@ notícias',
355
+    'info_breves_un' => '1 notícia',
356
+    'info_connexion_refusee' => 'Ligação recusada',
357
+    'info_contact_developpeur' => 'Por favor contacte um programador',
358
+    'info_contenance' => 'Este sítio contém:',
359
+    'info_contribution' => 'contribuições de fórum',
360
+    'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.',
361
+    'info_copyright_doc' => 'Para mais informações, visite o sítio <a href="@spipnet@">@spipnet_affiche@</a',
362
+    'info_copyright_gpl' => 'sob licença GPL',
363
+    'info_cours_edition' => 'Os seus artigos em curso de redacção', # MODIF
364
+    'info_creer_repertoire' => 'Por favor crie um ficheiro ou um directório chamado :',
365
+    'info_creer_repertoire_2' => 'dentro do sub-directório <b>@repertoire@</b>, depois :',
366
+    'info_creer_vignette' => 'criação automática de miniatura',
367
+    'info_creerdansrubrique_non_autorise' => 'Não tem direitos suficientes para criar conteúdo nesta rubrica.',
368
+    'info_deplier' => 'Desenvolver',
369
+    'info_descriptif_nombre' => 'descritivo(s) :',
370
+    'info_description' => 'Descrição :',
371
+    'info_description_2' => 'Descrição :',
372
+    'info_dimension' => 'Dimensões :',
373
+    'info_documents_nb' => '@nb@ documentos',
374
+    'info_documents_un' => '1 documento',
375
+    'info_ecire_message_prive' => 'Escrever uma mensagem privada',
376
+    'info_email_invalide' => 'Endereço email inválido.',
377
+    'info_en_cours_validation' => 'Os seus artigos em curso de redação',
378
+    'info_en_ligne' => 'Actualmente online:',
379
+    'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor',
380
+    'info_erreur_requete' => 'Erro no pedido :',
381
+    'info_erreur_squelette2' => 'Modelo <b>@fichier@</b> não disponível...',
382
+    'info_erreur_systeme' => 'Erro de Sistema (errno @errsys@)',
383
+    'info_erreur_systeme2' => 'O disco rígido poderá estar cheio, ou a base de dados danificada.<br />
384 384
 <span style="color:red;">Tente <a href=\'@script@\'>reparar a base de dados </a>, ou contacte o seu fornecedor de internet.</span>',
385
-	'info_fini' => 'Terminou !',
386
-	'info_format_image' => 'Formatos de imagens que podem ser utilizadas para criar vinhetas : @gd_formats@.',
387
-	'info_format_non_defini' => 'formato não definido',
388
-	'info_grand_ecran' => 'Ecrã total',
389
-	'info_image_aide' => 'AJUDA',
390
-	'info_image_process_titre' => 'Como criar miniaturas',
391
-	'info_impossible_lire_page' => '<b>Erro !</b> Impossível ler a página<tt><html>@test_proxy@</html></tt> através do proxy <tt>',
392
-	'info_installation_systeme_publication' => 'Instalação do sistema de publicação',
393
-	'info_installer_documents' => 'Pode instalar automaticamente todos os documentos contidos na pasta @upload@.',
394
-	'info_installer_ftp' => 'Como administrador, pode instalar (por FTP) ficheiros na pasta @upload@ para depois seleccioná-los directamente aqui.',
395
-	'info_installer_images' => 'Pode instalar imagens nos formatos JPEG, GIF e PNG.',
396
-	'info_installer_images_dossier' => 'Instalar imagens na pasta @upload@ para poder seleccioná-los aqui.',
397
-	'info_interface_complete' => 'Interface completa',
398
-	'info_interface_simple' => 'Interface simplificada',
399
-	'info_joindre_document_article' => 'Pode juntar a este artigo documentos de tipo',
400
-	'info_joindre_document_rubrique' => 'Pode acrescentar a esta rubrica documentos de tipo',
401
-	'info_joindre_documents_article' => 'Pode juntar ao seu artigo documentos de tipo :',
402
-	'info_l_article' => 'o artigo',
403
-	'info_la_breve' => 'a notícia',
404
-	'info_la_rubrique' => 'a rubrica',
405
-	'info_langue_principale' => 'Idioma principal do sítio',
406
-	'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ pixels',
407
-	'info_les_auteurs_1' => 'por @les_auteurs@',
408
-	'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.',
409
-	'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).',
410
-	'info_mail_fournisseur' => 'você@seucorreio.com',
411
-	'info_message_2' => 'MENSAGEM',
412
-	'info_message_supprime' => 'MENSAGEM ELIMINADA',
413
-	'info_messages_nb' => '@nb@ mensagens',
414
-	'info_messages_un' => '1 mensagem',
415
-	'info_mise_en_ligne' => 'Data de colocação online :',
416
-	'info_modification_parametres_securite' => 'modificação dos parâmetros de segurança',
417
-	'info_mois_courant' => 'Durante o mês :',
418
-	'info_mot_cle_ajoute' => 'A seguinte palavra-chave foi acrescentada a',
419
-	'info_multi_herit' => 'Idioma por defeito',
420
-	'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhadas</u> beneficiam de uma tradução de todos os textos da interface. Se seleccionar esses idiomas, muitos elementos do sítio público (datas, formulários) serão automaticamente traduzidos. Para os idiomas não sublinhadas, esses elementos aparecerão no idioma principal do sítio.',
421
-	'info_multilinguisme' => 'Multilinguismo',
422
-	'info_nom_non_utilisateurs_connectes' => 'O seu nome não aparece na lista dos utilizadores ligados.',
423
-	'info_nom_utilisateurs_connectes' => 'O seu nome aparece na lista dos utilizadores ligados.',
424
-	'info_nombre_en_ligne' => 'Actualmente online :',
425
-	'info_non_resultat' => 'Nenhum resultado para "@cherche_mot@"',
426
-	'info_non_utilisation_messagerie' => 'Não utiliza o correio interno deste sítio.',
427
-	'info_nouveau_message' => 'TEM UMA NOVA MENSAGEM',
428
-	'info_nouveaux_messages' => 'TEM @total_messages@ NOVAS MENSAGENS',
429
-	'info_numero_abbreviation' => '<N° >',
430
-	'info_obligatoire' => 'Esta informação é obrigatória',
431
-	'info_pense_bete' => 'MEMORANDO',
432
-	'info_petit_ecran' => 'Ecrã Pequeno',
433
-	'info_petition_close' => 'Petição encerrada',
434
-	'info_pixels' => 'pixels',
435
-	'info_plusieurs_mots_trouves' => 'Muitas palavras-chave encontradas para "@cherche_mot@":',
436
-	'info_portfolio_automatique' => 'Portfolio automático :',
437
-	'info_premier_resultat' => '[@debut_limit@ primeiros resultados em @total@]',
438
-	'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados em @total@]',
439
-	'info_propose_1' => '[@nom_site_spip@] Proposto : @titre@',
440
-	'info_propose_2' => 'Artigos propostos
385
+    'info_fini' => 'Terminou !',
386
+    'info_format_image' => 'Formatos de imagens que podem ser utilizadas para criar vinhetas : @gd_formats@.',
387
+    'info_format_non_defini' => 'formato não definido',
388
+    'info_grand_ecran' => 'Ecrã total',
389
+    'info_image_aide' => 'AJUDA',
390
+    'info_image_process_titre' => 'Como criar miniaturas',
391
+    'info_impossible_lire_page' => '<b>Erro !</b> Impossível ler a página<tt><html>@test_proxy@</html></tt> através do proxy <tt>',
392
+    'info_installation_systeme_publication' => 'Instalação do sistema de publicação',
393
+    'info_installer_documents' => 'Pode instalar automaticamente todos os documentos contidos na pasta @upload@.',
394
+    'info_installer_ftp' => 'Como administrador, pode instalar (por FTP) ficheiros na pasta @upload@ para depois seleccioná-los directamente aqui.',
395
+    'info_installer_images' => 'Pode instalar imagens nos formatos JPEG, GIF e PNG.',
396
+    'info_installer_images_dossier' => 'Instalar imagens na pasta @upload@ para poder seleccioná-los aqui.',
397
+    'info_interface_complete' => 'Interface completa',
398
+    'info_interface_simple' => 'Interface simplificada',
399
+    'info_joindre_document_article' => 'Pode juntar a este artigo documentos de tipo',
400
+    'info_joindre_document_rubrique' => 'Pode acrescentar a esta rubrica documentos de tipo',
401
+    'info_joindre_documents_article' => 'Pode juntar ao seu artigo documentos de tipo :',
402
+    'info_l_article' => 'o artigo',
403
+    'info_la_breve' => 'a notícia',
404
+    'info_la_rubrique' => 'a rubrica',
405
+    'info_langue_principale' => 'Idioma principal do sítio',
406
+    'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ pixels',
407
+    'info_les_auteurs_1' => 'por @les_auteurs@',
408
+    'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.',
409
+    'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).',
410
+    'info_mail_fournisseur' => 'você@seucorreio.com',
411
+    'info_message_2' => 'MENSAGEM',
412
+    'info_message_supprime' => 'MENSAGEM ELIMINADA',
413
+    'info_messages_nb' => '@nb@ mensagens',
414
+    'info_messages_un' => '1 mensagem',
415
+    'info_mise_en_ligne' => 'Data de colocação online :',
416
+    'info_modification_parametres_securite' => 'modificação dos parâmetros de segurança',
417
+    'info_mois_courant' => 'Durante o mês :',
418
+    'info_mot_cle_ajoute' => 'A seguinte palavra-chave foi acrescentada a',
419
+    'info_multi_herit' => 'Idioma por defeito',
420
+    'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhadas</u> beneficiam de uma tradução de todos os textos da interface. Se seleccionar esses idiomas, muitos elementos do sítio público (datas, formulários) serão automaticamente traduzidos. Para os idiomas não sublinhadas, esses elementos aparecerão no idioma principal do sítio.',
421
+    'info_multilinguisme' => 'Multilinguismo',
422
+    'info_nom_non_utilisateurs_connectes' => 'O seu nome não aparece na lista dos utilizadores ligados.',
423
+    'info_nom_utilisateurs_connectes' => 'O seu nome aparece na lista dos utilizadores ligados.',
424
+    'info_nombre_en_ligne' => 'Actualmente online :',
425
+    'info_non_resultat' => 'Nenhum resultado para "@cherche_mot@"',
426
+    'info_non_utilisation_messagerie' => 'Não utiliza o correio interno deste sítio.',
427
+    'info_nouveau_message' => 'TEM UMA NOVA MENSAGEM',
428
+    'info_nouveaux_messages' => 'TEM @total_messages@ NOVAS MENSAGENS',
429
+    'info_numero_abbreviation' => '<N° >',
430
+    'info_obligatoire' => 'Esta informação é obrigatória',
431
+    'info_pense_bete' => 'MEMORANDO',
432
+    'info_petit_ecran' => 'Ecrã Pequeno',
433
+    'info_petition_close' => 'Petição encerrada',
434
+    'info_pixels' => 'pixels',
435
+    'info_plusieurs_mots_trouves' => 'Muitas palavras-chave encontradas para "@cherche_mot@":',
436
+    'info_portfolio_automatique' => 'Portfolio automático :',
437
+    'info_premier_resultat' => '[@debut_limit@ primeiros resultados em @total@]',
438
+    'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados em @total@]',
439
+    'info_propose_1' => '[@nom_site_spip@] Proposto : @titre@',
440
+    'info_propose_2' => 'Artigos propostos
441 441
 ----------------',
442
-	'info_propose_3' => 'O artigo "@titre@" é proposto para publicação.',
443
-	'info_propose_4' => 'Está convidado a vir consultá-lo e a dar a sua opinião',
444
-	'info_propose_5' => 'no fórum que lhe está ligado. Está disponível no endereço:',
445
-	'info_publie_01' => 'O artigo "@titre@" foi validado por @connect_nom@.',
446
-	'info_publie_1' => '[@nom_site_spip@] PUBLICADO : @titre@',
447
-	'info_publie_2' => 'Artigo publicado
442
+    'info_propose_3' => 'O artigo "@titre@" é proposto para publicação.',
443
+    'info_propose_4' => 'Está convidado a vir consultá-lo e a dar a sua opinião',
444
+    'info_propose_5' => 'no fórum que lhe está ligado. Está disponível no endereço:',
445
+    'info_publie_01' => 'O artigo "@titre@" foi validado por @connect_nom@.',
446
+    'info_publie_1' => '[@nom_site_spip@] PUBLICADO : @titre@',
447
+    'info_publie_2' => 'Artigo publicado
448 448
 --------------',
449
-	'info_rechercher' => 'Procurar',
450
-	'info_rechercher_02' => 'Procurar :',
451
-	'info_remplacer_vignette' => 'Substituir a miniatura por defeito por um logotipo personalizado :',
452
-	'info_rubriques_nb' => '@nb@ rubricas',
453
-	'info_rubriques_un' => '1 rubrica',
454
-	'info_sans_titre_2' => 'sem título',
455
-	'info_selectionner_fichier' => 'Pode seleccionar um ficheiro da pasta @upload@',
456
-	'info_selectionner_fichier_2' => 'Seleccionar um ficheiro :',
457
-	'info_sites_nb' => '@nb@ sítios',
458
-	'info_sites_un' => '1 sítio',
459
-	'info_supprimer_vignette' => 'suprimir a miniatura',
460
-	'info_symbole_bleu' => 'O símbolo <b>azul</b> indica um<b>memorando </b>: isto é uma mensagem para o seu uso pessoal.',
461
-	'info_symbole_jaune' => 'O símbolo<b>amarelo</b> indica um <b>anúncio a todos os redactores</b> : modificável por todos os administradores, e visível por todos os redactores.',
462
-	'info_symbole_vert' => 'O símbolo<b>verde</b> indica as <b>mensagens trocadas com outros utilizadores</b> do sítio.',
463
-	'info_telecharger_nouveau_logo' => 'Telecarregar um novo logotipo :',
464
-	'info_telecharger_ordinateur' => 'Telecarregar do seu computador :',
465
-	'info_tous_resultats_enregistres' => '[todos os  resultados estão registados]',
466
-	'info_tout_afficher' => 'Exibir tudo',
467
-	'info_travaux_texte' => 'Este sítio ainda não está configurado. Volte mais tarde...',
468
-	'info_travaux_titre' => 'Sítio em construção',
469
-	'info_trop_resultat' => 'Demasiado resultados para "@cherche_mot@". Por favor afine a pesquisa.',
470
-	'info_utilisation_messagerie_interne' => 'Você utiliza o correio interno deste sítio.',
471
-	'info_valider_lien' => 'validar esta ligação',
472
-	'info_verifier_image' => ', Por favor verifique se as suas imagens foram transferidas correctamente.',
473
-	'info_vignette_defaut' => 'Miniatura por defeito',
474
-	'info_vignette_personnalisee' => 'Miniatura personalizada',
475
-	'info_visite' => 'visita :',
476
-	'info_vos_rendez_vous' => 'Os seus futuros encontros',
477
-	'infos_vos_pense_bete' => 'Os seus memorandos',
449
+    'info_rechercher' => 'Procurar',
450
+    'info_rechercher_02' => 'Procurar :',
451
+    'info_remplacer_vignette' => 'Substituir a miniatura por defeito por um logotipo personalizado :',
452
+    'info_rubriques_nb' => '@nb@ rubricas',
453
+    'info_rubriques_un' => '1 rubrica',
454
+    'info_sans_titre_2' => 'sem título',
455
+    'info_selectionner_fichier' => 'Pode seleccionar um ficheiro da pasta @upload@',
456
+    'info_selectionner_fichier_2' => 'Seleccionar um ficheiro :',
457
+    'info_sites_nb' => '@nb@ sítios',
458
+    'info_sites_un' => '1 sítio',
459
+    'info_supprimer_vignette' => 'suprimir a miniatura',
460
+    'info_symbole_bleu' => 'O símbolo <b>azul</b> indica um<b>memorando </b>: isto é uma mensagem para o seu uso pessoal.',
461
+    'info_symbole_jaune' => 'O símbolo<b>amarelo</b> indica um <b>anúncio a todos os redactores</b> : modificável por todos os administradores, e visível por todos os redactores.',
462
+    'info_symbole_vert' => 'O símbolo<b>verde</b> indica as <b>mensagens trocadas com outros utilizadores</b> do sítio.',
463
+    'info_telecharger_nouveau_logo' => 'Telecarregar um novo logotipo :',
464
+    'info_telecharger_ordinateur' => 'Telecarregar do seu computador :',
465
+    'info_tous_resultats_enregistres' => '[todos os  resultados estão registados]',
466
+    'info_tout_afficher' => 'Exibir tudo',
467
+    'info_travaux_texte' => 'Este sítio ainda não está configurado. Volte mais tarde...',
468
+    'info_travaux_titre' => 'Sítio em construção',
469
+    'info_trop_resultat' => 'Demasiado resultados para "@cherche_mot@". Por favor afine a pesquisa.',
470
+    'info_utilisation_messagerie_interne' => 'Você utiliza o correio interno deste sítio.',
471
+    'info_valider_lien' => 'validar esta ligação',
472
+    'info_verifier_image' => ', Por favor verifique se as suas imagens foram transferidas correctamente.',
473
+    'info_vignette_defaut' => 'Miniatura por defeito',
474
+    'info_vignette_personnalisee' => 'Miniatura personalizada',
475
+    'info_visite' => 'visita :',
476
+    'info_vos_rendez_vous' => 'Os seus futuros encontros',
477
+    'infos_vos_pense_bete' => 'Os seus memorandos',
478 478
 
479
-	// L
480
-	'label_ajout_id_rapide' => 'Adição rápida',
481
-	'label_poids_fichier' => 'Dimensões',
482
-	'lien_afficher_icones_seuls' => 'Exibir apenas os ícones',
483
-	'lien_afficher_texte_icones' => 'Exibir ícones e o texto',
484
-	'lien_afficher_texte_seul' => 'Exibir apenas o texto',
485
-	'lien_liberer' => 'desbloquear',
486
-	'lien_liberer_tous' => 'desbloquear estes artigos',
487
-	'lien_nouvea_pense_bete' => 'NOVO MEMORANDO',
488
-	'lien_nouveau_message' => 'NOVA MENSAGEM',
489
-	'lien_nouvelle_annonce' => 'NOVO ANÚNCIO',
490
-	'lien_petitions' => 'PETIÇÃO',
491
-	'lien_popularite' => 'popularidade : @popularite@%',
492
-	'lien_racine_site' => 'RAIZ DO SÍTIO',
493
-	'lien_reessayer' => 'tentar de novo',
494
-	'lien_repondre_message' => 'Responder a esta mensagem',
495
-	'lien_supprimer' => 'eliminar',
496
-	'lien_tout_afficher' => 'Exibir tudo',
497
-	'lien_visite_site' => 'visitar este sítio',
498
-	'lien_visites' => '@visites@ visitas',
499
-	'lien_voir_auteur' => 'Ver este autor',
500
-	'ligne' => 'Linha',
501
-	'login' => 'Ligação',
502
-	'login_acces_prive' => 'acesso ao espaço privado',
503
-	'login_autre_identifiant' => 'ligar-se sob um outro identificador',
504
-	'login_cookie_accepte' => 'Por favor configure o seu navegador para que os aceite (pelo menos para este sítio).',
505
-	'login_cookie_oblige' => 'Para se identificar de maneira segura neste sítio, deve aceitar os cookies.',
506
-	'login_deconnexion_ok' => 'Ligação terminada.',
507
-	'login_erreur_pass' => 'Erro de palavra-passe',
508
-	'login_espace_prive' => 'área privada',
509
-	'login_identifiant_inconnu' => 'O identificador « @login@ » é desconhecido.',
510
-	'login_login' => 'Login :',
511
-	'login_login2' => 'Login ou endereço de e-mail :',
512
-	'login_login_pass_incorrect' => '(Login ou palavra-passe incorrecta.)',
513
-	'login_motpasseoublie' => 'palavra - passe esquecida ?',
514
-	'login_non_securise' => 'Atenção, este formulário não é seguro.
479
+    // L
480
+    'label_ajout_id_rapide' => 'Adição rápida',
481
+    'label_poids_fichier' => 'Dimensões',
482
+    'lien_afficher_icones_seuls' => 'Exibir apenas os ícones',
483
+    'lien_afficher_texte_icones' => 'Exibir ícones e o texto',
484
+    'lien_afficher_texte_seul' => 'Exibir apenas o texto',
485
+    'lien_liberer' => 'desbloquear',
486
+    'lien_liberer_tous' => 'desbloquear estes artigos',
487
+    'lien_nouvea_pense_bete' => 'NOVO MEMORANDO',
488
+    'lien_nouveau_message' => 'NOVA MENSAGEM',
489
+    'lien_nouvelle_annonce' => 'NOVO ANÚNCIO',
490
+    'lien_petitions' => 'PETIÇÃO',
491
+    'lien_popularite' => 'popularidade : @popularite@%',
492
+    'lien_racine_site' => 'RAIZ DO SÍTIO',
493
+    'lien_reessayer' => 'tentar de novo',
494
+    'lien_repondre_message' => 'Responder a esta mensagem',
495
+    'lien_supprimer' => 'eliminar',
496
+    'lien_tout_afficher' => 'Exibir tudo',
497
+    'lien_visite_site' => 'visitar este sítio',
498
+    'lien_visites' => '@visites@ visitas',
499
+    'lien_voir_auteur' => 'Ver este autor',
500
+    'ligne' => 'Linha',
501
+    'login' => 'Ligação',
502
+    'login_acces_prive' => 'acesso ao espaço privado',
503
+    'login_autre_identifiant' => 'ligar-se sob um outro identificador',
504
+    'login_cookie_accepte' => 'Por favor configure o seu navegador para que os aceite (pelo menos para este sítio).',
505
+    'login_cookie_oblige' => 'Para se identificar de maneira segura neste sítio, deve aceitar os cookies.',
506
+    'login_deconnexion_ok' => 'Ligação terminada.',
507
+    'login_erreur_pass' => 'Erro de palavra-passe',
508
+    'login_espace_prive' => 'área privada',
509
+    'login_identifiant_inconnu' => 'O identificador « @login@ » é desconhecido.',
510
+    'login_login' => 'Login :',
511
+    'login_login2' => 'Login ou endereço de e-mail :',
512
+    'login_login_pass_incorrect' => '(Login ou palavra-passe incorrecta.)',
513
+    'login_motpasseoublie' => 'palavra - passe esquecida ?',
514
+    'login_non_securise' => 'Atenção, este formulário não é seguro.
515 515
  Se não quiser que a sua palavra-passe seja
516 516
  interceptada na rede, por favor active Javascript
517 517
  no seu navegador e',
518
-	'login_nouvelle_tentative' => 'Nova tentativa',
519
-	'login_par_ici' => 'Você está registado... por aqui....',
520
-	'login_pass2' => 'Palavra-passe :',
521
-	'login_preferez_refuser' => '<b>Se prefere recusar os cookies</b>, um outro método de ligação (menos seguro) está à sua disposição',
522
-	'login_recharger' => 'carregar de novo esta página ',
523
-	'login_rester_identifie' => 'Permanecer identificado durante alguns dias ', # MODIF
524
-	'login_retour_public' => 'Regresso ao sítio público',
525
-	'login_retour_site' => 'Regresso ao sítio público',
526
-	'login_retoursitepublic' => 'Regresso ao sítio público',
527
-	'login_securise' => 'Login seguro',
528
-	'login_sinscrire' => 'inscrever-se',
529
-	'login_test_navigateur' => 'teste navegação/nova ligação',
530
-	'login_verifiez_navigateur' => '(Verifique, porém, que o seu navegador não memorizou a sua palavra-passe...)',
518
+    'login_nouvelle_tentative' => 'Nova tentativa',
519
+    'login_par_ici' => 'Você está registado... por aqui....',
520
+    'login_pass2' => 'Palavra-passe :',
521
+    'login_preferez_refuser' => '<b>Se prefere recusar os cookies</b>, um outro método de ligação (menos seguro) está à sua disposição',
522
+    'login_recharger' => 'carregar de novo esta página ',
523
+    'login_rester_identifie' => 'Permanecer identificado durante alguns dias ', # MODIF
524
+    'login_retour_public' => 'Regresso ao sítio público',
525
+    'login_retour_site' => 'Regresso ao sítio público',
526
+    'login_retoursitepublic' => 'Regresso ao sítio público',
527
+    'login_securise' => 'Login seguro',
528
+    'login_sinscrire' => 'inscrever-se',
529
+    'login_test_navigateur' => 'teste navegação/nova ligação',
530
+    'login_verifiez_navigateur' => '(Verifique, porém, que o seu navegador não memorizou a sua palavra-passe...)',
531 531
 
532
-	// M
533
-	'masquer_colonne' => 'Ocultar esta coluna',
534
-	'masquer_trad' => 'ocultar as traduções',
535
-	'module_fichiers_langues' => 'Ficheiros de idioma',
532
+    // M
533
+    'masquer_colonne' => 'Ocultar esta coluna',
534
+    'masquer_trad' => 'ocultar as traduções',
535
+    'module_fichiers_langues' => 'Ficheiros de idioma',
536 536
 
537
-	// N
538
-	'navigateur_pas_redirige' => 'Se o seu navegador não está redireccionado, clique aqui para continuar.',
539
-	'numero' => 'Número',
537
+    // N
538
+    'navigateur_pas_redirige' => 'Se o seu navegador não está redireccionado, clique aqui para continuar.',
539
+    'numero' => 'Número',
540 540
 
541
-	// O
542
-	'occurence' => 'Ocorrência',
543
-	'onglet_affacer_base' => 'Apagar a base de dados',
544
-	'onglet_auteur' => 'O autor',
545
-	'onglet_contenu_site' => 'Conteúdo do sítio',
546
-	'onglet_evolution_visite_mod' => 'Evolução',
547
-	'onglet_fonctions_avances' => 'Funções avançadas',
548
-	'onglet_informations_personnelles' => 'Informações pessoais',
549
-	'onglet_interactivite' => 'Interactividade',
550
-	'onglet_messagerie' => 'Correio',
551
-	'onglet_repartition_rubrique' => 'Distribuição das rubricas',
552
-	'onglet_save_restaur_base' => 'Guardar uma cópia/restaurar a base',
553
-	'onglet_vider_cache' => 'Esvaziar a cache',
541
+    // O
542
+    'occurence' => 'Ocorrência',
543
+    'onglet_affacer_base' => 'Apagar a base de dados',
544
+    'onglet_auteur' => 'O autor',
545
+    'onglet_contenu_site' => 'Conteúdo do sítio',
546
+    'onglet_evolution_visite_mod' => 'Evolução',
547
+    'onglet_fonctions_avances' => 'Funções avançadas',
548
+    'onglet_informations_personnelles' => 'Informações pessoais',
549
+    'onglet_interactivite' => 'Interactividade',
550
+    'onglet_messagerie' => 'Correio',
551
+    'onglet_repartition_rubrique' => 'Distribuição das rubricas',
552
+    'onglet_save_restaur_base' => 'Guardar uma cópia/restaurar a base',
553
+    'onglet_vider_cache' => 'Esvaziar a cache',
554 554
 
555
-	// P
556
-	'pass_choix_pass' => 'Por favor escolha a sua nova palavra-passe',
557
-	'pass_erreur' => 'Erro',
558
-	'pass_erreur_acces_refuse' => '<b>Erro :</b> já não tem acesso a este sítio.',
559
-	'pass_erreur_code_inconnu' => '<b>Erro :</b> este código não corresponde a nenhum dos visitantes com acesso a este sítio.',
560
-	'pass_erreur_non_enregistre' => '<b>Erro :</b> o endereço <tt>@email_oubli@</tt> não está registado neste sítio. ',
561
-	'pass_erreur_non_valide' => '<b>Erro :</b> este email <tt>@email_oubli@</tt> não é válido !  ',
562
-	'pass_erreur_probleme_technique' => '<b>Erro :</b> por causa de um problema técnico, o email não pôde ser enviado.',
563
-	'pass_espace_prive_bla' => 'O espaço privado deste sítio está aberto aos
555
+    // P
556
+    'pass_choix_pass' => 'Por favor escolha a sua nova palavra-passe',
557
+    'pass_erreur' => 'Erro',
558
+    'pass_erreur_acces_refuse' => '<b>Erro :</b> já não tem acesso a este sítio.',
559
+    'pass_erreur_code_inconnu' => '<b>Erro :</b> este código não corresponde a nenhum dos visitantes com acesso a este sítio.',
560
+    'pass_erreur_non_enregistre' => '<b>Erro :</b> o endereço <tt>@email_oubli@</tt> não está registado neste sítio. ',
561
+    'pass_erreur_non_valide' => '<b>Erro :</b> este email <tt>@email_oubli@</tt> não é válido !  ',
562
+    'pass_erreur_probleme_technique' => '<b>Erro :</b> por causa de um problema técnico, o email não pôde ser enviado.',
563
+    'pass_espace_prive_bla' => 'O espaço privado deste sítio está aberto aos
564 564
  visitantes, após inscrição. Uma vez registado poderá consultar os artigos em curso de redacção,
565 565
 propor artigos e participar em todos os fóruns.',
566
-	'pass_forum_bla' => 'Pediu para intervir num fórum
566
+    'pass_forum_bla' => 'Pediu para intervir num fórum
567 567
  reservado aos visitadores registados.',
568
-	'pass_indiquez_cidessous' => 'Indique abaixo o endereço email sob o qual se registou. Receberá
568
+    'pass_indiquez_cidessous' => 'Indique abaixo o endereço email sob o qual se registou. Receberá
569 569
  um mail que indicará o procedimento a seguir para
570 570
         recuperar o seu acesso.',
571
-	'pass_mail_passcookie' => '(esta é uma mensagem automática)
571
+    'pass_mail_passcookie' => '(esta é uma mensagem automática)
572 572
 Para recuperar o seu acesso ao sítio
573 573
 @nom_site_spip@ (@adresse_site@)
574 574
 
@@ -578,136 +578,136 @@  discard block
 block discarded – undo
578 578
 
579 579
 Poderá então introduzir uma nova palavra-passe e reconectar-se ao sítio.
580 580
 ',
581
-	'pass_mot_oublie' => 'Palavra-passe esquecida',
582
-	'pass_nouveau_enregistre' => 'A sua nova palavra-passe foi registada',
583
-	'pass_nouveau_pass' => 'Nova palavra-passe',
584
-	'pass_ok' => 'OK',
585
-	'pass_oubli_mot' => 'Palavra-passe esquecida',
586
-	'pass_procedure_changer' => 'Para alterar a sua palavra-passe, temos primeiro de verificar a sua identidade. Por favor escreva o endereço e-mail associado a esta conta.', # MODIF
587
-	'pass_quitter_fenetre' => 'Fechar esta janela',
588
-	'pass_rappel_login' => 'Recorde : o seu identificador (login) é « @login@ ».',
589
-	'pass_recevoir_mail' => 'Vai receber um email que indica como recuperar o seu acesso ao sítio.', # MODIF
590
-	'pass_retour_public' => 'Regresso ao sítio público',
591
-	'pass_rien_a_faire_ici' => 'Nada a fazer aqui.',
592
-	'pass_vousinscrire' => 'Inscrever-se neste sítio',
593
-	'precedent' => 'anterior',
594
-	'previsualisation' => 'Visualização',
595
-	'previsualiser' => 'Pré-visualizar',
581
+    'pass_mot_oublie' => 'Palavra-passe esquecida',
582
+    'pass_nouveau_enregistre' => 'A sua nova palavra-passe foi registada',
583
+    'pass_nouveau_pass' => 'Nova palavra-passe',
584
+    'pass_ok' => 'OK',
585
+    'pass_oubli_mot' => 'Palavra-passe esquecida',
586
+    'pass_procedure_changer' => 'Para alterar a sua palavra-passe, temos primeiro de verificar a sua identidade. Por favor escreva o endereço e-mail associado a esta conta.', # MODIF
587
+    'pass_quitter_fenetre' => 'Fechar esta janela',
588
+    'pass_rappel_login' => 'Recorde : o seu identificador (login) é « @login@ ».',
589
+    'pass_recevoir_mail' => 'Vai receber um email que indica como recuperar o seu acesso ao sítio.', # MODIF
590
+    'pass_retour_public' => 'Regresso ao sítio público',
591
+    'pass_rien_a_faire_ici' => 'Nada a fazer aqui.',
592
+    'pass_vousinscrire' => 'Inscrever-se neste sítio',
593
+    'precedent' => 'anterior',
594
+    'previsualisation' => 'Visualização',
595
+    'previsualiser' => 'Pré-visualizar',
596 596
 
597
-	// R
598
-	'retour' => 'Retroceder',
597
+    // R
598
+    'retour' => 'Retroceder',
599 599
 
600
-	// S
601
-	'spip_conforme_dtd' => 'SPIP considera esta página em conforme com o seu DOCTYPE :',
602
-	'squelette' => 'modelo',
603
-	'squelette_inclus_ligne' => 'modelo incluído, linha',
604
-	'squelette_ligne' => 'modelo, linha',
605
-	'stats_visites_et_popularite' => '@visites@ visitas ; popularidade : @popularite@',
606
-	'suivant' => 'seguinte',
600
+    // S
601
+    'spip_conforme_dtd' => 'SPIP considera esta página em conforme com o seu DOCTYPE :',
602
+    'squelette' => 'modelo',
603
+    'squelette_inclus_ligne' => 'modelo incluído, linha',
604
+    'squelette_ligne' => 'modelo, linha',
605
+    'stats_visites_et_popularite' => '@visites@ visitas ; popularidade : @popularite@',
606
+    'suivant' => 'seguinte',
607 607
 
608
-	// T
609
-	'taille_go' => '@taille@ Gb',
610
-	'taille_ko' => '@taille@ kb',
611
-	'taille_mo' => '@taille@ Mb',
612
-	'taille_octets' => ' @taille@ bytes',
613
-	'texte_actualite_site_1' => 'Quando estiver familiarizado(a) com a interface, poderá clicar em «',
614
-	'texte_actualite_site_2' => 'interface completa',
615
-	'texte_actualite_site_3' => '» para abrir mais possibilidades.',
616
-	'texte_creation_automatique_vignette' => 'A criação automática de miniaturas de pré-visualização está activada neste sítio. Se instalar a partir deste formulário imagens de formato(s) @gd_formats@, serão acompanhadas de uma miniatura de um tamanho máximo de @taille_preview@ pixels.',
617
-	'texte_documents_associes' => 'Os documentos seguintes estão associados ao artigo,
608
+    // T
609
+    'taille_go' => '@taille@ Gb',
610
+    'taille_ko' => '@taille@ kb',
611
+    'taille_mo' => '@taille@ Mb',
612
+    'taille_octets' => ' @taille@ bytes',
613
+    'texte_actualite_site_1' => 'Quando estiver familiarizado(a) com a interface, poderá clicar em «',
614
+    'texte_actualite_site_2' => 'interface completa',
615
+    'texte_actualite_site_3' => '» para abrir mais possibilidades.',
616
+    'texte_creation_automatique_vignette' => 'A criação automática de miniaturas de pré-visualização está activada neste sítio. Se instalar a partir deste formulário imagens de formato(s) @gd_formats@, serão acompanhadas de uma miniatura de um tamanho máximo de @taille_preview@ pixels.',
617
+    'texte_documents_associes' => 'Os documentos seguintes estão associados ao artigo,
618 618
   mas não foram directamente
619 619
  inseridos nele. Conforme a paginação do sítio público,
620 620
   poderão aparecer sob forma de documentos anexados.',
621
-	'texte_erreur_mise_niveau_base' => 'Erro de base de dados por ocasião do nivelamento.
621
+    'texte_erreur_mise_niveau_base' => 'Erro de base de dados por ocasião do nivelamento.
622 622
    A imagem <b>@fichier@</b> não passou (artigo @id_article@).
623 623
   Note bem esta referência, volte a tentar o nivelamento, e verifique se as imagens aparecem sempre nos artigos.',
624
-	'texte_erreur_visiteur' => 'Tentou aceder à área privada usando um login não autorizado.',
625
-	'texte_inc_auth_1' => 'Você está identificado sob o
624
+    'texte_erreur_visiteur' => 'Tentou aceder à área privada usando um login não autorizado.',
625
+    'texte_inc_auth_1' => 'Você está identificado sob o
626 626
    login <b>@auth_login@</b>, mas este já/ não existe na base de dados.
627 627
  Tente',
628
-	'texte_inc_auth_2' => 'refazer a ligação',
629
-	'texte_inc_auth_3' => ', depois de eventualmente ter fechado e
628
+    'texte_inc_auth_2' => 'refazer a ligação',
629
+    'texte_inc_auth_3' => ', depois de eventualmente ter fechado e
630 630
  voltado a abrir o seu navegador.',
631
-	'texte_inc_config' => 'As modificações efectuadas nestas páginas influenciam muito o
631
+    'texte_inc_config' => 'As modificações efectuadas nestas páginas influenciam muito o
632 632
  funcionamento do seu sítio. Recomendamos que não intervenha enquanto não estiver familiarizado com o funcionamento do sistema SPIP. <br /><br /><b> Em
633 633
  geral, é fortemente recomendado
634 634
  deixar a responsabilidade dessas páginas ao webmaster principal do seu sítio. <b>',
635
-	'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do sítio, por favor,',
636
-	'texte_inc_meta_2' => 'verificar as permissões de escrita',
637
-	'texte_inc_meta_3' => 'no directório <code>@repertoire@</code>.',
638
-	'texte_statut_en_cours_redaction' => 'em curso de redacção',
639
-	'texte_statut_poubelle' => 'para o caixote de lixo',
640
-	'texte_statut_propose_evaluation' => 'proposto para avaliação',
641
-	'texte_statut_publie' => 'publicado online',
642
-	'texte_statut_refuse' => 'recusado',
643
-	'titre_ajouter_mot_cle' => 'ACRESCENTAR UMA PALAVRA-CHAVE',
644
-	'titre_cadre_raccourcis' => 'ATALHOS :',
645
-	'titre_changer_couleur_interface' => 'Mudar a cor da interface',
646
-	'titre_image_admin_article' => 'Pode administrar este artigo',
647
-	'titre_image_administrateur' => 'Administrador',
648
-	'titre_image_aide' => 'Ajuda sobre este elemento',
649
-	'titre_image_auteur_supprime' => 'Autor eliminado',
650
-	'titre_image_redacteur' => 'Redactor sem acesso',
651
-	'titre_image_redacteur_02' => 'Redactor',
652
-	'titre_image_selecteur' => 'Exibir a lista',
653
-	'titre_image_visiteur' => 'Visitante',
654
-	'titre_joindre_document' => 'ANEXAR UM DOCUMENTO',
655
-	'titre_mots_cles' => 'PALAVRAS-CHAVE',
656
-	'titre_probleme_technique' => 'Atenção : um problema técnico (servidor SQL) impede o acesso a esta parte do sítio. Obrigado pela sua compreensão.',
657
-	'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA RUBRICA',
658
-	'titre_signatures_attente' => 'Assinaturas aguardando validação',
659
-	'titre_signatures_confirmees' => 'Assinaturas confirmadas',
660
-	'titre_statistiques' => 'Estatísticas do sítio',
661
-	'titre_titre_document' => 'Título do documento :',
662
-	'todo' => 'a caminho',
663
-	'trad_reference' => '(referência para as traduções)',
635
+    'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do sítio, por favor,',
636
+    'texte_inc_meta_2' => 'verificar as permissões de escrita',
637
+    'texte_inc_meta_3' => 'no directório <code>@repertoire@</code>.',
638
+    'texte_statut_en_cours_redaction' => 'em curso de redacção',
639
+    'texte_statut_poubelle' => 'para o caixote de lixo',
640
+    'texte_statut_propose_evaluation' => 'proposto para avaliação',
641
+    'texte_statut_publie' => 'publicado online',
642
+    'texte_statut_refuse' => 'recusado',
643
+    'titre_ajouter_mot_cle' => 'ACRESCENTAR UMA PALAVRA-CHAVE',
644
+    'titre_cadre_raccourcis' => 'ATALHOS :',
645
+    'titre_changer_couleur_interface' => 'Mudar a cor da interface',
646
+    'titre_image_admin_article' => 'Pode administrar este artigo',
647
+    'titre_image_administrateur' => 'Administrador',
648
+    'titre_image_aide' => 'Ajuda sobre este elemento',
649
+    'titre_image_auteur_supprime' => 'Autor eliminado',
650
+    'titre_image_redacteur' => 'Redactor sem acesso',
651
+    'titre_image_redacteur_02' => 'Redactor',
652
+    'titre_image_selecteur' => 'Exibir a lista',
653
+    'titre_image_visiteur' => 'Visitante',
654
+    'titre_joindre_document' => 'ANEXAR UM DOCUMENTO',
655
+    'titre_mots_cles' => 'PALAVRAS-CHAVE',
656
+    'titre_probleme_technique' => 'Atenção : um problema técnico (servidor SQL) impede o acesso a esta parte do sítio. Obrigado pela sua compreensão.',
657
+    'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA RUBRICA',
658
+    'titre_signatures_attente' => 'Assinaturas aguardando validação',
659
+    'titre_signatures_confirmees' => 'Assinaturas confirmadas',
660
+    'titre_statistiques' => 'Estatísticas do sítio',
661
+    'titre_titre_document' => 'Título do documento :',
662
+    'todo' => 'a caminho',
663
+    'trad_reference' => '(referência para as traduções)',
664 664
 
665
-	// Z
666
-	'zbug_balise_b_aval' => ': tag B colocada demasiado tarde no laço infinito',
667
-	'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@',
668
-	'zbug_balise_sans_argument' => 'Argumento em falta na tag @balise@',
669
-	'zbug_boucle' => 'laço infinito',
670
-	'zbug_boucle_recursive_undef' => 'laço recursivo não definido @nom@',
671
-	'zbug_calcul' => 'cálculo',
672
-	'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço infinito',
673
-	'zbug_champ_hors_motif' => 'Campo @champ@ fora de contexto @motif@',
674
-	'zbug_code' => 'código',
675
-	'zbug_critere_inconnu' => 'critério desconhecido @critere@ ',
676
-	'zbug_distant_interdit' => 'Dados externos interditos',
677
-	'zbug_doublon_table_sans_cle_primaire' => 'Entradas duplas numa tabela que não tem uma chave primária simples',
678
-	'zbug_doublon_table_sans_index' => 'Entradas duplas numa tabela sem índice',
679
-	'zbug_erreur_boucle_double' => 'laço @id@: Dupla definição ',
680
-	'zbug_erreur_boucle_fermant' => 'laço @id@: tag final em falta   ',
681
-	'zbug_erreur_boucle_syntaxe' => 'Laço com sintaxe incorrecta @id@',
682
-	'zbug_erreur_compilation' => 'Erro de compilação',
683
-	'zbug_erreur_execution_page' => 'erro de execução da página',
684
-	'zbug_erreur_filtre' => 'Erro : filtro indefinido @filtre@ ',
685
-	'zbug_erreur_meme_parent' => '{meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)',
686
-	'zbug_erreur_squelette' => 'Erro(s) no modelo',
687
-	'zbug_hors_compilation' => 'Não compilado',
688
-	'zbug_info_erreur_squelette' => 'Erro no sítio',
689
-	'zbug_inversion_ordre_inexistant' => 'inversão de uma ordem inexistente',
690
-	'zbug_pagination_sans_critere' => '#PAGINAÇÃO sem critério {paginação} ou usada num laço recursivo',
691
-	'zbug_parametres_inclus_incorrects' => 'Parâmetros de inclusão incorrectos: @param@',
692
-	'zbug_profile' => 'Cálculo de tempo : @time@',
693
-	'zbug_resultat' => 'resultado',
694
-	'zbug_serveur_indefini' => 'Sevidor SQL não definido',
695
-	'zbug_statistiques' => 'Estatísticas das consulta SQL classificadas por duração',
696
-	'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida',
697
-	'zxml_connus_attributs' => 'attributos conhecidos',
698
-	'zxml_de' => 'de',
699
-	'zxml_inconnu_attribut' => 'atributo desconhecido',
700
-	'zxml_inconnu_balise' => 'tag desconhecida',
701
-	'zxml_inconnu_entite' => 'entidade desconhecida',
702
-	'zxml_inconnu_id' => 'ID desconhecido',
703
-	'zxml_mais_de' => 'mas de',
704
-	'zxml_non_conforme' => 'não está de acordo com o princípio',
705
-	'zxml_non_fils' => 'não é um filho de ',
706
-	'zxml_nonvide_balise' => 'a tag não está vazia',
707
-	'zxml_obligatoire_attribut' => 'atributo obrigatório está em falta',
708
-	'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorrecta',
709
-	'zxml_survoler' => 'para visualizar os correctos, mover o rato por cima',
710
-	'zxml_valeur_attribut' => 'valor do atributo',
711
-	'zxml_vide_balise' => 'tag vazia',
712
-	'zxml_vu' => 'visualizado antes'
665
+    // Z
666
+    'zbug_balise_b_aval' => ': tag B colocada demasiado tarde no laço infinito',
667
+    'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@',
668
+    'zbug_balise_sans_argument' => 'Argumento em falta na tag @balise@',
669
+    'zbug_boucle' => 'laço infinito',
670
+    'zbug_boucle_recursive_undef' => 'laço recursivo não definido @nom@',
671
+    'zbug_calcul' => 'cálculo',
672
+    'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço infinito',
673
+    'zbug_champ_hors_motif' => 'Campo @champ@ fora de contexto @motif@',
674
+    'zbug_code' => 'código',
675
+    'zbug_critere_inconnu' => 'critério desconhecido @critere@ ',
676
+    'zbug_distant_interdit' => 'Dados externos interditos',
677
+    'zbug_doublon_table_sans_cle_primaire' => 'Entradas duplas numa tabela que não tem uma chave primária simples',
678
+    'zbug_doublon_table_sans_index' => 'Entradas duplas numa tabela sem índice',
679
+    'zbug_erreur_boucle_double' => 'laço @id@: Dupla definição ',
680
+    'zbug_erreur_boucle_fermant' => 'laço @id@: tag final em falta   ',
681
+    'zbug_erreur_boucle_syntaxe' => 'Laço com sintaxe incorrecta @id@',
682
+    'zbug_erreur_compilation' => 'Erro de compilação',
683
+    'zbug_erreur_execution_page' => 'erro de execução da página',
684
+    'zbug_erreur_filtre' => 'Erro : filtro indefinido @filtre@ ',
685
+    'zbug_erreur_meme_parent' => '{meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)',
686
+    'zbug_erreur_squelette' => 'Erro(s) no modelo',
687
+    'zbug_hors_compilation' => 'Não compilado',
688
+    'zbug_info_erreur_squelette' => 'Erro no sítio',
689
+    'zbug_inversion_ordre_inexistant' => 'inversão de uma ordem inexistente',
690
+    'zbug_pagination_sans_critere' => '#PAGINAÇÃO sem critério {paginação} ou usada num laço recursivo',
691
+    'zbug_parametres_inclus_incorrects' => 'Parâmetros de inclusão incorrectos: @param@',
692
+    'zbug_profile' => 'Cálculo de tempo : @time@',
693
+    'zbug_resultat' => 'resultado',
694
+    'zbug_serveur_indefini' => 'Sevidor SQL não definido',
695
+    'zbug_statistiques' => 'Estatísticas das consulta SQL classificadas por duração',
696
+    'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida',
697
+    'zxml_connus_attributs' => 'attributos conhecidos',
698
+    'zxml_de' => 'de',
699
+    'zxml_inconnu_attribut' => 'atributo desconhecido',
700
+    'zxml_inconnu_balise' => 'tag desconhecida',
701
+    'zxml_inconnu_entite' => 'entidade desconhecida',
702
+    'zxml_inconnu_id' => 'ID desconhecido',
703
+    'zxml_mais_de' => 'mas de',
704
+    'zxml_non_conforme' => 'não está de acordo com o princípio',
705
+    'zxml_non_fils' => 'não é um filho de ',
706
+    'zxml_nonvide_balise' => 'a tag não está vazia',
707
+    'zxml_obligatoire_attribut' => 'atributo obrigatório está em falta',
708
+    'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorrecta',
709
+    'zxml_survoler' => 'para visualizar os correctos, mover o rato por cima',
710
+    'zxml_valeur_attribut' => 'valor do atributo',
711
+    'zxml_vide_balise' => 'tag vazia',
712
+    'zxml_vu' => 'visualizado antes'
713 713
 );
Please login to merge, or discard this patch.
ecrire/inc/modifier.php 1 patch
Indentation   +256 added lines, -256 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
 /**
@@ -39,28 +39,28 @@  discard block
 block discarded – undo
39 39
  *     Tableau des champs et valeurs collectées
40 40
  */
41 41
 function collecter_requests($white_list, $black_list = [], $set = null, $tous = false) {
42
-	$c = $set;
43
-	if (!$c) {
44
-		$c = [];
45
-		foreach ($white_list as $champ) {
46
-			// on ne collecte que les champs reellement envoyes par defaut.
47
-			// le cas d'un envoi de valeur NULL peut du coup poser probleme.
48
-			$val = _request($champ);
49
-			if ($tous or $val !== null) {
50
-				$c[$champ] = $val;
51
-			}
52
-		}
53
-		// on ajoute toujours la lang en saisie possible
54
-		// meme si pas prevu au depart pour l'objet concerne
55
-		if ($l = _request('changer_lang')) {
56
-			$c['lang'] = $l;
57
-		}
58
-	}
59
-	foreach ($black_list as $champ) {
60
-		unset($c[$champ]);
61
-	}
62
-
63
-	return $c;
42
+    $c = $set;
43
+    if (!$c) {
44
+        $c = [];
45
+        foreach ($white_list as $champ) {
46
+            // on ne collecte que les champs reellement envoyes par defaut.
47
+            // le cas d'un envoi de valeur NULL peut du coup poser probleme.
48
+            $val = _request($champ);
49
+            if ($tous or $val !== null) {
50
+                $c[$champ] = $val;
51
+            }
52
+        }
53
+        // on ajoute toujours la lang en saisie possible
54
+        // meme si pas prevu au depart pour l'objet concerne
55
+        if ($l = _request('changer_lang')) {
56
+            $c['lang'] = $l;
57
+        }
58
+    }
59
+    foreach ($black_list as $champ) {
60
+        unset($c[$champ]);
61
+    }
62
+
63
+    return $c;
64 64
 }
65 65
 
66 66
 /**
@@ -97,237 +97,237 @@  discard block
 block discarded – undo
97 97
  *     - chaîne : Texte d'un message d'erreur
98 98
  */
99 99
 function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur = '') {
100
-	if (!$id_objet = intval($id_objet)) {
101
-		spip_log('Erreur $id_objet non defini', 'warn');
102
-
103
-		return _T('erreur_technique_enregistrement_impossible');
104
-	}
105
-
106
-	include_spip('inc/filtres');
107
-
108
-	$table_objet = table_objet($objet, $serveur);
109
-	$spip_table_objet = table_objet_sql($objet, $serveur);
110
-	$id_table_objet = id_table_objet($objet, $serveur);
111
-	$trouver_table = charger_fonction('trouver_table', 'base');
112
-	$desc = $trouver_table($spip_table_objet, $serveur);
113
-
114
-	// Appels incomplets (sans $c)
115
-	if (!is_array($c)) {
116
-		spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
117
-
118
-		return _T('erreur_technique_enregistrement_impossible');
119
-	}
120
-
121
-	// Securite : certaines variables ne sont jamais acceptees ici
122
-	// car elles ne relevent pas de autoriser(xxx, modifier) ;
123
-	// il faut passer par instituer_XX()
124
-	// TODO: faut-il passer ces variables interdites
125
-	// dans un fichier de description separe ?
126
-	unset($c['statut']);
127
-	unset($c['id_parent']);
128
-	unset($c['id_rubrique']);
129
-	unset($c['id_secteur']);
130
-
131
-	// Gerer les champs non vides
132
-	if (isset($options['nonvide']) and is_array($options['nonvide'])) {
133
-		foreach ($options['nonvide'] as $champ => $sinon) {
134
-			if (isset($c[$champ]) and $c[$champ] === '') {
135
-				$c[$champ] = $sinon;
136
-			}
137
-		}
138
-	}
139
-
140
-	// N'accepter que les champs qui existent
141
-	// TODO: ici aussi on peut valider les contenus
142
-	// en fonction du type
143
-	$champs = array_intersect_key($c, $desc['field']);
144
-
145
-	// Nettoyer les valeurs
146
-	$champs = array_map('corriger_caracteres', $champs);
147
-
148
-	// On récupère l'état avant toute modification
149
-	$row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
150
-
151
-	// Envoyer aux plugins
152
-	$champs = pipeline(
153
-		'pre_edition',
154
-		[
155
-			'args' => [
156
-				'table' => $spip_table_objet, // compatibilite
157
-				'table_objet' => $table_objet,
158
-				'spip_table_objet' => $spip_table_objet,
159
-				'desc' => $desc,
160
-				'type' => $objet,
161
-				'id_objet' => $id_objet,
162
-				'data' => $options['data'] ?? null,
163
-				'champs' => $options['champs'] ?? [], // [doc] c'est quoi ?
164
-				'champs_anciens' => $row, // état du contenu avant modif
165
-				'serveur' => $serveur,
166
-				'action' => $options['action'] ?? 'modifier'
167
-			],
168
-			'data' => $champs
169
-		]
170
-	);
171
-
172
-	if (!$champs) {
173
-		return false;
174
-	}
175
-
176
-
177
-	// marquer le fait que l'objet est travaille par toto a telle date
178
-	if ($GLOBALS['meta']['articles_modif'] != 'non') {
179
-		include_spip('inc/drapeau_edition');
180
-		signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet);
181
-	}
182
-
183
-	// Verifier si les mises a jour sont pertinentes, datees, en conflit etc
184
-	include_spip('inc/editer');
185
-	if (!isset($options['data']) or is_null($options['data'])) {
186
-		$options['data'] = &$_POST;
187
-	}
188
-	$conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur);
189
-	// cas hypothetique : normalement inc/editer verifie en amont le conflit edition
190
-	// et gere l'interface
191
-	// ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme
192
-	if ($conflits) {
193
-		return _T('titre_conflit_edition');
194
-	}
195
-
196
-	if ($champs) {
197
-		// cas particulier de la langue : passer par instituer_langue_objet
198
-		if (isset($champs['lang'])) {
199
-			if ($changer_lang = $champs['lang']) {
200
-				$id_rubrique = 0;
201
-				if (isset($desc['field']['id_rubrique'])) {
202
-					$parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
203
-					$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
204
-				}
205
-				$instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
206
-				$champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
207
-			}
208
-			// on laisse 'lang' dans $champs,
209
-			// ca permet de passer dans le pipeline post_edition et de journaliser
210
-			// et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir
211
-			// deja pris en compte
212
-		}
213
-
214
-		// la modif peut avoir lieu
215
-
216
-		// faut-il ajouter date_modif ?
217
-		if (
218
-			!empty($options['date_modif'])
219
-			and !isset($champs[$options['date_modif']])
220
-		) {
221
-			$champs[$options['date_modif']] = date('Y-m-d H:i:s');
222
-		}
223
-
224
-		// allez on commit la modif
225
-		sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), $serveur);
226
-
227
-		// on verifie si elle est bien passee
228
-		$moof = sql_fetsel(
229
-			array_keys($champs),
230
-			$spip_table_objet,
231
-			"$id_table_objet=" . intval($id_objet),
232
-			[],
233
-			[],
234
-			'',
235
-			[],
236
-			$serveur
237
-		);
238
-		// si difference entre les champs, reperer les champs mal enregistres
239
-		if ($moof != $champs) {
240
-			$liste = [];
241
-			foreach ($moof as $k => $v) {
242
-				if (
243
-					$v !== $champs[$k]
244
-					// ne pas alerter si le champ est numerique est que les valeurs sont equivalentes
245
-					and (!is_numeric($v) or intval($v) !== intval($champs[$k]))
246
-					// ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle
247
-					and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00']))
248
-				) {
249
-					$liste[] = $k;
250
-					$conflits[$k]['post'] = $champs[$k];
251
-					$conflits[$k]['save'] = $v;
252
-
253
-					// cas specifique MySQL+emoji : si l'un est la
254
-					// conversion utf8_noplanes de l'autre alors c'est OK
255
-					if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) {
256
-						include_spip('inc/charsets');
257
-						if ($v == utf8_noplanes($champs[$k])) {
258
-							array_pop($liste);
259
-						}
260
-					}
261
-				}
262
-			}
263
-			// si un champ n'a pas ete correctement enregistre, loger et retourner une erreur
264
-			// c'est un cas exceptionnel
265
-			if (count($liste)) {
266
-				spip_log(
267
-					"Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
268
-					'modifier.' . _LOG_CRITIQUE
269
-				);
270
-
271
-				return _T(
272
-					'erreur_technique_enregistrement_champs',
273
-					['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
274
-				);
275
-			}
276
-		}
277
-
278
-		// Invalider les caches
279
-		if (isset($options['invalideur']) and $options['invalideur']) {
280
-			include_spip('inc/invalideur');
281
-			if (is_array($options['invalideur'])) {
282
-				array_map('suivre_invalideur', $options['invalideur']);
283
-			} else {
284
-				suivre_invalideur($options['invalideur']);
285
-			}
286
-		}
287
-
288
-		// Notifications, gestion des revisions...
289
-		// en standard, appelle |nouvelle_revision ci-dessous
290
-		pipeline(
291
-			'post_edition',
292
-			[
293
-				'args' => [
294
-					'table' => $spip_table_objet,
295
-					'table_objet' => $table_objet,
296
-					'spip_table_objet' => $spip_table_objet,
297
-					'desc' => $desc,
298
-					'type' => $objet,
299
-					'id_objet' => $id_objet,
300
-					'champs' => $options['champs'] ?? [], // [doc] kesako ?
301
-					'champs_anciens' => $row, // état du contenu avant modif
302
-					'serveur' => $serveur,
303
-					'action' => $options['action'] ?? 'modifier'
304
-				],
305
-				'data' => $champs
306
-			]
307
-		);
308
-	}
309
-
310
-	// journaliser l'affaire
311
-	// message a affiner :-)
312
-	include_spip('inc/filtres_mini');
313
-	$qui = '';
314
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
315
-		$qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
316
-	}
317
-	if (!empty($GLOBALS['visiteur_session']['nom'])) {
318
-		$qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
319
-	}
320
-	if ($qui == '') {
321
-		$qui = '#ip:' . $GLOBALS['ip'] . '#';
322
-	}
323
-	journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
324
-		'+',
325
-		array_diff(array_keys($champs), ['date_modif'])
326
-	) . ')'), [
327
-		'faire' => 'modifier',
328
-		'quoi' => $objet,
329
-		'id' => $id_objet
330
-	]);
331
-
332
-	return '';
100
+    if (!$id_objet = intval($id_objet)) {
101
+        spip_log('Erreur $id_objet non defini', 'warn');
102
+
103
+        return _T('erreur_technique_enregistrement_impossible');
104
+    }
105
+
106
+    include_spip('inc/filtres');
107
+
108
+    $table_objet = table_objet($objet, $serveur);
109
+    $spip_table_objet = table_objet_sql($objet, $serveur);
110
+    $id_table_objet = id_table_objet($objet, $serveur);
111
+    $trouver_table = charger_fonction('trouver_table', 'base');
112
+    $desc = $trouver_table($spip_table_objet, $serveur);
113
+
114
+    // Appels incomplets (sans $c)
115
+    if (!is_array($c)) {
116
+        spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
117
+
118
+        return _T('erreur_technique_enregistrement_impossible');
119
+    }
120
+
121
+    // Securite : certaines variables ne sont jamais acceptees ici
122
+    // car elles ne relevent pas de autoriser(xxx, modifier) ;
123
+    // il faut passer par instituer_XX()
124
+    // TODO: faut-il passer ces variables interdites
125
+    // dans un fichier de description separe ?
126
+    unset($c['statut']);
127
+    unset($c['id_parent']);
128
+    unset($c['id_rubrique']);
129
+    unset($c['id_secteur']);
130
+
131
+    // Gerer les champs non vides
132
+    if (isset($options['nonvide']) and is_array($options['nonvide'])) {
133
+        foreach ($options['nonvide'] as $champ => $sinon) {
134
+            if (isset($c[$champ]) and $c[$champ] === '') {
135
+                $c[$champ] = $sinon;
136
+            }
137
+        }
138
+    }
139
+
140
+    // N'accepter que les champs qui existent
141
+    // TODO: ici aussi on peut valider les contenus
142
+    // en fonction du type
143
+    $champs = array_intersect_key($c, $desc['field']);
144
+
145
+    // Nettoyer les valeurs
146
+    $champs = array_map('corriger_caracteres', $champs);
147
+
148
+    // On récupère l'état avant toute modification
149
+    $row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
150
+
151
+    // Envoyer aux plugins
152
+    $champs = pipeline(
153
+        'pre_edition',
154
+        [
155
+            'args' => [
156
+                'table' => $spip_table_objet, // compatibilite
157
+                'table_objet' => $table_objet,
158
+                'spip_table_objet' => $spip_table_objet,
159
+                'desc' => $desc,
160
+                'type' => $objet,
161
+                'id_objet' => $id_objet,
162
+                'data' => $options['data'] ?? null,
163
+                'champs' => $options['champs'] ?? [], // [doc] c'est quoi ?
164
+                'champs_anciens' => $row, // état du contenu avant modif
165
+                'serveur' => $serveur,
166
+                'action' => $options['action'] ?? 'modifier'
167
+            ],
168
+            'data' => $champs
169
+        ]
170
+    );
171
+
172
+    if (!$champs) {
173
+        return false;
174
+    }
175
+
176
+
177
+    // marquer le fait que l'objet est travaille par toto a telle date
178
+    if ($GLOBALS['meta']['articles_modif'] != 'non') {
179
+        include_spip('inc/drapeau_edition');
180
+        signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet);
181
+    }
182
+
183
+    // Verifier si les mises a jour sont pertinentes, datees, en conflit etc
184
+    include_spip('inc/editer');
185
+    if (!isset($options['data']) or is_null($options['data'])) {
186
+        $options['data'] = &$_POST;
187
+    }
188
+    $conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur);
189
+    // cas hypothetique : normalement inc/editer verifie en amont le conflit edition
190
+    // et gere l'interface
191
+    // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme
192
+    if ($conflits) {
193
+        return _T('titre_conflit_edition');
194
+    }
195
+
196
+    if ($champs) {
197
+        // cas particulier de la langue : passer par instituer_langue_objet
198
+        if (isset($champs['lang'])) {
199
+            if ($changer_lang = $champs['lang']) {
200
+                $id_rubrique = 0;
201
+                if (isset($desc['field']['id_rubrique'])) {
202
+                    $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
203
+                    $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
204
+                }
205
+                $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
206
+                $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
207
+            }
208
+            // on laisse 'lang' dans $champs,
209
+            // ca permet de passer dans le pipeline post_edition et de journaliser
210
+            // et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir
211
+            // deja pris en compte
212
+        }
213
+
214
+        // la modif peut avoir lieu
215
+
216
+        // faut-il ajouter date_modif ?
217
+        if (
218
+            !empty($options['date_modif'])
219
+            and !isset($champs[$options['date_modif']])
220
+        ) {
221
+            $champs[$options['date_modif']] = date('Y-m-d H:i:s');
222
+        }
223
+
224
+        // allez on commit la modif
225
+        sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), $serveur);
226
+
227
+        // on verifie si elle est bien passee
228
+        $moof = sql_fetsel(
229
+            array_keys($champs),
230
+            $spip_table_objet,
231
+            "$id_table_objet=" . intval($id_objet),
232
+            [],
233
+            [],
234
+            '',
235
+            [],
236
+            $serveur
237
+        );
238
+        // si difference entre les champs, reperer les champs mal enregistres
239
+        if ($moof != $champs) {
240
+            $liste = [];
241
+            foreach ($moof as $k => $v) {
242
+                if (
243
+                    $v !== $champs[$k]
244
+                    // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes
245
+                    and (!is_numeric($v) or intval($v) !== intval($champs[$k]))
246
+                    // ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle
247
+                    and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00']))
248
+                ) {
249
+                    $liste[] = $k;
250
+                    $conflits[$k]['post'] = $champs[$k];
251
+                    $conflits[$k]['save'] = $v;
252
+
253
+                    // cas specifique MySQL+emoji : si l'un est la
254
+                    // conversion utf8_noplanes de l'autre alors c'est OK
255
+                    if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) {
256
+                        include_spip('inc/charsets');
257
+                        if ($v == utf8_noplanes($champs[$k])) {
258
+                            array_pop($liste);
259
+                        }
260
+                    }
261
+                }
262
+            }
263
+            // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur
264
+            // c'est un cas exceptionnel
265
+            if (count($liste)) {
266
+                spip_log(
267
+                    "Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
268
+                    'modifier.' . _LOG_CRITIQUE
269
+                );
270
+
271
+                return _T(
272
+                    'erreur_technique_enregistrement_champs',
273
+                    ['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
274
+                );
275
+            }
276
+        }
277
+
278
+        // Invalider les caches
279
+        if (isset($options['invalideur']) and $options['invalideur']) {
280
+            include_spip('inc/invalideur');
281
+            if (is_array($options['invalideur'])) {
282
+                array_map('suivre_invalideur', $options['invalideur']);
283
+            } else {
284
+                suivre_invalideur($options['invalideur']);
285
+            }
286
+        }
287
+
288
+        // Notifications, gestion des revisions...
289
+        // en standard, appelle |nouvelle_revision ci-dessous
290
+        pipeline(
291
+            'post_edition',
292
+            [
293
+                'args' => [
294
+                    'table' => $spip_table_objet,
295
+                    'table_objet' => $table_objet,
296
+                    'spip_table_objet' => $spip_table_objet,
297
+                    'desc' => $desc,
298
+                    'type' => $objet,
299
+                    'id_objet' => $id_objet,
300
+                    'champs' => $options['champs'] ?? [], // [doc] kesako ?
301
+                    'champs_anciens' => $row, // état du contenu avant modif
302
+                    'serveur' => $serveur,
303
+                    'action' => $options['action'] ?? 'modifier'
304
+                ],
305
+                'data' => $champs
306
+            ]
307
+        );
308
+    }
309
+
310
+    // journaliser l'affaire
311
+    // message a affiner :-)
312
+    include_spip('inc/filtres_mini');
313
+    $qui = '';
314
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
315
+        $qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
316
+    }
317
+    if (!empty($GLOBALS['visiteur_session']['nom'])) {
318
+        $qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
319
+    }
320
+    if ($qui == '') {
321
+        $qui = '#ip:' . $GLOBALS['ip'] . '#';
322
+    }
323
+    journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
324
+        '+',
325
+        array_diff(array_keys($champs), ['date_modif'])
326
+    ) . ')'), [
327
+        'faire' => 'modifier',
328
+        'quoi' => $objet,
329
+        'id' => $id_objet
330
+    ]);
331
+
332
+    return '';
333 333
 }
Please login to merge, or discard this patch.
prive/formulaires/configurer_ecran_connexion.php 1 patch
Indentation   +74 added lines, -74 removed lines patch added patch discarded remove patch
@@ -1,94 +1,94 @@
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 function formulaires_configurer_ecran_connexion_data(): array {
4
-	return [
5
-		'couleur_defaut' => '#db1762',
6
-		'img_fond' => _DIR_IMG . 'spip_fond_login.jpg',
7
-	];
4
+    return [
5
+        'couleur_defaut' => '#db1762',
6
+        'img_fond' => _DIR_IMG . 'spip_fond_login.jpg',
7
+    ];
8 8
 }
9 9
 
10 10
 function formulaires_configurer_ecran_connexion_charger_dist() {
11
-	include_spip('inc/config');
12
-	include_spip('inc/autoriser');
11
+    include_spip('inc/config');
12
+    include_spip('inc/autoriser');
13 13
 
14
-	$data = formulaires_configurer_ecran_connexion_data();
14
+    $data = formulaires_configurer_ecran_connexion_data();
15 15
 
16
-	$valeurs = [
17
-		'couleur_login' => lire_config('couleur_login', $data['couleur_defaut']),
18
-		'couleur_defaut_login' => $data['couleur_defaut'],
19
-		'upload_image_fond_login' => '',
20
-	];
16
+    $valeurs = [
17
+        'couleur_login' => lire_config('couleur_login', $data['couleur_defaut']),
18
+        'couleur_defaut_login' => $data['couleur_defaut'],
19
+        'upload_image_fond_login' => '',
20
+    ];
21 21
 
22
-	if (file_exists($data['img_fond'])) {
23
-		$valeurs['src_img'] = $data['img_fond'];
24
-	}
22
+    if (file_exists($data['img_fond'])) {
23
+        $valeurs['src_img'] = $data['img_fond'];
24
+    }
25 25
 
26
-	return $valeurs;
26
+    return $valeurs;
27 27
 }
28 28
 
29 29
 
30 30
 function formulaires_configurer_ecran_connexion_verifier_dist() {
31
-	$erreurs = [];
32
-
33
-	if (_request('supprimer_image_fond_login')) {
34
-		// rien à tester
35
-	}
36
-
37
-	elseif (_request('supprimer_couleur_login')) {
38
-		// rien à tester
39
-	}
40
-
41
-	elseif (!empty($_FILES['upload_image_fond_login'])) {
42
-		$file = $_FILES['upload_image_fond_login'];
43
-		include_spip('inc/documents');
44
-		$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
45
-		$extension = corriger_extension(strtolower($extension));
46
-		if (!in_array($extension, ['jpg'])) {
47
-			$erreurs['upload_image_fond_login'] = _T('erreur_type_fichier');
48
-		}
49
-	}
50
-
51
-	return $erreurs;
31
+    $erreurs = [];
32
+
33
+    if (_request('supprimer_image_fond_login')) {
34
+        // rien à tester
35
+    }
36
+
37
+    elseif (_request('supprimer_couleur_login')) {
38
+        // rien à tester
39
+    }
40
+
41
+    elseif (!empty($_FILES['upload_image_fond_login'])) {
42
+        $file = $_FILES['upload_image_fond_login'];
43
+        include_spip('inc/documents');
44
+        $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
45
+        $extension = corriger_extension(strtolower($extension));
46
+        if (!in_array($extension, ['jpg'])) {
47
+            $erreurs['upload_image_fond_login'] = _T('erreur_type_fichier');
48
+        }
49
+    }
50
+
51
+    return $erreurs;
52 52
 }
53 53
 
54 54
 
55 55
 function formulaires_configurer_ecran_connexion_traiter_dist() {
56 56
 
57
-	$retours = [
58
-		'message_ok' => _T('config_info_enregistree'),
59
-		'editable' => true,
60
-	];
61
-
62
-	include_spip('inc/config');
63
-	$data = formulaires_configurer_ecran_connexion_data();
64
-	$dest = $data['img_fond'];
65
-
66
-	if (_request('couleur_login')) {
67
-		$color = _request('couleur_login');
68
-		if ($color === $data['couleur_defaut']) {
69
-			effacer_config('couleur_login');
70
-		} else {
71
-			ecrire_config('couleur_login', $color);
72
-		}
73
-	}
74
-
75
-	if (_request('supprimer_image_fond_login')) {
76
-		@unlink($dest);
77
-	}
78
-
79
-	elseif (_request('supprimer_couleur_login')) {
80
-		effacer_config('couleur_login');
81
-		set_request('couleur_login', null);
82
-	}
83
-
84
-	elseif (!empty($_FILES['upload_image_fond_login'])) {
85
-		$file = $_FILES['upload_image_fond_login'];
86
-		include_spip('inc/documents');
87
-		deplacer_fichier_upload($file['tmp_name'], $dest);
88
-	}
89
-
90
-	include_spip('inc/invalideur');
91
-	suivre_invalideur('1'); # tout effacer
92
-
93
-	return $retours;
57
+    $retours = [
58
+        'message_ok' => _T('config_info_enregistree'),
59
+        'editable' => true,
60
+    ];
61
+
62
+    include_spip('inc/config');
63
+    $data = formulaires_configurer_ecran_connexion_data();
64
+    $dest = $data['img_fond'];
65
+
66
+    if (_request('couleur_login')) {
67
+        $color = _request('couleur_login');
68
+        if ($color === $data['couleur_defaut']) {
69
+            effacer_config('couleur_login');
70
+        } else {
71
+            ecrire_config('couleur_login', $color);
72
+        }
73
+    }
74
+
75
+    if (_request('supprimer_image_fond_login')) {
76
+        @unlink($dest);
77
+    }
78
+
79
+    elseif (_request('supprimer_couleur_login')) {
80
+        effacer_config('couleur_login');
81
+        set_request('couleur_login', null);
82
+    }
83
+
84
+    elseif (!empty($_FILES['upload_image_fond_login'])) {
85
+        $file = $_FILES['upload_image_fond_login'];
86
+        include_spip('inc/documents');
87
+        deplacer_fichier_upload($file['tmp_name'], $dest);
88
+    }
89
+
90
+    include_spip('inc/invalideur');
91
+    suivre_invalideur('1'); # tout effacer
92
+
93
+    return $retours;
94 94
 }
Please login to merge, or discard this patch.
ecrire/inc/livrer_fichier.php 1 patch
Indentation   +125 added lines, -125 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Fichier
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -36,28 +36,28 @@  discard block
 block discarded – undo
36 36
  */
37 37
 function spip_livrer_fichier($fichier, $content_type = 'application/octet-stream', $options = []) {
38 38
 
39
-	$defaut = [
40
-		'attachment' => false,
41
-		'expires' => 3600,
42
-		'range' => null
43
-	];
44
-	$options = array_merge($defaut, $options);
45
-	if (is_numeric($options['expire']) and $options['expire'] > 0) {
46
-		$options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT';
47
-	}
48
-
49
-	if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) {
50
-		$options['range'] = $_SERVER['HTTP_RANGE'];
51
-	}
52
-
53
-	spip_livrer_fichier_entetes($fichier, $content_type, $options['attachment'] && !$options['range'], $options['expires']);
54
-
55
-	if (!is_null($options['range'])) {
56
-		spip_livrer_fichier_partie($fichier, $options['range']);
57
-	}
58
-	else {
59
-		spip_livrer_fichier_entier($fichier);
60
-	}
39
+    $defaut = [
40
+        'attachment' => false,
41
+        'expires' => 3600,
42
+        'range' => null
43
+    ];
44
+    $options = array_merge($defaut, $options);
45
+    if (is_numeric($options['expire']) and $options['expire'] > 0) {
46
+        $options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT';
47
+    }
48
+
49
+    if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) {
50
+        $options['range'] = $_SERVER['HTTP_RANGE'];
51
+    }
52
+
53
+    spip_livrer_fichier_entetes($fichier, $content_type, $options['attachment'] && !$options['range'], $options['expires']);
54
+
55
+    if (!is_null($options['range'])) {
56
+        spip_livrer_fichier_partie($fichier, $options['range']);
57
+    }
58
+    else {
59
+        spip_livrer_fichier_entier($fichier);
60
+    }
61 61
 }
62 62
 
63 63
 /**
@@ -70,28 +70,28 @@  discard block
 block discarded – undo
70 70
  * @param int|string $expires
71 71
  */
72 72
 function spip_livrer_fichier_entetes($fichier, $content_type = 'application/octet-stream', $attachment = false, $expires = 0) {
73
-	// toujours envoyer un content type, meme vide !
74
-	header('Accept-Ranges: bytes');
75
-	header('Content-Type: ' . $content_type);
76
-
77
-	if ($attachment) {
78
-		$f = basename($fichier);
79
-		// ce content-type est necessaire pour eviter des corruptions de zip dans ie6
80
-		header('Content-Type: application/octet-stream');
81
-
82
-		header("Content-Disposition: attachment; filename=\"$f\";");
83
-		header('Content-Transfer-Encoding: binary');
84
-
85
-		// fix for IE caching or PHP bug issue
86
-		header('Expires: 0'); // set expiration time
87
-		header('Pragma: public');
88
-		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
89
-	}
90
-	else {
91
-		$f = basename($fichier);
92
-		header("Content-Disposition: inline; filename=\"$f\";");
93
-		header('Expires: ' . $expires); // set expiration time
94
-	}
73
+    // toujours envoyer un content type, meme vide !
74
+    header('Accept-Ranges: bytes');
75
+    header('Content-Type: ' . $content_type);
76
+
77
+    if ($attachment) {
78
+        $f = basename($fichier);
79
+        // ce content-type est necessaire pour eviter des corruptions de zip dans ie6
80
+        header('Content-Type: application/octet-stream');
81
+
82
+        header("Content-Disposition: attachment; filename=\"$f\";");
83
+        header('Content-Transfer-Encoding: binary');
84
+
85
+        // fix for IE caching or PHP bug issue
86
+        header('Expires: 0'); // set expiration time
87
+        header('Pragma: public');
88
+        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
89
+    }
90
+    else {
91
+        $f = basename($fichier);
92
+        header("Content-Disposition: inline; filename=\"$f\";");
93
+        header('Expires: ' . $expires); // set expiration time
94
+    }
95 95
 }
96 96
 
97 97
 /**
@@ -99,20 +99,20 @@  discard block
 block discarded – undo
99 99
  * @param string $fichier
100 100
  */
101 101
 function spip_livrer_fichier_entier($fichier) {
102
-	if (!file_exists($fichier)) {
103
-		throw new \Exception(sprintf('File not found: %s', $fichier));
104
-	}
102
+    if (!file_exists($fichier)) {
103
+        throw new \Exception(sprintf('File not found: %s', $fichier));
104
+    }
105 105
 
106
-	if (!is_readable($fichier)) {
107
-		throw new \Exception(sprintf('File not readable: %s', $fichier));
108
-	}
106
+    if (!is_readable($fichier)) {
107
+        throw new \Exception(sprintf('File not readable: %s', $fichier));
108
+    }
109 109
 
110
-	if ($size = filesize($fichier)) {
111
-		header(sprintf('Content-Length: %d', $size));
112
-	}
110
+    if ($size = filesize($fichier)) {
111
+        header(sprintf('Content-Length: %d', $size));
112
+    }
113 113
 
114
-	readfile($fichier);
115
-	exit();
114
+    readfile($fichier);
115
+    exit();
116 116
 }
117 117
 
118 118
 /**
@@ -125,98 +125,98 @@  discard block
 block discarded – undo
125 125
  * @throws Exception
126 126
  */
127 127
 function spip_livrer_fichier_partie($fichier, $range = null) {
128
-	if (!file_exists($fichier)) {
129
-		throw new \Exception(sprintf('File not found: %s', $fichier));
130
-	}
128
+    if (!file_exists($fichier)) {
129
+        throw new \Exception(sprintf('File not found: %s', $fichier));
130
+    }
131 131
 
132
-	if (!is_readable($fichier)) {
133
-		throw new \Exception(sprintf('File not readable: %s', $fichier));
134
-	}
132
+    if (!is_readable($fichier)) {
133
+        throw new \Exception(sprintf('File not readable: %s', $fichier));
134
+    }
135 135
 
136 136
 
137
-	// Par defaut on envoie tout
138
-	$byteOffset = 0;
139
-	$byteLength = $fileSize = filesize($fichier);
137
+    // Par defaut on envoie tout
138
+    $byteOffset = 0;
139
+    $byteLength = $fileSize = filesize($fichier);
140 140
 
141 141
 
142
-	// Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451"
143
-	if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) {
144
-		### Offset signifies where we should begin to read the file
145
-		$byteOffset = (int)$match[1];
142
+    // Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451"
143
+    if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) {
144
+        ### Offset signifies where we should begin to read the file
145
+        $byteOffset = (int)$match[1];
146 146
 
147 147
 
148
-		### Length is for how long we should read the file according to the browser, and can never go beyond the file size
149
-		if (isset($match[2])) {
150
-			$finishBytes = (int)$match[2];
151
-			$byteLength = $finishBytes + 1;
152
-		} else {
153
-			$finishBytes = $fileSize - 1;
154
-		}
148
+        ### Length is for how long we should read the file according to the browser, and can never go beyond the file size
149
+        if (isset($match[2])) {
150
+            $finishBytes = (int)$match[2];
151
+            $byteLength = $finishBytes + 1;
152
+        } else {
153
+            $finishBytes = $fileSize - 1;
154
+        }
155 155
 
156
-		$cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize);
157
-	}
158
-	else {
159
-		// si pas de range valide, on delegue a la methode d'envoi complet
160
-		spip_livrer_fichier_entier($fichier);
161
-		// redondant, mais facilite la comprehension du code
162
-		exit();
163
-	}
156
+        $cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize);
157
+    }
158
+    else {
159
+        // si pas de range valide, on delegue a la methode d'envoi complet
160
+        spip_livrer_fichier_entier($fichier);
161
+        // redondant, mais facilite la comprehension du code
162
+        exit();
163
+    }
164 164
 
165
-	// Remove headers that might unnecessarily clutter up the output
166
-	header_remove('Cache-Control');
167
-	header_remove('Pragma');
165
+    // Remove headers that might unnecessarily clutter up the output
166
+    header_remove('Cache-Control');
167
+    header_remove('Pragma');
168 168
 
169
-	// partial content
170
-	header('HTTP/1.1 206 Partial content');
171
-	header($cr_header);  ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
169
+    // partial content
170
+    header('HTTP/1.1 206 Partial content');
171
+    header($cr_header);  ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
172 172
 
173 173
 
174
-	$byteRange = $byteLength - $byteOffset;
174
+    $byteRange = $byteLength - $byteOffset;
175 175
 
176
-	header(sprintf('Content-Length: %d', $byteRange));
176
+    header(sprintf('Content-Length: %d', $byteRange));
177 177
 
178
-	// Variable containing the buffer
179
-	$buffer = '';
180
-	// Just a reasonable buffer size
181
-	$bufferSize = 512 * 16;
182
-	// Contains how much is left to read of the byteRange
183
-	$bytePool = $byteRange;
178
+    // Variable containing the buffer
179
+    $buffer = '';
180
+    // Just a reasonable buffer size
181
+    $bufferSize = 512 * 16;
182
+    // Contains how much is left to read of the byteRange
183
+    $bytePool = $byteRange;
184 184
 
185
-	if (!$handle = fopen($fichier, 'r')) {
186
-		throw new \Exception(sprintf('Could not get handle for file %s', $fichier));
187
-	}
185
+    if (!$handle = fopen($fichier, 'r')) {
186
+        throw new \Exception(sprintf('Could not get handle for file %s', $fichier));
187
+    }
188 188
 
189
-	if (fseek($handle, $byteOffset, SEEK_SET) == -1) {
190
-		throw new \Exception(sprintf('Could not seek to byte offset %d', $byteOffset));
191
-	}
189
+    if (fseek($handle, $byteOffset, SEEK_SET) == -1) {
190
+        throw new \Exception(sprintf('Could not seek to byte offset %d', $byteOffset));
191
+    }
192 192
 
193 193
 
194
-	while ($bytePool > 0) {
195
-		// How many bytes we request on this iteration
196
-		$chunkSizeRequested = min($bufferSize, $bytePool);
194
+    while ($bytePool > 0) {
195
+        // How many bytes we request on this iteration
196
+        $chunkSizeRequested = min($bufferSize, $bytePool);
197 197
 
198
-		// Try readin $chunkSizeRequested bytes from $handle and put data in $buffer
199
-		$buffer = fread($handle, $chunkSizeRequested);
198
+        // Try readin $chunkSizeRequested bytes from $handle and put data in $buffer
199
+        $buffer = fread($handle, $chunkSizeRequested);
200 200
 
201
-		// Store how many bytes were actually read
202
-		$chunkSizeActual = strlen($buffer);
201
+        // Store how many bytes were actually read
202
+        $chunkSizeActual = strlen($buffer);
203 203
 
204
-		// If we didn't get any bytes that means something unexpected has happened since $bytePool should be zero already
205
-		if ($chunkSizeActual == 0) {
206
-			// For production servers this should go in your php error log, since it will break the output
207
-			trigger_error('Chunksize became 0', E_USER_WARNING);
208
-			break;
209
-		}
204
+        // If we didn't get any bytes that means something unexpected has happened since $bytePool should be zero already
205
+        if ($chunkSizeActual == 0) {
206
+            // For production servers this should go in your php error log, since it will break the output
207
+            trigger_error('Chunksize became 0', E_USER_WARNING);
208
+            break;
209
+        }
210 210
 
211
-		// Decrease byte pool with amount of bytes that were read during this iteration
212
-		$bytePool -= $chunkSizeActual;
211
+        // Decrease byte pool with amount of bytes that were read during this iteration
212
+        $bytePool -= $chunkSizeActual;
213 213
 
214
-		// Write the buffer to output
215
-		print $buffer;
214
+        // Write the buffer to output
215
+        print $buffer;
216 216
 
217
-		// Try to output the data to the client immediately
218
-		flush();
219
-	}
217
+        // Try to output the data to the client immediately
218
+        flush();
219
+    }
220 220
 
221
-	exit();
221
+    exit();
222 222
 }
Please login to merge, or discard this patch.
ecrire/req/sqlite_generique.php 1 patch
Indentation   +1999 added lines, -1999 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  */
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 // TODO: get/set_caracteres ?
@@ -42,91 +42,91 @@  discard block
 block discarded – undo
42 42
  * @return array|bool
43 43
  */
44 44
 function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $sqlite_version = '') {
45
-	static $last_connect = [];
46
-
47
-	// si provient de selectdb
48
-	// un code pour etre sur que l'on vient de select_db()
49
-	if (strpos($db, $code = '@selectdb@') !== false) {
50
-		foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
51
-			$$a = $last_connect[$a];
52
-		}
53
-		$db = str_replace($code, '', $db);
54
-	}
55
-
56
-	/*
45
+    static $last_connect = [];
46
+
47
+    // si provient de selectdb
48
+    // un code pour etre sur que l'on vient de select_db()
49
+    if (strpos($db, $code = '@selectdb@') !== false) {
50
+        foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
51
+            $$a = $last_connect[$a];
52
+        }
53
+        $db = str_replace($code, '', $db);
54
+    }
55
+
56
+    /*
57 57
 	 * En sqlite, seule l'adresse du fichier est importante.
58 58
 	 * Ce sera $db le nom,
59 59
 	 * le path est $addr
60 60
 	 * (_DIR_DB si $addr est vide)
61 61
 	 */
62
-	_sqlite_init();
63
-
64
-	// determiner le dossier de la base : $addr ou _DIR_DB
65
-	$f = _DIR_DB;
66
-	if ($addr and strpos($addr, '/') !== false) {
67
-		$f = rtrim($addr, '/') . '/';
68
-	}
69
-
70
-	// un nom de base demande et impossible d'obtenir la base, on s'en va :
71
-	// il faut que la base existe ou que le repertoire parent soit writable
72
-	if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
73
-		spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
74
-
75
-		return false;
76
-	}
77
-
78
-	// charger les modules sqlite au besoin
79
-	if (!_sqlite_charger_version($sqlite_version)) {
80
-		spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
81
-
82
-		return false;
83
-	}
84
-
85
-	// chargement des constantes
86
-	// il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
87
-	$define = 'spip_sqlite' . $sqlite_version . '_constantes';
88
-	$define();
89
-
90
-	$ok = false;
91
-	if (!$db) {
92
-		// si pas de db ->
93
-		// base temporaire tant qu'on ne connait pas son vrai nom
94
-		// pour tester la connexion
95
-		$db = '_sqlite' . $sqlite_version . '_install';
96
-		$tmp = _DIR_DB . $db . '.sqlite';
97
-		$ok = $link = new \PDO("sqlite:$tmp");
98
-	} else {
99
-		// Ouvrir (eventuellement creer la base)
100
-		$ok = $link = new \PDO("sqlite:$f");
101
-	}
102
-
103
-	if (!$ok) {
104
-		$e = _sqlite_last_error_from_link($link);
105
-		spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
106
-
107
-		return false;
108
-	}
109
-
110
-	if ($link) {
111
-		$last_connect = [
112
-			'addr' => $addr,
113
-			'port' => $port,
114
-			'login' => $login,
115
-			'pass' => $pass,
116
-			'db' => $db,
117
-			'prefixe' => $prefixe,
118
-		];
119
-		// etre sur qu'on definit bien les fonctions a chaque nouvelle connexion
120
-		include_spip('req/sqlite_fonctions');
121
-		_sqlite_init_functions($link);
122
-	}
123
-
124
-	return [
125
-		'db' => $db,
126
-		'prefixe' => $prefixe ? $prefixe : $db,
127
-		'link' => $link,
128
-		'total_requetes' => 0,
129
-	];
62
+    _sqlite_init();
63
+
64
+    // determiner le dossier de la base : $addr ou _DIR_DB
65
+    $f = _DIR_DB;
66
+    if ($addr and strpos($addr, '/') !== false) {
67
+        $f = rtrim($addr, '/') . '/';
68
+    }
69
+
70
+    // un nom de base demande et impossible d'obtenir la base, on s'en va :
71
+    // il faut que la base existe ou que le repertoire parent soit writable
72
+    if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
73
+        spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
74
+
75
+        return false;
76
+    }
77
+
78
+    // charger les modules sqlite au besoin
79
+    if (!_sqlite_charger_version($sqlite_version)) {
80
+        spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
81
+
82
+        return false;
83
+    }
84
+
85
+    // chargement des constantes
86
+    // il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
87
+    $define = 'spip_sqlite' . $sqlite_version . '_constantes';
88
+    $define();
89
+
90
+    $ok = false;
91
+    if (!$db) {
92
+        // si pas de db ->
93
+        // base temporaire tant qu'on ne connait pas son vrai nom
94
+        // pour tester la connexion
95
+        $db = '_sqlite' . $sqlite_version . '_install';
96
+        $tmp = _DIR_DB . $db . '.sqlite';
97
+        $ok = $link = new \PDO("sqlite:$tmp");
98
+    } else {
99
+        // Ouvrir (eventuellement creer la base)
100
+        $ok = $link = new \PDO("sqlite:$f");
101
+    }
102
+
103
+    if (!$ok) {
104
+        $e = _sqlite_last_error_from_link($link);
105
+        spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
106
+
107
+        return false;
108
+    }
109
+
110
+    if ($link) {
111
+        $last_connect = [
112
+            'addr' => $addr,
113
+            'port' => $port,
114
+            'login' => $login,
115
+            'pass' => $pass,
116
+            'db' => $db,
117
+            'prefixe' => $prefixe,
118
+        ];
119
+        // etre sur qu'on definit bien les fonctions a chaque nouvelle connexion
120
+        include_spip('req/sqlite_fonctions');
121
+        _sqlite_init_functions($link);
122
+    }
123
+
124
+    return [
125
+        'db' => $db,
126
+        'prefixe' => $prefixe ? $prefixe : $db,
127
+        'link' => $link,
128
+        'total_requetes' => 0,
129
+    ];
130 130
 }
131 131
 
132 132
 
@@ -145,14 +145,14 @@  discard block
 block discarded – undo
145 145
  *    Resultat de la requete
146 146
  */
147 147
 function spip_sqlite_query($query, $serveur = '', $requeter = true) {
148
-	#spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
149
-	#_sqlite_init(); // fait la premiere fois dans spip_sqlite
150
-	$query = spip_sqlite::traduire_requete($query, $serveur);
151
-	if (!$requeter) {
152
-		return $query;
153
-	}
148
+    #spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
149
+    #_sqlite_init(); // fait la premiere fois dans spip_sqlite
150
+    $query = spip_sqlite::traduire_requete($query, $serveur);
151
+    if (!$requeter) {
152
+        return $query;
153
+    }
154 154
 
155
-	return spip_sqlite::executer_requete($query, $serveur);
155
+    return spip_sqlite::executer_requete($query, $serveur);
156 156
 }
157 157
 
158 158
 
@@ -169,11 +169,11 @@  discard block
 block discarded – undo
169 169
  */
170 170
 function spip_sqlite_alter($query, $serveur = '', $requeter = true) {
171 171
 
172
-	$query = spip_sqlite_query("ALTER $query", $serveur, false);
173
-	// traduire la requete pour recuperer les bons noms de table
174
-	$query = spip_sqlite::traduire_requete($query, $serveur);
172
+    $query = spip_sqlite_query("ALTER $query", $serveur, false);
173
+    // traduire la requete pour recuperer les bons noms de table
174
+    $query = spip_sqlite::traduire_requete($query, $serveur);
175 175
 
176
-	/*
176
+    /*
177 177
 		 * la il faut faire les transformations
178 178
 		 * si ALTER TABLE x (DROP|CHANGE) y
179 179
 		 *
@@ -182,251 +182,251 @@  discard block
 block discarded – undo
182 182
 		 * 3) faire chaque requete independemment
183 183
 		 */
184 184
 
185
-	// 1
186
-	if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
187
-		$debut = $regs[1];
188
-		$table = $regs[3];
189
-		$suite = $regs[4];
190
-	} else {
191
-		spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
192
-
193
-		return false;
194
-	}
195
-
196
-	// 2
197
-	// il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
198
-	// tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
199
-	// ou revoir l'api de sql_alter en creant un
200
-	// sql_alter_table($table,array($actions));
201
-	$todo = explode(',', $suite);
202
-
203
-	// on remet les morceaux dechires ensembles... que c'est laid !
204
-	$todo2 = [];
205
-	$i = 0;
206
-	$ouverte = false;
207
-	while ($do = array_shift($todo)) {
208
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
209
-		$o = (false !== strpos($do, '('));
210
-		$f = (false !== strpos($do, ')'));
211
-		if ($o and !$f) {
212
-			$ouverte = true;
213
-		} elseif ($f) {
214
-			$ouverte = false;
215
-		}
216
-		if (!$ouverte) {
217
-			$i++;
218
-		}
219
-	}
220
-
221
-	// 3
222
-	$resultats = [];
223
-	foreach ($todo2 as $do) {
224
-		$do = trim($do);
225
-		if (
226
-			!preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
227
-			. '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
228
-			. '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
229
-			. '|ADD COLUMN|ADD'
230
-			. ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
231
-		) {
232
-			spip_log(
233
-				"SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
234
-				'sqlite.' . _LOG_ERREUR
235
-			);
236
-
237
-			return false;
238
-		}
239
-
240
-		$cle = strtoupper($matches[1]);
241
-		$colonne_origine = $matches[2];
242
-		$colonne_destination = '';
243
-
244
-		$def = $matches[3];
245
-
246
-		// eluder une eventuelle clause before|after|first inutilisable
247
-		$defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
248
-		$defo = $defr; // garder la def d'origine pour certains cas
249
-		// remplacer les definitions venant de mysql
250
-		$defr = _sqlite_remplacements_definitions_table($defr);
251
-
252
-		// reinjecter dans le do
253
-		$do = str_replace($def, $defr, $do);
254
-		$def = $defr;
255
-
256
-		switch ($cle) {
257
-			// suppression d'un index
258
-			case 'DROP KEY':
259
-			case 'DROP INDEX':
260
-				$nom_index = $colonne_origine;
261
-				spip_sqlite_drop_index($nom_index, $table, $serveur);
262
-				break;
263
-
264
-			// suppression d'une pk
265
-			case 'DROP PRIMARY KEY':
266
-				if (
267
-					!_sqlite_modifier_table(
268
-						$table,
269
-						$colonne_origine,
270
-						['key' => ['PRIMARY KEY' => '']],
271
-						$serveur
272
-					)
273
-				) {
274
-					return false;
275
-				}
276
-				break;
277
-			// suppression d'une colonne
278
-			case 'DROP COLUMN':
279
-			case 'DROP':
280
-				if (
281
-					!_sqlite_modifier_table(
282
-						$table,
283
-						[$colonne_origine => ''],
284
-						[],
285
-						$serveur
286
-					)
287
-				) {
288
-					return false;
289
-				}
290
-				break;
291
-
292
-			case 'CHANGE COLUMN':
293
-			case 'CHANGE':
294
-				// recuperer le nom de la future colonne
295
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
296
-				// en tenant compte de la cle primaire (ce qui est mieux)
297
-				$def = trim($defo);
298
-				$colonne_destination = substr($def, 0, strpos($def, ' '));
299
-				$def = substr($def, strlen($colonne_destination) + 1);
300
-
301
-				if (
302
-					!_sqlite_modifier_table(
303
-						$table,
304
-						[$colonne_origine => $colonne_destination],
305
-						['field' => [$colonne_destination => $def]],
306
-						$serveur
307
-					)
308
-				) {
309
-					return false;
310
-				}
311
-				break;
312
-
313
-			case 'MODIFY':
314
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
315
-				// en tenant compte de la cle primaire (ce qui est mieux)
316
-				if (
317
-					!_sqlite_modifier_table(
318
-						$table,
319
-						$colonne_origine,
320
-						['field' => [$colonne_origine => $defo]],
321
-						$serveur
322
-					)
323
-				) {
324
-					return false;
325
-				}
326
-				break;
327
-
328
-			// pas geres en sqlite2
329
-			case 'RENAME':
330
-				$do = 'RENAME TO' . substr($do, 6);
331
-			case 'RENAME TO':
332
-				if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
333
-					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
334
-
335
-					return false;
336
-				}
337
-				break;
338
-
339
-			// ajout d'une pk
340
-			case 'ADD PRIMARY KEY':
341
-				$pk = trim(substr($do, 16));
342
-				$pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
343
-				if (
344
-					!_sqlite_modifier_table(
345
-						$table,
346
-						$colonne_origine,
347
-						['key' => ['PRIMARY KEY' => $pk]],
348
-						$serveur
349
-					)
350
-				) {
351
-					return false;
352
-				}
353
-				break;
354
-			// ajout d'un index
355
-			case 'ADD UNIQUE KEY':
356
-			case 'ADD UNIQUE':
357
-				$unique = true;
358
-			case 'ADD INDEX':
359
-			case 'ADD KEY':
360
-				if (!isset($unique)) {
361
-					$unique = false;
362
-				}
363
-				// peut etre "(colonne)" ou "nom_index (colonnes)"
364
-				// bug potentiel si qqn met "(colonne, colonne)"
365
-				//
366
-				// nom_index (colonnes)
367
-				if ($def) {
368
-					$colonnes = substr($def, 1, -1);
369
-					$nom_index = $colonne_origine;
370
-				} else {
371
-					// (colonne)
372
-					if ($colonne_origine[0] == '(') {
373
-						$colonnes = substr($colonne_origine, 1, -1);
374
-						if (false !== strpos(',', $colonnes)) {
375
-							spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
376
-								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
377
-							break;
378
-						} else {
379
-							$nom_index = $colonnes;
380
-						}
381
-					} // nom_index
382
-					else {
383
-						$nom_index = $colonnes = $colonne_origine;
384
-					}
385
-				}
386
-				spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
387
-				break;
388
-
389
-			// pas geres en sqlite2
390
-			case 'ADD COLUMN':
391
-				$do = 'ADD' . substr($do, 10);
392
-			case 'ADD':
393
-			default:
394
-				if (!preg_match(',primary\s+key,i', $do)) {
395
-					if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
396
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
397
-
398
-						return false;
399
-					}
400
-					break;
401
-				}
402
-				// ou si la colonne est aussi primary key
403
-				// cas du add id_truc int primary key
404
-				// ajout d'une colonne qui passe en primary key directe
405
-				else {
406
-					$def = trim(substr($do, 3));
407
-					$colonne_ajoutee = substr($def, 0, strpos($def, ' '));
408
-					$def = substr($def, strlen($colonne_ajoutee) + 1);
409
-					$opts = [];
410
-					if (preg_match(',primary\s+key,i', $def)) {
411
-						$opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
412
-						$def = preg_replace(',primary\s+key,i', '', $def);
413
-					}
414
-					$opts['field'] = [$colonne_ajoutee => $def];
415
-					if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
416
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
417
-
418
-						return false;
419
-					}
420
-				}
421
-				break;
422
-		}
423
-		// tout est bon, ouf !
424
-		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
425
-	}
426
-
427
-	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
428
-
429
-	return true;
185
+    // 1
186
+    if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
187
+        $debut = $regs[1];
188
+        $table = $regs[3];
189
+        $suite = $regs[4];
190
+    } else {
191
+        spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
192
+
193
+        return false;
194
+    }
195
+
196
+    // 2
197
+    // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
198
+    // tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
199
+    // ou revoir l'api de sql_alter en creant un
200
+    // sql_alter_table($table,array($actions));
201
+    $todo = explode(',', $suite);
202
+
203
+    // on remet les morceaux dechires ensembles... que c'est laid !
204
+    $todo2 = [];
205
+    $i = 0;
206
+    $ouverte = false;
207
+    while ($do = array_shift($todo)) {
208
+        $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
209
+        $o = (false !== strpos($do, '('));
210
+        $f = (false !== strpos($do, ')'));
211
+        if ($o and !$f) {
212
+            $ouverte = true;
213
+        } elseif ($f) {
214
+            $ouverte = false;
215
+        }
216
+        if (!$ouverte) {
217
+            $i++;
218
+        }
219
+    }
220
+
221
+    // 3
222
+    $resultats = [];
223
+    foreach ($todo2 as $do) {
224
+        $do = trim($do);
225
+        if (
226
+            !preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
227
+            . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
228
+            . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
229
+            . '|ADD COLUMN|ADD'
230
+            . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
231
+        ) {
232
+            spip_log(
233
+                "SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
234
+                'sqlite.' . _LOG_ERREUR
235
+            );
236
+
237
+            return false;
238
+        }
239
+
240
+        $cle = strtoupper($matches[1]);
241
+        $colonne_origine = $matches[2];
242
+        $colonne_destination = '';
243
+
244
+        $def = $matches[3];
245
+
246
+        // eluder une eventuelle clause before|after|first inutilisable
247
+        $defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
248
+        $defo = $defr; // garder la def d'origine pour certains cas
249
+        // remplacer les definitions venant de mysql
250
+        $defr = _sqlite_remplacements_definitions_table($defr);
251
+
252
+        // reinjecter dans le do
253
+        $do = str_replace($def, $defr, $do);
254
+        $def = $defr;
255
+
256
+        switch ($cle) {
257
+            // suppression d'un index
258
+            case 'DROP KEY':
259
+            case 'DROP INDEX':
260
+                $nom_index = $colonne_origine;
261
+                spip_sqlite_drop_index($nom_index, $table, $serveur);
262
+                break;
263
+
264
+            // suppression d'une pk
265
+            case 'DROP PRIMARY KEY':
266
+                if (
267
+                    !_sqlite_modifier_table(
268
+                        $table,
269
+                        $colonne_origine,
270
+                        ['key' => ['PRIMARY KEY' => '']],
271
+                        $serveur
272
+                    )
273
+                ) {
274
+                    return false;
275
+                }
276
+                break;
277
+            // suppression d'une colonne
278
+            case 'DROP COLUMN':
279
+            case 'DROP':
280
+                if (
281
+                    !_sqlite_modifier_table(
282
+                        $table,
283
+                        [$colonne_origine => ''],
284
+                        [],
285
+                        $serveur
286
+                    )
287
+                ) {
288
+                    return false;
289
+                }
290
+                break;
291
+
292
+            case 'CHANGE COLUMN':
293
+            case 'CHANGE':
294
+                // recuperer le nom de la future colonne
295
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
296
+                // en tenant compte de la cle primaire (ce qui est mieux)
297
+                $def = trim($defo);
298
+                $colonne_destination = substr($def, 0, strpos($def, ' '));
299
+                $def = substr($def, strlen($colonne_destination) + 1);
300
+
301
+                if (
302
+                    !_sqlite_modifier_table(
303
+                        $table,
304
+                        [$colonne_origine => $colonne_destination],
305
+                        ['field' => [$colonne_destination => $def]],
306
+                        $serveur
307
+                    )
308
+                ) {
309
+                    return false;
310
+                }
311
+                break;
312
+
313
+            case 'MODIFY':
314
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
315
+                // en tenant compte de la cle primaire (ce qui est mieux)
316
+                if (
317
+                    !_sqlite_modifier_table(
318
+                        $table,
319
+                        $colonne_origine,
320
+                        ['field' => [$colonne_origine => $defo]],
321
+                        $serveur
322
+                    )
323
+                ) {
324
+                    return false;
325
+                }
326
+                break;
327
+
328
+            // pas geres en sqlite2
329
+            case 'RENAME':
330
+                $do = 'RENAME TO' . substr($do, 6);
331
+            case 'RENAME TO':
332
+                if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
333
+                    spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
334
+
335
+                    return false;
336
+                }
337
+                break;
338
+
339
+            // ajout d'une pk
340
+            case 'ADD PRIMARY KEY':
341
+                $pk = trim(substr($do, 16));
342
+                $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
343
+                if (
344
+                    !_sqlite_modifier_table(
345
+                        $table,
346
+                        $colonne_origine,
347
+                        ['key' => ['PRIMARY KEY' => $pk]],
348
+                        $serveur
349
+                    )
350
+                ) {
351
+                    return false;
352
+                }
353
+                break;
354
+            // ajout d'un index
355
+            case 'ADD UNIQUE KEY':
356
+            case 'ADD UNIQUE':
357
+                $unique = true;
358
+            case 'ADD INDEX':
359
+            case 'ADD KEY':
360
+                if (!isset($unique)) {
361
+                    $unique = false;
362
+                }
363
+                // peut etre "(colonne)" ou "nom_index (colonnes)"
364
+                // bug potentiel si qqn met "(colonne, colonne)"
365
+                //
366
+                // nom_index (colonnes)
367
+                if ($def) {
368
+                    $colonnes = substr($def, 1, -1);
369
+                    $nom_index = $colonne_origine;
370
+                } else {
371
+                    // (colonne)
372
+                    if ($colonne_origine[0] == '(') {
373
+                        $colonnes = substr($colonne_origine, 1, -1);
374
+                        if (false !== strpos(',', $colonnes)) {
375
+                            spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
376
+                                . " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
377
+                            break;
378
+                        } else {
379
+                            $nom_index = $colonnes;
380
+                        }
381
+                    } // nom_index
382
+                    else {
383
+                        $nom_index = $colonnes = $colonne_origine;
384
+                    }
385
+                }
386
+                spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
387
+                break;
388
+
389
+            // pas geres en sqlite2
390
+            case 'ADD COLUMN':
391
+                $do = 'ADD' . substr($do, 10);
392
+            case 'ADD':
393
+            default:
394
+                if (!preg_match(',primary\s+key,i', $do)) {
395
+                    if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
396
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
397
+
398
+                        return false;
399
+                    }
400
+                    break;
401
+                }
402
+                // ou si la colonne est aussi primary key
403
+                // cas du add id_truc int primary key
404
+                // ajout d'une colonne qui passe en primary key directe
405
+                else {
406
+                    $def = trim(substr($do, 3));
407
+                    $colonne_ajoutee = substr($def, 0, strpos($def, ' '));
408
+                    $def = substr($def, strlen($colonne_ajoutee) + 1);
409
+                    $opts = [];
410
+                    if (preg_match(',primary\s+key,i', $def)) {
411
+                        $opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
412
+                        $def = preg_replace(',primary\s+key,i', '', $def);
413
+                    }
414
+                    $opts['field'] = [$colonne_ajoutee => $def];
415
+                    if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
416
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
417
+
418
+                        return false;
419
+                    }
420
+                }
421
+                break;
422
+        }
423
+        // tout est bon, ouf !
424
+        spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
425
+    }
426
+
427
+    spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
428
+
429
+    return true;
430 430
 }
431 431
 
432 432
 
@@ -449,38 +449,38 @@  discard block
 block discarded – undo
449 449
  *     - true si la requête réussie, false sinon.
450 450
  */
451 451
 function spip_sqlite_create(
452
-	$nom,
453
-	$champs,
454
-	$cles,
455
-	$autoinc = false,
456
-	$temporary = false,
457
-	$serveur = '',
458
-	$requeter = true
452
+    $nom,
453
+    $champs,
454
+    $cles,
455
+    $autoinc = false,
456
+    $temporary = false,
457
+    $serveur = '',
458
+    $requeter = true
459 459
 ) {
460
-	$query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
461
-	if (!$query) {
462
-		return false;
463
-	}
464
-	$res = spip_sqlite_query($query, $serveur, $requeter);
465
-
466
-	// SQLite ne cree pas les KEY sur les requetes CREATE TABLE
467
-	// il faut donc les faire creer ensuite
468
-	if (!$requeter) {
469
-		return $res;
470
-	}
471
-
472
-	$ok = $res ? true : false;
473
-	if ($ok) {
474
-		foreach ($cles as $k => $v) {
475
-			if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
476
-				$index = trim(substr($k, strlen($m[1])));
477
-				$unique = (strlen($m[1]) > 3);
478
-				$ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
479
-			}
480
-		}
481
-	}
482
-
483
-	return $ok ? true : false;
460
+    $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
461
+    if (!$query) {
462
+        return false;
463
+    }
464
+    $res = spip_sqlite_query($query, $serveur, $requeter);
465
+
466
+    // SQLite ne cree pas les KEY sur les requetes CREATE TABLE
467
+    // il faut donc les faire creer ensuite
468
+    if (!$requeter) {
469
+        return $res;
470
+    }
471
+
472
+    $ok = $res ? true : false;
473
+    if ($ok) {
474
+        foreach ($cles as $k => $v) {
475
+            if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
476
+                $index = trim(substr($k, strlen($m[1])));
477
+                $unique = (strlen($m[1]) > 3);
478
+                $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
479
+            }
480
+        }
481
+    }
482
+
483
+    return $ok ? true : false;
484 484
 }
485 485
 
486 486
 /**
@@ -493,21 +493,21 @@  discard block
 block discarded – undo
493 493
  * @return bool true si la base est créee.
494 494
  **/
495 495
 function spip_sqlite_create_base($nom, $serveur = '', $option = true) {
496
-	$f = $nom . '.sqlite';
497
-	if (strpos($nom, '/') === false) {
498
-		$f = _DIR_DB . $f;
499
-	}
496
+    $f = $nom . '.sqlite';
497
+    if (strpos($nom, '/') === false) {
498
+        $f = _DIR_DB . $f;
499
+    }
500 500
 
501
-	$ok = new \PDO("sqlite:$f");
501
+    $ok = new \PDO("sqlite:$f");
502 502
 
503
-	if ($ok) {
504
-		unset($ok);
503
+    if ($ok) {
504
+        unset($ok);
505 505
 
506
-		return true;
507
-	}
508
-	unset($ok);
506
+        return true;
507
+    }
508
+    unset($ok);
509 509
 
510
-	return false;
510
+    return false;
511 511
 }
512 512
 
513 513
 
@@ -528,22 +528,22 @@  discard block
 block discarded – undo
528 528
  *     - string texte de la requête si $requeter vaut false
529 529
  */
530 530
 function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true) {
531
-	if (!$query_select) {
532
-		return false;
533
-	}
534
-	// vue deja presente
535
-	if (sql_showtable($nom, false, $serveur)) {
536
-		spip_log(
537
-			"Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
538
-			'sqlite.' . _LOG_ERREUR
539
-		);
531
+    if (!$query_select) {
532
+        return false;
533
+    }
534
+    // vue deja presente
535
+    if (sql_showtable($nom, false, $serveur)) {
536
+        spip_log(
537
+            "Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
538
+            'sqlite.' . _LOG_ERREUR
539
+        );
540 540
 
541
-		return false;
542
-	}
541
+        return false;
542
+    }
543 543
 
544
-	$query = "CREATE VIEW $nom AS " . $query_select;
544
+    $query = "CREATE VIEW $nom AS " . $query_select;
545 545
 
546
-	return spip_sqlite_query($query, $serveur, $requeter);
546
+    return spip_sqlite_query($query, $serveur, $requeter);
547 547
 }
548 548
 
549 549
 /**
@@ -565,54 +565,54 @@  discard block
 block discarded – undo
565 565
  *    string : requête, false si erreur, true sinon.
566 566
  */
567 567
 function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true) {
568
-	if (!($nom or $table or $champs)) {
569
-		spip_log(
570
-			"Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
571
-			'sqlite.' . _LOG_ERREUR
572
-		);
573
-
574
-		return false;
575
-	}
576
-
577
-	// SQLite ne differentie pas noms des index en fonction des tables
578
-	// il faut donc creer des noms uniques d'index pour une base sqlite
579
-	$nom = $table . '_' . $nom;
580
-	// enlever d'eventuelles parentheses deja presentes sur champs
581
-	if (!is_array($champs)) {
582
-		if ($champs[0] == '(') {
583
-			$champs = substr($champs, 1, -1);
584
-		}
585
-		$champs = [$champs];
586
-		// supprimer l'info de longueur d'index mysql en fin de champ
587
-		$champs = preg_replace(',\(\d+\)$,', '', $champs);
588
-	}
589
-
590
-	$ifnotexists = '';
591
-	$version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
592
-	if (!function_exists('spip_version_compare')) {
593
-		include_spip('plugins/installer');
594
-	}
595
-
596
-	if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
597
-		$ifnotexists = ' IF NOT EXISTS';
598
-	} else {
599
-		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
600
-		$a = spip_sqlite_showtable($table, $serveur);
601
-		if (isset($a['key']['KEY ' . $nom])) {
602
-			return true;
603
-		}
604
-	}
605
-
606
-	$query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
607
-	$res = spip_sqlite_query($query, $serveur, $requeter);
608
-	if (!$requeter) {
609
-		return $res;
610
-	}
611
-	if ($res) {
612
-		return true;
613
-	} else {
614
-		return false;
615
-	}
568
+    if (!($nom or $table or $champs)) {
569
+        spip_log(
570
+            "Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
571
+            'sqlite.' . _LOG_ERREUR
572
+        );
573
+
574
+        return false;
575
+    }
576
+
577
+    // SQLite ne differentie pas noms des index en fonction des tables
578
+    // il faut donc creer des noms uniques d'index pour une base sqlite
579
+    $nom = $table . '_' . $nom;
580
+    // enlever d'eventuelles parentheses deja presentes sur champs
581
+    if (!is_array($champs)) {
582
+        if ($champs[0] == '(') {
583
+            $champs = substr($champs, 1, -1);
584
+        }
585
+        $champs = [$champs];
586
+        // supprimer l'info de longueur d'index mysql en fin de champ
587
+        $champs = preg_replace(',\(\d+\)$,', '', $champs);
588
+    }
589
+
590
+    $ifnotexists = '';
591
+    $version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
592
+    if (!function_exists('spip_version_compare')) {
593
+        include_spip('plugins/installer');
594
+    }
595
+
596
+    if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
597
+        $ifnotexists = ' IF NOT EXISTS';
598
+    } else {
599
+        /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
600
+        $a = spip_sqlite_showtable($table, $serveur);
601
+        if (isset($a['key']['KEY ' . $nom])) {
602
+            return true;
603
+        }
604
+    }
605
+
606
+    $query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
607
+    $res = spip_sqlite_query($query, $serveur, $requeter);
608
+    if (!$requeter) {
609
+        return $res;
610
+    }
611
+    if ($res) {
612
+        return true;
613
+    } else {
614
+        return false;
615
+    }
616 616
 }
617 617
 
618 618
 /**
@@ -629,31 +629,31 @@  discard block
 block discarded – undo
629 629
  * @return int                 Nombre de lignes
630 630
  */
631 631
 function spip_sqlite_count($r, $serveur = '', $requeter = true) {
632
-	if (!$r) {
633
-		return 0;
634
-	}
635
-
636
-	// select ou autre (insert, update,...) ?
637
-	// (link,requete) a compter
638
-	if (is_array($r->spipSqliteRowCount)) {
639
-		list($link, $query) = $r->spipSqliteRowCount;
640
-		// amelioration possible a tester intensivement : pas de order by pour compter !
641
-		// $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
642
-		$query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
643
-		$l = $link->query($query);
644
-		$i = 0;
645
-		if ($l and $z = $l->fetch()) {
646
-			$i = $z['zzzzsqlitecount'];
647
-		}
648
-		$r->spipSqliteRowCount = $i;
649
-	}
650
-	if (isset($r->spipSqliteRowCount)) {
651
-		// Ce compte est faux s'il y a des limit dans la requete :(
652
-		// il retourne le nombre d'enregistrements sans le limit
653
-		return $r->spipSqliteRowCount;
654
-	} else {
655
-		return $r->rowCount();
656
-	}
632
+    if (!$r) {
633
+        return 0;
634
+    }
635
+
636
+    // select ou autre (insert, update,...) ?
637
+    // (link,requete) a compter
638
+    if (is_array($r->spipSqliteRowCount)) {
639
+        list($link, $query) = $r->spipSqliteRowCount;
640
+        // amelioration possible a tester intensivement : pas de order by pour compter !
641
+        // $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
642
+        $query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
643
+        $l = $link->query($query);
644
+        $i = 0;
645
+        if ($l and $z = $l->fetch()) {
646
+            $i = $z['zzzzsqlitecount'];
647
+        }
648
+        $r->spipSqliteRowCount = $i;
649
+    }
650
+    if (isset($r->spipSqliteRowCount)) {
651
+        // Ce compte est faux s'il y a des limit dans la requete :(
652
+        // il retourne le nombre d'enregistrements sans le limit
653
+        return $r->spipSqliteRowCount;
654
+    } else {
655
+        return $r->rowCount();
656
+    }
657 657
 }
658 658
 
659 659
 
@@ -672,30 +672,30 @@  discard block
 block discarded – undo
672 672
  *     - false si la requête a échouée
673 673
  **/
674 674
 function spip_sqlite_countsel(
675
-	$from = [],
676
-	$where = [],
677
-	$groupby = '',
678
-	$having = [],
679
-	$serveur = '',
680
-	$requeter = true
675
+    $from = [],
676
+    $where = [],
677
+    $groupby = '',
678
+    $having = [],
679
+    $serveur = '',
680
+    $requeter = true
681 681
 ) {
682
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
683
-	$r = spip_sqlite_select(
684
-		"COUNT($c)",
685
-		$from,
686
-		$where,
687
-		'',
688
-		'',
689
-		'',
690
-		$having,
691
-		$serveur,
692
-		$requeter
693
-	);
694
-	if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
695
-		list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
696
-	}
697
-
698
-	return $r;
682
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
683
+    $r = spip_sqlite_select(
684
+        "COUNT($c)",
685
+        $from,
686
+        $where,
687
+        '',
688
+        '',
689
+        '',
690
+        $having,
691
+        $serveur,
692
+        $requeter
693
+    );
694
+    if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
695
+        list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
696
+    }
697
+
698
+    return $r;
699 699
 }
700 700
 
701 701
 
@@ -712,24 +712,24 @@  discard block
 block discarded – undo
712 712
  *     - False en cas d'erreur.
713 713
  **/
714 714
 function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true) {
715
-	$res = spip_sqlite_query(
716
-		_sqlite_calculer_expression('DELETE FROM', $table, ',')
717
-		. _sqlite_calculer_expression('WHERE', $where),
718
-		$serveur,
719
-		$requeter
720
-	);
715
+    $res = spip_sqlite_query(
716
+        _sqlite_calculer_expression('DELETE FROM', $table, ',')
717
+        . _sqlite_calculer_expression('WHERE', $where),
718
+        $serveur,
719
+        $requeter
720
+    );
721 721
 
722
-	// renvoyer la requete inerte si demandee
723
-	if (!$requeter) {
724
-		return $res;
725
-	}
722
+    // renvoyer la requete inerte si demandee
723
+    if (!$requeter) {
724
+        return $res;
725
+    }
726 726
 
727
-	if ($res) {
728
-		$link = _sqlite_link($serveur);
729
-		return $res->rowCount();
730
-	} else {
731
-		return false;
732
-	}
727
+    if ($res) {
728
+        $link = _sqlite_link($serveur);
729
+        return $res->rowCount();
730
+    } else {
731
+        return false;
732
+    }
733 733
 }
734 734
 
735 735
 
@@ -745,15 +745,15 @@  discard block
 block discarded – undo
745 745
  *     - true si la requête a réussie, false sinon
746 746
  */
747 747
 function spip_sqlite_drop_table($table, $exist = '', $serveur = '', $requeter = true) {
748
-	if ($exist) {
749
-		$exist = ' IF EXISTS';
750
-	}
748
+    if ($exist) {
749
+        $exist = ' IF EXISTS';
750
+    }
751 751
 
752
-	if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
753
-		return true;
754
-	} else {
755
-		return false;
756
-	}
752
+    if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
753
+        return true;
754
+    } else {
755
+        return false;
756
+    }
757 757
 }
758 758
 
759 759
 
@@ -769,11 +769,11 @@  discard block
 block discarded – undo
769 769
  *     - true si la requête a réussie, false sinon
770 770
  */
771 771
 function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = true) {
772
-	if ($exist) {
773
-		$exist = ' IF EXISTS';
774
-	}
772
+    if ($exist) {
773
+        $exist = ' IF EXISTS';
774
+    }
775 775
 
776
-	return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
776
+    return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
777 777
 }
778 778
 
779 779
 /**
@@ -787,20 +787,20 @@  discard block
 block discarded – undo
787 787
  * @return bool ou requete
788 788
  */
789 789
 function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true) {
790
-	if (!($nom or $table)) {
791
-		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
790
+    if (!($nom or $table)) {
791
+        spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
792 792
 
793
-		return false;
794
-	}
793
+        return false;
794
+    }
795 795
 
796
-	// SQLite ne differentie pas noms des index en fonction des tables
797
-	// il faut donc creer des noms uniques d'index pour une base sqlite
798
-	$index = $table . '_' . $nom;
799
-	$exist = ' IF EXISTS';
796
+    // SQLite ne differentie pas noms des index en fonction des tables
797
+    // il faut donc creer des noms uniques d'index pour une base sqlite
798
+    $index = $table . '_' . $nom;
799
+    $exist = ' IF EXISTS';
800 800
 
801
-	$query = "DROP INDEX$exist $index";
801
+    $query = "DROP INDEX$exist $index";
802 802
 
803
-	return spip_sqlite_query($query, $serveur, $requeter);
803
+    return spip_sqlite_query($query, $serveur, $requeter);
804 804
 }
805 805
 
806 806
 /**
@@ -816,28 +816,28 @@  discard block
 block discarded – undo
816 816
  *     Erreur eventuelle
817 817
  **/
818 818
 function spip_sqlite_error($query = '', $serveur = '') {
819
-	$link = _sqlite_link($serveur);
819
+    $link = _sqlite_link($serveur);
820 820
 
821
-	if ($link) {
822
-		$errs = $link->errorInfo();
823
-		$s = _sqlite_last_error_from_link($link);
824
-	} else {
825
-		$s = ': aucune ressource sqlite (link)';
826
-	}
827
-	if ($s) {
828
-		$trace = debug_backtrace();
829
-		if ($trace[0]['function'] != 'spip_sqlite_error') {
830
-			spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
831
-		}
832
-	}
821
+    if ($link) {
822
+        $errs = $link->errorInfo();
823
+        $s = _sqlite_last_error_from_link($link);
824
+    } else {
825
+        $s = ': aucune ressource sqlite (link)';
826
+    }
827
+    if ($s) {
828
+        $trace = debug_backtrace();
829
+        if ($trace[0]['function'] != 'spip_sqlite_error') {
830
+            spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
831
+        }
832
+    }
833 833
 
834
-	return $s;
834
+    return $s;
835 835
 }
836 836
 
837 837
 function _sqlite_last_error_from_link($link) {
838
-	if ($link) {
839
-		$errs = $link->errorInfo();
840
-		/*
838
+    if ($link) {
839
+        $errs = $link->errorInfo();
840
+        /*
841 841
 			$errs[0]
842 842
 				numero SQLState ('HY000' souvent lors d'une erreur)
843 843
 				http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html
@@ -847,11 +847,11 @@  discard block
 block discarded – undo
847 847
 			$errs[2]
848 848
 				Le texte du message d'erreur
849 849
 		*/
850
-		if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
851
-			return "$errs[2]";
852
-		}
853
-	}
854
-	return '';
850
+        if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
851
+            return "$errs[2]";
852
+        }
853
+    }
854
+    return '';
855 855
 }
856 856
 
857 857
 /**
@@ -868,23 +868,23 @@  discard block
 block discarded – undo
868 868
  *    'HY000/1' : numéro de l'erreur SQLState / numéro d'erreur interne SQLite (en sqlite 3)
869 869
  **/
870 870
 function spip_sqlite_errno($serveur = '') {
871
-	$link = _sqlite_link($serveur);
871
+    $link = _sqlite_link($serveur);
872 872
 
873
-	if ($link) {
874
-		$t = $link->errorInfo();
875
-		$s = ltrim($t[0], '0'); // 00000 si pas d'erreur
876
-		if ($s) {
877
-			$s .= ' / ' . $t[1];
878
-		} // ajoute l'erreur du moteur SQLite
879
-	} else {
880
-		$s = ': aucune ressource sqlite (link)';
881
-	}
873
+    if ($link) {
874
+        $t = $link->errorInfo();
875
+        $s = ltrim($t[0], '0'); // 00000 si pas d'erreur
876
+        if ($s) {
877
+            $s .= ' / ' . $t[1];
878
+        } // ajoute l'erreur du moteur SQLite
879
+    } else {
880
+        $s = ': aucune ressource sqlite (link)';
881
+    }
882 882
 
883
-	if ($s) {
884
-		spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
885
-	}
883
+    if ($s) {
884
+        spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
885
+    }
886 886
 
887
-	return $s ? $s : 0;
887
+    return $s ? $s : 0;
888 888
 }
889 889
 
890 890
 
@@ -900,19 +900,19 @@  discard block
 block discarded – undo
900 900
  *     - false si on a pas pu avoir d'explication
901 901
  */
902 902
 function spip_sqlite_explain($query, $serveur = '', $requeter = true) {
903
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
904
-		return [];
905
-	}
903
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
904
+        return [];
905
+    }
906 906
 
907
-	$query = spip_sqlite::traduire_requete($query, $serveur);
908
-	$query = 'EXPLAIN ' . $query;
909
-	if (!$requeter) {
910
-		return $query;
911
-	}
912
-	// on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
913
-	$r = spip_sqlite::executer_requete($query, $serveur, false);
907
+    $query = spip_sqlite::traduire_requete($query, $serveur);
908
+    $query = 'EXPLAIN ' . $query;
909
+    if (!$requeter) {
910
+        return $query;
911
+    }
912
+    // on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
913
+    $r = spip_sqlite::executer_requete($query, $serveur, false);
914 914
 
915
-	return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
915
+    return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
916 916
 }
917 917
 
918 918
 
@@ -929,30 +929,30 @@  discard block
 block discarded – undo
929 929
  */
930 930
 function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true) {
931 931
 
932
-	$link = _sqlite_link($serveur);
933
-	$t = $t ? $t : SPIP_SQLITE3_ASSOC;
932
+    $link = _sqlite_link($serveur);
933
+    $t = $t ? $t : SPIP_SQLITE3_ASSOC;
934 934
 
935
-	$retour = false;
936
-	if ($r) {
937
-		$retour = $r->fetch($t);
938
-	}
935
+    $retour = false;
936
+    if ($r) {
937
+        $retour = $r->fetch($t);
938
+    }
939 939
 
940
-	// Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
941
-	// suppression de 'table.' pour toutes les cles (c'est un peu violent !)
942
-	// c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
943
-	if (
944
-		$retour
945
-		and strpos(implode('', array_keys($retour)), '.') !== false
946
-	) {
947
-		foreach ($retour as $cle => $val) {
948
-			if (($pos = strpos($cle, '.')) !== false) {
949
-				$retour[substr($cle, $pos + 1)] = &$retour[$cle];
950
-				unset($retour[$cle]);
951
-			}
952
-		}
953
-	}
940
+    // Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
941
+    // suppression de 'table.' pour toutes les cles (c'est un peu violent !)
942
+    // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
943
+    if (
944
+        $retour
945
+        and strpos(implode('', array_keys($retour)), '.') !== false
946
+    ) {
947
+        foreach ($retour as $cle => $val) {
948
+            if (($pos = strpos($cle, '.')) !== false) {
949
+                $retour[substr($cle, $pos + 1)] = &$retour[$cle];
950
+                unset($retour[$cle]);
951
+            }
952
+        }
953
+    }
954 954
 
955
-	return $retour;
955
+    return $retour;
956 956
 }
957 957
 
958 958
 /**
@@ -965,8 +965,8 @@  discard block
 block discarded – undo
965 965
  * @return bool True si déplacement réussi, false sinon.
966 966
  **/
967 967
 function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true) {
968
-	// encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
969
-	return false;
968
+    // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
969
+    return false;
970 970
 }
971 971
 
972 972
 
@@ -982,10 +982,10 @@  discard block
 block discarded – undo
982 982
  * @return bool                True si réussi
983 983
  */
984 984
 function spip_sqlite_free(&$r, $serveur = '', $requeter = true) {
985
-	unset($r);
985
+    unset($r);
986 986
 
987
-	return true;
988
-	//return sqlite_free_result($r);
987
+    return true;
988
+    //return sqlite_free_result($r);
989 989
 }
990 990
 
991 991
 
@@ -1000,8 +1000,8 @@  discard block
 block discarded – undo
1000 1000
  * @return void
1001 1001
  */
1002 1002
 function spip_sqlite_get_charset($charset = [], $serveur = '', $requeter = true) {
1003
-	//$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1004
-	//return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1003
+    //$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1004
+    //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1005 1005
 }
1006 1006
 
1007 1007
 
@@ -1016,7 +1016,7 @@  discard block
 block discarded – undo
1016 1016
  *     Valeur hexadécimale pour SQLite
1017 1017
  **/
1018 1018
 function spip_sqlite_hex($v) {
1019
-	return hexdec($v);
1019
+    return hexdec($v);
1020 1020
 }
1021 1021
 
1022 1022
 
@@ -1038,7 +1038,7 @@  discard block
 block discarded – undo
1038 1038
  *     Expression de requête SQL
1039 1039
  **/
1040 1040
 function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) {
1041
-	return "($val $not IN ($valeurs))";
1041
+    return "($val $not IN ($valeurs))";
1042 1042
 }
1043 1043
 
1044 1044
 
@@ -1066,20 +1066,20 @@  discard block
 block discarded – undo
1066 1066
  **/
1067 1067
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
1068 1068
 
1069
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1070
-	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1071
-		if (!$requeter) {
1072
-			return $r;
1073
-		}
1074
-		$nb = spip_sqlite::last_insert_id($serveur);
1075
-	} else {
1076
-		$nb = false;
1077
-	}
1069
+    $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1070
+    if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1071
+        if (!$requeter) {
1072
+            return $r;
1073
+        }
1074
+        $nb = spip_sqlite::last_insert_id($serveur);
1075
+    } else {
1076
+        $nb = false;
1077
+    }
1078 1078
 
1079
-	$err = spip_sqlite_error($query, $serveur);
1079
+    $err = spip_sqlite_error($query, $serveur);
1080 1080
 
1081
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1082
-	return isset($_GET['var_profile']) ? $r : $nb;
1081
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1082
+    return isset($_GET['var_profile']) ? $r : $nb;
1083 1083
 }
1084 1084
 
1085 1085
 
@@ -1104,28 +1104,28 @@  discard block
 block discarded – undo
1104 1104
  *     - Tableau de description de la requête et du temps d'exécution, si var_profile activé
1105 1105
  **/
1106 1106
 function spip_sqlite_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) {
1107
-	if (!$desc) {
1108
-		$desc = description_table($table, $serveur);
1109
-	}
1110
-	if (!$desc) {
1111
-		die("$table insertion sans description");
1112
-	}
1113
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1107
+    if (!$desc) {
1108
+        $desc = description_table($table, $serveur);
1109
+    }
1110
+    if (!$desc) {
1111
+        die("$table insertion sans description");
1112
+    }
1113
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1114 1114
 
1115
-	foreach ($couples as $champ => $val) {
1116
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1117
-	}
1115
+    foreach ($couples as $champ => $val) {
1116
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1117
+    }
1118 1118
 
1119
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1120
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1119
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1120
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1121 1121
 
1122
-	$cles = $valeurs = '';
1123
-	if (count($couples)) {
1124
-		$cles = '(' . join(',', array_keys($couples)) . ')';
1125
-		$valeurs = '(' . join(',', $couples) . ')';
1126
-	}
1122
+    $cles = $valeurs = '';
1123
+    if (count($couples)) {
1124
+        $cles = '(' . join(',', array_keys($couples)) . ')';
1125
+        $valeurs = '(' . join(',', $couples) . ')';
1126
+    }
1127 1127
 
1128
-	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1128
+    return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1129 1129
 }
1130 1130
 
1131 1131
 
@@ -1149,70 +1149,70 @@  discard block
 block discarded – undo
1149 1149
  *     - False en cas d'erreur.
1150 1150
  **/
1151 1151
 function spip_sqlite_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) {
1152
-	if (!$desc) {
1153
-		$desc = description_table($table, $serveur);
1154
-	}
1155
-	if (!$desc) {
1156
-		die("$table insertion sans description");
1157
-	}
1158
-	if (!isset($desc['field'])) {
1159
-		$desc['field'] = [];
1160
-	}
1161
-
1162
-	// recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1163
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1164
-
1165
-	// seul le nom de la table est a traduire ici :
1166
-	// le faire une seule fois au debut
1167
-	$query_start = "INSERT INTO $table ";
1168
-	$query_start = spip_sqlite::traduire_requete($query_start, $serveur);
1169
-
1170
-	// ouvrir une transaction
1171
-	if ($requeter) {
1172
-		spip_sqlite::demarrer_transaction($serveur);
1173
-	}
1174
-
1175
-	while ($couples = array_shift($tab_couples)) {
1176
-		foreach ($couples as $champ => $val) {
1177
-			$couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1178
-		}
1179
-
1180
-		// inserer les champs timestamp par defaut
1181
-		$couples = array_merge($maj, $couples);
1182
-
1183
-		$champs = $valeurs = '';
1184
-		if (count($couples)) {
1185
-			$champs = '(' . join(',', array_keys($couples)) . ')';
1186
-			$valeurs = '(' . join(',', $couples) . ')';
1187
-			$query = $query_start . "$champs VALUES $valeurs";
1188
-		} else {
1189
-			$query = $query_start . 'DEFAULT VALUES';
1190
-		}
1191
-
1192
-		if ($requeter) {
1193
-			$retour = spip_sqlite::executer_requete($query, $serveur);
1194
-		}
1195
-
1196
-		// sur le dernier couple uniquement
1197
-		if (!count($tab_couples)) {
1198
-			$nb = 0;
1199
-			if ($requeter) {
1200
-				$nb = spip_sqlite::last_insert_id($serveur);
1201
-			} else {
1202
-				return $query;
1203
-			}
1204
-		}
1205
-
1206
-		$err = spip_sqlite_error($query, $serveur);
1207
-	}
1208
-
1209
-	if ($requeter) {
1210
-		spip_sqlite::finir_transaction($serveur);
1211
-	}
1212
-
1213
-	// renvoie le dernier id d'autoincrement ajoute
1214
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1215
-	return isset($_GET['var_profile']) ? $retour : $nb;
1152
+    if (!$desc) {
1153
+        $desc = description_table($table, $serveur);
1154
+    }
1155
+    if (!$desc) {
1156
+        die("$table insertion sans description");
1157
+    }
1158
+    if (!isset($desc['field'])) {
1159
+        $desc['field'] = [];
1160
+    }
1161
+
1162
+    // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1163
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1164
+
1165
+    // seul le nom de la table est a traduire ici :
1166
+    // le faire une seule fois au debut
1167
+    $query_start = "INSERT INTO $table ";
1168
+    $query_start = spip_sqlite::traduire_requete($query_start, $serveur);
1169
+
1170
+    // ouvrir une transaction
1171
+    if ($requeter) {
1172
+        spip_sqlite::demarrer_transaction($serveur);
1173
+    }
1174
+
1175
+    while ($couples = array_shift($tab_couples)) {
1176
+        foreach ($couples as $champ => $val) {
1177
+            $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1178
+        }
1179
+
1180
+        // inserer les champs timestamp par defaut
1181
+        $couples = array_merge($maj, $couples);
1182
+
1183
+        $champs = $valeurs = '';
1184
+        if (count($couples)) {
1185
+            $champs = '(' . join(',', array_keys($couples)) . ')';
1186
+            $valeurs = '(' . join(',', $couples) . ')';
1187
+            $query = $query_start . "$champs VALUES $valeurs";
1188
+        } else {
1189
+            $query = $query_start . 'DEFAULT VALUES';
1190
+        }
1191
+
1192
+        if ($requeter) {
1193
+            $retour = spip_sqlite::executer_requete($query, $serveur);
1194
+        }
1195
+
1196
+        // sur le dernier couple uniquement
1197
+        if (!count($tab_couples)) {
1198
+            $nb = 0;
1199
+            if ($requeter) {
1200
+                $nb = spip_sqlite::last_insert_id($serveur);
1201
+            } else {
1202
+                return $query;
1203
+            }
1204
+        }
1205
+
1206
+        $err = spip_sqlite_error($query, $serveur);
1207
+    }
1208
+
1209
+    if ($requeter) {
1210
+        spip_sqlite::finir_transaction($serveur);
1211
+    }
1212
+
1213
+    // renvoie le dernier id d'autoincrement ajoute
1214
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1215
+    return isset($_GET['var_profile']) ? $retour : $nb;
1216 1216
 }
1217 1217
 
1218 1218
 
@@ -1227,7 +1227,7 @@  discard block
 block discarded – undo
1227 1227
  *     Toujours true.
1228 1228
  **/
1229 1229
 function spip_sqlite_preferer_transaction($serveur = '', $requeter = true) {
1230
-	return true;
1230
+    return true;
1231 1231
 }
1232 1232
 
1233 1233
 /**
@@ -1244,12 +1244,12 @@  discard block
 block discarded – undo
1244 1244
  *     string si texte de la requête demandé, true sinon
1245 1245
  **/
1246 1246
 function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true) {
1247
-	if (!$requeter) {
1248
-		return 'BEGIN TRANSACTION';
1249
-	}
1250
-	spip_sqlite::demarrer_transaction($serveur);
1247
+    if (!$requeter) {
1248
+        return 'BEGIN TRANSACTION';
1249
+    }
1250
+    spip_sqlite::demarrer_transaction($serveur);
1251 1251
 
1252
-	return true;
1252
+    return true;
1253 1253
 }
1254 1254
 
1255 1255
 /**
@@ -1263,12 +1263,12 @@  discard block
 block discarded – undo
1263 1263
  *     string si texte de la requête demandé, true sinon
1264 1264
  **/
1265 1265
 function spip_sqlite_terminer_transaction($serveur = '', $requeter = true) {
1266
-	if (!$requeter) {
1267
-		return 'COMMIT';
1268
-	}
1269
-	spip_sqlite::finir_transaction($serveur);
1266
+    if (!$requeter) {
1267
+        return 'COMMIT';
1268
+    }
1269
+    spip_sqlite::finir_transaction($serveur);
1270 1270
 
1271
-	return true;
1271
+    return true;
1272 1272
 }
1273 1273
 
1274 1274
 
@@ -1283,27 +1283,27 @@  discard block
 block discarded – undo
1283 1283
  *     Liste des noms de bases
1284 1284
  **/
1285 1285
 function spip_sqlite_listdbs($serveur = '', $requeter = true) {
1286
-	_sqlite_init();
1286
+    _sqlite_init();
1287 1287
 
1288
-	if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1289
-		return [];
1290
-	}
1288
+    if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1289
+        return [];
1290
+    }
1291 1291
 
1292
-	include_spip('inc/flock');
1293
-	$bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1294
-	$bds = [];
1292
+    include_spip('inc/flock');
1293
+    $bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1294
+    $bds = [];
1295 1295
 
1296
-	foreach ($bases as $b) {
1297
-		// pas de bases commencant pas sqlite
1298
-		// (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1299
-		// les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1300
-		if (strpos($b, '_sqlite')) {
1301
-			continue;
1302
-		}
1303
-		$bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1304
-	}
1296
+    foreach ($bases as $b) {
1297
+        // pas de bases commencant pas sqlite
1298
+        // (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1299
+        // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1300
+        if (strpos($b, '_sqlite')) {
1301
+            continue;
1302
+        }
1303
+        $bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1304
+    }
1305 1305
 
1306
-	return $bds;
1306
+    return $bds;
1307 1307
 }
1308 1308
 
1309 1309
 
@@ -1318,9 +1318,9 @@  discard block
 block discarded – undo
1318 1318
  * @return string       Texte de sélection pour la requête
1319 1319
  */
1320 1320
 function spip_sqlite_multi($objet, $lang) {
1321
-	$r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1321
+    $r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1322 1322
 
1323
-	return $r;
1323
+    return $r;
1324 1324
 }
1325 1325
 
1326 1326
 
@@ -1337,15 +1337,15 @@  discard block
 block discarded – undo
1337 1337
  * @return bool|string true / false / requete
1338 1338
  **/
1339 1339
 function spip_sqlite_optimize($table, $serveur = '', $requeter = true) {
1340
-	static $do = false;
1341
-	if ($requeter and $do) {
1342
-		return true;
1343
-	}
1344
-	if ($requeter) {
1345
-		$do = true;
1346
-	}
1340
+    static $do = false;
1341
+    if ($requeter and $do) {
1342
+        return true;
1343
+    }
1344
+    if ($requeter) {
1345
+        $do = true;
1346
+    }
1347 1347
 
1348
-	return spip_sqlite_query('VACUUM', $serveur, $requeter);
1348
+    return spip_sqlite_query('VACUUM', $serveur, $requeter);
1349 1349
 }
1350 1350
 
1351 1351
 
@@ -1362,15 +1362,15 @@  discard block
 block discarded – undo
1362 1362
  *    Donnée prête à être utilisée par le gestionnaire SQL
1363 1363
  */
1364 1364
 function spip_sqlite_quote($v, $type = '') {
1365
-	if (!is_array($v)) {
1366
-		return _sqlite_calculer_cite($v, $type);
1367
-	}
1368
-	// si c'est un tableau, le parcourir en propageant le type
1369
-	foreach ($v as $k => $r) {
1370
-		$v[$k] = spip_sqlite_quote($r, $type);
1371
-	}
1365
+    if (!is_array($v)) {
1366
+        return _sqlite_calculer_cite($v, $type);
1367
+    }
1368
+    // si c'est un tableau, le parcourir en propageant le type
1369
+    foreach ($v as $k => $r) {
1370
+        $v[$k] = spip_sqlite_quote($r, $type);
1371
+    }
1372 1372
 
1373
-	return join(',', $v);
1373
+    return join(',', $v);
1374 1374
 }
1375 1375
 
1376 1376
 
@@ -1387,9 +1387,9 @@  discard block
 block discarded – undo
1387 1387
  *     Expression SQL
1388 1388
  **/
1389 1389
 function spip_sqlite_date_proche($champ, $interval, $unite) {
1390
-	$op = (($interval <= 0) ? '>' : '<');
1390
+    $op = (($interval <= 0) ? '>' : '<');
1391 1391
 
1392
-	return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1392
+    return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1393 1393
 }
1394 1394
 
1395 1395
 
@@ -1407,48 +1407,48 @@  discard block
 block discarded – undo
1407 1407
  *     l'état de la table après la réparation
1408 1408
  */
1409 1409
 function spip_sqlite_repair($table, $serveur = '', $requeter = true) {
1410
-	if (
1411
-		$desc = spip_sqlite_showtable($table, $serveur)
1412
-		and isset($desc['field'])
1413
-		and is_array($desc['field'])
1414
-	) {
1415
-		foreach ($desc['field'] as $c => $d) {
1416
-			if (
1417
-				preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1418
-				and stripos($d, 'NOT NULL') !== false
1419
-				and stripos($d, 'DEFAULT') === false
1420
-				/* pas touche aux cles primaires */
1421
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1422
-			) {
1423
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1424
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1425
-			}
1426
-			if (
1427
-				preg_match(',^(INTEGER),i', $d)
1428
-				and stripos($d, 'NOT NULL') !== false
1429
-				and stripos($d, 'DEFAULT') === false
1430
-				/* pas touche aux cles primaires */
1431
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1432
-			) {
1433
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1434
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1435
-			}
1436
-			if (
1437
-				preg_match(',^(datetime),i', $d)
1438
-				and stripos($d, 'NOT NULL') !== false
1439
-				and stripos($d, 'DEFAULT') === false
1440
-				/* pas touche aux cles primaires */
1441
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1442
-			) {
1443
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1444
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1445
-			}
1446
-		}
1447
-
1448
-		return [' OK '];
1449
-	}
1450
-
1451
-	return [' ERROR '];
1410
+    if (
1411
+        $desc = spip_sqlite_showtable($table, $serveur)
1412
+        and isset($desc['field'])
1413
+        and is_array($desc['field'])
1414
+    ) {
1415
+        foreach ($desc['field'] as $c => $d) {
1416
+            if (
1417
+                preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1418
+                and stripos($d, 'NOT NULL') !== false
1419
+                and stripos($d, 'DEFAULT') === false
1420
+                /* pas touche aux cles primaires */
1421
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1422
+            ) {
1423
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1424
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1425
+            }
1426
+            if (
1427
+                preg_match(',^(INTEGER),i', $d)
1428
+                and stripos($d, 'NOT NULL') !== false
1429
+                and stripos($d, 'DEFAULT') === false
1430
+                /* pas touche aux cles primaires */
1431
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1432
+            ) {
1433
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1434
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1435
+            }
1436
+            if (
1437
+                preg_match(',^(datetime),i', $d)
1438
+                and stripos($d, 'NOT NULL') !== false
1439
+                and stripos($d, 'DEFAULT') === false
1440
+                /* pas touche aux cles primaires */
1441
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1442
+            ) {
1443
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1444
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1445
+            }
1446
+        }
1447
+
1448
+        return [' OK '];
1449
+    }
1450
+
1451
+    return [' ERROR '];
1452 1452
 }
1453 1453
 
1454 1454
 
@@ -1477,25 +1477,25 @@  discard block
 block discarded – undo
1477 1477
  *     - False en cas d'erreur.
1478 1478
  **/
1479 1479
 function spip_sqlite_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) {
1480
-	if (!$desc) {
1481
-		$desc = description_table($table, $serveur);
1482
-	}
1483
-	if (!$desc) {
1484
-		die("$table insertion sans description");
1485
-	}
1486
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1480
+    if (!$desc) {
1481
+        $desc = description_table($table, $serveur);
1482
+    }
1483
+    if (!$desc) {
1484
+        die("$table insertion sans description");
1485
+    }
1486
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1487 1487
 
1488
-	foreach ($couples as $champ => $val) {
1489
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1490
-	}
1488
+    foreach ($couples as $champ => $val) {
1489
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1490
+    }
1491 1491
 
1492
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1493
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1492
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1493
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1494 1494
 
1495
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1496
-		',',
1497
-		$couples
1498
-	) . ')', $serveur);
1495
+    return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1496
+        ',',
1497
+        $couples
1498
+    ) . ')', $serveur);
1499 1499
 }
1500 1500
 
1501 1501
 
@@ -1525,13 +1525,13 @@  discard block
 block discarded – undo
1525 1525
  **/
1526 1526
 function spip_sqlite_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1527 1527
 
1528
-	// boucler pour trainter chaque requete independemment
1529
-	foreach ($tab_couples as $couples) {
1530
-		$retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1531
-	}
1528
+    // boucler pour trainter chaque requete independemment
1529
+    foreach ($tab_couples as $couples) {
1530
+        $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1531
+    }
1532 1532
 
1533
-	// renvoie le dernier id
1534
-	return $retour;
1533
+    // renvoie le dernier id
1534
+    return $retour;
1535 1535
 }
1536 1536
 
1537 1537
 
@@ -1558,44 +1558,44 @@  discard block
 block discarded – undo
1558 1558
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
1559 1559
  */
1560 1560
 function spip_sqlite_select(
1561
-	$select,
1562
-	$from,
1563
-	$where = '',
1564
-	$groupby = '',
1565
-	$orderby = '',
1566
-	$limit = '',
1567
-	$having = '',
1568
-	$serveur = '',
1569
-	$requeter = true
1561
+    $select,
1562
+    $from,
1563
+    $where = '',
1564
+    $groupby = '',
1565
+    $orderby = '',
1566
+    $limit = '',
1567
+    $having = '',
1568
+    $serveur = '',
1569
+    $requeter = true
1570 1570
 ) {
1571 1571
 
1572
-	// version() n'est pas connu de sqlite
1573
-	$select = str_replace('version()', 'sqlite_version()', $select);
1572
+    // version() n'est pas connu de sqlite
1573
+    $select = str_replace('version()', 'sqlite_version()', $select);
1574 1574
 
1575
-	// recomposer from
1576
-	$from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1575
+    // recomposer from
1576
+    $from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1577 1577
 
1578
-	$query =
1579
-		_sqlite_calculer_expression('SELECT', $select, ', ')
1580
-		. _sqlite_calculer_expression('FROM', $from, ', ')
1581
-		. _sqlite_calculer_expression('WHERE', $where)
1582
-		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1583
-		. _sqlite_calculer_expression('HAVING', $having)
1584
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1585
-		. ($limit ? "\nLIMIT $limit" : '');
1578
+    $query =
1579
+        _sqlite_calculer_expression('SELECT', $select, ', ')
1580
+        . _sqlite_calculer_expression('FROM', $from, ', ')
1581
+        . _sqlite_calculer_expression('WHERE', $where)
1582
+        . _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1583
+        . _sqlite_calculer_expression('HAVING', $having)
1584
+        . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1585
+        . ($limit ? "\nLIMIT $limit" : '');
1586 1586
 
1587
-	// dans un select, on doit renvoyer la requête en cas d'erreur
1588
-	$res = spip_sqlite_query($query, $serveur, $requeter);
1589
-	// texte de la requete demande ?
1590
-	if (!$requeter) {
1591
-		return $res;
1592
-	}
1593
-	// erreur survenue ?
1594
-	if ($res === false) {
1595
-		return spip_sqlite::traduire_requete($query, $serveur);
1596
-	}
1587
+    // dans un select, on doit renvoyer la requête en cas d'erreur
1588
+    $res = spip_sqlite_query($query, $serveur, $requeter);
1589
+    // texte de la requete demande ?
1590
+    if (!$requeter) {
1591
+        return $res;
1592
+    }
1593
+    // erreur survenue ?
1594
+    if ($res === false) {
1595
+        return spip_sqlite::traduire_requete($query, $serveur);
1596
+    }
1597 1597
 
1598
-	return $res;
1598
+    return $res;
1599 1599
 }
1600 1600
 
1601 1601
 
@@ -1614,32 +1614,32 @@  discard block
 block discarded – undo
1614 1614
  *     - False en cas d'erreur.
1615 1615
  **/
1616 1616
 function spip_sqlite_selectdb($db, $serveur = '', $requeter = true) {
1617
-	_sqlite_init();
1617
+    _sqlite_init();
1618 1618
 
1619
-	// interdire la creation d'une nouvelle base,
1620
-	// sauf si on est dans l'installation
1621
-	if (
1622
-		!is_file($f = _DIR_DB . $db . '.sqlite')
1623
-		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1624
-	) {
1625
-		spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1619
+    // interdire la creation d'une nouvelle base,
1620
+    // sauf si on est dans l'installation
1621
+    if (
1622
+        !is_file($f = _DIR_DB . $db . '.sqlite')
1623
+        && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1624
+    ) {
1625
+        spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1626 1626
 
1627
-		return false;
1628
-	}
1627
+        return false;
1628
+    }
1629 1629
 
1630
-	// se connecter a la base indiquee
1631
-	// avec les identifiants connus
1632
-	$index = $serveur ? $serveur : 0;
1630
+    // se connecter a la base indiquee
1631
+    // avec les identifiants connus
1632
+    $index = $serveur ? $serveur : 0;
1633 1633
 
1634
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1635
-		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1636
-			return $db;
1637
-		}
1638
-	} else {
1639
-		spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1634
+    if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1635
+        if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1636
+            return $db;
1637
+        }
1638
+    } else {
1639
+        spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1640 1640
 
1641
-		return false;
1642
-	}
1641
+        return false;
1642
+    }
1643 1643
 }
1644 1644
 
1645 1645
 
@@ -1654,8 +1654,8 @@  discard block
 block discarded – undo
1654 1654
  * @return void
1655 1655
  */
1656 1656
 function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true) {
1657
-	# spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1658
-	# return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1657
+    # spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1658
+    # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1659 1659
 }
1660 1660
 
1661 1661
 
@@ -1673,24 +1673,24 @@  discard block
 block discarded – undo
1673 1673
  *     Ressource à utiliser avec sql_fetch()
1674 1674
  **/
1675 1675
 function spip_sqlite_showbase($match, $serveur = '', $requeter = true) {
1676
-	// type est le type d'entrée : table / index / view
1677
-	// on ne retourne que les tables (?) et non les vues...
1678
-	# ESCAPE non supporte par les versions sqlite <3
1679
-	#	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1680
-	$match = preg_quote($match);
1681
-	$match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1682
-	$match = str_replace('\\\%', '[[POURCENT]]', $match);
1683
-	$match = str_replace('_', '.', $match);
1684
-	$match = str_replace('%', '.*', $match);
1685
-	$match = str_replace('[[TIRETBAS]]', '_', $match);
1686
-	$match = str_replace('[[POURCENT]]', '%', $match);
1687
-	$match = "^$match$";
1688
-
1689
-	return spip_sqlite_query(
1690
-		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1691
-		$serveur,
1692
-		$requeter
1693
-	);
1676
+    // type est le type d'entrée : table / index / view
1677
+    // on ne retourne que les tables (?) et non les vues...
1678
+    # ESCAPE non supporte par les versions sqlite <3
1679
+    #	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1680
+    $match = preg_quote($match);
1681
+    $match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1682
+    $match = str_replace('\\\%', '[[POURCENT]]', $match);
1683
+    $match = str_replace('_', '.', $match);
1684
+    $match = str_replace('%', '.*', $match);
1685
+    $match = str_replace('[[TIRETBAS]]', '_', $match);
1686
+    $match = str_replace('[[POURCENT]]', '%', $match);
1687
+    $match = "^$match$";
1688
+
1689
+    return spip_sqlite_query(
1690
+        "SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1691
+        $serveur,
1692
+        $requeter
1693
+    );
1694 1694
 }
1695 1695
 
1696 1696
 /**
@@ -1707,19 +1707,19 @@  discard block
 block discarded – undo
1707 1707
  *     Ressource à utiliser avec sql_fetch()
1708 1708
  **/
1709 1709
 function spip_sqlite_table_exists(string $table, $serveur = '', $requeter = true) {
1710
-	$r = spip_sqlite_query(
1711
-		'SELECT name FROM sqlite_master WHERE'
1712
-		. ' type=\'table\''
1713
-		. ' AND name=' . spip_sqlite_quote($table, 'string')
1714
-		. ' AND name NOT LIKE \'sqlite_%\'',
1715
-		$serveur,
1716
-		$requeter
1717
-	);
1718
-	if (!$requeter) {
1719
-		return $r;
1720
-	}
1721
-	$res = spip_sqlite_fetch($r);
1722
-	return (bool) $res;
1710
+    $r = spip_sqlite_query(
1711
+        'SELECT name FROM sqlite_master WHERE'
1712
+        . ' type=\'table\''
1713
+        . ' AND name=' . spip_sqlite_quote($table, 'string')
1714
+        . ' AND name NOT LIKE \'sqlite_%\'',
1715
+        $serveur,
1716
+        $requeter
1717
+    );
1718
+    if (!$requeter) {
1719
+        return $r;
1720
+    }
1721
+    $res = spip_sqlite_fetch($r);
1722
+    return (bool) $res;
1723 1723
 }
1724 1724
 
1725 1725
 define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -1742,129 +1742,129 @@  discard block
 block discarded – undo
1742 1742
  *     - array description de la table sinon
1743 1743
  */
1744 1744
 function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true) {
1745
-	$query =
1746
-		'SELECT sql, type FROM'
1747
-		. ' (SELECT * FROM sqlite_master UNION ALL'
1748
-		. ' SELECT * FROM sqlite_temp_master)'
1749
-		. " WHERE tbl_name LIKE '$nom_table'"
1750
-		. " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1751
-		. ' ORDER BY substr(type,2,1), name';
1752
-
1753
-	$a = spip_sqlite_query($query, $serveur, $requeter);
1754
-	if (!$a) {
1755
-		return '';
1756
-	}
1757
-	if (!$requeter) {
1758
-		return $a;
1759
-	}
1760
-	if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1761
-		return '';
1762
-	}
1763
-	$vue = ($a['type'] == 'view'); // table | vue
1764
-
1765
-	// c'est une table
1766
-	// il faut parser le create
1767
-	if (!$vue) {
1768
-		if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1769
-			return '';
1770
-		} else {
1771
-			$desc = $r[1];
1772
-			// extraction d'une KEY éventuelle en prenant garde de ne pas
1773
-			// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1774
-			if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1775
-				$namedkeys = $r[2];
1776
-				$desc = $r[1];
1777
-			} else {
1778
-				$namedkeys = '';
1779
-			}
1780
-
1781
-			$fields = [];
1782
-			$keys = [];
1783
-
1784
-			// enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1785
-			// par exemple s'il contiennent une virgule.
1786
-			// /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1787
-			list($desc, $echaps) = query_echappe_textes($desc);
1788
-
1789
-			// separer toutes les descriptions de champs, separes par des virgules
1790
-			# /!\ explode peut exploser aussi DECIMAL(10,2) !
1791
-			$k_precedent = null;
1792
-			foreach (explode(',', $desc) as $v) {
1793
-				preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1794
-				// Les cles de champs peuvent etre entourees
1795
-				// de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1796
-				// http://www.sqlite.org/lang_keywords.html
1797
-				$k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1798
-				if ($char = strpbrk($k[0], '\'"[`')) {
1799
-					$k = trim($k, $char);
1800
-					if ($char == '[') {
1801
-						$k = rtrim($k, ']');
1802
-					}
1803
-				}
1804
-				$def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1805
-
1806
-				// rustine pour DECIMAL(10,2)
1807
-				// s'il y a une parenthèse fermante dans la clé
1808
-				// ou dans la définition sans qu'il n'y ait une ouverture avant
1809
-				if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1810
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1811
-					continue;
1812
-				}
1813
-
1814
-				// la primary key peut etre dans une des descriptions de champs
1815
-				// et non en fin de table, cas encore decouvert avec Sqlite Manager
1816
-				if (stripos($r[2], 'PRIMARY KEY') !== false) {
1817
-					$keys['PRIMARY KEY'] = $k;
1818
-				}
1819
-
1820
-				$fields[$k] = $def;
1821
-				$k_precedent = $k;
1822
-			}
1823
-			// key inclues dans la requete
1824
-			foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1825
-				if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1826
-					$k = str_replace('`', '', trim($r[1]));
1827
-					$t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1828
-					if ($k && !isset($keys[$k])) {
1829
-						$keys[$k] = $t;
1830
-					} else {
1831
-						$keys[] = $t;
1832
-					}
1833
-				}
1834
-			}
1835
-			// sinon ajouter les key index
1836
-			$query =
1837
-				'SELECT name,sql FROM'
1838
-				. ' (SELECT * FROM sqlite_master UNION ALL'
1839
-				. ' SELECT * FROM sqlite_temp_master)'
1840
-				. " WHERE tbl_name LIKE '$nom_table'"
1841
-				. " AND type='index' AND name NOT LIKE 'sqlite_%'"
1842
-				. 'ORDER BY substr(type,2,1), name';
1843
-			$a = spip_sqlite_query($query, $serveur, $requeter);
1844
-			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1845
-				$key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1846
-				$keytype = 'KEY';
1847
-				if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1848
-					$keytype = 'UNIQUE KEY';
1849
-				}
1850
-				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1851
-				$keys[$keytype . ' ' . $key] = $colonnes;
1852
-			}
1853
-		}
1854
-	} // c'est une vue, on liste les champs disponibles simplement
1855
-	else {
1856
-		if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1857
-			$fields = [];
1858
-			foreach ($res as $c => $v) {
1859
-				$fields[$c] = '';
1860
-			}
1861
-			$keys = [];
1862
-		} else {
1863
-			return '';
1864
-		}
1865
-	}
1866
-
1867
-	return ['field' => $fields, 'key' => $keys];
1745
+    $query =
1746
+        'SELECT sql, type FROM'
1747
+        . ' (SELECT * FROM sqlite_master UNION ALL'
1748
+        . ' SELECT * FROM sqlite_temp_master)'
1749
+        . " WHERE tbl_name LIKE '$nom_table'"
1750
+        . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1751
+        . ' ORDER BY substr(type,2,1), name';
1752
+
1753
+    $a = spip_sqlite_query($query, $serveur, $requeter);
1754
+    if (!$a) {
1755
+        return '';
1756
+    }
1757
+    if (!$requeter) {
1758
+        return $a;
1759
+    }
1760
+    if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1761
+        return '';
1762
+    }
1763
+    $vue = ($a['type'] == 'view'); // table | vue
1764
+
1765
+    // c'est une table
1766
+    // il faut parser le create
1767
+    if (!$vue) {
1768
+        if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1769
+            return '';
1770
+        } else {
1771
+            $desc = $r[1];
1772
+            // extraction d'une KEY éventuelle en prenant garde de ne pas
1773
+            // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1774
+            if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1775
+                $namedkeys = $r[2];
1776
+                $desc = $r[1];
1777
+            } else {
1778
+                $namedkeys = '';
1779
+            }
1780
+
1781
+            $fields = [];
1782
+            $keys = [];
1783
+
1784
+            // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1785
+            // par exemple s'il contiennent une virgule.
1786
+            // /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1787
+            list($desc, $echaps) = query_echappe_textes($desc);
1788
+
1789
+            // separer toutes les descriptions de champs, separes par des virgules
1790
+            # /!\ explode peut exploser aussi DECIMAL(10,2) !
1791
+            $k_precedent = null;
1792
+            foreach (explode(',', $desc) as $v) {
1793
+                preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1794
+                // Les cles de champs peuvent etre entourees
1795
+                // de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1796
+                // http://www.sqlite.org/lang_keywords.html
1797
+                $k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1798
+                if ($char = strpbrk($k[0], '\'"[`')) {
1799
+                    $k = trim($k, $char);
1800
+                    if ($char == '[') {
1801
+                        $k = rtrim($k, ']');
1802
+                    }
1803
+                }
1804
+                $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1805
+
1806
+                // rustine pour DECIMAL(10,2)
1807
+                // s'il y a une parenthèse fermante dans la clé
1808
+                // ou dans la définition sans qu'il n'y ait une ouverture avant
1809
+                if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1810
+                    $fields[$k_precedent] .= ',' . $k . ' ' . $def;
1811
+                    continue;
1812
+                }
1813
+
1814
+                // la primary key peut etre dans une des descriptions de champs
1815
+                // et non en fin de table, cas encore decouvert avec Sqlite Manager
1816
+                if (stripos($r[2], 'PRIMARY KEY') !== false) {
1817
+                    $keys['PRIMARY KEY'] = $k;
1818
+                }
1819
+
1820
+                $fields[$k] = $def;
1821
+                $k_precedent = $k;
1822
+            }
1823
+            // key inclues dans la requete
1824
+            foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1825
+                if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1826
+                    $k = str_replace('`', '', trim($r[1]));
1827
+                    $t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1828
+                    if ($k && !isset($keys[$k])) {
1829
+                        $keys[$k] = $t;
1830
+                    } else {
1831
+                        $keys[] = $t;
1832
+                    }
1833
+                }
1834
+            }
1835
+            // sinon ajouter les key index
1836
+            $query =
1837
+                'SELECT name,sql FROM'
1838
+                . ' (SELECT * FROM sqlite_master UNION ALL'
1839
+                . ' SELECT * FROM sqlite_temp_master)'
1840
+                . " WHERE tbl_name LIKE '$nom_table'"
1841
+                . " AND type='index' AND name NOT LIKE 'sqlite_%'"
1842
+                . 'ORDER BY substr(type,2,1), name';
1843
+            $a = spip_sqlite_query($query, $serveur, $requeter);
1844
+            while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1845
+                $key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1846
+                $keytype = 'KEY';
1847
+                if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1848
+                    $keytype = 'UNIQUE KEY';
1849
+                }
1850
+                $colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1851
+                $keys[$keytype . ' ' . $key] = $colonnes;
1852
+            }
1853
+        }
1854
+    } // c'est une vue, on liste les champs disponibles simplement
1855
+    else {
1856
+        if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1857
+            $fields = [];
1858
+            foreach ($res as $c => $v) {
1859
+                $fields[$c] = '';
1860
+            }
1861
+            $keys = [];
1862
+        } else {
1863
+            return '';
1864
+        }
1865
+    }
1866
+
1867
+    return ['field' => $fields, 'key' => $keys];
1868 1868
 }
1869 1869
 
1870 1870
 
@@ -1890,22 +1890,22 @@  discard block
 block discarded – undo
1890 1890
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
1891 1891
  */
1892 1892
 function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true) {
1893
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1894
-	$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1893
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1894
+    $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1895 1895
 
1896
-	$set = [];
1897
-	foreach ($champs as $champ => $val) {
1898
-		$set[] = $champ . "=$val";
1899
-	}
1900
-	if (!empty($set)) {
1901
-		return spip_sqlite_query(
1902
-			_sqlite_calculer_expression('UPDATE', $table, ',')
1903
-			. _sqlite_calculer_expression('SET', $set, ',')
1904
-			. _sqlite_calculer_expression('WHERE', $where),
1905
-			$serveur,
1906
-			$requeter
1907
-		);
1908
-	}
1896
+    $set = [];
1897
+    foreach ($champs as $champ => $val) {
1898
+        $set[] = $champ . "=$val";
1899
+    }
1900
+    if (!empty($set)) {
1901
+        return spip_sqlite_query(
1902
+            _sqlite_calculer_expression('UPDATE', $table, ',')
1903
+            . _sqlite_calculer_expression('SET', $set, ',')
1904
+            . _sqlite_calculer_expression('WHERE', $where),
1905
+            $serveur,
1906
+            $requeter
1907
+        );
1908
+    }
1909 1909
 }
1910 1910
 
1911 1911
 
@@ -1935,38 +1935,38 @@  discard block
 block discarded – undo
1935 1935
  */
1936 1936
 function spip_sqlite_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1937 1937
 
1938
-	if (!$champs) {
1939
-		return;
1940
-	}
1941
-	if (!$desc) {
1942
-		$desc = description_table($table, $serveur);
1943
-	}
1944
-	if (!$desc) {
1945
-		die("$table insertion sans description");
1946
-	}
1947
-	$fields = $desc['field'];
1948
-
1949
-	$set = [];
1950
-	foreach ($champs as $champ => $val) {
1951
-		$set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1952
-	}
1953
-
1954
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1955
-	// attention ils sont deja quotes
1956
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1957
-	foreach ($maj as $champ => $val) {
1958
-		if (!isset($set[$champ])) {
1959
-			$set[$champ] = $champ . '=' . $val;
1960
-		}
1961
-	}
1962
-
1963
-	return spip_sqlite_query(
1964
-		_sqlite_calculer_expression('UPDATE', $table, ',')
1965
-		. _sqlite_calculer_expression('SET', $set, ',')
1966
-		. _sqlite_calculer_expression('WHERE', $where),
1967
-		$serveur,
1968
-		$requeter
1969
-	);
1938
+    if (!$champs) {
1939
+        return;
1940
+    }
1941
+    if (!$desc) {
1942
+        $desc = description_table($table, $serveur);
1943
+    }
1944
+    if (!$desc) {
1945
+        die("$table insertion sans description");
1946
+    }
1947
+    $fields = $desc['field'];
1948
+
1949
+    $set = [];
1950
+    foreach ($champs as $champ => $val) {
1951
+        $set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1952
+    }
1953
+
1954
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1955
+    // attention ils sont deja quotes
1956
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1957
+    foreach ($maj as $champ => $val) {
1958
+        if (!isset($set[$champ])) {
1959
+            $set[$champ] = $champ . '=' . $val;
1960
+        }
1961
+    }
1962
+
1963
+    return spip_sqlite_query(
1964
+        _sqlite_calculer_expression('UPDATE', $table, ',')
1965
+        . _sqlite_calculer_expression('SET', $set, ',')
1966
+        . _sqlite_calculer_expression('WHERE', $where),
1967
+        $serveur,
1968
+        $requeter
1969
+    );
1970 1970
 }
1971 1971
 
1972 1972
 
@@ -1984,17 +1984,17 @@  discard block
 block discarded – undo
1984 1984
  * @return void
1985 1985
  */
1986 1986
 function _sqlite_init() {
1987
-	if (!defined('_DIR_DB')) {
1988
-		define('_DIR_DB', _DIR_ETC . 'bases/');
1989
-	}
1990
-	if (!defined('_SQLITE_CHMOD')) {
1991
-		define('_SQLITE_CHMOD', _SPIP_CHMOD);
1992
-	}
1987
+    if (!defined('_DIR_DB')) {
1988
+        define('_DIR_DB', _DIR_ETC . 'bases/');
1989
+    }
1990
+    if (!defined('_SQLITE_CHMOD')) {
1991
+        define('_SQLITE_CHMOD', _SPIP_CHMOD);
1992
+    }
1993 1993
 
1994
-	if (!is_dir($d = _DIR_DB)) {
1995
-		include_spip('inc/flock');
1996
-		sous_repertoire($d);
1997
-	}
1994
+    if (!is_dir($d = _DIR_DB)) {
1995
+        include_spip('inc/flock');
1996
+        sous_repertoire($d);
1997
+    }
1998 1998
 }
1999 1999
 
2000 2000
 
@@ -2008,20 +2008,20 @@  discard block
 block discarded – undo
2008 2008
  * @return bool|int
2009 2009
  */
2010 2010
 function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true) {
2011
-	if ($link === '') {
2012
-		$link = _sqlite_link($serveur);
2013
-	}
2014
-	if (!$link) {
2015
-		return false;
2016
-	}
2011
+    if ($link === '') {
2012
+        $link = _sqlite_link($serveur);
2013
+    }
2014
+    if (!$link) {
2015
+        return false;
2016
+    }
2017 2017
 
2018
-	$v = 3;
2018
+    $v = 3;
2019 2019
 
2020
-	if (!$version) {
2021
-		return $v;
2022
-	}
2020
+    if (!$version) {
2021
+        return $v;
2022
+    }
2023 2023
 
2024
-	return ($version == $v);
2024
+    return ($version == $v);
2025 2025
 }
2026 2026
 
2027 2027
 
@@ -2032,9 +2032,9 @@  discard block
 block discarded – undo
2032 2032
  * @return Object Information de connexion pour SQLite
2033 2033
  */
2034 2034
 function _sqlite_link($serveur = '') {
2035
-	$link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2035
+    $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2036 2036
 
2037
-	return $link;
2037
+    return $link;
2038 2038
 }
2039 2039
 
2040 2040
 
@@ -2049,52 +2049,52 @@  discard block
 block discarded – undo
2049 2049
  * @return string|number     Texte ou nombre échappé
2050 2050
  */
2051 2051
 function _sqlite_calculer_cite($v, $type) {
2052
-	if ($type) {
2053
-		if (
2054
-			is_null($v)
2055
-			and stripos($type, 'NOT NULL') === false
2056
-		) {
2057
-			return 'NULL';
2058
-		} // null php se traduit en NULL SQL
2059
-
2060
-		if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2061
-			return $v;
2062
-		}
2063
-		if (sql_test_int($type)) {
2064
-			if (is_numeric($v)) {
2065
-				return $v;
2066
-			} elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) {
2067
-				return hexdec(substr($v, 2));
2068
-			} else {
2069
-				return intval($v);
2070
-			}
2071
-		}
2072
-	} else {
2073
-		// si on ne connait pas le type on le deduit de $v autant que possible
2074
-		if (is_bool($v)) {
2075
-			return strval(intval($v));
2076
-		}
2077
-		elseif (is_numeric($v)) {
2078
-			return strval($v);
2079
-		}
2080
-	}
2081
-
2082
-	// trouver un link sqlite pour faire l'echappement
2083
-	foreach ($GLOBALS['connexions'] as $s) {
2084
-		if (
2085
-			$l = $s['link']
2086
-			and is_object($l)
2087
-			and $l instanceof \PDO
2088
-			and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2089
-		) {
2090
-			return $l->quote($v);
2091
-		}
2092
-	}
2093
-
2094
-	// echapper les ' en ''
2095
-	spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2096
-
2097
-	return ("'" . str_replace("'", "''", $v) . "'");
2052
+    if ($type) {
2053
+        if (
2054
+            is_null($v)
2055
+            and stripos($type, 'NOT NULL') === false
2056
+        ) {
2057
+            return 'NULL';
2058
+        } // null php se traduit en NULL SQL
2059
+
2060
+        if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2061
+            return $v;
2062
+        }
2063
+        if (sql_test_int($type)) {
2064
+            if (is_numeric($v)) {
2065
+                return $v;
2066
+            } elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) {
2067
+                return hexdec(substr($v, 2));
2068
+            } else {
2069
+                return intval($v);
2070
+            }
2071
+        }
2072
+    } else {
2073
+        // si on ne connait pas le type on le deduit de $v autant que possible
2074
+        if (is_bool($v)) {
2075
+            return strval(intval($v));
2076
+        }
2077
+        elseif (is_numeric($v)) {
2078
+            return strval($v);
2079
+        }
2080
+    }
2081
+
2082
+    // trouver un link sqlite pour faire l'echappement
2083
+    foreach ($GLOBALS['connexions'] as $s) {
2084
+        if (
2085
+            $l = $s['link']
2086
+            and is_object($l)
2087
+            and $l instanceof \PDO
2088
+            and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2089
+        ) {
2090
+            return $l->quote($v);
2091
+        }
2092
+    }
2093
+
2094
+    // echapper les ' en ''
2095
+    spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2096
+
2097
+    return ("'" . str_replace("'", "''", $v) . "'");
2098 2098
 }
2099 2099
 
2100 2100
 
@@ -2110,21 +2110,21 @@  discard block
 block discarded – undo
2110 2110
  * @return string            Texte de l'expression, une partie donc, du texte la requête.
2111 2111
  */
2112 2112
 function _sqlite_calculer_expression($expression, $v, $join = 'AND') {
2113
-	if (empty($v)) {
2114
-		return '';
2115
-	}
2113
+    if (empty($v)) {
2114
+        return '';
2115
+    }
2116 2116
 
2117
-	$exp = "\n$expression ";
2117
+    $exp = "\n$expression ";
2118 2118
 
2119
-	if (!is_array($v)) {
2120
-		return $exp . $v;
2121
-	} else {
2122
-		if (strtoupper($join) === 'AND') {
2123
-			return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2124
-		} else {
2125
-			return $exp . join($join, $v);
2126
-		}
2127
-	}
2119
+    if (!is_array($v)) {
2120
+        return $exp . $v;
2121
+    } else {
2122
+        if (strtoupper($join) === 'AND') {
2123
+            return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2124
+        } else {
2125
+            return $exp . join($join, $v);
2126
+        }
2127
+    }
2128 2128
 }
2129 2129
 
2130 2130
 
@@ -2140,7 +2140,7 @@  discard block
 block discarded – undo
2140 2140
  * @return string Texte du orderby préparé
2141 2141
  */
2142 2142
 function _sqlite_calculer_order($orderby) {
2143
-	return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2143
+    return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2144 2144
 }
2145 2145
 
2146 2146
 
@@ -2151,26 +2151,26 @@  discard block
 block discarded – undo
2151 2151
  * @return string Sélection de colonnes pour une clause SELECT
2152 2152
  */
2153 2153
 function _sqlite_calculer_select_as($args) {
2154
-	$res = '';
2155
-	foreach ($args as $k => $v) {
2156
-		if (substr($k, -1) == '@') {
2157
-			// c'est une jointure qui se refere au from precedent
2158
-			// pas de virgule
2159
-			$res .= '  ' . $v;
2160
-		} else {
2161
-			if (!is_numeric($k)) {
2162
-				$p = strpos($v, ' ');
2163
-				if ($p) {
2164
-					$v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2165
-				} else {
2166
-					$v .= " AS '$k'";
2167
-				}
2168
-			}
2169
-			$res .= ', ' . $v;
2170
-		}
2171
-	}
2172
-
2173
-	return substr($res, 2);
2154
+    $res = '';
2155
+    foreach ($args as $k => $v) {
2156
+        if (substr($k, -1) == '@') {
2157
+            // c'est une jointure qui se refere au from precedent
2158
+            // pas de virgule
2159
+            $res .= '  ' . $v;
2160
+        } else {
2161
+            if (!is_numeric($k)) {
2162
+                $p = strpos($v, ' ');
2163
+                if ($p) {
2164
+                    $v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2165
+                } else {
2166
+                    $v .= " AS '$k'";
2167
+                }
2168
+            }
2169
+            $res .= ', ' . $v;
2170
+        }
2171
+    }
2172
+
2173
+    return substr($res, 2);
2174 2174
 }
2175 2175
 
2176 2176
 
@@ -2193,26 +2193,26 @@  discard block
 block discarded – undo
2193 2193
  *     Contrainte pour clause WHERE
2194 2194
  */
2195 2195
 function _sqlite_calculer_where($v) {
2196
-	if (!is_array($v)) {
2197
-		return $v;
2198
-	}
2199
-
2200
-	$op = array_shift($v);
2201
-	if (!($n = count($v))) {
2202
-		return $op;
2203
-	} else {
2204
-		$arg = _sqlite_calculer_where(array_shift($v));
2205
-		if ($n == 1) {
2206
-			return "$op($arg)";
2207
-		} else {
2208
-			$arg2 = _sqlite_calculer_where(array_shift($v));
2209
-			if ($n == 2) {
2210
-				return "($arg $op $arg2)";
2211
-			} else {
2212
-				return "($arg $op ($arg2) : $v[0])";
2213
-			}
2214
-		}
2215
-	}
2196
+    if (!is_array($v)) {
2197
+        return $v;
2198
+    }
2199
+
2200
+    $op = array_shift($v);
2201
+    if (!($n = count($v))) {
2202
+        return $op;
2203
+    } else {
2204
+        $arg = _sqlite_calculer_where(array_shift($v));
2205
+        if ($n == 1) {
2206
+            return "$op($arg)";
2207
+        } else {
2208
+            $arg2 = _sqlite_calculer_where(array_shift($v));
2209
+            if ($n == 2) {
2210
+                return "($arg $op $arg2)";
2211
+            } else {
2212
+                return "($arg $op ($arg2) : $v[0])";
2213
+            }
2214
+        }
2215
+    }
2216 2216
 }
2217 2217
 
2218 2218
 
@@ -2227,19 +2227,19 @@  discard block
 block discarded – undo
2227 2227
  * @return array|bool
2228 2228
  */
2229 2229
 function _sqlite_charger_version($version = '') {
2230
-	$versions = [];
2230
+    $versions = [];
2231 2231
 
2232
-	// version 3
2233
-	if (!$version || $version == 3) {
2234
-		if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2235
-			$versions[] = 3;
2236
-		}
2237
-	}
2238
-	if ($version) {
2239
-		return in_array($version, $versions);
2240
-	}
2232
+    // version 3
2233
+    if (!$version || $version == 3) {
2234
+        if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2235
+            $versions[] = 3;
2236
+        }
2237
+    }
2238
+    if ($version) {
2239
+        return in_array($version, $versions);
2240
+    }
2241 2241
 
2242
-	return $versions;
2242
+    return $versions;
2243 2243
 }
2244 2244
 
2245 2245
 
@@ -2277,147 +2277,147 @@  discard block
 block discarded – undo
2277 2277
  */
2278 2278
 function _sqlite_modifier_table($table, $colonne, $opt = [], $serveur = '') {
2279 2279
 
2280
-	if (is_array($table)) {
2281
-		$table_destination = reset($table);
2282
-		$table_origine = key($table);
2283
-	} else {
2284
-		$table_origine = $table_destination = $table;
2285
-	}
2286
-	// ne prend actuellement qu'un changement
2287
-	// mais pourra etre adapte pour changer plus qu'une colonne a la fois
2288
-	if (is_array($colonne)) {
2289
-		$colonne_destination = reset($colonne);
2290
-		$colonne_origine = key($colonne);
2291
-	} else {
2292
-		$colonne_origine = $colonne_destination = $colonne;
2293
-	}
2294
-	if (!isset($opt['field'])) {
2295
-		$opt['field'] = [];
2296
-	}
2297
-	if (!isset($opt['key'])) {
2298
-		$opt['key'] = [];
2299
-	}
2300
-
2301
-	// si les noms de tables sont differents, pas besoin de table temporaire
2302
-	// on prendra directement le nom de la future table
2303
-	$meme_table = ($table_origine == $table_destination);
2304
-
2305
-	$def_origine = sql_showtable($table_origine, false, $serveur);
2306
-	if (!$def_origine or !isset($def_origine['field'])) {
2307
-		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2308
-
2309
-		return false;
2310
-	}
2311
-
2312
-
2313
-	$table_tmp = $table_origine . '_tmp';
2314
-
2315
-	// 1) creer une table temporaire avec les modifications
2316
-	// - DROP : suppression de la colonne
2317
-	// - CHANGE : modification de la colonne
2318
-	// (foreach pour conserver l'ordre des champs)
2319
-
2320
-	// field
2321
-	$fields = [];
2322
-	// pour le INSERT INTO plus loin
2323
-	// stocker la correspondance nouvelles->anciennes colonnes
2324
-	$fields_correspondances = [];
2325
-	foreach ($def_origine['field'] as $c => $d) {
2326
-		if ($colonne_origine && ($c == $colonne_origine)) {
2327
-			// si pas DROP
2328
-			if ($colonne_destination) {
2329
-				$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2330
-				$fields_correspondances[$colonne_destination] = $c;
2331
-			}
2332
-		} else {
2333
-			$fields[$c] = $d;
2334
-			$fields_correspondances[$c] = $c;
2335
-		}
2336
-	}
2337
-	// cas de ADD sqlite2 (ajout du champ en fin de table):
2338
-	if (!$colonne_origine && $colonne_destination) {
2339
-		$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2340
-	}
2341
-
2342
-	// key...
2343
-	$keys = [];
2344
-	foreach ($def_origine['key'] as $c => $d) {
2345
-		$c = str_replace($colonne_origine, $colonne_destination, $c);
2346
-		$d = str_replace($colonne_origine, $colonne_destination, $d);
2347
-		// seulement si on ne supprime pas la colonne !
2348
-		if ($d) {
2349
-			$keys[$c] = $d;
2350
-		}
2351
-	}
2352
-
2353
-	// autres keys, on merge
2354
-	$keys = array_merge($keys, $opt['key']);
2355
-	$queries = [];
2356
-
2357
-	// copier dans destination (si differente de origine), sinon tmp
2358
-	$table_copie = ($meme_table) ? $table_tmp : $table_destination;
2359
-	$autoinc = (isset($keys['PRIMARY KEY'])
2360
-		and $keys['PRIMARY KEY']
2361
-		and stripos($keys['PRIMARY KEY'], ',') === false
2362
-		and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2363
-
2364
-	if (
2365
-		$q = _sqlite_requete_create(
2366
-			$table_copie,
2367
-			$fields,
2368
-			$keys,
2369
-			$autoinc,
2370
-			$temporary = false,
2371
-			$ifnotexists = true,
2372
-			$serveur
2373
-		)
2374
-	) {
2375
-		$queries[] = $q;
2376
-	}
2377
-
2378
-
2379
-	// 2) y copier les champs qui vont bien
2380
-	$champs_dest = join(', ', array_keys($fields_correspondances));
2381
-	$champs_ori = join(', ', $fields_correspondances);
2382
-	$queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2383
-
2384
-	// 3) supprimer la table d'origine
2385
-	$queries[] = "DROP TABLE $table_origine";
2386
-
2387
-	// 4) renommer la table temporaire
2388
-	// avec le nom de la table destination
2389
-	// si necessaire
2390
-	if ($meme_table) {
2391
-		$queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2392
-	}
2393
-
2394
-	// 5) remettre les index !
2395
-	foreach ($keys as $k => $v) {
2396
-		if ($k == 'PRIMARY KEY') {
2397
-		} else {
2398
-			// enlever KEY
2399
-			$k = substr($k, 4);
2400
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2401
-		}
2402
-	}
2403
-
2404
-
2405
-	if (count($queries)) {
2406
-		spip_sqlite::demarrer_transaction($serveur);
2407
-		// il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2408
-		foreach ($queries as $q) {
2409
-			if (!spip_sqlite::executer_requete($q, $serveur)) {
2410
-				spip_log('SQLite : ALTER TABLE table :'
2411
-					. " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2412
-				spip_sqlite::annuler_transaction($serveur);
2413
-
2414
-				return false;
2415
-			}
2416
-		}
2417
-		spip_sqlite::finir_transaction($serveur);
2418
-	}
2419
-
2420
-	return true;
2280
+    if (is_array($table)) {
2281
+        $table_destination = reset($table);
2282
+        $table_origine = key($table);
2283
+    } else {
2284
+        $table_origine = $table_destination = $table;
2285
+    }
2286
+    // ne prend actuellement qu'un changement
2287
+    // mais pourra etre adapte pour changer plus qu'une colonne a la fois
2288
+    if (is_array($colonne)) {
2289
+        $colonne_destination = reset($colonne);
2290
+        $colonne_origine = key($colonne);
2291
+    } else {
2292
+        $colonne_origine = $colonne_destination = $colonne;
2293
+    }
2294
+    if (!isset($opt['field'])) {
2295
+        $opt['field'] = [];
2296
+    }
2297
+    if (!isset($opt['key'])) {
2298
+        $opt['key'] = [];
2299
+    }
2300
+
2301
+    // si les noms de tables sont differents, pas besoin de table temporaire
2302
+    // on prendra directement le nom de la future table
2303
+    $meme_table = ($table_origine == $table_destination);
2304
+
2305
+    $def_origine = sql_showtable($table_origine, false, $serveur);
2306
+    if (!$def_origine or !isset($def_origine['field'])) {
2307
+        spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2308
+
2309
+        return false;
2310
+    }
2311
+
2312
+
2313
+    $table_tmp = $table_origine . '_tmp';
2314
+
2315
+    // 1) creer une table temporaire avec les modifications
2316
+    // - DROP : suppression de la colonne
2317
+    // - CHANGE : modification de la colonne
2318
+    // (foreach pour conserver l'ordre des champs)
2319
+
2320
+    // field
2321
+    $fields = [];
2322
+    // pour le INSERT INTO plus loin
2323
+    // stocker la correspondance nouvelles->anciennes colonnes
2324
+    $fields_correspondances = [];
2325
+    foreach ($def_origine['field'] as $c => $d) {
2326
+        if ($colonne_origine && ($c == $colonne_origine)) {
2327
+            // si pas DROP
2328
+            if ($colonne_destination) {
2329
+                $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2330
+                $fields_correspondances[$colonne_destination] = $c;
2331
+            }
2332
+        } else {
2333
+            $fields[$c] = $d;
2334
+            $fields_correspondances[$c] = $c;
2335
+        }
2336
+    }
2337
+    // cas de ADD sqlite2 (ajout du champ en fin de table):
2338
+    if (!$colonne_origine && $colonne_destination) {
2339
+        $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2340
+    }
2341
+
2342
+    // key...
2343
+    $keys = [];
2344
+    foreach ($def_origine['key'] as $c => $d) {
2345
+        $c = str_replace($colonne_origine, $colonne_destination, $c);
2346
+        $d = str_replace($colonne_origine, $colonne_destination, $d);
2347
+        // seulement si on ne supprime pas la colonne !
2348
+        if ($d) {
2349
+            $keys[$c] = $d;
2350
+        }
2351
+    }
2352
+
2353
+    // autres keys, on merge
2354
+    $keys = array_merge($keys, $opt['key']);
2355
+    $queries = [];
2356
+
2357
+    // copier dans destination (si differente de origine), sinon tmp
2358
+    $table_copie = ($meme_table) ? $table_tmp : $table_destination;
2359
+    $autoinc = (isset($keys['PRIMARY KEY'])
2360
+        and $keys['PRIMARY KEY']
2361
+        and stripos($keys['PRIMARY KEY'], ',') === false
2362
+        and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2363
+
2364
+    if (
2365
+        $q = _sqlite_requete_create(
2366
+            $table_copie,
2367
+            $fields,
2368
+            $keys,
2369
+            $autoinc,
2370
+            $temporary = false,
2371
+            $ifnotexists = true,
2372
+            $serveur
2373
+        )
2374
+    ) {
2375
+        $queries[] = $q;
2376
+    }
2377
+
2378
+
2379
+    // 2) y copier les champs qui vont bien
2380
+    $champs_dest = join(', ', array_keys($fields_correspondances));
2381
+    $champs_ori = join(', ', $fields_correspondances);
2382
+    $queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2383
+
2384
+    // 3) supprimer la table d'origine
2385
+    $queries[] = "DROP TABLE $table_origine";
2386
+
2387
+    // 4) renommer la table temporaire
2388
+    // avec le nom de la table destination
2389
+    // si necessaire
2390
+    if ($meme_table) {
2391
+        $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2392
+    }
2393
+
2394
+    // 5) remettre les index !
2395
+    foreach ($keys as $k => $v) {
2396
+        if ($k == 'PRIMARY KEY') {
2397
+        } else {
2398
+            // enlever KEY
2399
+            $k = substr($k, 4);
2400
+            $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2401
+        }
2402
+    }
2403
+
2404
+
2405
+    if (count($queries)) {
2406
+        spip_sqlite::demarrer_transaction($serveur);
2407
+        // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2408
+        foreach ($queries as $q) {
2409
+            if (!spip_sqlite::executer_requete($q, $serveur)) {
2410
+                spip_log('SQLite : ALTER TABLE table :'
2411
+                    . " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2412
+                spip_sqlite::annuler_transaction($serveur);
2413
+
2414
+                return false;
2415
+            }
2416
+        }
2417
+        spip_sqlite::finir_transaction($serveur);
2418
+    }
2419
+
2420
+    return true;
2421 2421
 }
2422 2422
 
2423 2423
 
@@ -2427,61 +2427,61 @@  discard block
 block discarded – undo
2427 2427
  * @return array
2428 2428
  */
2429 2429
 function _sqlite_ref_fonctions() {
2430
-	$fonctions = [
2431
-		'alter' => 'spip_sqlite_alter',
2432
-		'count' => 'spip_sqlite_count',
2433
-		'countsel' => 'spip_sqlite_countsel',
2434
-		'create' => 'spip_sqlite_create',
2435
-		'create_base' => 'spip_sqlite_create_base',
2436
-		'create_view' => 'spip_sqlite_create_view',
2437
-		'date_proche' => 'spip_sqlite_date_proche',
2438
-		'delete' => 'spip_sqlite_delete',
2439
-		'drop_table' => 'spip_sqlite_drop_table',
2440
-		'drop_view' => 'spip_sqlite_drop_view',
2441
-		'errno' => 'spip_sqlite_errno',
2442
-		'error' => 'spip_sqlite_error',
2443
-		'explain' => 'spip_sqlite_explain',
2444
-		'fetch' => 'spip_sqlite_fetch',
2445
-		'seek' => 'spip_sqlite_seek',
2446
-		'free' => 'spip_sqlite_free',
2447
-		'hex' => 'spip_sqlite_hex',
2448
-		'in' => 'spip_sqlite_in',
2449
-		'insert' => 'spip_sqlite_insert',
2450
-		'insertq' => 'spip_sqlite_insertq',
2451
-		'insertq_multi' => 'spip_sqlite_insertq_multi',
2452
-		'listdbs' => 'spip_sqlite_listdbs',
2453
-		'multi' => 'spip_sqlite_multi',
2454
-		'optimize' => 'spip_sqlite_optimize',
2455
-		'query' => 'spip_sqlite_query',
2456
-		'quote' => 'spip_sqlite_quote',
2457
-		'repair' => 'spip_sqlite_repair',
2458
-		'replace' => 'spip_sqlite_replace',
2459
-		'replace_multi' => 'spip_sqlite_replace_multi',
2460
-		'select' => 'spip_sqlite_select',
2461
-		'selectdb' => 'spip_sqlite_selectdb',
2462
-		'set_charset' => 'spip_sqlite_set_charset',
2463
-		'get_charset' => 'spip_sqlite_get_charset',
2464
-		'showbase' => 'spip_sqlite_showbase',
2465
-		'showtable' => 'spip_sqlite_showtable',
2466
-		'table_exists' => 'spip_sqlite_table_exists',
2467
-		'update' => 'spip_sqlite_update',
2468
-		'updateq' => 'spip_sqlite_updateq',
2469
-		'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2470
-		'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2471
-		'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2472
-	];
2473
-
2474
-	// association de chaque nom http d'un charset aux couples sqlite
2475
-	// SQLite supporte utf-8 et utf-16 uniquement.
2476
-	$charsets = [
2477
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2478
-		//'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2479
-		//'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2480
-	];
2481
-
2482
-	$fonctions['charsets'] = $charsets;
2483
-
2484
-	return $fonctions;
2430
+    $fonctions = [
2431
+        'alter' => 'spip_sqlite_alter',
2432
+        'count' => 'spip_sqlite_count',
2433
+        'countsel' => 'spip_sqlite_countsel',
2434
+        'create' => 'spip_sqlite_create',
2435
+        'create_base' => 'spip_sqlite_create_base',
2436
+        'create_view' => 'spip_sqlite_create_view',
2437
+        'date_proche' => 'spip_sqlite_date_proche',
2438
+        'delete' => 'spip_sqlite_delete',
2439
+        'drop_table' => 'spip_sqlite_drop_table',
2440
+        'drop_view' => 'spip_sqlite_drop_view',
2441
+        'errno' => 'spip_sqlite_errno',
2442
+        'error' => 'spip_sqlite_error',
2443
+        'explain' => 'spip_sqlite_explain',
2444
+        'fetch' => 'spip_sqlite_fetch',
2445
+        'seek' => 'spip_sqlite_seek',
2446
+        'free' => 'spip_sqlite_free',
2447
+        'hex' => 'spip_sqlite_hex',
2448
+        'in' => 'spip_sqlite_in',
2449
+        'insert' => 'spip_sqlite_insert',
2450
+        'insertq' => 'spip_sqlite_insertq',
2451
+        'insertq_multi' => 'spip_sqlite_insertq_multi',
2452
+        'listdbs' => 'spip_sqlite_listdbs',
2453
+        'multi' => 'spip_sqlite_multi',
2454
+        'optimize' => 'spip_sqlite_optimize',
2455
+        'query' => 'spip_sqlite_query',
2456
+        'quote' => 'spip_sqlite_quote',
2457
+        'repair' => 'spip_sqlite_repair',
2458
+        'replace' => 'spip_sqlite_replace',
2459
+        'replace_multi' => 'spip_sqlite_replace_multi',
2460
+        'select' => 'spip_sqlite_select',
2461
+        'selectdb' => 'spip_sqlite_selectdb',
2462
+        'set_charset' => 'spip_sqlite_set_charset',
2463
+        'get_charset' => 'spip_sqlite_get_charset',
2464
+        'showbase' => 'spip_sqlite_showbase',
2465
+        'showtable' => 'spip_sqlite_showtable',
2466
+        'table_exists' => 'spip_sqlite_table_exists',
2467
+        'update' => 'spip_sqlite_update',
2468
+        'updateq' => 'spip_sqlite_updateq',
2469
+        'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2470
+        'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2471
+        'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2472
+    ];
2473
+
2474
+    // association de chaque nom http d'un charset aux couples sqlite
2475
+    // SQLite supporte utf-8 et utf-16 uniquement.
2476
+    $charsets = [
2477
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2478
+        //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2479
+        //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2480
+    ];
2481
+
2482
+    $fonctions['charsets'] = $charsets;
2483
+
2484
+    return $fonctions;
2485 2485
 }
2486 2486
 
2487 2487
 
@@ -2493,56 +2493,56 @@  discard block
 block discarded – undo
2493 2493
  * @return mixed
2494 2494
  */
2495 2495
 function _sqlite_remplacements_definitions_table($query, $autoinc = false) {
2496
-	// quelques remplacements
2497
-	$num = '(\s*\([0-9]*\))?';
2498
-	$enum = '(\s*\([^\)]*\))?';
2499
-
2500
-	$remplace = [
2501
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2502
-		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2503
-		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2504
-		'/auto_increment/is' => '',
2505
-		'/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2506
-		'/(timestamp .* )ON .*$/is' => '\\1',
2507
-		'/character set \w+/is' => '',
2508
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2509
-		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2510
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2511
-		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2512
-		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2513
-	];
2514
-
2515
-	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2516
-	$remplace_autocinc = [
2517
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2518
-	];
2519
-	// pour les int non autoincrement, il faut un DEFAULT
2520
-	$remplace_nonautocinc = [
2521
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2522
-	];
2523
-
2524
-	if (is_string($query)) {
2525
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
2526
-		if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2527
-			$query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2528
-		} else {
2529
-			$query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2530
-			$query = _sqlite_collate_ci($query);
2531
-		}
2532
-	} elseif (is_array($query)) {
2533
-		foreach ($query as $k => $q) {
2534
-			$ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2535
-			$query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2536
-			if ($ai) {
2537
-				$query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2538
-			} else {
2539
-				$query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2540
-				$query[$k] = _sqlite_collate_ci($query[$k]);
2541
-			}
2542
-		}
2543
-	}
2544
-
2545
-	return $query;
2496
+    // quelques remplacements
2497
+    $num = '(\s*\([0-9]*\))?';
2498
+    $enum = '(\s*\([^\)]*\))?';
2499
+
2500
+    $remplace = [
2501
+        '/enum' . $enum . '/is' => 'VARCHAR(255)',
2502
+        '/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2503
+        '/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2504
+        '/auto_increment/is' => '',
2505
+        '/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2506
+        '/(timestamp .* )ON .*$/is' => '\\1',
2507
+        '/character set \w+/is' => '',
2508
+        '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2509
+        '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2510
+        '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2511
+        '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2512
+        '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2513
+    ];
2514
+
2515
+    // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2516
+    $remplace_autocinc = [
2517
+        '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2518
+    ];
2519
+    // pour les int non autoincrement, il faut un DEFAULT
2520
+    $remplace_nonautocinc = [
2521
+        '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2522
+    ];
2523
+
2524
+    if (is_string($query)) {
2525
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
2526
+        if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2527
+            $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2528
+        } else {
2529
+            $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2530
+            $query = _sqlite_collate_ci($query);
2531
+        }
2532
+    } elseif (is_array($query)) {
2533
+        foreach ($query as $k => $q) {
2534
+            $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2535
+            $query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2536
+            if ($ai) {
2537
+                $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2538
+            } else {
2539
+                $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2540
+                $query[$k] = _sqlite_collate_ci($query[$k]);
2541
+            }
2542
+        }
2543
+    }
2544
+
2545
+    return $query;
2546 2546
 }
2547 2547
 
2548 2548
 /**
@@ -2553,17 +2553,17 @@  discard block
 block discarded – undo
2553 2553
  * @return string
2554 2554
  */
2555 2555
 function _sqlite_collate_ci($champ) {
2556
-	if (stripos($champ, 'COLLATE') !== false) {
2557
-		return $champ;
2558
-	}
2559
-	if (stripos($champ, 'BINARY') !== false) {
2560
-		return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2561
-	}
2562
-	if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2563
-		return $champ . ' COLLATE NOCASE';
2564
-	}
2556
+    if (stripos($champ, 'COLLATE') !== false) {
2557
+        return $champ;
2558
+    }
2559
+    if (stripos($champ, 'BINARY') !== false) {
2560
+        return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2561
+    }
2562
+    if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2563
+        return $champ . ' COLLATE NOCASE';
2564
+    }
2565 2565
 
2566
-	return $champ;
2566
+    return $champ;
2567 2567
 }
2568 2568
 
2569 2569
 
@@ -2582,84 +2582,84 @@  discard block
 block discarded – undo
2582 2582
  * @return bool|string
2583 2583
  */
2584 2584
 function _sqlite_requete_create(
2585
-	$nom,
2586
-	$champs,
2587
-	$cles,
2588
-	$autoinc = false,
2589
-	$temporary = false,
2590
-	$_ifnotexists = true,
2591
-	$serveur = '',
2592
-	$requeter = true
2585
+    $nom,
2586
+    $champs,
2587
+    $cles,
2588
+    $autoinc = false,
2589
+    $temporary = false,
2590
+    $_ifnotexists = true,
2591
+    $serveur = '',
2592
+    $requeter = true
2593 2593
 ) {
2594
-	$query = $keys = $s = $p = '';
2595
-
2596
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
2597
-	// sans les renseigner (laisse le compilo recuperer la description)
2598
-	if (!is_array($champs) || !is_array($cles)) {
2599
-		return;
2600
-	}
2601
-
2602
-	// sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2603
-	// il faut passer par des create index
2604
-	// Il gere par contre primary key !
2605
-	// Soit la PK est definie dans les cles, soit dans un champs
2606
-	// soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2607
-	$pk = 'PRIMARY KEY';
2608
-	// le champ de cle primaire
2609
-	$champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2610
-
2611
-	foreach ($champs as $k => $v) {
2612
-		if (false !== stripos($v, $pk)) {
2613
-			$champ_pk = $k;
2614
-			// on n'en a plus besoin dans field, vu que defini dans key
2615
-			$champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2616
-			break;
2617
-		}
2618
-	}
2619
-
2620
-	if ($champ_pk) {
2621
-		$keys = "\n\t\t$pk ($champ_pk)";
2622
-	}
2623
-	// Pas de DEFAULT 0 sur les cles primaires en auto-increment
2624
-	if (
2625
-		isset($champs[$champ_pk])
2626
-		and stripos($champs[$champ_pk], 'default 0') !== false
2627
-	) {
2628
-		$champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2629
-	}
2630
-
2631
-	$champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2632
-	foreach ($champs as $k => $v) {
2633
-		$query .= "$s\n\t\t$k $v";
2634
-		$s = ',';
2635
-	}
2636
-
2637
-	$ifnotexists = '';
2638
-	if ($_ifnotexists) {
2639
-		$version = spip_sqlite_fetch(
2640
-			spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2641
-			'',
2642
-			$serveur
2643
-		);
2644
-		if (!function_exists('spip_version_compare')) {
2645
-			include_spip('plugins/installer');
2646
-		}
2647
-
2648
-		if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2649
-			$ifnotexists = ' IF NOT EXISTS';
2650
-		} else {
2651
-			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2652
-			$a = spip_sqlite_showtable($nom, $serveur);
2653
-			if (isset($a['key']['KEY ' . $nom])) {
2654
-				return true;
2655
-			}
2656
-		}
2657
-	}
2658
-
2659
-	$temporary = $temporary ? ' TEMPORARY' : '';
2660
-	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2661
-
2662
-	return $q;
2594
+    $query = $keys = $s = $p = '';
2595
+
2596
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
2597
+    // sans les renseigner (laisse le compilo recuperer la description)
2598
+    if (!is_array($champs) || !is_array($cles)) {
2599
+        return;
2600
+    }
2601
+
2602
+    // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2603
+    // il faut passer par des create index
2604
+    // Il gere par contre primary key !
2605
+    // Soit la PK est definie dans les cles, soit dans un champs
2606
+    // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2607
+    $pk = 'PRIMARY KEY';
2608
+    // le champ de cle primaire
2609
+    $champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2610
+
2611
+    foreach ($champs as $k => $v) {
2612
+        if (false !== stripos($v, $pk)) {
2613
+            $champ_pk = $k;
2614
+            // on n'en a plus besoin dans field, vu que defini dans key
2615
+            $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2616
+            break;
2617
+        }
2618
+    }
2619
+
2620
+    if ($champ_pk) {
2621
+        $keys = "\n\t\t$pk ($champ_pk)";
2622
+    }
2623
+    // Pas de DEFAULT 0 sur les cles primaires en auto-increment
2624
+    if (
2625
+        isset($champs[$champ_pk])
2626
+        and stripos($champs[$champ_pk], 'default 0') !== false
2627
+    ) {
2628
+        $champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2629
+    }
2630
+
2631
+    $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2632
+    foreach ($champs as $k => $v) {
2633
+        $query .= "$s\n\t\t$k $v";
2634
+        $s = ',';
2635
+    }
2636
+
2637
+    $ifnotexists = '';
2638
+    if ($_ifnotexists) {
2639
+        $version = spip_sqlite_fetch(
2640
+            spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2641
+            '',
2642
+            $serveur
2643
+        );
2644
+        if (!function_exists('spip_version_compare')) {
2645
+            include_spip('plugins/installer');
2646
+        }
2647
+
2648
+        if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2649
+            $ifnotexists = ' IF NOT EXISTS';
2650
+        } else {
2651
+            /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2652
+            $a = spip_sqlite_showtable($nom, $serveur);
2653
+            if (isset($a['key']['KEY ' . $nom])) {
2654
+                return true;
2655
+            }
2656
+        }
2657
+    }
2658
+
2659
+    $temporary = $temporary ? ' TEMPORARY' : '';
2660
+    $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2661
+
2662
+    return $q;
2663 2663
 }
2664 2664
 
2665 2665
 
@@ -2678,41 +2678,41 @@  discard block
 block discarded – undo
2678 2678
  * @return
2679 2679
  */
2680 2680
 function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') {
2681
-	static $tables = [];
2682
-
2683
-	if (!isset($tables[$table])) {
2684
-		if (!$desc) {
2685
-			$trouver_table = charger_fonction('trouver_table', 'base');
2686
-			$desc = $trouver_table($table, $serveur);
2687
-			// si pas de description, on ne fait rien, ou on die() ?
2688
-			if (!$desc) {
2689
-				return $couples;
2690
-			}
2691
-		}
2692
-
2693
-		// recherche des champs avec simplement 'TIMESTAMP'
2694
-		// cependant, il faudra peut etre etendre
2695
-		// avec la gestion de DEFAULT et ON UPDATE
2696
-		// mais ceux-ci ne sont pas utilises dans le core
2697
-		$tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2698
-
2699
-		$now = _sqlite_func_now(true);
2700
-		foreach ($desc['field'] as $k => $v) {
2701
-			if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2702
-				$tables[$table]['desc'][$k] = $v;
2703
-				$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2704
-			}
2705
-		}
2706
-	}
2707
-	else {
2708
-		$now = _sqlite_func_now(true);
2709
-		foreach (array_keys($tables[$table]['desc']) as $k) {
2710
-			$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2711
-		}
2712
-	}
2713
-
2714
-	// ajout des champs type 'timestamp' absents
2715
-	return array_merge($tables[$table]['valeur'], $couples);
2681
+    static $tables = [];
2682
+
2683
+    if (!isset($tables[$table])) {
2684
+        if (!$desc) {
2685
+            $trouver_table = charger_fonction('trouver_table', 'base');
2686
+            $desc = $trouver_table($table, $serveur);
2687
+            // si pas de description, on ne fait rien, ou on die() ?
2688
+            if (!$desc) {
2689
+                return $couples;
2690
+            }
2691
+        }
2692
+
2693
+        // recherche des champs avec simplement 'TIMESTAMP'
2694
+        // cependant, il faudra peut etre etendre
2695
+        // avec la gestion de DEFAULT et ON UPDATE
2696
+        // mais ceux-ci ne sont pas utilises dans le core
2697
+        $tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2698
+
2699
+        $now = _sqlite_func_now(true);
2700
+        foreach ($desc['field'] as $k => $v) {
2701
+            if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2702
+                $tables[$table]['desc'][$k] = $v;
2703
+                $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2704
+            }
2705
+        }
2706
+    }
2707
+    else {
2708
+        $now = _sqlite_func_now(true);
2709
+        foreach (array_keys($tables[$table]['desc']) as $k) {
2710
+            $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2711
+        }
2712
+    }
2713
+
2714
+    // ajout des champs type 'timestamp' absents
2715
+    return array_merge($tables[$table]['valeur'], $couples);
2716 2716
 }
2717 2717
 
2718 2718
 
@@ -2723,7 +2723,7 @@  discard block
 block discarded – undo
2723 2723
  * @return array|bool
2724 2724
  */
2725 2725
 function spip_versions_sqlite() {
2726
-	return _sqlite_charger_version();
2726
+    return _sqlite_charger_version();
2727 2727
 }
2728 2728
 
2729 2729
 /**
@@ -2731,114 +2731,114 @@  discard block
 block discarded – undo
2731 2731
  * encadrées de transactions.
2732 2732
  **/
2733 2733
 class spip_sqlite {
2734
-	/** @var sqlite_requeteur[] Liste des instances de requêteurs créés */
2735
-	public static $requeteurs = [];
2736
-	/** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */
2737
-	public static $transaction_en_cours = [];
2738
-
2739
-
2740
-	/**
2741
-	 * Retourne une unique instance du requêteur
2742
-	 *
2743
-	 * Retourne une instance unique du requêteur pour une connexion SQLite
2744
-	 * donnée
2745
-	 *
2746
-	 * @param string $serveur
2747
-	 *    Nom du connecteur
2748
-	 * @return sqlite_requeteur
2749
-	 *    Instance unique du requêteur
2750
-	 **/
2751
-	public static function requeteur($serveur) {
2752
-		if (!isset(spip_sqlite::$requeteurs[$serveur])) {
2753
-			spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur);
2754
-		}
2755
-
2756
-		return spip_sqlite::$requeteurs[$serveur];
2757
-	}
2758
-
2759
-	/**
2760
-	 * Prépare le texte d'une requête avant son exécution
2761
-	 *
2762
-	 * Adapte la requête au format plus ou moins MySQL par un format
2763
-	 * compris de SQLite.
2764
-	 *
2765
-	 * Change les préfixes de tables SPIP par ceux véritables
2766
-	 *
2767
-	 * @param string $query Requête à préparer
2768
-	 * @param string $serveur Nom de la connexion
2769
-	 * @return string           Requête préparée
2770
-	 */
2771
-	public static function traduire_requete($query, $serveur) {
2772
-		$requeteur = spip_sqlite::requeteur($serveur);
2773
-		$traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version);
2774
-
2775
-		return $traducteur->traduire_requete();
2776
-	}
2777
-
2778
-	/**
2779
-	 * Démarre une transaction
2780
-	 *
2781
-	 * @param string $serveur Nom de la connexion
2782
-	 **/
2783
-	public static function demarrer_transaction($serveur) {
2784
-		spip_sqlite::executer_requete('BEGIN TRANSACTION', $serveur);
2785
-		spip_sqlite::$transaction_en_cours[$serveur] = true;
2786
-	}
2787
-
2788
-	/**
2789
-	 * Exécute la requête donnée
2790
-	 *
2791
-	 * @param string $query Requête
2792
-	 * @param string $serveur Nom de la connexion
2793
-	 * @param null|bool $tracer Demander des statistiques (temps) ?
2794
-	 **/
2795
-	public static function executer_requete($query, $serveur, $tracer = null) {
2796
-		$requeteur = spip_sqlite::requeteur($serveur);
2797
-
2798
-		return $requeteur->executer_requete($query, $tracer);
2799
-	}
2800
-
2801
-	/**
2802
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2803
-	 *
2804
-	 * @param string $serveur Nom de la connexion
2805
-	 * return int                Identifiant
2806
-	 **/
2807
-	public static function last_insert_id($serveur) {
2808
-		$requeteur = spip_sqlite::requeteur($serveur);
2809
-
2810
-		return $requeteur->last_insert_id($serveur);
2811
-	}
2812
-
2813
-	/**
2814
-	 * Annule une transaction
2815
-	 *
2816
-	 * @param string $serveur Nom de la connexion
2817
-	 **/
2818
-	public static function annuler_transaction($serveur) {
2819
-		spip_sqlite::executer_requete('ROLLBACK', $serveur);
2820
-		spip_sqlite::$transaction_en_cours[$serveur] = false;
2821
-	}
2822
-
2823
-	/**
2824
-	 * Termine une transaction
2825
-	 *
2826
-	 * @param string $serveur Nom de la connexion
2827
-	 **/
2828
-	public static function finir_transaction($serveur) {
2829
-		// si pas de transaction en cours, ne rien faire et le dire
2830
-		if (
2831
-			!isset(spip_sqlite::$transaction_en_cours[$serveur])
2832
-			or spip_sqlite::$transaction_en_cours[$serveur] == false
2833
-		) {
2834
-			return false;
2835
-		}
2836
-		// sinon fermer la transaction et retourner true
2837
-		spip_sqlite::executer_requete('COMMIT', $serveur);
2838
-		spip_sqlite::$transaction_en_cours[$serveur] = false;
2839
-
2840
-		return true;
2841
-	}
2734
+    /** @var sqlite_requeteur[] Liste des instances de requêteurs créés */
2735
+    public static $requeteurs = [];
2736
+    /** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */
2737
+    public static $transaction_en_cours = [];
2738
+
2739
+
2740
+    /**
2741
+     * Retourne une unique instance du requêteur
2742
+     *
2743
+     * Retourne une instance unique du requêteur pour une connexion SQLite
2744
+     * donnée
2745
+     *
2746
+     * @param string $serveur
2747
+     *    Nom du connecteur
2748
+     * @return sqlite_requeteur
2749
+     *    Instance unique du requêteur
2750
+     **/
2751
+    public static function requeteur($serveur) {
2752
+        if (!isset(spip_sqlite::$requeteurs[$serveur])) {
2753
+            spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur);
2754
+        }
2755
+
2756
+        return spip_sqlite::$requeteurs[$serveur];
2757
+    }
2758
+
2759
+    /**
2760
+     * Prépare le texte d'une requête avant son exécution
2761
+     *
2762
+     * Adapte la requête au format plus ou moins MySQL par un format
2763
+     * compris de SQLite.
2764
+     *
2765
+     * Change les préfixes de tables SPIP par ceux véritables
2766
+     *
2767
+     * @param string $query Requête à préparer
2768
+     * @param string $serveur Nom de la connexion
2769
+     * @return string           Requête préparée
2770
+     */
2771
+    public static function traduire_requete($query, $serveur) {
2772
+        $requeteur = spip_sqlite::requeteur($serveur);
2773
+        $traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version);
2774
+
2775
+        return $traducteur->traduire_requete();
2776
+    }
2777
+
2778
+    /**
2779
+     * Démarre une transaction
2780
+     *
2781
+     * @param string $serveur Nom de la connexion
2782
+     **/
2783
+    public static function demarrer_transaction($serveur) {
2784
+        spip_sqlite::executer_requete('BEGIN TRANSACTION', $serveur);
2785
+        spip_sqlite::$transaction_en_cours[$serveur] = true;
2786
+    }
2787
+
2788
+    /**
2789
+     * Exécute la requête donnée
2790
+     *
2791
+     * @param string $query Requête
2792
+     * @param string $serveur Nom de la connexion
2793
+     * @param null|bool $tracer Demander des statistiques (temps) ?
2794
+     **/
2795
+    public static function executer_requete($query, $serveur, $tracer = null) {
2796
+        $requeteur = spip_sqlite::requeteur($serveur);
2797
+
2798
+        return $requeteur->executer_requete($query, $tracer);
2799
+    }
2800
+
2801
+    /**
2802
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2803
+     *
2804
+     * @param string $serveur Nom de la connexion
2805
+     * return int                Identifiant
2806
+     **/
2807
+    public static function last_insert_id($serveur) {
2808
+        $requeteur = spip_sqlite::requeteur($serveur);
2809
+
2810
+        return $requeteur->last_insert_id($serveur);
2811
+    }
2812
+
2813
+    /**
2814
+     * Annule une transaction
2815
+     *
2816
+     * @param string $serveur Nom de la connexion
2817
+     **/
2818
+    public static function annuler_transaction($serveur) {
2819
+        spip_sqlite::executer_requete('ROLLBACK', $serveur);
2820
+        spip_sqlite::$transaction_en_cours[$serveur] = false;
2821
+    }
2822
+
2823
+    /**
2824
+     * Termine une transaction
2825
+     *
2826
+     * @param string $serveur Nom de la connexion
2827
+     **/
2828
+    public static function finir_transaction($serveur) {
2829
+        // si pas de transaction en cours, ne rien faire et le dire
2830
+        if (
2831
+            !isset(spip_sqlite::$transaction_en_cours[$serveur])
2832
+            or spip_sqlite::$transaction_en_cours[$serveur] == false
2833
+        ) {
2834
+            return false;
2835
+        }
2836
+        // sinon fermer la transaction et retourner true
2837
+        spip_sqlite::executer_requete('COMMIT', $serveur);
2838
+        spip_sqlite::$transaction_en_cours[$serveur] = false;
2839
+
2840
+        return true;
2841
+    }
2842 2842
 }
2843 2843
 
2844 2844
 /*
@@ -2851,127 +2851,127 @@  discard block
 block discarded – undo
2851 2851
  */
2852 2852
 
2853 2853
 class sqlite_requeteur {
2854
-	/** @var string Texte de la requête */
2855
-	public $query = ''; // la requete
2856
-	/** @var string Nom de la connexion */
2857
-	public $serveur = '';
2858
-	/** @var Ressource Identifiant de la connexion SQLite */
2859
-	public $link = '';
2860
-	/** @var string Prefixe des tables SPIP */
2861
-	public $prefixe = '';
2862
-	/** @var string Nom de la base de donnée */
2863
-	public $db = '';
2864
-	/** @var bool Doit-on tracer les requetes (var_profile) ? */
2865
-	public $tracer = false; // doit-on tracer les requetes (var_profile)
2866
-
2867
-	/** @var string Version de SQLite (2 ou 3) */
2868
-	public $sqlite_version = '';
2869
-
2870
-	/**
2871
-	 * Constructeur
2872
-	 *
2873
-	 * @param string $serveur
2874
-	 * @return bool
2875
-	 */
2876
-	public function __construct($serveur = '') {
2877
-		_sqlite_init();
2878
-		$this->serveur = strtolower($serveur);
2879
-
2880
-		if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2881
-			spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
2882
-
2883
-			return false;
2884
-		}
2885
-
2886
-		$this->sqlite_version = _sqlite_is_version('', $this->link);
2887
-
2888
-		$this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe'];
2889
-		$this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db'];
2890
-
2891
-		// tracage des requetes ?
2892
-		$this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
2893
-	}
2894
-
2895
-	/**
2896
-	 * Lancer la requête transmise et faire le tracage si demandé
2897
-	 *
2898
-	 * @param string $query
2899
-	 *     Requête à exécuter
2900
-	 * @param bool|null $tracer
2901
-	 *     true pour tracer la requête
2902
-	 * @return bool|SQLiteResult
2903
-	 */
2904
-	public function executer_requete($query, $tracer = null) {
2905
-		if (is_null($tracer)) {
2906
-			$tracer = $this->tracer;
2907
-		}
2908
-		$err = '';
2909
-		$t = 0;
2910
-		if ($tracer or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
2911
-			include_spip('public/tracer');
2912
-			$t = trace_query_start();
2913
-		}
2914
-
2915
-		# spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
2916
-		if ($this->link) {
2917
-			// memoriser la derniere erreur PHP vue
2918
-			$last_error = (function_exists('error_get_last') ? error_get_last() : '');
2919
-			$e = null;
2920
-			// sauver la derniere requete
2921
-			$GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query;
2922
-			$GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++;
2923
-
2924
-			try {
2925
-				$r = $this->link->query($query);
2926
-			} catch (\PDOException $e) {
2927
-				spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
2928
-				$r = false;
2929
-			}
2930
-			// sauvegarde de la requete (elle y est deja dans $r->queryString)
2931
-			# $r->spipQueryString = $query;
2932
-
2933
-			// comptage : oblige de compter le nombre d'entrees retournees
2934
-			// par une requete SELECT
2935
-			// aucune autre solution ne donne le nombre attendu :( !
2936
-			// particulierement s'il y a des LIMIT dans la requete.
2937
-			if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') {
2938
-				if ($r) {
2939
-					// noter le link et la query pour faire le comptage *si* on en a besoin
2940
-					$r->spipSqliteRowCount = [$this->link, $query];
2941
-				} elseif ($r instanceof PDOStatement) {
2942
-					$r->spipSqliteRowCount = 0;
2943
-				}
2944
-			}
2945
-
2946
-			// loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2947
-			if ($e and $e instanceof \PDOException) {
2948
-				$err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
2949
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2950
-			} elseif ($err = (function_exists('error_get_last') ? error_get_last() : '') and $err != $last_error) {
2951
-				$err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
2952
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2953
-			} else {
2954
-				$err = '';
2955
-			}
2956
-		} else {
2957
-			$r = false;
2958
-		}
2959
-
2960
-		if (spip_sqlite_errno($this->serveur)) {
2961
-			$err .= spip_sqlite_error($query, $this->serveur);
2962
-		}
2963
-
2964
-		return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
2965
-	}
2966
-
2967
-	/**
2968
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2969
-	 *
2970
-	 * @return int
2971
-	 **/
2972
-	public function last_insert_id() {
2973
-		return $this->link->lastInsertId();
2974
-	}
2854
+    /** @var string Texte de la requête */
2855
+    public $query = ''; // la requete
2856
+    /** @var string Nom de la connexion */
2857
+    public $serveur = '';
2858
+    /** @var Ressource Identifiant de la connexion SQLite */
2859
+    public $link = '';
2860
+    /** @var string Prefixe des tables SPIP */
2861
+    public $prefixe = '';
2862
+    /** @var string Nom de la base de donnée */
2863
+    public $db = '';
2864
+    /** @var bool Doit-on tracer les requetes (var_profile) ? */
2865
+    public $tracer = false; // doit-on tracer les requetes (var_profile)
2866
+
2867
+    /** @var string Version de SQLite (2 ou 3) */
2868
+    public $sqlite_version = '';
2869
+
2870
+    /**
2871
+     * Constructeur
2872
+     *
2873
+     * @param string $serveur
2874
+     * @return bool
2875
+     */
2876
+    public function __construct($serveur = '') {
2877
+        _sqlite_init();
2878
+        $this->serveur = strtolower($serveur);
2879
+
2880
+        if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2881
+            spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
2882
+
2883
+            return false;
2884
+        }
2885
+
2886
+        $this->sqlite_version = _sqlite_is_version('', $this->link);
2887
+
2888
+        $this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe'];
2889
+        $this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db'];
2890
+
2891
+        // tracage des requetes ?
2892
+        $this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
2893
+    }
2894
+
2895
+    /**
2896
+     * Lancer la requête transmise et faire le tracage si demandé
2897
+     *
2898
+     * @param string $query
2899
+     *     Requête à exécuter
2900
+     * @param bool|null $tracer
2901
+     *     true pour tracer la requête
2902
+     * @return bool|SQLiteResult
2903
+     */
2904
+    public function executer_requete($query, $tracer = null) {
2905
+        if (is_null($tracer)) {
2906
+            $tracer = $this->tracer;
2907
+        }
2908
+        $err = '';
2909
+        $t = 0;
2910
+        if ($tracer or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
2911
+            include_spip('public/tracer');
2912
+            $t = trace_query_start();
2913
+        }
2914
+
2915
+        # spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
2916
+        if ($this->link) {
2917
+            // memoriser la derniere erreur PHP vue
2918
+            $last_error = (function_exists('error_get_last') ? error_get_last() : '');
2919
+            $e = null;
2920
+            // sauver la derniere requete
2921
+            $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query;
2922
+            $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++;
2923
+
2924
+            try {
2925
+                $r = $this->link->query($query);
2926
+            } catch (\PDOException $e) {
2927
+                spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
2928
+                $r = false;
2929
+            }
2930
+            // sauvegarde de la requete (elle y est deja dans $r->queryString)
2931
+            # $r->spipQueryString = $query;
2932
+
2933
+            // comptage : oblige de compter le nombre d'entrees retournees
2934
+            // par une requete SELECT
2935
+            // aucune autre solution ne donne le nombre attendu :( !
2936
+            // particulierement s'il y a des LIMIT dans la requete.
2937
+            if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') {
2938
+                if ($r) {
2939
+                    // noter le link et la query pour faire le comptage *si* on en a besoin
2940
+                    $r->spipSqliteRowCount = [$this->link, $query];
2941
+                } elseif ($r instanceof PDOStatement) {
2942
+                    $r->spipSqliteRowCount = 0;
2943
+                }
2944
+            }
2945
+
2946
+            // loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2947
+            if ($e and $e instanceof \PDOException) {
2948
+                $err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
2949
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2950
+            } elseif ($err = (function_exists('error_get_last') ? error_get_last() : '') and $err != $last_error) {
2951
+                $err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
2952
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2953
+            } else {
2954
+                $err = '';
2955
+            }
2956
+        } else {
2957
+            $r = false;
2958
+        }
2959
+
2960
+        if (spip_sqlite_errno($this->serveur)) {
2961
+            $err .= spip_sqlite_error($query, $this->serveur);
2962
+        }
2963
+
2964
+        return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
2965
+    }
2966
+
2967
+    /**
2968
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2969
+     *
2970
+     * @return int
2971
+     **/
2972
+    public function last_insert_id() {
2973
+        return $this->link->lastInsertId();
2974
+    }
2975 2975
 }
2976 2976
 
2977 2977
 
@@ -2981,206 +2981,206 @@  discard block
 block discarded – undo
2981 2981
  * (fonction pour proteger les textes)
2982 2982
  */
2983 2983
 class sqlite_traducteur {
2984
-	/** @var string $query Texte de la requête */
2985
-	public $query = '';
2986
-	/** @var string $prefixe Préfixe des tables */
2987
-	public $prefixe = '';
2988
-	/** @var string $sqlite_version Version de sqlite (2 ou 3) */
2989
-	public $sqlite_version = '';
2990
-
2991
-	/** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
2992
-	 *
2993
-	 * @var array
2994
-	 */
2995
-	public $textes = [];
2996
-
2997
-	/**
2998
-	 * Constructeur
2999
-	 *
3000
-	 * @param string $query Requête à préparer
3001
-	 * @param string $prefixe Prefixe des tables à utiliser
3002
-	 * @param string $sqlite_version Version SQLite (2 ou 3)
3003
-	 */
3004
-	public function __construct($query, $prefixe, $sqlite_version) {
3005
-		$this->query = $query;
3006
-		$this->prefixe = $prefixe;
3007
-		$this->sqlite_version = $sqlite_version;
3008
-	}
3009
-
3010
-	/**
3011
-	 * Transformer la requete pour SQLite
3012
-	 *
3013
-	 * Enlève les textes, transforme la requête pour quelle soit
3014
-	 * bien interprétée par SQLite, puis remet les textes
3015
-	 * la fonction affecte `$this->query`
3016
-	 */
3017
-	public function traduire_requete() {
3018
-		//
3019
-		// 1) Protection des textes en les remplacant par des codes
3020
-		//
3021
-		// enlever les 'textes' et initialiser avec
3022
-		list($this->query, $textes) = query_echappe_textes($this->query);
3023
-
3024
-		//
3025
-		// 2) Corrections de la requete
3026
-		//
3027
-		// Correction Create Database
3028
-		// Create Database -> requete ignoree
3029
-		if (strpos($this->query, 'CREATE DATABASE') === 0) {
3030
-			spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
3031
-			$this->query = 'SELECT 1';
3032
-		}
3033
-
3034
-		// Correction Insert Ignore
3035
-		// INSERT IGNORE -> insert (tout court et pas 'insert or replace')
3036
-		if (strpos($this->query, 'INSERT IGNORE') === 0) {
3037
-			spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
3038
-			$this->query = 'INSERT ' . substr($this->query, '13');
3039
-		}
3040
-
3041
-		// Correction des dates avec INTERVAL
3042
-		// utiliser sql_date_proche() de preference
3043
-		if (strpos($this->query, 'INTERVAL') !== false) {
3044
-			$this->query = preg_replace_callback(
3045
-				'/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U',
3046
-				[&$this, '_remplacerDateParTime'],
3047
-				$this->query
3048
-			);
3049
-		}
3050
-
3051
-		if (strpos($this->query, 'LEFT(') !== false) {
3052
-			$this->query = str_replace('LEFT(', '_LEFT(', $this->query);
3053
-		}
3054
-
3055
-		if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) {
3056
-			$this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query);
3057
-		}
3058
-
3059
-
3060
-		// Correction Using
3061
-		// USING (non reconnu en sqlite2)
3062
-		// problematique car la jointure ne se fait pas du coup.
3063
-		if (($this->sqlite_version == 2) && (strpos($this->query, 'USING') !== false)) {
3064
-			spip_log(
3065
-				"'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
3066
-				'sqlite.' . _LOG_ERREUR
3067
-			);
3068
-			$this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
3069
-		}
3070
-
3071
-		// Correction Field
3072
-		// remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
3073
-		if (strpos($this->query, 'FIELD') !== false) {
3074
-			$this->query = preg_replace_callback(
3075
-				'/FIELD\s*\(([^\)]*)\)/',
3076
-				[&$this, '_remplacerFieldParCase'],
3077
-				$this->query
3078
-			);
3079
-		}
3080
-
3081
-		// Correction des noms de tables FROM
3082
-		// mettre les bons noms de table dans from, update, insert, replace...
3083
-		if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) {
3084
-			$suite = strstr($this->query, $regs[0]);
3085
-			$this->query = substr($this->query, 0, -strlen($suite));
3086
-		} else {
3087
-			$suite = '';
3088
-		}
3089
-		$pref = ($this->prefixe) ? $this->prefixe . '_' : '';
3090
-		$this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
3091
-
3092
-		// Correction zero AS x
3093
-		// pg n'aime pas 0+x AS alias, sqlite, dans le meme style,
3094
-		// n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
3095
-		// il dit que x ne doit pas être un integer dans le order by !
3096
-		// on remplace du coup x par vide() dans ce cas uniquement
3097
-		//
3098
-		// apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}}
3099
-		// mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28)
3100
-		if ((strpos($this->query, '0 AS') !== false)) {
3101
-			// on ne remplace que dans ORDER BY ou GROUP BY
3102
-			if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
3103
-				$suite = strstr($this->query, $regs[0]);
3104
-				$this->query = substr($this->query, 0, -strlen($suite));
3105
-
3106
-				// on cherche les noms des x dans 0 AS x
3107
-				// on remplace dans $suite le nom par vide()
3108
-				preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
3109
-				foreach ($matches[1] as $m) {
3110
-					if (strpos($suite, $m) !== false) {
3111
-						$suite = preg_replace(",\b$m\b,", 'VIDE()', $suite);
3112
-					}
3113
-				}
3114
-				$this->query .= $suite;
3115
-			}
3116
-		}
3117
-
3118
-		// Correction possible des divisions entieres
3119
-		// Le standard SQL (lequel? ou?) semble indiquer que
3120
-		// a/b=c doit donner c entier si a et b sont entiers 4/3=1.
3121
-		// C'est ce que retournent effectivement SQL Server et SQLite
3122
-		// Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
3123
-		//
3124
-		// On peut forcer la conversion en multipliant par 1.0 avant la division
3125
-		// /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus !
3126
-		// cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
3127
-		//     http://www.sqlite.org/cvstrac/tktview?tn=3202
3128
-		// (4*1.0/3) n'est pas rendu dans ce cas !
3129
-		# $this->query = str_replace('/','* 1.00 / ',$this->query);
3130
-
3131
-
3132
-		// Correction critere REGEXP, non reconnu en sqlite2
3133
-		if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) {
3134
-			$this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
3135
-		}
3136
-
3137
-		//
3138
-		// 3) Remise en place des textes d'origine
3139
-		//
3140
-		// Correction Antiquotes et echappements
3141
-		// ` => rien
3142
-		if (strpos($this->query, '`') !== false) {
3143
-			$this->query = str_replace('`', '', $this->query);
3144
-		}
3145
-
3146
-		$this->query = query_reinjecte_textes($this->query, $textes);
3147
-
3148
-		return $this->query;
3149
-	}
3150
-
3151
-
3152
-	/**
3153
-	 * Callback pour remplacer `DATE_` / `INTERVAL`
3154
-	 * par `DATE ... strtotime`
3155
-	 *
3156
-	 * @param array $matches Captures
3157
-	 * @return string Texte de date compris par SQLite
3158
-	 */
3159
-	public function _remplacerDateParTime($matches) {
3160
-		$op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
3161
-
3162
-		return "datetime$matches[2] '$op$matches[3] $matches[4]')";
3163
-	}
3164
-
3165
-	/**
3166
-	 * Callback pour remplacer `FIELD(table,i,j,k...)`
3167
-	 * par `CASE WHEN table=i THEN n ... ELSE 0 END`
3168
-	 *
3169
-	 * @param array $matches Captures
3170
-	 * @return string Texte de liste ordonnée compris par SQLite
3171
-	 */
3172
-	public function _remplacerFieldParCase($matches) {
3173
-		$fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
3174
-		$t = explode(',', $fields);
3175
-		$index = array_shift($t);
3176
-
3177
-		$res = '';
3178
-		$n = 0;
3179
-		foreach ($t as $v) {
3180
-			$n++;
3181
-			$res .= "\nWHEN $index=$v THEN $n";
3182
-		}
3183
-
3184
-		return "CASE $res ELSE 0 END ";
3185
-	}
2984
+    /** @var string $query Texte de la requête */
2985
+    public $query = '';
2986
+    /** @var string $prefixe Préfixe des tables */
2987
+    public $prefixe = '';
2988
+    /** @var string $sqlite_version Version de sqlite (2 ou 3) */
2989
+    public $sqlite_version = '';
2990
+
2991
+    /** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
2992
+     *
2993
+     * @var array
2994
+     */
2995
+    public $textes = [];
2996
+
2997
+    /**
2998
+     * Constructeur
2999
+     *
3000
+     * @param string $query Requête à préparer
3001
+     * @param string $prefixe Prefixe des tables à utiliser
3002
+     * @param string $sqlite_version Version SQLite (2 ou 3)
3003
+     */
3004
+    public function __construct($query, $prefixe, $sqlite_version) {
3005
+        $this->query = $query;
3006
+        $this->prefixe = $prefixe;
3007
+        $this->sqlite_version = $sqlite_version;
3008
+    }
3009
+
3010
+    /**
3011
+     * Transformer la requete pour SQLite
3012
+     *
3013
+     * Enlève les textes, transforme la requête pour quelle soit
3014
+     * bien interprétée par SQLite, puis remet les textes
3015
+     * la fonction affecte `$this->query`
3016
+     */
3017
+    public function traduire_requete() {
3018
+        //
3019
+        // 1) Protection des textes en les remplacant par des codes
3020
+        //
3021
+        // enlever les 'textes' et initialiser avec
3022
+        list($this->query, $textes) = query_echappe_textes($this->query);
3023
+
3024
+        //
3025
+        // 2) Corrections de la requete
3026
+        //
3027
+        // Correction Create Database
3028
+        // Create Database -> requete ignoree
3029
+        if (strpos($this->query, 'CREATE DATABASE') === 0) {
3030
+            spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
3031
+            $this->query = 'SELECT 1';
3032
+        }
3033
+
3034
+        // Correction Insert Ignore
3035
+        // INSERT IGNORE -> insert (tout court et pas 'insert or replace')
3036
+        if (strpos($this->query, 'INSERT IGNORE') === 0) {
3037
+            spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
3038
+            $this->query = 'INSERT ' . substr($this->query, '13');
3039
+        }
3040
+
3041
+        // Correction des dates avec INTERVAL
3042
+        // utiliser sql_date_proche() de preference
3043
+        if (strpos($this->query, 'INTERVAL') !== false) {
3044
+            $this->query = preg_replace_callback(
3045
+                '/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U',
3046
+                [&$this, '_remplacerDateParTime'],
3047
+                $this->query
3048
+            );
3049
+        }
3050
+
3051
+        if (strpos($this->query, 'LEFT(') !== false) {
3052
+            $this->query = str_replace('LEFT(', '_LEFT(', $this->query);
3053
+        }
3054
+
3055
+        if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) {
3056
+            $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query);
3057
+        }
3058
+
3059
+
3060
+        // Correction Using
3061
+        // USING (non reconnu en sqlite2)
3062
+        // problematique car la jointure ne se fait pas du coup.
3063
+        if (($this->sqlite_version == 2) && (strpos($this->query, 'USING') !== false)) {
3064
+            spip_log(
3065
+                "'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
3066
+                'sqlite.' . _LOG_ERREUR
3067
+            );
3068
+            $this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
3069
+        }
3070
+
3071
+        // Correction Field
3072
+        // remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
3073
+        if (strpos($this->query, 'FIELD') !== false) {
3074
+            $this->query = preg_replace_callback(
3075
+                '/FIELD\s*\(([^\)]*)\)/',
3076
+                [&$this, '_remplacerFieldParCase'],
3077
+                $this->query
3078
+            );
3079
+        }
3080
+
3081
+        // Correction des noms de tables FROM
3082
+        // mettre les bons noms de table dans from, update, insert, replace...
3083
+        if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) {
3084
+            $suite = strstr($this->query, $regs[0]);
3085
+            $this->query = substr($this->query, 0, -strlen($suite));
3086
+        } else {
3087
+            $suite = '';
3088
+        }
3089
+        $pref = ($this->prefixe) ? $this->prefixe . '_' : '';
3090
+        $this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
3091
+
3092
+        // Correction zero AS x
3093
+        // pg n'aime pas 0+x AS alias, sqlite, dans le meme style,
3094
+        // n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
3095
+        // il dit que x ne doit pas être un integer dans le order by !
3096
+        // on remplace du coup x par vide() dans ce cas uniquement
3097
+        //
3098
+        // apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}}
3099
+        // mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28)
3100
+        if ((strpos($this->query, '0 AS') !== false)) {
3101
+            // on ne remplace que dans ORDER BY ou GROUP BY
3102
+            if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
3103
+                $suite = strstr($this->query, $regs[0]);
3104
+                $this->query = substr($this->query, 0, -strlen($suite));
3105
+
3106
+                // on cherche les noms des x dans 0 AS x
3107
+                // on remplace dans $suite le nom par vide()
3108
+                preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
3109
+                foreach ($matches[1] as $m) {
3110
+                    if (strpos($suite, $m) !== false) {
3111
+                        $suite = preg_replace(",\b$m\b,", 'VIDE()', $suite);
3112
+                    }
3113
+                }
3114
+                $this->query .= $suite;
3115
+            }
3116
+        }
3117
+
3118
+        // Correction possible des divisions entieres
3119
+        // Le standard SQL (lequel? ou?) semble indiquer que
3120
+        // a/b=c doit donner c entier si a et b sont entiers 4/3=1.
3121
+        // C'est ce que retournent effectivement SQL Server et SQLite
3122
+        // Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
3123
+        //
3124
+        // On peut forcer la conversion en multipliant par 1.0 avant la division
3125
+        // /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus !
3126
+        // cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
3127
+        //     http://www.sqlite.org/cvstrac/tktview?tn=3202
3128
+        // (4*1.0/3) n'est pas rendu dans ce cas !
3129
+        # $this->query = str_replace('/','* 1.00 / ',$this->query);
3130
+
3131
+
3132
+        // Correction critere REGEXP, non reconnu en sqlite2
3133
+        if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) {
3134
+            $this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
3135
+        }
3136
+
3137
+        //
3138
+        // 3) Remise en place des textes d'origine
3139
+        //
3140
+        // Correction Antiquotes et echappements
3141
+        // ` => rien
3142
+        if (strpos($this->query, '`') !== false) {
3143
+            $this->query = str_replace('`', '', $this->query);
3144
+        }
3145
+
3146
+        $this->query = query_reinjecte_textes($this->query, $textes);
3147
+
3148
+        return $this->query;
3149
+    }
3150
+
3151
+
3152
+    /**
3153
+     * Callback pour remplacer `DATE_` / `INTERVAL`
3154
+     * par `DATE ... strtotime`
3155
+     *
3156
+     * @param array $matches Captures
3157
+     * @return string Texte de date compris par SQLite
3158
+     */
3159
+    public function _remplacerDateParTime($matches) {
3160
+        $op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
3161
+
3162
+        return "datetime$matches[2] '$op$matches[3] $matches[4]')";
3163
+    }
3164
+
3165
+    /**
3166
+     * Callback pour remplacer `FIELD(table,i,j,k...)`
3167
+     * par `CASE WHEN table=i THEN n ... ELSE 0 END`
3168
+     *
3169
+     * @param array $matches Captures
3170
+     * @return string Texte de liste ordonnée compris par SQLite
3171
+     */
3172
+    public function _remplacerFieldParCase($matches) {
3173
+        $fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
3174
+        $t = explode(',', $fields);
3175
+        $index = array_shift($t);
3176
+
3177
+        $res = '';
3178
+        $n = 0;
3179
+        foreach ($t as $v) {
3180
+            $n++;
3181
+            $res .= "\nWHEN $index=$v THEN $n";
3182
+        }
3183
+
3184
+        return "CASE $res ELSE 0 END ";
3185
+    }
3186 3186
 }
Please login to merge, or discard this patch.
ecrire/public/interfaces.php 1 patch
Indentation   +916 added lines, -916 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
 
@@ -34,53 +34,53 @@  discard block
 block discarded – undo
34 34
  * @package SPIP\Core\Compilateur\AST
35 35
  */
36 36
 class Contexte {
37
-	/**
38
-	 * Description du squelette
39
-	 *
40
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
-	 *
42
-	 * Peut contenir les index :
43
-	 *
44
-	 * - nom : Nom du fichier de cache
45
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
-	 * - sourcefile : Chemin du squelette
47
-	 * - squelette : Code du squelette
48
-	 * - id_mere : Identifiant de la boucle parente
49
-	 * - documents : Pour embed et img dans les textes
50
-	 * - session : Pour un cache sessionné par auteur
51
-	 * - niv : Niveau de tabulation
52
-	 *
53
-	 * @var array
54
-	 */
55
-	public $descr = [];
56
-
57
-	/**
58
-	 * Identifiant de la boucle
59
-	 *
60
-	 * @var string
61
-	 */
62
-	public $id_boucle = '';
63
-
64
-	/**
65
-	 * Numéro de ligne dans le code source du squelette
66
-	 *
67
-	 * @var int
68
-	 */
69
-	public $ligne = 0;
70
-
71
-	/**
72
-	 * Langue d'exécution
73
-	 *
74
-	 * @var string
75
-	 */
76
-	public $lang = '';
77
-
78
-	/**
79
-	 * Résultat de la compilation: toujours une expression PHP
80
-	 *
81
-	 * @var string
82
-	 */
83
-	public $code = '';
37
+    /**
38
+     * Description du squelette
39
+     *
40
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
+     *
42
+     * Peut contenir les index :
43
+     *
44
+     * - nom : Nom du fichier de cache
45
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
+     * - sourcefile : Chemin du squelette
47
+     * - squelette : Code du squelette
48
+     * - id_mere : Identifiant de la boucle parente
49
+     * - documents : Pour embed et img dans les textes
50
+     * - session : Pour un cache sessionné par auteur
51
+     * - niv : Niveau de tabulation
52
+     *
53
+     * @var array
54
+     */
55
+    public $descr = [];
56
+
57
+    /**
58
+     * Identifiant de la boucle
59
+     *
60
+     * @var string
61
+     */
62
+    public $id_boucle = '';
63
+
64
+    /**
65
+     * Numéro de ligne dans le code source du squelette
66
+     *
67
+     * @var int
68
+     */
69
+    public $ligne = 0;
70
+
71
+    /**
72
+     * Langue d'exécution
73
+     *
74
+     * @var string
75
+     */
76
+    public $lang = '';
77
+
78
+    /**
79
+     * Résultat de la compilation: toujours une expression PHP
80
+     *
81
+     * @var string
82
+     */
83
+    public $code = '';
84 84
 }
85 85
 
86 86
 
@@ -90,44 +90,44 @@  discard block
 block discarded – undo
90 90
  * @package SPIP\Core\Compilateur\AST
91 91
  **/
92 92
 class Texte {
93
-	/**
94
-	 * Type de noeud
95
-	 *
96
-	 * @var string
97
-	 */
98
-	public $type = 'texte';
99
-
100
-	/**
101
-	 * Le texte
102
-	 *
103
-	 * @var string
104
-	 */
105
-	public $texte;
106
-
107
-	/**
108
-	 * Contenu avant le texte.
109
-	 *
110
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
111
-	 *
112
-	 * @var string|array
113
-	 */
114
-	public $avant = '';
115
-
116
-	/**
117
-	 * Contenu après le texte.
118
-	 *
119
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
120
-	 *
121
-	 * @var string|array
122
-	 */
123
-	public $apres = '';
124
-
125
-	/**
126
-	 * Numéro de ligne dans le code source du squelette
127
-	 *
128
-	 * @var int
129
-	 */
130
-	public $ligne = 0;
93
+    /**
94
+     * Type de noeud
95
+     *
96
+     * @var string
97
+     */
98
+    public $type = 'texte';
99
+
100
+    /**
101
+     * Le texte
102
+     *
103
+     * @var string
104
+     */
105
+    public $texte;
106
+
107
+    /**
108
+     * Contenu avant le texte.
109
+     *
110
+     * Vide ou apostrophe simple ou double si le texte en était entouré
111
+     *
112
+     * @var string|array
113
+     */
114
+    public $avant = '';
115
+
116
+    /**
117
+     * Contenu après le texte.
118
+     *
119
+     * Vide ou apostrophe simple ou double si le texte en était entouré
120
+     *
121
+     * @var string|array
122
+     */
123
+    public $apres = '';
124
+
125
+    /**
126
+     * Numéro de ligne dans le code source du squelette
127
+     *
128
+     * @var int
129
+     */
130
+    public $ligne = 0;
131 131
 }
132 132
 
133 133
 /**
@@ -136,50 +136,50 @@  discard block
 block discarded – undo
136 136
  * @package SPIP\Core\Compilateur\AST
137 137
  **/
138 138
 class Inclure {
139
-	/**
140
-	 * Type de noeud
141
-	 *
142
-	 * @var string
143
-	 */
144
-	public $type = 'include';
145
-
146
-	/**
147
-	 * Nom d'un fichier inclu
148
-	 *
149
-	 * - Objet Texte si inclusion d'un autre squelette
150
-	 * - chaîne si inclusion d'un fichier PHP directement
151
-	 *
152
-	 * @var string|Texte
153
-	 */
154
-	public $texte;
155
-
156
-	/**
157
-	 * Inutilisé, propriété générique de l'AST
158
-	 *
159
-	 * @var string|array
160
-	 */
161
-	public $avant = '';
162
-
163
-	/**
164
-	 * Inutilisé, propriété générique de l'AST
165
-	 *
166
-	 * @var string|array
167
-	 */
168
-	public $apres = '';
169
-
170
-	/**
171
-	 * Numéro de ligne dans le code source du squelette
172
-	 *
173
-	 * @var int
174
-	 */
175
-	public $ligne = 0;
176
-
177
-	/**
178
-	 * Valeurs des paramètres
179
-	 *
180
-	 * @var array
181
-	 */
182
-	public $param = [];
139
+    /**
140
+     * Type de noeud
141
+     *
142
+     * @var string
143
+     */
144
+    public $type = 'include';
145
+
146
+    /**
147
+     * Nom d'un fichier inclu
148
+     *
149
+     * - Objet Texte si inclusion d'un autre squelette
150
+     * - chaîne si inclusion d'un fichier PHP directement
151
+     *
152
+     * @var string|Texte
153
+     */
154
+    public $texte;
155
+
156
+    /**
157
+     * Inutilisé, propriété générique de l'AST
158
+     *
159
+     * @var string|array
160
+     */
161
+    public $avant = '';
162
+
163
+    /**
164
+     * Inutilisé, propriété générique de l'AST
165
+     *
166
+     * @var string|array
167
+     */
168
+    public $apres = '';
169
+
170
+    /**
171
+     * Numéro de ligne dans le code source du squelette
172
+     *
173
+     * @var int
174
+     */
175
+    public $ligne = 0;
176
+
177
+    /**
178
+     * Valeurs des paramètres
179
+     *
180
+     * @var array
181
+     */
182
+    public $param = [];
183 183
 }
184 184
 
185 185
 
@@ -189,386 +189,386 @@  discard block
 block discarded – undo
189 189
  * @package SPIP\Core\Compilateur\AST
190 190
  **/
191 191
 class Boucle {
192
-	/**
193
-	 * Type de noeud
194
-	 *
195
-	 * @var string
196
-	 */
197
-	public $type = 'boucle';
198
-
199
-	/**
200
-	 * Identifiant de la boucle
201
-	 *
202
-	 * @var string
203
-	 */
204
-	public $id_boucle;
205
-
206
-	/**
207
-	 * Identifiant de la boucle parente
208
-	 *
209
-	 * @var string
210
-	 */
211
-	public $id_parent = '';
212
-
213
-	/**
214
-	 * Partie avant toujours affichee
215
-	 *
216
-	 * @var string|array
217
-	 */
218
-	public $preaff = '';
219
-
220
-	/**
221
-	 * Partie optionnelle avant
222
-	 *
223
-	 * @var string|array
224
-	 */
225
-	public $avant = '';
226
-
227
-	/**
228
-	 * Pour chaque élément
229
-	 *
230
-	 * @var string|array
231
-	 */
232
-	public $milieu = '';
233
-
234
-	/**
235
-	 * Partie optionnelle après
236
-	 *
237
-	 * @var string|array
238
-	 */
239
-	public $apres = '';
240
-
241
-	/**
242
-	 * Partie alternative, si pas de résultat dans la boucle
243
-	 *
244
-	 * @var string|array
245
-	 */
246
-	public $altern = '';
247
-
248
-	/**
249
-	 * Partie apres toujours affichee
250
-	 *
251
-	 * @var string|array
252
-	 */
253
-	public $postaff = '';
254
-
255
-
256
-	/**
257
-	 * La boucle doit-elle sélectionner la langue ?
258
-	 *
259
-	 * @var string|null
260
-	 */
261
-	public $lang_select;
262
-
263
-	/**
264
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
265
-	 *
266
-	 * @var string|null
267
-	 */
268
-	public $type_requete;
269
-
270
-	/**
271
-	 * La table est elle optionnelle ?
272
-	 *
273
-	 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
-	 *
275
-	 * @var bool
276
-	 */
277
-	public $table_optionnelle = false;
278
-
279
-	/**
280
-	 * Nom du fichier de connexion
281
-	 *
282
-	 * @var string
283
-	 */
284
-	public $sql_serveur = '';
285
-
286
-	/**
287
-	 * Paramètres de la boucle
288
-	 *
289
-	 * Description des paramètres passés à la boucle, qui servent ensuite
290
-	 * au calcul des critères
291
-	 *
292
-	 * @var array
293
-	 */
294
-	public $param = [];
295
-
296
-	/**
297
-	 * Critères de la boucle
298
-	 *
299
-	 * @var Critere[]
300
-	 */
301
-	public $criteres = [];
302
-
303
-	/**
304
-	 * Textes insérés entre 2 éléments de boucle (critère inter)
305
-	 *
306
-	 * @var string[]
307
-	 */
308
-	public $separateur = [];
309
-
310
-	/**
311
-	 * Liste des jointures possibles avec cette table
312
-	 *
313
-	 * Les jointures par défaut de la table sont complétées en priorité
314
-	 * des jointures déclarées explicitement sur la boucle
315
-	 *
316
-	 * @see base_trouver_table_dist()
317
-	 * @var array
318
-	 */
319
-	public $jointures = [];
320
-
321
-	/**
322
-	 * Jointures explicites avec cette table
323
-	 *
324
-	 * Ces jointures sont utilisées en priorité par rapport aux jointures
325
-	 * normales possibles pour retrouver les colonnes demandées extérieures
326
-	 * à la boucle.
327
-	 *
328
-	 * @var string|bool
329
-	 */
330
-	public $jointures_explicites = false;
331
-
332
-	/**
333
-	 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
-	 *
335
-	 * @var string|null
336
-	 */
337
-	public $doublons;
338
-
339
-	/**
340
-	 * Code PHP ajouté au début de chaque itération de boucle.
341
-	 *
342
-	 * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
-	 *
344
-	 * @var string
345
-	 */
346
-	public $partie = '';
347
-
348
-	/**
349
-	 * Nombre de divisions de la boucle, d'éléments à afficher,
350
-	 * ou de soustractions d'éléments à faire
351
-	 *
352
-	 * Dans les critères limitant le nombre d'éléments affichés
353
-	 * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
-	 *
355
-	 * @var string
356
-	 */
357
-	public $total_parties = '';
358
-
359
-	/**
360
-	 * Code PHP ajouté avant l'itération de boucle.
361
-	 *
362
-	 * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
-	 * pour initialiser les variables de début et de fin d'itération.
364
-	 *
365
-	 * @var string
366
-	 */
367
-	public $mode_partie = '';
368
-
369
-	/**
370
-	 * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
-	 *
372
-	 * Si une boucle est appelée de manière récursive quelque part par
373
-	 * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
-	 * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
-	 * de l'appelant (rec)
376
-	 *
377
-	 * @var string
378
-	 */
379
-	public $externe = '';
380
-
381
-	// champs pour la construction de la requete SQL
382
-
383
-	/**
384
-	 * Liste des champs à récupérer par la boucle
385
-	 *
386
-	 * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
-	 *
388
-	 * @var string[]
389
-	 */
390
-	public $select = [];
391
-
392
-	/**
393
-	 * Liste des alias / tables SQL utilisées dans la boucle
394
-	 *
395
-	 * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
-	 * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
-	 *
398
-	 * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
-	 *
400
-	 * @var string[]
401
-	 */
402
-	public $from = [];
403
-
404
-	/**
405
-	 * Liste des alias / type de jointures utilisées dans la boucle
406
-	 *
407
-	 * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
-	 * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
-	 *
410
-	 * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
-	 * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
-	 *
413
-	 * @var string[]
414
-	 */
415
-	public $from_type = [];
416
-
417
-	/**
418
-	 * Liste des conditions WHERE de la boucle
419
-	 *
420
-	 * Permet de restreindre les éléments retournés par une boucle
421
-	 * en fonctions des conditions transmises dans ce tableau.
422
-	 *
423
-	 * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
-	 *
425
-	 * Les éléments du premier niveau sont reliés par des AND, donc
426
-	 * chaque élément ajouté directement au where par
427
-	 * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
-	 * est une condition AND en plus.
429
-	 *
430
-	 * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
-	 * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
-	 * $expr = array(operateur, val1, val2)
433
-	 *
434
-	 * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
-	 * à réaliser tel que :
436
-	 *
437
-	 * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
-	 *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
-	 *    suivant cet ordre : "val1 operateur val2".
440
-	 *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
-	 * - "'AND'", "'OR'", "'NOT'" :
442
-	 *    dans ce cas val1 et val2 sont également des expressions
443
-	 *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
-	 *    Exemples :
445
-	 *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
-	 *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
-	 *
448
-	 * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
-	 * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
-	 * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
-	 *
452
-	 * @var array
453
-	 */
454
-	public $where = [];
455
-
456
-	public $join = [];
457
-	public $having = [];
458
-	public $limit = '';
459
-	public $group = [];
460
-	public $order = [];
461
-	public $default_order = [];
462
-	public $date = 'date';
463
-	public $hash = '';
464
-	public $in = '';
465
-	public $sous_requete = false;
466
-
467
-	/**
468
-	 * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
-	 *
470
-	 * Il sert à insérer le code calculant une hierarchie
471
-	 *
472
-	 * @var string
473
-	 */
474
-	public $hierarchie = '';
475
-
476
-	// champs pour la construction du corps PHP
477
-
478
-	/**
479
-	 * Description des sources de données de la boucle
480
-	 *
481
-	 * Description des données de la boucle issu de trouver_table
482
-	 * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
-	 *
484
-	 * @see base_trouver_table_dist()
485
-	 * @var array
486
-	 */
487
-	public $show = [];
488
-
489
-	/**
490
-	 * Nom de la table SQL principale de la boucle, sans son préfixe
491
-	 *
492
-	 * @var string
493
-	 */
494
-	public $id_table;
495
-
496
-	/**
497
-	 * Nom de la clé primaire de la table SQL principale de la boucle
498
-	 *
499
-	 * @var string
500
-	 */
501
-	public $primary;
502
-
503
-	/**
504
-	 * Code PHP compilé de la boucle
505
-	 *
506
-	 * @var string
507
-	 */
508
-	public $return;
509
-
510
-	public $numrows = false;
511
-	public $cptrows = false;
512
-
513
-	/**
514
-	 * Description du squelette
515
-	 *
516
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
-	 *
518
-	 * Peut contenir les index :
519
-	 *
520
-	 * - nom : Nom du fichier de cache
521
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
-	 * - sourcefile : Chemin du squelette
523
-	 * - squelette : Code du squelette
524
-	 * - id_mere : Identifiant de la boucle parente
525
-	 * - documents : Pour embed et img dans les textes
526
-	 * - session : Pour un cache sessionné par auteur
527
-	 * - niv : Niveau de tabulation
528
-	 *
529
-	 * @var array
530
-	 */
531
-	public $descr = [];
532
-
533
-	/**
534
-	 * Numéro de ligne dans le code source du squelette
535
-	 *
536
-	 * @var int
537
-	 */
538
-	public $ligne = 0;
539
-
540
-
541
-	public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
-
543
-	/**
544
-	 * Type d'itérateur utilisé pour cette boucle
545
-	 *
546
-	 * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
-	 * - 'DATA' pour l'itérateur DATA, ...
548
-	 *
549
-	 * @var string
550
-	 */
551
-	public $iterateur = ''; // type d'iterateur
552
-
553
-	/**
554
-	 * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
-	 */
556
-	public $debug = [];
557
-
558
-	/**
559
-	 * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
-	 * notamment si le champ a été trouve dans une boucle parente
561
-	 *
562
-	 * Tableau nom du champ => index de boucle
563
-	 *
564
-	 * @var array $index_champ
565
-	*/
566
-	public $index_champ = [];
567
-
568
-	// obsoletes, conserves provisoirement pour compatibilite
569
-	public $tout = false;
570
-	public $plat = false;
571
-	public $lien = false;
192
+    /**
193
+     * Type de noeud
194
+     *
195
+     * @var string
196
+     */
197
+    public $type = 'boucle';
198
+
199
+    /**
200
+     * Identifiant de la boucle
201
+     *
202
+     * @var string
203
+     */
204
+    public $id_boucle;
205
+
206
+    /**
207
+     * Identifiant de la boucle parente
208
+     *
209
+     * @var string
210
+     */
211
+    public $id_parent = '';
212
+
213
+    /**
214
+     * Partie avant toujours affichee
215
+     *
216
+     * @var string|array
217
+     */
218
+    public $preaff = '';
219
+
220
+    /**
221
+     * Partie optionnelle avant
222
+     *
223
+     * @var string|array
224
+     */
225
+    public $avant = '';
226
+
227
+    /**
228
+     * Pour chaque élément
229
+     *
230
+     * @var string|array
231
+     */
232
+    public $milieu = '';
233
+
234
+    /**
235
+     * Partie optionnelle après
236
+     *
237
+     * @var string|array
238
+     */
239
+    public $apres = '';
240
+
241
+    /**
242
+     * Partie alternative, si pas de résultat dans la boucle
243
+     *
244
+     * @var string|array
245
+     */
246
+    public $altern = '';
247
+
248
+    /**
249
+     * Partie apres toujours affichee
250
+     *
251
+     * @var string|array
252
+     */
253
+    public $postaff = '';
254
+
255
+
256
+    /**
257
+     * La boucle doit-elle sélectionner la langue ?
258
+     *
259
+     * @var string|null
260
+     */
261
+    public $lang_select;
262
+
263
+    /**
264
+     * Alias de table d'application de la requête ou nom complet de la table SQL
265
+     *
266
+     * @var string|null
267
+     */
268
+    public $type_requete;
269
+
270
+    /**
271
+     * La table est elle optionnelle ?
272
+     *
273
+     * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
+     *
275
+     * @var bool
276
+     */
277
+    public $table_optionnelle = false;
278
+
279
+    /**
280
+     * Nom du fichier de connexion
281
+     *
282
+     * @var string
283
+     */
284
+    public $sql_serveur = '';
285
+
286
+    /**
287
+     * Paramètres de la boucle
288
+     *
289
+     * Description des paramètres passés à la boucle, qui servent ensuite
290
+     * au calcul des critères
291
+     *
292
+     * @var array
293
+     */
294
+    public $param = [];
295
+
296
+    /**
297
+     * Critères de la boucle
298
+     *
299
+     * @var Critere[]
300
+     */
301
+    public $criteres = [];
302
+
303
+    /**
304
+     * Textes insérés entre 2 éléments de boucle (critère inter)
305
+     *
306
+     * @var string[]
307
+     */
308
+    public $separateur = [];
309
+
310
+    /**
311
+     * Liste des jointures possibles avec cette table
312
+     *
313
+     * Les jointures par défaut de la table sont complétées en priorité
314
+     * des jointures déclarées explicitement sur la boucle
315
+     *
316
+     * @see base_trouver_table_dist()
317
+     * @var array
318
+     */
319
+    public $jointures = [];
320
+
321
+    /**
322
+     * Jointures explicites avec cette table
323
+     *
324
+     * Ces jointures sont utilisées en priorité par rapport aux jointures
325
+     * normales possibles pour retrouver les colonnes demandées extérieures
326
+     * à la boucle.
327
+     *
328
+     * @var string|bool
329
+     */
330
+    public $jointures_explicites = false;
331
+
332
+    /**
333
+     * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
+     *
335
+     * @var string|null
336
+     */
337
+    public $doublons;
338
+
339
+    /**
340
+     * Code PHP ajouté au début de chaque itération de boucle.
341
+     *
342
+     * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
+     *
344
+     * @var string
345
+     */
346
+    public $partie = '';
347
+
348
+    /**
349
+     * Nombre de divisions de la boucle, d'éléments à afficher,
350
+     * ou de soustractions d'éléments à faire
351
+     *
352
+     * Dans les critères limitant le nombre d'éléments affichés
353
+     * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
+     *
355
+     * @var string
356
+     */
357
+    public $total_parties = '';
358
+
359
+    /**
360
+     * Code PHP ajouté avant l'itération de boucle.
361
+     *
362
+     * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
+     * pour initialiser les variables de début et de fin d'itération.
364
+     *
365
+     * @var string
366
+     */
367
+    public $mode_partie = '';
368
+
369
+    /**
370
+     * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
+     *
372
+     * Si une boucle est appelée de manière récursive quelque part par
373
+     * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
+     * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
+     * de l'appelant (rec)
376
+     *
377
+     * @var string
378
+     */
379
+    public $externe = '';
380
+
381
+    // champs pour la construction de la requete SQL
382
+
383
+    /**
384
+     * Liste des champs à récupérer par la boucle
385
+     *
386
+     * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
+     *
388
+     * @var string[]
389
+     */
390
+    public $select = [];
391
+
392
+    /**
393
+     * Liste des alias / tables SQL utilisées dans la boucle
394
+     *
395
+     * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
+     * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
+     *
398
+     * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
+     *
400
+     * @var string[]
401
+     */
402
+    public $from = [];
403
+
404
+    /**
405
+     * Liste des alias / type de jointures utilisées dans la boucle
406
+     *
407
+     * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
+     * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
+     *
410
+     * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
+     * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
+     *
413
+     * @var string[]
414
+     */
415
+    public $from_type = [];
416
+
417
+    /**
418
+     * Liste des conditions WHERE de la boucle
419
+     *
420
+     * Permet de restreindre les éléments retournés par une boucle
421
+     * en fonctions des conditions transmises dans ce tableau.
422
+     *
423
+     * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
+     *
425
+     * Les éléments du premier niveau sont reliés par des AND, donc
426
+     * chaque élément ajouté directement au where par
427
+     * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
+     * est une condition AND en plus.
429
+     *
430
+     * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
+     * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
+     * $expr = array(operateur, val1, val2)
433
+     *
434
+     * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
+     * à réaliser tel que :
436
+     *
437
+     * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
+     *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
+     *    suivant cet ordre : "val1 operateur val2".
440
+     *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
+     * - "'AND'", "'OR'", "'NOT'" :
442
+     *    dans ce cas val1 et val2 sont également des expressions
443
+     *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
+     *    Exemples :
445
+     *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
+     *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
+     *
448
+     * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
+     * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
+     * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
+     *
452
+     * @var array
453
+     */
454
+    public $where = [];
455
+
456
+    public $join = [];
457
+    public $having = [];
458
+    public $limit = '';
459
+    public $group = [];
460
+    public $order = [];
461
+    public $default_order = [];
462
+    public $date = 'date';
463
+    public $hash = '';
464
+    public $in = '';
465
+    public $sous_requete = false;
466
+
467
+    /**
468
+     * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
+     *
470
+     * Il sert à insérer le code calculant une hierarchie
471
+     *
472
+     * @var string
473
+     */
474
+    public $hierarchie = '';
475
+
476
+    // champs pour la construction du corps PHP
477
+
478
+    /**
479
+     * Description des sources de données de la boucle
480
+     *
481
+     * Description des données de la boucle issu de trouver_table
482
+     * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
+     *
484
+     * @see base_trouver_table_dist()
485
+     * @var array
486
+     */
487
+    public $show = [];
488
+
489
+    /**
490
+     * Nom de la table SQL principale de la boucle, sans son préfixe
491
+     *
492
+     * @var string
493
+     */
494
+    public $id_table;
495
+
496
+    /**
497
+     * Nom de la clé primaire de la table SQL principale de la boucle
498
+     *
499
+     * @var string
500
+     */
501
+    public $primary;
502
+
503
+    /**
504
+     * Code PHP compilé de la boucle
505
+     *
506
+     * @var string
507
+     */
508
+    public $return;
509
+
510
+    public $numrows = false;
511
+    public $cptrows = false;
512
+
513
+    /**
514
+     * Description du squelette
515
+     *
516
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
+     *
518
+     * Peut contenir les index :
519
+     *
520
+     * - nom : Nom du fichier de cache
521
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
+     * - sourcefile : Chemin du squelette
523
+     * - squelette : Code du squelette
524
+     * - id_mere : Identifiant de la boucle parente
525
+     * - documents : Pour embed et img dans les textes
526
+     * - session : Pour un cache sessionné par auteur
527
+     * - niv : Niveau de tabulation
528
+     *
529
+     * @var array
530
+     */
531
+    public $descr = [];
532
+
533
+    /**
534
+     * Numéro de ligne dans le code source du squelette
535
+     *
536
+     * @var int
537
+     */
538
+    public $ligne = 0;
539
+
540
+
541
+    public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
+
543
+    /**
544
+     * Type d'itérateur utilisé pour cette boucle
545
+     *
546
+     * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
+     * - 'DATA' pour l'itérateur DATA, ...
548
+     *
549
+     * @var string
550
+     */
551
+    public $iterateur = ''; // type d'iterateur
552
+
553
+    /**
554
+     * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
+     */
556
+    public $debug = [];
557
+
558
+    /**
559
+     * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
+     * notamment si le champ a été trouve dans une boucle parente
561
+     *
562
+     * Tableau nom du champ => index de boucle
563
+     *
564
+     * @var array $index_champ
565
+     */
566
+    public $index_champ = [];
567
+
568
+    // obsoletes, conserves provisoirement pour compatibilite
569
+    public $tout = false;
570
+    public $plat = false;
571
+    public $lien = false;
572 572
 }
573 573
 
574 574
 /**
@@ -579,56 +579,56 @@  discard block
 block discarded – undo
579 579
  * @package SPIP\Core\Compilateur\AST
580 580
  **/
581 581
 class Critere {
582
-	/**
583
-	 * Type de noeud
584
-	 *
585
-	 * @var string
586
-	 */
587
-	public $type = 'critere';
588
-
589
-	/**
590
-	 * Opérateur (>, <, >=, IN, ...)
591
-	 *
592
-	 * @var null|string
593
-	 */
594
-	public $op;
595
-
596
-	/**
597
-	 * Présence d'une négation (truc !op valeur)
598
-	 *
599
-	 * @var null|string
600
-	 */
601
-	public $not;
602
-
603
-	/**
604
-	 * Présence d'une exclusion (!truc op valeur)
605
-	 *
606
-	 * @var null|string
607
-	 */
608
-	public $exclus;
609
-
610
-	/**
611
-	 * Présence d'une condition dans le critère (truc ?)
612
-	 *
613
-	 * @var bool
614
-	 */
615
-	public $cond = false;
616
-
617
-	/**
618
-	 * Paramètres du critère
619
-	 * - $param[0] : élément avant l'opérateur
620
-	 * - $param[1..n] : éléments après l'opérateur
621
-	 *
622
-	 * @var array
623
-	 */
624
-	public $param = [];
625
-
626
-	/**
627
-	 * Numéro de ligne dans le code source du squelette
628
-	 *
629
-	 * @var int
630
-	 */
631
-	public $ligne = 0;
582
+    /**
583
+     * Type de noeud
584
+     *
585
+     * @var string
586
+     */
587
+    public $type = 'critere';
588
+
589
+    /**
590
+     * Opérateur (>, <, >=, IN, ...)
591
+     *
592
+     * @var null|string
593
+     */
594
+    public $op;
595
+
596
+    /**
597
+     * Présence d'une négation (truc !op valeur)
598
+     *
599
+     * @var null|string
600
+     */
601
+    public $not;
602
+
603
+    /**
604
+     * Présence d'une exclusion (!truc op valeur)
605
+     *
606
+     * @var null|string
607
+     */
608
+    public $exclus;
609
+
610
+    /**
611
+     * Présence d'une condition dans le critère (truc ?)
612
+     *
613
+     * @var bool
614
+     */
615
+    public $cond = false;
616
+
617
+    /**
618
+     * Paramètres du critère
619
+     * - $param[0] : élément avant l'opérateur
620
+     * - $param[1..n] : éléments après l'opérateur
621
+     *
622
+     * @var array
623
+     */
624
+    public $param = [];
625
+
626
+    /**
627
+     * Numéro de ligne dans le code source du squelette
628
+     *
629
+     * @var int
630
+     */
631
+    public $ligne = 0;
632 632
 }
633 633
 
634 634
 /**
@@ -637,139 +637,139 @@  discard block
 block discarded – undo
637 637
  * @package SPIP\Core\Compilateur\AST
638 638
  **/
639 639
 class Champ {
640
-	/**
641
-	 * Type de noeud
642
-	 *
643
-	 * @var string
644
-	 */
645
-	public $type = 'champ';
646
-
647
-	/**
648
-	 * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
-	 *
650
-	 * @var string|null
651
-	 */
652
-	public $nom_champ;
653
-
654
-	/**
655
-	 * Identifiant de la boucle parente si explicité
656
-	 *
657
-	 * @var string|null
658
-	 */
659
-	public $nom_boucle = '';
660
-
661
-	/**
662
-	 * Partie optionnelle avant
663
-	 *
664
-	 * @var null|string|array
665
-	 */
666
-	public $avant;
667
-
668
-	/**
669
-	 * Partie optionnelle après
670
-	 *
671
-	 * @var null|string|array
672
-	 */
673
-	public $apres;
674
-
675
-	/**
676
-	 * Étoiles : annuler des automatismes
677
-	 *
678
-	 * - '*' annule les filtres automatiques
679
-	 * - '**' annule en plus les protections de scripts
680
-	 *
681
-	 * @var null|string
682
-	 */
683
-	public $etoile;
684
-
685
-	/**
686
-	 * Arguments et filtres explicites sur la balise
687
-	 *
688
-	 * - $param[0] contient les arguments de la balise
689
-	 * - $param[1..n] contient les filtres à appliquer à la balise
690
-	 *
691
-	 * @var array
692
-	 */
693
-	public $param = [];
694
-
695
-	/**
696
-	 * Source des filtres  (compatibilité) (?)
697
-	 *
698
-	 * @var array|null
699
-	 */
700
-	public $fonctions = [];
701
-
702
-	/**
703
-	 * Identifiant de la boucle
704
-	 *
705
-	 * @var string
706
-	 */
707
-	public $id_boucle = '';
708
-
709
-	/**
710
-	 * AST du squelette, liste de toutes les boucles
711
-	 *
712
-	 * @var Boucles[]
713
-	 */
714
-	public $boucles;
715
-
716
-	/**
717
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
718
-	 *
719
-	 * @var string|null
720
-	 */
721
-	public $type_requete;
722
-
723
-	/**
724
-	 * Résultat de la compilation: toujours une expression PHP
725
-	 *
726
-	 * @var string
727
-	 */
728
-	public $code = '';
729
-
730
-	/**
731
-	 * Interdire les scripts
732
-	 *
733
-	 * false si on est sûr de cette balise
734
-	 *
735
-	 * @see interdire_scripts()
736
-	 * @var bool
737
-	 */
738
-	public $interdire_scripts = true;
739
-
740
-	/**
741
-	 * Description du squelette
742
-	 *
743
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
-	 *
745
-	 * Peut contenir les index :
746
-	 *
747
-	 * - nom : Nom du fichier de cache
748
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
-	 * - sourcefile : Chemin du squelette
750
-	 * - squelette : Code du squelette
751
-	 * - id_mere : Identifiant de la boucle parente
752
-	 * - documents : Pour embed et img dans les textes
753
-	 * - session : Pour un cache sessionné par auteur
754
-	 * - niv : Niveau de tabulation
755
-	 *
756
-	 * @var array
757
-	 */
758
-	public $descr = [];
759
-
760
-	/**
761
-	 * Numéro de ligne dans le code source du squelette
762
-	 *
763
-	 * @var int
764
-	 */
765
-	public $ligne = 0;
766
-
767
-	/**
768
-	 * Drapeau pour reperer les balises calculées par une fonction explicite
769
-	 *
770
-	 * @var bool
771
-	 */
772
-	public $balise_calculee = false;
640
+    /**
641
+     * Type de noeud
642
+     *
643
+     * @var string
644
+     */
645
+    public $type = 'champ';
646
+
647
+    /**
648
+     * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
+     *
650
+     * @var string|null
651
+     */
652
+    public $nom_champ;
653
+
654
+    /**
655
+     * Identifiant de la boucle parente si explicité
656
+     *
657
+     * @var string|null
658
+     */
659
+    public $nom_boucle = '';
660
+
661
+    /**
662
+     * Partie optionnelle avant
663
+     *
664
+     * @var null|string|array
665
+     */
666
+    public $avant;
667
+
668
+    /**
669
+     * Partie optionnelle après
670
+     *
671
+     * @var null|string|array
672
+     */
673
+    public $apres;
674
+
675
+    /**
676
+     * Étoiles : annuler des automatismes
677
+     *
678
+     * - '*' annule les filtres automatiques
679
+     * - '**' annule en plus les protections de scripts
680
+     *
681
+     * @var null|string
682
+     */
683
+    public $etoile;
684
+
685
+    /**
686
+     * Arguments et filtres explicites sur la balise
687
+     *
688
+     * - $param[0] contient les arguments de la balise
689
+     * - $param[1..n] contient les filtres à appliquer à la balise
690
+     *
691
+     * @var array
692
+     */
693
+    public $param = [];
694
+
695
+    /**
696
+     * Source des filtres  (compatibilité) (?)
697
+     *
698
+     * @var array|null
699
+     */
700
+    public $fonctions = [];
701
+
702
+    /**
703
+     * Identifiant de la boucle
704
+     *
705
+     * @var string
706
+     */
707
+    public $id_boucle = '';
708
+
709
+    /**
710
+     * AST du squelette, liste de toutes les boucles
711
+     *
712
+     * @var Boucles[]
713
+     */
714
+    public $boucles;
715
+
716
+    /**
717
+     * Alias de table d'application de la requête ou nom complet de la table SQL
718
+     *
719
+     * @var string|null
720
+     */
721
+    public $type_requete;
722
+
723
+    /**
724
+     * Résultat de la compilation: toujours une expression PHP
725
+     *
726
+     * @var string
727
+     */
728
+    public $code = '';
729
+
730
+    /**
731
+     * Interdire les scripts
732
+     *
733
+     * false si on est sûr de cette balise
734
+     *
735
+     * @see interdire_scripts()
736
+     * @var bool
737
+     */
738
+    public $interdire_scripts = true;
739
+
740
+    /**
741
+     * Description du squelette
742
+     *
743
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
+     *
745
+     * Peut contenir les index :
746
+     *
747
+     * - nom : Nom du fichier de cache
748
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
+     * - sourcefile : Chemin du squelette
750
+     * - squelette : Code du squelette
751
+     * - id_mere : Identifiant de la boucle parente
752
+     * - documents : Pour embed et img dans les textes
753
+     * - session : Pour un cache sessionné par auteur
754
+     * - niv : Niveau de tabulation
755
+     *
756
+     * @var array
757
+     */
758
+    public $descr = [];
759
+
760
+    /**
761
+     * Numéro de ligne dans le code source du squelette
762
+     *
763
+     * @var int
764
+     */
765
+    public $ligne = 0;
766
+
767
+    /**
768
+     * Drapeau pour reperer les balises calculées par une fonction explicite
769
+     *
770
+     * @var bool
771
+     */
772
+    public $balise_calculee = false;
773 773
 }
774 774
 
775 775
 
@@ -777,123 +777,123 @@  discard block
 block discarded – undo
777 777
  * Description d'une chaîne de langue
778 778
  **/
779 779
 class Idiome {
780
-	/**
781
-	 * Type de noeud
782
-	 *
783
-	 * @var string
784
-	 */
785
-	public $type = 'idiome';
786
-
787
-	/**
788
-	 * Clé de traduction demandée. Exemple 'item_oui'
789
-	 *
790
-	 * @var string
791
-	 */
792
-	public $nom_champ = '';
793
-
794
-	/**
795
-	 * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
-	 *
797
-	 * @var string
798
-	 */
799
-	public $module = '';
800
-
801
-	/**
802
-	 * Arguments à passer à la chaîne
803
-	 *
804
-	 * @var array
805
-	 */
806
-	public $arg = [];
807
-
808
-	/**
809
-	 * Filtres à appliquer au résultat
810
-	 *
811
-	 * @var array
812
-	 */
813
-	public $param = [];
814
-
815
-	/**
816
-	 * Source des filtres  (compatibilité) (?)
817
-	 *
818
-	 * @var array|null
819
-	 */
820
-	public $fonctions = [];
821
-
822
-	/**
823
-	 * Inutilisé, propriété générique de l'AST
824
-	 *
825
-	 * @var string|array
826
-	 */
827
-	public $avant = '';
828
-
829
-	/**
830
-	 * Inutilisé, propriété générique de l'AST
831
-	 *
832
-	 * @var string|array
833
-	 */
834
-	public $apres = '';
835
-
836
-	/**
837
-	 * Identifiant de la boucle
838
-	 *
839
-	 * @var string
840
-	 */
841
-	public $id_boucle = '';
842
-
843
-	/**
844
-	 * AST du squelette, liste de toutes les boucles
845
-	 *
846
-	 * @var Boucles[]
847
-	 */
848
-	public $boucles;
849
-
850
-	/**
851
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
852
-	 *
853
-	 * @var string|null
854
-	 */
855
-	public $type_requete;
856
-
857
-	/**
858
-	 * Résultat de la compilation: toujours une expression PHP
859
-	 *
860
-	 * @var string
861
-	 */
862
-	public $code = '';
863
-
864
-	/**
865
-	 * Interdire les scripts
866
-	 *
867
-	 * @see interdire_scripts()
868
-	 * @var bool
869
-	 */
870
-	public $interdire_scripts = false;
871
-
872
-	/**
873
-	 * Description du squelette
874
-	 *
875
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
-	 *
877
-	 * Peut contenir les index :
878
-	 * - nom : Nom du fichier de cache
879
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
-	 * - sourcefile : Chemin du squelette
881
-	 * - squelette : Code du squelette
882
-	 * - id_mere : Identifiant de la boucle parente
883
-	 * - documents : Pour embed et img dans les textes
884
-	 * - session : Pour un cache sessionné par auteur
885
-	 * - niv : Niveau de tabulation
886
-	 *
887
-	 * @var array
888
-	 */
889
-	public $descr = [];
890
-
891
-	/**
892
-	 * Numéro de ligne dans le code source du squelette
893
-	 *
894
-	 * @var int
895
-	 */
896
-	public $ligne = 0;
780
+    /**
781
+     * Type de noeud
782
+     *
783
+     * @var string
784
+     */
785
+    public $type = 'idiome';
786
+
787
+    /**
788
+     * Clé de traduction demandée. Exemple 'item_oui'
789
+     *
790
+     * @var string
791
+     */
792
+    public $nom_champ = '';
793
+
794
+    /**
795
+     * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
+     *
797
+     * @var string
798
+     */
799
+    public $module = '';
800
+
801
+    /**
802
+     * Arguments à passer à la chaîne
803
+     *
804
+     * @var array
805
+     */
806
+    public $arg = [];
807
+
808
+    /**
809
+     * Filtres à appliquer au résultat
810
+     *
811
+     * @var array
812
+     */
813
+    public $param = [];
814
+
815
+    /**
816
+     * Source des filtres  (compatibilité) (?)
817
+     *
818
+     * @var array|null
819
+     */
820
+    public $fonctions = [];
821
+
822
+    /**
823
+     * Inutilisé, propriété générique de l'AST
824
+     *
825
+     * @var string|array
826
+     */
827
+    public $avant = '';
828
+
829
+    /**
830
+     * Inutilisé, propriété générique de l'AST
831
+     *
832
+     * @var string|array
833
+     */
834
+    public $apres = '';
835
+
836
+    /**
837
+     * Identifiant de la boucle
838
+     *
839
+     * @var string
840
+     */
841
+    public $id_boucle = '';
842
+
843
+    /**
844
+     * AST du squelette, liste de toutes les boucles
845
+     *
846
+     * @var Boucles[]
847
+     */
848
+    public $boucles;
849
+
850
+    /**
851
+     * Alias de table d'application de la requête ou nom complet de la table SQL
852
+     *
853
+     * @var string|null
854
+     */
855
+    public $type_requete;
856
+
857
+    /**
858
+     * Résultat de la compilation: toujours une expression PHP
859
+     *
860
+     * @var string
861
+     */
862
+    public $code = '';
863
+
864
+    /**
865
+     * Interdire les scripts
866
+     *
867
+     * @see interdire_scripts()
868
+     * @var bool
869
+     */
870
+    public $interdire_scripts = false;
871
+
872
+    /**
873
+     * Description du squelette
874
+     *
875
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
+     *
877
+     * Peut contenir les index :
878
+     * - nom : Nom du fichier de cache
879
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
+     * - sourcefile : Chemin du squelette
881
+     * - squelette : Code du squelette
882
+     * - id_mere : Identifiant de la boucle parente
883
+     * - documents : Pour embed et img dans les textes
884
+     * - session : Pour un cache sessionné par auteur
885
+     * - niv : Niveau de tabulation
886
+     *
887
+     * @var array
888
+     */
889
+    public $descr = [];
890
+
891
+    /**
892
+     * Numéro de ligne dans le code source du squelette
893
+     *
894
+     * @var int
895
+     */
896
+    public $ligne = 0;
897 897
 }
898 898
 
899 899
 /**
@@ -902,28 +902,28 @@  discard block
 block discarded – undo
902 902
  * @package SPIP\Core\Compilateur\AST
903 903
  **/
904 904
 class Polyglotte {
905
-	/**
906
-	 * Type de noeud
907
-	 *
908
-	 * @var string
909
-	 */
910
-	public $type = 'polyglotte';
911
-
912
-	/**
913
-	 * Tableau des traductions possibles classées par langue
914
-	 *
915
-	 * Tableau code de langue => texte
916
-	 *
917
-	 * @var array
918
-	 */
919
-	public $traductions = [];
920
-
921
-	/**
922
-	 * Numéro de ligne dans le code source du squelette
923
-	 *
924
-	 * @var int
925
-	 */
926
-	public $ligne = 0;
905
+    /**
906
+     * Type de noeud
907
+     *
908
+     * @var string
909
+     */
910
+    public $type = 'polyglotte';
911
+
912
+    /**
913
+     * Tableau des traductions possibles classées par langue
914
+     *
915
+     * Tableau code de langue => texte
916
+     *
917
+     * @var array
918
+     */
919
+    public $traductions = [];
920
+
921
+    /**
922
+     * Numéro de ligne dans le code source du squelette
923
+     *
924
+     * @var int
925
+     */
926
+    public $ligne = 0;
927 927
 }
928 928
 
929 929
 
@@ -948,90 +948,90 @@  discard block
 block discarded – undo
948 948
  */
949 949
 function declarer_interfaces() {
950 950
 
951
-	$GLOBALS['table_des_tables']['articles'] = 'articles';
952
-	$GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
-	$GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
-	$GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
-
956
-	// definition des statuts de publication
957
-	$GLOBALS['table_statut'] = [];
958
-
959
-	//
960
-	// tableau des tables de jointures
961
-	// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
-	$GLOBALS['tables_jointures'] = [];
963
-	$GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
-
965
-	// $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
-	$GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
967
-
968
-
969
-	if (!defined('_TRAITEMENT_TYPO')) {
970
-		define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
-	}
972
-	if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
-		define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
-	}
975
-	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
-		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
-	}
978
-	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
979
-	$GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
-	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
981
-	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982
-	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983
-	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
984
-	$GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
985
-	$GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
986
-	$GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
987
-	$GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
988
-	$GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
989
-	$GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
990
-	$GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
991
-	$GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
992
-	$GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
993
-	$GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
994
-	$GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
995
-	$GLOBALS['table_des_traitements']['TAGS'][] = '%s';
996
-	$GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
997
-	$GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
998
-	$GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
999
-	$GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
1000
-	$GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
1001
-	$GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1002
-
1003
-	// valeur par defaut pour les balises non listees ci-dessus
1004
-	$GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1005
-	// toujours securiser les DATA
1006
-	$GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1007
-	// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1008
-	$GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1009
-
1010
-
1011
-	// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1012
-	$interfaces = pipeline(
1013
-		'declarer_tables_interfaces',
1014
-		[
1015
-			'table_des_tables' => $GLOBALS['table_des_tables'],
1016
-			'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1017
-			'table_date' => $GLOBALS['table_date'],
1018
-			'table_titre' => $GLOBALS['table_titre'],
1019
-			'tables_jointures' => $GLOBALS['tables_jointures'],
1020
-			'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1021
-			'table_des_traitements' => $GLOBALS['table_des_traitements'],
1022
-			'table_statut' => $GLOBALS['table_statut'],
1023
-		]
1024
-	);
1025
-	if ($interfaces) {
1026
-		$GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1027
-		$GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1028
-		$GLOBALS['table_date'] = $interfaces['table_date'];
1029
-		$GLOBALS['table_titre'] = $interfaces['table_titre'];
1030
-		$GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1031
-		$GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1032
-		$GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1033
-		$GLOBALS['table_statut'] = $interfaces['table_statut'];
1034
-	}
951
+    $GLOBALS['table_des_tables']['articles'] = 'articles';
952
+    $GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
+    $GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
+    $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
+
956
+    // definition des statuts de publication
957
+    $GLOBALS['table_statut'] = [];
958
+
959
+    //
960
+    // tableau des tables de jointures
961
+    // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
+    $GLOBALS['tables_jointures'] = [];
963
+    $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
+
965
+    // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
+    $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
967
+
968
+
969
+    if (!defined('_TRAITEMENT_TYPO')) {
970
+        define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
+    }
972
+    if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
+        define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
+    }
975
+    if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
+        define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
+    }
978
+    $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
979
+    $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
+    $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
981
+    $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982
+    $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983
+    $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
984
+    $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
985
+    $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
986
+    $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
987
+    $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
988
+    $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
989
+    $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
990
+    $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
991
+    $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
992
+    $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
993
+    $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
994
+    $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
995
+    $GLOBALS['table_des_traitements']['TAGS'][] = '%s';
996
+    $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
997
+    $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
998
+    $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
999
+    $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
1000
+    $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
1001
+    $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1002
+
1003
+    // valeur par defaut pour les balises non listees ci-dessus
1004
+    $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1005
+    // toujours securiser les DATA
1006
+    $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1007
+    // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1008
+    $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1009
+
1010
+
1011
+    // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1012
+    $interfaces = pipeline(
1013
+        'declarer_tables_interfaces',
1014
+        [
1015
+            'table_des_tables' => $GLOBALS['table_des_tables'],
1016
+            'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1017
+            'table_date' => $GLOBALS['table_date'],
1018
+            'table_titre' => $GLOBALS['table_titre'],
1019
+            'tables_jointures' => $GLOBALS['tables_jointures'],
1020
+            'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1021
+            'table_des_traitements' => $GLOBALS['table_des_traitements'],
1022
+            'table_statut' => $GLOBALS['table_statut'],
1023
+        ]
1024
+    );
1025
+    if ($interfaces) {
1026
+        $GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1027
+        $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1028
+        $GLOBALS['table_date'] = $interfaces['table_date'];
1029
+        $GLOBALS['table_titre'] = $interfaces['table_titre'];
1030
+        $GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1031
+        $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1032
+        $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1033
+        $GLOBALS['table_statut'] = $interfaces['table_statut'];
1034
+    }
1035 1035
 }
1036 1036
 
1037 1037
 declarer_interfaces();
Please login to merge, or discard this patch.
ecrire/iterateur/sql.php 1 patch
Indentation   +204 added lines, -204 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
 
@@ -28,210 +28,210 @@  discard block
 block discarded – undo
28 28
  */
29 29
 class IterateurSQL implements Iterator {
30 30
 
31
-	/**
32
-	 * ressource sql
33
-	 *
34
-	 * @var resource|bool
35
-	 */
36
-	protected $sqlresult = false;
37
-
38
-	/**
39
-	 * row sql courante
40
-	 *
41
-	 * @var array|null
42
-	 */
43
-	protected $row = null;
44
-
45
-	protected $firstseek = false;
46
-
47
-	/**
48
-	 * Erreur presente ?
49
-	 *
50
-	 * @var bool
51
-	 **/
52
-	public $err = false;
53
-
54
-	/**
55
-	 * Calcul du total des elements
56
-	 *
57
-	 * @var int|null
58
-	 **/
59
-	public $total = null;
60
-
61
-	/**
62
-	 * selectionner les donnees, ie faire la requete SQL
63
-	 *
64
-	 * @return void
65
-	 */
66
-	protected function select() {
67
-		$this->row = null;
68
-		$v = &$this->command;
69
-		$this->sqlresult = calculer_select(
70
-			$v['select'],
71
-			$v['from'],
72
-			$v['type'],
73
-			$v['where'],
74
-			$v['join'],
75
-			$v['groupby'],
76
-			$v['orderby'],
77
-			$v['limit'],
78
-			$v['having'],
79
-			$v['table'],
80
-			$v['id'],
81
-			$v['connect'],
82
-			$this->info
83
-		);
84
-		$this->err = !$this->sqlresult;
85
-		$this->firstseek = false;
86
-		$this->pos = -1;
87
-
88
-		// pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite)
89
-		//$this->total = $this->count();
90
-	}
91
-
92
-	/*
31
+    /**
32
+     * ressource sql
33
+     *
34
+     * @var resource|bool
35
+     */
36
+    protected $sqlresult = false;
37
+
38
+    /**
39
+     * row sql courante
40
+     *
41
+     * @var array|null
42
+     */
43
+    protected $row = null;
44
+
45
+    protected $firstseek = false;
46
+
47
+    /**
48
+     * Erreur presente ?
49
+     *
50
+     * @var bool
51
+     **/
52
+    public $err = false;
53
+
54
+    /**
55
+     * Calcul du total des elements
56
+     *
57
+     * @var int|null
58
+     **/
59
+    public $total = null;
60
+
61
+    /**
62
+     * selectionner les donnees, ie faire la requete SQL
63
+     *
64
+     * @return void
65
+     */
66
+    protected function select() {
67
+        $this->row = null;
68
+        $v = &$this->command;
69
+        $this->sqlresult = calculer_select(
70
+            $v['select'],
71
+            $v['from'],
72
+            $v['type'],
73
+            $v['where'],
74
+            $v['join'],
75
+            $v['groupby'],
76
+            $v['orderby'],
77
+            $v['limit'],
78
+            $v['having'],
79
+            $v['table'],
80
+            $v['id'],
81
+            $v['connect'],
82
+            $this->info
83
+        );
84
+        $this->err = !$this->sqlresult;
85
+        $this->firstseek = false;
86
+        $this->pos = -1;
87
+
88
+        // pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite)
89
+        //$this->total = $this->count();
90
+    }
91
+
92
+    /*
93 93
 	 * array command: les commandes d'initialisation
94 94
 	 * array info: les infos sur le squelette
95 95
 	 */
96
-	public function __construct($command, $info = []) {
97
-		$this->type = 'SQL';
98
-		$this->command = $command;
99
-		$this->info = $info;
100
-		$this->select();
101
-	}
102
-
103
-	/**
104
-	 * Rembobiner
105
-	 *
106
-	 * @return bool
107
-	 */
108
-	public function rewind() : void {
109
-		if ($this->pos > 0) {
110
-			$this->seek(0);
111
-		}
112
-	}
113
-
114
-	/**
115
-	 * Verifier l'etat de l'iterateur
116
-	 *
117
-	 * @return bool
118
-	 */
119
-	public function valid(): bool {
120
-		if ($this->err) {
121
-			return false;
122
-		}
123
-		if (!$this->firstseek) {
124
-			$this->next();
125
-		}
126
-
127
-		return is_array($this->row);
128
-	}
129
-
130
-	/**
131
-	 * Valeurs sur la position courante
132
-	 *
133
-	 * @return array
134
-	 */
135
-	#[\ReturnTypeWillChange]
136
-	public function current() {
137
-		return $this->row;
138
-	}
139
-
140
-	#[\ReturnTypeWillChange]
141
-	public function key() {
142
-		return $this->pos;
143
-	}
144
-
145
-	/**
146
-	 * Sauter a une position absolue
147
-	 *
148
-	 * @param int $n
149
-	 * @param null|string $continue
150
-	 * @return bool
151
-	 */
152
-	public function seek($n = 0, $continue = null) {
153
-		if (!sql_seek($this->sqlresult, $n, $this->command['connect'], $continue)) {
154
-			// SQLite ne sait pas seek(), il faut relancer la query
155
-			// si la position courante est apres la position visee
156
-			// il faut relancer la requete
157
-			if ($this->pos > $n) {
158
-				$this->free();
159
-				$this->select();
160
-				$this->valid();
161
-			}
162
-			// et utiliser la methode par defaut pour se deplacer au bon endroit
163
-			// (sera fait en cas d'echec de cette fonction)
164
-			return false;
165
-		}
166
-		$this->row = sql_fetch($this->sqlresult, $this->command['connect']);
167
-		$this->pos = min($n, $this->count());
168
-
169
-		return true;
170
-	}
171
-
172
-	/**
173
-	 * Avancer d'un cran
174
-	 *
175
-	 * @return void
176
-	 */
177
-	public function next() : void {
178
-		$this->row = sql_fetch($this->sqlresult, $this->command['connect']);
179
-		$this->pos++;
180
-		$this->firstseek |= true;
181
-	}
182
-
183
-	/**
184
-	 * Avancer et retourner les donnees pour le nouvel element
185
-	 *
186
-	 * @return array|bool|null
187
-	 */
188
-	public function fetch() {
189
-		if ($this->valid()) {
190
-			$r = $this->current();
191
-			$this->next();
192
-		} else {
193
-			$r = false;
194
-		}
195
-
196
-		return $r;
197
-	}
198
-
199
-	/**
200
-	 * liberer les ressources
201
-	 *
202
-	 * @return bool
203
-	 */
204
-	public function free() {
205
-		if (!$this->sqlresult) {
206
-			return true;
207
-		}
208
-		$a = sql_free($this->sqlresult, $this->command['connect']);
209
-		$this->sqlresult = null;
210
-
211
-		return $a;
212
-	}
213
-
214
-	/**
215
-	 * Compter le nombre de resultats
216
-	 *
217
-	 * @return int
218
-	 */
219
-	public function count() {
220
-		if (is_null($this->total)) {
221
-			if (!$this->sqlresult) {
222
-				$this->total = 0;
223
-			} else {
224
-				# cas count(*)
225
-				if (in_array('count(*)', $this->command['select'])) {
226
-					$this->valid();
227
-					$s = $this->current();
228
-					$this->total = $s['count(*)'];
229
-				} else {
230
-					$this->total = sql_count($this->sqlresult, $this->command['connect']);
231
-				}
232
-			}
233
-		}
234
-
235
-		return $this->total;
236
-	}
96
+    public function __construct($command, $info = []) {
97
+        $this->type = 'SQL';
98
+        $this->command = $command;
99
+        $this->info = $info;
100
+        $this->select();
101
+    }
102
+
103
+    /**
104
+     * Rembobiner
105
+     *
106
+     * @return bool
107
+     */
108
+    public function rewind() : void {
109
+        if ($this->pos > 0) {
110
+            $this->seek(0);
111
+        }
112
+    }
113
+
114
+    /**
115
+     * Verifier l'etat de l'iterateur
116
+     *
117
+     * @return bool
118
+     */
119
+    public function valid(): bool {
120
+        if ($this->err) {
121
+            return false;
122
+        }
123
+        if (!$this->firstseek) {
124
+            $this->next();
125
+        }
126
+
127
+        return is_array($this->row);
128
+    }
129
+
130
+    /**
131
+     * Valeurs sur la position courante
132
+     *
133
+     * @return array
134
+     */
135
+    #[\ReturnTypeWillChange]
136
+    public function current() {
137
+        return $this->row;
138
+    }
139
+
140
+    #[\ReturnTypeWillChange]
141
+    public function key() {
142
+        return $this->pos;
143
+    }
144
+
145
+    /**
146
+     * Sauter a une position absolue
147
+     *
148
+     * @param int $n
149
+     * @param null|string $continue
150
+     * @return bool
151
+     */
152
+    public function seek($n = 0, $continue = null) {
153
+        if (!sql_seek($this->sqlresult, $n, $this->command['connect'], $continue)) {
154
+            // SQLite ne sait pas seek(), il faut relancer la query
155
+            // si la position courante est apres la position visee
156
+            // il faut relancer la requete
157
+            if ($this->pos > $n) {
158
+                $this->free();
159
+                $this->select();
160
+                $this->valid();
161
+            }
162
+            // et utiliser la methode par defaut pour se deplacer au bon endroit
163
+            // (sera fait en cas d'echec de cette fonction)
164
+            return false;
165
+        }
166
+        $this->row = sql_fetch($this->sqlresult, $this->command['connect']);
167
+        $this->pos = min($n, $this->count());
168
+
169
+        return true;
170
+    }
171
+
172
+    /**
173
+     * Avancer d'un cran
174
+     *
175
+     * @return void
176
+     */
177
+    public function next() : void {
178
+        $this->row = sql_fetch($this->sqlresult, $this->command['connect']);
179
+        $this->pos++;
180
+        $this->firstseek |= true;
181
+    }
182
+
183
+    /**
184
+     * Avancer et retourner les donnees pour le nouvel element
185
+     *
186
+     * @return array|bool|null
187
+     */
188
+    public function fetch() {
189
+        if ($this->valid()) {
190
+            $r = $this->current();
191
+            $this->next();
192
+        } else {
193
+            $r = false;
194
+        }
195
+
196
+        return $r;
197
+    }
198
+
199
+    /**
200
+     * liberer les ressources
201
+     *
202
+     * @return bool
203
+     */
204
+    public function free() {
205
+        if (!$this->sqlresult) {
206
+            return true;
207
+        }
208
+        $a = sql_free($this->sqlresult, $this->command['connect']);
209
+        $this->sqlresult = null;
210
+
211
+        return $a;
212
+    }
213
+
214
+    /**
215
+     * Compter le nombre de resultats
216
+     *
217
+     * @return int
218
+     */
219
+    public function count() {
220
+        if (is_null($this->total)) {
221
+            if (!$this->sqlresult) {
222
+                $this->total = 0;
223
+            } else {
224
+                # cas count(*)
225
+                if (in_array('count(*)', $this->command['select'])) {
226
+                    $this->valid();
227
+                    $s = $this->current();
228
+                    $this->total = $s['count(*)'];
229
+                } else {
230
+                    $this->total = sql_count($this->sqlresult, $this->command['connect']);
231
+                }
232
+            }
233
+        }
234
+
235
+        return $this->total;
236
+    }
237 237
 }
Please login to merge, or discard this patch.