@@ -4,411 +4,411 @@ discard block |
||
| 4 | 4 | // ** ne pas modifier le fichier ** |
| 5 | 5 | |
| 6 | 6 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 7 | - return; |
|
| 7 | + return; |
|
| 8 | 8 | } |
| 9 | 9 | |
| 10 | 10 | $GLOBALS[$GLOBALS['idx_lang']] = array( |
| 11 | 11 | |
| 12 | - // A |
|
| 13 | - 'activer_plugin' => 'Aktivigi la kromprogramon', |
|
| 14 | - 'affichage' => 'Afiŝado', |
|
| 15 | - 'aide_non_disponible' => 'Tiu ĉi parto de la rethelpilo ankoraŭ ne disponeblas en tiu ĉi lingvo.', |
|
| 16 | - 'annuler_recherche' => 'Nuligi serĉon', |
|
| 17 | - 'auteur' => 'Aŭtoro :', |
|
| 18 | - 'avis_acces_interdit' => 'Malpermesata aliro.', |
|
| 19 | - 'avis_article_modifie' => 'Atentu, @nom_auteur_modif@ laboris pri tiu artikolo antaŭ @date_diff@ minutoj', |
|
| 20 | - 'avis_aucun_resultat' => 'Neniu rezulto.', |
|
| 21 | - 'avis_base_inaccessible' => 'Ne eblas konektiĝi al la datumbazo @base@.', |
|
| 22 | - 'avis_chemin_invalide_1' => 'La alirvojo, kiun vi elektis, ', |
|
| 23 | - 'avis_chemin_invalide_2' => 'ne ŝajnas taŭgi. Bonvolu reveni al la antaŭa paĝo kaj kontroli la entajpitajn datenojn.', |
|
| 24 | - 'avis_connexion_echec_1' => 'Konektiĝo al SQL-servilo malsukcesis.', |
|
| 25 | - 'avis_connexion_echec_2' => 'Revenu al la antaŭa paĝo, kaj kontrolu entajpitajn datenojn.', |
|
| 26 | - 'avis_connexion_echec_3' => '<b>N.B.</b> Ĉe multaj serviloj, vi devas <b>peti</b> aktivigon de via aliro al SQL-datumbazo antaŭ ol uzi ĝin. Se vi ne povas konektiĝi, kontrolu ke vi ja faris tiun ĉi demarŝon.', |
|
| 27 | - 'avis_connexion_erreur_creer_base' => 'La datenbazo ne povis esti kreita.', |
|
| 28 | - 'avis_connexion_erreur_nom_base' => 'La nomo de la datumbazo enhaveblas nur literoj, ciferoj kaj haltostrekoj', |
|
| 29 | - 'avis_connexion_ldap_echec_1' => 'Konektiĝo al LDAP-servilo malsukcesis.', |
|
| 30 | - 'avis_connexion_ldap_echec_2' => 'Revenu al la antaŭa paĝo, kaj kontrolu la entajpitajn datenojn. ', |
|
| 31 | - 'avis_connexion_ldap_echec_3' => 'Eventuale, provu ne uzi LDAP-materialon por importi uzantojn.', |
|
| 32 | - 'avis_deplacement_rubrique' => 'Atentu ! Tiu ĉi rubriko enhavas @contient_breves@ fulm-informon @scb@ : se vi translokas ĝin, bonvolu noĉi tiun por-konfirman noĉujon. ', |
|
| 33 | - 'avis_erreur_connexion_mysql' => 'SQL-konekta eraro ', |
|
| 34 | - 'avis_espace_interdit' => '<b>Malpermesata aliro</b> <div>SPIP jam estas instalita.</div>', |
|
| 35 | - 'avis_lecture_noms_bases_1' => 'Instalprogramo ne sukcesis legi la nomojn de la instalitaj datenbazoj.', |
|
| 36 | - 'avis_lecture_noms_bases_2' => 'Aŭ neniu datenbazo disponeblas, aŭ la funkcio ebliganta listigi datenbazojn estis malaktivigita pro sekuraj kialoj (tio ja okazas ĉe multaj retejoj-gastigantoj).', |
|
| 37 | - 'avis_lecture_noms_bases_3' => 'Okaze de la dua alternativo, eble uzeblos datenbazo nomita per via salutnomo :', |
|
| 38 | - 'avis_non_acces_page' => 'Vi ne havas alir-rajton al tiu paĝo.', |
|
| 39 | - 'avis_operation_echec' => 'La ago malsukcesis.', |
|
| 40 | - 'avis_operation_impossible' => 'Faro ne ebla', |
|
| 41 | - 'avis_suppression_base' => 'ATENTU, forviŝo de datenoj estas definitiva', |
|
| 12 | + // A |
|
| 13 | + 'activer_plugin' => 'Aktivigi la kromprogramon', |
|
| 14 | + 'affichage' => 'Afiŝado', |
|
| 15 | + 'aide_non_disponible' => 'Tiu ĉi parto de la rethelpilo ankoraŭ ne disponeblas en tiu ĉi lingvo.', |
|
| 16 | + 'annuler_recherche' => 'Nuligi serĉon', |
|
| 17 | + 'auteur' => 'Aŭtoro :', |
|
| 18 | + 'avis_acces_interdit' => 'Malpermesata aliro.', |
|
| 19 | + 'avis_article_modifie' => 'Atentu, @nom_auteur_modif@ laboris pri tiu artikolo antaŭ @date_diff@ minutoj', |
|
| 20 | + 'avis_aucun_resultat' => 'Neniu rezulto.', |
|
| 21 | + 'avis_base_inaccessible' => 'Ne eblas konektiĝi al la datumbazo @base@.', |
|
| 22 | + 'avis_chemin_invalide_1' => 'La alirvojo, kiun vi elektis, ', |
|
| 23 | + 'avis_chemin_invalide_2' => 'ne ŝajnas taŭgi. Bonvolu reveni al la antaŭa paĝo kaj kontroli la entajpitajn datenojn.', |
|
| 24 | + 'avis_connexion_echec_1' => 'Konektiĝo al SQL-servilo malsukcesis.', |
|
| 25 | + 'avis_connexion_echec_2' => 'Revenu al la antaŭa paĝo, kaj kontrolu entajpitajn datenojn.', |
|
| 26 | + 'avis_connexion_echec_3' => '<b>N.B.</b> Ĉe multaj serviloj, vi devas <b>peti</b> aktivigon de via aliro al SQL-datumbazo antaŭ ol uzi ĝin. Se vi ne povas konektiĝi, kontrolu ke vi ja faris tiun ĉi demarŝon.', |
|
| 27 | + 'avis_connexion_erreur_creer_base' => 'La datenbazo ne povis esti kreita.', |
|
| 28 | + 'avis_connexion_erreur_nom_base' => 'La nomo de la datumbazo enhaveblas nur literoj, ciferoj kaj haltostrekoj', |
|
| 29 | + 'avis_connexion_ldap_echec_1' => 'Konektiĝo al LDAP-servilo malsukcesis.', |
|
| 30 | + 'avis_connexion_ldap_echec_2' => 'Revenu al la antaŭa paĝo, kaj kontrolu la entajpitajn datenojn. ', |
|
| 31 | + 'avis_connexion_ldap_echec_3' => 'Eventuale, provu ne uzi LDAP-materialon por importi uzantojn.', |
|
| 32 | + 'avis_deplacement_rubrique' => 'Atentu ! Tiu ĉi rubriko enhavas @contient_breves@ fulm-informon @scb@ : se vi translokas ĝin, bonvolu noĉi tiun por-konfirman noĉujon. ', |
|
| 33 | + 'avis_erreur_connexion_mysql' => 'SQL-konekta eraro ', |
|
| 34 | + 'avis_espace_interdit' => '<b>Malpermesata aliro</b> <div>SPIP jam estas instalita.</div>', |
|
| 35 | + 'avis_lecture_noms_bases_1' => 'Instalprogramo ne sukcesis legi la nomojn de la instalitaj datenbazoj.', |
|
| 36 | + 'avis_lecture_noms_bases_2' => 'Aŭ neniu datenbazo disponeblas, aŭ la funkcio ebliganta listigi datenbazojn estis malaktivigita pro sekuraj kialoj (tio ja okazas ĉe multaj retejoj-gastigantoj).', |
|
| 37 | + 'avis_lecture_noms_bases_3' => 'Okaze de la dua alternativo, eble uzeblos datenbazo nomita per via salutnomo :', |
|
| 38 | + 'avis_non_acces_page' => 'Vi ne havas alir-rajton al tiu paĝo.', |
|
| 39 | + 'avis_operation_echec' => 'La ago malsukcesis.', |
|
| 40 | + 'avis_operation_impossible' => 'Faro ne ebla', |
|
| 41 | + 'avis_suppression_base' => 'ATENTU, forviŝo de datenoj estas definitiva', |
|
| 42 | 42 | |
| 43 | - // B |
|
| 44 | - 'bouton_acces_ldap' => 'Aldoni aliron al LDAP', |
|
| 45 | - 'bouton_ajouter' => 'Aldoni', |
|
| 46 | - 'bouton_annuler' => 'Nuligi', |
|
| 47 | - 'bouton_cache_activer' => 'Reaktivigi la staplon', |
|
| 48 | - 'bouton_cache_desactiver' => 'Malaktivigi maldaŭre la staplon', |
|
| 49 | - 'bouton_demande_publication' => 'Peti publikigon de tiu ĉi artikolo', |
|
| 50 | - 'bouton_desactive_tout' => 'Ĉion malaktivigi', |
|
| 51 | - 'bouton_desinstaller' => 'Malinstali', |
|
| 52 | - 'bouton_effacer_tout' => 'Forviŝi ĈION', |
|
| 53 | - 'bouton_envoyer_message' => 'Definitiva mesaĝo : sendi', |
|
| 54 | - 'bouton_fermer' => 'Fermi', |
|
| 55 | - 'bouton_mettre_a_jour_base' => 'Ĝisdatigi la datumbazo', |
|
| 56 | - 'bouton_modifier' => 'Modifi', |
|
| 57 | - 'bouton_radio_afficher' => 'Afiŝi', |
|
| 58 | - 'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Aperi en la listo de konektitaj redaktantoj', |
|
| 59 | - 'bouton_radio_envoi_annonces_adresse' => 'Sendi la anoncojn al jena adreso :', |
|
| 60 | - 'bouton_radio_envoi_liste_nouveautes' => 'Sendi la novaĵoj-liston', |
|
| 61 | - 'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Ne aperi en la listo de redaktantoj', |
|
| 62 | - 'bouton_radio_non_envoi_annonces_editoriales' => 'Ne sendi anoncojn pri ĉefartikoloj', |
|
| 63 | - 'bouton_redirection' => 'ALIDIREKTIGO', |
|
| 64 | - 'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Restarigi laŭ defaŭltaj valoroj', |
|
| 65 | - 'bouton_relancer_installation' => 'Relanĉi la instaladon', |
|
| 66 | - 'bouton_reset_password' => 'Krei novan pasvorton, kaj sendi ĝin retpoŝte', |
|
| 67 | - 'bouton_suivant' => 'Sekvanta', |
|
| 68 | - 'bouton_tenter_recuperation' => 'Provi riparon', |
|
| 69 | - 'bouton_test_proxy' => 'Provi la prokuran servilon', |
|
| 70 | - 'bouton_vider_cache' => 'Malplenigi la staplon', |
|
| 43 | + // B |
|
| 44 | + 'bouton_acces_ldap' => 'Aldoni aliron al LDAP', |
|
| 45 | + 'bouton_ajouter' => 'Aldoni', |
|
| 46 | + 'bouton_annuler' => 'Nuligi', |
|
| 47 | + 'bouton_cache_activer' => 'Reaktivigi la staplon', |
|
| 48 | + 'bouton_cache_desactiver' => 'Malaktivigi maldaŭre la staplon', |
|
| 49 | + 'bouton_demande_publication' => 'Peti publikigon de tiu ĉi artikolo', |
|
| 50 | + 'bouton_desactive_tout' => 'Ĉion malaktivigi', |
|
| 51 | + 'bouton_desinstaller' => 'Malinstali', |
|
| 52 | + 'bouton_effacer_tout' => 'Forviŝi ĈION', |
|
| 53 | + 'bouton_envoyer_message' => 'Definitiva mesaĝo : sendi', |
|
| 54 | + 'bouton_fermer' => 'Fermi', |
|
| 55 | + 'bouton_mettre_a_jour_base' => 'Ĝisdatigi la datumbazo', |
|
| 56 | + 'bouton_modifier' => 'Modifi', |
|
| 57 | + 'bouton_radio_afficher' => 'Afiŝi', |
|
| 58 | + 'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Aperi en la listo de konektitaj redaktantoj', |
|
| 59 | + 'bouton_radio_envoi_annonces_adresse' => 'Sendi la anoncojn al jena adreso :', |
|
| 60 | + 'bouton_radio_envoi_liste_nouveautes' => 'Sendi la novaĵoj-liston', |
|
| 61 | + 'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Ne aperi en la listo de redaktantoj', |
|
| 62 | + 'bouton_radio_non_envoi_annonces_editoriales' => 'Ne sendi anoncojn pri ĉefartikoloj', |
|
| 63 | + 'bouton_redirection' => 'ALIDIREKTIGO', |
|
| 64 | + 'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Restarigi laŭ defaŭltaj valoroj', |
|
| 65 | + 'bouton_relancer_installation' => 'Relanĉi la instaladon', |
|
| 66 | + 'bouton_reset_password' => 'Krei novan pasvorton, kaj sendi ĝin retpoŝte', |
|
| 67 | + 'bouton_suivant' => 'Sekvanta', |
|
| 68 | + 'bouton_tenter_recuperation' => 'Provi riparon', |
|
| 69 | + 'bouton_test_proxy' => 'Provi la prokuran servilon', |
|
| 70 | + 'bouton_vider_cache' => 'Malplenigi la staplon', |
|
| 71 | 71 | |
| 72 | - // C |
|
| 73 | - 'cache_modifiable_webmestre' => 'Tiun parametron povas modifi la retejestro.', |
|
| 74 | - 'calendrier_synchro' => 'Se vi uzas temp-organizan bitvaron kongruan kun <b>iCal</b> formato, vi povas ĝisdatigi tiun lastan laŭ la datenoj de tiu ĉi retejo.', |
|
| 75 | - 'config_activer_champs' => 'Ŝalti la jenajn kampojn', |
|
| 76 | - 'config_choix_base_sup' => 'indiki datumbazon ĉe tiu ĉi servilo', |
|
| 77 | - 'config_erreur_base_sup' => 'SPIP ne havas alireblon al listo de alireblaj bazoj', |
|
| 78 | - 'config_info_base_sup' => 'Se vi havas aliajn datumbazojn por pridemandi tra SPIP, pere de ĝia SQL-servilo aŭ de alia servilo, la ĉi-suba formularo ebligas al vi ilin deklari. Se vi lasas tajpujojn malplenaj, la ensalutiloj al la ĉefa datumbazo estos uzitaj.', |
|
| 79 | - 'config_info_base_sup_disponibles' => 'Jam pridemandeblaj kromaj datumbazoj :', |
|
| 80 | - 'config_info_enregistree' => 'La nova agordo estas registrita', |
|
| 81 | - 'config_info_logos' => 'Ĉiu elemento de la retejo povas havi vinjeton, kaj « flugrigardeblajn vinjeton »', |
|
| 82 | - 'config_info_logos_utiliser' => 'Uzi la vinjetojn', |
|
| 83 | - 'config_info_logos_utiliser_non' => 'Ne uzi la vinjetojn', |
|
| 84 | - 'config_info_logos_utiliser_survol' => 'Uzi la flugrigardajn vinjetojn', |
|
| 85 | - 'config_info_logos_utiliser_survol_non' => 'Ne uzi la flugrigardeblajn vinjetojn', |
|
| 86 | - 'config_info_redirection' => 'Se vi ŝaltas tiun ĉi opcion, vi povos krei virtualajn artikolojn, simplajn referencojn pri artikoloj publikigitaj ĉe aliaj retejoj aŭ ekster SPIP.', |
|
| 87 | - 'config_redirection' => 'Virtualaj artikoloj', |
|
| 88 | - 'config_titre_base_sup' => 'Deklaro de kroma datumbazo', |
|
| 89 | - 'config_titre_base_sup_choix' => 'Elektu kroman datumbazon', |
|
| 90 | - 'connexion_ldap' => 'Konektiĝo :', |
|
| 91 | - 'creer_et_associer_un_auteur' => 'Krei kaj ligi aŭtoron', |
|
| 72 | + // C |
|
| 73 | + 'cache_modifiable_webmestre' => 'Tiun parametron povas modifi la retejestro.', |
|
| 74 | + 'calendrier_synchro' => 'Se vi uzas temp-organizan bitvaron kongruan kun <b>iCal</b> formato, vi povas ĝisdatigi tiun lastan laŭ la datenoj de tiu ĉi retejo.', |
|
| 75 | + 'config_activer_champs' => 'Ŝalti la jenajn kampojn', |
|
| 76 | + 'config_choix_base_sup' => 'indiki datumbazon ĉe tiu ĉi servilo', |
|
| 77 | + 'config_erreur_base_sup' => 'SPIP ne havas alireblon al listo de alireblaj bazoj', |
|
| 78 | + 'config_info_base_sup' => 'Se vi havas aliajn datumbazojn por pridemandi tra SPIP, pere de ĝia SQL-servilo aŭ de alia servilo, la ĉi-suba formularo ebligas al vi ilin deklari. Se vi lasas tajpujojn malplenaj, la ensalutiloj al la ĉefa datumbazo estos uzitaj.', |
|
| 79 | + 'config_info_base_sup_disponibles' => 'Jam pridemandeblaj kromaj datumbazoj :', |
|
| 80 | + 'config_info_enregistree' => 'La nova agordo estas registrita', |
|
| 81 | + 'config_info_logos' => 'Ĉiu elemento de la retejo povas havi vinjeton, kaj « flugrigardeblajn vinjeton »', |
|
| 82 | + 'config_info_logos_utiliser' => 'Uzi la vinjetojn', |
|
| 83 | + 'config_info_logos_utiliser_non' => 'Ne uzi la vinjetojn', |
|
| 84 | + 'config_info_logos_utiliser_survol' => 'Uzi la flugrigardajn vinjetojn', |
|
| 85 | + 'config_info_logos_utiliser_survol_non' => 'Ne uzi la flugrigardeblajn vinjetojn', |
|
| 86 | + 'config_info_redirection' => 'Se vi ŝaltas tiun ĉi opcion, vi povos krei virtualajn artikolojn, simplajn referencojn pri artikoloj publikigitaj ĉe aliaj retejoj aŭ ekster SPIP.', |
|
| 87 | + 'config_redirection' => 'Virtualaj artikoloj', |
|
| 88 | + 'config_titre_base_sup' => 'Deklaro de kroma datumbazo', |
|
| 89 | + 'config_titre_base_sup_choix' => 'Elektu kroman datumbazon', |
|
| 90 | + 'connexion_ldap' => 'Konektiĝo :', |
|
| 91 | + 'creer_et_associer_un_auteur' => 'Krei kaj ligi aŭtoron', |
|
| 92 | 92 | |
| 93 | - // D |
|
| 94 | - 'date_mot_heures' => 'horoj', |
|
| 93 | + // D |
|
| 94 | + 'date_mot_heures' => 'horoj', |
|
| 95 | 95 | |
| 96 | - // E |
|
| 97 | - 'ecran_securite' => ' + sekuriga ŝirmilo @version@', |
|
| 98 | - 'email' => 'retpoŝtadreso', |
|
| 99 | - 'email_2' => 'retpoŝtadreso :', |
|
| 100 | - 'en_savoir_plus' => 'Pli scii tion', |
|
| 101 | - 'entree_adresse_annuaire' => 'Adreso al la dosierujilo', |
|
| 102 | - 'entree_adresse_email' => 'Via retpoŝtadreso', |
|
| 103 | - 'entree_adresse_email_2' => ' Retpoŝtadreso', |
|
| 104 | - 'entree_base_donnee_1' => 'Adreso de la datenbazo', |
|
| 105 | - 'entree_base_donnee_2' => '(Tiu adreso ofte estas tiu de via retejo, foje estas "localhost", alifoje la entajpujo restas malplena.)', |
|
| 106 | - 'entree_biographie' => 'Mallonga kelkvorta biografio.', |
|
| 107 | - 'entree_chemin_acces' => '<b>Entajpi</b> alirvojon :', |
|
| 108 | - 'entree_cle_pgp' => 'Via PGP-ŝlosilo ', |
|
| 109 | - 'entree_cle_pgp_2' => 'PGP-ŝlosilo', |
|
| 110 | - 'entree_contenu_rubrique' => '(Enhavo de la rubriko per kelkaj vortoj.)', |
|
| 111 | - 'entree_identifiants_connexion' => 'Viaj ensalutiloj...', |
|
| 112 | - 'entree_identifiants_connexion_2' => 'Ensalutiloj', |
|
| 113 | - 'entree_informations_connexion_ldap' => 'En tiun formularon, bonvolu entajpi informojn por konekti al via LDAP-dosierujilo. Tiujn informojn disponigu al vi la sistema aŭ reta mastrumanto.', |
|
| 114 | - 'entree_infos_perso' => 'Kiu vi estas ?', |
|
| 115 | - 'entree_infos_perso_2' => 'Kiu estas la aŭtoro ?', |
|
| 116 | - 'entree_interieur_rubrique' => 'En la rubriko :', |
|
| 117 | - 'entree_liens_sites' => '<b>Hiperligilo</b> (referenco, vizitinda retejo...)', |
|
| 118 | - 'entree_login' => 'Via salutnomo', |
|
| 119 | - 'entree_login_connexion_1' => 'La salutnomo', |
|
| 120 | - 'entree_login_connexion_2' => '(Foje estas via salutnomo por eniri la FTP-ejon ; foje ĝi restas malplena)', |
|
| 121 | - 'entree_mot_passe' => 'Via pasvorto', |
|
| 122 | - 'entree_mot_passe_1' => 'La pasvorto por ensaluti', |
|
| 123 | - 'entree_mot_passe_2' => '(Foje estas via pasvorto por la FTP-ejo ; foje ĝi restas malplena)', |
|
| 124 | - 'entree_nom_fichier' => 'Bonvolu entajpi la dosieran nomon @texte_compresse@ :', |
|
| 125 | - 'entree_nom_pseudo' => 'Via nomo aŭ via kromnomo', |
|
| 126 | - 'entree_nom_pseudo_1' => '(Via nomo aŭ via kromnomo)', |
|
| 127 | - 'entree_nom_pseudo_2' => 'Nomo aŭ kromnomo', |
|
| 128 | - 'entree_nom_site' => 'La nomo de via retejo', |
|
| 129 | - 'entree_nom_site_2' => 'retejnomo de la aŭtoro', |
|
| 130 | - 'entree_nouveau_passe' => 'Nova pasvorto', |
|
| 131 | - 'entree_passe_ldap' => 'Pasvorto', |
|
| 132 | - 'entree_port_annuaire' => 'Numero de la dosierujila pordo', |
|
| 133 | - 'entree_signature' => 'Subskribo', |
|
| 134 | - 'entree_titre_obligatoire' => '<b>Titolo</b> [Deviga]<br />', |
|
| 135 | - 'entree_url' => 'Retadreso de via retejo', |
|
| 136 | - 'entree_url_2' => 'Retadreso de la retejo', |
|
| 137 | - 'erreur_connect_deja_existant' => 'Servilo jam ekzistas kun tiu nomo', |
|
| 138 | - 'erreur_contenu_suspect' => 'Teksto kun ne aktivaj HTML-markoj', |
|
| 139 | - 'erreur_email_deja_existant' => 'Tiu retpoŝtadreso jam estas registrita.', |
|
| 140 | - 'erreur_nom_connect_incorrect' => 'Tiu servilonomo ne estas permesita', |
|
| 141 | - 'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ mankas en la marko @balise@.', |
|
| 142 | - 'erreur_plugin_desinstalation_echouee' => 'La malinstalo de la kromprogramo malsukcesis. |
|
| 96 | + // E |
|
| 97 | + 'ecran_securite' => ' + sekuriga ŝirmilo @version@', |
|
| 98 | + 'email' => 'retpoŝtadreso', |
|
| 99 | + 'email_2' => 'retpoŝtadreso :', |
|
| 100 | + 'en_savoir_plus' => 'Pli scii tion', |
|
| 101 | + 'entree_adresse_annuaire' => 'Adreso al la dosierujilo', |
|
| 102 | + 'entree_adresse_email' => 'Via retpoŝtadreso', |
|
| 103 | + 'entree_adresse_email_2' => ' Retpoŝtadreso', |
|
| 104 | + 'entree_base_donnee_1' => 'Adreso de la datenbazo', |
|
| 105 | + 'entree_base_donnee_2' => '(Tiu adreso ofte estas tiu de via retejo, foje estas "localhost", alifoje la entajpujo restas malplena.)', |
|
| 106 | + 'entree_biographie' => 'Mallonga kelkvorta biografio.', |
|
| 107 | + 'entree_chemin_acces' => '<b>Entajpi</b> alirvojon :', |
|
| 108 | + 'entree_cle_pgp' => 'Via PGP-ŝlosilo ', |
|
| 109 | + 'entree_cle_pgp_2' => 'PGP-ŝlosilo', |
|
| 110 | + 'entree_contenu_rubrique' => '(Enhavo de la rubriko per kelkaj vortoj.)', |
|
| 111 | + 'entree_identifiants_connexion' => 'Viaj ensalutiloj...', |
|
| 112 | + 'entree_identifiants_connexion_2' => 'Ensalutiloj', |
|
| 113 | + 'entree_informations_connexion_ldap' => 'En tiun formularon, bonvolu entajpi informojn por konekti al via LDAP-dosierujilo. Tiujn informojn disponigu al vi la sistema aŭ reta mastrumanto.', |
|
| 114 | + 'entree_infos_perso' => 'Kiu vi estas ?', |
|
| 115 | + 'entree_infos_perso_2' => 'Kiu estas la aŭtoro ?', |
|
| 116 | + 'entree_interieur_rubrique' => 'En la rubriko :', |
|
| 117 | + 'entree_liens_sites' => '<b>Hiperligilo</b> (referenco, vizitinda retejo...)', |
|
| 118 | + 'entree_login' => 'Via salutnomo', |
|
| 119 | + 'entree_login_connexion_1' => 'La salutnomo', |
|
| 120 | + 'entree_login_connexion_2' => '(Foje estas via salutnomo por eniri la FTP-ejon ; foje ĝi restas malplena)', |
|
| 121 | + 'entree_mot_passe' => 'Via pasvorto', |
|
| 122 | + 'entree_mot_passe_1' => 'La pasvorto por ensaluti', |
|
| 123 | + 'entree_mot_passe_2' => '(Foje estas via pasvorto por la FTP-ejo ; foje ĝi restas malplena)', |
|
| 124 | + 'entree_nom_fichier' => 'Bonvolu entajpi la dosieran nomon @texte_compresse@ :', |
|
| 125 | + 'entree_nom_pseudo' => 'Via nomo aŭ via kromnomo', |
|
| 126 | + 'entree_nom_pseudo_1' => '(Via nomo aŭ via kromnomo)', |
|
| 127 | + 'entree_nom_pseudo_2' => 'Nomo aŭ kromnomo', |
|
| 128 | + 'entree_nom_site' => 'La nomo de via retejo', |
|
| 129 | + 'entree_nom_site_2' => 'retejnomo de la aŭtoro', |
|
| 130 | + 'entree_nouveau_passe' => 'Nova pasvorto', |
|
| 131 | + 'entree_passe_ldap' => 'Pasvorto', |
|
| 132 | + 'entree_port_annuaire' => 'Numero de la dosierujila pordo', |
|
| 133 | + 'entree_signature' => 'Subskribo', |
|
| 134 | + 'entree_titre_obligatoire' => '<b>Titolo</b> [Deviga]<br />', |
|
| 135 | + 'entree_url' => 'Retadreso de via retejo', |
|
| 136 | + 'entree_url_2' => 'Retadreso de la retejo', |
|
| 137 | + 'erreur_connect_deja_existant' => 'Servilo jam ekzistas kun tiu nomo', |
|
| 138 | + 'erreur_contenu_suspect' => 'Teksto kun ne aktivaj HTML-markoj', |
|
| 139 | + 'erreur_email_deja_existant' => 'Tiu retpoŝtadreso jam estas registrita.', |
|
| 140 | + 'erreur_nom_connect_incorrect' => 'Tiu servilonomo ne estas permesita', |
|
| 141 | + 'erreur_plugin_attribut_balise_manquant' => 'Atributo @attribut@ mankas en la marko @balise@.', |
|
| 142 | + 'erreur_plugin_desinstalation_echouee' => 'La malinstalo de la kromprogramo malsukcesis. |
|
| 143 | 143 | Tamen vi povas malŝalti ĝin.', |
| 144 | - 'erreur_plugin_fichier_absent' => 'Foresta dosiero', |
|
| 145 | - 'erreur_plugin_fichier_def_absent' => 'Difina dosiero forestas', |
|
| 146 | - 'erreur_plugin_nom_fonction_interdit' => 'Malpermesata funkcio-nomo', |
|
| 147 | - 'erreur_plugin_nom_manquant' => 'Kromprogramo-nomo mankas', |
|
| 148 | - 'erreur_plugin_prefix_manquant' => 'Nedifinita nom-spaco de kromprogramo', |
|
| 149 | - 'erreur_plugin_tag_plugin_absent' => '<plugin> mankas en tiu difina dosiero', |
|
| 150 | - 'erreur_plugin_version_manquant' => 'Kromprogramo-versio mankas', |
|
| 144 | + 'erreur_plugin_fichier_absent' => 'Foresta dosiero', |
|
| 145 | + 'erreur_plugin_fichier_def_absent' => 'Difina dosiero forestas', |
|
| 146 | + 'erreur_plugin_nom_fonction_interdit' => 'Malpermesata funkcio-nomo', |
|
| 147 | + 'erreur_plugin_nom_manquant' => 'Kromprogramo-nomo mankas', |
|
| 148 | + 'erreur_plugin_prefix_manquant' => 'Nedifinita nom-spaco de kromprogramo', |
|
| 149 | + 'erreur_plugin_tag_plugin_absent' => '<plugin> mankas en tiu difina dosiero', |
|
| 150 | + 'erreur_plugin_version_manquant' => 'Kromprogramo-versio mankas', |
|
| 151 | 151 | |
| 152 | - // H |
|
| 153 | - 'htaccess_a_simuler' => 'Averto : la agordo de vian HTTP-servilo ignoras dosierojn @htaccess@. Por certigi taŭgan sekureco, vi devas ŝanĝi la agordon pri tio, aŭ ke konstantoj @constantes@ (difinebla en la dosiero mes_options.php) havas kiel valoro dosierujojn ekstere de @document_root@.', |
|
| 154 | - 'htaccess_inoperant' => 'senefika htaccess', |
|
| 152 | + // H |
|
| 153 | + 'htaccess_a_simuler' => 'Averto : la agordo de vian HTTP-servilo ignoras dosierojn @htaccess@. Por certigi taŭgan sekureco, vi devas ŝanĝi la agordon pri tio, aŭ ke konstantoj @constantes@ (difinebla en la dosiero mes_options.php) havas kiel valoro dosierujojn ekstere de @document_root@.', |
|
| 154 | + 'htaccess_inoperant' => 'senefika htaccess', |
|
| 155 | 155 | |
| 156 | - // I |
|
| 157 | - 'ical_info1' => 'Tiu paĝo prezentas plurajn metodojn por daŭre ricevi informojn pri la vivo de tiu retejo.', |
|
| 158 | - 'ical_info2' => 'Por pli da informoj pri ĉi ĉiuj teknikoj, senhezite konsultu <a href="@spipnet@">la dokumentaron de SPIP</a>.', |
|
| 159 | - 'ical_info_calendrier' => 'Du kalendaroj disponeblas. La unua estas retejo-mapo anoncanta ĉiujn publikigitajn artikolojn. La dua enhavas la eldon-anoncojn, kaj viajn lastajn privatajn mesaĝojn : ĝi estas rezervita al vi, pere de persona ŝlosilo, kiun vi ĉiumomente povas modifi ŝanĝante vian pasvorton.', |
|
| 160 | - 'ical_methode_http' => 'Elŝuti', |
|
| 161 | - 'ical_methode_webcal' => 'Sinkroniga ĝisdatigo (webcal://)', |
|
| 162 | - 'ical_texte_js' => 'Per ununura linio de ĝavaskripto, vi povas simplege afiŝi ĉe kiu ajn retejo, kiun vi havas, la lastajn artikolojn publikigitajn ĉe tiu retejo.', |
|
| 163 | - 'ical_texte_prive' => 'Tiu ĉi strikte persona kalendaro, informas vin pri la privataj eldonoj de la retejo (personaj taskoj kaj rendevuoj, proponitaj artikoloj kaj fulm-informoj...).', |
|
| 164 | - 'ical_texte_public' => 'Per tiu ĉi kalendaro, vi povas gvati la publikan funkciadon de tiu retejo (publikigitaj fulm-informoj kaj artikoloj).', |
|
| 165 | - 'ical_texte_rss' => 'Vi povas abonŝuti la novaĵojn el tiu ĉi retejo al kiu ajn XML/RSS-legilo. Estas tiu formato, kiu ankaŭ ebligas al SPIP legi la novaĵojn publikigitajn ĉe aliaj retejoj, kiuj uzas kongruan formaton (aliaj abonligitaj retejoj).', |
|
| 166 | - 'ical_titre_js' => 'Ĝavaskripto', |
|
| 167 | - 'ical_titre_mailing' => 'Dissendlisto', |
|
| 168 | - 'ical_titre_rss' => 'Abonligoj', |
|
| 169 | - 'icone_accueil' => 'Hejmpaĝo', |
|
| 170 | - 'icone_activer_cookie' => 'Aktivigi la korespond-kuketon', |
|
| 171 | - 'icone_activite' => 'Aktiveco', |
|
| 172 | - 'icone_admin_plugin' => 'Mastrumado de kromprogramoj', |
|
| 173 | - 'icone_administration' => 'Bontenado', |
|
| 174 | - 'icone_afficher_auteurs' => 'Afiŝi la aŭtorojn', |
|
| 175 | - 'icone_afficher_visiteurs' => 'Afiŝi la vizitantojn', |
|
| 176 | - 'icone_arret_discussion' => 'Ne plu partopreni en ĉi tiu diskuto', |
|
| 177 | - 'icone_calendrier' => 'Kalendaro', |
|
| 178 | - 'icone_configuration' => 'Agordo', |
|
| 179 | - 'icone_creer_auteur' => 'Krei novan aŭtoron kaj ligi ŝlin al tiu artikolo', |
|
| 180 | - 'icone_creer_mot_cle' => 'Krei novan ŝlosilvorton kaj ligi ĝin al tiu artikolo', |
|
| 181 | - 'icone_creer_rubrique_2' => 'Krei novan rubrikon', |
|
| 182 | - 'icone_developpement' => 'Programado', |
|
| 183 | - 'icone_edition' => 'Eldono', |
|
| 184 | - 'icone_ma_langue' => 'Mia lingvo', |
|
| 185 | - 'icone_mes_infos' => 'Miaj informoj', |
|
| 186 | - 'icone_mes_preferences' => 'Miaj preferoj', |
|
| 187 | - 'icone_modifier_article' => 'Modifi tiun ĉi artikolon', |
|
| 188 | - 'icone_modifier_rubrique' => 'Modifi tiun ĉi rubrikon', |
|
| 189 | - 'icone_publication' => 'Publikigo', |
|
| 190 | - 'icone_relancer_signataire' => 'Reinstigi tiun ĉi subskribinton', |
|
| 191 | - 'icone_retour' => 'Reen', |
|
| 192 | - 'icone_retour_article' => 'Reen al la artikolo', |
|
| 193 | - 'icone_squelette' => 'Skeletoj', |
|
| 194 | - 'icone_suivi_publication' => 'Superrigardo de la publikigo', |
|
| 195 | - 'icone_supprimer_cookie' => 'Forviŝi la por-korespondan kuketon ', |
|
| 196 | - 'icone_supprimer_rubrique' => 'Forviŝi tiun rubrikon', |
|
| 197 | - 'icone_supprimer_signature' => 'Forviŝi tiun subskribon', |
|
| 198 | - 'icone_valider_signature' => 'Validigi tiun subskribon', |
|
| 199 | - 'image_administrer_rubrique' => 'Vi povas mastrumi tiun rubrikon', |
|
| 200 | - 'impossible_modifier_login_auteur' => 'Ne eblas modifi la salutnomo.', # MODIF |
|
| 201 | - 'impossible_modifier_pass_auteur' => 'Ne eblas modifi la pasvorto.', # MODIF |
|
| 202 | - 'info_1_article' => '1 artikolo', |
|
| 203 | - 'info_1_auteur' => '1 aŭtoro', |
|
| 204 | - 'info_1_message' => '1 mesaĝo', |
|
| 205 | - 'info_1_mot_cle' => '1 ŝlosilvorto', |
|
| 206 | - 'info_1_rubrique' => '1 rubriko', |
|
| 207 | - 'info_1_visiteur' => '1 vizitanto', |
|
| 208 | - 'info_activer_cookie' => 'Vi povas aktivigi <b>por-korespondan kuketon</b>. Tio ebligos al vi facile iri de la publika spaco al la privata.', |
|
| 209 | - 'info_activer_menu_developpement' => 'Montri la menuon Programado', |
|
| 210 | - 'info_admin_etre_webmestre' => 'Doni al mi la rajtoj de retejestro', |
|
| 211 | - 'info_admin_je_suis_webmestre' => 'Mi estas <b>retejestro</b>', |
|
| 212 | - 'info_admin_statuer_webmestre' => 'Doni al tiu mastrumanto la rajtoj de retejestro', |
|
| 213 | - 'info_admin_webmestre' => 'Tiu mastrumanto estas <b>retejestro</b>', |
|
| 214 | - 'info_administrateur' => 'Mastrumanto', |
|
| 215 | - 'info_administrateur_1' => 'Mastrumanto', |
|
| 216 | - 'info_administrateur_2' => 'de la retejo (<i>uzi singarde</i>)', |
|
| 217 | - 'info_administrateur_site_01' => 'Se vi estas mastrumanto de la retejo, bonvolu', |
|
| 218 | - 'info_administrateur_site_02' => 'musklaki ĉi-tiun ligilon', |
|
| 219 | - 'info_administrateurs' => 'Mastrumantoj', |
|
| 220 | - 'info_administrer_rubrique' => 'Vi povas mastrumi tiun rubrikon', |
|
| 221 | - 'info_adresse' => 'ĉe la adreso :', |
|
| 222 | - 'info_adresse_desinscription' => 'Adreso de malregistriĝo', |
|
| 223 | - 'info_adresse_url' => 'Retadreso (URL) de la publika retejo', |
|
| 224 | - 'info_afficher_par_nb' => 'Afiŝi per', |
|
| 225 | - 'info_aide_en_ligne' => 'Reta SPIP-helpilo', |
|
| 226 | - 'info_ajout_image' => 'Kiam vi ligas bildojn kiel alkroĉitajn dokumentojn al artikolo, |
|
| 156 | + // I |
|
| 157 | + 'ical_info1' => 'Tiu paĝo prezentas plurajn metodojn por daŭre ricevi informojn pri la vivo de tiu retejo.', |
|
| 158 | + 'ical_info2' => 'Por pli da informoj pri ĉi ĉiuj teknikoj, senhezite konsultu <a href="@spipnet@">la dokumentaron de SPIP</a>.', |
|
| 159 | + 'ical_info_calendrier' => 'Du kalendaroj disponeblas. La unua estas retejo-mapo anoncanta ĉiujn publikigitajn artikolojn. La dua enhavas la eldon-anoncojn, kaj viajn lastajn privatajn mesaĝojn : ĝi estas rezervita al vi, pere de persona ŝlosilo, kiun vi ĉiumomente povas modifi ŝanĝante vian pasvorton.', |
|
| 160 | + 'ical_methode_http' => 'Elŝuti', |
|
| 161 | + 'ical_methode_webcal' => 'Sinkroniga ĝisdatigo (webcal://)', |
|
| 162 | + 'ical_texte_js' => 'Per ununura linio de ĝavaskripto, vi povas simplege afiŝi ĉe kiu ajn retejo, kiun vi havas, la lastajn artikolojn publikigitajn ĉe tiu retejo.', |
|
| 163 | + 'ical_texte_prive' => 'Tiu ĉi strikte persona kalendaro, informas vin pri la privataj eldonoj de la retejo (personaj taskoj kaj rendevuoj, proponitaj artikoloj kaj fulm-informoj...).', |
|
| 164 | + 'ical_texte_public' => 'Per tiu ĉi kalendaro, vi povas gvati la publikan funkciadon de tiu retejo (publikigitaj fulm-informoj kaj artikoloj).', |
|
| 165 | + 'ical_texte_rss' => 'Vi povas abonŝuti la novaĵojn el tiu ĉi retejo al kiu ajn XML/RSS-legilo. Estas tiu formato, kiu ankaŭ ebligas al SPIP legi la novaĵojn publikigitajn ĉe aliaj retejoj, kiuj uzas kongruan formaton (aliaj abonligitaj retejoj).', |
|
| 166 | + 'ical_titre_js' => 'Ĝavaskripto', |
|
| 167 | + 'ical_titre_mailing' => 'Dissendlisto', |
|
| 168 | + 'ical_titre_rss' => 'Abonligoj', |
|
| 169 | + 'icone_accueil' => 'Hejmpaĝo', |
|
| 170 | + 'icone_activer_cookie' => 'Aktivigi la korespond-kuketon', |
|
| 171 | + 'icone_activite' => 'Aktiveco', |
|
| 172 | + 'icone_admin_plugin' => 'Mastrumado de kromprogramoj', |
|
| 173 | + 'icone_administration' => 'Bontenado', |
|
| 174 | + 'icone_afficher_auteurs' => 'Afiŝi la aŭtorojn', |
|
| 175 | + 'icone_afficher_visiteurs' => 'Afiŝi la vizitantojn', |
|
| 176 | + 'icone_arret_discussion' => 'Ne plu partopreni en ĉi tiu diskuto', |
|
| 177 | + 'icone_calendrier' => 'Kalendaro', |
|
| 178 | + 'icone_configuration' => 'Agordo', |
|
| 179 | + 'icone_creer_auteur' => 'Krei novan aŭtoron kaj ligi ŝlin al tiu artikolo', |
|
| 180 | + 'icone_creer_mot_cle' => 'Krei novan ŝlosilvorton kaj ligi ĝin al tiu artikolo', |
|
| 181 | + 'icone_creer_rubrique_2' => 'Krei novan rubrikon', |
|
| 182 | + 'icone_developpement' => 'Programado', |
|
| 183 | + 'icone_edition' => 'Eldono', |
|
| 184 | + 'icone_ma_langue' => 'Mia lingvo', |
|
| 185 | + 'icone_mes_infos' => 'Miaj informoj', |
|
| 186 | + 'icone_mes_preferences' => 'Miaj preferoj', |
|
| 187 | + 'icone_modifier_article' => 'Modifi tiun ĉi artikolon', |
|
| 188 | + 'icone_modifier_rubrique' => 'Modifi tiun ĉi rubrikon', |
|
| 189 | + 'icone_publication' => 'Publikigo', |
|
| 190 | + 'icone_relancer_signataire' => 'Reinstigi tiun ĉi subskribinton', |
|
| 191 | + 'icone_retour' => 'Reen', |
|
| 192 | + 'icone_retour_article' => 'Reen al la artikolo', |
|
| 193 | + 'icone_squelette' => 'Skeletoj', |
|
| 194 | + 'icone_suivi_publication' => 'Superrigardo de la publikigo', |
|
| 195 | + 'icone_supprimer_cookie' => 'Forviŝi la por-korespondan kuketon ', |
|
| 196 | + 'icone_supprimer_rubrique' => 'Forviŝi tiun rubrikon', |
|
| 197 | + 'icone_supprimer_signature' => 'Forviŝi tiun subskribon', |
|
| 198 | + 'icone_valider_signature' => 'Validigi tiun subskribon', |
|
| 199 | + 'image_administrer_rubrique' => 'Vi povas mastrumi tiun rubrikon', |
|
| 200 | + 'impossible_modifier_login_auteur' => 'Ne eblas modifi la salutnomo.', # MODIF |
|
| 201 | + 'impossible_modifier_pass_auteur' => 'Ne eblas modifi la pasvorto.', # MODIF |
|
| 202 | + 'info_1_article' => '1 artikolo', |
|
| 203 | + 'info_1_auteur' => '1 aŭtoro', |
|
| 204 | + 'info_1_message' => '1 mesaĝo', |
|
| 205 | + 'info_1_mot_cle' => '1 ŝlosilvorto', |
|
| 206 | + 'info_1_rubrique' => '1 rubriko', |
|
| 207 | + 'info_1_visiteur' => '1 vizitanto', |
|
| 208 | + 'info_activer_cookie' => 'Vi povas aktivigi <b>por-korespondan kuketon</b>. Tio ebligos al vi facile iri de la publika spaco al la privata.', |
|
| 209 | + 'info_activer_menu_developpement' => 'Montri la menuon Programado', |
|
| 210 | + 'info_admin_etre_webmestre' => 'Doni al mi la rajtoj de retejestro', |
|
| 211 | + 'info_admin_je_suis_webmestre' => 'Mi estas <b>retejestro</b>', |
|
| 212 | + 'info_admin_statuer_webmestre' => 'Doni al tiu mastrumanto la rajtoj de retejestro', |
|
| 213 | + 'info_admin_webmestre' => 'Tiu mastrumanto estas <b>retejestro</b>', |
|
| 214 | + 'info_administrateur' => 'Mastrumanto', |
|
| 215 | + 'info_administrateur_1' => 'Mastrumanto', |
|
| 216 | + 'info_administrateur_2' => 'de la retejo (<i>uzi singarde</i>)', |
|
| 217 | + 'info_administrateur_site_01' => 'Se vi estas mastrumanto de la retejo, bonvolu', |
|
| 218 | + 'info_administrateur_site_02' => 'musklaki ĉi-tiun ligilon', |
|
| 219 | + 'info_administrateurs' => 'Mastrumantoj', |
|
| 220 | + 'info_administrer_rubrique' => 'Vi povas mastrumi tiun rubrikon', |
|
| 221 | + 'info_adresse' => 'ĉe la adreso :', |
|
| 222 | + 'info_adresse_desinscription' => 'Adreso de malregistriĝo', |
|
| 223 | + 'info_adresse_url' => 'Retadreso (URL) de la publika retejo', |
|
| 224 | + 'info_afficher_par_nb' => 'Afiŝi per', |
|
| 225 | + 'info_aide_en_ligne' => 'Reta SPIP-helpilo', |
|
| 226 | + 'info_ajout_image' => 'Kiam vi ligas bildojn kiel alkroĉitajn dokumentojn al artikolo, |
|
| 227 | 227 | SPIP povas aŭtomate krei por vi etajn vinjetojn de la |
| 228 | 228 | enmetitaj bildoj. Tio ebligas ekzemple, aŭtomate krei bildaron, ĉu en sukcesiva, ĉu samtempa ordo.', |
| 229 | - 'info_ajouter_rubrique' => 'Aldoni alian mastrumendan rubrikon :', |
|
| 230 | - 'info_annonce_nouveautes' => 'Anonco pri novaĵoj', |
|
| 231 | - 'info_article' => 'artikolo', |
|
| 232 | - 'info_article_2' => 'artikoloj', |
|
| 233 | - 'info_article_a_paraitre' => 'Aperotaj post-datitaj artikoloj', |
|
| 234 | - 'info_articles_02' => 'artikoloj', |
|
| 235 | - 'info_articles_2' => 'Artikoloj', |
|
| 236 | - 'info_articles_auteur' => 'La artikoloj de tiu aŭtoro', |
|
| 237 | - 'info_articles_miens' => 'Miaj artikoloj', |
|
| 238 | - 'info_articles_tous' => 'Ĉiuj la artikoloj', |
|
| 239 | - 'info_articles_trouves' => 'Trovitaj artikoloj', |
|
| 240 | - 'info_attente_validation' => 'Viaj artikoloj atendantaj validigon', |
|
| 241 | - 'info_aucun_article' => 'Neniu artikolo', |
|
| 242 | - 'info_aucun_auteur' => 'Neniu aŭtoro', |
|
| 243 | - 'info_aucun_message' => 'Neniu mesaĝo', |
|
| 244 | - 'info_aucun_rubrique' => 'Neniu rubriko', |
|
| 245 | - 'info_aujourdhui' => 'hodiaŭ : ', |
|
| 246 | - 'info_auteur_gere_rubriques' => 'Tiu aŭtoro mastrumas la jenajn rubrikojn :', |
|
| 247 | - 'info_auteur_gere_toutes_rubriques' => 'Tiu aŭtoro mastrumas <b>ĉiujn rubrikojn</b>', |
|
| 248 | - 'info_auteur_gere_toutes_rubriques_2' => 'Mi mastrumas <b>ĉiujn rubrikojn</b>', |
|
| 249 | - 'info_auteurs' => 'La aŭtoroj', |
|
| 250 | - 'info_auteurs_par_tri' => 'Aŭtoroj@partri@', |
|
| 251 | - 'info_auteurs_trouves' => 'Aŭtoroj trovitaj', |
|
| 252 | - 'info_authentification_externe' => 'Ekstera aŭtentigo', |
|
| 253 | - 'info_avertissement' => 'Averto', |
|
| 254 | - 'info_barre_outils' => 'ĉu per ĝia ilobreto ?', |
|
| 255 | - 'info_base_installee' => 'La strukturo de via datenbazo estas instalita.', |
|
| 256 | - 'info_bio' => 'Biografio', |
|
| 257 | - 'info_cache_desactive' => 'La staplo estas maldaŭre malaktivigita.', |
|
| 258 | - 'info_chapeau' => 'Ĉapo', |
|
| 259 | - 'info_chapeau_2' => 'Ĉapo :', |
|
| 260 | - 'info_chemin_acces_1' => 'Opcioj : <b>Alirvojo en la LDAP-dosierujilo</b>', |
|
| 261 | - 'info_chemin_acces_2' => 'Ekde nun vi devas konfiguri la alirvojon al la LDAP-dosierujilo. Tiu informo estas nepre necesa por legi la profilojn de uzantoj stokataj en la dosierujilo.', |
|
| 262 | - 'info_chemin_acces_annuaire' => 'Opcioj : <b>Aliro en la LDAP-dosierujilo', |
|
| 263 | - 'info_choix_base' => 'Tria etapo : ', |
|
| 264 | - 'info_classement_1' => '<sup>a</sup> en @liste@', |
|
| 265 | - 'info_classement_2' => '<sup>a</sup> en @liste@', |
|
| 266 | - 'info_code_acces' => 'Ne forgesu viajn proprajn alir-kodojn !', |
|
| 267 | - 'info_config_suivi' => 'Se tiu ĉi adreso estas tiu de dissendlisto, indiku ĉi-sube la adreson ĉe kiu la partoprenantoj de la retejo povos registriĝi. Tiu adreso povas esti retligilo (ekz. la paĝo por rete registriĝi en la listo), aŭ retpoŝtadreso kun specifa temo (ekz. <tt>@adresse_suivi@?subject=registrigxi</tt>) :', |
|
| 268 | - 'info_config_suivi_explication' => 'Vi povas aboni la dissendliston de tiu ĉi retejo. Aboninta, vi ricevos per retmesaĝoj la anoncojn pri artikoloj kaj pri fulm-informoj proponitaj por publikigo.', |
|
| 269 | - 'info_confirmer_passe' => 'Konfirmi tiun novan pasvorton :', |
|
| 270 | - 'info_conflit_edition_avis_non_sauvegarde' => 'Atentu, la jenaj tajpujoj estis iel modifitaj. Sekve, viaj ŝanĝoj en tiuj ĉi tajpujoj ne estas registritaj.', |
|
| 271 | - 'info_conflit_edition_differences' => 'Malsamecoj :', |
|
| 272 | - 'info_conflit_edition_version_enregistree' => 'La registrita versio :', |
|
| 273 | - 'info_conflit_edition_votre_version' => 'Via versio :', |
|
| 274 | - 'info_connexion_base' => 'Dua etapo : <b>Konektiĝo-provo al la datenbazo</b>', |
|
| 275 | - 'info_connexion_base_donnee' => 'Konektiĝo al via datumbazo', |
|
| 276 | - 'info_connexion_ldap_ok' => '<b>La konektiĝo al LDAP sukcesis.</b><p>Vi povas iri al la sekvanta etapo</p>', |
|
| 277 | - 'info_connexion_mysql' => 'Via SQL-konektiĝo', |
|
| 278 | - 'info_connexion_ok' => 'La konektiĝo sukcesis.', |
|
| 279 | - 'info_contact' => 'Kontakt-adreso', |
|
| 280 | - 'info_contenu_articles' => 'Enhavo de la artikoloj', |
|
| 281 | - 'info_contributions' => 'Kontribuaĵoj', |
|
| 282 | - 'info_creation_paragraphe' => 'Por krei malplenajn paragrafojn, simple lasu malplenajn liniojn.', |
|
| 283 | - 'info_creation_rubrique' => 'Antaŭ ol skribi artikolojn,<br /> vi kreu almenaŭ po unu rubrikon.<br />', |
|
| 284 | - 'info_creation_tables' => 'Kreo de la datentabeloj', |
|
| 285 | - 'info_creer_base' => '<b>Krei</b> novan datenbazon :', |
|
| 286 | - 'info_dans_rubrique' => 'En la rubriko :', |
|
| 287 | - 'info_date_publication_anterieure' => 'Dato de antaŭa redakto :', |
|
| 288 | - 'info_date_referencement' => 'REFERENCIGO-DATO DE TIU RETEJO :', |
|
| 289 | - 'info_derniere_etape' => 'Finite !', |
|
| 290 | - 'info_descriptif' => 'Priskribo :', |
|
| 291 | - 'info_desinstaller_plugin' => 'forviŝas la datenojn kaj malaktivigas la kromprogramon', |
|
| 292 | - 'info_discussion_cours' => 'Nunaj diskutoj', |
|
| 293 | - 'info_ecrire_article' => 'Antaŭ ol ekhavi la eblon skribi artikolojn, vi devas krei almenaŭ unu rubrikon.', |
|
| 294 | - 'info_email_envoi' => 'retpoŝtadreso por sendo (nedeviga)', |
|
| 295 | - 'info_email_envoi_txt' => 'Indiku ĉi tie la adreson uzotan por sendi poŝtmesaĝojn (defaŭlte, la ricev-adreso estos uzata) :', |
|
| 296 | - 'info_email_webmestre' => 'Retpoŝtadreso de la retejestro', |
|
| 297 | - 'info_envoi_email_automatique' => 'Aŭtomata retleteroj-dissendado', |
|
| 298 | - 'info_envoyer_maintenant' => 'Sendu nun', |
|
| 299 | - 'info_etape_suivante' => 'Ek al posta etapo', |
|
| 300 | - 'info_etape_suivante_1' => 'Vi povas paŝi al posta etapo.', |
|
| 301 | - 'info_etape_suivante_2' => 'Vi povas paŝi al posta etapo.', |
|
| 302 | - 'info_exceptions_proxy' => 'Escepto por la prokura servilo', |
|
| 303 | - 'info_exportation_base' => 'Eksporto de la datenbazo al @archive@', |
|
| 304 | - 'info_facilite_suivi_activite' => 'Por faciligi la kontrolon de la reteja ĉefartikola aktiveco, SPIP povas transdoni per retmesaĝoj - ekzemple al dissendlisto de redaktantoj - la anoncon pri publikig-petoj kaj validig-petoj de artikoloj.', # MODIF |
|
| 305 | - 'info_fichiers_authent' => 'Aŭtentokontrolaj dosieroj « .htpasswd »', |
|
| 306 | - 'info_forums_abo_invites' => 'Via retejo enhavas forumojn alireblajn nur per abono ; vizitantoj estas invititaj al registriĝo ĉe la publika retejo.', |
|
| 307 | - 'info_gauche_admin_tech' => '<b>Nur respondeculoj de la retejo rajtas aliri tiun paĝon.</b><p>Ĝi ebligas aliron al la diversaj funkcioj pri teknika bontenado. Iuj el ili okazigas specifan aŭtentigan procezon, kiu |
|
| 229 | + 'info_ajouter_rubrique' => 'Aldoni alian mastrumendan rubrikon :', |
|
| 230 | + 'info_annonce_nouveautes' => 'Anonco pri novaĵoj', |
|
| 231 | + 'info_article' => 'artikolo', |
|
| 232 | + 'info_article_2' => 'artikoloj', |
|
| 233 | + 'info_article_a_paraitre' => 'Aperotaj post-datitaj artikoloj', |
|
| 234 | + 'info_articles_02' => 'artikoloj', |
|
| 235 | + 'info_articles_2' => 'Artikoloj', |
|
| 236 | + 'info_articles_auteur' => 'La artikoloj de tiu aŭtoro', |
|
| 237 | + 'info_articles_miens' => 'Miaj artikoloj', |
|
| 238 | + 'info_articles_tous' => 'Ĉiuj la artikoloj', |
|
| 239 | + 'info_articles_trouves' => 'Trovitaj artikoloj', |
|
| 240 | + 'info_attente_validation' => 'Viaj artikoloj atendantaj validigon', |
|
| 241 | + 'info_aucun_article' => 'Neniu artikolo', |
|
| 242 | + 'info_aucun_auteur' => 'Neniu aŭtoro', |
|
| 243 | + 'info_aucun_message' => 'Neniu mesaĝo', |
|
| 244 | + 'info_aucun_rubrique' => 'Neniu rubriko', |
|
| 245 | + 'info_aujourdhui' => 'hodiaŭ : ', |
|
| 246 | + 'info_auteur_gere_rubriques' => 'Tiu aŭtoro mastrumas la jenajn rubrikojn :', |
|
| 247 | + 'info_auteur_gere_toutes_rubriques' => 'Tiu aŭtoro mastrumas <b>ĉiujn rubrikojn</b>', |
|
| 248 | + 'info_auteur_gere_toutes_rubriques_2' => 'Mi mastrumas <b>ĉiujn rubrikojn</b>', |
|
| 249 | + 'info_auteurs' => 'La aŭtoroj', |
|
| 250 | + 'info_auteurs_par_tri' => 'Aŭtoroj@partri@', |
|
| 251 | + 'info_auteurs_trouves' => 'Aŭtoroj trovitaj', |
|
| 252 | + 'info_authentification_externe' => 'Ekstera aŭtentigo', |
|
| 253 | + 'info_avertissement' => 'Averto', |
|
| 254 | + 'info_barre_outils' => 'ĉu per ĝia ilobreto ?', |
|
| 255 | + 'info_base_installee' => 'La strukturo de via datenbazo estas instalita.', |
|
| 256 | + 'info_bio' => 'Biografio', |
|
| 257 | + 'info_cache_desactive' => 'La staplo estas maldaŭre malaktivigita.', |
|
| 258 | + 'info_chapeau' => 'Ĉapo', |
|
| 259 | + 'info_chapeau_2' => 'Ĉapo :', |
|
| 260 | + 'info_chemin_acces_1' => 'Opcioj : <b>Alirvojo en la LDAP-dosierujilo</b>', |
|
| 261 | + 'info_chemin_acces_2' => 'Ekde nun vi devas konfiguri la alirvojon al la LDAP-dosierujilo. Tiu informo estas nepre necesa por legi la profilojn de uzantoj stokataj en la dosierujilo.', |
|
| 262 | + 'info_chemin_acces_annuaire' => 'Opcioj : <b>Aliro en la LDAP-dosierujilo', |
|
| 263 | + 'info_choix_base' => 'Tria etapo : ', |
|
| 264 | + 'info_classement_1' => '<sup>a</sup> en @liste@', |
|
| 265 | + 'info_classement_2' => '<sup>a</sup> en @liste@', |
|
| 266 | + 'info_code_acces' => 'Ne forgesu viajn proprajn alir-kodojn !', |
|
| 267 | + 'info_config_suivi' => 'Se tiu ĉi adreso estas tiu de dissendlisto, indiku ĉi-sube la adreson ĉe kiu la partoprenantoj de la retejo povos registriĝi. Tiu adreso povas esti retligilo (ekz. la paĝo por rete registriĝi en la listo), aŭ retpoŝtadreso kun specifa temo (ekz. <tt>@adresse_suivi@?subject=registrigxi</tt>) :', |
|
| 268 | + 'info_config_suivi_explication' => 'Vi povas aboni la dissendliston de tiu ĉi retejo. Aboninta, vi ricevos per retmesaĝoj la anoncojn pri artikoloj kaj pri fulm-informoj proponitaj por publikigo.', |
|
| 269 | + 'info_confirmer_passe' => 'Konfirmi tiun novan pasvorton :', |
|
| 270 | + 'info_conflit_edition_avis_non_sauvegarde' => 'Atentu, la jenaj tajpujoj estis iel modifitaj. Sekve, viaj ŝanĝoj en tiuj ĉi tajpujoj ne estas registritaj.', |
|
| 271 | + 'info_conflit_edition_differences' => 'Malsamecoj :', |
|
| 272 | + 'info_conflit_edition_version_enregistree' => 'La registrita versio :', |
|
| 273 | + 'info_conflit_edition_votre_version' => 'Via versio :', |
|
| 274 | + 'info_connexion_base' => 'Dua etapo : <b>Konektiĝo-provo al la datenbazo</b>', |
|
| 275 | + 'info_connexion_base_donnee' => 'Konektiĝo al via datumbazo', |
|
| 276 | + 'info_connexion_ldap_ok' => '<b>La konektiĝo al LDAP sukcesis.</b><p>Vi povas iri al la sekvanta etapo</p>', |
|
| 277 | + 'info_connexion_mysql' => 'Via SQL-konektiĝo', |
|
| 278 | + 'info_connexion_ok' => 'La konektiĝo sukcesis.', |
|
| 279 | + 'info_contact' => 'Kontakt-adreso', |
|
| 280 | + 'info_contenu_articles' => 'Enhavo de la artikoloj', |
|
| 281 | + 'info_contributions' => 'Kontribuaĵoj', |
|
| 282 | + 'info_creation_paragraphe' => 'Por krei malplenajn paragrafojn, simple lasu malplenajn liniojn.', |
|
| 283 | + 'info_creation_rubrique' => 'Antaŭ ol skribi artikolojn,<br /> vi kreu almenaŭ po unu rubrikon.<br />', |
|
| 284 | + 'info_creation_tables' => 'Kreo de la datentabeloj', |
|
| 285 | + 'info_creer_base' => '<b>Krei</b> novan datenbazon :', |
|
| 286 | + 'info_dans_rubrique' => 'En la rubriko :', |
|
| 287 | + 'info_date_publication_anterieure' => 'Dato de antaŭa redakto :', |
|
| 288 | + 'info_date_referencement' => 'REFERENCIGO-DATO DE TIU RETEJO :', |
|
| 289 | + 'info_derniere_etape' => 'Finite !', |
|
| 290 | + 'info_descriptif' => 'Priskribo :', |
|
| 291 | + 'info_desinstaller_plugin' => 'forviŝas la datenojn kaj malaktivigas la kromprogramon', |
|
| 292 | + 'info_discussion_cours' => 'Nunaj diskutoj', |
|
| 293 | + 'info_ecrire_article' => 'Antaŭ ol ekhavi la eblon skribi artikolojn, vi devas krei almenaŭ unu rubrikon.', |
|
| 294 | + 'info_email_envoi' => 'retpoŝtadreso por sendo (nedeviga)', |
|
| 295 | + 'info_email_envoi_txt' => 'Indiku ĉi tie la adreson uzotan por sendi poŝtmesaĝojn (defaŭlte, la ricev-adreso estos uzata) :', |
|
| 296 | + 'info_email_webmestre' => 'Retpoŝtadreso de la retejestro', |
|
| 297 | + 'info_envoi_email_automatique' => 'Aŭtomata retleteroj-dissendado', |
|
| 298 | + 'info_envoyer_maintenant' => 'Sendu nun', |
|
| 299 | + 'info_etape_suivante' => 'Ek al posta etapo', |
|
| 300 | + 'info_etape_suivante_1' => 'Vi povas paŝi al posta etapo.', |
|
| 301 | + 'info_etape_suivante_2' => 'Vi povas paŝi al posta etapo.', |
|
| 302 | + 'info_exceptions_proxy' => 'Escepto por la prokura servilo', |
|
| 303 | + 'info_exportation_base' => 'Eksporto de la datenbazo al @archive@', |
|
| 304 | + 'info_facilite_suivi_activite' => 'Por faciligi la kontrolon de la reteja ĉefartikola aktiveco, SPIP povas transdoni per retmesaĝoj - ekzemple al dissendlisto de redaktantoj - la anoncon pri publikig-petoj kaj validig-petoj de artikoloj.', # MODIF |
|
| 305 | + 'info_fichiers_authent' => 'Aŭtentokontrolaj dosieroj « .htpasswd »', |
|
| 306 | + 'info_forums_abo_invites' => 'Via retejo enhavas forumojn alireblajn nur per abono ; vizitantoj estas invititaj al registriĝo ĉe la publika retejo.', |
|
| 307 | + 'info_gauche_admin_tech' => '<b>Nur respondeculoj de la retejo rajtas aliri tiun paĝon.</b><p>Ĝi ebligas aliron al la diversaj funkcioj pri teknika bontenado. Iuj el ili okazigas specifan aŭtentigan procezon, kiu |
|
| 308 | 308 | postulas disponi je FTP-alirrajto al la retejo.</p>', |
| 309 | - 'info_gauche_admin_vider' => '<b>Nur respondeculoj de la retejo rajtas aliri tiun paĝon.</b><p>Ĝi ebligas aliron al la diversaj funkcioj pri teknika bontenado. Iuj el ili okazigas specifan aŭtentigan procezon, kiu |
|
| 309 | + 'info_gauche_admin_vider' => '<b>Nur respondeculoj de la retejo rajtas aliri tiun paĝon.</b><p>Ĝi ebligas aliron al la diversaj funkcioj pri teknika bontenado. Iuj el ili okazigas specifan aŭtentigan procezon, kiu |
|
| 310 | 310 | postulas disponi je FTP-alirrajto al la retejo.</p>', |
| 311 | - 'info_gauche_auteurs' => 'Vi trovos ĉi tie ĉiujn aŭtorojn de la retejo. Ilia statuso estas indikita per koloro de sia piktogramo (mastrumanto = verda, redaktanto = flava).', |
|
| 312 | - 'info_gauche_auteurs_exterieurs' => 'La eksteraj aŭtoroj, sen alireblo al la retejo, estas indikitaj per blua piktogramo ; |
|
| 311 | + 'info_gauche_auteurs' => 'Vi trovos ĉi tie ĉiujn aŭtorojn de la retejo. Ilia statuso estas indikita per koloro de sia piktogramo (mastrumanto = verda, redaktanto = flava).', |
|
| 312 | + 'info_gauche_auteurs_exterieurs' => 'La eksteraj aŭtoroj, sen alireblo al la retejo, estas indikitaj per blua piktogramo ; |
|
| 313 | 313 | la aŭtoroj forviŝitaj per griza piktogramo.', |
| 314 | - 'info_gauche_messagerie' => 'La mesaĝilo ebligas al vi interŝanĝi mesaĝojn inter aŭtoroj, konservi memorigilojn (por via propra uzado) aŭ afiŝi anoncojn ĉe la hejmpaĝo de la privata spaco (se vi estas mastrumanto).', |
|
| 315 | - 'info_gauche_statistiques_referers' => 'Tiu paĝo prezentas la liston de la <i>referencoj</i>, tio estas retejoj enhavantaj ligilojn al via propra retejo, nur koncerne hieraŭ kaj hodiaŭ : tiu listo estas prastatigita ĉiujn 24 horojn.', |
|
| 316 | - 'info_gauche_visiteurs_enregistres' => 'Vi trovos ĉi tie la vizitantojn registritajn |
|
| 314 | + 'info_gauche_messagerie' => 'La mesaĝilo ebligas al vi interŝanĝi mesaĝojn inter aŭtoroj, konservi memorigilojn (por via propra uzado) aŭ afiŝi anoncojn ĉe la hejmpaĝo de la privata spaco (se vi estas mastrumanto).', |
|
| 315 | + 'info_gauche_statistiques_referers' => 'Tiu paĝo prezentas la liston de la <i>referencoj</i>, tio estas retejoj enhavantaj ligilojn al via propra retejo, nur koncerne hieraŭ kaj hodiaŭ : tiu listo estas prastatigita ĉiujn 24 horojn.', |
|
| 316 | + 'info_gauche_visiteurs_enregistres' => 'Vi trovos ĉi tie la vizitantojn registritajn |
|
| 317 | 317 | en la publika spaco de la retejo (forumoj laŭ abono).', |
| 318 | - 'info_generation_miniatures_images' => 'Bildoj-miniaturigo', |
|
| 319 | - 'info_gerer_trad_objets' => '@objets@ : mastrumi la traduk-ligilojn', |
|
| 320 | - 'info_hebergeur_desactiver_envoi_email' => 'Iuj retgastigantoj malaktivigas la aŭtomatan retleteroj-sendadon ekde ties serviloj. Tiukaze, la jenaj SPIP-funkcioj ne fonkcios.', |
|
| 321 | - 'info_hier' => 'hieraŭ :', |
|
| 322 | - 'info_identification_publique' => 'Via publika identeco...', |
|
| 323 | - 'info_image_process' => 'Bonvolu elekti la plej bonan metodon por fabriki vinjetojn musklakante laŭcele bildon.', |
|
| 324 | - 'info_image_process2' => 'Se neniu bildo afiŝiĝas, tio signifas ke la servilo kiu gastigas vian retejon ne estas konfigurita por uzi tiajn ilojn. Se vi deziras uzi tiujn funkciojn, petu la « GD » aŭ « Imagick » modulojn al la teknika repondeculo.', |
|
| 325 | - 'info_images_auto' => 'Bildoj aŭtomate komputitaj', |
|
| 326 | - 'info_informations_personnelles' => 'Personaj datenoj', |
|
| 327 | - 'info_inscription' => 'Registriĝado je', |
|
| 328 | - 'info_inscription_automatique' => 'Aŭtomata registriĝado de novaj redaktantoj', |
|
| 329 | - 'info_jeu_caractere' => 'Litertiparo de la retejo', |
|
| 330 | - 'info_jours' => 'tagoj', |
|
| 331 | - 'info_laisser_champs_vides' => 'lasi tiujn tajpujojn malplenaj)', |
|
| 332 | - 'info_langues' => 'Lingvoj de la retejo', |
|
| 333 | - 'info_ldap_ok' => 'La LDAP-aŭtentokontrolilo estas instalita.', |
|
| 334 | - 'info_lien_hypertexte' => 'Hiperligilo :', |
|
| 335 | - 'info_liste_nouveautes_envoyee' => 'La listo de novaĵoj estis sendita', |
|
| 336 | - 'info_liste_redacteurs_connectes' => 'Listo de la konektitaj redaktantoj', |
|
| 337 | - 'info_login_existant' => 'Tiu salutnomo jam ekzistas.', |
|
| 338 | - 'info_login_trop_court' => 'Tro mallonga salutnomo.', |
|
| 339 | - 'info_login_trop_court_car_pluriel' => 'La salutnomo devas enhavi almenaŭ @nb@ signojn.', |
|
| 340 | - 'info_logos' => 'La vinjetoj', |
|
| 341 | - 'info_maximum' => 'maksimumo :', |
|
| 342 | - 'info_meme_rubrique' => 'En la sama rubriko', |
|
| 343 | - 'info_message_en_redaction' => 'Viaj redaktataj mesaĝoj', |
|
| 344 | - 'info_message_technique' => 'Teknika mesaĝo :', |
|
| 345 | - 'info_messagerie_interne' => 'Interna mesaĝilo', |
|
| 346 | - 'info_mise_a_niveau_base' => 'alniveligo de via SQL-datenbazo', |
|
| 347 | - 'info_mise_a_niveau_base_2' => '{{Atentu !}} Vi ĵus instalis version de la SPIP-dosieroj {pli malnovan} ol tiun, kiu estis instalita antaŭe ĉe via retejo : eblas ke via datenbazo perdiĝos kaj ke via retejo ne plu funkcios.<br />{{Reinstalu la |
|
| 318 | + 'info_generation_miniatures_images' => 'Bildoj-miniaturigo', |
|
| 319 | + 'info_gerer_trad_objets' => '@objets@ : mastrumi la traduk-ligilojn', |
|
| 320 | + 'info_hebergeur_desactiver_envoi_email' => 'Iuj retgastigantoj malaktivigas la aŭtomatan retleteroj-sendadon ekde ties serviloj. Tiukaze, la jenaj SPIP-funkcioj ne fonkcios.', |
|
| 321 | + 'info_hier' => 'hieraŭ :', |
|
| 322 | + 'info_identification_publique' => 'Via publika identeco...', |
|
| 323 | + 'info_image_process' => 'Bonvolu elekti la plej bonan metodon por fabriki vinjetojn musklakante laŭcele bildon.', |
|
| 324 | + 'info_image_process2' => 'Se neniu bildo afiŝiĝas, tio signifas ke la servilo kiu gastigas vian retejon ne estas konfigurita por uzi tiajn ilojn. Se vi deziras uzi tiujn funkciojn, petu la « GD » aŭ « Imagick » modulojn al la teknika repondeculo.', |
|
| 325 | + 'info_images_auto' => 'Bildoj aŭtomate komputitaj', |
|
| 326 | + 'info_informations_personnelles' => 'Personaj datenoj', |
|
| 327 | + 'info_inscription' => 'Registriĝado je', |
|
| 328 | + 'info_inscription_automatique' => 'Aŭtomata registriĝado de novaj redaktantoj', |
|
| 329 | + 'info_jeu_caractere' => 'Litertiparo de la retejo', |
|
| 330 | + 'info_jours' => 'tagoj', |
|
| 331 | + 'info_laisser_champs_vides' => 'lasi tiujn tajpujojn malplenaj)', |
|
| 332 | + 'info_langues' => 'Lingvoj de la retejo', |
|
| 333 | + 'info_ldap_ok' => 'La LDAP-aŭtentokontrolilo estas instalita.', |
|
| 334 | + 'info_lien_hypertexte' => 'Hiperligilo :', |
|
| 335 | + 'info_liste_nouveautes_envoyee' => 'La listo de novaĵoj estis sendita', |
|
| 336 | + 'info_liste_redacteurs_connectes' => 'Listo de la konektitaj redaktantoj', |
|
| 337 | + 'info_login_existant' => 'Tiu salutnomo jam ekzistas.', |
|
| 338 | + 'info_login_trop_court' => 'Tro mallonga salutnomo.', |
|
| 339 | + 'info_login_trop_court_car_pluriel' => 'La salutnomo devas enhavi almenaŭ @nb@ signojn.', |
|
| 340 | + 'info_logos' => 'La vinjetoj', |
|
| 341 | + 'info_maximum' => 'maksimumo :', |
|
| 342 | + 'info_meme_rubrique' => 'En la sama rubriko', |
|
| 343 | + 'info_message_en_redaction' => 'Viaj redaktataj mesaĝoj', |
|
| 344 | + 'info_message_technique' => 'Teknika mesaĝo :', |
|
| 345 | + 'info_messagerie_interne' => 'Interna mesaĝilo', |
|
| 346 | + 'info_mise_a_niveau_base' => 'alniveligo de via SQL-datenbazo', |
|
| 347 | + 'info_mise_a_niveau_base_2' => '{{Atentu !}} Vi ĵus instalis version de la SPIP-dosieroj {pli malnovan} ol tiun, kiu estis instalita antaŭe ĉe via retejo : eblas ke via datenbazo perdiĝos kaj ke via retejo ne plu funkcios.<br />{{Reinstalu la |
|
| 348 | 348 | SPIP-dosierojn.}}', |
| 349 | - 'info_modification_enregistree' => 'Via modifo estis registrita', |
|
| 350 | - 'info_modifier_auteur' => 'Modifi tiun ĉi aŭtoron :', |
|
| 351 | - 'info_modifier_rubrique' => 'Modifi la rubrikon :', |
|
| 352 | - 'info_modifier_titre' => 'Modifi : @titre@', |
|
| 353 | - 'info_mon_site_spip' => 'Mia SPIP-retejo', |
|
| 354 | - 'info_moyenne' => 'meznombro :', |
|
| 355 | - 'info_multi_cet_article' => 'Lingvo de tiu ĉi artikolo :', |
|
| 356 | - 'info_multi_langues_choisies' => 'Bonvolu elekti ĉi-sube la lingvojn, kiujn vi volas disponigi al la redaktantoj de via retejo. |
|
| 349 | + 'info_modification_enregistree' => 'Via modifo estis registrita', |
|
| 350 | + 'info_modifier_auteur' => 'Modifi tiun ĉi aŭtoron :', |
|
| 351 | + 'info_modifier_rubrique' => 'Modifi la rubrikon :', |
|
| 352 | + 'info_modifier_titre' => 'Modifi : @titre@', |
|
| 353 | + 'info_mon_site_spip' => 'Mia SPIP-retejo', |
|
| 354 | + 'info_moyenne' => 'meznombro :', |
|
| 355 | + 'info_multi_cet_article' => 'Lingvo de tiu ĉi artikolo :', |
|
| 356 | + 'info_multi_langues_choisies' => 'Bonvolu elekti ĉi-sube la lingvojn, kiujn vi volas disponigi al la redaktantoj de via retejo. |
|
| 357 | 357 | Vi ne povas malaktivigi la lingvojn jam uzatajn (unue afiŝitajn) ĉe via retejo.', |
| 358 | - 'info_multi_objets' => '@objets@ : aktivigi la lingvomenuon', |
|
| 359 | - 'info_multi_secteurs' => '... ĉu nur por la rubrikoj situantaj ĉe la radiko ?', |
|
| 360 | - 'info_nb_articles' => '@nb@ artikoloj', |
|
| 361 | - 'info_nb_auteurs' => '@nb@ aŭtoroj', |
|
| 362 | - 'info_nb_messages' => '@nb@ mesaĝoj', |
|
| 363 | - 'info_nb_mots_cles' => '@nb@ ŝlosilvortoj', |
|
| 364 | - 'info_nb_rubriques' => '@nb@ rubrikoj', |
|
| 365 | - 'info_nb_visiteurs' => '@nb@ vizitantoj', |
|
| 366 | - 'info_nom' => 'Nomo', |
|
| 367 | - 'info_nom_destinataire' => 'Nomo de la adresato', |
|
| 368 | - 'info_nom_pas_conforme' => 'la HTML-markoj estas malpermesitaj', |
|
| 369 | - 'info_nom_site' => 'Nomo de via retejo', |
|
| 370 | - 'info_nombre_articles' => '@nb_articles@ artikoloj,', |
|
| 371 | - 'info_nombre_rubriques' => '@nb_rubriques@ rubrikoj,', |
|
| 372 | - 'info_nombre_sites' => '@nb_sites@ retejoj,', |
|
| 373 | - 'info_non_deplacer' => 'Ne transloki...', |
|
| 374 | - 'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP povas regule sendi anoncon pri la lastaj novaĵoj de la retejo (artikolojn kaj fulm-informojn freŝe publikigitajn).', |
|
| 375 | - 'info_non_envoi_liste_nouveautes' => 'Ne sendi la liston de la novaĵoj.', |
|
| 376 | - 'info_non_modifiable' => 'ne modifebla', |
|
| 377 | - 'info_non_suppression_mot_cle' => 'mi ne volas forviŝi tiun ŝlosilvorton.', |
|
| 378 | - 'info_notes' => 'Notoj', |
|
| 379 | - 'info_nouvel_article' => 'Nova artikolo', |
|
| 380 | - 'info_nouvelle_traduction' => 'Nova tradukaĵo :', |
|
| 381 | - 'info_numero_article' => 'ARTIKOLO NUMERO :', |
|
| 382 | - 'info_obligatoire_02' => '(deviga)', # MODIF |
|
| 383 | - 'info_option_accepter_visiteurs' => 'Permesi registriĝojn de vizitantoj el la publika spaco', |
|
| 384 | - 'info_option_ne_pas_accepter_visiteurs' => 'Rifuzi registriĝon de vizitantoj', |
|
| 385 | - 'info_options_avancees' => 'PLENDETALAJ AGORDOJ', |
|
| 386 | - 'info_ou' => 'aŭ...', |
|
| 387 | - 'info_page_interdite' => 'Malpermesata paĝo', |
|
| 388 | - 'info_par_nom' => 'laŭ nomo', |
|
| 389 | - 'info_par_nombre_article' => 'laŭ nombro de artikoloj', |
|
| 390 | - 'info_par_statut' => 'laŭ statuso', |
|
| 391 | - 'info_par_tri' => '’(laŭ @tri@)’', |
|
| 392 | - 'info_passe_trop_court' => 'Pasvorto tro mallonga.', |
|
| 393 | - 'info_passe_trop_court_car_pluriel' => 'La pasvorto devas enhavi almenaŭ @nb@ signojn.', |
|
| 394 | - 'info_passes_identiques' => 'Ambaŭ pasvortoj ne samas.', |
|
| 395 | - 'info_plus_cinq_car' => 'pli ol 5 signoj', |
|
| 396 | - 'info_plus_cinq_car_2' => '(Pli ol 5 signoj)', |
|
| 397 | - 'info_plus_trois_car' => '(Pli ol 3 signoj)', |
|
| 398 | - 'info_popularite' => 'populareco : @popularite@ ; vizitoj : @visites@', |
|
| 399 | - 'info_post_scriptum' => 'Postskribo', |
|
| 400 | - 'info_post_scriptum_2' => 'Postskribo :', |
|
| 401 | - 'info_pour' => 'por', |
|
| 402 | - 'info_preview_texte' => 'Eblas antaŭrigardi la diversajn redakteblajn elementojn, kiuj havas almenaŭ la statuson „Proponita“, kaj ankaŭ la elementojn, kiujn vi estas redaktanta. Ĉu tio eblu nur al mastrumantoj, al ĉiuj redaktantoj, aŭ al neniu ?', |
|
| 403 | - 'info_procedez_par_etape' => 'procedu etapon post etapo', |
|
| 404 | - 'info_procedure_maj_version' => 'la ĝisdatiga proceduro devas esti lanĉita por adapti |
|
| 358 | + 'info_multi_objets' => '@objets@ : aktivigi la lingvomenuon', |
|
| 359 | + 'info_multi_secteurs' => '... ĉu nur por la rubrikoj situantaj ĉe la radiko ?', |
|
| 360 | + 'info_nb_articles' => '@nb@ artikoloj', |
|
| 361 | + 'info_nb_auteurs' => '@nb@ aŭtoroj', |
|
| 362 | + 'info_nb_messages' => '@nb@ mesaĝoj', |
|
| 363 | + 'info_nb_mots_cles' => '@nb@ ŝlosilvortoj', |
|
| 364 | + 'info_nb_rubriques' => '@nb@ rubrikoj', |
|
| 365 | + 'info_nb_visiteurs' => '@nb@ vizitantoj', |
|
| 366 | + 'info_nom' => 'Nomo', |
|
| 367 | + 'info_nom_destinataire' => 'Nomo de la adresato', |
|
| 368 | + 'info_nom_pas_conforme' => 'la HTML-markoj estas malpermesitaj', |
|
| 369 | + 'info_nom_site' => 'Nomo de via retejo', |
|
| 370 | + 'info_nombre_articles' => '@nb_articles@ artikoloj,', |
|
| 371 | + 'info_nombre_rubriques' => '@nb_rubriques@ rubrikoj,', |
|
| 372 | + 'info_nombre_sites' => '@nb_sites@ retejoj,', |
|
| 373 | + 'info_non_deplacer' => 'Ne transloki...', |
|
| 374 | + 'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP povas regule sendi anoncon pri la lastaj novaĵoj de la retejo (artikolojn kaj fulm-informojn freŝe publikigitajn).', |
|
| 375 | + 'info_non_envoi_liste_nouveautes' => 'Ne sendi la liston de la novaĵoj.', |
|
| 376 | + 'info_non_modifiable' => 'ne modifebla', |
|
| 377 | + 'info_non_suppression_mot_cle' => 'mi ne volas forviŝi tiun ŝlosilvorton.', |
|
| 378 | + 'info_notes' => 'Notoj', |
|
| 379 | + 'info_nouvel_article' => 'Nova artikolo', |
|
| 380 | + 'info_nouvelle_traduction' => 'Nova tradukaĵo :', |
|
| 381 | + 'info_numero_article' => 'ARTIKOLO NUMERO :', |
|
| 382 | + 'info_obligatoire_02' => '(deviga)', # MODIF |
|
| 383 | + 'info_option_accepter_visiteurs' => 'Permesi registriĝojn de vizitantoj el la publika spaco', |
|
| 384 | + 'info_option_ne_pas_accepter_visiteurs' => 'Rifuzi registriĝon de vizitantoj', |
|
| 385 | + 'info_options_avancees' => 'PLENDETALAJ AGORDOJ', |
|
| 386 | + 'info_ou' => 'aŭ...', |
|
| 387 | + 'info_page_interdite' => 'Malpermesata paĝo', |
|
| 388 | + 'info_par_nom' => 'laŭ nomo', |
|
| 389 | + 'info_par_nombre_article' => 'laŭ nombro de artikoloj', |
|
| 390 | + 'info_par_statut' => 'laŭ statuso', |
|
| 391 | + 'info_par_tri' => '’(laŭ @tri@)’', |
|
| 392 | + 'info_passe_trop_court' => 'Pasvorto tro mallonga.', |
|
| 393 | + 'info_passe_trop_court_car_pluriel' => 'La pasvorto devas enhavi almenaŭ @nb@ signojn.', |
|
| 394 | + 'info_passes_identiques' => 'Ambaŭ pasvortoj ne samas.', |
|
| 395 | + 'info_plus_cinq_car' => 'pli ol 5 signoj', |
|
| 396 | + 'info_plus_cinq_car_2' => '(Pli ol 5 signoj)', |
|
| 397 | + 'info_plus_trois_car' => '(Pli ol 3 signoj)', |
|
| 398 | + 'info_popularite' => 'populareco : @popularite@ ; vizitoj : @visites@', |
|
| 399 | + 'info_post_scriptum' => 'Postskribo', |
|
| 400 | + 'info_post_scriptum_2' => 'Postskribo :', |
|
| 401 | + 'info_pour' => 'por', |
|
| 402 | + 'info_preview_texte' => 'Eblas antaŭrigardi la diversajn redakteblajn elementojn, kiuj havas almenaŭ la statuson „Proponita“, kaj ankaŭ la elementojn, kiujn vi estas redaktanta. Ĉu tio eblu nur al mastrumantoj, al ĉiuj redaktantoj, aŭ al neniu ?', |
|
| 403 | + 'info_procedez_par_etape' => 'procedu etapon post etapo', |
|
| 404 | + 'info_procedure_maj_version' => 'la ĝisdatiga proceduro devas esti lanĉita por adapti |
|
| 405 | 405 | la datenbazon al la nova versio de SPIP.', |
| 406 | - 'info_proxy_ok' => 'Testo de la prokurservilo sukcesa.', |
|
| 407 | - 'info_ps' => 'P.S.', |
|
| 408 | - 'info_publier' => 'publikigi', |
|
| 409 | - 'info_publies' => 'Viaj artikoloj rete publikigitaj', |
|
| 410 | - 'info_question_accepter_visiteurs' => 'Se viaj skeletoj ebligas registradon de vizitantoj, kiuj ne rajtas aliri la privatan spacon, bonvolu aktivigi la ĉi-suban opcion :', |
|
| 411 | - 'info_question_inscription_nouveaux_redacteurs' => 'Ĉu vi akceptas la registriĝadon de novaj redaktantoj ekde |
|
| 406 | + 'info_proxy_ok' => 'Testo de la prokurservilo sukcesa.', |
|
| 407 | + 'info_ps' => 'P.S.', |
|
| 408 | + 'info_publier' => 'publikigi', |
|
| 409 | + 'info_publies' => 'Viaj artikoloj rete publikigitaj', |
|
| 410 | + 'info_question_accepter_visiteurs' => 'Se viaj skeletoj ebligas registradon de vizitantoj, kiuj ne rajtas aliri la privatan spacon, bonvolu aktivigi la ĉi-suban opcion :', |
|
| 411 | + 'info_question_inscription_nouveaux_redacteurs' => 'Ĉu vi akceptas la registriĝadon de novaj redaktantoj ekde |
|
| 412 | 412 | la publika spaco ? Se vi akceptas tion, la vizitantoj povos registriĝi |
| 413 | 413 | per aŭtomata aliĝilo kaj tiam aliros al la privata spaco por |
| 414 | 414 | proponi siajn proprajn artikolojn. <div class="notice">Dum la aliĝo, |
@@ -416,407 +416,407 @@ discard block |
||
| 416 | 416 | alir-kodoj al la privata spaco. Iuj |
| 417 | 417 | retejgastigantoj malaktivigas la sendadon de retleteroj el siaj |
| 418 | 418 | serviloj : tiukaze la aŭtomata aliĝo ne eblos.</div>', |
| 419 | - 'info_qui_edite' => '@nom_auteur_modif@ laboris pri tiu ĉi enhavo antaŭ @date_diff@ minutoj', |
|
| 420 | - 'info_racine_site' => 'Radiko de la retejo', |
|
| 421 | - 'info_recharger_page' => 'Bonvolu refreŝigi tiun ĉi paĝon post momento.', |
|
| 422 | - 'info_recherche_auteur_zero' => 'Neniu rezulto por "@cherche_auteur@".', |
|
| 423 | - 'info_recommencer' => 'Bonvolu rekomenci.', |
|
| 424 | - 'info_redacteur_1' => 'Redaktanto', |
|
| 425 | - 'info_redacteur_2' => 'kun aliro al la privata spaco (<i>Estas konsilinde</i>)', |
|
| 426 | - 'info_redacteurs' => 'Redaktantoj', |
|
| 427 | - 'info_redaction_en_cours' => 'REDAKTATA', |
|
| 428 | - 'info_redirection' => 'Alidirektigo', |
|
| 429 | - 'info_redirection_activee' => 'La alidirektigo estas aktiva.', |
|
| 430 | - 'info_redirection_boucle' => 'Vi provas redirekti la artikolo al ĝi mem.', |
|
| 431 | - 'info_redirection_desactivee' => 'La alidirektigo estis forigita.', |
|
| 432 | - 'info_refuses' => 'Viaj rifuzitaj artikoloj', |
|
| 433 | - 'info_reglage_ldap' => 'Opcioj : <b>Agordo de la LDAP-elŝuto</b>', |
|
| 434 | - 'info_renvoi_article' => '<b>Alidirektigo.</b> Tiu artikolo alidirektas al la paĝo :', |
|
| 435 | - 'info_reserve_admin' => 'Nur la mastrumantoj povas modifi tiun ĉi adreson.', |
|
| 436 | - 'info_restreindre_rubrique' => 'Limigi la mastrumadon al la rubriko :', |
|
| 437 | - 'info_resultat_recherche' => 'Serĉo-rezultoj :', |
|
| 438 | - 'info_rubriques' => 'Rubrikoj', |
|
| 439 | - 'info_rubriques_02' => 'rubrikoj', |
|
| 440 | - 'info_rubriques_trouvees' => 'Trovitaj rubrikoj', |
|
| 441 | - 'info_sans_titre' => 'Sen titolo', |
|
| 442 | - 'info_selection_chemin_acces' => '<b>Selektu</b> ĉi-sube alirvojon en la dosierujilo :', |
|
| 443 | - 'info_signatures' => 'subskriboj', |
|
| 444 | - 'info_site' => 'Retejo', |
|
| 445 | - 'info_site_2' => 'retejo :', |
|
| 446 | - 'info_site_min' => 'retejo', |
|
| 447 | - 'info_site_reference_2' => 'Referencigita retejo', |
|
| 448 | - 'info_site_web' => 'Retejo :', |
|
| 449 | - 'info_sites' => 'retejoj', |
|
| 450 | - 'info_sites_lies_mot' => 'La referencigitaj retejoj ligitaj al tiu ĉi ŝlosilvorto', |
|
| 451 | - 'info_sites_proxy' => 'Uzi prokuran servilon', |
|
| 452 | - 'info_sites_trouves' => 'Retejoj trovitaj', |
|
| 453 | - 'info_sous_titre' => 'Subtitolo :', |
|
| 454 | - 'info_statut_administrateur' => 'Mastrumanto', |
|
| 455 | - 'info_statut_auteur' => 'Statuso de tiu ĉi aŭtoro :', |
|
| 456 | - 'info_statut_auteur_2' => 'Mi estas', |
|
| 457 | - 'info_statut_auteur_a_confirmer' => 'Konfirmenda registropeto', |
|
| 458 | - 'info_statut_auteur_autre' => 'Alia statuso :', |
|
| 459 | - 'info_statut_redacteur' => 'Redaktanto', |
|
| 460 | - 'info_statut_utilisateurs_1' => 'Defaŭlta statuso de la importitaj uzantoj', |
|
| 461 | - 'info_statut_utilisateurs_2' => 'Elektu la statuson atribuotan al la personoj ĉeestantaj en LDAP-dosierujilo, kiam ili unuafoje konektiĝas. Poste vi povos modifi tiun valoron por ĉiu aŭtoro laŭkaze.', |
|
| 462 | - 'info_suivi_activite' => 'Superrigardo de la redakta agado', |
|
| 463 | - 'info_surtitre' => 'Surtitolo :', |
|
| 464 | - 'info_syndication_integrale_1' => 'Via retejo proponas abondosierojn (vidu « <a href="@url@">@titre@</a> »).', |
|
| 465 | - 'info_syndication_integrale_2' => 'Ĉu vi deziras transdoni tutajn artikolojn, aŭ nur afiŝi kelkcent-literan resumon ?', |
|
| 466 | - 'info_table_prefix' => 'Vi povas modifi la prefikson de la datentabelo (tio nepras se vi deziras instali plurajn retejojn en la sama datenbazo). Tiun prefikson skribu per minusklaj literoj, sen ĉapeloj, kaj sen spaco.', |
|
| 467 | - 'info_taille_maximale_images' => 'SPIP tuj pritestos la maksimuman bildgrandecon, kiun ĝi povas pritrakti (laŭ milionrastrumeroj). <br/> La plej grandaj bildoj ne estos malgrandigitaj.', |
|
| 468 | - 'info_taille_maximale_vignette' => 'Maksimuma grandeco de la vinjetoj generataj de la sistemo :', |
|
| 469 | - 'info_terminer_installation' => 'Vi povas nun fini laŭnorman instalproceduron.', |
|
| 470 | - 'info_texte' => 'Teksto', |
|
| 471 | - 'info_texte_explicatif' => 'Klariga teksto', |
|
| 472 | - 'info_texte_long' => '(la teksto estas longa : ĝi aperas do en pluraj partoj kiuj estos rekunigitaj post validigo.)', |
|
| 473 | - 'info_texte_message' => 'Teksto de via mesaĝo', |
|
| 474 | - 'info_texte_message_02' => 'Teksto de la mesaĝo', |
|
| 475 | - 'info_titre' => 'Titolo :', |
|
| 476 | - 'info_total' => 'totalo :', |
|
| 477 | - 'info_tous_articles_en_redaction' => 'Ĉiuj artikoloj redaktataj', |
|
| 478 | - 'info_tous_articles_presents' => 'Ĉiuj artikoloj publikigitaj en tiu ĉi rubriko', |
|
| 479 | - 'info_tous_articles_refuses' => 'Ĉiuj artikoloj rifuzitaj', |
|
| 480 | - 'info_tous_les' => 'ĉiuj :', |
|
| 481 | - 'info_tout_site' => 'La tuta retejo', |
|
| 482 | - 'info_tout_site2' => 'La artikolon oni ne tradukis al tiu lingvo.', |
|
| 483 | - 'info_tout_site3' => 'La artikolo jam haveblas en tiu lingvo, sed modifoj estis poste aldonitaj al la referenca artikolo. Bonvolu ĝisdatigi la tradukaĵon.', |
|
| 484 | - 'info_tout_site4' => 'La artikolo haveblas en tiu lingvo, kaj la tradukaĵo estas ĝisdatigita.', |
|
| 485 | - 'info_tout_site5' => 'Originala artikolo.', |
|
| 486 | - 'info_tout_site6' => '<b>Atentu :</b> nur la originalaj artikoloj estas afiŝitaj. |
|
| 419 | + 'info_qui_edite' => '@nom_auteur_modif@ laboris pri tiu ĉi enhavo antaŭ @date_diff@ minutoj', |
|
| 420 | + 'info_racine_site' => 'Radiko de la retejo', |
|
| 421 | + 'info_recharger_page' => 'Bonvolu refreŝigi tiun ĉi paĝon post momento.', |
|
| 422 | + 'info_recherche_auteur_zero' => 'Neniu rezulto por "@cherche_auteur@".', |
|
| 423 | + 'info_recommencer' => 'Bonvolu rekomenci.', |
|
| 424 | + 'info_redacteur_1' => 'Redaktanto', |
|
| 425 | + 'info_redacteur_2' => 'kun aliro al la privata spaco (<i>Estas konsilinde</i>)', |
|
| 426 | + 'info_redacteurs' => 'Redaktantoj', |
|
| 427 | + 'info_redaction_en_cours' => 'REDAKTATA', |
|
| 428 | + 'info_redirection' => 'Alidirektigo', |
|
| 429 | + 'info_redirection_activee' => 'La alidirektigo estas aktiva.', |
|
| 430 | + 'info_redirection_boucle' => 'Vi provas redirekti la artikolo al ĝi mem.', |
|
| 431 | + 'info_redirection_desactivee' => 'La alidirektigo estis forigita.', |
|
| 432 | + 'info_refuses' => 'Viaj rifuzitaj artikoloj', |
|
| 433 | + 'info_reglage_ldap' => 'Opcioj : <b>Agordo de la LDAP-elŝuto</b>', |
|
| 434 | + 'info_renvoi_article' => '<b>Alidirektigo.</b> Tiu artikolo alidirektas al la paĝo :', |
|
| 435 | + 'info_reserve_admin' => 'Nur la mastrumantoj povas modifi tiun ĉi adreson.', |
|
| 436 | + 'info_restreindre_rubrique' => 'Limigi la mastrumadon al la rubriko :', |
|
| 437 | + 'info_resultat_recherche' => 'Serĉo-rezultoj :', |
|
| 438 | + 'info_rubriques' => 'Rubrikoj', |
|
| 439 | + 'info_rubriques_02' => 'rubrikoj', |
|
| 440 | + 'info_rubriques_trouvees' => 'Trovitaj rubrikoj', |
|
| 441 | + 'info_sans_titre' => 'Sen titolo', |
|
| 442 | + 'info_selection_chemin_acces' => '<b>Selektu</b> ĉi-sube alirvojon en la dosierujilo :', |
|
| 443 | + 'info_signatures' => 'subskriboj', |
|
| 444 | + 'info_site' => 'Retejo', |
|
| 445 | + 'info_site_2' => 'retejo :', |
|
| 446 | + 'info_site_min' => 'retejo', |
|
| 447 | + 'info_site_reference_2' => 'Referencigita retejo', |
|
| 448 | + 'info_site_web' => 'Retejo :', |
|
| 449 | + 'info_sites' => 'retejoj', |
|
| 450 | + 'info_sites_lies_mot' => 'La referencigitaj retejoj ligitaj al tiu ĉi ŝlosilvorto', |
|
| 451 | + 'info_sites_proxy' => 'Uzi prokuran servilon', |
|
| 452 | + 'info_sites_trouves' => 'Retejoj trovitaj', |
|
| 453 | + 'info_sous_titre' => 'Subtitolo :', |
|
| 454 | + 'info_statut_administrateur' => 'Mastrumanto', |
|
| 455 | + 'info_statut_auteur' => 'Statuso de tiu ĉi aŭtoro :', |
|
| 456 | + 'info_statut_auteur_2' => 'Mi estas', |
|
| 457 | + 'info_statut_auteur_a_confirmer' => 'Konfirmenda registropeto', |
|
| 458 | + 'info_statut_auteur_autre' => 'Alia statuso :', |
|
| 459 | + 'info_statut_redacteur' => 'Redaktanto', |
|
| 460 | + 'info_statut_utilisateurs_1' => 'Defaŭlta statuso de la importitaj uzantoj', |
|
| 461 | + 'info_statut_utilisateurs_2' => 'Elektu la statuson atribuotan al la personoj ĉeestantaj en LDAP-dosierujilo, kiam ili unuafoje konektiĝas. Poste vi povos modifi tiun valoron por ĉiu aŭtoro laŭkaze.', |
|
| 462 | + 'info_suivi_activite' => 'Superrigardo de la redakta agado', |
|
| 463 | + 'info_surtitre' => 'Surtitolo :', |
|
| 464 | + 'info_syndication_integrale_1' => 'Via retejo proponas abondosierojn (vidu « <a href="@url@">@titre@</a> »).', |
|
| 465 | + 'info_syndication_integrale_2' => 'Ĉu vi deziras transdoni tutajn artikolojn, aŭ nur afiŝi kelkcent-literan resumon ?', |
|
| 466 | + 'info_table_prefix' => 'Vi povas modifi la prefikson de la datentabelo (tio nepras se vi deziras instali plurajn retejojn en la sama datenbazo). Tiun prefikson skribu per minusklaj literoj, sen ĉapeloj, kaj sen spaco.', |
|
| 467 | + 'info_taille_maximale_images' => 'SPIP tuj pritestos la maksimuman bildgrandecon, kiun ĝi povas pritrakti (laŭ milionrastrumeroj). <br/> La plej grandaj bildoj ne estos malgrandigitaj.', |
|
| 468 | + 'info_taille_maximale_vignette' => 'Maksimuma grandeco de la vinjetoj generataj de la sistemo :', |
|
| 469 | + 'info_terminer_installation' => 'Vi povas nun fini laŭnorman instalproceduron.', |
|
| 470 | + 'info_texte' => 'Teksto', |
|
| 471 | + 'info_texte_explicatif' => 'Klariga teksto', |
|
| 472 | + 'info_texte_long' => '(la teksto estas longa : ĝi aperas do en pluraj partoj kiuj estos rekunigitaj post validigo.)', |
|
| 473 | + 'info_texte_message' => 'Teksto de via mesaĝo', |
|
| 474 | + 'info_texte_message_02' => 'Teksto de la mesaĝo', |
|
| 475 | + 'info_titre' => 'Titolo :', |
|
| 476 | + 'info_total' => 'totalo :', |
|
| 477 | + 'info_tous_articles_en_redaction' => 'Ĉiuj artikoloj redaktataj', |
|
| 478 | + 'info_tous_articles_presents' => 'Ĉiuj artikoloj publikigitaj en tiu ĉi rubriko', |
|
| 479 | + 'info_tous_articles_refuses' => 'Ĉiuj artikoloj rifuzitaj', |
|
| 480 | + 'info_tous_les' => 'ĉiuj :', |
|
| 481 | + 'info_tout_site' => 'La tuta retejo', |
|
| 482 | + 'info_tout_site2' => 'La artikolon oni ne tradukis al tiu lingvo.', |
|
| 483 | + 'info_tout_site3' => 'La artikolo jam haveblas en tiu lingvo, sed modifoj estis poste aldonitaj al la referenca artikolo. Bonvolu ĝisdatigi la tradukaĵon.', |
|
| 484 | + 'info_tout_site4' => 'La artikolo haveblas en tiu lingvo, kaj la tradukaĵo estas ĝisdatigita.', |
|
| 485 | + 'info_tout_site5' => 'Originala artikolo.', |
|
| 486 | + 'info_tout_site6' => '<b>Atentu :</b> nur la originalaj artikoloj estas afiŝitaj. |
|
| 487 | 487 | La tradukoj estas kunligitaj al la originalo, kun koloro kiu indikas ties staton :', |
| 488 | - 'info_traductions' => 'Tradukoj', |
|
| 489 | - 'info_travail_colaboratif' => 'Kunlaborado pri la artikoloj', |
|
| 490 | - 'info_un_article' => 'unu artikolo,', |
|
| 491 | - 'info_un_site' => 'retejo,', |
|
| 492 | - 'info_une_rubrique' => 'unu rubriko,', |
|
| 493 | - 'info_une_rubrique_02' => '1 rubriko', |
|
| 494 | - 'info_url' => 'URL :', |
|
| 495 | - 'info_url_proxy' => 'URL de la prokura servilo', |
|
| 496 | - 'info_url_proxy_pas_conforme' => 'la retadreso (URL) de la prokura servilo ne validas.', |
|
| 497 | - 'info_url_site_pas_conforme' => 'la retadreso (URL) de la retejo ne validas.', |
|
| 498 | - 'info_url_test_proxy' => 'URL de testo', |
|
| 499 | - 'info_urlref' => 'Hiperligilo :', |
|
| 500 | - 'info_utilisation_spip' => 'Vi povas nun ekuzi la asistatan publikigilon...', |
|
| 501 | - 'info_visites_par_mois' => 'Afiŝado laŭ monato :', |
|
| 502 | - 'info_visiteur_1' => 'Vizitanto', |
|
| 503 | - 'info_visiteur_2' => 'de la publika spaco', |
|
| 504 | - 'info_visiteurs' => 'Vizitantoj', |
|
| 505 | - 'info_visiteurs_02' => 'Vizitantoj de la publika spaco', |
|
| 506 | - 'info_webmestre_forces' => 'La retejestroj nune estas difinita en <tt>@file_options@</tt>.', |
|
| 507 | - 'install_adresse_base_hebergeur' => 'Adreso de la datenbazo atribuita de la retejgastiganto', |
|
| 508 | - 'install_connect_ok' => 'La nova bazo estis bone deklarita kiel servilonomo @connect@.', |
|
| 509 | - 'install_echec_annonce' => 'Certe la instalado estas malsukcesonta, aŭ naskos ne funkciivan retejon...', |
|
| 510 | - 'install_extension_mbstring' => 'SPIP ne funkcias per :', |
|
| 511 | - 'install_extension_php_obligatoire' => 'SPIP postulas la php-kromprogramon :', |
|
| 512 | - 'install_login_base_hebergeur' => 'Salutnomo atribuita de la retejgastiganto', |
|
| 513 | - 'install_nom_base_hebergeur' => 'Baznomo atribuita de la retejgastiganto :', |
|
| 514 | - 'install_pas_table' => 'Tiu ĉi datumbazo nune enhavas neniun tabelo', |
|
| 515 | - 'install_pass_base_hebergeur' => 'Pasvorto atribuita de la retejgastiganto', |
|
| 516 | - 'install_php_version' => 'PHP-versio @version@ eksnuna (minimuma = @minimum@)', |
|
| 517 | - 'install_select_langue' => 'Elektu lingvon kaj poste musklaku la butonon « sekvanta » por lanĉi la instal-proceduron.', |
|
| 518 | - 'install_select_type_db' => 'Indiku la datumbazan tipon :', |
|
| 519 | - 'install_select_type_mysql' => 'MySQL', |
|
| 520 | - 'install_select_type_pg' => 'PostgreSQL', |
|
| 521 | - 'install_select_type_sqlite2' => 'SQLite 2', |
|
| 522 | - 'install_select_type_sqlite3' => 'SQLite 3', |
|
| 523 | - 'install_serveur_hebergeur' => 'Servilo de datumbazo atribuita de la retgastiganto', |
|
| 524 | - 'install_table_prefix_hebergeur' => 'Prefikso de la tabelo atribuita de la retejgastiganto :', |
|
| 525 | - 'install_tables_base' => 'Tabeloj de la datumbazo', |
|
| 526 | - 'install_types_db_connus' => 'SPIP scipovas uzi <b>MySQL</b> (la plej kutime uzatan) kaj <b>SQLite</b>.', |
|
| 527 | - 'install_types_db_connus_avertissement' => 'La uzado de <b>PostgreSQL</b> estas ankaŭ proponita kiel eksperimenta', |
|
| 528 | - 'instituer_erreur_statut_a_change' => 'La statuso jam estis modifita', |
|
| 529 | - 'instituer_erreur_statut_non_autorise' => 'Vi ne povas elekti tiun statuson', |
|
| 530 | - 'intem_redacteur' => 'redaktanto', |
|
| 531 | - 'intitule_licence' => 'Licenco', |
|
| 532 | - 'item_accepter_inscriptions' => 'Akcepti la registropetojn', |
|
| 533 | - 'item_activer_messages_avertissement' => 'Aktivigi la averto-mesaĝojn', |
|
| 534 | - 'item_administrateur_2' => 'mastrumanto', |
|
| 535 | - 'item_afficher_calendrier' => 'Afiŝi en la kalendaro', |
|
| 536 | - 'item_autoriser_syndication_integrale' => 'Disponigi la tuton de la artikoloj en la abondosieroj', |
|
| 537 | - 'item_choix_administrateurs' => 'la mastrumantoj', |
|
| 538 | - 'item_choix_generation_miniature' => 'Aŭtomatigi miniaturigadon de la bildoj.', |
|
| 539 | - 'item_choix_non_generation_miniature' => 'Ne generi bildajn miniaturojn.', |
|
| 540 | - 'item_choix_redacteurs' => 'la redaktantoj', |
|
| 541 | - 'item_choix_visiteurs' => 'la vizitantoj de la publika spaco', |
|
| 542 | - 'item_creer_fichiers_authent' => 'Krei la dosierojn .htpasswd', |
|
| 543 | - 'item_login' => 'Salutnomo', |
|
| 544 | - 'item_messagerie_agenda' => 'Aktivigi la mesaĝilon kaj la agendon', |
|
| 545 | - 'item_mots_cles_association_articles' => 'al artikoloj', |
|
| 546 | - 'item_mots_cles_association_rubriques' => 'al rubrikoj', |
|
| 547 | - 'item_mots_cles_association_sites' => 'al referencigitaj aŭ abonligitaj retejoj.', |
|
| 548 | - 'item_non' => 'Ne', |
|
| 549 | - 'item_non_accepter_inscriptions' => 'Ne akcepti la registropetojn', |
|
| 550 | - 'item_non_activer_messages_avertissement' => 'Neniuj averto-mesaĝoj', |
|
| 551 | - 'item_non_afficher_calendrier' => 'Ne afiŝi en la kalendaro', |
|
| 552 | - 'item_non_autoriser_syndication_integrale' => 'Nur disponigi po unu resumo', |
|
| 553 | - 'item_non_creer_fichiers_authent' => 'Ne krei tiujn ĉi dosierojn', |
|
| 554 | - 'item_non_messagerie_agenda' => 'Malaktivigi la mesaĝilon kaj la agendon', |
|
| 555 | - 'item_non_publier_articles' => 'Ne publikigi la artikolojn antaŭ la fiksita publikig-dato.', |
|
| 556 | - 'item_nouvel_auteur' => 'Nova aŭtoro', |
|
| 557 | - 'item_nouvelle_rubrique' => 'Nova rubriko', |
|
| 558 | - 'item_oui' => 'Jes', |
|
| 559 | - 'item_publier_articles' => 'Publikigi la artikolojn, kiu ajn estas ties publikig-dato.', |
|
| 560 | - 'item_reponse_article' => 'Respondo al la artikolo', |
|
| 561 | - 'item_visiteur' => 'vizitanto', |
|
| 488 | + 'info_traductions' => 'Tradukoj', |
|
| 489 | + 'info_travail_colaboratif' => 'Kunlaborado pri la artikoloj', |
|
| 490 | + 'info_un_article' => 'unu artikolo,', |
|
| 491 | + 'info_un_site' => 'retejo,', |
|
| 492 | + 'info_une_rubrique' => 'unu rubriko,', |
|
| 493 | + 'info_une_rubrique_02' => '1 rubriko', |
|
| 494 | + 'info_url' => 'URL :', |
|
| 495 | + 'info_url_proxy' => 'URL de la prokura servilo', |
|
| 496 | + 'info_url_proxy_pas_conforme' => 'la retadreso (URL) de la prokura servilo ne validas.', |
|
| 497 | + 'info_url_site_pas_conforme' => 'la retadreso (URL) de la retejo ne validas.', |
|
| 498 | + 'info_url_test_proxy' => 'URL de testo', |
|
| 499 | + 'info_urlref' => 'Hiperligilo :', |
|
| 500 | + 'info_utilisation_spip' => 'Vi povas nun ekuzi la asistatan publikigilon...', |
|
| 501 | + 'info_visites_par_mois' => 'Afiŝado laŭ monato :', |
|
| 502 | + 'info_visiteur_1' => 'Vizitanto', |
|
| 503 | + 'info_visiteur_2' => 'de la publika spaco', |
|
| 504 | + 'info_visiteurs' => 'Vizitantoj', |
|
| 505 | + 'info_visiteurs_02' => 'Vizitantoj de la publika spaco', |
|
| 506 | + 'info_webmestre_forces' => 'La retejestroj nune estas difinita en <tt>@file_options@</tt>.', |
|
| 507 | + 'install_adresse_base_hebergeur' => 'Adreso de la datenbazo atribuita de la retejgastiganto', |
|
| 508 | + 'install_connect_ok' => 'La nova bazo estis bone deklarita kiel servilonomo @connect@.', |
|
| 509 | + 'install_echec_annonce' => 'Certe la instalado estas malsukcesonta, aŭ naskos ne funkciivan retejon...', |
|
| 510 | + 'install_extension_mbstring' => 'SPIP ne funkcias per :', |
|
| 511 | + 'install_extension_php_obligatoire' => 'SPIP postulas la php-kromprogramon :', |
|
| 512 | + 'install_login_base_hebergeur' => 'Salutnomo atribuita de la retejgastiganto', |
|
| 513 | + 'install_nom_base_hebergeur' => 'Baznomo atribuita de la retejgastiganto :', |
|
| 514 | + 'install_pas_table' => 'Tiu ĉi datumbazo nune enhavas neniun tabelo', |
|
| 515 | + 'install_pass_base_hebergeur' => 'Pasvorto atribuita de la retejgastiganto', |
|
| 516 | + 'install_php_version' => 'PHP-versio @version@ eksnuna (minimuma = @minimum@)', |
|
| 517 | + 'install_select_langue' => 'Elektu lingvon kaj poste musklaku la butonon « sekvanta » por lanĉi la instal-proceduron.', |
|
| 518 | + 'install_select_type_db' => 'Indiku la datumbazan tipon :', |
|
| 519 | + 'install_select_type_mysql' => 'MySQL', |
|
| 520 | + 'install_select_type_pg' => 'PostgreSQL', |
|
| 521 | + 'install_select_type_sqlite2' => 'SQLite 2', |
|
| 522 | + 'install_select_type_sqlite3' => 'SQLite 3', |
|
| 523 | + 'install_serveur_hebergeur' => 'Servilo de datumbazo atribuita de la retgastiganto', |
|
| 524 | + 'install_table_prefix_hebergeur' => 'Prefikso de la tabelo atribuita de la retejgastiganto :', |
|
| 525 | + 'install_tables_base' => 'Tabeloj de la datumbazo', |
|
| 526 | + 'install_types_db_connus' => 'SPIP scipovas uzi <b>MySQL</b> (la plej kutime uzatan) kaj <b>SQLite</b>.', |
|
| 527 | + 'install_types_db_connus_avertissement' => 'La uzado de <b>PostgreSQL</b> estas ankaŭ proponita kiel eksperimenta', |
|
| 528 | + 'instituer_erreur_statut_a_change' => 'La statuso jam estis modifita', |
|
| 529 | + 'instituer_erreur_statut_non_autorise' => 'Vi ne povas elekti tiun statuson', |
|
| 530 | + 'intem_redacteur' => 'redaktanto', |
|
| 531 | + 'intitule_licence' => 'Licenco', |
|
| 532 | + 'item_accepter_inscriptions' => 'Akcepti la registropetojn', |
|
| 533 | + 'item_activer_messages_avertissement' => 'Aktivigi la averto-mesaĝojn', |
|
| 534 | + 'item_administrateur_2' => 'mastrumanto', |
|
| 535 | + 'item_afficher_calendrier' => 'Afiŝi en la kalendaro', |
|
| 536 | + 'item_autoriser_syndication_integrale' => 'Disponigi la tuton de la artikoloj en la abondosieroj', |
|
| 537 | + 'item_choix_administrateurs' => 'la mastrumantoj', |
|
| 538 | + 'item_choix_generation_miniature' => 'Aŭtomatigi miniaturigadon de la bildoj.', |
|
| 539 | + 'item_choix_non_generation_miniature' => 'Ne generi bildajn miniaturojn.', |
|
| 540 | + 'item_choix_redacteurs' => 'la redaktantoj', |
|
| 541 | + 'item_choix_visiteurs' => 'la vizitantoj de la publika spaco', |
|
| 542 | + 'item_creer_fichiers_authent' => 'Krei la dosierojn .htpasswd', |
|
| 543 | + 'item_login' => 'Salutnomo', |
|
| 544 | + 'item_messagerie_agenda' => 'Aktivigi la mesaĝilon kaj la agendon', |
|
| 545 | + 'item_mots_cles_association_articles' => 'al artikoloj', |
|
| 546 | + 'item_mots_cles_association_rubriques' => 'al rubrikoj', |
|
| 547 | + 'item_mots_cles_association_sites' => 'al referencigitaj aŭ abonligitaj retejoj.', |
|
| 548 | + 'item_non' => 'Ne', |
|
| 549 | + 'item_non_accepter_inscriptions' => 'Ne akcepti la registropetojn', |
|
| 550 | + 'item_non_activer_messages_avertissement' => 'Neniuj averto-mesaĝoj', |
|
| 551 | + 'item_non_afficher_calendrier' => 'Ne afiŝi en la kalendaro', |
|
| 552 | + 'item_non_autoriser_syndication_integrale' => 'Nur disponigi po unu resumo', |
|
| 553 | + 'item_non_creer_fichiers_authent' => 'Ne krei tiujn ĉi dosierojn', |
|
| 554 | + 'item_non_messagerie_agenda' => 'Malaktivigi la mesaĝilon kaj la agendon', |
|
| 555 | + 'item_non_publier_articles' => 'Ne publikigi la artikolojn antaŭ la fiksita publikig-dato.', |
|
| 556 | + 'item_nouvel_auteur' => 'Nova aŭtoro', |
|
| 557 | + 'item_nouvelle_rubrique' => 'Nova rubriko', |
|
| 558 | + 'item_oui' => 'Jes', |
|
| 559 | + 'item_publier_articles' => 'Publikigi la artikolojn, kiu ajn estas ties publikig-dato.', |
|
| 560 | + 'item_reponse_article' => 'Respondo al la artikolo', |
|
| 561 | + 'item_visiteur' => 'vizitanto', |
|
| 562 | 562 | |
| 563 | - // J |
|
| 564 | - 'jour_non_connu_nc' => 'ne konata', |
|
| 563 | + // J |
|
| 564 | + 'jour_non_connu_nc' => 'ne konata', |
|
| 565 | 565 | |
| 566 | - // L |
|
| 567 | - 'label_bando_outils' => 'Ilobreto', |
|
| 568 | - 'label_bando_outils_afficher' => 'Afiŝi la ilojn', |
|
| 569 | - 'label_bando_outils_masquer' => 'Kaŝi la ilojn', |
|
| 570 | - 'label_choix_langue' => 'Elektu vian lingvon', |
|
| 571 | - 'label_nom_fichier_connect' => 'Indiku la nomon uzita por tiu servilo', |
|
| 572 | - 'label_slogan_site' => 'Devizo de la retejo', |
|
| 573 | - 'label_taille_ecran' => 'Larĝo de la ekrano', |
|
| 574 | - 'label_texte_et_icones_navigation' => 'Naviga menuo', |
|
| 575 | - 'label_texte_et_icones_page' => 'Afiŝado en paĝo', |
|
| 576 | - 'ldap_correspondance' => 'heredado de la kampo @champ@', |
|
| 577 | - 'ldap_correspondance_1' => 'Heredadoj de LDAP-kampoj', |
|
| 578 | - 'ldap_correspondance_2' => 'Por ĉiuj jenaj SPIP-kampoj, indiki la nomo de la rilata LDAP-kampo. Lasi malplenan por ne plenigis ĝin, apartigi per spacoj aŭ komoj por provi plurajn LDAP-kampoj.', |
|
| 579 | - 'lien_ajouter_auteur' => 'Aldoni tiun aŭtoron', |
|
| 580 | - 'lien_ajouter_une_rubrique' => 'Aldoni tiu rubriko', |
|
| 581 | - 'lien_email' => 'retpoŝtadreso', |
|
| 582 | - 'lien_nom_site' => 'NOMO DE LA RETEJO :', |
|
| 583 | - 'lien_rapide_contenu' => 'Iri al la enhavo', |
|
| 584 | - 'lien_rapide_navigation' => 'Iri al la navigado', |
|
| 585 | - 'lien_rapide_recherche' => 'Iri al la serĉo', |
|
| 586 | - 'lien_retirer_auteur' => 'Forviŝi la aŭtoron', |
|
| 587 | - 'lien_retirer_rubrique' => 'Forviŝi la rubrikon', |
|
| 588 | - 'lien_retirer_tous_auteurs' => 'Forviŝi ĉiujn aŭtorojn', |
|
| 589 | - 'lien_retirer_toutes_rubriques' => 'Forviŝi ĉiujn rubrikojn', |
|
| 590 | - 'lien_site' => 'retejo', |
|
| 591 | - 'lien_tout_decocher' => 'Ĉion malmarki', |
|
| 592 | - 'lien_tout_deplier' => 'Malfaldi ĉion', |
|
| 593 | - 'lien_tout_replier' => 'Refaldi ĉion', |
|
| 594 | - 'lien_tout_supprimer' => 'Ĉion forviŝi', |
|
| 595 | - 'lien_trier_nom' => 'Vicigi laŭ nomo', |
|
| 596 | - 'lien_trier_nombre_articles' => 'Vicigi laŭ nombro de artikoloj', |
|
| 597 | - 'lien_trier_statut' => 'Vicigi laŭ statuso', |
|
| 598 | - 'lien_voir_en_ligne' => 'VIDI ĈERETIGITE :', |
|
| 599 | - 'logo_article' => 'Vinjeto de la artikolo', |
|
| 600 | - 'logo_auteur' => 'Vinjeto de la aŭtoro', |
|
| 601 | - 'logo_rubrique' => 'Vinjeto de la rubriko', |
|
| 602 | - 'logo_site' => 'Vinjeto de la retejo |
|
| 566 | + // L |
|
| 567 | + 'label_bando_outils' => 'Ilobreto', |
|
| 568 | + 'label_bando_outils_afficher' => 'Afiŝi la ilojn', |
|
| 569 | + 'label_bando_outils_masquer' => 'Kaŝi la ilojn', |
|
| 570 | + 'label_choix_langue' => 'Elektu vian lingvon', |
|
| 571 | + 'label_nom_fichier_connect' => 'Indiku la nomon uzita por tiu servilo', |
|
| 572 | + 'label_slogan_site' => 'Devizo de la retejo', |
|
| 573 | + 'label_taille_ecran' => 'Larĝo de la ekrano', |
|
| 574 | + 'label_texte_et_icones_navigation' => 'Naviga menuo', |
|
| 575 | + 'label_texte_et_icones_page' => 'Afiŝado en paĝo', |
|
| 576 | + 'ldap_correspondance' => 'heredado de la kampo @champ@', |
|
| 577 | + 'ldap_correspondance_1' => 'Heredadoj de LDAP-kampoj', |
|
| 578 | + 'ldap_correspondance_2' => 'Por ĉiuj jenaj SPIP-kampoj, indiki la nomo de la rilata LDAP-kampo. Lasi malplenan por ne plenigis ĝin, apartigi per spacoj aŭ komoj por provi plurajn LDAP-kampoj.', |
|
| 579 | + 'lien_ajouter_auteur' => 'Aldoni tiun aŭtoron', |
|
| 580 | + 'lien_ajouter_une_rubrique' => 'Aldoni tiu rubriko', |
|
| 581 | + 'lien_email' => 'retpoŝtadreso', |
|
| 582 | + 'lien_nom_site' => 'NOMO DE LA RETEJO :', |
|
| 583 | + 'lien_rapide_contenu' => 'Iri al la enhavo', |
|
| 584 | + 'lien_rapide_navigation' => 'Iri al la navigado', |
|
| 585 | + 'lien_rapide_recherche' => 'Iri al la serĉo', |
|
| 586 | + 'lien_retirer_auteur' => 'Forviŝi la aŭtoron', |
|
| 587 | + 'lien_retirer_rubrique' => 'Forviŝi la rubrikon', |
|
| 588 | + 'lien_retirer_tous_auteurs' => 'Forviŝi ĉiujn aŭtorojn', |
|
| 589 | + 'lien_retirer_toutes_rubriques' => 'Forviŝi ĉiujn rubrikojn', |
|
| 590 | + 'lien_site' => 'retejo', |
|
| 591 | + 'lien_tout_decocher' => 'Ĉion malmarki', |
|
| 592 | + 'lien_tout_deplier' => 'Malfaldi ĉion', |
|
| 593 | + 'lien_tout_replier' => 'Refaldi ĉion', |
|
| 594 | + 'lien_tout_supprimer' => 'Ĉion forviŝi', |
|
| 595 | + 'lien_trier_nom' => 'Vicigi laŭ nomo', |
|
| 596 | + 'lien_trier_nombre_articles' => 'Vicigi laŭ nombro de artikoloj', |
|
| 597 | + 'lien_trier_statut' => 'Vicigi laŭ statuso', |
|
| 598 | + 'lien_voir_en_ligne' => 'VIDI ĈERETIGITE :', |
|
| 599 | + 'logo_article' => 'Vinjeto de la artikolo', |
|
| 600 | + 'logo_auteur' => 'Vinjeto de la aŭtoro', |
|
| 601 | + 'logo_rubrique' => 'Vinjeto de la rubriko', |
|
| 602 | + 'logo_site' => 'Vinjeto de la retejo |
|
| 603 | 603 | ', |
| 604 | - 'logo_standard_rubrique' => 'Laŭnorma vinjeto de rubrikoj', |
|
| 605 | - 'logo_survol' => 'Vinjeto por flugrigardo', |
|
| 604 | + 'logo_standard_rubrique' => 'Laŭnorma vinjeto de rubrikoj', |
|
| 605 | + 'logo_survol' => 'Vinjeto por flugrigardo', |
|
| 606 | 606 | |
| 607 | - // M |
|
| 608 | - 'menu_aide_installation_choix_base' => 'Elekto de via datenbazo', |
|
| 609 | - 'module_fichier_langue' => 'Lingva dosiero', |
|
| 610 | - 'module_raccourci' => 'Rapid-alirilo', |
|
| 611 | - 'module_texte_affiche' => 'Afiŝita teksto', |
|
| 612 | - 'module_texte_explicatif' => 'Vi povas inkludi la jenajn rapid-klakeblojn en la skeletojn de via publika retejo. Ili estos aŭtomate tradukitaj en la diversajn lingvojn, kiuj havas specifan lingvan dosieron.', |
|
| 613 | - 'module_texte_traduction' => 'La lingva dosiero « @module@ » disponeblas en :', |
|
| 614 | - 'mois_non_connu' => 'nekonata', |
|
| 607 | + // M |
|
| 608 | + 'menu_aide_installation_choix_base' => 'Elekto de via datenbazo', |
|
| 609 | + 'module_fichier_langue' => 'Lingva dosiero', |
|
| 610 | + 'module_raccourci' => 'Rapid-alirilo', |
|
| 611 | + 'module_texte_affiche' => 'Afiŝita teksto', |
|
| 612 | + 'module_texte_explicatif' => 'Vi povas inkludi la jenajn rapid-klakeblojn en la skeletojn de via publika retejo. Ili estos aŭtomate tradukitaj en la diversajn lingvojn, kiuj havas specifan lingvan dosieron.', |
|
| 613 | + 'module_texte_traduction' => 'La lingva dosiero « @module@ » disponeblas en :', |
|
| 614 | + 'mois_non_connu' => 'nekonata', |
|
| 615 | 615 | |
| 616 | - // N |
|
| 617 | - 'nouvelle_version_spip' => 'La SPIP-ĝisdatigo @version@ estas disponebla', |
|
| 618 | - 'nouvelle_version_spip_majeure' => 'Nova SPIP-versio @version@ disponeblas', |
|
| 616 | + // N |
|
| 617 | + 'nouvelle_version_spip' => 'La SPIP-ĝisdatigo @version@ estas disponebla', |
|
| 618 | + 'nouvelle_version_spip_majeure' => 'Nova SPIP-versio @version@ disponeblas', |
|
| 619 | 619 | |
| 620 | - // O |
|
| 621 | - 'onglet_contenu' => 'Enhavo', |
|
| 622 | - 'onglet_declarer_une_autre_base' => 'Deklari alian datumbazon', |
|
| 623 | - 'onglet_discuter' => 'Diskuti', |
|
| 624 | - 'onglet_interactivite' => 'Interago', |
|
| 625 | - 'onglet_proprietes' => 'Trajtoj', |
|
| 626 | - 'onglet_repartition_actuelle' => 'nun', |
|
| 627 | - 'onglet_sous_rubriques' => 'Subrubrikoj', |
|
| 620 | + // O |
|
| 621 | + 'onglet_contenu' => 'Enhavo', |
|
| 622 | + 'onglet_declarer_une_autre_base' => 'Deklari alian datumbazon', |
|
| 623 | + 'onglet_discuter' => 'Diskuti', |
|
| 624 | + 'onglet_interactivite' => 'Interago', |
|
| 625 | + 'onglet_proprietes' => 'Trajtoj', |
|
| 626 | + 'onglet_repartition_actuelle' => 'nun', |
|
| 627 | + 'onglet_sous_rubriques' => 'Subrubrikoj', |
|
| 628 | 628 | |
| 629 | - // P |
|
| 630 | - 'page_pas_proxy' => 'Tiu ĉi paĝo ne ŝutiĝu tra la prokura servilo', |
|
| 631 | - 'pas_de_proxy_pour' => 'Laŭbezone, indiku komputilojn aŭ domajnojn por kiuj tiu prokurservilo ne devas aplikiĝi (ekzemple : @exemple@)', |
|
| 632 | - 'phpinfo' => 'PHP-agordo', |
|
| 633 | - 'plugin_charge_paquet' => 'Ŝargado de la pakaĵo @name@', |
|
| 634 | - 'plugin_charger' => 'Elŝuti', |
|
| 635 | - 'plugin_erreur_charger' => 'eraro : ne eblas ŝargi @zip@', |
|
| 636 | - 'plugin_erreur_droit1' => 'La dosierujo <code>@dest@</code> ne estas skribe alirebla.', |
|
| 637 | - 'plugin_erreur_droit2' => 'Bonvolu kontroli la rajtojn pri tiu ĉi dosierujo (kaj krei ĝin laŭkaze), aŭ instali la dosierojn per FTP.', |
|
| 638 | - 'plugin_erreur_zip' => 'malsukceso pclzip : eraro @status@', |
|
| 639 | - 'plugin_etat_developpement' => 'disvolvata', |
|
| 640 | - 'plugin_etat_experimental' => 'eksperimenta', |
|
| 641 | - 'plugin_etat_stable' => 'stabila', |
|
| 642 | - 'plugin_etat_test' => 'testata', |
|
| 643 | - 'plugin_impossible_activer' => 'Ne eblas aktivigi la kromprogramon @plugin@', |
|
| 644 | - 'plugin_info_automatique1' => 'Se vi deziras permesi la aŭtomatan instaladon de kromprogramoj, bonvolu :', |
|
| 645 | - 'plugin_info_automatique1_lib' => 'Se vi deziras permesi aŭtomata instalado de tiu biblioteko, bonvolu :', |
|
| 646 | - 'plugin_info_automatique2' => 'krei dosierujon <code>@rep@</code> ;', |
|
| 647 | - 'plugin_info_automatique3' => 'kontroli ke estas permesate al la servilo skribi en tiu ĉi dosierujo.', |
|
| 648 | - 'plugin_info_automatique_creer' => 'kreenda ĉe la reteja radiko.', |
|
| 649 | - 'plugin_info_automatique_exemples' => 'ekzemploj :', |
|
| 650 | - 'plugin_info_automatique_ftp' => 'Vi povas instali kromprogramojn, per FTP, en la dosierujon <tt>@rep@</tt>', |
|
| 651 | - 'plugin_info_automatique_lib' => 'Iuj kromprogramoj postulas ankaŭ la eblon elŝuti dosierojn en la dosierujon <code>lib/</code>. Tiu dosierujo estas laŭkaze kreenda ĉe la reteja radiko.', |
|
| 652 | - 'plugin_info_automatique_liste' => 'Viaj listoj de kromprogramoj :', |
|
| 653 | - 'plugin_info_automatique_liste_officielle' => 'la oficialaj kromprogramoj', |
|
| 654 | - 'plugin_info_automatique_liste_update' => 'Ĝisdatigi la listojn', |
|
| 655 | - 'plugin_info_automatique_ou' => 'aŭ...', |
|
| 656 | - 'plugin_info_automatique_select' => 'Elektu ĉi-sube kromprogramon : SPIP elŝutos ĝin kaj instalos ĝin en la dosierujo <code>@rep@</code> ; se tiu ĉi kromprogramo jam ekzistas, ĝi estos ĝisdatigita.', |
|
| 657 | - 'plugin_info_credit' => 'Kreditoj', |
|
| 658 | - 'plugin_info_erreur_xml' => 'Deklaro de tiu kromprogramo ne ĝustas', |
|
| 659 | - 'plugin_info_install_ok' => 'Sukcesa instalado', |
|
| 660 | - 'plugin_info_necessite' => 'Necesas :', |
|
| 661 | - 'plugin_info_non_compatible_spip' => 'Tiu ĉi kromprogramo ne estas kongrua kun tiu SPIP-versio', |
|
| 662 | - 'plugin_info_plugins_dist_1' => 'Kromprogramoj ĉi-sube estas ŝarĝitaj kaj aktivigitaj en la dosierujo @plugins_dist@.', |
|
| 663 | - 'plugin_info_plugins_dist_2' => 'Ili ne malaktivigas.', |
|
| 664 | - 'plugin_info_telecharger' => 'elŝutota de @url@ kaj instalota en @rep@', |
|
| 665 | - 'plugin_info_upgrade_ok' => 'Sukcesa ĝisdatigo', |
|
| 666 | - 'plugin_librairies_installees' => 'Instalitaj bibliotekoj', |
|
| 667 | - 'plugin_necessite_extension_php' => 'Postulas la PHP-kromprogramon @plugin@ laŭ versio @version@.', |
|
| 668 | - 'plugin_necessite_extension_php_sans_version' => 'Postulas la PHP-kromprogramon @plugin@', |
|
| 669 | - 'plugin_necessite_lib' => 'Tiu ĉi kromprogramo bezonas la bibliotekon @lib@', |
|
| 670 | - 'plugin_necessite_php' => 'Postulas @plugin@ laŭ versio @version@.', |
|
| 671 | - 'plugin_necessite_plugin' => 'Postulas la kromprogramon @plugin@ laŭ versio @version@.', |
|
| 672 | - 'plugin_necessite_plugin_sans_version' => 'Necesas la kromprogramon @plugin@', |
|
| 673 | - 'plugin_necessite_spip' => 'Necesas SPIP laŭ minimume versio @version@.', |
|
| 674 | - 'plugin_source' => 'fonto : ', |
|
| 675 | - 'plugin_titre_automatique' => 'Aŭtomata instalo', |
|
| 676 | - 'plugin_titre_automatique_ajouter' => 'Aldoni kromprogramojn', |
|
| 677 | - 'plugin_titre_installation' => 'Instalado de la kromprogramo @plugin@', |
|
| 678 | - 'plugin_titre_modifier' => 'Miaj kromprogramoj', |
|
| 679 | - 'plugin_utilise_extension_php' => 'Uzas la PHP-kromprogramon @plugin@ laŭ versio @version@.', # MODIF |
|
| 680 | - 'plugin_utilise_php' => 'Uzas @plugin@ laŭ versio @version@.', # MODIF |
|
| 681 | - 'plugin_utilise_plugin' => 'Uzas la kromprogramon @plugin@ de versio @version@.', # MODIF |
|
| 682 | - 'plugin_zip_active' => 'Daŭrigu por ĝin aktivigi', |
|
| 683 | - 'plugin_zip_adresse' => 'indiku ĉi-sube la retadreson de la maldensa dosiero de elŝutenda kromprogramo, aŭ la retadreson de kromprogramolisto.', |
|
| 684 | - 'plugin_zip_adresse_champ' => 'Retadreso de la kromprogramo aŭ de la listo ', |
|
| 685 | - 'plugin_zip_content' => 'Ĝi enhavas la jenajn dosierojn (@taille@), |
|
| 629 | + // P |
|
| 630 | + 'page_pas_proxy' => 'Tiu ĉi paĝo ne ŝutiĝu tra la prokura servilo', |
|
| 631 | + 'pas_de_proxy_pour' => 'Laŭbezone, indiku komputilojn aŭ domajnojn por kiuj tiu prokurservilo ne devas aplikiĝi (ekzemple : @exemple@)', |
|
| 632 | + 'phpinfo' => 'PHP-agordo', |
|
| 633 | + 'plugin_charge_paquet' => 'Ŝargado de la pakaĵo @name@', |
|
| 634 | + 'plugin_charger' => 'Elŝuti', |
|
| 635 | + 'plugin_erreur_charger' => 'eraro : ne eblas ŝargi @zip@', |
|
| 636 | + 'plugin_erreur_droit1' => 'La dosierujo <code>@dest@</code> ne estas skribe alirebla.', |
|
| 637 | + 'plugin_erreur_droit2' => 'Bonvolu kontroli la rajtojn pri tiu ĉi dosierujo (kaj krei ĝin laŭkaze), aŭ instali la dosierojn per FTP.', |
|
| 638 | + 'plugin_erreur_zip' => 'malsukceso pclzip : eraro @status@', |
|
| 639 | + 'plugin_etat_developpement' => 'disvolvata', |
|
| 640 | + 'plugin_etat_experimental' => 'eksperimenta', |
|
| 641 | + 'plugin_etat_stable' => 'stabila', |
|
| 642 | + 'plugin_etat_test' => 'testata', |
|
| 643 | + 'plugin_impossible_activer' => 'Ne eblas aktivigi la kromprogramon @plugin@', |
|
| 644 | + 'plugin_info_automatique1' => 'Se vi deziras permesi la aŭtomatan instaladon de kromprogramoj, bonvolu :', |
|
| 645 | + 'plugin_info_automatique1_lib' => 'Se vi deziras permesi aŭtomata instalado de tiu biblioteko, bonvolu :', |
|
| 646 | + 'plugin_info_automatique2' => 'krei dosierujon <code>@rep@</code> ;', |
|
| 647 | + 'plugin_info_automatique3' => 'kontroli ke estas permesate al la servilo skribi en tiu ĉi dosierujo.', |
|
| 648 | + 'plugin_info_automatique_creer' => 'kreenda ĉe la reteja radiko.', |
|
| 649 | + 'plugin_info_automatique_exemples' => 'ekzemploj :', |
|
| 650 | + 'plugin_info_automatique_ftp' => 'Vi povas instali kromprogramojn, per FTP, en la dosierujon <tt>@rep@</tt>', |
|
| 651 | + 'plugin_info_automatique_lib' => 'Iuj kromprogramoj postulas ankaŭ la eblon elŝuti dosierojn en la dosierujon <code>lib/</code>. Tiu dosierujo estas laŭkaze kreenda ĉe la reteja radiko.', |
|
| 652 | + 'plugin_info_automatique_liste' => 'Viaj listoj de kromprogramoj :', |
|
| 653 | + 'plugin_info_automatique_liste_officielle' => 'la oficialaj kromprogramoj', |
|
| 654 | + 'plugin_info_automatique_liste_update' => 'Ĝisdatigi la listojn', |
|
| 655 | + 'plugin_info_automatique_ou' => 'aŭ...', |
|
| 656 | + 'plugin_info_automatique_select' => 'Elektu ĉi-sube kromprogramon : SPIP elŝutos ĝin kaj instalos ĝin en la dosierujo <code>@rep@</code> ; se tiu ĉi kromprogramo jam ekzistas, ĝi estos ĝisdatigita.', |
|
| 657 | + 'plugin_info_credit' => 'Kreditoj', |
|
| 658 | + 'plugin_info_erreur_xml' => 'Deklaro de tiu kromprogramo ne ĝustas', |
|
| 659 | + 'plugin_info_install_ok' => 'Sukcesa instalado', |
|
| 660 | + 'plugin_info_necessite' => 'Necesas :', |
|
| 661 | + 'plugin_info_non_compatible_spip' => 'Tiu ĉi kromprogramo ne estas kongrua kun tiu SPIP-versio', |
|
| 662 | + 'plugin_info_plugins_dist_1' => 'Kromprogramoj ĉi-sube estas ŝarĝitaj kaj aktivigitaj en la dosierujo @plugins_dist@.', |
|
| 663 | + 'plugin_info_plugins_dist_2' => 'Ili ne malaktivigas.', |
|
| 664 | + 'plugin_info_telecharger' => 'elŝutota de @url@ kaj instalota en @rep@', |
|
| 665 | + 'plugin_info_upgrade_ok' => 'Sukcesa ĝisdatigo', |
|
| 666 | + 'plugin_librairies_installees' => 'Instalitaj bibliotekoj', |
|
| 667 | + 'plugin_necessite_extension_php' => 'Postulas la PHP-kromprogramon @plugin@ laŭ versio @version@.', |
|
| 668 | + 'plugin_necessite_extension_php_sans_version' => 'Postulas la PHP-kromprogramon @plugin@', |
|
| 669 | + 'plugin_necessite_lib' => 'Tiu ĉi kromprogramo bezonas la bibliotekon @lib@', |
|
| 670 | + 'plugin_necessite_php' => 'Postulas @plugin@ laŭ versio @version@.', |
|
| 671 | + 'plugin_necessite_plugin' => 'Postulas la kromprogramon @plugin@ laŭ versio @version@.', |
|
| 672 | + 'plugin_necessite_plugin_sans_version' => 'Necesas la kromprogramon @plugin@', |
|
| 673 | + 'plugin_necessite_spip' => 'Necesas SPIP laŭ minimume versio @version@.', |
|
| 674 | + 'plugin_source' => 'fonto : ', |
|
| 675 | + 'plugin_titre_automatique' => 'Aŭtomata instalo', |
|
| 676 | + 'plugin_titre_automatique_ajouter' => 'Aldoni kromprogramojn', |
|
| 677 | + 'plugin_titre_installation' => 'Instalado de la kromprogramo @plugin@', |
|
| 678 | + 'plugin_titre_modifier' => 'Miaj kromprogramoj', |
|
| 679 | + 'plugin_utilise_extension_php' => 'Uzas la PHP-kromprogramon @plugin@ laŭ versio @version@.', # MODIF |
|
| 680 | + 'plugin_utilise_php' => 'Uzas @plugin@ laŭ versio @version@.', # MODIF |
|
| 681 | + 'plugin_utilise_plugin' => 'Uzas la kromprogramon @plugin@ de versio @version@.', # MODIF |
|
| 682 | + 'plugin_zip_active' => 'Daŭrigu por ĝin aktivigi', |
|
| 683 | + 'plugin_zip_adresse' => 'indiku ĉi-sube la retadreson de la maldensa dosiero de elŝutenda kromprogramo, aŭ la retadreson de kromprogramolisto.', |
|
| 684 | + 'plugin_zip_adresse_champ' => 'Retadreso de la kromprogramo aŭ de la listo ', |
|
| 685 | + 'plugin_zip_content' => 'Ĝi enhavas la jenajn dosierojn (@taille@), |
|
| 686 | 686 | <br />pretajn por instali en la dosierujo <code>@rep@</code>', |
| 687 | - 'plugin_zip_installe_finie' => 'La dosiero @zip@ estis ekstraktita kaj instalita.', |
|
| 688 | - 'plugin_zip_installe_rep_finie' => 'La dosiero @zip@ estis ekstraktita kaj instalita en la dosierujo @rep@', |
|
| 689 | - 'plugin_zip_installer' => 'Vi nun povas instali ĝin', |
|
| 690 | - 'plugin_zip_telecharge' => 'La dosiero @zip@ estis elŝutita', |
|
| 691 | - 'plugins_actif_aucun' => 'Neniu aktivata kromprogramo.', |
|
| 692 | - 'plugins_actif_un' => 'Unu aktivata kromprogramo.', |
|
| 693 | - 'plugins_actifs' => '@count@ aktivataj kromprogramoj.', |
|
| 694 | - 'plugins_actifs_liste' => 'Aktivaj', |
|
| 695 | - 'plugins_compte' => '@count@ kromprogramoj', |
|
| 696 | - 'plugins_disponible_un' => 'Unu disponebla kromprogramo.', |
|
| 697 | - 'plugins_disponibles' => '@count@ disponeblaj kromprogramoj.', |
|
| 698 | - 'plugins_erreur' => 'Eraro en la kromprogramoj : @plugins@', |
|
| 699 | - 'plugins_liste' => 'Listo de kromprogramoj', |
|
| 700 | - 'plugins_liste_dist' => 'Ŝlositaj kromprogramoj', |
|
| 701 | - 'plugins_recents' => 'Freŝaj kromprogramoj.', |
|
| 702 | - 'plugins_tous_liste' => 'Ĉiuj', |
|
| 703 | - 'plugins_vue_hierarchie' => 'Hierarkio', |
|
| 704 | - 'plugins_vue_liste' => 'Listo', |
|
| 705 | - 'protocole_ldap' => 'Protokolversio :', |
|
| 687 | + 'plugin_zip_installe_finie' => 'La dosiero @zip@ estis ekstraktita kaj instalita.', |
|
| 688 | + 'plugin_zip_installe_rep_finie' => 'La dosiero @zip@ estis ekstraktita kaj instalita en la dosierujo @rep@', |
|
| 689 | + 'plugin_zip_installer' => 'Vi nun povas instali ĝin', |
|
| 690 | + 'plugin_zip_telecharge' => 'La dosiero @zip@ estis elŝutita', |
|
| 691 | + 'plugins_actif_aucun' => 'Neniu aktivata kromprogramo.', |
|
| 692 | + 'plugins_actif_un' => 'Unu aktivata kromprogramo.', |
|
| 693 | + 'plugins_actifs' => '@count@ aktivataj kromprogramoj.', |
|
| 694 | + 'plugins_actifs_liste' => 'Aktivaj', |
|
| 695 | + 'plugins_compte' => '@count@ kromprogramoj', |
|
| 696 | + 'plugins_disponible_un' => 'Unu disponebla kromprogramo.', |
|
| 697 | + 'plugins_disponibles' => '@count@ disponeblaj kromprogramoj.', |
|
| 698 | + 'plugins_erreur' => 'Eraro en la kromprogramoj : @plugins@', |
|
| 699 | + 'plugins_liste' => 'Listo de kromprogramoj', |
|
| 700 | + 'plugins_liste_dist' => 'Ŝlositaj kromprogramoj', |
|
| 701 | + 'plugins_recents' => 'Freŝaj kromprogramoj.', |
|
| 702 | + 'plugins_tous_liste' => 'Ĉiuj', |
|
| 703 | + 'plugins_vue_hierarchie' => 'Hierarkio', |
|
| 704 | + 'plugins_vue_liste' => 'Listo', |
|
| 705 | + 'protocole_ldap' => 'Protokolversio :', |
|
| 706 | 706 | |
| 707 | - // Q |
|
| 708 | - 'queue_executer_maintenant' => 'Lanĉi nun', |
|
| 709 | - 'queue_info_purger' => 'Vi povas forviŝi ĉiujn atendante taskojn kaj restarigi la liston kun la periodaj taskoj', # MODIF |
|
| 710 | - 'queue_nb_jobs_in_queue' => '@nb@ atendante taskoj', # MODIF |
|
| 711 | - 'queue_next_job_in_nb_sec' => 'Sekva tasko post @nb@ s', # MODIF |
|
| 712 | - 'queue_no_job_in_queue' => 'Neniu atendante tasko', # MODIF |
|
| 713 | - 'queue_one_job_in_queue' => '1 atendante tasko', # MODIF |
|
| 714 | - 'queue_priorite_tache' => 'prioritato', |
|
| 715 | - 'queue_purger_queue' => 'Restarigi la taskliston', # MODIF |
|
| 716 | - 'queue_titre' => 'Tasklisto', # MODIF |
|
| 707 | + // Q |
|
| 708 | + 'queue_executer_maintenant' => 'Lanĉi nun', |
|
| 709 | + 'queue_info_purger' => 'Vi povas forviŝi ĉiujn atendante taskojn kaj restarigi la liston kun la periodaj taskoj', # MODIF |
|
| 710 | + 'queue_nb_jobs_in_queue' => '@nb@ atendante taskoj', # MODIF |
|
| 711 | + 'queue_next_job_in_nb_sec' => 'Sekva tasko post @nb@ s', # MODIF |
|
| 712 | + 'queue_no_job_in_queue' => 'Neniu atendante tasko', # MODIF |
|
| 713 | + 'queue_one_job_in_queue' => '1 atendante tasko', # MODIF |
|
| 714 | + 'queue_priorite_tache' => 'prioritato', |
|
| 715 | + 'queue_purger_queue' => 'Restarigi la taskliston', # MODIF |
|
| 716 | + 'queue_titre' => 'Tasklisto', # MODIF |
|
| 717 | 717 | |
| 718 | - // R |
|
| 719 | - 'repertoire_plugins' => 'Dosierujo :', |
|
| 720 | - 'required' => '(deviga)', # MODIF |
|
| 718 | + // R |
|
| 719 | + 'repertoire_plugins' => 'Dosierujo :', |
|
| 720 | + 'required' => '(deviga)', # MODIF |
|
| 721 | 721 | |
| 722 | - // S |
|
| 723 | - 'sans_heure' => 'sen horo', |
|
| 724 | - 'statut_admin_restreint' => '(limigita mastrumanto)', |
|
| 725 | - 'statut_webmestre' => 'retejestro', |
|
| 722 | + // S |
|
| 723 | + 'sans_heure' => 'sen horo', |
|
| 724 | + 'statut_admin_restreint' => '(limigita mastrumanto)', |
|
| 725 | + 'statut_webmestre' => 'retejestro', |
|
| 726 | 726 | |
| 727 | - // T |
|
| 728 | - 'tache_cron_asap' => 'Tasko CRON @function@ (ASAP)', |
|
| 729 | - 'tache_cron_secondes' => 'Tasko CRON @function@ (ĉiuj @nb@ s)', |
|
| 730 | - 'taille_cache_image' => 'La bildoj aŭtomate komputitaj de SPIP (vijnetoj de dokumentoj, titoloj prezentitaj laŭ grafika formo, matematikaj funkcioj laŭ TeX-formato...) okupas en dosierujo @dir@ spacon je @taille@.', |
|
| 731 | - 'taille_cache_infinie' => 'Tiu retejo ne ebligas limigi memorspacon de stapla dosierujo.', |
|
| 732 | - 'taille_cache_maxi' => 'SPIP provas limigi memorspacon de stapla dosierujo po cirkaŭ <b>@octets@</b> da datenoj.', |
|
| 733 | - 'taille_cache_moins_de' => 'Memorspaco de la staplo estas malpli ol @octets@.', |
|
| 734 | - 'taille_cache_octets' => 'Memorspaco de la staplo estas nun proksimume @octets@.', |
|
| 735 | - 'taille_cache_vide' => 'La staplo estas malplena.', |
|
| 736 | - 'taille_repertoire_cache' => 'Memorspaco de stapla dosierujo', |
|
| 737 | - 'text_article_propose_publication' => 'Artikolo proponita por publikigo.', |
|
| 738 | - 'texte_acces_ldap_anonyme_1' => 'Iuj LDAP-serviloj ne akceptas sennoman aliron. Tiukaze, necesas difini identecnomon por serĉi informojn en dosierujilo. Plejofte tamen, la sekvantaj tajpujoj povas resti malplenaj.', |
|
| 739 | - 'texte_admin_effacer_01' => 'Tiu komando forviŝas <i>la tutan</i> enhavon de la datenbazo, |
|
| 727 | + // T |
|
| 728 | + 'tache_cron_asap' => 'Tasko CRON @function@ (ASAP)', |
|
| 729 | + 'tache_cron_secondes' => 'Tasko CRON @function@ (ĉiuj @nb@ s)', |
|
| 730 | + 'taille_cache_image' => 'La bildoj aŭtomate komputitaj de SPIP (vijnetoj de dokumentoj, titoloj prezentitaj laŭ grafika formo, matematikaj funkcioj laŭ TeX-formato...) okupas en dosierujo @dir@ spacon je @taille@.', |
|
| 731 | + 'taille_cache_infinie' => 'Tiu retejo ne ebligas limigi memorspacon de stapla dosierujo.', |
|
| 732 | + 'taille_cache_maxi' => 'SPIP provas limigi memorspacon de stapla dosierujo po cirkaŭ <b>@octets@</b> da datenoj.', |
|
| 733 | + 'taille_cache_moins_de' => 'Memorspaco de la staplo estas malpli ol @octets@.', |
|
| 734 | + 'taille_cache_octets' => 'Memorspaco de la staplo estas nun proksimume @octets@.', |
|
| 735 | + 'taille_cache_vide' => 'La staplo estas malplena.', |
|
| 736 | + 'taille_repertoire_cache' => 'Memorspaco de stapla dosierujo', |
|
| 737 | + 'text_article_propose_publication' => 'Artikolo proponita por publikigo.', |
|
| 738 | + 'texte_acces_ldap_anonyme_1' => 'Iuj LDAP-serviloj ne akceptas sennoman aliron. Tiukaze, necesas difini identecnomon por serĉi informojn en dosierujilo. Plejofte tamen, la sekvantaj tajpujoj povas resti malplenaj.', |
|
| 739 | + 'texte_admin_effacer_01' => 'Tiu komando forviŝas <i>la tutan</i> enhavon de la datenbazo, |
|
| 740 | 740 | inkluzive de <i>ĉiuj</i> alirrajtoj de redaktantoj kaj mastrumantoj. Post ties efektivigo, vi devos lanĉi la |
| 741 | 741 | SPIP-reinstalon por rekrei novan bazon kaj unuan mastrumulan alirrajton.', |
| 742 | - 'texte_adresse_annuaire_1' => '(Se via adresaro estas instalita ĉe la sama maŝino kiel la retejo, temas verŝajne pri « localhost ».)', |
|
| 743 | - 'texte_ajout_auteur' => 'La jena aŭtoro estis aldonita al la artikolo :', |
|
| 744 | - 'texte_annuaire_ldap_1' => 'Se vi havas aliron al dosierujilo (LDAP), vi povas uzi ĝin por aŭtomate importi uzantojn sub SPIP.', |
|
| 745 | - 'texte_article_statut' => 'Tiu artikolo estas :', |
|
| 746 | - 'texte_article_virtuel' => 'Virtuala artikolo', |
|
| 747 | - 'texte_article_virtuel_reference' => '<b>Virtuala artikolo :</b> artikolo referencigita ĉe via SPIP-retejo, sed alidirektita al alia retadreso. Por forigi la alidirekton, forviŝu la ĉi supran URL-n.', |
|
| 748 | - 'texte_aucun_resultat_auteur' => 'Neniu rezulto por "@cherche_auteur@"', |
|
| 749 | - 'texte_auteur_messagerie' => 'Tiu retejo povas konstante indiki la liston de la konektitaj redaktantoj. Tio ebligas al vi rekte interŝanĝi mesaĝojn. Vi povas decidi ne aperi en tia listo (vi estas « nevidebla » al la aliaj uzantoj).', |
|
| 750 | - 'texte_auteurs' => 'LA AŬTOROJ', |
|
| 751 | - 'texte_choix_base_1' => 'Elektu vian datenbazon :', |
|
| 752 | - 'texte_choix_base_2' => 'La SQL-servilo enhavas plurajn datenbazojn.', |
|
| 753 | - 'texte_choix_base_3' => '<b>Elektu</b> ĉi-poste tiun, kiun atribuis al vi via retejgastiganto :', |
|
| 754 | - 'texte_choix_table_prefix' => 'Prefikso de la tabeloj :', |
|
| 755 | - 'texte_compte_element' => '@count@ elemento', |
|
| 756 | - 'texte_compte_elements' => '@count@ elementoj', |
|
| 757 | - 'texte_conflit_edition_correction' => 'Bonvolu kontroli ĉi-sube la diferencojn inter ambaŭ versioj de la teksto, vi povas ankaŭ kopii viajn ŝanĝojn, poste restartu.', |
|
| 758 | - 'texte_connexion_mysql' => 'Konsultu la informojn donitajn de via retgastiganto : en ili, vi trovos la ensalutilojn necesajn por konektiĝi al la servilo de datumbazo kiun li proponas.', |
|
| 759 | - 'texte_contenu_article' => '(Kelkvorta enhavo-priskribo de la artikolo.)', |
|
| 760 | - 'texte_contenu_articles' => 'Laŭ la modelo adoptita por via retejo, vi povas decidi |
|
| 742 | + 'texte_adresse_annuaire_1' => '(Se via adresaro estas instalita ĉe la sama maŝino kiel la retejo, temas verŝajne pri « localhost ».)', |
|
| 743 | + 'texte_ajout_auteur' => 'La jena aŭtoro estis aldonita al la artikolo :', |
|
| 744 | + 'texte_annuaire_ldap_1' => 'Se vi havas aliron al dosierujilo (LDAP), vi povas uzi ĝin por aŭtomate importi uzantojn sub SPIP.', |
|
| 745 | + 'texte_article_statut' => 'Tiu artikolo estas :', |
|
| 746 | + 'texte_article_virtuel' => 'Virtuala artikolo', |
|
| 747 | + 'texte_article_virtuel_reference' => '<b>Virtuala artikolo :</b> artikolo referencigita ĉe via SPIP-retejo, sed alidirektita al alia retadreso. Por forigi la alidirekton, forviŝu la ĉi supran URL-n.', |
|
| 748 | + 'texte_aucun_resultat_auteur' => 'Neniu rezulto por "@cherche_auteur@"', |
|
| 749 | + 'texte_auteur_messagerie' => 'Tiu retejo povas konstante indiki la liston de la konektitaj redaktantoj. Tio ebligas al vi rekte interŝanĝi mesaĝojn. Vi povas decidi ne aperi en tia listo (vi estas « nevidebla » al la aliaj uzantoj).', |
|
| 750 | + 'texte_auteurs' => 'LA AŬTOROJ', |
|
| 751 | + 'texte_choix_base_1' => 'Elektu vian datenbazon :', |
|
| 752 | + 'texte_choix_base_2' => 'La SQL-servilo enhavas plurajn datenbazojn.', |
|
| 753 | + 'texte_choix_base_3' => '<b>Elektu</b> ĉi-poste tiun, kiun atribuis al vi via retejgastiganto :', |
|
| 754 | + 'texte_choix_table_prefix' => 'Prefikso de la tabeloj :', |
|
| 755 | + 'texte_compte_element' => '@count@ elemento', |
|
| 756 | + 'texte_compte_elements' => '@count@ elementoj', |
|
| 757 | + 'texte_conflit_edition_correction' => 'Bonvolu kontroli ĉi-sube la diferencojn inter ambaŭ versioj de la teksto, vi povas ankaŭ kopii viajn ŝanĝojn, poste restartu.', |
|
| 758 | + 'texte_connexion_mysql' => 'Konsultu la informojn donitajn de via retgastiganto : en ili, vi trovos la ensalutilojn necesajn por konektiĝi al la servilo de datumbazo kiun li proponas.', |
|
| 759 | + 'texte_contenu_article' => '(Kelkvorta enhavo-priskribo de la artikolo.)', |
|
| 760 | + 'texte_contenu_articles' => 'Laŭ la modelo adoptita por via retejo, vi povas decidi |
|
| 761 | 761 | ke certaj elementoj de la artikoloj ne estu uzataj. |
| 762 | 762 | Uzu la ĉi-suban liston por indiki kiuj elementoj disponeblas.', |
| 763 | - 'texte_crash_base' => 'Se via datenbazo kolapsis, |
|
| 763 | + 'texte_crash_base' => 'Se via datenbazo kolapsis, |
|
| 764 | 764 | vi povas provi |
| 765 | 765 | aŭtomatan riparon.', |
| 766 | - 'texte_creer_rubrique' => 'Antaŭ ol povi skribi artikolojn,<br /> vi devas krei rubrikon.', |
|
| 767 | - 'texte_date_creation_article' => 'KREO-DATO DE LA ARTIKOLO :', |
|
| 768 | - 'texte_date_creation_objet' => 'Kreo-dato :', # on ajoute le ":" |
|
| 769 | - 'texte_date_publication_anterieure' => 'DATO DE ANTAŬA REDAKTO :', |
|
| 770 | - 'texte_date_publication_anterieure_nonaffichee' => 'Ne afiŝi daton de antaŭa redakto.', |
|
| 771 | - 'texte_date_publication_article' => 'DATO DE RETA PUBLIKIGO :', |
|
| 772 | - 'texte_date_publication_objet' => 'Dato de reta publikigo :', |
|
| 773 | - 'texte_definir_comme_traduction_rubrique' => 'Tiu rubriko estas traduko de la rubriko numero :', |
|
| 774 | - 'texte_descriptif_rapide' => 'Konciza priskribo', |
|
| 775 | - 'texte_effacer_base' => 'Forviŝi la SPIP-datenbazon', |
|
| 776 | - 'texte_effacer_statistiques' => 'Forviŝi statistikojn', |
|
| 777 | - 'texte_en_cours_validation' => 'La enhavoj ĉi-subaj estas proponitaj por publikigo.', |
|
| 778 | - 'texte_enrichir_mise_a_jour' => 'Vi povas pliriĉigi la enpaĝigon de via teksto uzante « tipografiajn rapidklavojn ».', |
|
| 779 | - 'texte_fichier_authent' => '<b>Ĉu SPIP kreu la specialajn dosierojn <tt>.htpasswd</tt> kaj <tt>.htpasswd-admin</tt> en dosierujo @dossier@ ?</b> |
|
| 766 | + 'texte_creer_rubrique' => 'Antaŭ ol povi skribi artikolojn,<br /> vi devas krei rubrikon.', |
|
| 767 | + 'texte_date_creation_article' => 'KREO-DATO DE LA ARTIKOLO :', |
|
| 768 | + 'texte_date_creation_objet' => 'Kreo-dato :', # on ajoute le ":" |
|
| 769 | + 'texte_date_publication_anterieure' => 'DATO DE ANTAŬA REDAKTO :', |
|
| 770 | + 'texte_date_publication_anterieure_nonaffichee' => 'Ne afiŝi daton de antaŭa redakto.', |
|
| 771 | + 'texte_date_publication_article' => 'DATO DE RETA PUBLIKIGO :', |
|
| 772 | + 'texte_date_publication_objet' => 'Dato de reta publikigo :', |
|
| 773 | + 'texte_definir_comme_traduction_rubrique' => 'Tiu rubriko estas traduko de la rubriko numero :', |
|
| 774 | + 'texte_descriptif_rapide' => 'Konciza priskribo', |
|
| 775 | + 'texte_effacer_base' => 'Forviŝi la SPIP-datenbazon', |
|
| 776 | + 'texte_effacer_statistiques' => 'Forviŝi statistikojn', |
|
| 777 | + 'texte_en_cours_validation' => 'La enhavoj ĉi-subaj estas proponitaj por publikigo.', |
|
| 778 | + 'texte_enrichir_mise_a_jour' => 'Vi povas pliriĉigi la enpaĝigon de via teksto uzante « tipografiajn rapidklavojn ».', |
|
| 779 | + 'texte_fichier_authent' => '<b>Ĉu SPIP kreu la specialajn dosierojn <tt>.htpasswd</tt> kaj <tt>.htpasswd-admin</tt> en dosierujo @dossier@ ?</b> |
|
| 780 | 780 | <p>Tiuj dosieroj ebligas limigi la alirrajton de aŭtoroj kaj administrantoj en aliaj lokoj de via retejo (ekzemple, ekstera statistik-programo).</p> |
| 781 | 781 | <p>Se tio ne utilas al vi, vi povas lasi tiun opcion je ĝia defaŭlta valoro (neniu dosier-kreo).</p>', |
| 782 | - 'texte_informations_personnelles_1' => 'La sistemo kreos por vi nun personan alireblon al la retejo.', |
|
| 783 | - 'texte_informations_personnelles_2' => '(Noto : se temas pri reinstalo kaj se via aliro daŭre funkcias, vi povas', |
|
| 784 | - 'texte_introductif_article' => '(Enkonduka teksto al la artikolo.)', |
|
| 785 | - 'texte_jeu_caractere' => 'Ni konsilas al vi uzi, en via retejo, universalan alfabeton (<tt>utf-8</tt>) : tio ebligas afiŝadon de tekstoj en ĉiuj lingvoj kaj solvas problemojn de kongrueco se vi uzas modernajn retumilojn.', |
|
| 786 | - 'texte_jeu_caractere_3' => 'Via retejo estas nun instalita laŭ la litertiparo :', |
|
| 787 | - 'texte_jeu_caractere_4' => 'Se tio ne kongruas kun la realo de viaj datenoj (ekzemple, sekve de datenbazo-restaŭro), aŭ se <em>vi ĵus ekkreis tiun retejon</em> kaj deziras ekuzi novan litertiparon, bonvolu indiki ĝin ĉi tie :', |
|
| 788 | - 'texte_login_ldap_1' => 'Lasu malplena por sennoma aliro, aŭ entajpu la kompletan vojon, ekzemple « <tt>uid=nomo, ou=uzanto, dc=mia-domajno, dc=com</tt> ».)', |
|
| 789 | - 'texte_login_precaution' => 'Atentu ! Tio ĉi estas la salutnomo laŭ kiu vi ensalutis. |
|
| 782 | + 'texte_informations_personnelles_1' => 'La sistemo kreos por vi nun personan alireblon al la retejo.', |
|
| 783 | + 'texte_informations_personnelles_2' => '(Noto : se temas pri reinstalo kaj se via aliro daŭre funkcias, vi povas', |
|
| 784 | + 'texte_introductif_article' => '(Enkonduka teksto al la artikolo.)', |
|
| 785 | + 'texte_jeu_caractere' => 'Ni konsilas al vi uzi, en via retejo, universalan alfabeton (<tt>utf-8</tt>) : tio ebligas afiŝadon de tekstoj en ĉiuj lingvoj kaj solvas problemojn de kongrueco se vi uzas modernajn retumilojn.', |
|
| 786 | + 'texte_jeu_caractere_3' => 'Via retejo estas nun instalita laŭ la litertiparo :', |
|
| 787 | + 'texte_jeu_caractere_4' => 'Se tio ne kongruas kun la realo de viaj datenoj (ekzemple, sekve de datenbazo-restaŭro), aŭ se <em>vi ĵus ekkreis tiun retejon</em> kaj deziras ekuzi novan litertiparon, bonvolu indiki ĝin ĉi tie :', |
|
| 788 | + 'texte_login_ldap_1' => 'Lasu malplena por sennoma aliro, aŭ entajpu la kompletan vojon, ekzemple « <tt>uid=nomo, ou=uzanto, dc=mia-domajno, dc=com</tt> ».)', |
|
| 789 | + 'texte_login_precaution' => 'Atentu ! Tio ĉi estas la salutnomo laŭ kiu vi ensalutis. |
|
| 790 | 790 | Uzu tiun ĉi formularon prudente...', |
| 791 | - 'texte_messagerie_agenda' => 'Mesaĝado permesas al retejaj redaktantoj komuniki inter si rekte en la privata spaco de la retejo. Ĝi estas asociita kun agendo.', |
|
| 792 | - 'texte_mise_a_niveau_base_1' => 'Vi ĵus ĝisdatigis la SPIP-dosierojn. |
|
| 791 | + 'texte_messagerie_agenda' => 'Mesaĝado permesas al retejaj redaktantoj komuniki inter si rekte en la privata spaco de la retejo. Ĝi estas asociita kun agendo.', |
|
| 792 | + 'texte_mise_a_niveau_base_1' => 'Vi ĵus ĝisdatigis la SPIP-dosierojn. |
|
| 793 | 793 | Necesas nun alniveligi la datenbazon |
| 794 | 794 | de la retejo.', |
| 795 | - 'texte_modifier_article' => 'Modifi la artikolon :', |
|
| 796 | - 'texte_multilinguisme' => 'Se vi deziras mastrumi la objektojn en pluraj lingvoj, per kompleksa retumado, vi povas aldoni menuon pri lingvoelekto en la objektojn, konforme al la organizo de via retejo.', |
|
| 797 | - 'texte_multilinguisme_trad' => 'Vi povas ankaŭ aktivigi sistemon por mastrumi la ligilojn inter la diversaj tradukoj sur iuj objektoj.', |
|
| 798 | - 'texte_non_compresse' => '<i>ne densigita</i> (ĉar via servilo ne eltenas tiun funkcion)', |
|
| 799 | - 'texte_nouvelle_version_spip_1' => 'Vi instalis novan version de SPIP.', |
|
| 800 | - 'texte_nouvelle_version_spip_2' => 'Tiu ĉi nova versio bezonas pli kompletan ĝisdatigon ol kutime. Se vi estas retejestro de la retejo, bonvolu forviŝi la dosieron @connect@ kaj restarigi la instalprocezon por ĝisdatigi viajn konekt-parametrojn al la datenbazo.<p> (Notu : se vi forgesis viajn konektparametrojn, legu la dosieron @connect@ antaŭ ol forviŝi ĝin...)</p>', |
|
| 801 | - 'texte_operation_echec' => 'Reiru al antaŭa paĝo, selektu alian datenbazon aŭ kreu novan. Kontrolu la informojn donitajn de via retgastiganto.', |
|
| 802 | - 'texte_plus_trois_car' => 'pli ol 3 literoj', |
|
| 803 | - 'texte_plusieurs_articles' => 'Pluraj aŭtoroj trovitaj por"@cherche_auteur@" :', |
|
| 804 | - 'texte_port_annuaire' => 'La defaŭlte indikita valoro ĝenerale taŭgas.)', |
|
| 805 | - 'texte_presente_plugin' => 'Tiu paĝo listigas kromprogramojn disponeblajn ĉe tiu retejo. Vi povas aktivigi la necesajn kromprogramojn noĉante la kongruan noĉujon.', |
|
| 806 | - 'texte_proposer_publication' => 'Kiam via artikolo estas finita,<br /> vi povas proponi ĝian publikigon.', |
|
| 807 | - 'texte_proxy' => 'En iuj okazoj (intrareto, protektitaj retoj...), |
|
| 795 | + 'texte_modifier_article' => 'Modifi la artikolon :', |
|
| 796 | + 'texte_multilinguisme' => 'Se vi deziras mastrumi la objektojn en pluraj lingvoj, per kompleksa retumado, vi povas aldoni menuon pri lingvoelekto en la objektojn, konforme al la organizo de via retejo.', |
|
| 797 | + 'texte_multilinguisme_trad' => 'Vi povas ankaŭ aktivigi sistemon por mastrumi la ligilojn inter la diversaj tradukoj sur iuj objektoj.', |
|
| 798 | + 'texte_non_compresse' => '<i>ne densigita</i> (ĉar via servilo ne eltenas tiun funkcion)', |
|
| 799 | + 'texte_nouvelle_version_spip_1' => 'Vi instalis novan version de SPIP.', |
|
| 800 | + 'texte_nouvelle_version_spip_2' => 'Tiu ĉi nova versio bezonas pli kompletan ĝisdatigon ol kutime. Se vi estas retejestro de la retejo, bonvolu forviŝi la dosieron @connect@ kaj restarigi la instalprocezon por ĝisdatigi viajn konekt-parametrojn al la datenbazo.<p> (Notu : se vi forgesis viajn konektparametrojn, legu la dosieron @connect@ antaŭ ol forviŝi ĝin...)</p>', |
|
| 801 | + 'texte_operation_echec' => 'Reiru al antaŭa paĝo, selektu alian datenbazon aŭ kreu novan. Kontrolu la informojn donitajn de via retgastiganto.', |
|
| 802 | + 'texte_plus_trois_car' => 'pli ol 3 literoj', |
|
| 803 | + 'texte_plusieurs_articles' => 'Pluraj aŭtoroj trovitaj por"@cherche_auteur@" :', |
|
| 804 | + 'texte_port_annuaire' => 'La defaŭlte indikita valoro ĝenerale taŭgas.)', |
|
| 805 | + 'texte_presente_plugin' => 'Tiu paĝo listigas kromprogramojn disponeblajn ĉe tiu retejo. Vi povas aktivigi la necesajn kromprogramojn noĉante la kongruan noĉujon.', |
|
| 806 | + 'texte_proposer_publication' => 'Kiam via artikolo estas finita,<br /> vi povas proponi ĝian publikigon.', |
|
| 807 | + 'texte_proxy' => 'En iuj okazoj (intrareto, protektitaj retoj...), |
|
| 808 | 808 | povas esti necese uzi na <i>proxy HTTP</i> por atingi eksterajn retejojn (dokumentaron de SPIP, abonligitajn retejojn, ktp...). |
| 809 | 809 | Se tio okazas, indiku ĉi-sube ties retadreson, laŭ la formo @proxy_en_cours@. Ĝenerale, |
| 810 | 810 | lasu tiun tajpujon malplena.', |
| 811 | - 'texte_publication_articles_post_dates' => 'Kiel kondutu SPIP rilate la artikolojn |
|
| 811 | + 'texte_publication_articles_post_dates' => 'Kiel kondutu SPIP rilate la artikolojn |
|
| 812 | 812 | kies publikig-dato estis fiksita |
| 813 | 813 | por estonta templimo ?', |
| 814 | - 'texte_rappel_selection_champs' => '[Ne forgesu ĝuste selekti tiun kampon.]', |
|
| 815 | - 'texte_recalcul_page' => 'Se vi volas |
|
| 814 | + 'texte_rappel_selection_champs' => '[Ne forgesu ĝuste selekti tiun kampon.]', |
|
| 815 | + 'texte_recalcul_page' => 'Se vi volas |
|
| 816 | 816 | rekalkuli ununuran paĝon, pasu prefere tra la publika spaco kaj tie uzu la butonon « rekalkuli ».', |
| 817 | - 'texte_recuperer_base' => 'Ripari la datenbazon', |
|
| 818 | - 'texte_reference_mais_redirige' => 'artikolo referencigita ĉe via SPIP-retejo, sed redirektita al alia URL.', |
|
| 819 | - 'texte_requetes_echouent' => '<b>Kiam iuj SQL-serĉpetoj ĉiufoje |
|
| 817 | + 'texte_recuperer_base' => 'Ripari la datenbazon', |
|
| 818 | + 'texte_reference_mais_redirige' => 'artikolo referencigita ĉe via SPIP-retejo, sed redirektita al alia URL.', |
|
| 819 | + 'texte_requetes_echouent' => '<b>Kiam iuj SQL-serĉpetoj ĉiufoje |
|
| 820 | 820 | kaj senkiale malsukcesas, estas eble |
| 821 | 821 | ke tio okazas pro la datenbazo |
| 822 | 822 | mem.</b><p> |
@@ -827,89 +827,89 @@ discard block |
||
| 827 | 827 | Ĝi eble entenas indicojn pri la misfunkcio...</p><p> |
| 828 | 828 | Se la problemo daŭras, kontaktu |
| 829 | 829 | vian retgastiganton.</p>', |
| 830 | - 'texte_selection_langue_principale' => 'Vi povas ĉi-sube elekti la « ĉefan lingvon » de la retejo. Tiu elekto ne devigas vin - bonŝance ! - verki viajn artikolojn en la elektita lingvo, sed ebligas determini : |
|
| 830 | + 'texte_selection_langue_principale' => 'Vi povas ĉi-sube elekti la « ĉefan lingvon » de la retejo. Tiu elekto ne devigas vin - bonŝance ! - verki viajn artikolojn en la elektita lingvo, sed ebligas determini : |
|
| 831 | 831 | <ul><li> la defaŭltan formaton de la datenoj en la publika spaco ;</li> |
| 832 | 832 | <li> kian tipografiilon SPIP devas uzi pri tekst-aspektigo ;</li> |
| 833 | 833 | <li> la lingvon uzendan en la formularoj de la publika spaco ;</li> |
| 834 | 834 | <li> la lingvon defaŭlte prezentitan en la privata spaco.</li></ul>', |
| 835 | - 'texte_sous_titre' => 'Subtitolo', |
|
| 836 | - 'texte_statistiques_visites' => '(Malhelaj stangoj : dimanĉo / malhela kurbo : evoluo de la meznombro)', |
|
| 837 | - 'texte_statut_attente_validation' => 'Atendantaj validigon', |
|
| 838 | - 'texte_statut_publies' => 'Rete publikigitaj', |
|
| 839 | - 'texte_statut_refuses' => 'rifuzitaj', |
|
| 840 | - 'texte_suppression_fichiers' => 'Uzu tiun ĉi komandon por forigi ĉiujn dosierojn troviĝantajn |
|
| 835 | + 'texte_sous_titre' => 'Subtitolo', |
|
| 836 | + 'texte_statistiques_visites' => '(Malhelaj stangoj : dimanĉo / malhela kurbo : evoluo de la meznombro)', |
|
| 837 | + 'texte_statut_attente_validation' => 'Atendantaj validigon', |
|
| 838 | + 'texte_statut_publies' => 'Rete publikigitaj', |
|
| 839 | + 'texte_statut_refuses' => 'rifuzitaj', |
|
| 840 | + 'texte_suppression_fichiers' => 'Uzu tiun ĉi komandon por forigi ĉiujn dosierojn troviĝantajn |
|
| 841 | 841 | en la SPIP-staplo. Tio ebligas ekzemple devigi la sistemon rekalkuli ĉiujn paĝojn, se vi |
| 842 | 842 | faris gravajn ŝanĝojn en la grafiko aŭ strukturo de la retejo.', |
| 843 | - 'texte_sur_titre' => 'Surtitolo', |
|
| 844 | - 'texte_table_ok' => ' : tiu tabelo estas en ordo.', |
|
| 845 | - 'texte_tentative_recuperation' => 'Ripar-provo', |
|
| 846 | - 'texte_tenter_reparation' => 'Provi riparon de la datenbazo', |
|
| 847 | - 'texte_test_proxy' => 'Por testi tiun prokuran servilon, indiku ĉi tie la adreson de retejo, kiun vi deziras testi.', |
|
| 848 | - 'texte_titre_02' => 'Titolo :', |
|
| 849 | - 'texte_titre_obligatoire' => '<b>Titolo</b> [Deviga]', |
|
| 850 | - 'texte_travail_article' => '@nom_auteur_modif@ prilaboris tiun artikolon antaŭ @date_diff@ minutoj', |
|
| 851 | - 'texte_travail_collaboratif' => 'Se pluraj redaktantoj laboras ofte |
|
| 843 | + 'texte_sur_titre' => 'Surtitolo', |
|
| 844 | + 'texte_table_ok' => ' : tiu tabelo estas en ordo.', |
|
| 845 | + 'texte_tentative_recuperation' => 'Ripar-provo', |
|
| 846 | + 'texte_tenter_reparation' => 'Provi riparon de la datenbazo', |
|
| 847 | + 'texte_test_proxy' => 'Por testi tiun prokuran servilon, indiku ĉi tie la adreson de retejo, kiun vi deziras testi.', |
|
| 848 | + 'texte_titre_02' => 'Titolo :', |
|
| 849 | + 'texte_titre_obligatoire' => '<b>Titolo</b> [Deviga]', |
|
| 850 | + 'texte_travail_article' => '@nom_auteur_modif@ prilaboris tiun artikolon antaŭ @date_diff@ minutoj', |
|
| 851 | + 'texte_travail_collaboratif' => 'Se pluraj redaktantoj laboras ofte |
|
| 852 | 852 | pri sama artikolo, la sistemo |
| 853 | 853 | povas afiŝi la ĵus « malfermitajn » artikolojn |
| 854 | 854 | por eviti la sammomentajn modifojn. |
| 855 | 855 | Tiu opcio estas defaŭlte malaktivigita |
| 856 | 856 | por eviti maloportunajn |
| 857 | 857 | averto-mesaĝojn.', |
| 858 | - 'texte_vide' => 'malplena', |
|
| 859 | - 'texte_vider_cache' => 'Malplenigi la staplon', |
|
| 860 | - 'titre_admin_tech' => 'Teknika bontenado', |
|
| 861 | - 'titre_admin_vider' => 'Teknika bontenado', |
|
| 862 | - 'titre_ajouter_un_auteur' => 'Aldoni aŭtoro', |
|
| 863 | - 'titre_ajouter_un_mot' => 'Aldoni ŝlosilvorto', |
|
| 864 | - 'titre_cadre_afficher_article' => 'Afiŝi la artikolojn', |
|
| 865 | - 'titre_cadre_afficher_traductions' => 'Afiŝi la traduk-staton por tiuj lingvoj :', |
|
| 866 | - 'titre_cadre_ajouter_auteur' => 'ALDONI AŬTORON :', |
|
| 867 | - 'titre_cadre_interieur_rubrique' => 'Ene de la rubriko', |
|
| 868 | - 'titre_cadre_numero_auteur' => 'AŬTORO NUMERO', |
|
| 869 | - 'titre_cadre_numero_objet' => '@objet@ NUMERO :', |
|
| 870 | - 'titre_cadre_signature_obligatoire' => '<b>Subskribo</b> [deviga]<br />', |
|
| 871 | - 'titre_config_contenu_notifications' => 'Avizoj', |
|
| 872 | - 'titre_config_contenu_prive' => 'En la privata spaco', |
|
| 873 | - 'titre_config_contenu_public' => 'Ĉe la publika retejo', |
|
| 874 | - 'titre_config_fonctions' => 'Agordo de la retejo', |
|
| 875 | - 'titre_config_langage' => 'Agordi la lingvon', |
|
| 876 | - 'titre_configuration' => 'Agordo de la retejo', |
|
| 877 | - 'titre_configurer_preferences' => 'Agordi viajn preferojn', |
|
| 878 | - 'titre_configurer_preferences_menus' => 'Agordi viajn preferatajn menuojn', |
|
| 879 | - 'titre_conflit_edition' => 'Konflikto dum redaktado', |
|
| 880 | - 'titre_connexion_ldap' => 'Opcioj : <b>Via konekto LDAP</b>', |
|
| 881 | - 'titre_groupe_mots' => 'GRUPO DE VORTOJ :', |
|
| 882 | - 'titre_identite_site' => 'Identeco de la retejo', |
|
| 883 | - 'titre_langue_article' => 'Lingvo de la artikolo', |
|
| 884 | - 'titre_langue_rubrique' => 'Lingvo de la rubriko', |
|
| 885 | - 'titre_langue_trad_article' => 'LINGVO KAJ TRADUKOJ DE LA ARTIKOLO', |
|
| 886 | - 'titre_les_articles' => 'LA ARTIKOLOJ', |
|
| 887 | - 'titre_messagerie_agenda' => 'Mesaĝilo kaj agendo', |
|
| 888 | - 'titre_naviguer_dans_le_site' => 'Retejumi...', |
|
| 889 | - 'titre_nouvelle_rubrique' => 'Nova rubriko', |
|
| 890 | - 'titre_numero_rubrique' => 'RUBRIKO NUMERO :', |
|
| 891 | - 'titre_page_articles_edit' => 'Modifi : @titre@', |
|
| 892 | - 'titre_page_articles_page' => 'La artikoloj', |
|
| 893 | - 'titre_page_articles_tous' => 'La tuta retejo', |
|
| 894 | - 'titre_page_calendrier' => 'Kalendaro @nom_mois@ @annee@', |
|
| 895 | - 'titre_page_config_contenu' => 'Agordo de la retejo', |
|
| 896 | - 'titre_page_delete_all' => 'tuta kaj malfarebla forviŝo', |
|
| 897 | - 'titre_page_recherche' => 'Serĉrezulto @recherche@', |
|
| 898 | - 'titre_page_statistiques_referers' => 'Statistikoj (eniraj ligiloj)', |
|
| 899 | - 'titre_page_upgrade' => 'SPIP-alniveligo', |
|
| 900 | - 'titre_preference_menus_favoris' => 'Preferataj menuoj', |
|
| 901 | - 'titre_publication_articles_post_dates' => 'Publikigo de la postdatitaj artikoloj', |
|
| 902 | - 'titre_reparation' => 'Riparo', |
|
| 903 | - 'titre_suivi_petition' => 'Kontrolo de la petskriboj', |
|
| 904 | - 'tls_ldap' => 'Transŝuta tavolsekureco (TLS) :', |
|
| 905 | - 'trad_article_traduction' => 'Ĉiuj versioj de tiu ĉi artikolo :', |
|
| 906 | - 'trad_delier' => 'Ne plu ligi al ties tradukoj', |
|
| 907 | - 'trad_lier' => 'Tiu artikolo estas traduko de la artikolo numero :', |
|
| 908 | - 'trad_new' => 'Skribi novan tradukon', |
|
| 858 | + 'texte_vide' => 'malplena', |
|
| 859 | + 'texte_vider_cache' => 'Malplenigi la staplon', |
|
| 860 | + 'titre_admin_tech' => 'Teknika bontenado', |
|
| 861 | + 'titre_admin_vider' => 'Teknika bontenado', |
|
| 862 | + 'titre_ajouter_un_auteur' => 'Aldoni aŭtoro', |
|
| 863 | + 'titre_ajouter_un_mot' => 'Aldoni ŝlosilvorto', |
|
| 864 | + 'titre_cadre_afficher_article' => 'Afiŝi la artikolojn', |
|
| 865 | + 'titre_cadre_afficher_traductions' => 'Afiŝi la traduk-staton por tiuj lingvoj :', |
|
| 866 | + 'titre_cadre_ajouter_auteur' => 'ALDONI AŬTORON :', |
|
| 867 | + 'titre_cadre_interieur_rubrique' => 'Ene de la rubriko', |
|
| 868 | + 'titre_cadre_numero_auteur' => 'AŬTORO NUMERO', |
|
| 869 | + 'titre_cadre_numero_objet' => '@objet@ NUMERO :', |
|
| 870 | + 'titre_cadre_signature_obligatoire' => '<b>Subskribo</b> [deviga]<br />', |
|
| 871 | + 'titre_config_contenu_notifications' => 'Avizoj', |
|
| 872 | + 'titre_config_contenu_prive' => 'En la privata spaco', |
|
| 873 | + 'titre_config_contenu_public' => 'Ĉe la publika retejo', |
|
| 874 | + 'titre_config_fonctions' => 'Agordo de la retejo', |
|
| 875 | + 'titre_config_langage' => 'Agordi la lingvon', |
|
| 876 | + 'titre_configuration' => 'Agordo de la retejo', |
|
| 877 | + 'titre_configurer_preferences' => 'Agordi viajn preferojn', |
|
| 878 | + 'titre_configurer_preferences_menus' => 'Agordi viajn preferatajn menuojn', |
|
| 879 | + 'titre_conflit_edition' => 'Konflikto dum redaktado', |
|
| 880 | + 'titre_connexion_ldap' => 'Opcioj : <b>Via konekto LDAP</b>', |
|
| 881 | + 'titre_groupe_mots' => 'GRUPO DE VORTOJ :', |
|
| 882 | + 'titre_identite_site' => 'Identeco de la retejo', |
|
| 883 | + 'titre_langue_article' => 'Lingvo de la artikolo', |
|
| 884 | + 'titre_langue_rubrique' => 'Lingvo de la rubriko', |
|
| 885 | + 'titre_langue_trad_article' => 'LINGVO KAJ TRADUKOJ DE LA ARTIKOLO', |
|
| 886 | + 'titre_les_articles' => 'LA ARTIKOLOJ', |
|
| 887 | + 'titre_messagerie_agenda' => 'Mesaĝilo kaj agendo', |
|
| 888 | + 'titre_naviguer_dans_le_site' => 'Retejumi...', |
|
| 889 | + 'titre_nouvelle_rubrique' => 'Nova rubriko', |
|
| 890 | + 'titre_numero_rubrique' => 'RUBRIKO NUMERO :', |
|
| 891 | + 'titre_page_articles_edit' => 'Modifi : @titre@', |
|
| 892 | + 'titre_page_articles_page' => 'La artikoloj', |
|
| 893 | + 'titre_page_articles_tous' => 'La tuta retejo', |
|
| 894 | + 'titre_page_calendrier' => 'Kalendaro @nom_mois@ @annee@', |
|
| 895 | + 'titre_page_config_contenu' => 'Agordo de la retejo', |
|
| 896 | + 'titre_page_delete_all' => 'tuta kaj malfarebla forviŝo', |
|
| 897 | + 'titre_page_recherche' => 'Serĉrezulto @recherche@', |
|
| 898 | + 'titre_page_statistiques_referers' => 'Statistikoj (eniraj ligiloj)', |
|
| 899 | + 'titre_page_upgrade' => 'SPIP-alniveligo', |
|
| 900 | + 'titre_preference_menus_favoris' => 'Preferataj menuoj', |
|
| 901 | + 'titre_publication_articles_post_dates' => 'Publikigo de la postdatitaj artikoloj', |
|
| 902 | + 'titre_reparation' => 'Riparo', |
|
| 903 | + 'titre_suivi_petition' => 'Kontrolo de la petskriboj', |
|
| 904 | + 'tls_ldap' => 'Transŝuta tavolsekureco (TLS) :', |
|
| 905 | + 'trad_article_traduction' => 'Ĉiuj versioj de tiu ĉi artikolo :', |
|
| 906 | + 'trad_delier' => 'Ne plu ligi al ties tradukoj', |
|
| 907 | + 'trad_lier' => 'Tiu artikolo estas traduko de la artikolo numero :', |
|
| 908 | + 'trad_new' => 'Skribi novan tradukon', |
|
| 909 | 909 | |
| 910 | - // U |
|
| 911 | - 'utf8_convert_erreur_orig' => 'Eraro : la litertiparo @charset@ ne estas eltenata.', |
|
| 910 | + // U |
|
| 911 | + 'utf8_convert_erreur_orig' => 'Eraro : la litertiparo @charset@ ne estas eltenata.', |
|
| 912 | 912 | |
| 913 | - // V |
|
| 914 | - 'version' => 'Versio :' |
|
| 913 | + // V |
|
| 914 | + 'version' => 'Versio :' |
|
| 915 | 915 | ); |
@@ -4,831 +4,831 @@ discard block |
||
| 4 | 4 | // ** ne pas modifier le fichier ** |
| 5 | 5 | |
| 6 | 6 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 7 | - return; |
|
| 7 | + return; |
|
| 8 | 8 | } |
| 9 | 9 | |
| 10 | 10 | $GLOBALS[$GLOBALS['idx_lang']] = array( |
| 11 | 11 | |
| 12 | - // A |
|
| 13 | - 'activer_plugin' => 'Attiva l’estensione', |
|
| 14 | - 'affichage' => 'Visualizzazione', |
|
| 15 | - 'aide_non_disponible' => 'Questa parte della guida in linea non è ancora disponibile in italiano.', |
|
| 16 | - 'annuler_recherche' => 'Annullare la ricerca', |
|
| 17 | - 'auteur' => 'Autore:', |
|
| 18 | - 'avis_acces_interdit' => 'Accesso vietato.', |
|
| 19 | - 'avis_acces_interdit_prive' => 'Non hai i diritti di accesso per la pagina <b>@exec@</b>.', |
|
| 20 | - 'avis_article_modifie' => 'Attenzione, @nom_auteur_modif@ ha lavorato su quest’articolo @date_diff@ minuti fa', |
|
| 21 | - 'avis_aucun_resultat' => 'Nessun risultato.', |
|
| 22 | - 'avis_base_inaccessible' => 'Impossibile connettersi al database @base@.', |
|
| 23 | - 'avis_chemin_invalide_1' => 'il percorso che hai scelto', |
|
| 24 | - 'avis_chemin_invalide_2' => 'non sembra valido. Torna alla pagina precedente e verifica le informazioni fornite.', |
|
| 25 | - 'avis_connexion_echec_1' => 'Il collegamento alla base di dati è fallito.', |
|
| 26 | - 'avis_connexion_echec_2' => 'Torna alla pagina precedente e verifica le informazioni fornite.', |
|
| 27 | - 'avis_connexion_echec_3' => '<b>N.B.</b> Su molti server si deve <b>chiedere</b> l’attivazione dell’accesso alla base di dati prima di poterlo utilizzare. Se è impossibile collegarsi, verificare che questo passo sia stato fatto.', |
|
| 28 | - 'avis_connexion_erreur_creer_base' => 'Non è stato possibile creare un database.', |
|
| 29 | - 'avis_connexion_erreur_fichier_cle_manquant_1' => 'L’installazione deve essere eseguita da un webmaster con un backup delle credenziali di accesso ', |
|
| 30 | - 'avis_connexion_erreur_fichier_cle_manquant_2' => 'L’installazione deve essere eseguita da un webmaster con un backup delle credenziali', |
|
| 31 | - 'avis_connexion_erreur_nom_base' => 'Il nome del database può contenere solo lettere, numeri e tratti.', |
|
| 32 | - 'avis_connexion_ldap_echec_1' => 'La connessione al server LDAP è fallita.', |
|
| 33 | - 'avis_connexion_ldap_echec_2' => 'Torna alla pagina precedente e verifica le informazioni fornite. ', |
|
| 34 | - 'avis_connexion_ldap_echec_3' => 'In alternativa, non utilizzare il supporto LDAP per importare utenti.', |
|
| 35 | - 'avis_deplacement_rubrique' => 'Attenzione! Questa rubrica contiene @contient_breves@ breve/i: se vuoi spostarla, spunta questa casella per confermare.', |
|
| 36 | - 'avis_erreur_connexion_mysql' => 'Errore di connessione SQL', |
|
| 37 | - 'avis_erreur_creation_compte' => 'Impossibile inizializzare l’account', |
|
| 38 | - 'avis_espace_interdit' => '<b>Area vietata</b> <div>SPIP è già installato.</div>', |
|
| 39 | - 'avis_lecture_noms_bases_1' => 'Il programma di installazione non ha potuto leggere i nomi dei database installati nel server.', |
|
| 40 | - 'avis_lecture_noms_bases_2' => 'Nessun database è disponibile, o la funzione che permette di accedere alla lista database è |
|
| 12 | + // A |
|
| 13 | + 'activer_plugin' => 'Attiva l’estensione', |
|
| 14 | + 'affichage' => 'Visualizzazione', |
|
| 15 | + 'aide_non_disponible' => 'Questa parte della guida in linea non è ancora disponibile in italiano.', |
|
| 16 | + 'annuler_recherche' => 'Annullare la ricerca', |
|
| 17 | + 'auteur' => 'Autore:', |
|
| 18 | + 'avis_acces_interdit' => 'Accesso vietato.', |
|
| 19 | + 'avis_acces_interdit_prive' => 'Non hai i diritti di accesso per la pagina <b>@exec@</b>.', |
|
| 20 | + 'avis_article_modifie' => 'Attenzione, @nom_auteur_modif@ ha lavorato su quest’articolo @date_diff@ minuti fa', |
|
| 21 | + 'avis_aucun_resultat' => 'Nessun risultato.', |
|
| 22 | + 'avis_base_inaccessible' => 'Impossibile connettersi al database @base@.', |
|
| 23 | + 'avis_chemin_invalide_1' => 'il percorso che hai scelto', |
|
| 24 | + 'avis_chemin_invalide_2' => 'non sembra valido. Torna alla pagina precedente e verifica le informazioni fornite.', |
|
| 25 | + 'avis_connexion_echec_1' => 'Il collegamento alla base di dati è fallito.', |
|
| 26 | + 'avis_connexion_echec_2' => 'Torna alla pagina precedente e verifica le informazioni fornite.', |
|
| 27 | + 'avis_connexion_echec_3' => '<b>N.B.</b> Su molti server si deve <b>chiedere</b> l’attivazione dell’accesso alla base di dati prima di poterlo utilizzare. Se è impossibile collegarsi, verificare che questo passo sia stato fatto.', |
|
| 28 | + 'avis_connexion_erreur_creer_base' => 'Non è stato possibile creare un database.', |
|
| 29 | + 'avis_connexion_erreur_fichier_cle_manquant_1' => 'L’installazione deve essere eseguita da un webmaster con un backup delle credenziali di accesso ', |
|
| 30 | + 'avis_connexion_erreur_fichier_cle_manquant_2' => 'L’installazione deve essere eseguita da un webmaster con un backup delle credenziali', |
|
| 31 | + 'avis_connexion_erreur_nom_base' => 'Il nome del database può contenere solo lettere, numeri e tratti.', |
|
| 32 | + 'avis_connexion_ldap_echec_1' => 'La connessione al server LDAP è fallita.', |
|
| 33 | + 'avis_connexion_ldap_echec_2' => 'Torna alla pagina precedente e verifica le informazioni fornite. ', |
|
| 34 | + 'avis_connexion_ldap_echec_3' => 'In alternativa, non utilizzare il supporto LDAP per importare utenti.', |
|
| 35 | + 'avis_deplacement_rubrique' => 'Attenzione! Questa rubrica contiene @contient_breves@ breve/i: se vuoi spostarla, spunta questa casella per confermare.', |
|
| 36 | + 'avis_erreur_connexion_mysql' => 'Errore di connessione SQL', |
|
| 37 | + 'avis_erreur_creation_compte' => 'Impossibile inizializzare l’account', |
|
| 38 | + 'avis_espace_interdit' => '<b>Area vietata</b> <div>SPIP è già installato.</div>', |
|
| 39 | + 'avis_lecture_noms_bases_1' => 'Il programma di installazione non ha potuto leggere i nomi dei database installati nel server.', |
|
| 40 | + 'avis_lecture_noms_bases_2' => 'Nessun database è disponibile, o la funzione che permette di accedere alla lista database è |
|
| 41 | 41 | disattivata per motivi sicurezza (verifica con l’amministratore di sistema).', |
| 42 | - 'avis_lecture_noms_bases_3' => 'Nel secondo caso, è probabile che un database con il tuo nome di login sia utilizzabile:', |
|
| 43 | - 'avis_non_acces_page' => 'Non hai accesso a questa pagina.', |
|
| 44 | - 'avis_operation_echec' => 'L’operazione è fallita.', |
|
| 45 | - 'avis_operation_impossible' => 'Operazione impossibile', |
|
| 46 | - 'avis_suppression_base' => 'ATTENZIONE, la cancellazione dei dati è irreversibile', |
|
| 42 | + 'avis_lecture_noms_bases_3' => 'Nel secondo caso, è probabile che un database con il tuo nome di login sia utilizzabile:', |
|
| 43 | + 'avis_non_acces_page' => 'Non hai accesso a questa pagina.', |
|
| 44 | + 'avis_operation_echec' => 'L’operazione è fallita.', |
|
| 45 | + 'avis_operation_impossible' => 'Operazione impossibile', |
|
| 46 | + 'avis_suppression_base' => 'ATTENZIONE, la cancellazione dei dati è irreversibile', |
|
| 47 | 47 | |
| 48 | - // B |
|
| 49 | - 'bouton_acces_ldap' => 'Aggiungi l’accesso a LDAP ', |
|
| 50 | - 'bouton_ajouter' => 'Aggiungi', |
|
| 51 | - 'bouton_annuler' => 'Annulla', |
|
| 52 | - 'bouton_cache_activer' => 'Riattivare la cache', |
|
| 53 | - 'bouton_cache_desactiver' => 'Disabilita temporaneamente la cache', |
|
| 54 | - 'bouton_demande_publication' => 'Chiedi la pubblicazione di questo articolo', |
|
| 55 | - 'bouton_desactive_tout' => 'Disattiva tutto', |
|
| 56 | - 'bouton_desinstaller' => 'Disinstalla', |
|
| 57 | - 'bouton_effacer_tout' => 'Cancella TUTTO', |
|
| 58 | - 'bouton_envoyer_message' => 'Messaggio definitivo: Invia', |
|
| 59 | - 'bouton_fermer' => 'Chiudi', |
|
| 60 | - 'bouton_mettre_a_jour_base' => 'Aggiorna il database', |
|
| 61 | - 'bouton_modifier' => 'Modifica', |
|
| 62 | - 'bouton_radio_afficher' => 'Visualizza', |
|
| 63 | - 'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Comparire nell’elenco dei redattori collegati', |
|
| 64 | - 'bouton_radio_envoi_annonces_adresse' => 'Invia gli annunci all’indirizzo:', |
|
| 65 | - 'bouton_radio_envoi_liste_nouveautes' => 'Invia l’elenco delle novità', |
|
| 66 | - 'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Non comparire nell’elenco dei redattori collegati ', |
|
| 67 | - 'bouton_radio_non_envoi_annonces_editoriales' => 'Non inviare annunci editoriali ', |
|
| 68 | - 'bouton_redirection' => 'REINDIRIZZAMENTO', |
|
| 69 | - 'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Ripristina i valori predefiniti', |
|
| 70 | - 'bouton_relancer_inscription' => 'Riavvia l’iscrizione', |
|
| 71 | - 'bouton_relancer_inscriptions' => 'Riavvia le registrazioni', |
|
| 72 | - 'bouton_relancer_installation' => 'Rilanciare l’installazione', |
|
| 73 | - 'bouton_reset_password' => 'Genera una nuova password ed inviala per email', |
|
| 74 | - 'bouton_suivant' => 'Avanti', |
|
| 75 | - 'bouton_tenter_recuperation' => 'Tentare un ripristino', |
|
| 76 | - 'bouton_test_proxy' => 'Testare il proxy', |
|
| 77 | - 'bouton_vider_cache' => 'Svuota la cache', |
|
| 48 | + // B |
|
| 49 | + 'bouton_acces_ldap' => 'Aggiungi l’accesso a LDAP ', |
|
| 50 | + 'bouton_ajouter' => 'Aggiungi', |
|
| 51 | + 'bouton_annuler' => 'Annulla', |
|
| 52 | + 'bouton_cache_activer' => 'Riattivare la cache', |
|
| 53 | + 'bouton_cache_desactiver' => 'Disabilita temporaneamente la cache', |
|
| 54 | + 'bouton_demande_publication' => 'Chiedi la pubblicazione di questo articolo', |
|
| 55 | + 'bouton_desactive_tout' => 'Disattiva tutto', |
|
| 56 | + 'bouton_desinstaller' => 'Disinstalla', |
|
| 57 | + 'bouton_effacer_tout' => 'Cancella TUTTO', |
|
| 58 | + 'bouton_envoyer_message' => 'Messaggio definitivo: Invia', |
|
| 59 | + 'bouton_fermer' => 'Chiudi', |
|
| 60 | + 'bouton_mettre_a_jour_base' => 'Aggiorna il database', |
|
| 61 | + 'bouton_modifier' => 'Modifica', |
|
| 62 | + 'bouton_radio_afficher' => 'Visualizza', |
|
| 63 | + 'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Comparire nell’elenco dei redattori collegati', |
|
| 64 | + 'bouton_radio_envoi_annonces_adresse' => 'Invia gli annunci all’indirizzo:', |
|
| 65 | + 'bouton_radio_envoi_liste_nouveautes' => 'Invia l’elenco delle novità', |
|
| 66 | + 'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Non comparire nell’elenco dei redattori collegati ', |
|
| 67 | + 'bouton_radio_non_envoi_annonces_editoriales' => 'Non inviare annunci editoriali ', |
|
| 68 | + 'bouton_redirection' => 'REINDIRIZZAMENTO', |
|
| 69 | + 'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Ripristina i valori predefiniti', |
|
| 70 | + 'bouton_relancer_inscription' => 'Riavvia l’iscrizione', |
|
| 71 | + 'bouton_relancer_inscriptions' => 'Riavvia le registrazioni', |
|
| 72 | + 'bouton_relancer_installation' => 'Rilanciare l’installazione', |
|
| 73 | + 'bouton_reset_password' => 'Genera una nuova password ed inviala per email', |
|
| 74 | + 'bouton_suivant' => 'Avanti', |
|
| 75 | + 'bouton_tenter_recuperation' => 'Tentare un ripristino', |
|
| 76 | + 'bouton_test_proxy' => 'Testare il proxy', |
|
| 77 | + 'bouton_vider_cache' => 'Svuota la cache', |
|
| 78 | 78 | |
| 79 | - // C |
|
| 80 | - 'cache_modifiable_webmestre' => 'Questo parametro può essere modificato dal webmaster del sito.', |
|
| 81 | - 'calendrier_synchro' => 'Se si utilizza un programma di agenda compatibile con <b>iCal</b>, è possibile sincronizzare i dati con le informazioni di questo sito', |
|
| 82 | - 'config_activer_champs' => 'Attiva i campi seguenti', |
|
| 83 | - 'config_choix_base_sup' => 'indicare un database su questo server', |
|
| 84 | - 'config_erreur_base_sup' => 'SPIP non ha accesso all’elenco dei database accessibili ', |
|
| 85 | - 'config_info_base_sup' => 'Se si hanno altri database da interrogare attraverso SPIP, con il proprio server SQL o altro, il form sottostante permette di dichiararli. Se si lasciano alcuni campi vuoti verranno utilizzati i dati della connessione al database principale.', |
|
| 86 | - 'config_info_base_sup_disponibles' => 'Database supplementari già dichiarati:', |
|
| 87 | - 'config_info_enregistree' => 'La nuova configurazione è stata registrata', |
|
| 88 | - 'config_info_logos' => 'Ogni elemento del sito può avere un logo, come pure un « logo per il roll-over »', |
|
| 89 | - 'config_info_logos_utiliser' => 'Utilizza i logo', |
|
| 90 | - 'config_info_logos_utiliser_non' => 'Non utilizzare i logo', |
|
| 91 | - 'config_info_logos_utiliser_survol' => 'Utilizzare i logo di roll-over', |
|
| 92 | - 'config_info_logos_utiliser_survol_non' => 'Non utilizzare i logo di roll-over', |
|
| 93 | - 'config_info_redirection' => 'Attivando questa opzione è possibile creare degli articoli virtuali, semplici riferimenti di articoli pubblicati su altri siti o al di fuori di SPIP.', |
|
| 94 | - 'config_redirection' => 'Articoli virtuali', |
|
| 95 | - 'config_titre_base_sup' => 'Dichiarazione di un database supplementare', |
|
| 96 | - 'config_titre_base_sup_choix' => 'Scegliere un database supplementare', |
|
| 97 | - 'connexion_ldap' => 'Connessione:', |
|
| 98 | - 'creer_et_associer_un_auteur' => 'Crea e associa un’autore', |
|
| 79 | + // C |
|
| 80 | + 'cache_modifiable_webmestre' => 'Questo parametro può essere modificato dal webmaster del sito.', |
|
| 81 | + 'calendrier_synchro' => 'Se si utilizza un programma di agenda compatibile con <b>iCal</b>, è possibile sincronizzare i dati con le informazioni di questo sito', |
|
| 82 | + 'config_activer_champs' => 'Attiva i campi seguenti', |
|
| 83 | + 'config_choix_base_sup' => 'indicare un database su questo server', |
|
| 84 | + 'config_erreur_base_sup' => 'SPIP non ha accesso all’elenco dei database accessibili ', |
|
| 85 | + 'config_info_base_sup' => 'Se si hanno altri database da interrogare attraverso SPIP, con il proprio server SQL o altro, il form sottostante permette di dichiararli. Se si lasciano alcuni campi vuoti verranno utilizzati i dati della connessione al database principale.', |
|
| 86 | + 'config_info_base_sup_disponibles' => 'Database supplementari già dichiarati:', |
|
| 87 | + 'config_info_enregistree' => 'La nuova configurazione è stata registrata', |
|
| 88 | + 'config_info_logos' => 'Ogni elemento del sito può avere un logo, come pure un « logo per il roll-over »', |
|
| 89 | + 'config_info_logos_utiliser' => 'Utilizza i logo', |
|
| 90 | + 'config_info_logos_utiliser_non' => 'Non utilizzare i logo', |
|
| 91 | + 'config_info_logos_utiliser_survol' => 'Utilizzare i logo di roll-over', |
|
| 92 | + 'config_info_logos_utiliser_survol_non' => 'Non utilizzare i logo di roll-over', |
|
| 93 | + 'config_info_redirection' => 'Attivando questa opzione è possibile creare degli articoli virtuali, semplici riferimenti di articoli pubblicati su altri siti o al di fuori di SPIP.', |
|
| 94 | + 'config_redirection' => 'Articoli virtuali', |
|
| 95 | + 'config_titre_base_sup' => 'Dichiarazione di un database supplementare', |
|
| 96 | + 'config_titre_base_sup_choix' => 'Scegliere un database supplementare', |
|
| 97 | + 'connexion_ldap' => 'Connessione:', |
|
| 98 | + 'creer_et_associer_un_auteur' => 'Crea e associa un’autore', |
|
| 99 | 99 | |
| 100 | - // D |
|
| 101 | - 'date_mot_heures' => 'ore', |
|
| 100 | + // D |
|
| 101 | + 'date_mot_heures' => 'ore', |
|
| 102 | 102 | |
| 103 | - // E |
|
| 104 | - 'ecran_connexion_couleur_principale' => 'Colore principale', |
|
| 105 | - 'ecran_connexion_image_fond' => 'Immagine di sfondo', |
|
| 106 | - 'ecran_connexion_image_fond_explication' => 'Usa un’immagine (formato JPEG, 1920x1080 pixel)', |
|
| 107 | - 'ecran_connexion_image_revenir_couleur_defaut' => 'Reimposta il colore predefinito', |
|
| 108 | - 'ecran_connexion_titre' => 'Schermata di accesso', |
|
| 109 | - 'ecran_securite' => ' + sicurezza dello schermo @version@', |
|
| 110 | - 'email' => 'email', |
|
| 111 | - 'email_2' => 'email:', |
|
| 112 | - 'en_savoir_plus' => 'Per saperne di più', |
|
| 113 | - 'entree_adresse_annuaire' => 'Indirizzo della rubrica', |
|
| 114 | - 'entree_adresse_email' => 'Il tuo indirizzo email', |
|
| 115 | - 'entree_adresse_email_2' => 'Indirizzo e-mail', |
|
| 116 | - 'entree_base_donnee_1' => 'Indirizzo del database', |
|
| 117 | - 'entree_base_donnee_2' => '(Spesso questo indirizzo coincide con quello dell’intero sito, qualche volta corrisponde a "localhost", altre volte invece non è necessario specificarlo.)', |
|
| 118 | - 'entree_biographie' => 'La tua biografia in breve.', |
|
| 119 | - 'entree_chemin_acces' => '<b>Inserire</b> il percorso d’accesso:', |
|
| 120 | - 'entree_cle_pgp' => 'Chiave PGP', |
|
| 121 | - 'entree_cle_pgp_2' => 'Chiave PGP', |
|
| 122 | - 'entree_contenu_rubrique' => '(Contenuto della rubrica in qualche parola)', |
|
| 123 | - 'entree_identifiants_connexion' => 'Identificativo di connessione...', |
|
| 124 | - 'entree_identifiants_connexion_2' => 'Indentificativo di connessione', |
|
| 125 | - 'entree_informations_connexion_ldap' => 'Inserisci in questo form gli estremi per la connessione alla tua rubrica LDAP. |
|
| 103 | + // E |
|
| 104 | + 'ecran_connexion_couleur_principale' => 'Colore principale', |
|
| 105 | + 'ecran_connexion_image_fond' => 'Immagine di sfondo', |
|
| 106 | + 'ecran_connexion_image_fond_explication' => 'Usa un’immagine (formato JPEG, 1920x1080 pixel)', |
|
| 107 | + 'ecran_connexion_image_revenir_couleur_defaut' => 'Reimposta il colore predefinito', |
|
| 108 | + 'ecran_connexion_titre' => 'Schermata di accesso', |
|
| 109 | + 'ecran_securite' => ' + sicurezza dello schermo @version@', |
|
| 110 | + 'email' => 'email', |
|
| 111 | + 'email_2' => 'email:', |
|
| 112 | + 'en_savoir_plus' => 'Per saperne di più', |
|
| 113 | + 'entree_adresse_annuaire' => 'Indirizzo della rubrica', |
|
| 114 | + 'entree_adresse_email' => 'Il tuo indirizzo email', |
|
| 115 | + 'entree_adresse_email_2' => 'Indirizzo e-mail', |
|
| 116 | + 'entree_base_donnee_1' => 'Indirizzo del database', |
|
| 117 | + 'entree_base_donnee_2' => '(Spesso questo indirizzo coincide con quello dell’intero sito, qualche volta corrisponde a "localhost", altre volte invece non è necessario specificarlo.)', |
|
| 118 | + 'entree_biographie' => 'La tua biografia in breve.', |
|
| 119 | + 'entree_chemin_acces' => '<b>Inserire</b> il percorso d’accesso:', |
|
| 120 | + 'entree_cle_pgp' => 'Chiave PGP', |
|
| 121 | + 'entree_cle_pgp_2' => 'Chiave PGP', |
|
| 122 | + 'entree_contenu_rubrique' => '(Contenuto della rubrica in qualche parola)', |
|
| 123 | + 'entree_identifiants_connexion' => 'Identificativo di connessione...', |
|
| 124 | + 'entree_identifiants_connexion_2' => 'Indentificativo di connessione', |
|
| 125 | + 'entree_informations_connexion_ldap' => 'Inserisci in questo form gli estremi per la connessione alla tua rubrica LDAP. |
|
| 126 | 126 | Se non conosci queste informazioni, richiedile all’amministratore del sistema o della rete.', |
| 127 | - 'entree_infos_perso' => 'Chi sei?', |
|
| 128 | - 'entree_infos_perso_2' => 'Chi è l’autore?', |
|
| 129 | - 'entree_interieur_rubrique' => 'All’interno della rubrica:', |
|
| 130 | - 'entree_liens_sites' => '<b>Link ipertestuale</b> (riferimento, sito da visitare...)', |
|
| 131 | - 'entree_login' => 'Login', |
|
| 132 | - 'entree_login_connexion_1' => 'Il login di connessione', |
|
| 133 | - 'entree_login_connexion_2' => '(Corrisponde a volte al login d’accesso via FTP; in alcuni casi non occorre specificare nulla)', |
|
| 134 | - 'entree_mot_passe' => 'Password', |
|
| 135 | - 'entree_mot_passe_1' => 'La password di connessione', |
|
| 136 | - 'entree_mot_passe_2' => '(Corrisponde a volte alla password d’accesso via FTP; in alcuni casi non occorre specificare nulla)', |
|
| 137 | - 'entree_nom_fichier' => 'Inserire il nome del file @texte_compresse@:', |
|
| 138 | - 'entree_nom_pseudo' => 'Nome o pseudonimo', |
|
| 139 | - 'entree_nom_pseudo_1' => '(Nome o pseudonimo)', |
|
| 140 | - 'entree_nom_pseudo_2' => 'Nome o alias', |
|
| 141 | - 'entree_nom_site' => 'Nome del tuo sito', |
|
| 142 | - 'entree_nom_site_2' => 'Nome del sito dell’autore', |
|
| 143 | - 'entree_nouveau_passe' => 'Nuova password', |
|
| 144 | - 'entree_passe_ldap' => 'Password', |
|
| 145 | - 'entree_port_annuaire' => 'Il numero di porta della rubrica', |
|
| 146 | - 'entree_signature' => 'Firma', |
|
| 147 | - 'entree_titre_obligatoire' => '<b>Titolo</b> [Obbligatorio]<br />', |
|
| 148 | - 'entree_url' => 'Indirizzo (URL) del sito', |
|
| 149 | - 'entree_url_2' => 'Indirizzo del sito', |
|
| 150 | - 'erreur_connect_deja_existant' => 'Esista già un server con quel nome', |
|
| 151 | - 'erreur_contenu_suspect' => 'Testo sfuggito', |
|
| 152 | - 'erreur_email_deja_existant' => 'Questo indirizzo email risulta già registrato.', |
|
| 153 | - 'erreur_nom_connect_incorrect' => 'Nome del server non consentito', |
|
| 154 | - 'erreur_plugin_attribut_balise_manquant' => 'Attributo @attribut@ mancante nel tag @balise@.', |
|
| 155 | - 'erreur_plugin_desinstalation_echouee' => 'La disinstallazione del plugin è fallita. In ogni caso potete disattivarlo.', |
|
| 156 | - 'erreur_plugin_fichier_absent' => 'File non presente', |
|
| 157 | - 'erreur_plugin_fichier_def_absent' => 'File di definizioni non presente', |
|
| 158 | - 'erreur_plugin_nom_fonction_interdit' => 'Nome di funzione non possibile', |
|
| 159 | - 'erreur_plugin_nom_manquant' => 'Nome del plugin mancante', |
|
| 160 | - 'erreur_plugin_prefix_manquant' => 'Spazio per il nome del plugin non definito', |
|
| 161 | - 'erreur_plugin_tag_plugin_absent' => '<plugin> mancante nel file di definizione', |
|
| 162 | - 'erreur_plugin_version_manquant' => 'Versione del plugin mancante', |
|
| 163 | - 'erreur_type_fichier' => 'Tipo di file non corretto', |
|
| 127 | + 'entree_infos_perso' => 'Chi sei?', |
|
| 128 | + 'entree_infos_perso_2' => 'Chi è l’autore?', |
|
| 129 | + 'entree_interieur_rubrique' => 'All’interno della rubrica:', |
|
| 130 | + 'entree_liens_sites' => '<b>Link ipertestuale</b> (riferimento, sito da visitare...)', |
|
| 131 | + 'entree_login' => 'Login', |
|
| 132 | + 'entree_login_connexion_1' => 'Il login di connessione', |
|
| 133 | + 'entree_login_connexion_2' => '(Corrisponde a volte al login d’accesso via FTP; in alcuni casi non occorre specificare nulla)', |
|
| 134 | + 'entree_mot_passe' => 'Password', |
|
| 135 | + 'entree_mot_passe_1' => 'La password di connessione', |
|
| 136 | + 'entree_mot_passe_2' => '(Corrisponde a volte alla password d’accesso via FTP; in alcuni casi non occorre specificare nulla)', |
|
| 137 | + 'entree_nom_fichier' => 'Inserire il nome del file @texte_compresse@:', |
|
| 138 | + 'entree_nom_pseudo' => 'Nome o pseudonimo', |
|
| 139 | + 'entree_nom_pseudo_1' => '(Nome o pseudonimo)', |
|
| 140 | + 'entree_nom_pseudo_2' => 'Nome o alias', |
|
| 141 | + 'entree_nom_site' => 'Nome del tuo sito', |
|
| 142 | + 'entree_nom_site_2' => 'Nome del sito dell’autore', |
|
| 143 | + 'entree_nouveau_passe' => 'Nuova password', |
|
| 144 | + 'entree_passe_ldap' => 'Password', |
|
| 145 | + 'entree_port_annuaire' => 'Il numero di porta della rubrica', |
|
| 146 | + 'entree_signature' => 'Firma', |
|
| 147 | + 'entree_titre_obligatoire' => '<b>Titolo</b> [Obbligatorio]<br />', |
|
| 148 | + 'entree_url' => 'Indirizzo (URL) del sito', |
|
| 149 | + 'entree_url_2' => 'Indirizzo del sito', |
|
| 150 | + 'erreur_connect_deja_existant' => 'Esista già un server con quel nome', |
|
| 151 | + 'erreur_contenu_suspect' => 'Testo sfuggito', |
|
| 152 | + 'erreur_email_deja_existant' => 'Questo indirizzo email risulta già registrato.', |
|
| 153 | + 'erreur_nom_connect_incorrect' => 'Nome del server non consentito', |
|
| 154 | + 'erreur_plugin_attribut_balise_manquant' => 'Attributo @attribut@ mancante nel tag @balise@.', |
|
| 155 | + 'erreur_plugin_desinstalation_echouee' => 'La disinstallazione del plugin è fallita. In ogni caso potete disattivarlo.', |
|
| 156 | + 'erreur_plugin_fichier_absent' => 'File non presente', |
|
| 157 | + 'erreur_plugin_fichier_def_absent' => 'File di definizioni non presente', |
|
| 158 | + 'erreur_plugin_nom_fonction_interdit' => 'Nome di funzione non possibile', |
|
| 159 | + 'erreur_plugin_nom_manquant' => 'Nome del plugin mancante', |
|
| 160 | + 'erreur_plugin_prefix_manquant' => 'Spazio per il nome del plugin non definito', |
|
| 161 | + 'erreur_plugin_tag_plugin_absent' => '<plugin> mancante nel file di definizione', |
|
| 162 | + 'erreur_plugin_version_manquant' => 'Versione del plugin mancante', |
|
| 163 | + 'erreur_type_fichier' => 'Tipo di file non corretto', |
|
| 164 | 164 | |
| 165 | - // H |
|
| 166 | - 'htaccess_a_simuler' => 'Attenzione: la configurazione del tuo HTTP server ignora il file @htaccess@. Per garantire un buon livello di sicurezza devi modificare la configurazione del server per questa impostazione, oppure devi assicurarti che la costante @constantes@ (definibile nel file mes_options.php) sia valorizzata con una perocorso di directory posta al di fuori di @document_root@.', |
|
| 167 | - 'htaccess_inoperant' => 'htaccess non attivo', |
|
| 165 | + // H |
|
| 166 | + 'htaccess_a_simuler' => 'Attenzione: la configurazione del tuo HTTP server ignora il file @htaccess@. Per garantire un buon livello di sicurezza devi modificare la configurazione del server per questa impostazione, oppure devi assicurarti che la costante @constantes@ (definibile nel file mes_options.php) sia valorizzata con una perocorso di directory posta al di fuori di @document_root@.', |
|
| 167 | + 'htaccess_inoperant' => 'htaccess non attivo', |
|
| 168 | 168 | |
| 169 | - // I |
|
| 170 | - 'ical_info1' => 'Questa pagina elenca diversi metodi per rimanere in contatto con le varie attività del sito.', |
|
| 171 | - 'ical_info2' => 'Per ulteriori informazioni su tutte queste tecniche, non esitate a consultare <a href="@spipnet@">la documentazione di SPIP</a>.', |
|
| 172 | - 'ical_info_calendrier' => 'Sono disponibili due calendari. Il primo è una mappa del sito che annuncia tutti gli articoli pubblicati. Il secondo contiene gli annunci editoriali e gli ultimi messaggi privati: è un’area riservata, mediante identificativo personale, che è possibile modificare in qualsiasi momento rinnovando la password personale.', |
|
| 173 | - 'ical_methode_http' => 'Download', |
|
| 174 | - 'ical_methode_webcal' => 'Sincronizzazione (webcal://)', |
|
| 175 | - 'ical_texte_js' => 'Una linea in javascript permette di visualizzare, con molta semplicità e su qualsiasi tipo di sito, gli articoli recenti pubblicati su questo sito.', |
|
| 176 | - 'ical_texte_prive' => 'Questo calendario, ad uso strettamente privato, dà informazioni sull’attività redazionale privata di questo sito (impegni e appuntamenti personali, articoli e brevi proposti...).', |
|
| 177 | - 'ical_texte_public' => 'Questo calendario permette di monitorare l’attività pubblica del sito (articoli e brevi pubblicati).', |
|
| 178 | - 'ical_texte_rss' => 'È possibile mettere in syndication le novità di questo sito con qualsiasi lettore di file in formato XML/RSS (Rich Site Summary). Questo è il medesimo formato che permette a SPIP di leggere le novità pubblicate su altri siti che utilizzano un formato di scambio compatibile.', |
|
| 179 | - 'ical_titre_js' => 'Javascript', |
|
| 180 | - 'ical_titre_mailing' => 'Mailing-list', |
|
| 181 | - 'ical_titre_rss' => 'File di syndication', |
|
| 182 | - 'icone_accueil' => 'Pannello di controllo', |
|
| 183 | - 'icone_activer_cookie' => 'Attiva il cookie di corrispondenza', |
|
| 184 | - 'icone_activite' => 'Attività', |
|
| 185 | - 'icone_admin_plugin' => 'Gestione dei plugin', |
|
| 186 | - 'icone_administration' => 'Manutenzione', |
|
| 187 | - 'icone_afficher_auteurs' => 'Pubblica gli autori', |
|
| 188 | - 'icone_afficher_visiteurs' => 'Pubblica i visitatori', |
|
| 189 | - 'icone_arret_discussion' => 'Non partecipare più a questa discussione', |
|
| 190 | - 'icone_calendrier' => 'Calendario', |
|
| 191 | - 'icone_configuration' => 'Configurazione', |
|
| 192 | - 'icone_creer_auteur' => 'Crea un nuovo autore ed associalo a questo articolo', |
|
| 193 | - 'icone_creer_mot_cle' => 'Crea una nuova parola chiave e collegala a questo articolo', |
|
| 194 | - 'icone_creer_rubrique_2' => 'Crea una nuova rubrica', |
|
| 195 | - 'icone_developpement' => 'Sviluppo', |
|
| 196 | - 'icone_edition' => 'Modifica', |
|
| 197 | - 'icone_ma_langue' => 'La mia lingua', |
|
| 198 | - 'icone_mes_infos' => 'Le mie informazioni', |
|
| 199 | - 'icone_mes_preferences' => 'Le mie preferenze', |
|
| 200 | - 'icone_modifier_article' => 'Modifica l’articolo', |
|
| 201 | - 'icone_modifier_rubrique' => 'Modifica la rubrica', |
|
| 202 | - 'icone_publication' => 'Pubblicazione', |
|
| 203 | - 'icone_relancer_signataire' => 'Rilanciare il firmatario', |
|
| 204 | - 'icone_retour' => 'Indietro', |
|
| 205 | - 'icone_retour_article' => 'Torna all’articolo', |
|
| 206 | - 'icone_squelette' => 'Modelli', |
|
| 207 | - 'icone_suivi_publication' => 'Segui la pubblicazione', |
|
| 208 | - 'icone_supprimer_cookie' => 'Elimina il cookie di corrispondenza', |
|
| 209 | - 'icone_supprimer_rubrique' => 'Elimina la rubrica', |
|
| 210 | - 'icone_supprimer_signature' => 'Cancella l’adesione', |
|
| 211 | - 'icone_valider_signature' => 'Conferma l’adesione', |
|
| 212 | - 'image_administrer_rubrique' => 'Puoi amministrare questa rubrica', |
|
| 213 | - 'impossible_modifier_login_auteur' => 'Impossibile modificare le credenziali d’accesso', |
|
| 214 | - 'impossible_modifier_pass_auteur' => 'Impossibile modificare la password.', # Impossibile modificare la password |
|
| 215 | - 'info_1_article' => '1 articolo', |
|
| 216 | - 'info_1_auteur' => '1 autore', |
|
| 217 | - 'info_1_message' => '1 messaggio', |
|
| 218 | - 'info_1_mot_cle' => '1 parola chiave', |
|
| 219 | - 'info_1_rubrique' => '1 rubrica', |
|
| 220 | - 'info_1_visiteur' => '1 visitatore', |
|
| 221 | - 'info_activer_cookie' => 'Se vuoi puoi attivare un <b>cookie di corrispondenza</b>, che ti permetterà |
|
| 169 | + // I |
|
| 170 | + 'ical_info1' => 'Questa pagina elenca diversi metodi per rimanere in contatto con le varie attività del sito.', |
|
| 171 | + 'ical_info2' => 'Per ulteriori informazioni su tutte queste tecniche, non esitate a consultare <a href="@spipnet@">la documentazione di SPIP</a>.', |
|
| 172 | + 'ical_info_calendrier' => 'Sono disponibili due calendari. Il primo è una mappa del sito che annuncia tutti gli articoli pubblicati. Il secondo contiene gli annunci editoriali e gli ultimi messaggi privati: è un’area riservata, mediante identificativo personale, che è possibile modificare in qualsiasi momento rinnovando la password personale.', |
|
| 173 | + 'ical_methode_http' => 'Download', |
|
| 174 | + 'ical_methode_webcal' => 'Sincronizzazione (webcal://)', |
|
| 175 | + 'ical_texte_js' => 'Una linea in javascript permette di visualizzare, con molta semplicità e su qualsiasi tipo di sito, gli articoli recenti pubblicati su questo sito.', |
|
| 176 | + 'ical_texte_prive' => 'Questo calendario, ad uso strettamente privato, dà informazioni sull’attività redazionale privata di questo sito (impegni e appuntamenti personali, articoli e brevi proposti...).', |
|
| 177 | + 'ical_texte_public' => 'Questo calendario permette di monitorare l’attività pubblica del sito (articoli e brevi pubblicati).', |
|
| 178 | + 'ical_texte_rss' => 'È possibile mettere in syndication le novità di questo sito con qualsiasi lettore di file in formato XML/RSS (Rich Site Summary). Questo è il medesimo formato che permette a SPIP di leggere le novità pubblicate su altri siti che utilizzano un formato di scambio compatibile.', |
|
| 179 | + 'ical_titre_js' => 'Javascript', |
|
| 180 | + 'ical_titre_mailing' => 'Mailing-list', |
|
| 181 | + 'ical_titre_rss' => 'File di syndication', |
|
| 182 | + 'icone_accueil' => 'Pannello di controllo', |
|
| 183 | + 'icone_activer_cookie' => 'Attiva il cookie di corrispondenza', |
|
| 184 | + 'icone_activite' => 'Attività', |
|
| 185 | + 'icone_admin_plugin' => 'Gestione dei plugin', |
|
| 186 | + 'icone_administration' => 'Manutenzione', |
|
| 187 | + 'icone_afficher_auteurs' => 'Pubblica gli autori', |
|
| 188 | + 'icone_afficher_visiteurs' => 'Pubblica i visitatori', |
|
| 189 | + 'icone_arret_discussion' => 'Non partecipare più a questa discussione', |
|
| 190 | + 'icone_calendrier' => 'Calendario', |
|
| 191 | + 'icone_configuration' => 'Configurazione', |
|
| 192 | + 'icone_creer_auteur' => 'Crea un nuovo autore ed associalo a questo articolo', |
|
| 193 | + 'icone_creer_mot_cle' => 'Crea una nuova parola chiave e collegala a questo articolo', |
|
| 194 | + 'icone_creer_rubrique_2' => 'Crea una nuova rubrica', |
|
| 195 | + 'icone_developpement' => 'Sviluppo', |
|
| 196 | + 'icone_edition' => 'Modifica', |
|
| 197 | + 'icone_ma_langue' => 'La mia lingua', |
|
| 198 | + 'icone_mes_infos' => 'Le mie informazioni', |
|
| 199 | + 'icone_mes_preferences' => 'Le mie preferenze', |
|
| 200 | + 'icone_modifier_article' => 'Modifica l’articolo', |
|
| 201 | + 'icone_modifier_rubrique' => 'Modifica la rubrica', |
|
| 202 | + 'icone_publication' => 'Pubblicazione', |
|
| 203 | + 'icone_relancer_signataire' => 'Rilanciare il firmatario', |
|
| 204 | + 'icone_retour' => 'Indietro', |
|
| 205 | + 'icone_retour_article' => 'Torna all’articolo', |
|
| 206 | + 'icone_squelette' => 'Modelli', |
|
| 207 | + 'icone_suivi_publication' => 'Segui la pubblicazione', |
|
| 208 | + 'icone_supprimer_cookie' => 'Elimina il cookie di corrispondenza', |
|
| 209 | + 'icone_supprimer_rubrique' => 'Elimina la rubrica', |
|
| 210 | + 'icone_supprimer_signature' => 'Cancella l’adesione', |
|
| 211 | + 'icone_valider_signature' => 'Conferma l’adesione', |
|
| 212 | + 'image_administrer_rubrique' => 'Puoi amministrare questa rubrica', |
|
| 213 | + 'impossible_modifier_login_auteur' => 'Impossibile modificare le credenziali d’accesso', |
|
| 214 | + 'impossible_modifier_pass_auteur' => 'Impossibile modificare la password.', # Impossibile modificare la password |
|
| 215 | + 'info_1_article' => '1 articolo', |
|
| 216 | + 'info_1_auteur' => '1 autore', |
|
| 217 | + 'info_1_message' => '1 messaggio', |
|
| 218 | + 'info_1_mot_cle' => '1 parola chiave', |
|
| 219 | + 'info_1_rubrique' => '1 rubrica', |
|
| 220 | + 'info_1_visiteur' => '1 visitatore', |
|
| 221 | + 'info_activer_cookie' => 'Se vuoi puoi attivare un <b>cookie di corrispondenza</b>, che ti permetterà |
|
| 222 | 222 | di passare facilmente dal sito pubblico all’interfaccia privata.', |
| 223 | - 'info_activer_menu_developpement' => 'Mostra il menù Sviluppo', |
|
| 224 | - 'info_admin_etre_webmestre' => 'Concedimi i privilegi di webmaster', |
|
| 225 | - 'info_admin_je_suis_webmestre' => 'Sono <b>webmaster</b>', |
|
| 226 | - 'info_admin_statuer_webmestre' => 'Dai a questo amministratore i privilegi di webmaster', |
|
| 227 | - 'info_admin_webmestre' => 'Questo amministratore è un <b>webmaster</b>', |
|
| 228 | - 'info_administrateur' => 'Amministratore', |
|
| 229 | - 'info_administrateur_1' => 'Amministratore', |
|
| 230 | - 'info_administrateur_2' => 'del sito (<i>da utilizzare con prudenza</i>)', |
|
| 231 | - 'info_administrateur_site_01' => 'Se sei amministratore del sito,', |
|
| 232 | - 'info_administrateur_site_02' => 'clicca qui', |
|
| 233 | - 'info_administrateurs' => 'Amministratori', |
|
| 234 | - 'info_administrer_rubrique' => 'Puoi amministrare questa rubrica', |
|
| 235 | - 'info_adresse' => 'all’indirizzo:', |
|
| 236 | - 'info_adresse_desinscription' => 'Indirizzo per la cancellazione :', |
|
| 237 | - 'info_adresse_url' => 'Indirizzo (URL) del sito pubblico', |
|
| 238 | - 'info_afficher_par_nb' => 'Mostra', |
|
| 239 | - 'info_aide_en_ligne' => 'Guida in linea SPIP', |
|
| 240 | - 'info_ajout_image' => 'Quando aggiungi delle immagini come documenti allegati ad un articolo, |
|
| 223 | + 'info_activer_menu_developpement' => 'Mostra il menù Sviluppo', |
|
| 224 | + 'info_admin_etre_webmestre' => 'Concedimi i privilegi di webmaster', |
|
| 225 | + 'info_admin_je_suis_webmestre' => 'Sono <b>webmaster</b>', |
|
| 226 | + 'info_admin_statuer_webmestre' => 'Dai a questo amministratore i privilegi di webmaster', |
|
| 227 | + 'info_admin_webmestre' => 'Questo amministratore è un <b>webmaster</b>', |
|
| 228 | + 'info_administrateur' => 'Amministratore', |
|
| 229 | + 'info_administrateur_1' => 'Amministratore', |
|
| 230 | + 'info_administrateur_2' => 'del sito (<i>da utilizzare con prudenza</i>)', |
|
| 231 | + 'info_administrateur_site_01' => 'Se sei amministratore del sito,', |
|
| 232 | + 'info_administrateur_site_02' => 'clicca qui', |
|
| 233 | + 'info_administrateurs' => 'Amministratori', |
|
| 234 | + 'info_administrer_rubrique' => 'Puoi amministrare questa rubrica', |
|
| 235 | + 'info_adresse' => 'all’indirizzo:', |
|
| 236 | + 'info_adresse_desinscription' => 'Indirizzo per la cancellazione :', |
|
| 237 | + 'info_adresse_url' => 'Indirizzo (URL) del sito pubblico', |
|
| 238 | + 'info_afficher_par_nb' => 'Mostra', |
|
| 239 | + 'info_aide_en_ligne' => 'Guida in linea SPIP', |
|
| 240 | + 'info_ajout_image' => 'Quando aggiungi delle immagini come documenti allegati ad un articolo, |
|
| 241 | 241 | SPIP può creare delle thumbnail (miniature) delle |
| 242 | 242 | immagini inserite. Ciò permette ad esempio di creare in automatico una galleria di immagini o un portfolio.', |
| 243 | - 'info_ajouter_rubrique' => 'Aggiungi un’altra rubrica da amministrare:', |
|
| 244 | - 'info_annonce_nouveautes' => 'Annuncio delle novità', |
|
| 245 | - 'info_article' => 'articolo', |
|
| 246 | - 'info_article_2' => 'articoli', |
|
| 247 | - 'info_article_a_paraitre' => 'Gli articoli postdatati da pubblicare', |
|
| 248 | - 'info_articles_02' => 'articoli', |
|
| 249 | - 'info_articles_2' => 'Articoli', |
|
| 250 | - 'info_articles_auteur' => 'Articoli di questo autore', |
|
| 251 | - 'info_articles_miens' => 'I miei articoli', |
|
| 252 | - 'info_articles_tous' => 'Tutti gli articoli', |
|
| 253 | - 'info_articles_trouves' => 'Articoli trovati', |
|
| 254 | - 'info_attente_validation' => 'I tuoi articoli in attesa di convalida', |
|
| 255 | - 'info_aucun_article' => 'Nessun articolo', |
|
| 256 | - 'info_aucun_auteur' => 'Nessun autore', |
|
| 257 | - 'info_aucun_message' => 'Nessun messaggio', |
|
| 258 | - 'info_aucun_rubrique' => 'Nessuna rubrica', |
|
| 259 | - 'info_aujourdhui' => 'oggi: ', |
|
| 260 | - 'info_auteur_gere_rubriques' => 'Questo autore gestisce le rubriche seguenti:', |
|
| 261 | - 'info_auteur_gere_toutes_rubriques' => 'Questo autore gestisce <b>tutte le rubriche</b>', |
|
| 262 | - 'info_auteur_gere_toutes_rubriques_2' => 'Io modifico <b>tutte le rubriche</b>', |
|
| 263 | - 'info_auteurs' => 'Gli autori', |
|
| 264 | - 'info_auteurs_par_tri' => 'Autori@partri@', |
|
| 265 | - 'info_auteurs_trouves' => 'Autori trovati', |
|
| 266 | - 'info_authentification_externe' => 'Autenticazione esterna', |
|
| 267 | - 'info_avertissement' => 'Avvertimento', |
|
| 268 | - 'info_barre_outils' => 'con la barra degli strumenti?', |
|
| 269 | - 'info_base_installee' => 'La struttura del vostro database è installata.', |
|
| 270 | - 'info_bio' => 'Biografia', |
|
| 271 | - 'info_cache_desactive' => 'La cache è temporaneamente disattivata', |
|
| 272 | - 'info_chapeau' => 'Introduzione', |
|
| 273 | - 'info_chapeau_2' => 'Introduzione:', |
|
| 274 | - 'info_chemin_acces_1' => 'Opzioni: <b>Percorso d’accesso ai dati nell’elenco</b>', |
|
| 275 | - 'info_chemin_acces_2' => 'È necessario specificare il percorso per accedere ai dati nell’elenco. Questa informazione è indispensabile al fine di leggere i profili utente in esso contenuti.', |
|
| 276 | - 'info_chemin_acces_annuaire' => 'Opzioni: <b>Percorso d’accesso ai dati nell’elenco</b>', |
|
| 277 | - 'info_choix_base' => 'Terza fase: ', |
|
| 278 | - 'info_classement_1' => '<sup>o</sup> su @liste@', |
|
| 279 | - 'info_classement_2' => '<sup>o</sup> su @liste@', |
|
| 280 | - 'info_code_acces' => 'Non dimenticare i tuoi codici d’accesso!', |
|
| 281 | - 'info_config_suivi' => 'Se questo indirizzo corrisponde a una mailing-list, è possibile indicare qui sotto l’indirizzo al quale i partecipanti del sito possono iscriversi. Questo indirizzo può essere una URL (per esempio la pagina di iscrizione via Web alla lista), oppure un indirizzo email che contiene un Oggetto specifico (per esempio: <tt>@adresse_suivi@?subject=subscribe</tt>):', |
|
| 282 | - 'info_config_suivi_explication' => 'È possibile abbonarsi alla mailing-list di questo sito. Verranno spedite per email le notifiche degli articoli e delle brevi proposte per la pubblicazione.', |
|
| 283 | - 'info_confirmer_passe' => 'Conferma la nuova password:', |
|
| 284 | - 'info_conflit_edition_avis_non_sauvegarde' => 'Attenzione, i campi seguenti sono già stati modificati. Quindi le vostre modifiche su questi campi non sono state registrate.', |
|
| 285 | - 'info_conflit_edition_differences' => 'Differenze:', |
|
| 286 | - 'info_conflit_edition_version_enregistree' => 'La versione registrata:', |
|
| 287 | - 'info_conflit_edition_votre_version' => 'La tua versione:', |
|
| 288 | - 'info_connexion_base' => 'Prova di connessione al database', |
|
| 289 | - 'info_connexion_base_donnee' => 'Connessione al proprio database', |
|
| 290 | - 'info_connexion_ldap_ok' => '<b>La connessione LDAP è riuscita.</b><p> È possibile passare alla fase successiva.</p>', |
|
| 291 | - 'info_connexion_mysql' => 'La connessione a SQL', |
|
| 292 | - 'info_connexion_ok' => 'La connessione è riuscita.', |
|
| 293 | - 'info_contact' => 'Contatti', |
|
| 294 | - 'info_contenu_articles' => 'Contentuto degli articoli', |
|
| 295 | - 'info_contributions' => 'Contributi', |
|
| 296 | - 'info_creation_paragraphe' => 'Per creare dei paragrafi indipendenti, lasciare fra loro delle righe vuote.', |
|
| 297 | - 'info_creation_rubrique' => 'Prima di poter scrivere degli articoli, <br />devi creare almeno una rubrica.<br />', |
|
| 298 | - 'info_creation_tables' => 'Creazione delle tabelle nel database', |
|
| 299 | - 'info_creer_base' => '<b>Creare</b> un nuovo database:', |
|
| 300 | - 'info_dans_rubrique' => 'Nella rubrica:', |
|
| 301 | - 'info_date_publication_anterieure' => 'Data di redazione anteriore:', |
|
| 302 | - 'info_date_referencement' => 'DATA DI INSERIMENTO IN REPERTORIO DI QUESTO SITO:', |
|
| 303 | - 'info_derniere_etape' => 'Finito!', |
|
| 304 | - 'info_descriptif' => 'Descrizione:', |
|
| 305 | - 'info_desinstaller_plugin' => 'elimina i dati e disattiva il plug-in', |
|
| 306 | - 'info_discussion_cours' => 'Discussioni in corso', |
|
| 307 | - 'info_ecrire_article' => 'Prima di poter scrivere degli articoli, devi creare almeno una rubrica.', |
|
| 308 | - 'info_email_envoi' => 'Indirizzo email del mittente (opzionale)', |
|
| 309 | - 'info_email_envoi_txt' => 'Indicare qui l’indirizzo da utilizzare per l’invio degli email (come impostazione predefinita l’indirizzo del destinatario sarà utilizzato come indirizzo del mittente):', |
|
| 310 | - 'info_email_webmestre' => 'Indirizzo email del webmaster', |
|
| 311 | - 'info_envoi_email_automatique' => 'Invio di email automatico', |
|
| 312 | - 'info_envoyer_maintenant' => 'Invia adesso', |
|
| 313 | - 'info_etape_suivante' => 'Passare alla fase successiva', |
|
| 314 | - 'info_etape_suivante_1' => 'Puoi passare alla fase successiva.', |
|
| 315 | - 'info_etape_suivante_2' => 'Puoi passare alla fase successiva.', |
|
| 316 | - 'info_exceptions_proxy' => 'Eccezioni per il proxy', |
|
| 317 | - 'info_exportation_base' => 'esportazione del database verso @archive@', |
|
| 318 | - 'info_facilite_suivi_activite' => 'Al fine di facilitare il monitoraggio dell’attività editoriale del sito, SPIP può far pervenire via email, per esempio ad una mailing-list dei redattori, l’annuncio delle domande di pubblicazione e di convalida degli articoli. |
|
| 243 | + 'info_ajouter_rubrique' => 'Aggiungi un’altra rubrica da amministrare:', |
|
| 244 | + 'info_annonce_nouveautes' => 'Annuncio delle novità', |
|
| 245 | + 'info_article' => 'articolo', |
|
| 246 | + 'info_article_2' => 'articoli', |
|
| 247 | + 'info_article_a_paraitre' => 'Gli articoli postdatati da pubblicare', |
|
| 248 | + 'info_articles_02' => 'articoli', |
|
| 249 | + 'info_articles_2' => 'Articoli', |
|
| 250 | + 'info_articles_auteur' => 'Articoli di questo autore', |
|
| 251 | + 'info_articles_miens' => 'I miei articoli', |
|
| 252 | + 'info_articles_tous' => 'Tutti gli articoli', |
|
| 253 | + 'info_articles_trouves' => 'Articoli trovati', |
|
| 254 | + 'info_attente_validation' => 'I tuoi articoli in attesa di convalida', |
|
| 255 | + 'info_aucun_article' => 'Nessun articolo', |
|
| 256 | + 'info_aucun_auteur' => 'Nessun autore', |
|
| 257 | + 'info_aucun_message' => 'Nessun messaggio', |
|
| 258 | + 'info_aucun_rubrique' => 'Nessuna rubrica', |
|
| 259 | + 'info_aujourdhui' => 'oggi: ', |
|
| 260 | + 'info_auteur_gere_rubriques' => 'Questo autore gestisce le rubriche seguenti:', |
|
| 261 | + 'info_auteur_gere_toutes_rubriques' => 'Questo autore gestisce <b>tutte le rubriche</b>', |
|
| 262 | + 'info_auteur_gere_toutes_rubriques_2' => 'Io modifico <b>tutte le rubriche</b>', |
|
| 263 | + 'info_auteurs' => 'Gli autori', |
|
| 264 | + 'info_auteurs_par_tri' => 'Autori@partri@', |
|
| 265 | + 'info_auteurs_trouves' => 'Autori trovati', |
|
| 266 | + 'info_authentification_externe' => 'Autenticazione esterna', |
|
| 267 | + 'info_avertissement' => 'Avvertimento', |
|
| 268 | + 'info_barre_outils' => 'con la barra degli strumenti?', |
|
| 269 | + 'info_base_installee' => 'La struttura del vostro database è installata.', |
|
| 270 | + 'info_bio' => 'Biografia', |
|
| 271 | + 'info_cache_desactive' => 'La cache è temporaneamente disattivata', |
|
| 272 | + 'info_chapeau' => 'Introduzione', |
|
| 273 | + 'info_chapeau_2' => 'Introduzione:', |
|
| 274 | + 'info_chemin_acces_1' => 'Opzioni: <b>Percorso d’accesso ai dati nell’elenco</b>', |
|
| 275 | + 'info_chemin_acces_2' => 'È necessario specificare il percorso per accedere ai dati nell’elenco. Questa informazione è indispensabile al fine di leggere i profili utente in esso contenuti.', |
|
| 276 | + 'info_chemin_acces_annuaire' => 'Opzioni: <b>Percorso d’accesso ai dati nell’elenco</b>', |
|
| 277 | + 'info_choix_base' => 'Terza fase: ', |
|
| 278 | + 'info_classement_1' => '<sup>o</sup> su @liste@', |
|
| 279 | + 'info_classement_2' => '<sup>o</sup> su @liste@', |
|
| 280 | + 'info_code_acces' => 'Non dimenticare i tuoi codici d’accesso!', |
|
| 281 | + 'info_config_suivi' => 'Se questo indirizzo corrisponde a una mailing-list, è possibile indicare qui sotto l’indirizzo al quale i partecipanti del sito possono iscriversi. Questo indirizzo può essere una URL (per esempio la pagina di iscrizione via Web alla lista), oppure un indirizzo email che contiene un Oggetto specifico (per esempio: <tt>@adresse_suivi@?subject=subscribe</tt>):', |
|
| 282 | + 'info_config_suivi_explication' => 'È possibile abbonarsi alla mailing-list di questo sito. Verranno spedite per email le notifiche degli articoli e delle brevi proposte per la pubblicazione.', |
|
| 283 | + 'info_confirmer_passe' => 'Conferma la nuova password:', |
|
| 284 | + 'info_conflit_edition_avis_non_sauvegarde' => 'Attenzione, i campi seguenti sono già stati modificati. Quindi le vostre modifiche su questi campi non sono state registrate.', |
|
| 285 | + 'info_conflit_edition_differences' => 'Differenze:', |
|
| 286 | + 'info_conflit_edition_version_enregistree' => 'La versione registrata:', |
|
| 287 | + 'info_conflit_edition_votre_version' => 'La tua versione:', |
|
| 288 | + 'info_connexion_base' => 'Prova di connessione al database', |
|
| 289 | + 'info_connexion_base_donnee' => 'Connessione al proprio database', |
|
| 290 | + 'info_connexion_ldap_ok' => '<b>La connessione LDAP è riuscita.</b><p> È possibile passare alla fase successiva.</p>', |
|
| 291 | + 'info_connexion_mysql' => 'La connessione a SQL', |
|
| 292 | + 'info_connexion_ok' => 'La connessione è riuscita.', |
|
| 293 | + 'info_contact' => 'Contatti', |
|
| 294 | + 'info_contenu_articles' => 'Contentuto degli articoli', |
|
| 295 | + 'info_contributions' => 'Contributi', |
|
| 296 | + 'info_creation_paragraphe' => 'Per creare dei paragrafi indipendenti, lasciare fra loro delle righe vuote.', |
|
| 297 | + 'info_creation_rubrique' => 'Prima di poter scrivere degli articoli, <br />devi creare almeno una rubrica.<br />', |
|
| 298 | + 'info_creation_tables' => 'Creazione delle tabelle nel database', |
|
| 299 | + 'info_creer_base' => '<b>Creare</b> un nuovo database:', |
|
| 300 | + 'info_dans_rubrique' => 'Nella rubrica:', |
|
| 301 | + 'info_date_publication_anterieure' => 'Data di redazione anteriore:', |
|
| 302 | + 'info_date_referencement' => 'DATA DI INSERIMENTO IN REPERTORIO DI QUESTO SITO:', |
|
| 303 | + 'info_derniere_etape' => 'Finito!', |
|
| 304 | + 'info_descriptif' => 'Descrizione:', |
|
| 305 | + 'info_desinstaller_plugin' => 'elimina i dati e disattiva il plug-in', |
|
| 306 | + 'info_discussion_cours' => 'Discussioni in corso', |
|
| 307 | + 'info_ecrire_article' => 'Prima di poter scrivere degli articoli, devi creare almeno una rubrica.', |
|
| 308 | + 'info_email_envoi' => 'Indirizzo email del mittente (opzionale)', |
|
| 309 | + 'info_email_envoi_txt' => 'Indicare qui l’indirizzo da utilizzare per l’invio degli email (come impostazione predefinita l’indirizzo del destinatario sarà utilizzato come indirizzo del mittente):', |
|
| 310 | + 'info_email_webmestre' => 'Indirizzo email del webmaster', |
|
| 311 | + 'info_envoi_email_automatique' => 'Invio di email automatico', |
|
| 312 | + 'info_envoyer_maintenant' => 'Invia adesso', |
|
| 313 | + 'info_etape_suivante' => 'Passare alla fase successiva', |
|
| 314 | + 'info_etape_suivante_1' => 'Puoi passare alla fase successiva.', |
|
| 315 | + 'info_etape_suivante_2' => 'Puoi passare alla fase successiva.', |
|
| 316 | + 'info_exceptions_proxy' => 'Eccezioni per il proxy', |
|
| 317 | + 'info_exportation_base' => 'esportazione del database verso @archive@', |
|
| 318 | + 'info_facilite_suivi_activite' => 'Al fine di facilitare il monitoraggio dell’attività editoriale del sito, SPIP può far pervenire via email, per esempio ad una mailing-list dei redattori, l’annuncio delle domande di pubblicazione e di convalida degli articoli. |
|
| 319 | 319 | Indicare uno o più indirizzi, separati da virgole.', |
| 320 | - 'info_fichiers_authent' => 'File d’autenticazione ".htpasswd"', |
|
| 321 | - 'info_forums_abo_invites' => 'Il sito comprende dei forum accessibili solo a utenti registrati. Nel sito pubblico è quindi presente una pagina d’iscrizione.', |
|
| 322 | - 'info_gauche_admin_tech' => '<b>Questa pagina è accessibile solo ai responsabili del sito.</b><p> Permette l’accesso alle diverse funzioni |
|
| 320 | + 'info_fichiers_authent' => 'File d’autenticazione ".htpasswd"', |
|
| 321 | + 'info_forums_abo_invites' => 'Il sito comprende dei forum accessibili solo a utenti registrati. Nel sito pubblico è quindi presente una pagina d’iscrizione.', |
|
| 322 | + 'info_gauche_admin_tech' => '<b>Questa pagina è accessibile solo ai responsabili del sito.</b><p> Permette l’accesso alle diverse funzioni |
|
| 323 | 323 | di manutenzione tecnica. Alcune di esse richiedono una specifica procedura di identificazione, |
| 324 | 324 | eseguibile grazie a un accesso FTP.</p>', |
| 325 | - 'info_gauche_admin_vider' => '<b>Questa pagina è accessibile solo ai responsabili del sito.</b><p> Permette l’accesso alle diverse funzioni di manutenzione tecnica. |
|
| 325 | + 'info_gauche_admin_vider' => '<b>Questa pagina è accessibile solo ai responsabili del sito.</b><p> Permette l’accesso alle diverse funzioni di manutenzione tecnica. |
|
| 326 | 326 | Alcune di esse richiedono una specifica procedura di identificazione, eseguibile grazie ad un accesso FTP.</p>', |
| 327 | - 'info_gauche_auteurs' => 'Elenco di tutti gli autori del sito. |
|
| 327 | + 'info_gauche_auteurs' => 'Elenco di tutti gli autori del sito. |
|
| 328 | 328 | Il loro status è indicato dal colore dell’icona (redattore = giallo; amministratore = verde).', |
| 329 | - 'info_gauche_auteurs_exterieurs' => 'Gli autori esterni, senza accesso al sito, sono indicati da un’icona blu; |
|
| 329 | + 'info_gauche_auteurs_exterieurs' => 'Gli autori esterni, senza accesso al sito, sono indicati da un’icona blu; |
|
| 330 | 330 | gli autori eliminati da un’icona grigia.', |
| 331 | - 'info_gauche_messagerie' => 'Il sistema di messaggistica permette di scambiare dei messaggi tra redattori, di conservare dei memo (promemoria ad uso personale) o di pubblicare degli annunci nel pannello di controllo dell’area riservata (se sei amministratore).', |
|
| 332 | - 'info_gauche_statistiques_referers' => 'Questa pagina presenta un elenco dei siti che contengono link verso il tuo (<i>referrer</i>). Questo elenco è valido però solo per oggi essendo azzerato ogni 24 ore.', |
|
| 333 | - 'info_gauche_visiteurs_enregistres' => 'Trovi qui i visitatori registrati allo spazio |
|
| 331 | + 'info_gauche_messagerie' => 'Il sistema di messaggistica permette di scambiare dei messaggi tra redattori, di conservare dei memo (promemoria ad uso personale) o di pubblicare degli annunci nel pannello di controllo dell’area riservata (se sei amministratore).', |
|
| 332 | + 'info_gauche_statistiques_referers' => 'Questa pagina presenta un elenco dei siti che contengono link verso il tuo (<i>referrer</i>). Questo elenco è valido però solo per oggi essendo azzerato ogni 24 ore.', |
|
| 333 | + 'info_gauche_visiteurs_enregistres' => 'Trovi qui i visitatori registrati allo spazio |
|
| 334 | 334 | pubblico del sito (forum su abbonamento).', |
| 335 | - 'info_generation_miniatures_images' => 'Generazione di thumbnail di immagini', |
|
| 336 | - 'info_gerer_trad_objets' => '@objets@ : gestire i collegamenti alle traduzioni', |
|
| 337 | - 'info_hebergeur_desactiver_envoi_email' => 'Alcuni hoster disattivano l’invio automatico di email |
|
| 335 | + 'info_generation_miniatures_images' => 'Generazione di thumbnail di immagini', |
|
| 336 | + 'info_gerer_trad_objets' => '@objets@ : gestire i collegamenti alle traduzioni', |
|
| 337 | + 'info_hebergeur_desactiver_envoi_email' => 'Alcuni hoster disattivano l’invio automatico di email |
|
| 338 | 338 | dai loro server. In questo caso, le funzionalità di SPIP di seguito riportate non funzioneranno.', |
| 339 | - 'info_hier' => 'ieri:', |
|
| 340 | - 'info_identification_publique' => 'La tua identità pubblica...', |
|
| 341 | - 'info_image_process' => 'Seleziona il metodo migliore per la creazione delle anteprime cliccando sull’immagine corrispondente.', |
|
| 342 | - 'info_image_process2' => 'Se non appare alcuna immagine, significa che la configurazione del server non permette l’uso di alcune funzioni grafiche. Se si desidera utilizzarle, rivolgersi al responsabile tecnico chiedendo di installare le estensioni «GD» o «Imagick».', |
|
| 343 | - 'info_images_auto' => 'Immagini elaborate automaticamente', |
|
| 344 | - 'info_informations_personnelles' => 'Informazioni personali', |
|
| 345 | - 'info_inscription' => 'Iscritto il', |
|
| 346 | - 'info_inscription_automatique' => 'Iscrizione automatica di nuovi redattori', |
|
| 347 | - 'info_jeu_caractere' => 'Set di caratteri del sito', |
|
| 348 | - 'info_jours' => 'giorni', |
|
| 349 | - 'info_laisser_champs_vides' => 'lasciare questi campi vuoti)', |
|
| 350 | - 'info_langues' => 'Lingua del sito', |
|
| 351 | - 'info_ldap_ok' => 'L’autenticazione LDAP è installata.', |
|
| 352 | - 'info_lien_hypertexte' => 'Link ipertestuale:', |
|
| 353 | - 'info_liste_nouveautes_envoyee' => 'La lista delle novità è stata inviata', |
|
| 354 | - 'info_liste_redacteurs_connectes' => 'Elenco dei redattori collegati', |
|
| 355 | - 'info_login_existant' => 'Questo login esiste già.', |
|
| 356 | - 'info_login_trop_court' => 'Login troppo corto.', |
|
| 357 | - 'info_login_trop_court_car_pluriel' => 'La login deve contenere almeno @nb@ caratteri.', |
|
| 358 | - 'info_logos' => 'I logo', |
|
| 359 | - 'info_maximum' => 'massimo:', |
|
| 360 | - 'info_meme_rubrique' => 'Nella stessa rubrica', |
|
| 361 | - 'info_message_en_redaction' => 'I tuoi messaggi in corso di redazione', |
|
| 362 | - 'info_message_technique' => 'Messaggio tecnico:', |
|
| 363 | - 'info_messagerie_interne' => 'Sistema di messaggistica interna', |
|
| 364 | - 'info_mise_a_niveau_base' => 'aggiornamento del database SQL', |
|
| 365 | - 'info_mise_a_niveau_base_2' => '{{Attenzione!}} È stata installata una versione |
|
| 339 | + 'info_hier' => 'ieri:', |
|
| 340 | + 'info_identification_publique' => 'La tua identità pubblica...', |
|
| 341 | + 'info_image_process' => 'Seleziona il metodo migliore per la creazione delle anteprime cliccando sull’immagine corrispondente.', |
|
| 342 | + 'info_image_process2' => 'Se non appare alcuna immagine, significa che la configurazione del server non permette l’uso di alcune funzioni grafiche. Se si desidera utilizzarle, rivolgersi al responsabile tecnico chiedendo di installare le estensioni «GD» o «Imagick».', |
|
| 343 | + 'info_images_auto' => 'Immagini elaborate automaticamente', |
|
| 344 | + 'info_informations_personnelles' => 'Informazioni personali', |
|
| 345 | + 'info_inscription' => 'Iscritto il', |
|
| 346 | + 'info_inscription_automatique' => 'Iscrizione automatica di nuovi redattori', |
|
| 347 | + 'info_jeu_caractere' => 'Set di caratteri del sito', |
|
| 348 | + 'info_jours' => 'giorni', |
|
| 349 | + 'info_laisser_champs_vides' => 'lasciare questi campi vuoti)', |
|
| 350 | + 'info_langues' => 'Lingua del sito', |
|
| 351 | + 'info_ldap_ok' => 'L’autenticazione LDAP è installata.', |
|
| 352 | + 'info_lien_hypertexte' => 'Link ipertestuale:', |
|
| 353 | + 'info_liste_nouveautes_envoyee' => 'La lista delle novità è stata inviata', |
|
| 354 | + 'info_liste_redacteurs_connectes' => 'Elenco dei redattori collegati', |
|
| 355 | + 'info_login_existant' => 'Questo login esiste già.', |
|
| 356 | + 'info_login_trop_court' => 'Login troppo corto.', |
|
| 357 | + 'info_login_trop_court_car_pluriel' => 'La login deve contenere almeno @nb@ caratteri.', |
|
| 358 | + 'info_logos' => 'I logo', |
|
| 359 | + 'info_maximum' => 'massimo:', |
|
| 360 | + 'info_meme_rubrique' => 'Nella stessa rubrica', |
|
| 361 | + 'info_message_en_redaction' => 'I tuoi messaggi in corso di redazione', |
|
| 362 | + 'info_message_technique' => 'Messaggio tecnico:', |
|
| 363 | + 'info_messagerie_interne' => 'Sistema di messaggistica interna', |
|
| 364 | + 'info_mise_a_niveau_base' => 'aggiornamento del database SQL', |
|
| 365 | + 'info_mise_a_niveau_base_2' => '{{Attenzione!}} È stata installata una versione |
|
| 366 | 366 | dei file di SPIP {precedente} rispetto a quella che era in uso per questo sito: |
| 367 | 367 | le informazioni contenute nel database sono probabilmente andate perse.<br />{{Reinstallare i file di SPIP.}}', |
| 368 | - 'info_modification_enregistree' => 'Le modifiche sono state salvate', |
|
| 369 | - 'info_modifier_auteur' => 'Modifica l’autore:', |
|
| 370 | - 'info_modifier_rubrique' => 'Modifica la rubrica:', |
|
| 371 | - 'info_modifier_titre' => 'Modifica: @titre@', |
|
| 372 | - 'info_mon_site_spip' => 'Il mio sito SPIP', |
|
| 373 | - 'info_moyenne' => 'media: ', |
|
| 374 | - 'info_multi_cet_article' => 'Lingua di questo articolo:', |
|
| 375 | - 'info_multi_langues_choisies' => 'Selezionare di seguito le lingue disponibili per i redattori del sito. |
|
| 368 | + 'info_modification_enregistree' => 'Le modifiche sono state salvate', |
|
| 369 | + 'info_modifier_auteur' => 'Modifica l’autore:', |
|
| 370 | + 'info_modifier_rubrique' => 'Modifica la rubrica:', |
|
| 371 | + 'info_modifier_titre' => 'Modifica: @titre@', |
|
| 372 | + 'info_mon_site_spip' => 'Il mio sito SPIP', |
|
| 373 | + 'info_moyenne' => 'media: ', |
|
| 374 | + 'info_multi_cet_article' => 'Lingua di questo articolo:', |
|
| 375 | + 'info_multi_langues_choisies' => 'Selezionare di seguito le lingue disponibili per i redattori del sito. |
|
| 376 | 376 | Le lingue già utilizzate nel sito (visualizzate per prime) non possono essere disattivate.', |
| 377 | - 'info_multi_objets' => '@objets@ : attiva il menù delle lingue', |
|
| 378 | - 'info_multi_secteurs' => '... solo per le rubriche collocate nella {root} del sito?', |
|
| 379 | - 'info_nb_articles' => '@nb@ articoli', |
|
| 380 | - 'info_nb_auteurs' => '@nb@ autori', |
|
| 381 | - 'info_nb_messages' => '@nb@ messaggi', |
|
| 382 | - 'info_nb_mots_cles' => '@nb@ parole chiave', |
|
| 383 | - 'info_nb_rubriques' => '@nb@ rubriche', |
|
| 384 | - 'info_nb_visiteurs' => '@nb@ visitatori', |
|
| 385 | - 'info_nom' => 'Nome', |
|
| 386 | - 'info_nom_destinataire' => 'Nome del destinatario', |
|
| 387 | - 'info_nom_pas_conforme' => 'I tag html non sono consentiti', |
|
| 388 | - 'info_nom_site' => 'Nome del tuo sito', |
|
| 389 | - 'info_nombre_articles' => '@nb_articles@ articoli,', |
|
| 390 | - 'info_nombre_rubriques' => '@nb_rubriques@ rubriche,', |
|
| 391 | - 'info_nombre_sites' => '@nb_sites@ siti, ', |
|
| 392 | - 'info_non_deplacer' => 'Non spostare...', |
|
| 393 | - 'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP può inviare regolarmente annunci sulle ultime novità del sito |
|
| 377 | + 'info_multi_objets' => '@objets@ : attiva il menù delle lingue', |
|
| 378 | + 'info_multi_secteurs' => '... solo per le rubriche collocate nella {root} del sito?', |
|
| 379 | + 'info_nb_articles' => '@nb@ articoli', |
|
| 380 | + 'info_nb_auteurs' => '@nb@ autori', |
|
| 381 | + 'info_nb_messages' => '@nb@ messaggi', |
|
| 382 | + 'info_nb_mots_cles' => '@nb@ parole chiave', |
|
| 383 | + 'info_nb_rubriques' => '@nb@ rubriche', |
|
| 384 | + 'info_nb_visiteurs' => '@nb@ visitatori', |
|
| 385 | + 'info_nom' => 'Nome', |
|
| 386 | + 'info_nom_destinataire' => 'Nome del destinatario', |
|
| 387 | + 'info_nom_pas_conforme' => 'I tag html non sono consentiti', |
|
| 388 | + 'info_nom_site' => 'Nome del tuo sito', |
|
| 389 | + 'info_nombre_articles' => '@nb_articles@ articoli,', |
|
| 390 | + 'info_nombre_rubriques' => '@nb_rubriques@ rubriche,', |
|
| 391 | + 'info_nombre_sites' => '@nb_sites@ siti, ', |
|
| 392 | + 'info_non_deplacer' => 'Non spostare...', |
|
| 393 | + 'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP può inviare regolarmente annunci sulle ultime novità del sito |
|
| 394 | 394 | (articoli e brevi recentemente pubblicati).', |
| 395 | - 'info_non_envoi_liste_nouveautes' => 'Non inviare l’elenco delle novità', |
|
| 396 | - 'info_non_modifiable' => 'non può essere modificato', |
|
| 397 | - 'info_non_suppression_mot_cle' => 'non voglio cancellare questa parola chiave.', |
|
| 398 | - 'info_notes' => 'Note', |
|
| 399 | - 'info_nouvel_article' => 'Nuovo articolo', |
|
| 400 | - 'info_nouvelle_traduction' => 'Nuova traduzione:', |
|
| 401 | - 'info_numero_article' => 'ARTICOLO NUMERO:', |
|
| 402 | - 'info_obligatoire_02' => '(Obbligatorio)', |
|
| 403 | - 'info_option_accepter_visiteurs' => 'Accetta l’iscrizione di utenti del sito pubblico', |
|
| 404 | - 'info_option_ne_pas_accepter_visiteurs' => 'Rifiuta l’iscrizione di utenti', |
|
| 405 | - 'info_options_avancees' => 'OPZIONE AVANZATA', |
|
| 406 | - 'info_ou' => 'o... ', |
|
| 407 | - 'info_page_interdite' => 'Pagina riservata', |
|
| 408 | - 'info_par_nom' => 'per nome', |
|
| 409 | - 'info_par_nombre_article' => 'per numero di articoli', |
|
| 410 | - 'info_par_statut' => 'per status', |
|
| 411 | - 'info_par_tri' => '’(per @tri@)’', |
|
| 412 | - 'info_passe_trop_court' => 'Password troppo corta.', |
|
| 413 | - 'info_passe_trop_court_car_pluriel' => 'La password deve contenere almeno @nb@ caratteri.', |
|
| 414 | - 'info_passes_identiques' => 'Le due password non sono uguali.', |
|
| 415 | - 'info_plus_cinq_car' => 'più di 5 caratteri', |
|
| 416 | - 'info_plus_cinq_car_2' => '(Più di 5 caratteri)', |
|
| 417 | - 'info_plus_trois_car' => '(Più di 3 caratteri)', |
|
| 418 | - 'info_popularite' => 'popolarità: @popularite@; visite: @visites@', |
|
| 419 | - 'info_post_scriptum' => 'Post Scriptum', |
|
| 420 | - 'info_post_scriptum_2' => 'Post Scriptum:', |
|
| 421 | - 'info_pour' => 'per', |
|
| 422 | - 'info_preview_texte' => 'È possibile visualizzare un’anteprima del sito comprendente anche gli articoli e le brevi "proposti" per la pubblicazione. Questa funzionalità può essere disattivata, consentita solo agli amministratori o a tutti i redattori.', |
|
| 423 | - 'info_procedez_par_etape' => 'procedere passo dopo passo', |
|
| 424 | - 'info_procedure_maj_version' => 'è necessario avviare la procedura di aggiornamento per adattare |
|
| 395 | + 'info_non_envoi_liste_nouveautes' => 'Non inviare l’elenco delle novità', |
|
| 396 | + 'info_non_modifiable' => 'non può essere modificato', |
|
| 397 | + 'info_non_suppression_mot_cle' => 'non voglio cancellare questa parola chiave.', |
|
| 398 | + 'info_notes' => 'Note', |
|
| 399 | + 'info_nouvel_article' => 'Nuovo articolo', |
|
| 400 | + 'info_nouvelle_traduction' => 'Nuova traduzione:', |
|
| 401 | + 'info_numero_article' => 'ARTICOLO NUMERO:', |
|
| 402 | + 'info_obligatoire_02' => '(Obbligatorio)', |
|
| 403 | + 'info_option_accepter_visiteurs' => 'Accetta l’iscrizione di utenti del sito pubblico', |
|
| 404 | + 'info_option_ne_pas_accepter_visiteurs' => 'Rifiuta l’iscrizione di utenti', |
|
| 405 | + 'info_options_avancees' => 'OPZIONE AVANZATA', |
|
| 406 | + 'info_ou' => 'o... ', |
|
| 407 | + 'info_page_interdite' => 'Pagina riservata', |
|
| 408 | + 'info_par_nom' => 'per nome', |
|
| 409 | + 'info_par_nombre_article' => 'per numero di articoli', |
|
| 410 | + 'info_par_statut' => 'per status', |
|
| 411 | + 'info_par_tri' => '’(per @tri@)’', |
|
| 412 | + 'info_passe_trop_court' => 'Password troppo corta.', |
|
| 413 | + 'info_passe_trop_court_car_pluriel' => 'La password deve contenere almeno @nb@ caratteri.', |
|
| 414 | + 'info_passes_identiques' => 'Le due password non sono uguali.', |
|
| 415 | + 'info_plus_cinq_car' => 'più di 5 caratteri', |
|
| 416 | + 'info_plus_cinq_car_2' => '(Più di 5 caratteri)', |
|
| 417 | + 'info_plus_trois_car' => '(Più di 3 caratteri)', |
|
| 418 | + 'info_popularite' => 'popolarità: @popularite@; visite: @visites@', |
|
| 419 | + 'info_post_scriptum' => 'Post Scriptum', |
|
| 420 | + 'info_post_scriptum_2' => 'Post Scriptum:', |
|
| 421 | + 'info_pour' => 'per', |
|
| 422 | + 'info_preview_texte' => 'È possibile visualizzare un’anteprima del sito comprendente anche gli articoli e le brevi "proposti" per la pubblicazione. Questa funzionalità può essere disattivata, consentita solo agli amministratori o a tutti i redattori.', |
|
| 423 | + 'info_procedez_par_etape' => 'procedere passo dopo passo', |
|
| 424 | + 'info_procedure_maj_version' => 'è necessario avviare la procedura di aggiornamento per adattare |
|
| 425 | 425 | il database alla nuova versione di SPIP.', |
| 426 | - 'info_proxy_ok' => 'Test del proxy riuscito.', |
|
| 427 | - 'info_ps' => 'P.S.', |
|
| 428 | - 'info_publier' => 'pubblicare', |
|
| 429 | - 'info_publies' => 'I tuoi articoli pubblicati', |
|
| 430 | - 'info_question_accepter_visiteurs' => 'I modelli di pagina del sito prevedono la registrazione di utenti senza accesso all’area riservata. Attivare la seguente funzionalità:', |
|
| 431 | - 'info_question_inscription_nouveaux_redacteurs' => 'Vuoi accettare le iscrizioni di nuovi redattori direttamente dal sito pubblico? |
|
| 426 | + 'info_proxy_ok' => 'Test del proxy riuscito.', |
|
| 427 | + 'info_ps' => 'P.S.', |
|
| 428 | + 'info_publier' => 'pubblicare', |
|
| 429 | + 'info_publies' => 'I tuoi articoli pubblicati', |
|
| 430 | + 'info_question_accepter_visiteurs' => 'I modelli di pagina del sito prevedono la registrazione di utenti senza accesso all’area riservata. Attivare la seguente funzionalità:', |
|
| 431 | + 'info_question_inscription_nouveaux_redacteurs' => 'Vuoi accettare le iscrizioni di nuovi redattori direttamente dal sito pubblico? |
|
| 432 | 432 | In caso affermativo, i visitatori potranno iscriversi grazie ad un modulo automatizzato e accedere all’area riservata per proporre i propri articoli. |
| 433 | 433 | <div class="notice">Durante il processo d’iscrizione, gli utenti riceveranno un email che fornisce loro i codici d’accesso all’area privata. Alcuni servizi di hosting disattivano l’invio di email dai propri server: in questo caso l’iscrizione automatica non può essere attivata.</div>', |
| 434 | - 'info_qui_edite' => '@nom_auteur_modif@ ha lavorato su questo contenuto @date_diff@ minuti fa', |
|
| 435 | - 'info_racine_site' => 'Root del sito', |
|
| 436 | - 'info_recharger_page' => 'Aggiorna questa pagina fra qualche istante.', |
|
| 437 | - 'info_recherche_auteur_zero' => 'Nessun risultato per "@cherche_auteur@".', |
|
| 438 | - 'info_recommencer' => 'Ricomincia.', |
|
| 439 | - 'info_redacteur_1' => 'Redattori', |
|
| 440 | - 'info_redacteur_2' => 'avendo accesso allo spazio privato (<i>raccommandato</i>)', |
|
| 441 | - 'info_redacteurs' => 'Redattori', |
|
| 442 | - 'info_redaction_en_cours' => 'IN CORSO DI REDAZIONE', |
|
| 443 | - 'info_redirection' => 'Reindirizzamento', |
|
| 444 | - 'info_redirection_activee' => 'Il reindirizzamento è attivato.', |
|
| 445 | - 'info_redirection_boucle' => 'Stai cercando di sovrascrivere l’articolo.', |
|
| 446 | - 'info_redirection_desactivee' => 'Il reindirizzamento è stato cancellato.', |
|
| 447 | - 'info_refuses' => 'I tuoi articoli rifiutati', |
|
| 448 | - 'info_reglage_ldap' => 'Opzioni: <b>Parametri per l’importazione LDAP</b>', |
|
| 449 | - 'info_renvoi_article' => '<b>Reindirizzamento.</b> Quest’articolo rimanda alla pagina:', |
|
| 450 | - 'info_reserve_admin' => 'Solo gli amministratori possono modificare quest’indirizzo.', |
|
| 451 | - 'info_restreindre_rubrique' => 'Limita la facoltà di gestione alla rubrica:', |
|
| 452 | - 'info_resultat_recherche' => 'Risultati della ricerca:', |
|
| 453 | - 'info_rubriques' => 'Rubriche', |
|
| 454 | - 'info_rubriques_02' => 'rubriche', |
|
| 455 | - 'info_rubriques_trouvees' => 'Rubriche trovate', |
|
| 456 | - 'info_sans_titre' => 'Senza titolo', |
|
| 457 | - 'info_selection_chemin_acces' => '<b>Seleziona</b> qui sotto il percorso d’accesso nell’elenco:', |
|
| 458 | - 'info_signatures' => 'firme', |
|
| 459 | - 'info_site' => 'Sito', |
|
| 460 | - 'info_site_2' => 'sito: ', |
|
| 461 | - 'info_site_min' => 'sito', |
|
| 462 | - 'info_site_reference_2' => 'Sito repertoriato', |
|
| 463 | - 'info_site_web' => 'Sito Web:', |
|
| 464 | - 'info_sites' => 'siti', |
|
| 465 | - 'info_sites_lies_mot' => 'I siti in repertorio legati a questa parola chiave', |
|
| 466 | - 'info_sites_proxy' => 'Utilizza un proxy', |
|
| 467 | - 'info_sites_trouves' => 'Siti trovati', |
|
| 468 | - 'info_sous_titre' => 'Sottotitolo:', |
|
| 469 | - 'info_statut_administrateur' => 'Amministratore', |
|
| 470 | - 'info_statut_auteur' => 'Status di questo autore:', |
|
| 471 | - 'info_statut_auteur_2' => 'Io sono', |
|
| 472 | - 'info_statut_auteur_a_confirmer' => 'Iscrizione da confermare', |
|
| 473 | - 'info_statut_auteur_autre' => 'Altro stato:', |
|
| 474 | - 'info_statut_redacteur' => 'Redattore', |
|
| 475 | - 'info_statut_utilisateurs_1' => 'Status predefinito degli utenti importati', |
|
| 476 | - 'info_statut_utilisateurs_2' => 'Scegli lo status da attribuire alle personne presenti nell’elenco LDAP quando si collegano per la prima volta. Potrai poi modificare questa impostazione per ogni singolo autore.', |
|
| 477 | - 'info_suivi_activite' => 'Monitoraggio dell’attività editoriale', |
|
| 478 | - 'info_surtitre' => 'Occhiello:', |
|
| 479 | - 'info_syndication_integrale_1' => 'Il tuo sito propone dei file di syndication (vedi « <a href="@url@">@titre@</a> »).', |
|
| 480 | - 'info_syndication_integrale_2' => 'Si desidera trasmettere gli articoli in versione integrale oppure in versione riassunta di un centinaio di caratteri?', |
|
| 481 | - 'info_table_prefix' => 'È possibile modificare il prefisso del nome delle tabelle del database (cosa indispensabile se si desidera installare più siti usando il medesimo database). Questo prefisso si deve scrivere usando esclusivamente lettere minuscole, prive di accenti e senza alcuno spazio.', |
|
| 482 | - 'info_taille_maximale_images' => 'SPIP testerà la dimensione massima delle immagini che può manipolare (in milioni di pixel).<br /> Le immagini di dimensione maggiore non saranno ridotte.', |
|
| 483 | - 'info_taille_maximale_vignette' => 'Dimensione massima delle immagini create dal sistema:', |
|
| 484 | - 'info_terminer_installation' => 'Puoi ora terminare la procedura d’installazione standard.', |
|
| 485 | - 'info_texte' => 'Testo', |
|
| 486 | - 'info_texte_explicatif' => 'Testo esplicativo', |
|
| 487 | - 'info_texte_long' => '(il testo è lungo: è quindi visualizzato in più sezioni che verranno riunificate dopo la convalida)', |
|
| 488 | - 'info_texte_message' => 'Testo del tuo messaggio:', |
|
| 489 | - 'info_texte_message_02' => 'Testo del messaggio', |
|
| 490 | - 'info_titre' => 'Titolo:', |
|
| 491 | - 'info_total' => 'totale: ', |
|
| 492 | - 'info_tous_articles_en_redaction' => 'Tutti gli articoli in corso di redazione', |
|
| 493 | - 'info_tous_articles_presents' => 'Tutti gli articoli pubblicati in questa rubrica', |
|
| 494 | - 'info_tous_articles_refuses' => 'Tutti gli articoli rifiutati', |
|
| 495 | - 'info_tous_les' => 'tutti i:', |
|
| 496 | - 'info_tout_site' => 'Tutto il sito', |
|
| 497 | - 'info_tout_site2' => 'L’articolo non è stato tradotto in questa lingua.', |
|
| 498 | - 'info_tout_site3' => 'L’articolo è stato tradotto in questa lingua, ma sono state effettuate alcune modifiche all’articolo di riferimento. La traduzione deve quindi essere aggiornata.', |
|
| 499 | - 'info_tout_site4' => 'L’articolo è stato tradotto in questa lingua e la traduzione è aggiornata.', |
|
| 500 | - 'info_tout_site5' => 'Articolo originale.', |
|
| 501 | - 'info_tout_site6' => '<b>Attenzione:</b> solo gli articoli originali vengono visualizzati. |
|
| 434 | + 'info_qui_edite' => '@nom_auteur_modif@ ha lavorato su questo contenuto @date_diff@ minuti fa', |
|
| 435 | + 'info_racine_site' => 'Root del sito', |
|
| 436 | + 'info_recharger_page' => 'Aggiorna questa pagina fra qualche istante.', |
|
| 437 | + 'info_recherche_auteur_zero' => 'Nessun risultato per "@cherche_auteur@".', |
|
| 438 | + 'info_recommencer' => 'Ricomincia.', |
|
| 439 | + 'info_redacteur_1' => 'Redattori', |
|
| 440 | + 'info_redacteur_2' => 'avendo accesso allo spazio privato (<i>raccommandato</i>)', |
|
| 441 | + 'info_redacteurs' => 'Redattori', |
|
| 442 | + 'info_redaction_en_cours' => 'IN CORSO DI REDAZIONE', |
|
| 443 | + 'info_redirection' => 'Reindirizzamento', |
|
| 444 | + 'info_redirection_activee' => 'Il reindirizzamento è attivato.', |
|
| 445 | + 'info_redirection_boucle' => 'Stai cercando di sovrascrivere l’articolo.', |
|
| 446 | + 'info_redirection_desactivee' => 'Il reindirizzamento è stato cancellato.', |
|
| 447 | + 'info_refuses' => 'I tuoi articoli rifiutati', |
|
| 448 | + 'info_reglage_ldap' => 'Opzioni: <b>Parametri per l’importazione LDAP</b>', |
|
| 449 | + 'info_renvoi_article' => '<b>Reindirizzamento.</b> Quest’articolo rimanda alla pagina:', |
|
| 450 | + 'info_reserve_admin' => 'Solo gli amministratori possono modificare quest’indirizzo.', |
|
| 451 | + 'info_restreindre_rubrique' => 'Limita la facoltà di gestione alla rubrica:', |
|
| 452 | + 'info_resultat_recherche' => 'Risultati della ricerca:', |
|
| 453 | + 'info_rubriques' => 'Rubriche', |
|
| 454 | + 'info_rubriques_02' => 'rubriche', |
|
| 455 | + 'info_rubriques_trouvees' => 'Rubriche trovate', |
|
| 456 | + 'info_sans_titre' => 'Senza titolo', |
|
| 457 | + 'info_selection_chemin_acces' => '<b>Seleziona</b> qui sotto il percorso d’accesso nell’elenco:', |
|
| 458 | + 'info_signatures' => 'firme', |
|
| 459 | + 'info_site' => 'Sito', |
|
| 460 | + 'info_site_2' => 'sito: ', |
|
| 461 | + 'info_site_min' => 'sito', |
|
| 462 | + 'info_site_reference_2' => 'Sito repertoriato', |
|
| 463 | + 'info_site_web' => 'Sito Web:', |
|
| 464 | + 'info_sites' => 'siti', |
|
| 465 | + 'info_sites_lies_mot' => 'I siti in repertorio legati a questa parola chiave', |
|
| 466 | + 'info_sites_proxy' => 'Utilizza un proxy', |
|
| 467 | + 'info_sites_trouves' => 'Siti trovati', |
|
| 468 | + 'info_sous_titre' => 'Sottotitolo:', |
|
| 469 | + 'info_statut_administrateur' => 'Amministratore', |
|
| 470 | + 'info_statut_auteur' => 'Status di questo autore:', |
|
| 471 | + 'info_statut_auteur_2' => 'Io sono', |
|
| 472 | + 'info_statut_auteur_a_confirmer' => 'Iscrizione da confermare', |
|
| 473 | + 'info_statut_auteur_autre' => 'Altro stato:', |
|
| 474 | + 'info_statut_redacteur' => 'Redattore', |
|
| 475 | + 'info_statut_utilisateurs_1' => 'Status predefinito degli utenti importati', |
|
| 476 | + 'info_statut_utilisateurs_2' => 'Scegli lo status da attribuire alle personne presenti nell’elenco LDAP quando si collegano per la prima volta. Potrai poi modificare questa impostazione per ogni singolo autore.', |
|
| 477 | + 'info_suivi_activite' => 'Monitoraggio dell’attività editoriale', |
|
| 478 | + 'info_surtitre' => 'Occhiello:', |
|
| 479 | + 'info_syndication_integrale_1' => 'Il tuo sito propone dei file di syndication (vedi « <a href="@url@">@titre@</a> »).', |
|
| 480 | + 'info_syndication_integrale_2' => 'Si desidera trasmettere gli articoli in versione integrale oppure in versione riassunta di un centinaio di caratteri?', |
|
| 481 | + 'info_table_prefix' => 'È possibile modificare il prefisso del nome delle tabelle del database (cosa indispensabile se si desidera installare più siti usando il medesimo database). Questo prefisso si deve scrivere usando esclusivamente lettere minuscole, prive di accenti e senza alcuno spazio.', |
|
| 482 | + 'info_taille_maximale_images' => 'SPIP testerà la dimensione massima delle immagini che può manipolare (in milioni di pixel).<br /> Le immagini di dimensione maggiore non saranno ridotte.', |
|
| 483 | + 'info_taille_maximale_vignette' => 'Dimensione massima delle immagini create dal sistema:', |
|
| 484 | + 'info_terminer_installation' => 'Puoi ora terminare la procedura d’installazione standard.', |
|
| 485 | + 'info_texte' => 'Testo', |
|
| 486 | + 'info_texte_explicatif' => 'Testo esplicativo', |
|
| 487 | + 'info_texte_long' => '(il testo è lungo: è quindi visualizzato in più sezioni che verranno riunificate dopo la convalida)', |
|
| 488 | + 'info_texte_message' => 'Testo del tuo messaggio:', |
|
| 489 | + 'info_texte_message_02' => 'Testo del messaggio', |
|
| 490 | + 'info_titre' => 'Titolo:', |
|
| 491 | + 'info_total' => 'totale: ', |
|
| 492 | + 'info_tous_articles_en_redaction' => 'Tutti gli articoli in corso di redazione', |
|
| 493 | + 'info_tous_articles_presents' => 'Tutti gli articoli pubblicati in questa rubrica', |
|
| 494 | + 'info_tous_articles_refuses' => 'Tutti gli articoli rifiutati', |
|
| 495 | + 'info_tous_les' => 'tutti i:', |
|
| 496 | + 'info_tout_site' => 'Tutto il sito', |
|
| 497 | + 'info_tout_site2' => 'L’articolo non è stato tradotto in questa lingua.', |
|
| 498 | + 'info_tout_site3' => 'L’articolo è stato tradotto in questa lingua, ma sono state effettuate alcune modifiche all’articolo di riferimento. La traduzione deve quindi essere aggiornata.', |
|
| 499 | + 'info_tout_site4' => 'L’articolo è stato tradotto in questa lingua e la traduzione è aggiornata.', |
|
| 500 | + 'info_tout_site5' => 'Articolo originale.', |
|
| 501 | + 'info_tout_site6' => '<b>Attenzione:</b> solo gli articoli originali vengono visualizzati. |
|
| 502 | 502 | Le traduzioni sono associate all’originale, |
| 503 | 503 | in un colore che indica il loro stato:', |
| 504 | - 'info_traductions' => 'Traduzioni', |
|
| 505 | - 'info_travail_colaboratif' => 'Lavoro di collaborazione sugli articoli', |
|
| 506 | - 'info_un_article' => 'un articolo, ', |
|
| 507 | - 'info_un_site' => 'un sito, ', |
|
| 508 | - 'info_une_rubrique' => 'una rubrica, ', |
|
| 509 | - 'info_une_rubrique_02' => '1 rubrica', |
|
| 510 | - 'info_url' => 'URL:', |
|
| 511 | - 'info_url_proxy' => 'URL del proxy', |
|
| 512 | - 'info_url_proxy_pas_conforme' => 'L’URL del proxy non è valido.', |
|
| 513 | - 'info_url_site_pas_conforme' => 'l’URL del sito non è valido.', |
|
| 514 | - 'info_url_test_proxy' => 'URL di test', |
|
| 515 | - 'info_urlref' => 'Link ipertestuale:', |
|
| 516 | - 'info_utilisation_spip' => 'Puoi ora cominciare ad utilizzare il sistema di pubblicazione assistita...', |
|
| 517 | - 'info_visites_par_mois' => 'Visualizzazione per mese:', |
|
| 518 | - 'info_visiteur_1' => 'Visitatori', |
|
| 519 | - 'info_visiteur_2' => 'del sito pubblico', |
|
| 520 | - 'info_visiteurs' => 'Visitatori', |
|
| 521 | - 'info_visiteurs_02' => 'Visitatori del sito pubblico', |
|
| 522 | - 'info_webmestre_forces' => 'I webmaster sono attualmente definiti in <tt>@file_options@</tt>.', |
|
| 523 | - 'install_adresse_base_hebergeur' => 'Indirizzo del database attribuito dal provider', |
|
| 524 | - 'install_connect_ok' => 'Il nuovo database è stato definito sul server @connect@.', |
|
| 525 | - 'install_echec_annonce' => 'L’installazione potrebbe fallire oppure causare problemi di funzionalità al sito...', |
|
| 526 | - 'install_extension_mbstring' => 'SPIP non funziona con:', |
|
| 527 | - 'install_extension_php_obligatoire' => 'SPIP esige l’estensione php:', |
|
| 528 | - 'install_login_base_hebergeur' => 'Login di connessione attribuito dal provider', |
|
| 529 | - 'install_nom_base_hebergeur' => 'Nome del database attribuito dal provider:', |
|
| 530 | - 'install_pas_table' => 'Database attualmente senza tabelle', |
|
| 531 | - 'install_pass_base_hebergeur' => 'Password di connessione attribuito dal provider', |
|
| 532 | - 'install_php_extension' => 'Mancano le seguenti estensioni: @extensions@', |
|
| 533 | - 'install_php_version' => 'PHP versione @version@ insufficiente (minimo = @minimum@)', |
|
| 534 | - 'install_php_version_max' => 'La versione @version@ di PHP é troppo recente (versione massima = @maximum@)', |
|
| 535 | - 'install_select_langue' => 'Seleziona una lingua e poi clicca sul bottone « Avanti » per lanciare la procedura di installazione.', |
|
| 536 | - 'install_select_type_db' => 'Indicare il tipo di database:', |
|
| 537 | - 'install_select_type_mysql' => 'MySQL', |
|
| 538 | - 'install_select_type_pg' => 'PostgreSQL', |
|
| 539 | - 'install_select_type_sqlite2' => 'SQLite 2', |
|
| 540 | - 'install_select_type_sqlite3' => 'SQLite 3', |
|
| 541 | - 'install_serveur_hebergeur' => 'Server del database attribuito dall’hoster', |
|
| 542 | - 'install_table_prefix_hebergeur' => 'Prefisso della tabella attribuito dal provider:', |
|
| 543 | - 'install_tables_base' => 'Tabelle del database', |
|
| 544 | - 'install_types_db_connus' => 'SPIP può utilizzare <b>MySQL</b> (il più diffuso) e <b>SQLite</b>.', |
|
| 545 | - 'install_types_db_connus_avertissement' => 'Il supporto a <b>PostgreSQL</b> è proposto a titolo sperimentale.', |
|
| 546 | - 'instituer_erreur_statut_a_change' => 'Lo status è già stato modificato', |
|
| 547 | - 'instituer_erreur_statut_non_autorise' => 'Non puoi selezionare questo stato', |
|
| 548 | - 'intem_redacteur' => 'redattore', |
|
| 549 | - 'intitule_licence' => 'Licenza', |
|
| 550 | - 'item_accepter_inscriptions' => 'Accetta le iscrizioni', |
|
| 551 | - 'item_activer_messages_avertissement' => 'Attiva i messaggi d’avvertimento', |
|
| 552 | - 'item_administrateur_2' => 'amministratore', |
|
| 553 | - 'item_afficher_calendrier' => 'Pubblica nel calendario', |
|
| 554 | - 'item_autoriser_syndication_integrale' => 'Diffondere la versione integrale degli articoli nei file di syndication', |
|
| 555 | - 'item_choix_administrateurs' => 'gli amministratori', |
|
| 556 | - 'item_choix_generation_miniature' => 'Genera automaticamente le thumbnail delle immagini.', |
|
| 557 | - 'item_choix_non_generation_miniature' => 'Non creare le thumbnail delle immagini.', |
|
| 558 | - 'item_choix_redacteurs' => 'i redattori', |
|
| 559 | - 'item_choix_visiteurs' => 'i visitatori del sito pubblico', |
|
| 560 | - 'item_creer_fichiers_authent' => 'Crea i file .htpasswd', |
|
| 561 | - 'item_login' => 'Login', |
|
| 562 | - 'item_messagerie_agenda' => 'Attiva la messaggistica e l’agenda', |
|
| 563 | - 'item_mots_cles_association_articles' => 'agli articoli', |
|
| 564 | - 'item_mots_cles_association_rubriques' => 'alle rubriche', |
|
| 565 | - 'item_mots_cles_association_sites' => 'ai siti repertoriati o in syndication.', |
|
| 566 | - 'item_non' => 'No', |
|
| 567 | - 'item_non_accepter_inscriptions' => 'Non accettare le iscrizioni', |
|
| 568 | - 'item_non_activer_messages_avertissement' => 'Nessun messaggio d’avvertimento', |
|
| 569 | - 'item_non_afficher_calendrier' => 'Non pubblicare nel calendario', |
|
| 570 | - 'item_non_autoriser_syndication_integrale' => 'Diffondere solo un riassunto', |
|
| 571 | - 'item_non_creer_fichiers_authent' => 'Non creare questi file', |
|
| 572 | - 'item_non_messagerie_agenda' => 'Disattiva la messaggistica e l’agenda', |
|
| 573 | - 'item_non_publier_articles' => 'Non pubblicare gli articoli prima della data impostata.', |
|
| 574 | - 'item_nouvel_auteur' => 'Nuovo autore', |
|
| 575 | - 'item_nouvelle_rubrique' => 'Nuova rubrica', |
|
| 576 | - 'item_oui' => 'Si', |
|
| 577 | - 'item_publier_articles' => 'Pubblica gli articoli indipendentemente dalla data impostata.', |
|
| 578 | - 'item_reponse_article' => 'Risposta all’articolo ', |
|
| 579 | - 'item_visiteur' => 'visitatore', |
|
| 504 | + 'info_traductions' => 'Traduzioni', |
|
| 505 | + 'info_travail_colaboratif' => 'Lavoro di collaborazione sugli articoli', |
|
| 506 | + 'info_un_article' => 'un articolo, ', |
|
| 507 | + 'info_un_site' => 'un sito, ', |
|
| 508 | + 'info_une_rubrique' => 'una rubrica, ', |
|
| 509 | + 'info_une_rubrique_02' => '1 rubrica', |
|
| 510 | + 'info_url' => 'URL:', |
|
| 511 | + 'info_url_proxy' => 'URL del proxy', |
|
| 512 | + 'info_url_proxy_pas_conforme' => 'L’URL del proxy non è valido.', |
|
| 513 | + 'info_url_site_pas_conforme' => 'l’URL del sito non è valido.', |
|
| 514 | + 'info_url_test_proxy' => 'URL di test', |
|
| 515 | + 'info_urlref' => 'Link ipertestuale:', |
|
| 516 | + 'info_utilisation_spip' => 'Puoi ora cominciare ad utilizzare il sistema di pubblicazione assistita...', |
|
| 517 | + 'info_visites_par_mois' => 'Visualizzazione per mese:', |
|
| 518 | + 'info_visiteur_1' => 'Visitatori', |
|
| 519 | + 'info_visiteur_2' => 'del sito pubblico', |
|
| 520 | + 'info_visiteurs' => 'Visitatori', |
|
| 521 | + 'info_visiteurs_02' => 'Visitatori del sito pubblico', |
|
| 522 | + 'info_webmestre_forces' => 'I webmaster sono attualmente definiti in <tt>@file_options@</tt>.', |
|
| 523 | + 'install_adresse_base_hebergeur' => 'Indirizzo del database attribuito dal provider', |
|
| 524 | + 'install_connect_ok' => 'Il nuovo database è stato definito sul server @connect@.', |
|
| 525 | + 'install_echec_annonce' => 'L’installazione potrebbe fallire oppure causare problemi di funzionalità al sito...', |
|
| 526 | + 'install_extension_mbstring' => 'SPIP non funziona con:', |
|
| 527 | + 'install_extension_php_obligatoire' => 'SPIP esige l’estensione php:', |
|
| 528 | + 'install_login_base_hebergeur' => 'Login di connessione attribuito dal provider', |
|
| 529 | + 'install_nom_base_hebergeur' => 'Nome del database attribuito dal provider:', |
|
| 530 | + 'install_pas_table' => 'Database attualmente senza tabelle', |
|
| 531 | + 'install_pass_base_hebergeur' => 'Password di connessione attribuito dal provider', |
|
| 532 | + 'install_php_extension' => 'Mancano le seguenti estensioni: @extensions@', |
|
| 533 | + 'install_php_version' => 'PHP versione @version@ insufficiente (minimo = @minimum@)', |
|
| 534 | + 'install_php_version_max' => 'La versione @version@ di PHP é troppo recente (versione massima = @maximum@)', |
|
| 535 | + 'install_select_langue' => 'Seleziona una lingua e poi clicca sul bottone « Avanti » per lanciare la procedura di installazione.', |
|
| 536 | + 'install_select_type_db' => 'Indicare il tipo di database:', |
|
| 537 | + 'install_select_type_mysql' => 'MySQL', |
|
| 538 | + 'install_select_type_pg' => 'PostgreSQL', |
|
| 539 | + 'install_select_type_sqlite2' => 'SQLite 2', |
|
| 540 | + 'install_select_type_sqlite3' => 'SQLite 3', |
|
| 541 | + 'install_serveur_hebergeur' => 'Server del database attribuito dall’hoster', |
|
| 542 | + 'install_table_prefix_hebergeur' => 'Prefisso della tabella attribuito dal provider:', |
|
| 543 | + 'install_tables_base' => 'Tabelle del database', |
|
| 544 | + 'install_types_db_connus' => 'SPIP può utilizzare <b>MySQL</b> (il più diffuso) e <b>SQLite</b>.', |
|
| 545 | + 'install_types_db_connus_avertissement' => 'Il supporto a <b>PostgreSQL</b> è proposto a titolo sperimentale.', |
|
| 546 | + 'instituer_erreur_statut_a_change' => 'Lo status è già stato modificato', |
|
| 547 | + 'instituer_erreur_statut_non_autorise' => 'Non puoi selezionare questo stato', |
|
| 548 | + 'intem_redacteur' => 'redattore', |
|
| 549 | + 'intitule_licence' => 'Licenza', |
|
| 550 | + 'item_accepter_inscriptions' => 'Accetta le iscrizioni', |
|
| 551 | + 'item_activer_messages_avertissement' => 'Attiva i messaggi d’avvertimento', |
|
| 552 | + 'item_administrateur_2' => 'amministratore', |
|
| 553 | + 'item_afficher_calendrier' => 'Pubblica nel calendario', |
|
| 554 | + 'item_autoriser_syndication_integrale' => 'Diffondere la versione integrale degli articoli nei file di syndication', |
|
| 555 | + 'item_choix_administrateurs' => 'gli amministratori', |
|
| 556 | + 'item_choix_generation_miniature' => 'Genera automaticamente le thumbnail delle immagini.', |
|
| 557 | + 'item_choix_non_generation_miniature' => 'Non creare le thumbnail delle immagini.', |
|
| 558 | + 'item_choix_redacteurs' => 'i redattori', |
|
| 559 | + 'item_choix_visiteurs' => 'i visitatori del sito pubblico', |
|
| 560 | + 'item_creer_fichiers_authent' => 'Crea i file .htpasswd', |
|
| 561 | + 'item_login' => 'Login', |
|
| 562 | + 'item_messagerie_agenda' => 'Attiva la messaggistica e l’agenda', |
|
| 563 | + 'item_mots_cles_association_articles' => 'agli articoli', |
|
| 564 | + 'item_mots_cles_association_rubriques' => 'alle rubriche', |
|
| 565 | + 'item_mots_cles_association_sites' => 'ai siti repertoriati o in syndication.', |
|
| 566 | + 'item_non' => 'No', |
|
| 567 | + 'item_non_accepter_inscriptions' => 'Non accettare le iscrizioni', |
|
| 568 | + 'item_non_activer_messages_avertissement' => 'Nessun messaggio d’avvertimento', |
|
| 569 | + 'item_non_afficher_calendrier' => 'Non pubblicare nel calendario', |
|
| 570 | + 'item_non_autoriser_syndication_integrale' => 'Diffondere solo un riassunto', |
|
| 571 | + 'item_non_creer_fichiers_authent' => 'Non creare questi file', |
|
| 572 | + 'item_non_messagerie_agenda' => 'Disattiva la messaggistica e l’agenda', |
|
| 573 | + 'item_non_publier_articles' => 'Non pubblicare gli articoli prima della data impostata.', |
|
| 574 | + 'item_nouvel_auteur' => 'Nuovo autore', |
|
| 575 | + 'item_nouvelle_rubrique' => 'Nuova rubrica', |
|
| 576 | + 'item_oui' => 'Si', |
|
| 577 | + 'item_publier_articles' => 'Pubblica gli articoli indipendentemente dalla data impostata.', |
|
| 578 | + 'item_reponse_article' => 'Risposta all’articolo ', |
|
| 579 | + 'item_visiteur' => 'visitatore', |
|
| 580 | 580 | |
| 581 | - // J |
|
| 582 | - 'jour_non_connu_nc' => 'n.c.', |
|
| 581 | + // J |
|
| 582 | + 'jour_non_connu_nc' => 'n.c.', |
|
| 583 | 583 | |
| 584 | - // L |
|
| 585 | - 'label_bando_outils' => 'Barra degli strumenti', |
|
| 586 | - 'label_bando_outils_afficher' => 'Mostra gli strumenti', |
|
| 587 | - 'label_bando_outils_masquer' => 'Nascondi gli strumenti', |
|
| 588 | - 'label_choix_langue' => 'Seleziona la tua lingua', |
|
| 589 | - 'label_nom_fichier_connect' => 'Indica il nome per questo server', |
|
| 590 | - 'label_slogan_site' => 'Slogan del sito', |
|
| 591 | - 'label_taille_ecran' => 'Larghezza dello schermo', |
|
| 592 | - 'label_texte_et_icones_navigation' => 'Menù di naviagazione', |
|
| 593 | - 'label_texte_et_icones_page' => 'Visualizzazione nella pagina', |
|
| 594 | - 'ldap_correspondance' => 'mappa del campo @champ@', |
|
| 595 | - 'ldap_correspondance_1' => 'Mappa dei campi LDAP', |
|
| 596 | - 'ldap_correspondance_2' => 'Per ognuno dei seguenti campi SPIP, indicare il nome del campo LDAP corrispondente. Lasciare vuoto per non riempire, separare da spazi o da virgole per provare più campi LDAP.', |
|
| 597 | - 'lien_ajouter_auteur' => 'Aggiungi questo autore', |
|
| 598 | - 'lien_ajouter_une_rubrique' => 'Aggiungi questa rubrica', |
|
| 599 | - 'lien_email' => 'email', |
|
| 600 | - 'lien_nom_site' => 'NOME DEL SITO:', |
|
| 601 | - 'lien_rapide_contenu' => 'Vai al contenuto', |
|
| 602 | - 'lien_rapide_navigation' => 'Vai alla navigazione', |
|
| 603 | - 'lien_rapide_recherche' => 'Vai alla ricerca', |
|
| 604 | - 'lien_retirer_auteur' => 'Rimuovere l’autore', |
|
| 605 | - 'lien_retirer_rubrique' => 'Elimina la rubrica', |
|
| 606 | - 'lien_retirer_tous_auteurs' => 'Elimina tutti gli autori', |
|
| 607 | - 'lien_retirer_toutes_rubriques' => 'Rimuovi tutte le rubriche', |
|
| 608 | - 'lien_site' => 'sito', |
|
| 609 | - 'lien_tout_decocher' => 'Deselezionare tutto', |
|
| 610 | - 'lien_tout_deplier' => 'Espandi', |
|
| 611 | - 'lien_tout_replier' => 'Richiudi', |
|
| 612 | - 'lien_tout_supprimer' => 'Eliminare tutto', |
|
| 613 | - 'lien_trier_nom' => 'Ordina per nome', |
|
| 614 | - 'lien_trier_nombre_articles' => 'Ordina per numero di articoli', |
|
| 615 | - 'lien_trier_statut' => 'Ordina per status', |
|
| 616 | - 'lien_voir_en_ligne' => 'VEDI ON LINE:', |
|
| 617 | - 'logo_article' => 'Logo dell’articolo', |
|
| 618 | - 'logo_auteur' => 'Logo dell’autore', |
|
| 619 | - 'logo_rubrique' => 'Logo della rubrica', |
|
| 620 | - 'logo_site' => 'Logo di questo sito', |
|
| 621 | - 'logo_standard_rubrique' => 'Logo standard delle rubriche', |
|
| 622 | - 'logo_survol' => 'Logo per il rollover', |
|
| 584 | + // L |
|
| 585 | + 'label_bando_outils' => 'Barra degli strumenti', |
|
| 586 | + 'label_bando_outils_afficher' => 'Mostra gli strumenti', |
|
| 587 | + 'label_bando_outils_masquer' => 'Nascondi gli strumenti', |
|
| 588 | + 'label_choix_langue' => 'Seleziona la tua lingua', |
|
| 589 | + 'label_nom_fichier_connect' => 'Indica il nome per questo server', |
|
| 590 | + 'label_slogan_site' => 'Slogan del sito', |
|
| 591 | + 'label_taille_ecran' => 'Larghezza dello schermo', |
|
| 592 | + 'label_texte_et_icones_navigation' => 'Menù di naviagazione', |
|
| 593 | + 'label_texte_et_icones_page' => 'Visualizzazione nella pagina', |
|
| 594 | + 'ldap_correspondance' => 'mappa del campo @champ@', |
|
| 595 | + 'ldap_correspondance_1' => 'Mappa dei campi LDAP', |
|
| 596 | + 'ldap_correspondance_2' => 'Per ognuno dei seguenti campi SPIP, indicare il nome del campo LDAP corrispondente. Lasciare vuoto per non riempire, separare da spazi o da virgole per provare più campi LDAP.', |
|
| 597 | + 'lien_ajouter_auteur' => 'Aggiungi questo autore', |
|
| 598 | + 'lien_ajouter_une_rubrique' => 'Aggiungi questa rubrica', |
|
| 599 | + 'lien_email' => 'email', |
|
| 600 | + 'lien_nom_site' => 'NOME DEL SITO:', |
|
| 601 | + 'lien_rapide_contenu' => 'Vai al contenuto', |
|
| 602 | + 'lien_rapide_navigation' => 'Vai alla navigazione', |
|
| 603 | + 'lien_rapide_recherche' => 'Vai alla ricerca', |
|
| 604 | + 'lien_retirer_auteur' => 'Rimuovere l’autore', |
|
| 605 | + 'lien_retirer_rubrique' => 'Elimina la rubrica', |
|
| 606 | + 'lien_retirer_tous_auteurs' => 'Elimina tutti gli autori', |
|
| 607 | + 'lien_retirer_toutes_rubriques' => 'Rimuovi tutte le rubriche', |
|
| 608 | + 'lien_site' => 'sito', |
|
| 609 | + 'lien_tout_decocher' => 'Deselezionare tutto', |
|
| 610 | + 'lien_tout_deplier' => 'Espandi', |
|
| 611 | + 'lien_tout_replier' => 'Richiudi', |
|
| 612 | + 'lien_tout_supprimer' => 'Eliminare tutto', |
|
| 613 | + 'lien_trier_nom' => 'Ordina per nome', |
|
| 614 | + 'lien_trier_nombre_articles' => 'Ordina per numero di articoli', |
|
| 615 | + 'lien_trier_statut' => 'Ordina per status', |
|
| 616 | + 'lien_voir_en_ligne' => 'VEDI ON LINE:', |
|
| 617 | + 'logo_article' => 'Logo dell’articolo', |
|
| 618 | + 'logo_auteur' => 'Logo dell’autore', |
|
| 619 | + 'logo_rubrique' => 'Logo della rubrica', |
|
| 620 | + 'logo_site' => 'Logo di questo sito', |
|
| 621 | + 'logo_standard_rubrique' => 'Logo standard delle rubriche', |
|
| 622 | + 'logo_survol' => 'Logo per il rollover', |
|
| 623 | 623 | |
| 624 | - // M |
|
| 625 | - 'menu_aide_installation_choix_base' => 'Scegliere il database', |
|
| 626 | - 'module_fichier_langue' => 'File lingua', |
|
| 627 | - 'module_raccourci' => 'Scorciatoia', |
|
| 628 | - 'module_texte_affiche' => 'Testo visualizzato', |
|
| 629 | - 'module_texte_explicatif' => 'È possibile inserire le scorciatoie nel modello di layout del proprio sito pubblico. Queste verranno tradotte automaticamente nelle diverse lingue (se esiste già un file lingua).', |
|
| 630 | - 'module_texte_traduction' => 'Il file lingua «@module@» è disponibile in:', |
|
| 631 | - 'mois_non_connu' => 'sconosciuto', |
|
| 624 | + // M |
|
| 625 | + 'menu_aide_installation_choix_base' => 'Scegliere il database', |
|
| 626 | + 'module_fichier_langue' => 'File lingua', |
|
| 627 | + 'module_raccourci' => 'Scorciatoia', |
|
| 628 | + 'module_texte_affiche' => 'Testo visualizzato', |
|
| 629 | + 'module_texte_explicatif' => 'È possibile inserire le scorciatoie nel modello di layout del proprio sito pubblico. Queste verranno tradotte automaticamente nelle diverse lingue (se esiste già un file lingua).', |
|
| 630 | + 'module_texte_traduction' => 'Il file lingua «@module@» è disponibile in:', |
|
| 631 | + 'mois_non_connu' => 'sconosciuto', |
|
| 632 | 632 | |
| 633 | - // N |
|
| 634 | - 'nouvelle_version_spip' => 'L’aggiornamento alla versione @version@ di SPIP è disponibile', |
|
| 635 | - 'nouvelle_version_spip_majeure' => 'La nuova versione @version@ di SPIP è disponibile', |
|
| 633 | + // N |
|
| 634 | + 'nouvelle_version_spip' => 'L’aggiornamento alla versione @version@ di SPIP è disponibile', |
|
| 635 | + 'nouvelle_version_spip_majeure' => 'La nuova versione @version@ di SPIP è disponibile', |
|
| 636 | 636 | |
| 637 | - // O |
|
| 638 | - 'onglet_contenu' => 'Contenuto', |
|
| 639 | - 'onglet_declarer_une_autre_base' => 'Dichiarare un altro database', |
|
| 640 | - 'onglet_discuter' => 'Discuti', |
|
| 641 | - 'onglet_interactivite' => 'Interattività', |
|
| 642 | - 'onglet_proprietes' => 'Proprietà', |
|
| 643 | - 'onglet_repartition_actuelle' => 'attualmente', |
|
| 644 | - 'onglet_sous_rubriques' => 'Sotto-rubriche', |
|
| 637 | + // O |
|
| 638 | + 'onglet_contenu' => 'Contenuto', |
|
| 639 | + 'onglet_declarer_une_autre_base' => 'Dichiarare un altro database', |
|
| 640 | + 'onglet_discuter' => 'Discuti', |
|
| 641 | + 'onglet_interactivite' => 'Interattività', |
|
| 642 | + 'onglet_proprietes' => 'Proprietà', |
|
| 643 | + 'onglet_repartition_actuelle' => 'attualmente', |
|
| 644 | + 'onglet_sous_rubriques' => 'Sotto-rubriche', |
|
| 645 | 645 | |
| 646 | - // P |
|
| 647 | - 'page_pas_proxy' => 'Questa pagina non deve passare attraverso il proxy', |
|
| 648 | - 'pas_de_proxy_pour' => 'Se necessario, indicare i server o i domini per i quali non si deve applicare questo proxy (per esempio: @exemple@)', |
|
| 649 | - 'phpinfo' => 'Configurazione PHP', |
|
| 650 | - 'plugin_charge_paquet' => 'Caricamento del pacchetto @name@', |
|
| 651 | - 'plugin_charger' => 'Download', |
|
| 652 | - 'plugin_erreur_charger' => 'errore: impossibile caricare @zip@', |
|
| 653 | - 'plugin_erreur_droit1' => 'La directory <code>@dest@</code> non ha i permessi di scrittura.', |
|
| 654 | - 'plugin_erreur_droit2' => 'Verificare i diritti su questa directory (se necessario crearla), o installare i file tramite FTP.', |
|
| 655 | - 'plugin_erreur_zip' => 'fallimento pclzip: errore @status@', |
|
| 656 | - 'plugin_etat_developpement' => 'in corso di sviluppo', |
|
| 657 | - 'plugin_etat_experimental' => 'sperimentale', |
|
| 658 | - 'plugin_etat_stable' => 'stabile', |
|
| 659 | - 'plugin_etat_test' => 'in prova', |
|
| 660 | - 'plugin_impossible_activer' => 'Impossibile attivare l’estensione @plugin@', |
|
| 661 | - 'plugin_info_automatique1' => 'Se si desidera autorizzare l’installazione automatica dell’estensione è necessario: ', |
|
| 662 | - 'plugin_info_automatique1_lib' => 'Se vuoi autorizzare l’installazione automatica di questa libreria:', |
|
| 663 | - 'plugin_info_automatique2' => 'creare una directory <code>@rep@</code>;', |
|
| 664 | - 'plugin_info_automatique3' => 'verificare che il server sia autorizzato a scrivere in questa directory.', |
|
| 665 | - 'plugin_info_automatique_creer' => 'da creare alla radice del sito.', |
|
| 666 | - 'plugin_info_automatique_exemples' => 'esempi:', |
|
| 667 | - 'plugin_info_automatique_ftp' => 'È possibile installare plug-in tramite FTP, nella cartella <tt>@rep@</tt>', |
|
| 668 | - 'plugin_info_automatique_lib' => 'Alcune estensioni richiedono anche di poter trasferire dei file nella cartella <code>lib/</code>, da creare (se necessario) alla radice del sito.', |
|
| 669 | - 'plugin_info_automatique_liste' => 'Gli elenchi delle estensioni:', |
|
| 670 | - 'plugin_info_automatique_liste_officielle' => 'le estensioni ufficiali', |
|
| 671 | - 'plugin_info_automatique_liste_update' => 'Aggiornare gli elenchi', |
|
| 672 | - 'plugin_info_automatique_ou' => 'oppure...', |
|
| 673 | - 'plugin_info_automatique_select' => 'Selezionata un’estensione qui sotto: SPIP la scaricherà e la installerà nella cartella <code>@rep@</code>; se questo estensione è già presente verrà aggiornata.', |
|
| 674 | - 'plugin_info_credit' => 'Crediti', |
|
| 675 | - 'plugin_info_erreur_xml' => 'La dichiarazione del plugin è sbagliata', |
|
| 676 | - 'plugin_info_install_ok' => 'Installazione completata con successo', |
|
| 677 | - 'plugin_info_necessite' => 'Richiesto :', |
|
| 678 | - 'plugin_info_non_compatible_spip' => 'Questo plugin è incompatibile con questa versione di SPIP', |
|
| 679 | - 'plugin_info_plugins_dist_1' => 'Le estensioni sottostanti sono caricate e attivate nella directory @plugins_dist@.', |
|
| 680 | - 'plugin_info_plugins_dist_2' => 'Questi non possono essere disabilitati.', |
|
| 681 | - 'plugin_info_telecharger' => 'da scaricare da @url@ e da installare in @rep@', |
|
| 682 | - 'plugin_info_upgrade_ok' => 'Aggiornamento avvenuto', |
|
| 683 | - 'plugin_librairies_installees' => 'Librerie installate', |
|
| 684 | - 'plugin_necessite_extension_php' => 'Richiede l’estensione PHP @plugin@ in versione @version@.', |
|
| 685 | - 'plugin_necessite_extension_php_sans_version' => 'Richiede l’estensione PHP @plugin@', |
|
| 686 | - 'plugin_necessite_lib' => 'Questa estensione richiede la libreria @lib@', |
|
| 687 | - 'plugin_necessite_php' => 'Richiede @plugin@ in versione @version@.', |
|
| 688 | - 'plugin_necessite_plugin' => 'Necessita l’estensione @plugin@ con la versione @version@.', |
|
| 689 | - 'plugin_necessite_plugin_sans_version' => 'Necessita del plugin @plugin@', |
|
| 690 | - 'plugin_necessite_spip' => 'Necessita SPIP con almeno la versione @version@.', |
|
| 691 | - 'plugin_source' => 'origine: ', |
|
| 692 | - 'plugin_titre_automatique' => 'Installazione automatica', |
|
| 693 | - 'plugin_titre_automatique_ajouter' => 'Aggiungere dei plugin', |
|
| 694 | - 'plugin_titre_installation' => 'Installazione del plugin @plugin@', |
|
| 695 | - 'plugin_titre_modifier' => 'I miei plugin', |
|
| 696 | - 'plugin_utilise_extension_php' => 'Usa l’estensione PHP @plugin@ in versione @version@.', |
|
| 697 | - 'plugin_utilise_php' => 'Utilizza @plugin@ in versione @version@.', |
|
| 698 | - 'plugin_utilise_plugin' => 'Utilizza il plugin @plugin@ in versione @version@.', |
|
| 699 | - 'plugin_zip_active' => 'Continuare per attivarlo', |
|
| 700 | - 'plugin_zip_adresse' => 'indicate qui sotto l’indirizzo di un file zip del plug-in da scaricare, oppure l’indirizzo di un elenco di plug-in.', |
|
| 701 | - 'plugin_zip_adresse_champ' => 'Indirizzo del plug-in o dell’elenco ', |
|
| 702 | - 'plugin_zip_content' => 'Esso contiene i file seguenti (@taille@),<br />pronti per essere installati nella cartella <code>@rep@</code>', |
|
| 703 | - 'plugin_zip_installe_finie' => 'Il file @zip@ è stato decompresso e installato.', |
|
| 704 | - 'plugin_zip_installe_rep_finie' => 'Il file @zip@ è stato decompresso e installato nella cartella @rep@', |
|
| 705 | - 'plugin_zip_installer' => 'Ora è possibile installarlo.', |
|
| 706 | - 'plugin_zip_telecharge' => 'Il file @zip@ è stato scaricato', |
|
| 707 | - 'plugins_actif_aucun' => 'Nessun plugin attivo', |
|
| 708 | - 'plugins_actif_un' => 'Un plugin attivo', |
|
| 709 | - 'plugins_actifs' => '@count@ plug-in attivati.', |
|
| 710 | - 'plugins_actifs_liste' => 'Attivo', |
|
| 711 | - 'plugins_compte' => '@count@ plug-in', |
|
| 712 | - 'plugins_disponible_un' => 'Un plugin disponibile', |
|
| 713 | - 'plugins_disponibles' => '@count@ plug-in disponibili.', |
|
| 714 | - 'plugins_erreur' => 'Errore nei plug-in: @plugins@', |
|
| 715 | - 'plugins_liste' => 'Elenco dei plugin', |
|
| 716 | - 'plugins_liste_dist' => 'Plugin bloccato', |
|
| 717 | - 'plugins_recents' => 'Plugin aggiunti recentemente', |
|
| 718 | - 'plugins_tous_liste' => 'Tutto', |
|
| 719 | - 'plugins_vue_hierarchie' => 'Struttura gerarchica', |
|
| 720 | - 'plugins_vue_liste' => 'Elenco', |
|
| 721 | - 'protocole_ldap' => 'Versione del protocollo:', |
|
| 646 | + // P |
|
| 647 | + 'page_pas_proxy' => 'Questa pagina non deve passare attraverso il proxy', |
|
| 648 | + 'pas_de_proxy_pour' => 'Se necessario, indicare i server o i domini per i quali non si deve applicare questo proxy (per esempio: @exemple@)', |
|
| 649 | + 'phpinfo' => 'Configurazione PHP', |
|
| 650 | + 'plugin_charge_paquet' => 'Caricamento del pacchetto @name@', |
|
| 651 | + 'plugin_charger' => 'Download', |
|
| 652 | + 'plugin_erreur_charger' => 'errore: impossibile caricare @zip@', |
|
| 653 | + 'plugin_erreur_droit1' => 'La directory <code>@dest@</code> non ha i permessi di scrittura.', |
|
| 654 | + 'plugin_erreur_droit2' => 'Verificare i diritti su questa directory (se necessario crearla), o installare i file tramite FTP.', |
|
| 655 | + 'plugin_erreur_zip' => 'fallimento pclzip: errore @status@', |
|
| 656 | + 'plugin_etat_developpement' => 'in corso di sviluppo', |
|
| 657 | + 'plugin_etat_experimental' => 'sperimentale', |
|
| 658 | + 'plugin_etat_stable' => 'stabile', |
|
| 659 | + 'plugin_etat_test' => 'in prova', |
|
| 660 | + 'plugin_impossible_activer' => 'Impossibile attivare l’estensione @plugin@', |
|
| 661 | + 'plugin_info_automatique1' => 'Se si desidera autorizzare l’installazione automatica dell’estensione è necessario: ', |
|
| 662 | + 'plugin_info_automatique1_lib' => 'Se vuoi autorizzare l’installazione automatica di questa libreria:', |
|
| 663 | + 'plugin_info_automatique2' => 'creare una directory <code>@rep@</code>;', |
|
| 664 | + 'plugin_info_automatique3' => 'verificare che il server sia autorizzato a scrivere in questa directory.', |
|
| 665 | + 'plugin_info_automatique_creer' => 'da creare alla radice del sito.', |
|
| 666 | + 'plugin_info_automatique_exemples' => 'esempi:', |
|
| 667 | + 'plugin_info_automatique_ftp' => 'È possibile installare plug-in tramite FTP, nella cartella <tt>@rep@</tt>', |
|
| 668 | + 'plugin_info_automatique_lib' => 'Alcune estensioni richiedono anche di poter trasferire dei file nella cartella <code>lib/</code>, da creare (se necessario) alla radice del sito.', |
|
| 669 | + 'plugin_info_automatique_liste' => 'Gli elenchi delle estensioni:', |
|
| 670 | + 'plugin_info_automatique_liste_officielle' => 'le estensioni ufficiali', |
|
| 671 | + 'plugin_info_automatique_liste_update' => 'Aggiornare gli elenchi', |
|
| 672 | + 'plugin_info_automatique_ou' => 'oppure...', |
|
| 673 | + 'plugin_info_automatique_select' => 'Selezionata un’estensione qui sotto: SPIP la scaricherà e la installerà nella cartella <code>@rep@</code>; se questo estensione è già presente verrà aggiornata.', |
|
| 674 | + 'plugin_info_credit' => 'Crediti', |
|
| 675 | + 'plugin_info_erreur_xml' => 'La dichiarazione del plugin è sbagliata', |
|
| 676 | + 'plugin_info_install_ok' => 'Installazione completata con successo', |
|
| 677 | + 'plugin_info_necessite' => 'Richiesto :', |
|
| 678 | + 'plugin_info_non_compatible_spip' => 'Questo plugin è incompatibile con questa versione di SPIP', |
|
| 679 | + 'plugin_info_plugins_dist_1' => 'Le estensioni sottostanti sono caricate e attivate nella directory @plugins_dist@.', |
|
| 680 | + 'plugin_info_plugins_dist_2' => 'Questi non possono essere disabilitati.', |
|
| 681 | + 'plugin_info_telecharger' => 'da scaricare da @url@ e da installare in @rep@', |
|
| 682 | + 'plugin_info_upgrade_ok' => 'Aggiornamento avvenuto', |
|
| 683 | + 'plugin_librairies_installees' => 'Librerie installate', |
|
| 684 | + 'plugin_necessite_extension_php' => 'Richiede l’estensione PHP @plugin@ in versione @version@.', |
|
| 685 | + 'plugin_necessite_extension_php_sans_version' => 'Richiede l’estensione PHP @plugin@', |
|
| 686 | + 'plugin_necessite_lib' => 'Questa estensione richiede la libreria @lib@', |
|
| 687 | + 'plugin_necessite_php' => 'Richiede @plugin@ in versione @version@.', |
|
| 688 | + 'plugin_necessite_plugin' => 'Necessita l’estensione @plugin@ con la versione @version@.', |
|
| 689 | + 'plugin_necessite_plugin_sans_version' => 'Necessita del plugin @plugin@', |
|
| 690 | + 'plugin_necessite_spip' => 'Necessita SPIP con almeno la versione @version@.', |
|
| 691 | + 'plugin_source' => 'origine: ', |
|
| 692 | + 'plugin_titre_automatique' => 'Installazione automatica', |
|
| 693 | + 'plugin_titre_automatique_ajouter' => 'Aggiungere dei plugin', |
|
| 694 | + 'plugin_titre_installation' => 'Installazione del plugin @plugin@', |
|
| 695 | + 'plugin_titre_modifier' => 'I miei plugin', |
|
| 696 | + 'plugin_utilise_extension_php' => 'Usa l’estensione PHP @plugin@ in versione @version@.', |
|
| 697 | + 'plugin_utilise_php' => 'Utilizza @plugin@ in versione @version@.', |
|
| 698 | + 'plugin_utilise_plugin' => 'Utilizza il plugin @plugin@ in versione @version@.', |
|
| 699 | + 'plugin_zip_active' => 'Continuare per attivarlo', |
|
| 700 | + 'plugin_zip_adresse' => 'indicate qui sotto l’indirizzo di un file zip del plug-in da scaricare, oppure l’indirizzo di un elenco di plug-in.', |
|
| 701 | + 'plugin_zip_adresse_champ' => 'Indirizzo del plug-in o dell’elenco ', |
|
| 702 | + 'plugin_zip_content' => 'Esso contiene i file seguenti (@taille@),<br />pronti per essere installati nella cartella <code>@rep@</code>', |
|
| 703 | + 'plugin_zip_installe_finie' => 'Il file @zip@ è stato decompresso e installato.', |
|
| 704 | + 'plugin_zip_installe_rep_finie' => 'Il file @zip@ è stato decompresso e installato nella cartella @rep@', |
|
| 705 | + 'plugin_zip_installer' => 'Ora è possibile installarlo.', |
|
| 706 | + 'plugin_zip_telecharge' => 'Il file @zip@ è stato scaricato', |
|
| 707 | + 'plugins_actif_aucun' => 'Nessun plugin attivo', |
|
| 708 | + 'plugins_actif_un' => 'Un plugin attivo', |
|
| 709 | + 'plugins_actifs' => '@count@ plug-in attivati.', |
|
| 710 | + 'plugins_actifs_liste' => 'Attivo', |
|
| 711 | + 'plugins_compte' => '@count@ plug-in', |
|
| 712 | + 'plugins_disponible_un' => 'Un plugin disponibile', |
|
| 713 | + 'plugins_disponibles' => '@count@ plug-in disponibili.', |
|
| 714 | + 'plugins_erreur' => 'Errore nei plug-in: @plugins@', |
|
| 715 | + 'plugins_liste' => 'Elenco dei plugin', |
|
| 716 | + 'plugins_liste_dist' => 'Plugin bloccato', |
|
| 717 | + 'plugins_recents' => 'Plugin aggiunti recentemente', |
|
| 718 | + 'plugins_tous_liste' => 'Tutto', |
|
| 719 | + 'plugins_vue_hierarchie' => 'Struttura gerarchica', |
|
| 720 | + 'plugins_vue_liste' => 'Elenco', |
|
| 721 | + 'protocole_ldap' => 'Versione del protocollo:', |
|
| 722 | 722 | |
| 723 | - // Q |
|
| 724 | - 'queue_executer_maintenant' => 'Esegui adesso', |
|
| 725 | - 'queue_info_purger' => 'È possibile eliminare tutti i lavori in sospeso e reinizializzare la lista con delle elaborazioni periodiche', |
|
| 726 | - 'queue_nb_jobs_in_queue' => '@nb@ processi in coda', |
|
| 727 | - 'queue_next_job_in_nb_sec' => 'Prossimo processo in @nb@ s', |
|
| 728 | - 'queue_no_job_in_queue' => 'Nessun processo appeso', |
|
| 729 | - 'queue_one_job_in_queue' => '1 processo in coda', |
|
| 730 | - 'queue_priorite_tache' => 'priorità', |
|
| 731 | - 'queue_purger_queue' => 'Pulisci la coda dei processi', |
|
| 732 | - 'queue_titre' => 'Lista dei processi', |
|
| 723 | + // Q |
|
| 724 | + 'queue_executer_maintenant' => 'Esegui adesso', |
|
| 725 | + 'queue_info_purger' => 'È possibile eliminare tutti i lavori in sospeso e reinizializzare la lista con delle elaborazioni periodiche', |
|
| 726 | + 'queue_nb_jobs_in_queue' => '@nb@ processi in coda', |
|
| 727 | + 'queue_next_job_in_nb_sec' => 'Prossimo processo in @nb@ s', |
|
| 728 | + 'queue_no_job_in_queue' => 'Nessun processo appeso', |
|
| 729 | + 'queue_one_job_in_queue' => '1 processo in coda', |
|
| 730 | + 'queue_priorite_tache' => 'priorità', |
|
| 731 | + 'queue_purger_queue' => 'Pulisci la coda dei processi', |
|
| 732 | + 'queue_titre' => 'Lista dei processi', |
|
| 733 | 733 | |
| 734 | - // R |
|
| 735 | - 'repertoire_plugins' => 'Cartella:', |
|
| 736 | - 'required' => '(Obbligatorio)', |
|
| 734 | + // R |
|
| 735 | + 'repertoire_plugins' => 'Cartella:', |
|
| 736 | + 'required' => '(Obbligatorio)', |
|
| 737 | 737 | |
| 738 | - // S |
|
| 739 | - 'sans_heure' => 'ora mancante', |
|
| 740 | - 'statut_admin_restreint' => 'ammin. parziale', |
|
| 741 | - 'statut_webmestre' => 'webmaster', |
|
| 738 | + // S |
|
| 739 | + 'sans_heure' => 'ora mancante', |
|
| 740 | + 'statut_admin_restreint' => 'ammin. parziale', |
|
| 741 | + 'statut_webmestre' => 'webmaster', |
|
| 742 | 742 | |
| 743 | - // T |
|
| 744 | - 'tache_cron_asap' => 'Task CRON @function@ (ASAP)', |
|
| 745 | - 'tache_cron_secondes' => 'Task CRON @function@ (ogni @nb@ s)', |
|
| 746 | - 'taille_cache_image' => 'Le immagini elaborate automaticamente da SPIP (icone dei documenti, titoli in formato grafico, funzioni matematiche in formato TeX...) occupano nella cartella @dir@ in tutto @taille@.', |
|
| 747 | - 'taille_cache_infinie' => 'Questo sito non prevede limiti alle dimensioni della cartella della cache.', |
|
| 748 | - 'taille_cache_maxi' => 'SPIP tenta di limitare le dimensioni della cartella della cache di questo sito a circa <b>@octets@</b> di dati.', |
|
| 749 | - 'taille_cache_moins_de' => 'La dimensione della cache è inferiore a @octets@.', |
|
| 750 | - 'taille_cache_octets' => 'La cartella della cache occupa attualmente @octets@ su disco.', |
|
| 751 | - 'taille_cache_vide' => 'La cache è vuota.', |
|
| 752 | - 'taille_repertoire_cache' => 'Dimensioni della cartella di cache', |
|
| 753 | - 'text_article_propose_publication' => 'Articolo proposto per la pubblicazione. ', |
|
| 754 | - 'texte_acces_ldap_anonyme_1' => 'Alcuni server LDAP non consentono accessi anonimi. In questo caso si deve specificare un identificatore d’accesso iniziale al fine di poter poi ricercare delle informazioni nell’elenco. Nella maggior parte dei casi tuttavia, i campi seguenti potranno essere lasciati vuoti.', |
|
| 755 | - 'texte_admin_effacer_01' => 'Questo commando cancella <i>tutto</i> il contenuto del database, |
|
| 743 | + // T |
|
| 744 | + 'tache_cron_asap' => 'Task CRON @function@ (ASAP)', |
|
| 745 | + 'tache_cron_secondes' => 'Task CRON @function@ (ogni @nb@ s)', |
|
| 746 | + 'taille_cache_image' => 'Le immagini elaborate automaticamente da SPIP (icone dei documenti, titoli in formato grafico, funzioni matematiche in formato TeX...) occupano nella cartella @dir@ in tutto @taille@.', |
|
| 747 | + 'taille_cache_infinie' => 'Questo sito non prevede limiti alle dimensioni della cartella della cache.', |
|
| 748 | + 'taille_cache_maxi' => 'SPIP tenta di limitare le dimensioni della cartella della cache di questo sito a circa <b>@octets@</b> di dati.', |
|
| 749 | + 'taille_cache_moins_de' => 'La dimensione della cache è inferiore a @octets@.', |
|
| 750 | + 'taille_cache_octets' => 'La cartella della cache occupa attualmente @octets@ su disco.', |
|
| 751 | + 'taille_cache_vide' => 'La cache è vuota.', |
|
| 752 | + 'taille_repertoire_cache' => 'Dimensioni della cartella di cache', |
|
| 753 | + 'text_article_propose_publication' => 'Articolo proposto per la pubblicazione. ', |
|
| 754 | + 'texte_acces_ldap_anonyme_1' => 'Alcuni server LDAP non consentono accessi anonimi. In questo caso si deve specificare un identificatore d’accesso iniziale al fine di poter poi ricercare delle informazioni nell’elenco. Nella maggior parte dei casi tuttavia, i campi seguenti potranno essere lasciati vuoti.', |
|
| 755 | + 'texte_admin_effacer_01' => 'Questo commando cancella <i>tutto</i> il contenuto del database, |
|
| 756 | 756 | compresi <i>tutti</i> i login dei redattori e degli amministratori. Dopo averlo eseguito, dovrai riavviare la procedura di installazione per ricreare un nuovo database e un primo ID amministrativo.', |
| 757 | - 'texte_adresse_annuaire_1' => '(Se la rubrica è installata nella stessa macchina di questo sito, dovrai probabilmente inserire "localhost".)', |
|
| 758 | - 'texte_ajout_auteur' => 'Il seguente autore è stato aggiunto all’articolo:', |
|
| 759 | - 'texte_annuaire_ldap_1' => 'Se hai accesso ad una rubrica (LDAP), puoi utilizzarla per importare automaticamente degli utenti sotto SPIP.', |
|
| 760 | - 'texte_article_statut' => 'Questo articolo è:', |
|
| 761 | - 'texte_article_virtuel' => 'Articolo virtuale', |
|
| 762 | - 'texte_article_virtuel_reference' => '<b>Articolo virtuale:</b> articolo citato nel tuo sito SPIP, ma reindrizzato verso un’altro URL. Per eliminare il reindirizzamento, cancella l’URL qui sopra.', |
|
| 763 | - 'texte_aucun_resultat_auteur' => 'Nessun risultato per "@cherche_auteur@"', |
|
| 764 | - 'texte_auteur_messagerie' => 'Questo sito può costantemente visualizzare la lista dei redattori collegati, permettendo lo scambio di messaggi in tempo reale. Si può però decidere di non comparire in questo elenco (rendendosi quindi «invisibili» agli altri utenti).', |
|
| 765 | - 'texte_auteurs' => 'GLI AUTORI', |
|
| 766 | - 'texte_choix_base_1' => 'Scegli il database:', |
|
| 767 | - 'texte_choix_base_2' => 'Il server SQL contiene diversi database.', |
|
| 768 | - 'texte_choix_base_3' => '<b>Seleziona</b> quello che è stato attribuito al tuo dominio:', |
|
| 769 | - 'texte_choix_table_prefix' => 'Prefisso delle tabelle:', |
|
| 770 | - 'texte_compte_element' => '@count@ elemento', |
|
| 771 | - 'texte_compte_elements' => '@count@ elementi', |
|
| 772 | - 'texte_conflit_edition_correction' => 'Controllare qui sotto le differenze tra le due versioni del testo; è possibile anche copiare le modifiche e poi ricominciare.', |
|
| 773 | - 'texte_connexion_mysql' => 'Consulta le informazioni fornite dal tuo hoster: devi poterci trovare i codici di collegamento alla base di dati.', |
|
| 774 | - 'texte_contenu_article' => 'Contenuto dell’articolo in poche parole (<em>abstract</em>)', |
|
| 775 | - 'texte_contenu_articles' => 'A seconda del modello di presentazione adottato per il sito, puoi decidere |
|
| 757 | + 'texte_adresse_annuaire_1' => '(Se la rubrica è installata nella stessa macchina di questo sito, dovrai probabilmente inserire "localhost".)', |
|
| 758 | + 'texte_ajout_auteur' => 'Il seguente autore è stato aggiunto all’articolo:', |
|
| 759 | + 'texte_annuaire_ldap_1' => 'Se hai accesso ad una rubrica (LDAP), puoi utilizzarla per importare automaticamente degli utenti sotto SPIP.', |
|
| 760 | + 'texte_article_statut' => 'Questo articolo è:', |
|
| 761 | + 'texte_article_virtuel' => 'Articolo virtuale', |
|
| 762 | + 'texte_article_virtuel_reference' => '<b>Articolo virtuale:</b> articolo citato nel tuo sito SPIP, ma reindrizzato verso un’altro URL. Per eliminare il reindirizzamento, cancella l’URL qui sopra.', |
|
| 763 | + 'texte_aucun_resultat_auteur' => 'Nessun risultato per "@cherche_auteur@"', |
|
| 764 | + 'texte_auteur_messagerie' => 'Questo sito può costantemente visualizzare la lista dei redattori collegati, permettendo lo scambio di messaggi in tempo reale. Si può però decidere di non comparire in questo elenco (rendendosi quindi «invisibili» agli altri utenti).', |
|
| 765 | + 'texte_auteurs' => 'GLI AUTORI', |
|
| 766 | + 'texte_choix_base_1' => 'Scegli il database:', |
|
| 767 | + 'texte_choix_base_2' => 'Il server SQL contiene diversi database.', |
|
| 768 | + 'texte_choix_base_3' => '<b>Seleziona</b> quello che è stato attribuito al tuo dominio:', |
|
| 769 | + 'texte_choix_table_prefix' => 'Prefisso delle tabelle:', |
|
| 770 | + 'texte_compte_element' => '@count@ elemento', |
|
| 771 | + 'texte_compte_elements' => '@count@ elementi', |
|
| 772 | + 'texte_conflit_edition_correction' => 'Controllare qui sotto le differenze tra le due versioni del testo; è possibile anche copiare le modifiche e poi ricominciare.', |
|
| 773 | + 'texte_connexion_mysql' => 'Consulta le informazioni fornite dal tuo hoster: devi poterci trovare i codici di collegamento alla base di dati.', |
|
| 774 | + 'texte_contenu_article' => 'Contenuto dell’articolo in poche parole (<em>abstract</em>)', |
|
| 775 | + 'texte_contenu_articles' => 'A seconda del modello di presentazione adottato per il sito, puoi decidere |
|
| 776 | 776 | che alcuni elementi degli articoli siano utilizzati oppure no. |
| 777 | 777 | Serviti dell’elenco qui sotto per indicare quali elementi rendere disponibili.', |
| 778 | - 'texte_crash_base' => 'Se il database è stato danneggiato, puoi tentare un ripristino automatico.', |
|
| 779 | - 'texte_creer_rubrique' => 'Prima di poter scrivere degli articoli,<br /> devi creare una rubrica.', |
|
| 780 | - 'texte_date_creation_article' => 'DATA DI CREAZIONE DELL’ARTICOLO:', |
|
| 781 | - 'texte_date_creation_objet' => 'Data di creazione :', # on ajoute le ":" |
|
| 782 | - 'texte_date_publication_anterieure' => 'DATA DI REDAZIONE ANTERIORE', |
|
| 783 | - 'texte_date_publication_anterieure_nonaffichee' => 'Non visualizzare la data di redazione anteriore.', |
|
| 784 | - 'texte_date_publication_article' => 'DATA DI PUBBLICAZIONE:', |
|
| 785 | - 'texte_date_publication_objet' => 'Pubblicato il :', |
|
| 786 | - 'texte_definir_comme_traduction_rubrique' => 'Questa rubrica è una traduzione della rubrica numero:', |
|
| 787 | - 'texte_descriptif_rapide' => 'Descrizione rapida', |
|
| 788 | - 'texte_effacer_base' => 'Cancella il database SPIP', |
|
| 789 | - 'texte_effacer_statistiques' => 'Cancellare le statistiche', |
|
| 790 | - 'texte_en_cours_validation' => 'Gli articoli e le brevi elencati qui sotto sono stati proposti per la pubblicazione. ', |
|
| 791 | - 'texte_enrichir_mise_a_jour' => 'Puoi arricchire la formattazione del testo utilizzando le «scorciatoie tipografiche»', |
|
| 792 | - 'texte_fichier_authent' => '<b>SPIP deve creare i file speciali <tt>.htpasswd</tt> |
|
| 778 | + 'texte_crash_base' => 'Se il database è stato danneggiato, puoi tentare un ripristino automatico.', |
|
| 779 | + 'texte_creer_rubrique' => 'Prima di poter scrivere degli articoli,<br /> devi creare una rubrica.', |
|
| 780 | + 'texte_date_creation_article' => 'DATA DI CREAZIONE DELL’ARTICOLO:', |
|
| 781 | + 'texte_date_creation_objet' => 'Data di creazione :', # on ajoute le ":" |
|
| 782 | + 'texte_date_publication_anterieure' => 'DATA DI REDAZIONE ANTERIORE', |
|
| 783 | + 'texte_date_publication_anterieure_nonaffichee' => 'Non visualizzare la data di redazione anteriore.', |
|
| 784 | + 'texte_date_publication_article' => 'DATA DI PUBBLICAZIONE:', |
|
| 785 | + 'texte_date_publication_objet' => 'Pubblicato il :', |
|
| 786 | + 'texte_definir_comme_traduction_rubrique' => 'Questa rubrica è una traduzione della rubrica numero:', |
|
| 787 | + 'texte_descriptif_rapide' => 'Descrizione rapida', |
|
| 788 | + 'texte_effacer_base' => 'Cancella il database SPIP', |
|
| 789 | + 'texte_effacer_statistiques' => 'Cancellare le statistiche', |
|
| 790 | + 'texte_en_cours_validation' => 'Gli articoli e le brevi elencati qui sotto sono stati proposti per la pubblicazione. ', |
|
| 791 | + 'texte_enrichir_mise_a_jour' => 'Puoi arricchire la formattazione del testo utilizzando le «scorciatoie tipografiche»', |
|
| 792 | + 'texte_fichier_authent' => '<b>SPIP deve creare i file speciali <tt>.htpasswd</tt> |
|
| 793 | 793 | e <tt>.htpasswd-admin</tt> nella cartella @dossier@?</b> |
| 794 | 794 | <p> Questi file possono servire a limitare l’accesso agli autori |
| 795 | 795 | e agli amministratori in particolari aree del sito |
| 796 | 796 | (per esempio, per un programma esterno di statistiche).</p> |
| 797 | 797 | <p> Se ciò non è necessario, lasciare quest’opzione al suo valore predefinito (nessuna creazione |
| 798 | 798 | di file).</p>', |
| 799 | - 'texte_informations_personnelles_1' => 'Il sistema creerà un tuo accesso personalizzato al sito.', |
|
| 800 | - 'texte_informations_personnelles_2' => '(Nota: se si tratta di una reinstallazione, e il tuo accesso funziona ancora, puoi ', |
|
| 801 | - 'texte_introductif_article' => 'Testo introduttivo dell’articolo', |
|
| 802 | - 'texte_jeu_caractere' => 'Si consiglia di utilizzare sul proprio sito l’alfabeto universale (<tt>utf-8</tt>): esso permette di visualizzare i testi in tutte le lingue e non pone problemi di compatibilità con i browser moderni.', |
|
| 803 | - 'texte_jeu_caractere_3' => 'Il tuo sito usa attualmente il set di caratteri:', |
|
| 804 | - 'texte_jeu_caractere_4' => 'Se ciò non corrisponde alla realtà dei propri dati (a causa, per esempio, di un ripristino del database), o se <em>si avvia il sito</em> e si desidera partire con un altro set di caratteri è necessario indicare quest’ultimo qui:', |
|
| 805 | - 'texte_login_ldap_1' => '(Lascia vuoto per un accesso anonimo, o inserisci il percorso completo, per esempio «<tt>uid=rossi, ou=users, dc=mio-dominio, dc=com</tt> ».)', |
|
| 806 | - 'texte_login_precaution' => 'Attenzione! Questo è l’ID con il quale sei attualmente collegato. |
|
| 799 | + 'texte_informations_personnelles_1' => 'Il sistema creerà un tuo accesso personalizzato al sito.', |
|
| 800 | + 'texte_informations_personnelles_2' => '(Nota: se si tratta di una reinstallazione, e il tuo accesso funziona ancora, puoi ', |
|
| 801 | + 'texte_introductif_article' => 'Testo introduttivo dell’articolo', |
|
| 802 | + 'texte_jeu_caractere' => 'Si consiglia di utilizzare sul proprio sito l’alfabeto universale (<tt>utf-8</tt>): esso permette di visualizzare i testi in tutte le lingue e non pone problemi di compatibilità con i browser moderni.', |
|
| 803 | + 'texte_jeu_caractere_3' => 'Il tuo sito usa attualmente il set di caratteri:', |
|
| 804 | + 'texte_jeu_caractere_4' => 'Se ciò non corrisponde alla realtà dei propri dati (a causa, per esempio, di un ripristino del database), o se <em>si avvia il sito</em> e si desidera partire con un altro set di caratteri è necessario indicare quest’ultimo qui:', |
|
| 805 | + 'texte_login_ldap_1' => '(Lascia vuoto per un accesso anonimo, o inserisci il percorso completo, per esempio «<tt>uid=rossi, ou=users, dc=mio-dominio, dc=com</tt> ».)', |
|
| 806 | + 'texte_login_precaution' => 'Attenzione! Questo è l’ID con il quale sei attualmente collegato. |
|
| 807 | 807 | Utilizza questo modulo con cognizione di causa...', |
| 808 | - 'texte_messagerie_agenda' => 'La messageria permette ai redattori del sito di comunicare tra loro in maniera diretta nell’area riservata. Essa è associata a una agenda.', |
|
| 809 | - 'texte_mise_a_niveau_base_1' => 'Hai aggiornato i file SPIP. |
|
| 808 | + 'texte_messagerie_agenda' => 'La messageria permette ai redattori del sito di comunicare tra loro in maniera diretta nell’area riservata. Essa è associata a una agenda.', |
|
| 809 | + 'texte_mise_a_niveau_base_1' => 'Hai aggiornato i file SPIP. |
|
| 810 | 810 | Adesso è necessario aggiornare il database.', |
| 811 | - 'texte_modifier_article' => 'Modifica l’articolo:', |
|
| 812 | - 'texte_multilinguisme' => 'Se desideri gestire gli articoli in diverse lingue, con un sistema di navigazione complesso, è possibile aggiungere un menu di selezione della lingua in funzione della struttura del sito.', |
|
| 813 | - 'texte_multilinguisme_trad' => 'È anche possibile attivare un sistema di gestione dei link fra le diverse traduzioni di un certo oggetto.', |
|
| 814 | - 'texte_non_compresse' => '<i>non compresso</i> (il tuo server non supporta questa funzionalità)', |
|
| 815 | - 'texte_nouvelle_version_spip_1' => 'Hai installato una nuova versione di SPIP.', |
|
| 816 | - 'texte_nouvelle_version_spip_2' => 'Questa nuova versione necessita un aggiornamento più radicale del solito. Se sei il webmaster del sito, cancella il file @connect@ e riprendi l’installazione al fine di aggiornare i parametri di connessione al database.<p> (NB: se hai dimenticato i parametri di connessione, rileggi il file @connect@ prima di cancellarlo!)</p>', |
|
| 817 | - 'texte_operation_echec' => 'Torna alla pagina precedente, seleziona un altro database o creane uno nuovo. Verifica le informazioni fornite dal tuo hoster.', |
|
| 818 | - 'texte_plus_trois_car' => 'più di tre caratteri', |
|
| 819 | - 'texte_plusieurs_articles' => 'Diversi autori trovati per "@cherche_auteur@":', |
|
| 820 | - 'texte_port_annuaire' => '(Il valore predefinito è in genere quello adatto.)', |
|
| 821 | - 'texte_presente_plugin' => 'Questa pagina elenca i plugin disponibili sul sito. È possibile attivare i plugin necessari selezionando la casella corrispondente.', |
|
| 822 | - 'texte_proposer_publication' => 'Quando l’articolo è completo,<br /> puoi proporne la pubblicazione.', |
|
| 823 | - 'texte_proxy' => 'In alcuni casi (intranet, reti protette...), i siti distanti (documetazione di SPIP, siti in syndication, ecc.) sono accessibili unicamente attraverso un <i>proxy HTTP</i>. In questo caso, va indicato l’indirizzo del server nella forma @proxy_en_cours@. In genere questa casella va lasciata vuota.', |
|
| 824 | - 'texte_publication_articles_post_dates' => 'Come si deve comportare SPIP quando gli articoli hanno |
|
| 811 | + 'texte_modifier_article' => 'Modifica l’articolo:', |
|
| 812 | + 'texte_multilinguisme' => 'Se desideri gestire gli articoli in diverse lingue, con un sistema di navigazione complesso, è possibile aggiungere un menu di selezione della lingua in funzione della struttura del sito.', |
|
| 813 | + 'texte_multilinguisme_trad' => 'È anche possibile attivare un sistema di gestione dei link fra le diverse traduzioni di un certo oggetto.', |
|
| 814 | + 'texte_non_compresse' => '<i>non compresso</i> (il tuo server non supporta questa funzionalità)', |
|
| 815 | + 'texte_nouvelle_version_spip_1' => 'Hai installato una nuova versione di SPIP.', |
|
| 816 | + 'texte_nouvelle_version_spip_2' => 'Questa nuova versione necessita un aggiornamento più radicale del solito. Se sei il webmaster del sito, cancella il file @connect@ e riprendi l’installazione al fine di aggiornare i parametri di connessione al database.<p> (NB: se hai dimenticato i parametri di connessione, rileggi il file @connect@ prima di cancellarlo!)</p>', |
|
| 817 | + 'texte_operation_echec' => 'Torna alla pagina precedente, seleziona un altro database o creane uno nuovo. Verifica le informazioni fornite dal tuo hoster.', |
|
| 818 | + 'texte_plus_trois_car' => 'più di tre caratteri', |
|
| 819 | + 'texte_plusieurs_articles' => 'Diversi autori trovati per "@cherche_auteur@":', |
|
| 820 | + 'texte_port_annuaire' => '(Il valore predefinito è in genere quello adatto.)', |
|
| 821 | + 'texte_presente_plugin' => 'Questa pagina elenca i plugin disponibili sul sito. È possibile attivare i plugin necessari selezionando la casella corrispondente.', |
|
| 822 | + 'texte_proposer_publication' => 'Quando l’articolo è completo,<br /> puoi proporne la pubblicazione.', |
|
| 823 | + 'texte_proxy' => 'In alcuni casi (intranet, reti protette...), i siti distanti (documetazione di SPIP, siti in syndication, ecc.) sono accessibili unicamente attraverso un <i>proxy HTTP</i>. In questo caso, va indicato l’indirizzo del server nella forma @proxy_en_cours@. In genere questa casella va lasciata vuota.', |
|
| 824 | + 'texte_publication_articles_post_dates' => 'Come si deve comportare SPIP quando gli articoli hanno |
|
| 825 | 825 | una data di pubblicazione impostata nel futuro?', |
| 826 | - 'texte_rappel_selection_champs' => '[Non dimenticare di impostare correttamente questo campo]', |
|
| 827 | - 'texte_recalcul_page' => 'Se vuoi rigenerare |
|
| 826 | + 'texte_rappel_selection_champs' => '[Non dimenticare di impostare correttamente questo campo]', |
|
| 827 | + 'texte_recalcul_page' => 'Se vuoi rigenerare |
|
| 828 | 828 | una sola pagina, utilizza piuttosto lo spazio pubblico e clicca sul pulsante «rigenera».', |
| 829 | - 'texte_recuperer_base' => 'Ripara il database', |
|
| 830 | - 'texte_reference_mais_redirige' => 'articolo catalogato nel tuo sito SPIP, ma con reindirizzamento verso un altro URL.', |
|
| 831 | - 'texte_requetes_echouent' => '<b>Quando alcune query SQL falliscono |
|
| 829 | + 'texte_recuperer_base' => 'Ripara il database', |
|
| 830 | + 'texte_reference_mais_redirige' => 'articolo catalogato nel tuo sito SPIP, ma con reindirizzamento verso un altro URL.', |
|
| 831 | + 'texte_requetes_echouent' => '<b>Quando alcune query SQL falliscono |
|
| 832 | 832 | ripetutamente e senza un chiaro motivo, è possibile |
| 833 | 833 | che sia per colpa del database stesso.</b><p> |
| 834 | 834 | Il server SQL dispone di una funzione di ripristino delle tabelle |
@@ -836,87 +836,87 @@ discard block |
||
| 836 | 836 | in caso di errore, conservare una copia del messaggio visualizzato che potrebbe contenere |
| 837 | 837 | delle informazioni utili per identificare il problema.</p><p> |
| 838 | 838 | Se il problema persiste, contattare il proprio fornitore di hosting.</p>', |
| 839 | - 'texte_selection_langue_principale' => 'Puoi selezionare qui sotto la «lingua predefinita» del sito. Questa scelta non obbliga - fortunatamente! - a scrivere gli articoli nella stessa lingua, ma permette di determinare: |
|
| 839 | + 'texte_selection_langue_principale' => 'Puoi selezionare qui sotto la «lingua predefinita» del sito. Questa scelta non obbliga - fortunatamente! - a scrivere gli articoli nella stessa lingua, ma permette di determinare: |
|
| 840 | 840 | <ul><li> il formato di default delle date sul sito pubblico;</li> |
| 841 | 841 | <li> la tipologia di motore tipografico che SPIP deve utilizzare per la resa del testo;</li> |
| 842 | 842 | <li> la lingua utilizzata nelle finestre di dialogo del sito pubblico;</li> |
| 843 | 843 | <li> la lingua di default nell’area riservata all’amministrazione.</li></ul>', |
| 844 | - 'texte_sous_titre' => 'Sottotitolo', |
|
| 845 | - 'texte_statistiques_visites' => '(barre scure: domenica / curve scure: evoluzione della media)', |
|
| 846 | - 'texte_statut_attente_validation' => 'in attesa di convalida', |
|
| 847 | - 'texte_statut_publies' => 'pubblicato on line', |
|
| 848 | - 'texte_statut_refuses' => 'rifiutati', |
|
| 849 | - 'texte_suppression_fichiers' => 'Utilizza questo commando per cancellare tutti i file presenti nella |
|
| 844 | + 'texte_sous_titre' => 'Sottotitolo', |
|
| 845 | + 'texte_statistiques_visites' => '(barre scure: domenica / curve scure: evoluzione della media)', |
|
| 846 | + 'texte_statut_attente_validation' => 'in attesa di convalida', |
|
| 847 | + 'texte_statut_publies' => 'pubblicato on line', |
|
| 848 | + 'texte_statut_refuses' => 'rifiutati', |
|
| 849 | + 'texte_suppression_fichiers' => 'Utilizza questo commando per cancellare tutti i file presenti nella |
|
| 850 | 850 | cache di SPIP. Ciò permette ad esempio di forzare la rigenerazione di tutte le pagine se hai fatto delle importanti modifiche di grafica o di struttura del sito.', |
| 851 | - 'texte_sur_titre' => 'Occhiello', |
|
| 852 | - 'texte_table_ok' => ': questa tabella è OK.', |
|
| 853 | - 'texte_tentative_recuperation' => 'Tentativo di ripristino', |
|
| 854 | - 'texte_tenter_reparation' => 'Tenta un ripristino del database', |
|
| 855 | - 'texte_test_proxy' => 'Per fare una prova di questo proxy, indicare qui l’indirizzo |
|
| 851 | + 'texte_sur_titre' => 'Occhiello', |
|
| 852 | + 'texte_table_ok' => ': questa tabella è OK.', |
|
| 853 | + 'texte_tentative_recuperation' => 'Tentativo di ripristino', |
|
| 854 | + 'texte_tenter_reparation' => 'Tenta un ripristino del database', |
|
| 855 | + 'texte_test_proxy' => 'Per fare una prova di questo proxy, indicare qui l’indirizzo |
|
| 856 | 856 | di un sito Web da testare.', |
| 857 | - 'texte_titre_02' => 'Titolo:', |
|
| 858 | - 'texte_titre_obligatoire' => '<b>Titolo</b> [Obbligatorio]', |
|
| 859 | - 'texte_travail_article' => '@nom_auteur_modif@ ha lavorato su questo articolo @date_diff@ minuti fa', |
|
| 860 | - 'texte_travail_collaboratif' => 'Se diversi autori lavorano spesso sullo stesso articolo, |
|
| 857 | + 'texte_titre_02' => 'Titolo:', |
|
| 858 | + 'texte_titre_obligatoire' => '<b>Titolo</b> [Obbligatorio]', |
|
| 859 | + 'texte_travail_article' => '@nom_auteur_modif@ ha lavorato su questo articolo @date_diff@ minuti fa', |
|
| 860 | + 'texte_travail_collaboratif' => 'Se diversi autori lavorano spesso sullo stesso articolo, |
|
| 861 | 861 | il sistema può segnalare gli articoli «aperti» |
| 862 | 862 | di recente al fine di evitare modifiche simultanee. |
| 863 | 863 | Questa opzione è disattivata di default |
| 864 | 864 | per evitare di generare messaggi d’avvertimento intempestivi.', |
| 865 | - 'texte_vide' => 'vuoto', |
|
| 866 | - 'texte_vider_cache' => 'Svuota la cache', |
|
| 867 | - 'titre_admin_tech' => 'Manutenzione tecnica', |
|
| 868 | - 'titre_admin_vider' => 'Manutenzione tecnica', |
|
| 869 | - 'titre_ajouter_un_auteur' => 'Aggiungi un autore', |
|
| 870 | - 'titre_ajouter_un_mot' => 'Aggiungi una parola chiave', |
|
| 871 | - 'titre_cadre_afficher_article' => 'Visualizza gli articoli', |
|
| 872 | - 'titre_cadre_afficher_traductions' => 'Visualizzare lo stato delle traduzioni per le seguenti lingue:', |
|
| 873 | - 'titre_cadre_ajouter_auteur' => 'AGGIUNGI UN AUTORE: ', |
|
| 874 | - 'titre_cadre_interieur_rubrique' => 'All’interno della rubrica', |
|
| 875 | - 'titre_cadre_numero_auteur' => 'AUTORE NUMERO', |
|
| 876 | - 'titre_cadre_numero_objet' => '@objet@ NUMERO :', |
|
| 877 | - 'titre_cadre_signature_obligatoire' => '<b>Firma</b> [Obbligatoria]<br />', |
|
| 878 | - 'titre_config_contenu_notifications' => 'Notifiche', |
|
| 879 | - 'titre_config_contenu_prive' => 'Nell’area riservata', |
|
| 880 | - 'titre_config_contenu_public' => 'Sul sito pubblico', |
|
| 881 | - 'titre_config_fonctions' => 'Configurazione del sito', |
|
| 882 | - 'titre_config_langage' => 'Configura la lingua', |
|
| 883 | - 'titre_configuration' => 'Configurazione del sito', |
|
| 884 | - 'titre_configurer_preferences' => 'Configura le tue preferenze', |
|
| 885 | - 'titre_configurer_preferences_menus' => 'Imposta le tue preferenze di menù', |
|
| 886 | - 'titre_conflit_edition' => 'Conflitto all’atto dell’edizione', |
|
| 887 | - 'titre_connexion_ldap' => 'Opzioni: <b>La connessione LDAP</b>', |
|
| 888 | - 'titre_groupe_mots' => 'GRUPPO DI PAROLE CHIAVE:', |
|
| 889 | - 'titre_identite_site' => 'Identità del sito', |
|
| 890 | - 'titre_langue_article' => 'Lingua dell’articolo', |
|
| 891 | - 'titre_langue_rubrique' => 'Lingua della rubrica', |
|
| 892 | - 'titre_langue_trad_article' => 'LINGUA E TRADUZIONI DELL’ARTICOLO', |
|
| 893 | - 'titre_les_articles' => 'GLI ARTICOLI', |
|
| 894 | - 'titre_messagerie_agenda' => 'Messagistica e agenda', |
|
| 895 | - 'titre_naviguer_dans_le_site' => 'Navigare nel sito...', |
|
| 896 | - 'titre_nouvelle_rubrique' => 'Nuova rubrica', |
|
| 897 | - 'titre_numero_rubrique' => 'RUBRICA NUMERO:', |
|
| 898 | - 'titre_page_articles_edit' => 'Modifica: @titre@', |
|
| 899 | - 'titre_page_articles_page' => 'Gli articoli', |
|
| 900 | - 'titre_page_articles_tous' => 'Tutto il sito', |
|
| 901 | - 'titre_page_calendrier' => 'Calendario @nom_mois@ @annee@', |
|
| 902 | - 'titre_page_config_contenu' => 'Configurazione del sito', |
|
| 903 | - 'titre_page_delete_all' => 'eliminazione totale e irreversible', |
|
| 904 | - 'titre_page_recherche' => 'Risultati della ricerca @recherche@', |
|
| 905 | - 'titre_page_statistiques_referers' => 'Statistiche (link al tuo sito)', |
|
| 906 | - 'titre_page_upgrade' => 'Aggiornamento di SPIP', |
|
| 907 | - 'titre_preference_menus_favoris' => 'Menù preferiti', |
|
| 908 | - 'titre_publication_articles_post_dates' => 'Pubblicazione di articoli postdatati', |
|
| 909 | - 'titre_reparation' => 'Riparazione', |
|
| 910 | - 'titre_suivi_petition' => 'Monitoraggio delle petizioni', |
|
| 911 | - 'tls_ldap' => 'Transport Layer Security:', |
|
| 912 | - 'trad_article_traduction' => 'Tutte le versioni di questo articolo:', |
|
| 913 | - 'trad_delier' => 'Non collegare più questo articolo alle sue traduzioni', |
|
| 914 | - 'trad_lier' => 'Questo articolo è una traduzione dell’articolo numero:', |
|
| 915 | - 'trad_new' => 'Scrivere una nuova traduzione dell’articolo', |
|
| 865 | + 'texte_vide' => 'vuoto', |
|
| 866 | + 'texte_vider_cache' => 'Svuota la cache', |
|
| 867 | + 'titre_admin_tech' => 'Manutenzione tecnica', |
|
| 868 | + 'titre_admin_vider' => 'Manutenzione tecnica', |
|
| 869 | + 'titre_ajouter_un_auteur' => 'Aggiungi un autore', |
|
| 870 | + 'titre_ajouter_un_mot' => 'Aggiungi una parola chiave', |
|
| 871 | + 'titre_cadre_afficher_article' => 'Visualizza gli articoli', |
|
| 872 | + 'titre_cadre_afficher_traductions' => 'Visualizzare lo stato delle traduzioni per le seguenti lingue:', |
|
| 873 | + 'titre_cadre_ajouter_auteur' => 'AGGIUNGI UN AUTORE: ', |
|
| 874 | + 'titre_cadre_interieur_rubrique' => 'All’interno della rubrica', |
|
| 875 | + 'titre_cadre_numero_auteur' => 'AUTORE NUMERO', |
|
| 876 | + 'titre_cadre_numero_objet' => '@objet@ NUMERO :', |
|
| 877 | + 'titre_cadre_signature_obligatoire' => '<b>Firma</b> [Obbligatoria]<br />', |
|
| 878 | + 'titre_config_contenu_notifications' => 'Notifiche', |
|
| 879 | + 'titre_config_contenu_prive' => 'Nell’area riservata', |
|
| 880 | + 'titre_config_contenu_public' => 'Sul sito pubblico', |
|
| 881 | + 'titre_config_fonctions' => 'Configurazione del sito', |
|
| 882 | + 'titre_config_langage' => 'Configura la lingua', |
|
| 883 | + 'titre_configuration' => 'Configurazione del sito', |
|
| 884 | + 'titre_configurer_preferences' => 'Configura le tue preferenze', |
|
| 885 | + 'titre_configurer_preferences_menus' => 'Imposta le tue preferenze di menù', |
|
| 886 | + 'titre_conflit_edition' => 'Conflitto all’atto dell’edizione', |
|
| 887 | + 'titre_connexion_ldap' => 'Opzioni: <b>La connessione LDAP</b>', |
|
| 888 | + 'titre_groupe_mots' => 'GRUPPO DI PAROLE CHIAVE:', |
|
| 889 | + 'titre_identite_site' => 'Identità del sito', |
|
| 890 | + 'titre_langue_article' => 'Lingua dell’articolo', |
|
| 891 | + 'titre_langue_rubrique' => 'Lingua della rubrica', |
|
| 892 | + 'titre_langue_trad_article' => 'LINGUA E TRADUZIONI DELL’ARTICOLO', |
|
| 893 | + 'titre_les_articles' => 'GLI ARTICOLI', |
|
| 894 | + 'titre_messagerie_agenda' => 'Messagistica e agenda', |
|
| 895 | + 'titre_naviguer_dans_le_site' => 'Navigare nel sito...', |
|
| 896 | + 'titre_nouvelle_rubrique' => 'Nuova rubrica', |
|
| 897 | + 'titre_numero_rubrique' => 'RUBRICA NUMERO:', |
|
| 898 | + 'titre_page_articles_edit' => 'Modifica: @titre@', |
|
| 899 | + 'titre_page_articles_page' => 'Gli articoli', |
|
| 900 | + 'titre_page_articles_tous' => 'Tutto il sito', |
|
| 901 | + 'titre_page_calendrier' => 'Calendario @nom_mois@ @annee@', |
|
| 902 | + 'titre_page_config_contenu' => 'Configurazione del sito', |
|
| 903 | + 'titre_page_delete_all' => 'eliminazione totale e irreversible', |
|
| 904 | + 'titre_page_recherche' => 'Risultati della ricerca @recherche@', |
|
| 905 | + 'titre_page_statistiques_referers' => 'Statistiche (link al tuo sito)', |
|
| 906 | + 'titre_page_upgrade' => 'Aggiornamento di SPIP', |
|
| 907 | + 'titre_preference_menus_favoris' => 'Menù preferiti', |
|
| 908 | + 'titre_publication_articles_post_dates' => 'Pubblicazione di articoli postdatati', |
|
| 909 | + 'titre_reparation' => 'Riparazione', |
|
| 910 | + 'titre_suivi_petition' => 'Monitoraggio delle petizioni', |
|
| 911 | + 'tls_ldap' => 'Transport Layer Security:', |
|
| 912 | + 'trad_article_traduction' => 'Tutte le versioni di questo articolo:', |
|
| 913 | + 'trad_delier' => 'Non collegare più questo articolo alle sue traduzioni', |
|
| 914 | + 'trad_lier' => 'Questo articolo è una traduzione dell’articolo numero:', |
|
| 915 | + 'trad_new' => 'Scrivere una nuova traduzione dell’articolo', |
|
| 916 | 916 | |
| 917 | - // U |
|
| 918 | - 'utf8_convert_erreur_orig' => 'Errore: il set di caratteri @charset@ non è supportato.', |
|
| 917 | + // U |
|
| 918 | + 'utf8_convert_erreur_orig' => 'Errore: il set di caratteri @charset@ non è supportato.', |
|
| 919 | 919 | |
| 920 | - // V |
|
| 921 | - 'version' => 'Versione:' |
|
| 920 | + // V |
|
| 921 | + 'version' => 'Versione:' |
|
| 922 | 922 | ); |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | |
@@ -35,20 +35,20 @@ discard block |
||
| 35 | 35 | * @return string URL nettoyée |
| 36 | 36 | **/ |
| 37 | 37 | function resolve_path($url) { |
| 38 | - [$url, $query] = array_pad(explode('?', $url, 2), 2, null); |
|
| 39 | - while ( |
|
| 40 | - preg_match(',/\.?/,', $url, $regs) # supprime // et /./ |
|
| 41 | - or preg_match(',/[^/]*/\.\./,S', $url, $regs) # supprime /toto/../ |
|
| 42 | - or preg_match(',^/\.\./,S', $url, $regs) # supprime les /../ du haut |
|
| 43 | - ) { |
|
| 44 | - $url = str_replace($regs[0], '/', $url); |
|
| 45 | - } |
|
| 38 | + [$url, $query] = array_pad(explode('?', $url, 2), 2, null); |
|
| 39 | + while ( |
|
| 40 | + preg_match(',/\.?/,', $url, $regs) # supprime // et /./ |
|
| 41 | + or preg_match(',/[^/]*/\.\./,S', $url, $regs) # supprime /toto/../ |
|
| 42 | + or preg_match(',^/\.\./,S', $url, $regs) # supprime les /../ du haut |
|
| 43 | + ) { |
|
| 44 | + $url = str_replace($regs[0], '/', $url); |
|
| 45 | + } |
|
| 46 | 46 | |
| 47 | - if ($query) { |
|
| 48 | - $url .= '?' . $query; |
|
| 49 | - } |
|
| 47 | + if ($query) { |
|
| 48 | + $url .= '?' . $query; |
|
| 49 | + } |
|
| 50 | 50 | |
| 51 | - return '/' . preg_replace(',^/,S', '', $url); |
|
| 51 | + return '/' . preg_replace(',^/,S', '', $url); |
|
| 52 | 52 | } |
| 53 | 53 | |
| 54 | 54 | |
@@ -69,44 +69,44 @@ discard block |
||
| 69 | 69 | **/ |
| 70 | 70 | function suivre_lien($url, $lien) { |
| 71 | 71 | |
| 72 | - $mot = null; |
|
| 73 | - $get = null; |
|
| 74 | - $hash = null; |
|
| 75 | - if (preg_match(',^(mailto|javascript|data|tel|callto|file|ftp):,iS', $lien)) { |
|
| 76 | - return $lien; |
|
| 77 | - } |
|
| 78 | - if (preg_match(';^((?:[a-z]{3,33}:)?//.*?)(/.*)?$;iS', $lien, $r)) { |
|
| 79 | - $r = array_pad($r, 3, ''); |
|
| 72 | + $mot = null; |
|
| 73 | + $get = null; |
|
| 74 | + $hash = null; |
|
| 75 | + if (preg_match(',^(mailto|javascript|data|tel|callto|file|ftp):,iS', $lien)) { |
|
| 76 | + return $lien; |
|
| 77 | + } |
|
| 78 | + if (preg_match(';^((?:[a-z]{3,33}:)?//.*?)(/.*)?$;iS', $lien, $r)) { |
|
| 79 | + $r = array_pad($r, 3, ''); |
|
| 80 | 80 | |
| 81 | - return $r[1] . resolve_path($r[2]); |
|
| 82 | - } |
|
| 81 | + return $r[1] . resolve_path($r[2]); |
|
| 82 | + } |
|
| 83 | 83 | |
| 84 | - # L'url site spip est un lien absolu aussi |
|
| 85 | - if (isset($GLOBALS['meta']['adresse_site']) and $lien == $GLOBALS['meta']['adresse_site']) { |
|
| 86 | - return $lien; |
|
| 87 | - } |
|
| 84 | + # L'url site spip est un lien absolu aussi |
|
| 85 | + if (isset($GLOBALS['meta']['adresse_site']) and $lien == $GLOBALS['meta']['adresse_site']) { |
|
| 86 | + return $lien; |
|
| 87 | + } |
|
| 88 | 88 | |
| 89 | - # lien relatif, il faut verifier l'url de base |
|
| 90 | - # commencer par virer la chaine de get de l'url de base |
|
| 91 | - $dir = '/'; |
|
| 92 | - $debut = ''; |
|
| 93 | - if (preg_match(';^((?:[a-z]{3,7}:)?//[^/]+)(/.*?/?)?([^/#?]*)([?][^#]*)?(#.*)?$;S', $url, $regs)) { |
|
| 94 | - $debut = $regs[1]; |
|
| 95 | - $dir = !strlen($regs[2]) ? '/' : $regs[2]; |
|
| 96 | - $mot = $regs[3]; |
|
| 97 | - $get = $regs[4] ?? ''; |
|
| 98 | - $hash = $regs[5] ?? ''; |
|
| 99 | - } |
|
| 100 | - switch (substr($lien, 0, 1)) { |
|
| 101 | - case '/': |
|
| 102 | - return $debut . resolve_path($lien); |
|
| 103 | - case '#': |
|
| 104 | - return $debut . resolve_path($dir . $mot . $get . $lien); |
|
| 105 | - case '': |
|
| 106 | - return $debut . resolve_path($dir . $mot . $get . $hash); |
|
| 107 | - default: |
|
| 108 | - return $debut . resolve_path($dir . $lien); |
|
| 109 | - } |
|
| 89 | + # lien relatif, il faut verifier l'url de base |
|
| 90 | + # commencer par virer la chaine de get de l'url de base |
|
| 91 | + $dir = '/'; |
|
| 92 | + $debut = ''; |
|
| 93 | + if (preg_match(';^((?:[a-z]{3,7}:)?//[^/]+)(/.*?/?)?([^/#?]*)([?][^#]*)?(#.*)?$;S', $url, $regs)) { |
|
| 94 | + $debut = $regs[1]; |
|
| 95 | + $dir = !strlen($regs[2]) ? '/' : $regs[2]; |
|
| 96 | + $mot = $regs[3]; |
|
| 97 | + $get = $regs[4] ?? ''; |
|
| 98 | + $hash = $regs[5] ?? ''; |
|
| 99 | + } |
|
| 100 | + switch (substr($lien, 0, 1)) { |
|
| 101 | + case '/': |
|
| 102 | + return $debut . resolve_path($lien); |
|
| 103 | + case '#': |
|
| 104 | + return $debut . resolve_path($dir . $mot . $get . $lien); |
|
| 105 | + case '': |
|
| 106 | + return $debut . resolve_path($dir . $mot . $get . $hash); |
|
| 107 | + default: |
|
| 108 | + return $debut . resolve_path($dir . $lien); |
|
| 109 | + } |
|
| 110 | 110 | } |
| 111 | 111 | |
| 112 | 112 | |
@@ -129,14 +129,14 @@ discard block |
||
| 129 | 129 | * @return string Texte ou URL (en absolus) |
| 130 | 130 | **/ |
| 131 | 131 | function url_absolue($url, $base = '') { |
| 132 | - if (strlen($url = trim($url)) == 0) { |
|
| 133 | - return ''; |
|
| 134 | - } |
|
| 135 | - if (!$base) { |
|
| 136 | - $base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : ''); |
|
| 137 | - } |
|
| 132 | + if (strlen($url = trim($url)) == 0) { |
|
| 133 | + return ''; |
|
| 134 | + } |
|
| 135 | + if (!$base) { |
|
| 136 | + $base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : ''); |
|
| 137 | + } |
|
| 138 | 138 | |
| 139 | - return suivre_lien($base, $url); |
|
| 139 | + return suivre_lien($base, $url); |
|
| 140 | 140 | } |
| 141 | 141 | |
| 142 | 142 | /** |
@@ -147,7 +147,7 @@ discard block |
||
| 147 | 147 | * @return string |
| 148 | 148 | */ |
| 149 | 149 | function protocole_implicite($url_absolue) { |
| 150 | - return preg_replace(';^[a-z]{3,7}://;i', '//', $url_absolue); |
|
| 150 | + return preg_replace(';^[a-z]{3,7}://;i', '//', $url_absolue); |
|
| 151 | 151 | } |
| 152 | 152 | |
| 153 | 153 | /** |
@@ -158,16 +158,16 @@ discard block |
||
| 158 | 158 | */ |
| 159 | 159 | function protocole_verifier($url_absolue, $protocoles_autorises = ['http','https']) { |
| 160 | 160 | |
| 161 | - if (preg_match(';^([a-z]{3,7})://;i', $url_absolue, $m)) { |
|
| 162 | - $protocole = $m[1]; |
|
| 163 | - if ( |
|
| 164 | - in_array($protocole, $protocoles_autorises) |
|
| 165 | - or in_array(strtolower($protocole), array_map('strtolower', $protocoles_autorises)) |
|
| 166 | - ) { |
|
| 167 | - return true; |
|
| 168 | - } |
|
| 169 | - } |
|
| 170 | - return false; |
|
| 161 | + if (preg_match(';^([a-z]{3,7})://;i', $url_absolue, $m)) { |
|
| 162 | + $protocole = $m[1]; |
|
| 163 | + if ( |
|
| 164 | + in_array($protocole, $protocoles_autorises) |
|
| 165 | + or in_array(strtolower($protocole), array_map('strtolower', $protocoles_autorises)) |
|
| 166 | + ) { |
|
| 167 | + return true; |
|
| 168 | + } |
|
| 169 | + } |
|
| 170 | + return false; |
|
| 171 | 171 | } |
| 172 | 172 | |
| 173 | 173 | /** |
@@ -184,27 +184,27 @@ discard block |
||
| 184 | 184 | * @return string Texte avec des URLs absolues |
| 185 | 185 | **/ |
| 186 | 186 | function liens_absolus($texte, $base = '') { |
| 187 | - if (preg_match_all(',(<(a|link|image|img|script)\s[^<>]*(href|src)=[^<>]*>),imsS', $texte, $liens, PREG_SET_ORDER)) { |
|
| 188 | - if (!function_exists('extraire_attribut')) { |
|
| 189 | - include_spip('inc/filtres'); |
|
| 190 | - } |
|
| 191 | - foreach ($liens as $lien) { |
|
| 192 | - foreach (['href', 'src'] as $attr) { |
|
| 193 | - $href = extraire_attribut($lien[0], $attr) ?? ''; |
|
| 194 | - if (strlen($href) > 0) { |
|
| 195 | - if (!preg_match(';^((?:[a-z]{3,7}:)?//);iS', $href)) { |
|
| 196 | - $abs = url_absolue($href, $base); |
|
| 197 | - if (rtrim($href, '/') !== rtrim($abs, '/') and !preg_match('/^#/', $href)) { |
|
| 198 | - $texte_lien = inserer_attribut($lien[0], $attr, $abs); |
|
| 199 | - $texte = str_replace($lien[0], $texte_lien, $texte); |
|
| 200 | - } |
|
| 201 | - } |
|
| 202 | - } |
|
| 203 | - } |
|
| 204 | - } |
|
| 205 | - } |
|
| 187 | + if (preg_match_all(',(<(a|link|image|img|script)\s[^<>]*(href|src)=[^<>]*>),imsS', $texte, $liens, PREG_SET_ORDER)) { |
|
| 188 | + if (!function_exists('extraire_attribut')) { |
|
| 189 | + include_spip('inc/filtres'); |
|
| 190 | + } |
|
| 191 | + foreach ($liens as $lien) { |
|
| 192 | + foreach (['href', 'src'] as $attr) { |
|
| 193 | + $href = extraire_attribut($lien[0], $attr) ?? ''; |
|
| 194 | + if (strlen($href) > 0) { |
|
| 195 | + if (!preg_match(';^((?:[a-z]{3,7}:)?//);iS', $href)) { |
|
| 196 | + $abs = url_absolue($href, $base); |
|
| 197 | + if (rtrim($href, '/') !== rtrim($abs, '/') and !preg_match('/^#/', $href)) { |
|
| 198 | + $texte_lien = inserer_attribut($lien[0], $attr, $abs); |
|
| 199 | + $texte = str_replace($lien[0], $texte_lien, $texte); |
|
| 200 | + } |
|
| 201 | + } |
|
| 202 | + } |
|
| 203 | + } |
|
| 204 | + } |
|
| 205 | + } |
|
| 206 | 206 | |
| 207 | - return $texte; |
|
| 207 | + return $texte; |
|
| 208 | 208 | } |
| 209 | 209 | |
| 210 | 210 | |
@@ -220,11 +220,11 @@ discard block |
||
| 220 | 220 | * @return string Texte ou URL (en absolus) |
| 221 | 221 | **/ |
| 222 | 222 | function abs_url($texte, $base = '') { |
| 223 | - if ($GLOBALS['mode_abs_url'] == 'url') { |
|
| 224 | - return url_absolue($texte, $base); |
|
| 225 | - } else { |
|
| 226 | - return liens_absolus($texte, $base); |
|
| 227 | - } |
|
| 223 | + if ($GLOBALS['mode_abs_url'] == 'url') { |
|
| 224 | + return url_absolue($texte, $base); |
|
| 225 | + } else { |
|
| 226 | + return liens_absolus($texte, $base); |
|
| 227 | + } |
|
| 228 | 228 | } |
| 229 | 229 | |
| 230 | 230 | /** |
@@ -237,11 +237,11 @@ discard block |
||
| 237 | 237 | * @return string |
| 238 | 238 | */ |
| 239 | 239 | function spip_htmlspecialchars($string, $flags = null, $encoding = 'UTF-8', $double_encode = true) { |
| 240 | - if (is_null($flags)) { |
|
| 241 | - $flags = ENT_COMPAT | ENT_HTML401; |
|
| 242 | - } |
|
| 240 | + if (is_null($flags)) { |
|
| 241 | + $flags = ENT_COMPAT | ENT_HTML401; |
|
| 242 | + } |
|
| 243 | 243 | |
| 244 | - return htmlspecialchars($string, $flags, $encoding, $double_encode); |
|
| 244 | + return htmlspecialchars($string, $flags, $encoding, $double_encode); |
|
| 245 | 245 | } |
| 246 | 246 | |
| 247 | 247 | /** |
@@ -254,9 +254,9 @@ discard block |
||
| 254 | 254 | * @return string |
| 255 | 255 | */ |
| 256 | 256 | function spip_htmlentities($string, $flags = null, $encoding = 'UTF-8', $double_encode = true) { |
| 257 | - if (is_null($flags)) { |
|
| 258 | - $flags = ENT_COMPAT | ENT_HTML401; |
|
| 259 | - } |
|
| 257 | + if (is_null($flags)) { |
|
| 258 | + $flags = ENT_COMPAT | ENT_HTML401; |
|
| 259 | + } |
|
| 260 | 260 | |
| 261 | - return htmlentities($string, $flags, $encoding, $double_encode); |
|
| 261 | + return htmlentities($string, $flags, $encoding, $double_encode); |
|
| 262 | 262 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Compilateur\References |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | /** |
@@ -41,14 +41,14 @@ discard block |
||
| 41 | 41 | * - '' si une référence explicite incorrecte est envoyée |
| 42 | 42 | */ |
| 43 | 43 | function index_boucle($p) { |
| 44 | - if (strlen($p->nom_boucle)) { |
|
| 45 | - // retourne l’index explicite demandé s’il existe |
|
| 46 | - if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 47 | - return $p->nom_boucle; |
|
| 48 | - } |
|
| 49 | - return ''; |
|
| 50 | - } |
|
| 51 | - return $p->id_boucle; |
|
| 44 | + if (strlen($p->nom_boucle)) { |
|
| 45 | + // retourne l’index explicite demandé s’il existe |
|
| 46 | + if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 47 | + return $p->nom_boucle; |
|
| 48 | + } |
|
| 49 | + return ''; |
|
| 50 | + } |
|
| 51 | + return $p->id_boucle; |
|
| 52 | 52 | } |
| 53 | 53 | |
| 54 | 54 | |
@@ -71,17 +71,17 @@ discard block |
||
| 71 | 71 | * - '' si une référence explicite incorrecte est envoyée |
| 72 | 72 | */ |
| 73 | 73 | function index_boucle_mere($p) { |
| 74 | - if (strlen($p->nom_boucle)) { |
|
| 75 | - // retourne l’index explicite demandé s’il existe |
|
| 76 | - if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 77 | - return $p->nom_boucle; |
|
| 78 | - } |
|
| 79 | - return ''; |
|
| 80 | - } |
|
| 81 | - if (!empty($p->descr['id_mere'])) { |
|
| 82 | - return $p->descr['id_mere']; |
|
| 83 | - } |
|
| 84 | - return ''; |
|
| 74 | + if (strlen($p->nom_boucle)) { |
|
| 75 | + // retourne l’index explicite demandé s’il existe |
|
| 76 | + if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 77 | + return $p->nom_boucle; |
|
| 78 | + } |
|
| 79 | + return ''; |
|
| 80 | + } |
|
| 81 | + if (!empty($p->descr['id_mere'])) { |
|
| 82 | + return $p->descr['id_mere']; |
|
| 83 | + } |
|
| 84 | + return ''; |
|
| 85 | 85 | } |
| 86 | 86 | |
| 87 | 87 | /** |
@@ -115,74 +115,74 @@ discard block |
||
| 115 | 115 | * Code PHP pour obtenir le champ SQL |
| 116 | 116 | */ |
| 117 | 117 | function index_pile( |
| 118 | - $idb, |
|
| 119 | - $nom_champ, |
|
| 120 | - &$boucles, |
|
| 121 | - $explicite = '', |
|
| 122 | - $defaut = null, |
|
| 123 | - $remonte_pile = true, |
|
| 124 | - $select = true |
|
| 118 | + $idb, |
|
| 119 | + $nom_champ, |
|
| 120 | + &$boucles, |
|
| 121 | + $explicite = '', |
|
| 122 | + $defaut = null, |
|
| 123 | + $remonte_pile = true, |
|
| 124 | + $select = true |
|
| 125 | 125 | ) { |
| 126 | - if (!is_string($defaut)) { |
|
| 127 | - $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)'; |
|
| 128 | - } |
|
| 129 | - |
|
| 130 | - $idb_origine = $idb; |
|
| 131 | - $nom_champ_origine = $nom_champ; |
|
| 132 | - |
|
| 133 | - $i = 0; |
|
| 134 | - if (strlen($explicite)) { |
|
| 135 | - // Recherche d'un champ dans un etage superieur |
|
| 136 | - while (($idb !== $explicite) && ($idb !== '')) { |
|
| 137 | - # spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'"); |
|
| 138 | - $i++; |
|
| 139 | - $idb = $boucles[$idb]->id_parent; |
|
| 140 | - } |
|
| 141 | - } |
|
| 142 | - |
|
| 143 | - # spip_log("Cherche: $nom_champ a partir de '$idb'"); |
|
| 144 | - $nom_champ = strtolower($nom_champ); |
|
| 145 | - $conditionnel = []; |
|
| 146 | - // attention: entre la boucle nommee 0, "" et le tableau vide, |
|
| 147 | - // il y a incoherences qu'il vaut mieux eviter |
|
| 148 | - while (isset($boucles[$idb])) { |
|
| 149 | - $joker = true; |
|
| 150 | - // modifie $joker si tous les champs sont autorisés. |
|
| 151 | - // $t = le select pour le champ, si on l'a trouvé (ou si joker) |
|
| 152 | - // $c = le nom du champ demandé |
|
| 153 | - [$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker); |
|
| 154 | - if ($t) { |
|
| 155 | - if ($select and !in_array($t, $boucles[$idb]->select)) { |
|
| 156 | - $boucles[$idb]->select[] = $t; |
|
| 157 | - } |
|
| 158 | - // renseigner la boucle source de ce champ pour les traitements |
|
| 159 | - $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb; |
|
| 160 | - $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']'; |
|
| 161 | - if (!$joker) { |
|
| 162 | - return index_compose($conditionnel, $champ); |
|
| 163 | - } |
|
| 164 | - |
|
| 165 | - // tant que l'on trouve des tables avec joker, on continue |
|
| 166 | - // avec la boucle parente et on conditionne à l'exécution |
|
| 167 | - // la présence du champ. Si le champ existe à l'exécution |
|
| 168 | - // dans une boucle, il est pris, sinon on le cherche dans le parent... |
|
| 169 | - $conditionnel[] = "isset($champ)?$champ"; |
|
| 170 | - } |
|
| 171 | - |
|
| 172 | - if ($remonte_pile) { |
|
| 173 | - # spip_log("On remonte vers $i"); |
|
| 174 | - // Sinon on remonte d'un cran |
|
| 175 | - $idb = $boucles[$idb]->id_parent; |
|
| 176 | - $i++; |
|
| 177 | - } else { |
|
| 178 | - $idb = null; |
|
| 179 | - } |
|
| 180 | - } |
|
| 181 | - |
|
| 182 | - # spip_log("Pas vu $nom_champ"); |
|
| 183 | - // esperons qu'il y sera |
|
| 184 | - // ou qu'on a fourni une valeur par "defaut" plus pertinent |
|
| 185 | - return index_compose($conditionnel, $defaut); |
|
| 126 | + if (!is_string($defaut)) { |
|
| 127 | + $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)'; |
|
| 128 | + } |
|
| 129 | + |
|
| 130 | + $idb_origine = $idb; |
|
| 131 | + $nom_champ_origine = $nom_champ; |
|
| 132 | + |
|
| 133 | + $i = 0; |
|
| 134 | + if (strlen($explicite)) { |
|
| 135 | + // Recherche d'un champ dans un etage superieur |
|
| 136 | + while (($idb !== $explicite) && ($idb !== '')) { |
|
| 137 | + # spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'"); |
|
| 138 | + $i++; |
|
| 139 | + $idb = $boucles[$idb]->id_parent; |
|
| 140 | + } |
|
| 141 | + } |
|
| 142 | + |
|
| 143 | + # spip_log("Cherche: $nom_champ a partir de '$idb'"); |
|
| 144 | + $nom_champ = strtolower($nom_champ); |
|
| 145 | + $conditionnel = []; |
|
| 146 | + // attention: entre la boucle nommee 0, "" et le tableau vide, |
|
| 147 | + // il y a incoherences qu'il vaut mieux eviter |
|
| 148 | + while (isset($boucles[$idb])) { |
|
| 149 | + $joker = true; |
|
| 150 | + // modifie $joker si tous les champs sont autorisés. |
|
| 151 | + // $t = le select pour le champ, si on l'a trouvé (ou si joker) |
|
| 152 | + // $c = le nom du champ demandé |
|
| 153 | + [$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker); |
|
| 154 | + if ($t) { |
|
| 155 | + if ($select and !in_array($t, $boucles[$idb]->select)) { |
|
| 156 | + $boucles[$idb]->select[] = $t; |
|
| 157 | + } |
|
| 158 | + // renseigner la boucle source de ce champ pour les traitements |
|
| 159 | + $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb; |
|
| 160 | + $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']'; |
|
| 161 | + if (!$joker) { |
|
| 162 | + return index_compose($conditionnel, $champ); |
|
| 163 | + } |
|
| 164 | + |
|
| 165 | + // tant que l'on trouve des tables avec joker, on continue |
|
| 166 | + // avec la boucle parente et on conditionne à l'exécution |
|
| 167 | + // la présence du champ. Si le champ existe à l'exécution |
|
| 168 | + // dans une boucle, il est pris, sinon on le cherche dans le parent... |
|
| 169 | + $conditionnel[] = "isset($champ)?$champ"; |
|
| 170 | + } |
|
| 171 | + |
|
| 172 | + if ($remonte_pile) { |
|
| 173 | + # spip_log("On remonte vers $i"); |
|
| 174 | + // Sinon on remonte d'un cran |
|
| 175 | + $idb = $boucles[$idb]->id_parent; |
|
| 176 | + $i++; |
|
| 177 | + } else { |
|
| 178 | + $idb = null; |
|
| 179 | + } |
|
| 180 | + } |
|
| 181 | + |
|
| 182 | + # spip_log("Pas vu $nom_champ"); |
|
| 183 | + // esperons qu'il y sera |
|
| 184 | + // ou qu'on a fourni une valeur par "defaut" plus pertinent |
|
| 185 | + return index_compose($conditionnel, $defaut); |
|
| 186 | 186 | } |
| 187 | 187 | |
| 188 | 188 | /** |
@@ -196,12 +196,12 @@ discard block |
||
| 196 | 196 | * @return string Code PHP complet de recherche d'un champ |
| 197 | 197 | */ |
| 198 | 198 | function index_compose($conditionnel, $defaut) { |
| 199 | - while ($c = array_pop($conditionnel)) { |
|
| 200 | - // si on passe defaut = '', ne pas générer d'erreur de compilation. |
|
| 201 | - $defaut = "($c:(" . ($defaut ?: "''") . '))'; |
|
| 202 | - } |
|
| 199 | + while ($c = array_pop($conditionnel)) { |
|
| 200 | + // si on passe defaut = '', ne pas générer d'erreur de compilation. |
|
| 201 | + $defaut = "($c:(" . ($defaut ?: "''") . '))'; |
|
| 202 | + } |
|
| 203 | 203 | |
| 204 | - return $defaut; |
|
| 204 | + return $defaut; |
|
| 205 | 205 | } |
| 206 | 206 | |
| 207 | 207 | /** |
@@ -237,96 +237,96 @@ discard block |
||
| 237 | 237 | **/ |
| 238 | 238 | function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { |
| 239 | 239 | |
| 240 | - $r = $boucles[$idb]->type_requete; |
|
| 241 | - // boucle recursive, c'est foutu... |
|
| 242 | - if ($r == TYPE_RECURSIF) { |
|
| 243 | - return []; |
|
| 244 | - } |
|
| 245 | - if (!$r) { |
|
| 246 | - $joker = false; // indiquer a l'appelant |
|
| 247 | - # continuer pour chercher l'erreur suivante |
|
| 248 | - return ["'#" . $r . ':' . $nom_champ . "'", '']; |
|
| 249 | - } |
|
| 250 | - |
|
| 251 | - $desc = $boucles[$idb]->show; |
|
| 252 | - // le nom du champ est il une exception de la table ? un alias ? |
|
| 253 | - $excep = $GLOBALS['exceptions_des_tables'][$r] ?? ''; |
|
| 254 | - if ($excep) { |
|
| 255 | - $excep = $excep[$nom_champ] ?? ''; |
|
| 256 | - } |
|
| 257 | - |
|
| 258 | - // il y a un alias connu pour ce champ |
|
| 259 | - if ($excep) { |
|
| 260 | - $joker = false; // indiquer a l'appelant |
|
| 261 | - return index_exception($boucles[$idb], $desc, $nom_champ, $excep); |
|
| 262 | - } |
|
| 263 | - |
|
| 264 | - // le champ existe dans la table, on le prend. |
|
| 265 | - if (isset($desc['field'][$nom_champ])) { |
|
| 266 | - $t = $boucles[$idb]->id_table; |
|
| 267 | - $joker = false; // indiquer a l'appelant |
|
| 268 | - return ["$t.$nom_champ", $nom_champ]; |
|
| 269 | - } |
|
| 270 | - |
|
| 271 | - // Tous les champs sont-ils acceptés ? |
|
| 272 | - // Si oui, on retourne le champ, et on lève le flag joker |
|
| 273 | - // C'est le cas des itérateurs DATA qui acceptent tout |
|
| 274 | - // et testent la présence du champ à l'exécution et non à la compilation |
|
| 275 | - // car ils ne connaissent pas ici leurs contenus. |
|
| 276 | - if ( |
|
| 277 | - /*$joker AND */ |
|
| 278 | - isset($desc['field']['*']) |
|
| 279 | - ) { |
|
| 280 | - $joker = true; // indiquer a l'appelant |
|
| 281 | - return [$nom_champ, $nom_champ]; |
|
| 282 | - } |
|
| 283 | - |
|
| 284 | - $joker = false; // indiquer a l'appelant |
|
| 285 | - |
|
| 286 | - // la table de jointure est explicitement indiquée (rubrique.titre) |
|
| 287 | - if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) { |
|
| 288 | - [, $_table, $_nom_champ] = $r; |
|
| 289 | - if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) { |
|
| 290 | - $_alias = $cle . '_' . $_nom_champ; |
|
| 291 | - return index_exception( |
|
| 292 | - $boucles[$idb], |
|
| 293 | - $desc, |
|
| 294 | - $_alias, |
|
| 295 | - [$_table, $_nom_champ] |
|
| 296 | - ); |
|
| 297 | - } |
|
| 298 | - return ['', '']; |
|
| 299 | - } |
|
| 300 | - |
|
| 301 | - // pas d'alias, pas de champ, pas de joker... |
|
| 302 | - // tenter via une jointure... |
|
| 303 | - |
|
| 304 | - // regarder si le champ est deja dans une jointure existante |
|
| 305 | - // sinon, si il y a des joitures explicites, la construire |
|
| 306 | - if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) { |
|
| 307 | - if ($boucles[$idb]->jointures_explicites) { |
|
| 308 | - // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!! |
|
| 309 | - // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites |
|
| 310 | - // mais est-ce ce qu'on veut ? |
|
| 311 | - $jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites); |
|
| 312 | - if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) { |
|
| 313 | - $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]); |
|
| 314 | - } |
|
| 315 | - } |
|
| 316 | - } |
|
| 317 | - |
|
| 318 | - if ($t) { |
|
| 319 | - // si on a trouvé une jointure possible, on fait comme |
|
| 320 | - // si c'était une exception pour le champ demandé |
|
| 321 | - return index_exception( |
|
| 322 | - $boucles[$idb], |
|
| 323 | - $desc, |
|
| 324 | - $nom_champ, |
|
| 325 | - [$t[1]['id_table'], reset($t[2])] |
|
| 326 | - ); |
|
| 327 | - } |
|
| 328 | - |
|
| 329 | - return ['', '']; |
|
| 240 | + $r = $boucles[$idb]->type_requete; |
|
| 241 | + // boucle recursive, c'est foutu... |
|
| 242 | + if ($r == TYPE_RECURSIF) { |
|
| 243 | + return []; |
|
| 244 | + } |
|
| 245 | + if (!$r) { |
|
| 246 | + $joker = false; // indiquer a l'appelant |
|
| 247 | + # continuer pour chercher l'erreur suivante |
|
| 248 | + return ["'#" . $r . ':' . $nom_champ . "'", '']; |
|
| 249 | + } |
|
| 250 | + |
|
| 251 | + $desc = $boucles[$idb]->show; |
|
| 252 | + // le nom du champ est il une exception de la table ? un alias ? |
|
| 253 | + $excep = $GLOBALS['exceptions_des_tables'][$r] ?? ''; |
|
| 254 | + if ($excep) { |
|
| 255 | + $excep = $excep[$nom_champ] ?? ''; |
|
| 256 | + } |
|
| 257 | + |
|
| 258 | + // il y a un alias connu pour ce champ |
|
| 259 | + if ($excep) { |
|
| 260 | + $joker = false; // indiquer a l'appelant |
|
| 261 | + return index_exception($boucles[$idb], $desc, $nom_champ, $excep); |
|
| 262 | + } |
|
| 263 | + |
|
| 264 | + // le champ existe dans la table, on le prend. |
|
| 265 | + if (isset($desc['field'][$nom_champ])) { |
|
| 266 | + $t = $boucles[$idb]->id_table; |
|
| 267 | + $joker = false; // indiquer a l'appelant |
|
| 268 | + return ["$t.$nom_champ", $nom_champ]; |
|
| 269 | + } |
|
| 270 | + |
|
| 271 | + // Tous les champs sont-ils acceptés ? |
|
| 272 | + // Si oui, on retourne le champ, et on lève le flag joker |
|
| 273 | + // C'est le cas des itérateurs DATA qui acceptent tout |
|
| 274 | + // et testent la présence du champ à l'exécution et non à la compilation |
|
| 275 | + // car ils ne connaissent pas ici leurs contenus. |
|
| 276 | + if ( |
|
| 277 | + /*$joker AND */ |
|
| 278 | + isset($desc['field']['*']) |
|
| 279 | + ) { |
|
| 280 | + $joker = true; // indiquer a l'appelant |
|
| 281 | + return [$nom_champ, $nom_champ]; |
|
| 282 | + } |
|
| 283 | + |
|
| 284 | + $joker = false; // indiquer a l'appelant |
|
| 285 | + |
|
| 286 | + // la table de jointure est explicitement indiquée (rubrique.titre) |
|
| 287 | + if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) { |
|
| 288 | + [, $_table, $_nom_champ] = $r; |
|
| 289 | + if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) { |
|
| 290 | + $_alias = $cle . '_' . $_nom_champ; |
|
| 291 | + return index_exception( |
|
| 292 | + $boucles[$idb], |
|
| 293 | + $desc, |
|
| 294 | + $_alias, |
|
| 295 | + [$_table, $_nom_champ] |
|
| 296 | + ); |
|
| 297 | + } |
|
| 298 | + return ['', '']; |
|
| 299 | + } |
|
| 300 | + |
|
| 301 | + // pas d'alias, pas de champ, pas de joker... |
|
| 302 | + // tenter via une jointure... |
|
| 303 | + |
|
| 304 | + // regarder si le champ est deja dans une jointure existante |
|
| 305 | + // sinon, si il y a des joitures explicites, la construire |
|
| 306 | + if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) { |
|
| 307 | + if ($boucles[$idb]->jointures_explicites) { |
|
| 308 | + // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!! |
|
| 309 | + // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites |
|
| 310 | + // mais est-ce ce qu'on veut ? |
|
| 311 | + $jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites); |
|
| 312 | + if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) { |
|
| 313 | + $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]); |
|
| 314 | + } |
|
| 315 | + } |
|
| 316 | + } |
|
| 317 | + |
|
| 318 | + if ($t) { |
|
| 319 | + // si on a trouvé une jointure possible, on fait comme |
|
| 320 | + // si c'était une exception pour le champ demandé |
|
| 321 | + return index_exception( |
|
| 322 | + $boucles[$idb], |
|
| 323 | + $desc, |
|
| 324 | + $nom_champ, |
|
| 325 | + [$t[1]['id_table'], reset($t[2])] |
|
| 326 | + ); |
|
| 327 | + } |
|
| 328 | + |
|
| 329 | + return ['', '']; |
|
| 330 | 330 | } |
| 331 | 331 | |
| 332 | 332 | |
@@ -354,52 +354,52 @@ discard block |
||
| 354 | 354 | * est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot" |
| 355 | 355 | **/ |
| 356 | 356 | function index_exception(&$boucle, $desc, $nom_champ, $excep) { |
| 357 | - static $trouver_table; |
|
| 358 | - if (!$trouver_table) { |
|
| 359 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 360 | - } |
|
| 361 | - |
|
| 362 | - if (is_array($excep)) { |
|
| 363 | - // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables |
|
| 364 | - $t = null; |
|
| 365 | - if (count($excep) == 3) { |
|
| 366 | - $index_exception_derogatoire = array_pop($excep); |
|
| 367 | - $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep); |
|
| 368 | - } |
|
| 369 | - if ($t == null) { |
|
| 370 | - [$e, $x] = $excep; #PHP4 affecte de gauche a droite |
|
| 371 | - $excep = $x; #PHP5 de droite a gauche ! |
|
| 372 | - $j = $trouver_table($e, $boucle->sql_serveur); |
|
| 373 | - if (!$j) { |
|
| 374 | - return ['', '']; |
|
| 375 | - } |
|
| 376 | - $e = $j['table']; |
|
| 377 | - if (!$t = array_search($e, $boucle->from)) { |
|
| 378 | - $k = $j['key']['PRIMARY KEY']; |
|
| 379 | - if (strpos($k, ',')) { |
|
| 380 | - $l = (preg_split('/\s*,\s*/', $k)); |
|
| 381 | - $k = $desc['key']['PRIMARY KEY']; |
|
| 382 | - if (!in_array($k, $l)) { |
|
| 383 | - spip_log("jointure impossible $e " . join(',', $l)); |
|
| 384 | - |
|
| 385 | - return ['', '']; |
|
| 386 | - } |
|
| 387 | - } |
|
| 388 | - $k = [$boucle->id_table, [$e], $k]; |
|
| 389 | - fabrique_jointures($boucle, [$k]); |
|
| 390 | - $t = array_search($e, $boucle->from); |
|
| 391 | - } |
|
| 392 | - } |
|
| 393 | - } else { |
|
| 394 | - $t = $boucle->id_table; |
|
| 395 | - } |
|
| 396 | - // demander a SQL de gerer le synonyme |
|
| 397 | - // ca permet que excep soit dynamique (Cedric, 2/3/06) |
|
| 398 | - if ($excep != $nom_champ) { |
|
| 399 | - $excep .= ' AS ' . $nom_champ; |
|
| 400 | - } |
|
| 401 | - |
|
| 402 | - return ["$t.$excep", $nom_champ]; |
|
| 357 | + static $trouver_table; |
|
| 358 | + if (!$trouver_table) { |
|
| 359 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 360 | + } |
|
| 361 | + |
|
| 362 | + if (is_array($excep)) { |
|
| 363 | + // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables |
|
| 364 | + $t = null; |
|
| 365 | + if (count($excep) == 3) { |
|
| 366 | + $index_exception_derogatoire = array_pop($excep); |
|
| 367 | + $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep); |
|
| 368 | + } |
|
| 369 | + if ($t == null) { |
|
| 370 | + [$e, $x] = $excep; #PHP4 affecte de gauche a droite |
|
| 371 | + $excep = $x; #PHP5 de droite a gauche ! |
|
| 372 | + $j = $trouver_table($e, $boucle->sql_serveur); |
|
| 373 | + if (!$j) { |
|
| 374 | + return ['', '']; |
|
| 375 | + } |
|
| 376 | + $e = $j['table']; |
|
| 377 | + if (!$t = array_search($e, $boucle->from)) { |
|
| 378 | + $k = $j['key']['PRIMARY KEY']; |
|
| 379 | + if (strpos($k, ',')) { |
|
| 380 | + $l = (preg_split('/\s*,\s*/', $k)); |
|
| 381 | + $k = $desc['key']['PRIMARY KEY']; |
|
| 382 | + if (!in_array($k, $l)) { |
|
| 383 | + spip_log("jointure impossible $e " . join(',', $l)); |
|
| 384 | + |
|
| 385 | + return ['', '']; |
|
| 386 | + } |
|
| 387 | + } |
|
| 388 | + $k = [$boucle->id_table, [$e], $k]; |
|
| 389 | + fabrique_jointures($boucle, [$k]); |
|
| 390 | + $t = array_search($e, $boucle->from); |
|
| 391 | + } |
|
| 392 | + } |
|
| 393 | + } else { |
|
| 394 | + $t = $boucle->id_table; |
|
| 395 | + } |
|
| 396 | + // demander a SQL de gerer le synonyme |
|
| 397 | + // ca permet que excep soit dynamique (Cedric, 2/3/06) |
|
| 398 | + if ($excep != $nom_champ) { |
|
| 399 | + $excep .= ' AS ' . $nom_champ; |
|
| 400 | + } |
|
| 401 | + |
|
| 402 | + return ["$t.$excep", $nom_champ]; |
|
| 403 | 403 | } |
| 404 | 404 | |
| 405 | 405 | /** |
@@ -424,7 +424,7 @@ discard block |
||
| 424 | 424 | * Code PHP pour retrouver le champ |
| 425 | 425 | */ |
| 426 | 426 | function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) { |
| 427 | - return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile); |
|
| 427 | + return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile); |
|
| 428 | 428 | } |
| 429 | 429 | |
| 430 | 430 | |
@@ -444,9 +444,9 @@ discard block |
||
| 444 | 444 | * Code PHP pour d'exécution de la balise et de ses filtres |
| 445 | 445 | **/ |
| 446 | 446 | function calculer_champ($p) { |
| 447 | - $p = calculer_balise($p->nom_champ, $p); |
|
| 447 | + $p = calculer_balise($p->nom_champ, $p); |
|
| 448 | 448 | |
| 449 | - return applique_filtres($p); |
|
| 449 | + return applique_filtres($p); |
|
| 450 | 450 | } |
| 451 | 451 | |
| 452 | 452 | |
@@ -483,26 +483,26 @@ discard block |
||
| 483 | 483 | **/ |
| 484 | 484 | function calculer_balise(string $nom, \Champ $p): \Champ { |
| 485 | 485 | |
| 486 | - // S'agit-t-il d'une balise_XXXX[_dist]() ? |
|
| 487 | - if ($f = charger_fonction($nom, 'balise', true)) { |
|
| 488 | - $p->balise_calculee = true; |
|
| 489 | - $res = $f($p); |
|
| 490 | - if ($res !== null and is_object($res)) { |
|
| 491 | - return $res; |
|
| 492 | - } |
|
| 493 | - } |
|
| 494 | - |
|
| 495 | - // Certaines des balises comportant un _ sont generiques |
|
| 496 | - if ($balise_generique = chercher_balise_generique($nom)) { |
|
| 497 | - $res = $balise_generique['fonction_generique']($p); |
|
| 498 | - if ($res !== null and is_object($res)) { |
|
| 499 | - return $res; |
|
| 500 | - } |
|
| 501 | - } |
|
| 502 | - |
|
| 503 | - $f = charger_fonction('DEFAUT', 'calculer_balise'); |
|
| 504 | - |
|
| 505 | - return $f($nom, $p); |
|
| 486 | + // S'agit-t-il d'une balise_XXXX[_dist]() ? |
|
| 487 | + if ($f = charger_fonction($nom, 'balise', true)) { |
|
| 488 | + $p->balise_calculee = true; |
|
| 489 | + $res = $f($p); |
|
| 490 | + if ($res !== null and is_object($res)) { |
|
| 491 | + return $res; |
|
| 492 | + } |
|
| 493 | + } |
|
| 494 | + |
|
| 495 | + // Certaines des balises comportant un _ sont generiques |
|
| 496 | + if ($balise_generique = chercher_balise_generique($nom)) { |
|
| 497 | + $res = $balise_generique['fonction_generique']($p); |
|
| 498 | + if ($res !== null and is_object($res)) { |
|
| 499 | + return $res; |
|
| 500 | + } |
|
| 501 | + } |
|
| 502 | + |
|
| 503 | + $f = charger_fonction('DEFAUT', 'calculer_balise'); |
|
| 504 | + |
|
| 505 | + return $f($nom, $p); |
|
| 506 | 506 | } |
| 507 | 507 | |
| 508 | 508 | |
@@ -530,37 +530,37 @@ discard block |
||
| 530 | 530 | **/ |
| 531 | 531 | function calculer_balise_DEFAUT_dist($nom, $p) { |
| 532 | 532 | |
| 533 | - // ca pourrait etre un champ SQL homonyme, |
|
| 534 | - $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle); |
|
| 535 | - |
|
| 536 | - // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 537 | - // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 538 | - if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) { |
|
| 539 | - $code = addslashes($p->fonctions[0][1]); |
|
| 540 | - $p->code .= " . '$code'"; |
|
| 541 | - } |
|
| 542 | - |
|
| 543 | - // ne pas passer le filtre securite sur les id_xxx |
|
| 544 | - if (strpos($nom, 'ID_') === 0) { |
|
| 545 | - $p->interdire_scripts = false; |
|
| 546 | - } |
|
| 547 | - |
|
| 548 | - // Compatibilite ascendante avec les couleurs html (#FEFEFE) : |
|
| 549 | - // SI le champ SQL n'est pas trouve |
|
| 550 | - // ET si la balise a une forme de couleur |
|
| 551 | - // ET s'il n'y a ni filtre ni etoile |
|
| 552 | - // ALORS retourner la couleur. |
|
| 553 | - // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)] |
|
| 554 | - if ( |
|
| 555 | - preg_match('/^[A-F]{1,6}$/i', $nom) |
|
| 556 | - and !$p->etoile |
|
| 557 | - and !$p->fonctions |
|
| 558 | - ) { |
|
| 559 | - $p->code = "'#$nom'"; |
|
| 560 | - $p->interdire_scripts = false; |
|
| 561 | - } |
|
| 562 | - |
|
| 563 | - return $p; |
|
| 533 | + // ca pourrait etre un champ SQL homonyme, |
|
| 534 | + $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle); |
|
| 535 | + |
|
| 536 | + // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 537 | + // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 538 | + if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) { |
|
| 539 | + $code = addslashes($p->fonctions[0][1]); |
|
| 540 | + $p->code .= " . '$code'"; |
|
| 541 | + } |
|
| 542 | + |
|
| 543 | + // ne pas passer le filtre securite sur les id_xxx |
|
| 544 | + if (strpos($nom, 'ID_') === 0) { |
|
| 545 | + $p->interdire_scripts = false; |
|
| 546 | + } |
|
| 547 | + |
|
| 548 | + // Compatibilite ascendante avec les couleurs html (#FEFEFE) : |
|
| 549 | + // SI le champ SQL n'est pas trouve |
|
| 550 | + // ET si la balise a une forme de couleur |
|
| 551 | + // ET s'il n'y a ni filtre ni etoile |
|
| 552 | + // ALORS retourner la couleur. |
|
| 553 | + // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)] |
|
| 554 | + if ( |
|
| 555 | + preg_match('/^[A-F]{1,6}$/i', $nom) |
|
| 556 | + and !$p->etoile |
|
| 557 | + and !$p->fonctions |
|
| 558 | + ) { |
|
| 559 | + $p->code = "'#$nom'"; |
|
| 560 | + $p->interdire_scripts = false; |
|
| 561 | + } |
|
| 562 | + |
|
| 563 | + return $p; |
|
| 564 | 564 | } |
| 565 | 565 | |
| 566 | 566 | |
@@ -603,39 +603,39 @@ discard block |
||
| 603 | 603 | **/ |
| 604 | 604 | function calculer_balise_dynamique($p, $nom, $l, $supp = []) { |
| 605 | 605 | |
| 606 | - if (!balise_distante_interdite($p)) { |
|
| 607 | - $p->code = "''"; |
|
| 608 | - |
|
| 609 | - return $p; |
|
| 610 | - } |
|
| 611 | - // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 612 | - // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 613 | - if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) { |
|
| 614 | - $p->fonctions = null; |
|
| 615 | - } |
|
| 616 | - |
|
| 617 | - if ($p->param and ($c = $p->param[0])) { |
|
| 618 | - // liste d'arguments commence toujours par la chaine vide |
|
| 619 | - array_shift($c); |
|
| 620 | - // construire la liste d'arguments comme pour un filtre |
|
| 621 | - $param = compose_filtres_args($p, $c, ','); |
|
| 622 | - } else { |
|
| 623 | - $param = ''; |
|
| 624 | - } |
|
| 625 | - $collecte = collecter_balise_dynamique($l, $p, $nom); |
|
| 626 | - |
|
| 627 | - $p->code = sprintf( |
|
| 628 | - CODE_EXECUTER_BALISE, |
|
| 629 | - $nom, |
|
| 630 | - join(',', $collecte), |
|
| 631 | - ($collecte ? $param : substr($param, 1)), # virer la virgule |
|
| 632 | - memoriser_contexte_compil($p), |
|
| 633 | - (!$supp ? '' : (', ' . join(',', $supp))) |
|
| 634 | - ); |
|
| 635 | - |
|
| 636 | - $p->interdire_scripts = false; |
|
| 637 | - |
|
| 638 | - return $p; |
|
| 606 | + if (!balise_distante_interdite($p)) { |
|
| 607 | + $p->code = "''"; |
|
| 608 | + |
|
| 609 | + return $p; |
|
| 610 | + } |
|
| 611 | + // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 612 | + // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 613 | + if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) { |
|
| 614 | + $p->fonctions = null; |
|
| 615 | + } |
|
| 616 | + |
|
| 617 | + if ($p->param and ($c = $p->param[0])) { |
|
| 618 | + // liste d'arguments commence toujours par la chaine vide |
|
| 619 | + array_shift($c); |
|
| 620 | + // construire la liste d'arguments comme pour un filtre |
|
| 621 | + $param = compose_filtres_args($p, $c, ','); |
|
| 622 | + } else { |
|
| 623 | + $param = ''; |
|
| 624 | + } |
|
| 625 | + $collecte = collecter_balise_dynamique($l, $p, $nom); |
|
| 626 | + |
|
| 627 | + $p->code = sprintf( |
|
| 628 | + CODE_EXECUTER_BALISE, |
|
| 629 | + $nom, |
|
| 630 | + join(',', $collecte), |
|
| 631 | + ($collecte ? $param : substr($param, 1)), # virer la virgule |
|
| 632 | + memoriser_contexte_compil($p), |
|
| 633 | + (!$supp ? '' : (', ' . join(',', $supp))) |
|
| 634 | + ); |
|
| 635 | + |
|
| 636 | + $p->interdire_scripts = false; |
|
| 637 | + |
|
| 638 | + return $p; |
|
| 639 | 639 | } |
| 640 | 640 | |
| 641 | 641 | |
@@ -665,17 +665,17 @@ discard block |
||
| 665 | 665 | * Liste des codes PHP d'éxecution des balises collectées |
| 666 | 666 | **/ |
| 667 | 667 | function collecter_balise_dynamique(array $l, \Champ &$p, string $nom): array { |
| 668 | - $args = []; |
|
| 669 | - foreach ($l as $c) { |
|
| 670 | - if ($c === null) { |
|
| 671 | - $args[] = 'null'; |
|
| 672 | - } else { |
|
| 673 | - $x = calculer_balise($c, $p); |
|
| 674 | - $args[] = $x->code; |
|
| 675 | - } |
|
| 676 | - } |
|
| 677 | - |
|
| 678 | - return $args; |
|
| 668 | + $args = []; |
|
| 669 | + foreach ($l as $c) { |
|
| 670 | + if ($c === null) { |
|
| 671 | + $args[] = 'null'; |
|
| 672 | + } else { |
|
| 673 | + $x = calculer_balise($c, $p); |
|
| 674 | + $args[] = $x->code; |
|
| 675 | + } |
|
| 676 | + } |
|
| 677 | + |
|
| 678 | + return $args; |
|
| 679 | 679 | } |
| 680 | 680 | |
| 681 | 681 | |
@@ -690,22 +690,22 @@ discard block |
||
| 690 | 690 | * Nom de la connexion |
| 691 | 691 | **/ |
| 692 | 692 | function trouver_nom_serveur_distant($p) { |
| 693 | - $nom = $p->id_boucle; |
|
| 694 | - if ( |
|
| 695 | - $nom |
|
| 696 | - and isset($p->boucles[$nom]) |
|
| 697 | - ) { |
|
| 698 | - $s = $p->boucles[$nom]->sql_serveur; |
|
| 699 | - if ( |
|
| 700 | - strlen($s) |
|
| 701 | - and strlen($serveur = strtolower($s)) |
|
| 702 | - and !in_array($serveur, $GLOBALS['exception_des_connect']) |
|
| 703 | - ) { |
|
| 704 | - return $serveur; |
|
| 705 | - } |
|
| 706 | - } |
|
| 707 | - |
|
| 708 | - return ''; |
|
| 693 | + $nom = $p->id_boucle; |
|
| 694 | + if ( |
|
| 695 | + $nom |
|
| 696 | + and isset($p->boucles[$nom]) |
|
| 697 | + ) { |
|
| 698 | + $s = $p->boucles[$nom]->sql_serveur; |
|
| 699 | + if ( |
|
| 700 | + strlen($s) |
|
| 701 | + and strlen($serveur = strtolower($s)) |
|
| 702 | + and !in_array($serveur, $GLOBALS['exception_des_connect']) |
|
| 703 | + ) { |
|
| 704 | + return $serveur; |
|
| 705 | + } |
|
| 706 | + } |
|
| 707 | + |
|
| 708 | + return ''; |
|
| 709 | 709 | } |
| 710 | 710 | |
| 711 | 711 | |
@@ -729,15 +729,15 @@ discard block |
||
| 729 | 729 | * - false : La balise est interdite car le serveur est distant |
| 730 | 730 | **/ |
| 731 | 731 | function balise_distante_interdite($p) { |
| 732 | - $nom = $p->id_boucle; |
|
| 732 | + $nom = $p->id_boucle; |
|
| 733 | 733 | |
| 734 | - if ($nom and trouver_nom_serveur_distant($p)) { |
|
| 735 | - spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit')); |
|
| 734 | + if ($nom and trouver_nom_serveur_distant($p)) { |
|
| 735 | + spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit')); |
|
| 736 | 736 | |
| 737 | - return false; |
|
| 738 | - } |
|
| 737 | + return false; |
|
| 738 | + } |
|
| 739 | 739 | |
| 740 | - return true; |
|
| 740 | + return true; |
|
| 741 | 741 | } |
| 742 | 742 | |
| 743 | 743 | |
@@ -747,84 +747,84 @@ discard block |
||
| 747 | 747 | // |
| 748 | 748 | function champs_traitements($p) { |
| 749 | 749 | |
| 750 | - if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) { |
|
| 751 | - $ps = $GLOBALS['table_des_traitements'][$p->nom_champ]; |
|
| 752 | - } else { |
|
| 753 | - // quand on utilise un traitement catch-all * |
|
| 754 | - // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer |
|
| 755 | - // leur propre securite |
|
| 756 | - if (!$p->balise_calculee) { |
|
| 757 | - $ps = $GLOBALS['table_des_traitements']['*']; |
|
| 758 | - } else { |
|
| 759 | - $ps = false; |
|
| 760 | - } |
|
| 761 | - } |
|
| 762 | - |
|
| 763 | - if (is_array($ps)) { |
|
| 764 | - // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte |
|
| 765 | - $idb = index_boucle($p); |
|
| 766 | - // si le champ a ete trouve dans une boucle parente sa source est renseignee ici |
|
| 767 | - if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) { |
|
| 768 | - $idb = $p->boucles[$idb]->index_champ[$p->nom_champ]; |
|
| 769 | - } |
|
| 770 | - |
|
| 771 | - // mais on peut aussi etre hors boucle. Se mefier. |
|
| 772 | - $type_requete = $p->boucles[$idb]->type_requete ?? false; |
|
| 773 | - $table_sql = $p->boucles[$idb]->show['table_sql'] ?? false; |
|
| 774 | - |
|
| 775 | - // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.) |
|
| 776 | - if ($type_requete and isset($GLOBALS['table_des_tables'][$type_requete])) { |
|
| 777 | - $type_alias = $type_requete; |
|
| 778 | - $type_requete = $GLOBALS['table_des_tables'][$type_requete]; |
|
| 779 | - } else { |
|
| 780 | - $type_alias = false; |
|
| 781 | - } |
|
| 782 | - |
|
| 783 | - // le traitement peut n'etre defini que pour une table en particulier "spip_articles" |
|
| 784 | - if ($table_sql and isset($ps[$table_sql])) { |
|
| 785 | - $ps = $ps[$table_sql]; |
|
| 786 | - } // ou pour une boucle en particulier "DATA","articles" |
|
| 787 | - elseif ($type_requete and isset($ps[$type_requete])) { |
|
| 788 | - $ps = $ps[$type_requete]; |
|
| 789 | - } // ou pour une boucle utilisant un alias ("hierarchie") |
|
| 790 | - elseif ($type_alias and isset($ps[$type_alias])) { |
|
| 791 | - $ps = $ps[$type_alias]; |
|
| 792 | - } // ou pour indifféremment quelle que soit la boucle |
|
| 793 | - elseif (isset($ps[0])) { |
|
| 794 | - $ps = $ps[0]; |
|
| 795 | - } else { |
|
| 796 | - $ps = false; |
|
| 797 | - } |
|
| 798 | - } |
|
| 799 | - |
|
| 800 | - if (!$ps) { |
|
| 801 | - return $p->code; |
|
| 802 | - } |
|
| 803 | - |
|
| 804 | - // Si une boucle DOCUMENTS{doublons} est presente dans le squelette, |
|
| 805 | - // ou si in INCLURE contient {doublons} |
|
| 806 | - // on insere une fonction de remplissage du tableau des doublons |
|
| 807 | - // dans les filtres propre() ou typo() |
|
| 808 | - // (qui traitent les raccourcis <docXX> referencant les docs) |
|
| 809 | - |
|
| 810 | - if ( |
|
| 811 | - isset($p->descr['documents']) |
|
| 812 | - and |
|
| 813 | - $p->descr['documents'] |
|
| 814 | - and ( |
|
| 815 | - (strpos($ps, 'propre') !== false) |
|
| 816 | - or |
|
| 817 | - (strpos($ps, 'typo') !== false) |
|
| 818 | - ) |
|
| 819 | - ) { |
|
| 820 | - $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')'; |
|
| 821 | - } |
|
| 822 | - |
|
| 823 | - // La protection des champs par |safehtml est assuree par les extensions |
|
| 824 | - // dans la declaration des traitements des champs sensibles |
|
| 825 | - |
|
| 826 | - // Remplacer enfin le placeholder %s par le vrai code de la balise |
|
| 827 | - return str_replace('%s', $p->code, $ps); |
|
| 750 | + if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) { |
|
| 751 | + $ps = $GLOBALS['table_des_traitements'][$p->nom_champ]; |
|
| 752 | + } else { |
|
| 753 | + // quand on utilise un traitement catch-all * |
|
| 754 | + // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer |
|
| 755 | + // leur propre securite |
|
| 756 | + if (!$p->balise_calculee) { |
|
| 757 | + $ps = $GLOBALS['table_des_traitements']['*']; |
|
| 758 | + } else { |
|
| 759 | + $ps = false; |
|
| 760 | + } |
|
| 761 | + } |
|
| 762 | + |
|
| 763 | + if (is_array($ps)) { |
|
| 764 | + // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte |
|
| 765 | + $idb = index_boucle($p); |
|
| 766 | + // si le champ a ete trouve dans une boucle parente sa source est renseignee ici |
|
| 767 | + if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) { |
|
| 768 | + $idb = $p->boucles[$idb]->index_champ[$p->nom_champ]; |
|
| 769 | + } |
|
| 770 | + |
|
| 771 | + // mais on peut aussi etre hors boucle. Se mefier. |
|
| 772 | + $type_requete = $p->boucles[$idb]->type_requete ?? false; |
|
| 773 | + $table_sql = $p->boucles[$idb]->show['table_sql'] ?? false; |
|
| 774 | + |
|
| 775 | + // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.) |
|
| 776 | + if ($type_requete and isset($GLOBALS['table_des_tables'][$type_requete])) { |
|
| 777 | + $type_alias = $type_requete; |
|
| 778 | + $type_requete = $GLOBALS['table_des_tables'][$type_requete]; |
|
| 779 | + } else { |
|
| 780 | + $type_alias = false; |
|
| 781 | + } |
|
| 782 | + |
|
| 783 | + // le traitement peut n'etre defini que pour une table en particulier "spip_articles" |
|
| 784 | + if ($table_sql and isset($ps[$table_sql])) { |
|
| 785 | + $ps = $ps[$table_sql]; |
|
| 786 | + } // ou pour une boucle en particulier "DATA","articles" |
|
| 787 | + elseif ($type_requete and isset($ps[$type_requete])) { |
|
| 788 | + $ps = $ps[$type_requete]; |
|
| 789 | + } // ou pour une boucle utilisant un alias ("hierarchie") |
|
| 790 | + elseif ($type_alias and isset($ps[$type_alias])) { |
|
| 791 | + $ps = $ps[$type_alias]; |
|
| 792 | + } // ou pour indifféremment quelle que soit la boucle |
|
| 793 | + elseif (isset($ps[0])) { |
|
| 794 | + $ps = $ps[0]; |
|
| 795 | + } else { |
|
| 796 | + $ps = false; |
|
| 797 | + } |
|
| 798 | + } |
|
| 799 | + |
|
| 800 | + if (!$ps) { |
|
| 801 | + return $p->code; |
|
| 802 | + } |
|
| 803 | + |
|
| 804 | + // Si une boucle DOCUMENTS{doublons} est presente dans le squelette, |
|
| 805 | + // ou si in INCLURE contient {doublons} |
|
| 806 | + // on insere une fonction de remplissage du tableau des doublons |
|
| 807 | + // dans les filtres propre() ou typo() |
|
| 808 | + // (qui traitent les raccourcis <docXX> referencant les docs) |
|
| 809 | + |
|
| 810 | + if ( |
|
| 811 | + isset($p->descr['documents']) |
|
| 812 | + and |
|
| 813 | + $p->descr['documents'] |
|
| 814 | + and ( |
|
| 815 | + (strpos($ps, 'propre') !== false) |
|
| 816 | + or |
|
| 817 | + (strpos($ps, 'typo') !== false) |
|
| 818 | + ) |
|
| 819 | + ) { |
|
| 820 | + $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')'; |
|
| 821 | + } |
|
| 822 | + |
|
| 823 | + // La protection des champs par |safehtml est assuree par les extensions |
|
| 824 | + // dans la declaration des traitements des champs sensibles |
|
| 825 | + |
|
| 826 | + // Remplacer enfin le placeholder %s par le vrai code de la balise |
|
| 827 | + return str_replace('%s', $p->code, $ps); |
|
| 828 | 828 | } |
| 829 | 829 | |
| 830 | 830 | |
@@ -836,110 +836,110 @@ discard block |
||
| 836 | 836 | // |
| 837 | 837 | function applique_filtres($p) { |
| 838 | 838 | |
| 839 | - // Traitements standards (cf. supra) |
|
| 840 | - if ($p->etoile == '') { |
|
| 841 | - $code = champs_traitements($p); |
|
| 842 | - } else { |
|
| 843 | - $code = $p->code; |
|
| 844 | - } |
|
| 839 | + // Traitements standards (cf. supra) |
|
| 840 | + if ($p->etoile == '') { |
|
| 841 | + $code = champs_traitements($p); |
|
| 842 | + } else { |
|
| 843 | + $code = $p->code; |
|
| 844 | + } |
|
| 845 | 845 | |
| 846 | - // Appliquer les filtres perso |
|
| 847 | - if ($p->param) { |
|
| 848 | - $code = compose_filtres($p, $code); |
|
| 849 | - } |
|
| 846 | + // Appliquer les filtres perso |
|
| 847 | + if ($p->param) { |
|
| 848 | + $code = compose_filtres($p, $code); |
|
| 849 | + } |
|
| 850 | 850 | |
| 851 | - // S'il y a un lien avec la session, ajouter un code qui levera |
|
| 852 | - // un drapeau dans la structure d'invalidation $Cache |
|
| 853 | - if (isset($p->descr['session'])) { |
|
| 854 | - $code = "invalideur_session(\$Cache, $code)"; |
|
| 855 | - } |
|
| 851 | + // S'il y a un lien avec la session, ajouter un code qui levera |
|
| 852 | + // un drapeau dans la structure d'invalidation $Cache |
|
| 853 | + if (isset($p->descr['session'])) { |
|
| 854 | + $code = "invalideur_session(\$Cache, $code)"; |
|
| 855 | + } |
|
| 856 | 856 | |
| 857 | - $code = sandbox_composer_interdire_scripts($code, $p); |
|
| 857 | + $code = sandbox_composer_interdire_scripts($code, $p); |
|
| 858 | 858 | |
| 859 | - return $code; |
|
| 859 | + return $code; |
|
| 860 | 860 | } |
| 861 | 861 | |
| 862 | 862 | // Cf. function pipeline dans ecrire/inc_utils.php |
| 863 | 863 | function compose_filtres(&$p, $code) { |
| 864 | 864 | |
| 865 | - $image_miette = false; |
|
| 866 | - foreach ($p->param as $filtre) { |
|
| 867 | - $fonc = array_shift($filtre); |
|
| 868 | - if (!$fonc) { |
|
| 869 | - continue; |
|
| 870 | - } // normalement qu'au premier tour. |
|
| 871 | - $is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver'); |
|
| 872 | - if ($image_miette and !$is_filtre_image) { |
|
| 873 | - // il faut graver maintenant car apres le filtre en cours |
|
| 874 | - // on est pas sur d'avoir encore le nom du fichier dans le pipe |
|
| 875 | - $code = "filtrer('image_graver', $code)"; |
|
| 876 | - $image_miette = false; |
|
| 877 | - } |
|
| 878 | - |
|
| 879 | - // recuperer les arguments du filtre, |
|
| 880 | - // a separer par "," ou ":" dans le cas du filtre "?{a,b}" |
|
| 881 | - $countfiltre = is_countable($filtre) ? count($filtre) : 0; |
|
| 882 | - if ($fonc !== '?') { |
|
| 883 | - $sep = ','; |
|
| 884 | - } else { |
|
| 885 | - $sep = ':'; |
|
| 886 | - // |?{a,b} *doit* avoir exactement 2 arguments ; on les force |
|
| 887 | - if ($countfiltre != 2) { |
|
| 888 | - $filtre = [$filtre[0] ?? '', $filtre[1] ?? '']; |
|
| 889 | - $countfiltre = 2; |
|
| 890 | - } |
|
| 891 | - } |
|
| 892 | - $arglist = compose_filtres_args($p, $filtre, $sep); |
|
| 893 | - $logique = filtre_logique($fonc, $code, substr($arglist, 1)); |
|
| 894 | - if ($logique) { |
|
| 895 | - $code = $logique; |
|
| 896 | - } else { |
|
| 897 | - $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre); |
|
| 898 | - if ($is_filtre_image) { |
|
| 899 | - $image_miette = true; |
|
| 900 | - } |
|
| 901 | - } |
|
| 902 | - } |
|
| 903 | - // ramasser les images intermediaires inutiles et graver l'image finale |
|
| 904 | - if ($image_miette) { |
|
| 905 | - $code = "filtrer('image_graver',$code)"; |
|
| 906 | - } |
|
| 907 | - |
|
| 908 | - return $code; |
|
| 865 | + $image_miette = false; |
|
| 866 | + foreach ($p->param as $filtre) { |
|
| 867 | + $fonc = array_shift($filtre); |
|
| 868 | + if (!$fonc) { |
|
| 869 | + continue; |
|
| 870 | + } // normalement qu'au premier tour. |
|
| 871 | + $is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver'); |
|
| 872 | + if ($image_miette and !$is_filtre_image) { |
|
| 873 | + // il faut graver maintenant car apres le filtre en cours |
|
| 874 | + // on est pas sur d'avoir encore le nom du fichier dans le pipe |
|
| 875 | + $code = "filtrer('image_graver', $code)"; |
|
| 876 | + $image_miette = false; |
|
| 877 | + } |
|
| 878 | + |
|
| 879 | + // recuperer les arguments du filtre, |
|
| 880 | + // a separer par "," ou ":" dans le cas du filtre "?{a,b}" |
|
| 881 | + $countfiltre = is_countable($filtre) ? count($filtre) : 0; |
|
| 882 | + if ($fonc !== '?') { |
|
| 883 | + $sep = ','; |
|
| 884 | + } else { |
|
| 885 | + $sep = ':'; |
|
| 886 | + // |?{a,b} *doit* avoir exactement 2 arguments ; on les force |
|
| 887 | + if ($countfiltre != 2) { |
|
| 888 | + $filtre = [$filtre[0] ?? '', $filtre[1] ?? '']; |
|
| 889 | + $countfiltre = 2; |
|
| 890 | + } |
|
| 891 | + } |
|
| 892 | + $arglist = compose_filtres_args($p, $filtre, $sep); |
|
| 893 | + $logique = filtre_logique($fonc, $code, substr($arglist, 1)); |
|
| 894 | + if ($logique) { |
|
| 895 | + $code = $logique; |
|
| 896 | + } else { |
|
| 897 | + $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre); |
|
| 898 | + if ($is_filtre_image) { |
|
| 899 | + $image_miette = true; |
|
| 900 | + } |
|
| 901 | + } |
|
| 902 | + } |
|
| 903 | + // ramasser les images intermediaires inutiles et graver l'image finale |
|
| 904 | + if ($image_miette) { |
|
| 905 | + $code = "filtrer('image_graver',$code)"; |
|
| 906 | + } |
|
| 907 | + |
|
| 908 | + return $code; |
|
| 909 | 909 | } |
| 910 | 910 | |
| 911 | 911 | // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes |
| 912 | 912 | // et comparateurs |
| 913 | 913 | function filtre_logique($fonc, $code, $arg) { |
| 914 | 914 | |
| 915 | - switch (true) { |
|
| 916 | - case in_array($fonc, $GLOBALS['table_criteres_infixes']): |
|
| 917 | - return "($code $fonc $arg)"; |
|
| 918 | - case ($fonc == 'and') or ($fonc == 'et'): |
|
| 919 | - return "((($code) AND ($arg)) ?' ' :'')"; |
|
| 920 | - case ($fonc == 'or') or ($fonc == 'ou'): |
|
| 921 | - return "((($code) OR ($arg)) ?' ' :'')"; |
|
| 922 | - case ($fonc == 'xor') or ($fonc == 'xou'): |
|
| 923 | - return "((($code) XOR ($arg)) ?' ' :'')"; |
|
| 924 | - case ($fonc == 'sinon'): |
|
| 925 | - return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)"; |
|
| 926 | - case ($fonc == 'not') or ($fonc == 'non'): |
|
| 927 | - return "(($code) ?'' :' ')"; |
|
| 928 | - case ($fonc == 'yes') or ($fonc == 'oui'): |
|
| 929 | - return "(($code) ?' ' :'')"; |
|
| 930 | - } |
|
| 931 | - |
|
| 932 | - return ''; |
|
| 915 | + switch (true) { |
|
| 916 | + case in_array($fonc, $GLOBALS['table_criteres_infixes']): |
|
| 917 | + return "($code $fonc $arg)"; |
|
| 918 | + case ($fonc == 'and') or ($fonc == 'et'): |
|
| 919 | + return "((($code) AND ($arg)) ?' ' :'')"; |
|
| 920 | + case ($fonc == 'or') or ($fonc == 'ou'): |
|
| 921 | + return "((($code) OR ($arg)) ?' ' :'')"; |
|
| 922 | + case ($fonc == 'xor') or ($fonc == 'xou'): |
|
| 923 | + return "((($code) XOR ($arg)) ?' ' :'')"; |
|
| 924 | + case ($fonc == 'sinon'): |
|
| 925 | + return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)"; |
|
| 926 | + case ($fonc == 'not') or ($fonc == 'non'): |
|
| 927 | + return "(($code) ?'' :' ')"; |
|
| 928 | + case ($fonc == 'yes') or ($fonc == 'oui'): |
|
| 929 | + return "(($code) ?' ' :'')"; |
|
| 930 | + } |
|
| 931 | + |
|
| 932 | + return ''; |
|
| 933 | 933 | } |
| 934 | 934 | |
| 935 | 935 | function compose_filtres_args($p, $args, $sep) { |
| 936 | - $arglist = ''; |
|
| 937 | - foreach ($args as $arg) { |
|
| 938 | - $arglist .= $sep . |
|
| 939 | - calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle); |
|
| 940 | - } |
|
| 936 | + $arglist = ''; |
|
| 937 | + foreach ($args as $arg) { |
|
| 938 | + $arglist .= $sep . |
|
| 939 | + calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle); |
|
| 940 | + } |
|
| 941 | 941 | |
| 942 | - return $arglist; |
|
| 942 | + return $arglist; |
|
| 943 | 943 | } |
| 944 | 944 | |
| 945 | 945 | |
@@ -957,15 +957,15 @@ discard block |
||
| 957 | 957 | **/ |
| 958 | 958 | function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) { |
| 959 | 959 | |
| 960 | - // si recursif, forcer l'extraction du champ SQL mais ignorer le code |
|
| 961 | - if ($boucles[$idb]->externe) { |
|
| 962 | - index_pile($idb, $nom_champ, $boucles, '', $defaut); |
|
| 963 | - // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle |
|
| 964 | - // on ignore le defaut fourni dans ce cas |
|
| 965 | - $defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)"; |
|
| 966 | - } |
|
| 960 | + // si recursif, forcer l'extraction du champ SQL mais ignorer le code |
|
| 961 | + if ($boucles[$idb]->externe) { |
|
| 962 | + index_pile($idb, $nom_champ, $boucles, '', $defaut); |
|
| 963 | + // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle |
|
| 964 | + // on ignore le defaut fourni dans ce cas |
|
| 965 | + $defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)"; |
|
| 966 | + } |
|
| 967 | 967 | |
| 968 | - return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut); |
|
| 968 | + return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut); |
|
| 969 | 969 | } |
| 970 | 970 | |
| 971 | 971 | // |
@@ -979,30 +979,30 @@ discard block |
||
| 979 | 979 | // |
| 980 | 980 | |
| 981 | 981 | function rindex_pile($p, $champ, $motif) { |
| 982 | - $n = 0; |
|
| 983 | - $b = $p->id_boucle; |
|
| 984 | - $p->code = ''; |
|
| 985 | - while ($b != '') { |
|
| 986 | - foreach ($p->boucles[$b]->criteres as $critere) { |
|
| 987 | - if ($critere->op == $motif) { |
|
| 988 | - $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") . |
|
| 989 | - "]['$champ']"; |
|
| 990 | - $b = ''; |
|
| 991 | - break 2; |
|
| 992 | - } |
|
| 993 | - } |
|
| 994 | - $n++; |
|
| 995 | - $b = $p->boucles[$b]->id_parent; |
|
| 996 | - } |
|
| 997 | - |
|
| 998 | - // si on est hors d'une boucle de {recherche}, cette balise est vide |
|
| 999 | - if (!$p->code) { |
|
| 1000 | - $p->code = "''"; |
|
| 1001 | - } |
|
| 1002 | - |
|
| 1003 | - $p->interdire_scripts = false; |
|
| 1004 | - |
|
| 1005 | - return $p; |
|
| 982 | + $n = 0; |
|
| 983 | + $b = $p->id_boucle; |
|
| 984 | + $p->code = ''; |
|
| 985 | + while ($b != '') { |
|
| 986 | + foreach ($p->boucles[$b]->criteres as $critere) { |
|
| 987 | + if ($critere->op == $motif) { |
|
| 988 | + $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") . |
|
| 989 | + "]['$champ']"; |
|
| 990 | + $b = ''; |
|
| 991 | + break 2; |
|
| 992 | + } |
|
| 993 | + } |
|
| 994 | + $n++; |
|
| 995 | + $b = $p->boucles[$b]->id_parent; |
|
| 996 | + } |
|
| 997 | + |
|
| 998 | + // si on est hors d'une boucle de {recherche}, cette balise est vide |
|
| 999 | + if (!$p->code) { |
|
| 1000 | + $p->code = "''"; |
|
| 1001 | + } |
|
| 1002 | + |
|
| 1003 | + $p->interdire_scripts = false; |
|
| 1004 | + |
|
| 1005 | + return $p; |
|
| 1006 | 1006 | } |
| 1007 | 1007 | |
| 1008 | 1008 | /** |
@@ -1012,7 +1012,7 @@ discard block |
||
| 1012 | 1012 | * @return string Nom de la balise, avec indication de boucle explicite si présent. |
| 1013 | 1013 | */ |
| 1014 | 1014 | function zbug_presenter_champ($p, $champ = '') { |
| 1015 | - $balise = $champ ?: $p->nom_champ; |
|
| 1016 | - $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : ''; |
|
| 1017 | - return "#{$explicite}{$balise}"; |
|
| 1015 | + $balise = $champ ?: $p->nom_champ; |
|
| 1016 | + $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : ''; |
|
| 1017 | + return "#{$explicite}{$balise}"; |
|
| 1018 | 1018 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | /** |
@@ -43,12 +43,12 @@ discard block |
||
| 43 | 43 | **/ |
| 44 | 44 | function critere_racine_dist($idb, &$boucles, $crit) { |
| 45 | 45 | |
| 46 | - $not = $crit->not; |
|
| 47 | - $boucle = &$boucles[$idb]; |
|
| 48 | - $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent'; |
|
| 46 | + $not = $crit->not; |
|
| 47 | + $boucle = &$boucles[$idb]; |
|
| 48 | + $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent'; |
|
| 49 | 49 | |
| 50 | - $c = ["'='", "'$boucle->id_table." . "$id_parent'", 0]; |
|
| 51 | - $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c); |
|
| 50 | + $c = ["'='", "'$boucle->id_table." . "$id_parent'", 0]; |
|
| 51 | + $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c); |
|
| 52 | 52 | } |
| 53 | 53 | |
| 54 | 54 | |
@@ -65,15 +65,15 @@ discard block |
||
| 65 | 65 | * @return void|array |
| 66 | 66 | **/ |
| 67 | 67 | function critere_exclus_dist($idb, &$boucles, $crit) { |
| 68 | - $not = $crit->not; |
|
| 69 | - $boucle = &$boucles[$idb]; |
|
| 70 | - $id = $boucle->primary; |
|
| 71 | - |
|
| 72 | - if ($not or !$id) { |
|
| 73 | - return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]]; |
|
| 74 | - } |
|
| 75 | - $arg = kwote(calculer_argument_precedent($idb, $id, $boucles)); |
|
| 76 | - $boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg]; |
|
| 68 | + $not = $crit->not; |
|
| 69 | + $boucle = &$boucles[$idb]; |
|
| 70 | + $id = $boucle->primary; |
|
| 71 | + |
|
| 72 | + if ($not or !$id) { |
|
| 73 | + return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]]; |
|
| 74 | + } |
|
| 75 | + $arg = kwote(calculer_argument_precedent($idb, $id, $boucles)); |
|
| 76 | + $boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg]; |
|
| 77 | 77 | } |
| 78 | 78 | |
| 79 | 79 | |
@@ -93,73 +93,73 @@ discard block |
||
| 93 | 93 | * @return void|array |
| 94 | 94 | **/ |
| 95 | 95 | function critere_doublons_dist($idb, &$boucles, $crit) { |
| 96 | - $boucle = &$boucles[$idb]; |
|
| 97 | - $primary = $boucle->primary; |
|
| 98 | - |
|
| 99 | - // la table nécessite une clé primaire, non composée |
|
| 100 | - if (!$primary or strpos($primary, ',')) { |
|
| 101 | - return ['zbug_doublon_sur_table_sans_cle_primaire']; |
|
| 102 | - } |
|
| 103 | - |
|
| 104 | - $not = ($crit->not ? '' : 'NOT'); |
|
| 105 | - |
|
| 106 | - // le doublon s'applique sur un type de boucle (article) |
|
| 107 | - $nom = "'" . $boucle->type_requete . "'"; |
|
| 108 | - |
|
| 109 | - // compléter le nom avec un nom précisé {doublons nom} |
|
| 110 | - // on obtient $nom = "'article' . 'nom'" |
|
| 111 | - if (isset($crit->param[0])) { |
|
| 112 | - $nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 113 | - } |
|
| 114 | - |
|
| 115 | - // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP) |
|
| 116 | - $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n"; |
|
| 117 | - $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n"; |
|
| 118 | - |
|
| 119 | - // on crée un sql_in avec la clé primaire de la table |
|
| 120 | - // et la collection des doublons déjà emmagasinés dans le tableau |
|
| 121 | - // $doublons et son index, ici $nom |
|
| 122 | - |
|
| 123 | - // debut du code "sql_in('articles.id_article', " |
|
| 124 | - $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', "; |
|
| 125 | - // lecture des données du doublon "$doublons[$doublon_index[] = " |
|
| 126 | - // Attention : boucle->doublons désigne une variable qu'on affecte |
|
| 127 | - $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= ')); |
|
| 128 | - |
|
| 129 | - // le debut complet du code des doublons |
|
| 130 | - $debut_doub = $debut_in . $debut_doub; |
|
| 131 | - |
|
| 132 | - // nom du doublon "('article' . 'nom')]" |
|
| 133 | - $fin_doub = "($nom)]"; |
|
| 134 | - |
|
| 135 | - // si on trouve un autre critère doublon, |
|
| 136 | - // on fusionne pour avoir un seul IN, et on s'en va ! |
|
| 137 | - foreach ($boucle->where as $k => $w) { |
|
| 138 | - if (strpos($w[0], $debut_doub) === 0) { |
|
| 139 | - // fusionner le sql_in (du where) |
|
| 140 | - $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in)); |
|
| 141 | - // fusionner l'initialisation (du hash) pour faire plus joli |
|
| 142 | - $x = strpos($boucle->hash, $init_comment); |
|
| 143 | - $len = strlen($init_comment); |
|
| 144 | - $boucle->hash = |
|
| 145 | - substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len); |
|
| 146 | - |
|
| 147 | - return; |
|
| 148 | - } |
|
| 149 | - } |
|
| 150 | - |
|
| 151 | - // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante |
|
| 152 | - $boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"]; |
|
| 153 | - |
|
| 154 | - // déclarer le doublon s'il n'existe pas encore |
|
| 155 | - $boucle->hash .= $init_comment . $init_code; |
|
| 156 | - |
|
| 157 | - |
|
| 158 | - # la ligne suivante avait l'intention d'eviter une collecte deja faite |
|
| 159 | - # mais elle fait planter une boucle a 2 critere doublons: |
|
| 160 | - # {!doublons A}{doublons B} |
|
| 161 | - # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034) |
|
| 162 | - # if ($crit->not) $boucle->doublons = ""; |
|
| 96 | + $boucle = &$boucles[$idb]; |
|
| 97 | + $primary = $boucle->primary; |
|
| 98 | + |
|
| 99 | + // la table nécessite une clé primaire, non composée |
|
| 100 | + if (!$primary or strpos($primary, ',')) { |
|
| 101 | + return ['zbug_doublon_sur_table_sans_cle_primaire']; |
|
| 102 | + } |
|
| 103 | + |
|
| 104 | + $not = ($crit->not ? '' : 'NOT'); |
|
| 105 | + |
|
| 106 | + // le doublon s'applique sur un type de boucle (article) |
|
| 107 | + $nom = "'" . $boucle->type_requete . "'"; |
|
| 108 | + |
|
| 109 | + // compléter le nom avec un nom précisé {doublons nom} |
|
| 110 | + // on obtient $nom = "'article' . 'nom'" |
|
| 111 | + if (isset($crit->param[0])) { |
|
| 112 | + $nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 113 | + } |
|
| 114 | + |
|
| 115 | + // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP) |
|
| 116 | + $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n"; |
|
| 117 | + $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n"; |
|
| 118 | + |
|
| 119 | + // on crée un sql_in avec la clé primaire de la table |
|
| 120 | + // et la collection des doublons déjà emmagasinés dans le tableau |
|
| 121 | + // $doublons et son index, ici $nom |
|
| 122 | + |
|
| 123 | + // debut du code "sql_in('articles.id_article', " |
|
| 124 | + $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', "; |
|
| 125 | + // lecture des données du doublon "$doublons[$doublon_index[] = " |
|
| 126 | + // Attention : boucle->doublons désigne une variable qu'on affecte |
|
| 127 | + $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= ')); |
|
| 128 | + |
|
| 129 | + // le debut complet du code des doublons |
|
| 130 | + $debut_doub = $debut_in . $debut_doub; |
|
| 131 | + |
|
| 132 | + // nom du doublon "('article' . 'nom')]" |
|
| 133 | + $fin_doub = "($nom)]"; |
|
| 134 | + |
|
| 135 | + // si on trouve un autre critère doublon, |
|
| 136 | + // on fusionne pour avoir un seul IN, et on s'en va ! |
|
| 137 | + foreach ($boucle->where as $k => $w) { |
|
| 138 | + if (strpos($w[0], $debut_doub) === 0) { |
|
| 139 | + // fusionner le sql_in (du where) |
|
| 140 | + $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in)); |
|
| 141 | + // fusionner l'initialisation (du hash) pour faire plus joli |
|
| 142 | + $x = strpos($boucle->hash, $init_comment); |
|
| 143 | + $len = strlen($init_comment); |
|
| 144 | + $boucle->hash = |
|
| 145 | + substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len); |
|
| 146 | + |
|
| 147 | + return; |
|
| 148 | + } |
|
| 149 | + } |
|
| 150 | + |
|
| 151 | + // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante |
|
| 152 | + $boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"]; |
|
| 153 | + |
|
| 154 | + // déclarer le doublon s'il n'existe pas encore |
|
| 155 | + $boucle->hash .= $init_comment . $init_code; |
|
| 156 | + |
|
| 157 | + |
|
| 158 | + # la ligne suivante avait l'intention d'eviter une collecte deja faite |
|
| 159 | + # mais elle fait planter une boucle a 2 critere doublons: |
|
| 160 | + # {!doublons A}{doublons B} |
|
| 161 | + # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034) |
|
| 162 | + # if ($crit->not) $boucle->doublons = ""; |
|
| 163 | 163 | } |
| 164 | 164 | |
| 165 | 165 | |
@@ -180,14 +180,14 @@ discard block |
||
| 180 | 180 | * @return void |
| 181 | 181 | **/ |
| 182 | 182 | function critere_lang_select_dist($idb, &$boucles, $crit) { |
| 183 | - if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) { |
|
| 184 | - $param = 'oui'; |
|
| 185 | - } |
|
| 186 | - if ($crit->not) { |
|
| 187 | - $param = ($param == 'oui') ? 'non' : 'oui'; |
|
| 188 | - } |
|
| 189 | - $boucle = &$boucles[$idb]; |
|
| 190 | - $boucle->lang_select = $param; |
|
| 183 | + if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) { |
|
| 184 | + $param = 'oui'; |
|
| 185 | + } |
|
| 186 | + if ($crit->not) { |
|
| 187 | + $param = ($param == 'oui') ? 'non' : 'oui'; |
|
| 188 | + } |
|
| 189 | + $boucle = &$boucles[$idb]; |
|
| 190 | + $boucle->lang_select = $param; |
|
| 191 | 191 | } |
| 192 | 192 | |
| 193 | 193 | |
@@ -209,15 +209,15 @@ discard block |
||
| 209 | 209 | * @return void |
| 210 | 210 | **/ |
| 211 | 211 | function critere_debut_dist($idb, &$boucles, $crit) { |
| 212 | - [$un, $deux] = $crit->param; |
|
| 213 | - $un = $un[0]->texte; |
|
| 214 | - $deux = $deux[0]->texte; |
|
| 215 | - if ($deux) { |
|
| 216 | - $boucles[$idb]->limit = |
|
| 217 | - 'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"'; |
|
| 218 | - } else { |
|
| 219 | - calculer_critere_DEFAUT_dist($idb, $boucles, $crit); |
|
| 220 | - } |
|
| 212 | + [$un, $deux] = $crit->param; |
|
| 213 | + $un = $un[0]->texte; |
|
| 214 | + $deux = $deux[0]->texte; |
|
| 215 | + if ($deux) { |
|
| 216 | + $boucles[$idb]->limit = |
|
| 217 | + 'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"'; |
|
| 218 | + } else { |
|
| 219 | + calculer_critere_DEFAUT_dist($idb, $boucles, $crit); |
|
| 220 | + } |
|
| 221 | 221 | } |
| 222 | 222 | |
| 223 | 223 | |
@@ -251,58 +251,58 @@ discard block |
||
| 251 | 251 | **/ |
| 252 | 252 | function critere_pagination_dist($idb, &$boucles, $crit) { |
| 253 | 253 | |
| 254 | - $boucle = &$boucles[$idb]; |
|
| 255 | - // definition de la taille de la page |
|
| 256 | - $pas = !isset($crit->param[0][0]) ? "''" |
|
| 257 | - : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent); |
|
| 258 | - |
|
| 259 | - if (!preg_match(_CODE_QUOTE, $pas, $r)) { |
|
| 260 | - $pas = "((\$a = intval($pas)) ? \$a : 10)"; |
|
| 261 | - } else { |
|
| 262 | - $r = intval($r[2]); |
|
| 263 | - $pas = strval($r ?: 10); |
|
| 264 | - } |
|
| 265 | - |
|
| 266 | - // Calcul du nommage de la pagination si il existe. |
|
| 267 | - // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste |
|
| 268 | - // compatible avec l'ancienne car certains cas fonctionnent correctement |
|
| 269 | - $type = "'$idb'"; |
|
| 270 | - // Calcul d'un nommage spécifique de la pagination si précisé. |
|
| 271 | - // Syntaxe {pagination 20, nom} |
|
| 272 | - if (isset($crit->param[0][1])) { |
|
| 273 | - $type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent); |
|
| 274 | - } // Ancienne syntaxe {pagination 20 nom} pour compatibilité |
|
| 275 | - elseif (isset($crit->param[1][0])) { |
|
| 276 | - $type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent); |
|
| 277 | - } |
|
| 278 | - |
|
| 279 | - $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1)); |
|
| 280 | - $boucle->modificateur['debut_nom'] = $type; |
|
| 281 | - $partie = |
|
| 282 | - // tester si le numero de page demande est de la forme '@yyy' |
|
| 283 | - 'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n" |
|
| 284 | - . "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n" |
|
| 285 | - . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n" |
|
| 286 | - . "\t\t" . '$iter->seek(0);' . "\n" |
|
| 287 | - . "\t}\n" |
|
| 288 | - . "\t" . '$debut_boucle = intval($debut_boucle)'; |
|
| 289 | - |
|
| 290 | - $boucle->hash .= ' |
|
| 254 | + $boucle = &$boucles[$idb]; |
|
| 255 | + // definition de la taille de la page |
|
| 256 | + $pas = !isset($crit->param[0][0]) ? "''" |
|
| 257 | + : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent); |
|
| 258 | + |
|
| 259 | + if (!preg_match(_CODE_QUOTE, $pas, $r)) { |
|
| 260 | + $pas = "((\$a = intval($pas)) ? \$a : 10)"; |
|
| 261 | + } else { |
|
| 262 | + $r = intval($r[2]); |
|
| 263 | + $pas = strval($r ?: 10); |
|
| 264 | + } |
|
| 265 | + |
|
| 266 | + // Calcul du nommage de la pagination si il existe. |
|
| 267 | + // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste |
|
| 268 | + // compatible avec l'ancienne car certains cas fonctionnent correctement |
|
| 269 | + $type = "'$idb'"; |
|
| 270 | + // Calcul d'un nommage spécifique de la pagination si précisé. |
|
| 271 | + // Syntaxe {pagination 20, nom} |
|
| 272 | + if (isset($crit->param[0][1])) { |
|
| 273 | + $type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent); |
|
| 274 | + } // Ancienne syntaxe {pagination 20 nom} pour compatibilité |
|
| 275 | + elseif (isset($crit->param[1][0])) { |
|
| 276 | + $type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent); |
|
| 277 | + } |
|
| 278 | + |
|
| 279 | + $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1)); |
|
| 280 | + $boucle->modificateur['debut_nom'] = $type; |
|
| 281 | + $partie = |
|
| 282 | + // tester si le numero de page demande est de la forme '@yyy' |
|
| 283 | + 'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n" |
|
| 284 | + . "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n" |
|
| 285 | + . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n" |
|
| 286 | + . "\t\t" . '$iter->seek(0);' . "\n" |
|
| 287 | + . "\t}\n" |
|
| 288 | + . "\t" . '$debut_boucle = intval($debut_boucle)'; |
|
| 289 | + |
|
| 290 | + $boucle->hash .= ' |
|
| 291 | 291 | $command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');'; |
| 292 | 292 | |
| 293 | - $boucle->total_parties = $pas; |
|
| 294 | - calculer_parties($boucles, $idb, $partie, 'p+'); |
|
| 295 | - // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id |
|
| 296 | - // sauf si pas de primaire, ou si primaire composee |
|
| 297 | - // dans ce cas, on ne sait pas gerer une pagination indirecte |
|
| 298 | - $t = $boucle->id_table . '.' . $boucle->primary; |
|
| 299 | - if ( |
|
| 300 | - $boucle->primary |
|
| 301 | - and !preg_match('/[,\s]/', $boucle->primary) |
|
| 302 | - and !in_array($t, $boucle->select) |
|
| 303 | - ) { |
|
| 304 | - $boucle->select[] = $t; |
|
| 305 | - } |
|
| 293 | + $boucle->total_parties = $pas; |
|
| 294 | + calculer_parties($boucles, $idb, $partie, 'p+'); |
|
| 295 | + // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id |
|
| 296 | + // sauf si pas de primaire, ou si primaire composee |
|
| 297 | + // dans ce cas, on ne sait pas gerer une pagination indirecte |
|
| 298 | + $t = $boucle->id_table . '.' . $boucle->primary; |
|
| 299 | + if ( |
|
| 300 | + $boucle->primary |
|
| 301 | + and !preg_match('/[,\s]/', $boucle->primary) |
|
| 302 | + and !in_array($t, $boucle->select) |
|
| 303 | + ) { |
|
| 304 | + $boucle->select[] = $t; |
|
| 305 | + } |
|
| 306 | 306 | } |
| 307 | 307 | |
| 308 | 308 | |
@@ -324,24 +324,24 @@ discard block |
||
| 324 | 324 | **/ |
| 325 | 325 | function critere_recherche_dist($idb, &$boucles, $crit) { |
| 326 | 326 | |
| 327 | - $boucle = &$boucles[$idb]; |
|
| 327 | + $boucle = &$boucles[$idb]; |
|
| 328 | 328 | |
| 329 | - if (!$boucle->primary or strpos($boucle->primary, ',')) { |
|
| 330 | - erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle); |
|
| 329 | + if (!$boucle->primary or strpos($boucle->primary, ',')) { |
|
| 330 | + erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle); |
|
| 331 | 331 | |
| 332 | - return; |
|
| 333 | - } |
|
| 332 | + return; |
|
| 333 | + } |
|
| 334 | 334 | |
| 335 | - if (isset($crit->param[0])) { |
|
| 336 | - $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 337 | - } else { |
|
| 338 | - $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))'; |
|
| 339 | - } |
|
| 335 | + if (isset($crit->param[0])) { |
|
| 336 | + $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 337 | + } else { |
|
| 338 | + $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))'; |
|
| 339 | + } |
|
| 340 | 340 | |
| 341 | - $_modificateur = var_export($boucle->modificateur, true); |
|
| 342 | - $boucle->hash .= ' |
|
| 341 | + $_modificateur = var_export($boucle->modificateur, true); |
|
| 342 | + $boucle->hash .= ' |
|
| 343 | 343 | // RECHERCHE' |
| 344 | - . ($crit->cond ? ' |
|
| 344 | + . ($crit->cond ? ' |
|
| 345 | 345 | if (!strlen(' . $quoi . ')){ |
| 346 | 346 | list($rech_select, $rech_where) = array("0 as points",""); |
| 347 | 347 | } else' : '') . ' |
@@ -352,21 +352,21 @@ discard block |
||
| 352 | 352 | '; |
| 353 | 353 | |
| 354 | 354 | |
| 355 | - $t = $boucle->id_table . '.' . $boucle->primary; |
|
| 356 | - if (!in_array($t, $boucles[$idb]->select)) { |
|
| 357 | - $boucle->select[] = $t; |
|
| 358 | - } # pour postgres, neuneu ici |
|
| 359 | - // jointure uniquement sur le serveur principal |
|
| 360 | - // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal) |
|
| 361 | - if (!$boucle->sql_serveur) { |
|
| 362 | - $boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"]; |
|
| 363 | - $boucle->from['resultats'] = 'spip_resultats'; |
|
| 364 | - } |
|
| 365 | - $boucle->select[] = '$rech_select'; |
|
| 366 | - //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''"; |
|
| 367 | - |
|
| 368 | - // et la recherche trouve |
|
| 369 | - $boucle->where[] = '$rech_where?$rech_where:\'\''; |
|
| 355 | + $t = $boucle->id_table . '.' . $boucle->primary; |
|
| 356 | + if (!in_array($t, $boucles[$idb]->select)) { |
|
| 357 | + $boucle->select[] = $t; |
|
| 358 | + } # pour postgres, neuneu ici |
|
| 359 | + // jointure uniquement sur le serveur principal |
|
| 360 | + // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal) |
|
| 361 | + if (!$boucle->sql_serveur) { |
|
| 362 | + $boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"]; |
|
| 363 | + $boucle->from['resultats'] = 'spip_resultats'; |
|
| 364 | + } |
|
| 365 | + $boucle->select[] = '$rech_select'; |
|
| 366 | + //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''"; |
|
| 367 | + |
|
| 368 | + // et la recherche trouve |
|
| 369 | + $boucle->where[] = '$rech_where?$rech_where:\'\''; |
|
| 370 | 370 | } |
| 371 | 371 | |
| 372 | 372 | /** |
@@ -383,25 +383,25 @@ discard block |
||
| 383 | 383 | * @return void |
| 384 | 384 | **/ |
| 385 | 385 | function critere_traduction_dist($idb, &$boucles, $crit) { |
| 386 | - $boucle = &$boucles[$idb]; |
|
| 387 | - $prim = $boucle->primary; |
|
| 388 | - $table = $boucle->id_table; |
|
| 389 | - $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles)); |
|
| 390 | - $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles)); |
|
| 391 | - $boucle->where[] = |
|
| 392 | - [ |
|
| 393 | - "'OR'", |
|
| 394 | - [ |
|
| 395 | - "'AND'", |
|
| 396 | - ["'='", "'$table.id_trad'", 0], |
|
| 397 | - ["'='", "'$table.$prim'", $dprim] |
|
| 398 | - ], |
|
| 399 | - [ |
|
| 400 | - "'AND'", |
|
| 401 | - ["'>'", "'$table.id_trad'", 0], |
|
| 402 | - ["'='", "'$table.id_trad'", $arg] |
|
| 403 | - ] |
|
| 404 | - ]; |
|
| 386 | + $boucle = &$boucles[$idb]; |
|
| 387 | + $prim = $boucle->primary; |
|
| 388 | + $table = $boucle->id_table; |
|
| 389 | + $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles)); |
|
| 390 | + $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles)); |
|
| 391 | + $boucle->where[] = |
|
| 392 | + [ |
|
| 393 | + "'OR'", |
|
| 394 | + [ |
|
| 395 | + "'AND'", |
|
| 396 | + ["'='", "'$table.id_trad'", 0], |
|
| 397 | + ["'='", "'$table.$prim'", $dprim] |
|
| 398 | + ], |
|
| 399 | + [ |
|
| 400 | + "'AND'", |
|
| 401 | + ["'>'", "'$table.id_trad'", 0], |
|
| 402 | + ["'='", "'$table.id_trad'", $arg] |
|
| 403 | + ] |
|
| 404 | + ]; |
|
| 405 | 405 | } |
| 406 | 406 | |
| 407 | 407 | |
@@ -419,17 +419,17 @@ discard block |
||
| 419 | 419 | * @return void |
| 420 | 420 | **/ |
| 421 | 421 | function critere_origine_traduction_dist($idb, &$boucles, $crit) { |
| 422 | - $boucle = &$boucles[$idb]; |
|
| 423 | - $prim = $boucle->primary; |
|
| 424 | - $table = $boucle->id_table; |
|
| 425 | - |
|
| 426 | - $c = |
|
| 427 | - [ |
|
| 428 | - "'OR'", |
|
| 429 | - ["'='", "'$table." . "id_trad'", "'$table.$prim'"], |
|
| 430 | - ["'='", "'$table.id_trad'", "'0'"] |
|
| 431 | - ]; |
|
| 432 | - $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c); |
|
| 422 | + $boucle = &$boucles[$idb]; |
|
| 423 | + $prim = $boucle->primary; |
|
| 424 | + $table = $boucle->id_table; |
|
| 425 | + |
|
| 426 | + $c = |
|
| 427 | + [ |
|
| 428 | + "'OR'", |
|
| 429 | + ["'='", "'$table." . "id_trad'", "'$table.$prim'"], |
|
| 430 | + ["'='", "'$table.id_trad'", "'0'"] |
|
| 431 | + ]; |
|
| 432 | + $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c); |
|
| 433 | 433 | } |
| 434 | 434 | |
| 435 | 435 | |
@@ -446,17 +446,17 @@ discard block |
||
| 446 | 446 | **/ |
| 447 | 447 | function critere_meme_parent_dist($idb, &$boucles, $crit) { |
| 448 | 448 | |
| 449 | - $boucle = &$boucles[$idb]; |
|
| 450 | - $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles)); |
|
| 451 | - $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent'; |
|
| 452 | - $mparent = $boucle->id_table . '.' . $id_parent; |
|
| 453 | - |
|
| 454 | - if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) { |
|
| 455 | - $boucle->where[] = ["'='", "'$mparent'", $arg]; |
|
| 456 | - } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist() |
|
| 457 | - else { |
|
| 458 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]]; |
|
| 459 | - } |
|
| 449 | + $boucle = &$boucles[$idb]; |
|
| 450 | + $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles)); |
|
| 451 | + $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent'; |
|
| 452 | + $mparent = $boucle->id_table . '.' . $id_parent; |
|
| 453 | + |
|
| 454 | + if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) { |
|
| 455 | + $boucle->where[] = ["'='", "'$mparent'", $arg]; |
|
| 456 | + } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist() |
|
| 457 | + else { |
|
| 458 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]]; |
|
| 459 | + } |
|
| 460 | 460 | } |
| 461 | 461 | |
| 462 | 462 | |
@@ -487,37 +487,37 @@ discard block |
||
| 487 | 487 | **/ |
| 488 | 488 | function critere_branche_dist($idb, &$boucles, $crit) { |
| 489 | 489 | |
| 490 | - $not = $crit->not; |
|
| 491 | - $boucle = &$boucles[$idb]; |
|
| 492 | - // prendre en priorite un identifiant en parametre {branche XX} |
|
| 493 | - if (isset($crit->param[0])) { |
|
| 494 | - $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 495 | - // sinon on le prend chez une boucle parente |
|
| 496 | - } else { |
|
| 497 | - $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL'); |
|
| 498 | - } |
|
| 499 | - |
|
| 500 | - //Trouver une jointure |
|
| 501 | - $champ = 'id_rubrique'; |
|
| 502 | - $desc = $boucle->show; |
|
| 503 | - //Seulement si necessaire |
|
| 504 | - if (!array_key_exists($champ, $desc['field'])) { |
|
| 505 | - $cle = trouver_jointure_champ($champ, $boucle); |
|
| 506 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 507 | - $desc = $trouver_table($boucle->from[$cle]); |
|
| 508 | - if (count(trouver_champs_decomposes($champ, $desc)) > 1) { |
|
| 509 | - $decompose = decompose_champ_id_objet($champ); |
|
| 510 | - $champ = array_shift($decompose); |
|
| 511 | - $boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"']; |
|
| 512 | - } |
|
| 513 | - } else { |
|
| 514 | - $cle = $boucle->id_table; |
|
| 515 | - } |
|
| 516 | - |
|
| 517 | - $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)" |
|
| 518 | - . ($not ? ", 'NOT'" : '') . ')'; |
|
| 519 | - $boucle->where[] = !$crit->cond ? $c : |
|
| 520 | - ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')'); |
|
| 490 | + $not = $crit->not; |
|
| 491 | + $boucle = &$boucles[$idb]; |
|
| 492 | + // prendre en priorite un identifiant en parametre {branche XX} |
|
| 493 | + if (isset($crit->param[0])) { |
|
| 494 | + $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 495 | + // sinon on le prend chez une boucle parente |
|
| 496 | + } else { |
|
| 497 | + $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL'); |
|
| 498 | + } |
|
| 499 | + |
|
| 500 | + //Trouver une jointure |
|
| 501 | + $champ = 'id_rubrique'; |
|
| 502 | + $desc = $boucle->show; |
|
| 503 | + //Seulement si necessaire |
|
| 504 | + if (!array_key_exists($champ, $desc['field'])) { |
|
| 505 | + $cle = trouver_jointure_champ($champ, $boucle); |
|
| 506 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 507 | + $desc = $trouver_table($boucle->from[$cle]); |
|
| 508 | + if (count(trouver_champs_decomposes($champ, $desc)) > 1) { |
|
| 509 | + $decompose = decompose_champ_id_objet($champ); |
|
| 510 | + $champ = array_shift($decompose); |
|
| 511 | + $boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"']; |
|
| 512 | + } |
|
| 513 | + } else { |
|
| 514 | + $cle = $boucle->id_table; |
|
| 515 | + } |
|
| 516 | + |
|
| 517 | + $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)" |
|
| 518 | + . ($not ? ", 'NOT'" : '') . ')'; |
|
| 519 | + $boucle->where[] = !$crit->cond ? $c : |
|
| 520 | + ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')'); |
|
| 521 | 521 | } |
| 522 | 522 | |
| 523 | 523 | /** |
@@ -533,15 +533,15 @@ discard block |
||
| 533 | 533 | **/ |
| 534 | 534 | function critere_logo_dist($idb, &$boucles, $crit) { |
| 535 | 535 | |
| 536 | - $boucle = &$boucles[$idb]; |
|
| 537 | - $not = ($crit->not ? 'NOT' : ''); |
|
| 538 | - $serveur = $boucle->sql_serveur; |
|
| 536 | + $boucle = &$boucles[$idb]; |
|
| 537 | + $not = ($crit->not ? 'NOT' : ''); |
|
| 538 | + $serveur = $boucle->sql_serveur; |
|
| 539 | 539 | |
| 540 | - $c = "sql_in('" . |
|
| 541 | - $boucle->id_table . '.' . $boucle->primary |
|
| 542 | - . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')"; |
|
| 540 | + $c = "sql_in('" . |
|
| 541 | + $boucle->id_table . '.' . $boucle->primary |
|
| 542 | + . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')"; |
|
| 543 | 543 | |
| 544 | - $boucle->where[] = $c; |
|
| 544 | + $boucle->where[] = $c; |
|
| 545 | 545 | } |
| 546 | 546 | |
| 547 | 547 | |
@@ -563,31 +563,31 @@ discard block |
||
| 563 | 563 | * @return void|array |
| 564 | 564 | **/ |
| 565 | 565 | function critere_fusion_dist($idb, &$boucles, $crit) { |
| 566 | - if ($t = isset($crit->param[0])) { |
|
| 567 | - $t = $crit->param[0]; |
|
| 568 | - if ($t[0]->type == 'texte') { |
|
| 569 | - $t = $t[0]->texte; |
|
| 570 | - if (preg_match('/^(.*)\.(.*)$/', $t, $r)) { |
|
| 571 | - $t = table_objet_sql($r[1]); |
|
| 572 | - $t = array_search($t, $boucles[$idb]->from); |
|
| 573 | - if ($t) { |
|
| 574 | - $t .= '.' . $r[2]; |
|
| 575 | - } |
|
| 576 | - } |
|
| 577 | - } else { |
|
| 578 | - $t = '".' |
|
| 579 | - . calculer_critere_arg_dynamique($idb, $boucles, $t) |
|
| 580 | - . '."'; |
|
| 581 | - } |
|
| 582 | - } |
|
| 583 | - if ($t) { |
|
| 584 | - $boucles[$idb]->group[] = $t; |
|
| 585 | - if (!in_array($t, $boucles[$idb]->select)) { |
|
| 586 | - $boucles[$idb]->select[] = $t; |
|
| 587 | - } |
|
| 588 | - } else { |
|
| 589 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]; |
|
| 590 | - } |
|
| 566 | + if ($t = isset($crit->param[0])) { |
|
| 567 | + $t = $crit->param[0]; |
|
| 568 | + if ($t[0]->type == 'texte') { |
|
| 569 | + $t = $t[0]->texte; |
|
| 570 | + if (preg_match('/^(.*)\.(.*)$/', $t, $r)) { |
|
| 571 | + $t = table_objet_sql($r[1]); |
|
| 572 | + $t = array_search($t, $boucles[$idb]->from); |
|
| 573 | + if ($t) { |
|
| 574 | + $t .= '.' . $r[2]; |
|
| 575 | + } |
|
| 576 | + } |
|
| 577 | + } else { |
|
| 578 | + $t = '".' |
|
| 579 | + . calculer_critere_arg_dynamique($idb, $boucles, $t) |
|
| 580 | + . '."'; |
|
| 581 | + } |
|
| 582 | + } |
|
| 583 | + if ($t) { |
|
| 584 | + $boucles[$idb]->group[] = $t; |
|
| 585 | + if (!in_array($t, $boucles[$idb]->select)) { |
|
| 586 | + $boucles[$idb]->select[] = $t; |
|
| 587 | + } |
|
| 588 | + } else { |
|
| 589 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]; |
|
| 590 | + } |
|
| 591 | 591 | } |
| 592 | 592 | |
| 593 | 593 | /** |
@@ -607,7 +607,7 @@ discard block |
||
| 607 | 607 | * @return void |
| 608 | 608 | **/ |
| 609 | 609 | function critere_fusion_supprimer_dist($idb, &$boucles, $crit) { |
| 610 | - $boucles[$idb]->group = []; |
|
| 610 | + $boucles[$idb]->group = []; |
|
| 611 | 611 | } |
| 612 | 612 | |
| 613 | 613 | /** |
@@ -644,44 +644,44 @@ discard block |
||
| 644 | 644 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 645 | 645 | */ |
| 646 | 646 | function critere_collecte_dist($idb, &$boucles, $crit) { |
| 647 | - if (isset($crit->param[0])) { |
|
| 648 | - $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 649 | - $boucle = $boucles[$idb]; |
|
| 650 | - $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')"; |
|
| 651 | - $n = is_countable($boucle->order) ? count($boucle->order) : 0; |
|
| 652 | - if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) { |
|
| 653 | - // l'instruction COLLATE doit être placée avant ASC ou DESC |
|
| 654 | - // notamment lors de l'utilisation `{!par xxx}{collate yyy}` |
|
| 655 | - if ( |
|
| 656 | - (false !== $i = strpos($boucle->order[$n - 1], 'ASC')) |
|
| 657 | - or (false !== $i = strpos($boucle->order[$n - 1], 'DESC')) |
|
| 658 | - ) { |
|
| 659 | - $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0); |
|
| 660 | - } else { |
|
| 661 | - $boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate']; |
|
| 662 | - } |
|
| 663 | - } |
|
| 664 | - } else { |
|
| 665 | - return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]); |
|
| 666 | - } |
|
| 647 | + if (isset($crit->param[0])) { |
|
| 648 | + $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 649 | + $boucle = $boucles[$idb]; |
|
| 650 | + $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')"; |
|
| 651 | + $n = is_countable($boucle->order) ? count($boucle->order) : 0; |
|
| 652 | + if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) { |
|
| 653 | + // l'instruction COLLATE doit être placée avant ASC ou DESC |
|
| 654 | + // notamment lors de l'utilisation `{!par xxx}{collate yyy}` |
|
| 655 | + if ( |
|
| 656 | + (false !== $i = strpos($boucle->order[$n - 1], 'ASC')) |
|
| 657 | + or (false !== $i = strpos($boucle->order[$n - 1], 'DESC')) |
|
| 658 | + ) { |
|
| 659 | + $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0); |
|
| 660 | + } else { |
|
| 661 | + $boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate']; |
|
| 662 | + } |
|
| 663 | + } |
|
| 664 | + } else { |
|
| 665 | + return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]); |
|
| 666 | + } |
|
| 667 | 667 | } |
| 668 | 668 | |
| 669 | 669 | function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') { |
| 670 | - $boucle = $boucles[$idb]; |
|
| 671 | - $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')'; |
|
| 672 | - $var = '$champs_' . $idb; |
|
| 673 | - $desc = (strpos($boucle->in, (string) "static $var =") !== false); |
|
| 674 | - if (!$desc) { |
|
| 675 | - $desc = $boucle->show['field']; |
|
| 676 | - $desc = implode(',', array_map('_q', array_keys($desc))); |
|
| 677 | - $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');'; |
|
| 678 | - } |
|
| 679 | - if ($desc) { |
|
| 680 | - $alt = "(in_array(\$x, $var) ? $alt :(\$x$suffix))"; |
|
| 681 | - } |
|
| 682 | - $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent); |
|
| 683 | - |
|
| 684 | - return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')"; |
|
| 670 | + $boucle = $boucles[$idb]; |
|
| 671 | + $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')'; |
|
| 672 | + $var = '$champs_' . $idb; |
|
| 673 | + $desc = (strpos($boucle->in, (string) "static $var =") !== false); |
|
| 674 | + if (!$desc) { |
|
| 675 | + $desc = $boucle->show['field']; |
|
| 676 | + $desc = implode(',', array_map('_q', array_keys($desc))); |
|
| 677 | + $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');'; |
|
| 678 | + } |
|
| 679 | + if ($desc) { |
|
| 680 | + $alt = "(in_array(\$x, $var) ? $alt :(\$x$suffix))"; |
|
| 681 | + } |
|
| 682 | + $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent); |
|
| 683 | + |
|
| 684 | + return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')"; |
|
| 685 | 685 | } |
| 686 | 686 | |
| 687 | 687 | /** |
@@ -720,7 +720,7 @@ discard block |
||
| 720 | 720 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 721 | 721 | */ |
| 722 | 722 | function critere_par_dist($idb, &$boucles, $crit) { |
| 723 | - return critere_parinverse($idb, $boucles, $crit); |
|
| 723 | + return critere_parinverse($idb, $boucles, $crit); |
|
| 724 | 724 | } |
| 725 | 725 | |
| 726 | 726 | /** |
@@ -742,93 +742,93 @@ discard block |
||
| 742 | 742 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 743 | 743 | */ |
| 744 | 744 | function critere_parinverse($idb, &$boucles, $crit) { |
| 745 | - $boucle = &$boucles[$idb]; |
|
| 746 | - |
|
| 747 | - $sens = $collecte = ''; |
|
| 748 | - if ($crit->not) { |
|
| 749 | - $sens = " . ' DESC'"; |
|
| 750 | - } |
|
| 751 | - if (isset($boucle->modificateur['collate'])) { |
|
| 752 | - $collecte = ' . ' . $boucle->modificateur['collate']; |
|
| 753 | - } |
|
| 754 | - |
|
| 755 | - // Pour chaque paramètre du critère |
|
| 756 | - foreach ($crit->param as $tri) { |
|
| 757 | - $order = $fct = ''; |
|
| 758 | - // tris specifiés dynamiquement {par #ENV{tri}} |
|
| 759 | - if ($tri[0]->type != 'texte') { |
|
| 760 | - // calculer le order dynamique qui verifie les champs |
|
| 761 | - $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens); |
|
| 762 | - // ajouter 'hasard' comme possibilité de tri dynamique |
|
| 763 | - calculer_critere_par_hasard($idb, $boucles, $crit); |
|
| 764 | - } |
|
| 765 | - // tris textuels {par titre} |
|
| 766 | - else { |
|
| 767 | - $par = array_shift($tri); |
|
| 768 | - $par = $par->texte; |
|
| 769 | - |
|
| 770 | - // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre} |
|
| 771 | - if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) { |
|
| 772 | - $expression = trim($m[1]); |
|
| 773 | - $champ = trim($m[2]); |
|
| 774 | - if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) { |
|
| 775 | - $order = $f($idb, $boucles, $crit, $tri, $champ); |
|
| 776 | - } else { |
|
| 777 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]]; |
|
| 778 | - } |
|
| 779 | - |
|
| 780 | - // tris de la forme {par champ} ou {par FONCTION(champ)} |
|
| 781 | - } elseif ($boucle->type_requete == 'DATA' or preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) { |
|
| 782 | - // {par FONCTION(champ)} |
|
| 783 | - if (isset($match) and count($match) > 2) { |
|
| 784 | - $par = substr($match[2], 1, -1); |
|
| 785 | - $fct = $match[1]; |
|
| 786 | - } |
|
| 787 | - // quelques cas spécifiques {par hasard}, {par date} |
|
| 788 | - if ($par == 'hasard') { |
|
| 789 | - $order = calculer_critere_par_hasard($idb, $boucles, $crit); |
|
| 790 | - } elseif ($par == 'date' and !empty($boucle->show['date'])) { |
|
| 791 | - $order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'"; |
|
| 792 | - } else { |
|
| 793 | - // cas général {par champ}, {par table.champ}, ... |
|
| 794 | - $order = calculer_critere_par_champ($idb, $boucles, $crit, $par); |
|
| 795 | - } |
|
| 796 | - } |
|
| 797 | - |
|
| 798 | - // on ne sait pas traiter… |
|
| 799 | - else { |
|
| 800 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]]; |
|
| 801 | - } |
|
| 802 | - |
|
| 803 | - // En cas d'erreur de squelette retournée par une fonction |
|
| 804 | - if (is_array($order)) { |
|
| 805 | - return $order; |
|
| 806 | - } |
|
| 807 | - } |
|
| 808 | - |
|
| 809 | - if (preg_match('/^\'([^"]*)\'$/', $order, $m)) { |
|
| 810 | - $t = $m[1]; |
|
| 811 | - if (strpos($t, '.') and !in_array($t, $boucle->select)) { |
|
| 812 | - $boucle->select[] = $t; |
|
| 813 | - } |
|
| 814 | - } else { |
|
| 815 | - $sens = ''; |
|
| 816 | - } |
|
| 817 | - |
|
| 818 | - if ($fct) { |
|
| 819 | - if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) { |
|
| 820 | - $order = "'$fct(" . $r[1] . ")'"; |
|
| 821 | - } else { |
|
| 822 | - $order = "'$fct(' . $order . ')'"; |
|
| 823 | - } |
|
| 824 | - } |
|
| 825 | - $t = $order . $collecte . $sens; |
|
| 826 | - if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) { |
|
| 827 | - $t = $r[1] . $r[2]; |
|
| 828 | - } |
|
| 829 | - |
|
| 830 | - $boucle->order[] = $t; |
|
| 831 | - } |
|
| 745 | + $boucle = &$boucles[$idb]; |
|
| 746 | + |
|
| 747 | + $sens = $collecte = ''; |
|
| 748 | + if ($crit->not) { |
|
| 749 | + $sens = " . ' DESC'"; |
|
| 750 | + } |
|
| 751 | + if (isset($boucle->modificateur['collate'])) { |
|
| 752 | + $collecte = ' . ' . $boucle->modificateur['collate']; |
|
| 753 | + } |
|
| 754 | + |
|
| 755 | + // Pour chaque paramètre du critère |
|
| 756 | + foreach ($crit->param as $tri) { |
|
| 757 | + $order = $fct = ''; |
|
| 758 | + // tris specifiés dynamiquement {par #ENV{tri}} |
|
| 759 | + if ($tri[0]->type != 'texte') { |
|
| 760 | + // calculer le order dynamique qui verifie les champs |
|
| 761 | + $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens); |
|
| 762 | + // ajouter 'hasard' comme possibilité de tri dynamique |
|
| 763 | + calculer_critere_par_hasard($idb, $boucles, $crit); |
|
| 764 | + } |
|
| 765 | + // tris textuels {par titre} |
|
| 766 | + else { |
|
| 767 | + $par = array_shift($tri); |
|
| 768 | + $par = $par->texte; |
|
| 769 | + |
|
| 770 | + // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre} |
|
| 771 | + if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) { |
|
| 772 | + $expression = trim($m[1]); |
|
| 773 | + $champ = trim($m[2]); |
|
| 774 | + if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) { |
|
| 775 | + $order = $f($idb, $boucles, $crit, $tri, $champ); |
|
| 776 | + } else { |
|
| 777 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]]; |
|
| 778 | + } |
|
| 779 | + |
|
| 780 | + // tris de la forme {par champ} ou {par FONCTION(champ)} |
|
| 781 | + } elseif ($boucle->type_requete == 'DATA' or preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) { |
|
| 782 | + // {par FONCTION(champ)} |
|
| 783 | + if (isset($match) and count($match) > 2) { |
|
| 784 | + $par = substr($match[2], 1, -1); |
|
| 785 | + $fct = $match[1]; |
|
| 786 | + } |
|
| 787 | + // quelques cas spécifiques {par hasard}, {par date} |
|
| 788 | + if ($par == 'hasard') { |
|
| 789 | + $order = calculer_critere_par_hasard($idb, $boucles, $crit); |
|
| 790 | + } elseif ($par == 'date' and !empty($boucle->show['date'])) { |
|
| 791 | + $order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'"; |
|
| 792 | + } else { |
|
| 793 | + // cas général {par champ}, {par table.champ}, ... |
|
| 794 | + $order = calculer_critere_par_champ($idb, $boucles, $crit, $par); |
|
| 795 | + } |
|
| 796 | + } |
|
| 797 | + |
|
| 798 | + // on ne sait pas traiter… |
|
| 799 | + else { |
|
| 800 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]]; |
|
| 801 | + } |
|
| 802 | + |
|
| 803 | + // En cas d'erreur de squelette retournée par une fonction |
|
| 804 | + if (is_array($order)) { |
|
| 805 | + return $order; |
|
| 806 | + } |
|
| 807 | + } |
|
| 808 | + |
|
| 809 | + if (preg_match('/^\'([^"]*)\'$/', $order, $m)) { |
|
| 810 | + $t = $m[1]; |
|
| 811 | + if (strpos($t, '.') and !in_array($t, $boucle->select)) { |
|
| 812 | + $boucle->select[] = $t; |
|
| 813 | + } |
|
| 814 | + } else { |
|
| 815 | + $sens = ''; |
|
| 816 | + } |
|
| 817 | + |
|
| 818 | + if ($fct) { |
|
| 819 | + if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) { |
|
| 820 | + $order = "'$fct(" . $r[1] . ")'"; |
|
| 821 | + } else { |
|
| 822 | + $order = "'$fct(' . $order . ')'"; |
|
| 823 | + } |
|
| 824 | + } |
|
| 825 | + $t = $order . $collecte . $sens; |
|
| 826 | + if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) { |
|
| 827 | + $t = $r[1] . $r[2]; |
|
| 828 | + } |
|
| 829 | + |
|
| 830 | + $boucle->order[] = $t; |
|
| 831 | + } |
|
| 832 | 832 | } |
| 833 | 833 | |
| 834 | 834 | /** |
@@ -842,13 +842,13 @@ discard block |
||
| 842 | 842 | * @return string Clause pour le Order by |
| 843 | 843 | */ |
| 844 | 844 | function calculer_critere_par_hasard($idb, &$boucles, $crit) { |
| 845 | - $boucle = &$boucles[$idb]; |
|
| 846 | - // Si ce n'est fait, ajouter un champ 'hasard' dans le select |
|
| 847 | - $parha = 'rand() AS hasard'; |
|
| 848 | - if (!in_array($parha, $boucle->select)) { |
|
| 849 | - $boucle->select[] = $parha; |
|
| 850 | - } |
|
| 851 | - return "'hasard'"; |
|
| 845 | + $boucle = &$boucles[$idb]; |
|
| 846 | + // Si ce n'est fait, ajouter un champ 'hasard' dans le select |
|
| 847 | + $parha = 'rand() AS hasard'; |
|
| 848 | + if (!in_array($parha, $boucle->select)) { |
|
| 849 | + $boucle->select[] = $parha; |
|
| 850 | + } |
|
| 851 | + return "'hasard'"; |
|
| 852 | 852 | } |
| 853 | 853 | |
| 854 | 854 | /** |
@@ -872,24 +872,24 @@ discard block |
||
| 872 | 872 | * @return string|array Clause pour le Order by (array si erreur) |
| 873 | 873 | */ |
| 874 | 874 | function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) { |
| 875 | - $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true); |
|
| 876 | - if (is_array($_champ)) { |
|
| 877 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]]; |
|
| 878 | - } |
|
| 879 | - $boucle = &$boucles[$idb]; |
|
| 880 | - $texte = '0+' . $_champ; |
|
| 881 | - $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent); |
|
| 882 | - if ($suite !== "''") { |
|
| 883 | - $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "'; |
|
| 884 | - } |
|
| 885 | - $asnum = 'num' . ($boucle->order ? count($boucle->order) : ''); |
|
| 886 | - $boucle->select[] = $texte . " AS $asnum"; |
|
| 887 | - |
|
| 888 | - $orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ); |
|
| 889 | - $orderassinum = trim($orderassinum, "'"); |
|
| 890 | - |
|
| 891 | - $order = "'$orderassinum, $asnum'"; |
|
| 892 | - return $order; |
|
| 875 | + $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true); |
|
| 876 | + if (is_array($_champ)) { |
|
| 877 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]]; |
|
| 878 | + } |
|
| 879 | + $boucle = &$boucles[$idb]; |
|
| 880 | + $texte = '0+' . $_champ; |
|
| 881 | + $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent); |
|
| 882 | + if ($suite !== "''") { |
|
| 883 | + $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "'; |
|
| 884 | + } |
|
| 885 | + $asnum = 'num' . ($boucle->order ? count($boucle->order) : ''); |
|
| 886 | + $boucle->select[] = $texte . " AS $asnum"; |
|
| 887 | + |
|
| 888 | + $orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ); |
|
| 889 | + $orderassinum = trim($orderassinum, "'"); |
|
| 890 | + |
|
| 891 | + $order = "'$orderassinum, $asnum'"; |
|
| 892 | + return $order; |
|
| 893 | 893 | } |
| 894 | 894 | |
| 895 | 895 | /** |
@@ -910,35 +910,35 @@ discard block |
||
| 910 | 910 | * @return string|array Clause pour le Order by (array si erreur) |
| 911 | 911 | */ |
| 912 | 912 | function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) { |
| 913 | - $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true); |
|
| 914 | - if (is_array($_champ)) { |
|
| 915 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]]; |
|
| 916 | - } |
|
| 917 | - $boucle = &$boucles[$idb]; |
|
| 918 | - $texte = '0+' . $_champ; |
|
| 919 | - $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent); |
|
| 920 | - if ($suite !== "''") { |
|
| 921 | - $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "'; |
|
| 922 | - } |
|
| 923 | - |
|
| 924 | - $as = false; |
|
| 925 | - $select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS "; |
|
| 926 | - foreach ($boucle->select as $s) { |
|
| 927 | - if (strpos($s, $select) === 0) { |
|
| 928 | - $as = trim(substr($s, strlen($select))); |
|
| 929 | - if (!preg_match(',\W,', $as)) { |
|
| 930 | - break; |
|
| 931 | - } |
|
| 932 | - $as = false; |
|
| 933 | - } |
|
| 934 | - } |
|
| 935 | - |
|
| 936 | - if (!$as) { |
|
| 937 | - $as = 'sinum' . ($boucle->order ? count($boucle->order) : ''); |
|
| 938 | - $boucle->select[] = $select . $as; |
|
| 939 | - } |
|
| 940 | - $order = "'$as'"; |
|
| 941 | - return $order; |
|
| 913 | + $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true); |
|
| 914 | + if (is_array($_champ)) { |
|
| 915 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]]; |
|
| 916 | + } |
|
| 917 | + $boucle = &$boucles[$idb]; |
|
| 918 | + $texte = '0+' . $_champ; |
|
| 919 | + $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent); |
|
| 920 | + if ($suite !== "''") { |
|
| 921 | + $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "'; |
|
| 922 | + } |
|
| 923 | + |
|
| 924 | + $as = false; |
|
| 925 | + $select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS "; |
|
| 926 | + foreach ($boucle->select as $s) { |
|
| 927 | + if (strpos($s, $select) === 0) { |
|
| 928 | + $as = trim(substr($s, strlen($select))); |
|
| 929 | + if (!preg_match(',\W,', $as)) { |
|
| 930 | + break; |
|
| 931 | + } |
|
| 932 | + $as = false; |
|
| 933 | + } |
|
| 934 | + } |
|
| 935 | + |
|
| 936 | + if (!$as) { |
|
| 937 | + $as = 'sinum' . ($boucle->order ? count($boucle->order) : ''); |
|
| 938 | + $boucle->select[] = $select . $as; |
|
| 939 | + } |
|
| 940 | + $order = "'$as'"; |
|
| 941 | + return $order; |
|
| 942 | 942 | } |
| 943 | 943 | |
| 944 | 944 | |
@@ -958,14 +958,14 @@ discard block |
||
| 958 | 958 | * @return string|array Clause pour le Order by (array si erreur) |
| 959 | 959 | */ |
| 960 | 960 | function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) { |
| 961 | - $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true); |
|
| 962 | - if (is_array($_champ)) { |
|
| 963 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]]; |
|
| 964 | - } |
|
| 965 | - $boucle = &$boucles[$idb]; |
|
| 966 | - $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\""; |
|
| 967 | - $order = "'multi'"; |
|
| 968 | - return $order; |
|
| 961 | + $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true); |
|
| 962 | + if (is_array($_champ)) { |
|
| 963 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]]; |
|
| 964 | + } |
|
| 965 | + $boucle = &$boucles[$idb]; |
|
| 966 | + $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\""; |
|
| 967 | + $order = "'multi'"; |
|
| 968 | + return $order; |
|
| 969 | 969 | } |
| 970 | 970 | |
| 971 | 971 | /** |
@@ -984,56 +984,56 @@ discard block |
||
| 984 | 984 | * @return array|string |
| 985 | 985 | */ |
| 986 | 986 | function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) { |
| 987 | - $boucle = &$boucles[$idb]; |
|
| 988 | - $desc = $boucle->show; |
|
| 989 | - |
|
| 990 | - // le champ existe dans la table, pas de souci (le plus commun) |
|
| 991 | - if (isset($desc['field'][$par])) { |
|
| 992 | - $par = $boucle->id_table . '.' . $par; |
|
| 993 | - } |
|
| 994 | - // le champ est peut être une jointure |
|
| 995 | - else { |
|
| 996 | - $table = $table_alias = false; // toutes les tables de jointure possibles |
|
| 997 | - $champ = $par; |
|
| 998 | - |
|
| 999 | - // le champ demandé est une exception de jointure {par titre_mot} |
|
| 1000 | - if (isset($GLOBALS['exceptions_des_jointures'][$par])) { |
|
| 1001 | - [$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par]; |
|
| 1002 | - } // la table de jointure est explicitement indiquée {par truc.muche} |
|
| 1003 | - elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) { |
|
| 1004 | - [, $table, $champ] = $r; |
|
| 1005 | - $table_alias = $table; // c'est peut-être un alias de table {par L1.titre} |
|
| 1006 | - $table = table_objet_sql($table); |
|
| 1007 | - } |
|
| 1008 | - |
|
| 1009 | - // Si on connait la table d'arrivée, on la demande donc explicitement |
|
| 1010 | - // Sinon on cherche le champ dans les tables possibles de jointures |
|
| 1011 | - // Si la table est déjà dans le from, on la réutilise. |
|
| 1012 | - if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) { |
|
| 1013 | - $par = $infos['alias'] . '.' . $champ; |
|
| 1014 | - } elseif ( |
|
| 1015 | - $boucle->jointures_explicites |
|
| 1016 | - and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table) |
|
| 1017 | - ) { |
|
| 1018 | - $par = $alias . '.' . $champ; |
|
| 1019 | - } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) { |
|
| 1020 | - $par = $alias . '.' . $champ; |
|
| 1021 | - // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même) |
|
| 1022 | - } elseif ( |
|
| 1023 | - $table_alias |
|
| 1024 | - and isset($boucle->from[$table_alias]) |
|
| 1025 | - and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias]) |
|
| 1026 | - ) { |
|
| 1027 | - $par = $infos['alias'] . '.' . $champ; |
|
| 1028 | - } elseif ($table) { |
|
| 1029 | - // On avait table + champ, mais on ne les a pas trouvés |
|
| 1030 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]]; |
|
| 1031 | - } else { |
|
| 1032 | - // Sinon tant pis, ca doit etre un champ synthetise (cf points) |
|
| 1033 | - } |
|
| 1034 | - } |
|
| 1035 | - |
|
| 1036 | - return $raw ? $par : "'$par'"; |
|
| 987 | + $boucle = &$boucles[$idb]; |
|
| 988 | + $desc = $boucle->show; |
|
| 989 | + |
|
| 990 | + // le champ existe dans la table, pas de souci (le plus commun) |
|
| 991 | + if (isset($desc['field'][$par])) { |
|
| 992 | + $par = $boucle->id_table . '.' . $par; |
|
| 993 | + } |
|
| 994 | + // le champ est peut être une jointure |
|
| 995 | + else { |
|
| 996 | + $table = $table_alias = false; // toutes les tables de jointure possibles |
|
| 997 | + $champ = $par; |
|
| 998 | + |
|
| 999 | + // le champ demandé est une exception de jointure {par titre_mot} |
|
| 1000 | + if (isset($GLOBALS['exceptions_des_jointures'][$par])) { |
|
| 1001 | + [$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par]; |
|
| 1002 | + } // la table de jointure est explicitement indiquée {par truc.muche} |
|
| 1003 | + elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) { |
|
| 1004 | + [, $table, $champ] = $r; |
|
| 1005 | + $table_alias = $table; // c'est peut-être un alias de table {par L1.titre} |
|
| 1006 | + $table = table_objet_sql($table); |
|
| 1007 | + } |
|
| 1008 | + |
|
| 1009 | + // Si on connait la table d'arrivée, on la demande donc explicitement |
|
| 1010 | + // Sinon on cherche le champ dans les tables possibles de jointures |
|
| 1011 | + // Si la table est déjà dans le from, on la réutilise. |
|
| 1012 | + if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) { |
|
| 1013 | + $par = $infos['alias'] . '.' . $champ; |
|
| 1014 | + } elseif ( |
|
| 1015 | + $boucle->jointures_explicites |
|
| 1016 | + and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table) |
|
| 1017 | + ) { |
|
| 1018 | + $par = $alias . '.' . $champ; |
|
| 1019 | + } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) { |
|
| 1020 | + $par = $alias . '.' . $champ; |
|
| 1021 | + // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même) |
|
| 1022 | + } elseif ( |
|
| 1023 | + $table_alias |
|
| 1024 | + and isset($boucle->from[$table_alias]) |
|
| 1025 | + and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias]) |
|
| 1026 | + ) { |
|
| 1027 | + $par = $infos['alias'] . '.' . $champ; |
|
| 1028 | + } elseif ($table) { |
|
| 1029 | + // On avait table + champ, mais on ne les a pas trouvés |
|
| 1030 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]]; |
|
| 1031 | + } else { |
|
| 1032 | + // Sinon tant pis, ca doit etre un champ synthetise (cf points) |
|
| 1033 | + } |
|
| 1034 | + } |
|
| 1035 | + |
|
| 1036 | + return $raw ? $par : "'$par'"; |
|
| 1037 | 1037 | } |
| 1038 | 1038 | |
| 1039 | 1039 | /** |
@@ -1047,11 +1047,11 @@ discard block |
||
| 1047 | 1047 | * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide. |
| 1048 | 1048 | */ |
| 1049 | 1049 | function critere_par_joint($table, $champ, &$boucle) { |
| 1050 | - $t = array_search($table, $boucle->from); |
|
| 1051 | - if (!$t) { |
|
| 1052 | - $t = trouver_jointure_champ($champ, $boucle); |
|
| 1053 | - } |
|
| 1054 | - return !$t ? '' : ("'" . $t . '.' . $champ . "'"); |
|
| 1050 | + $t = array_search($table, $boucle->from); |
|
| 1051 | + if (!$t) { |
|
| 1052 | + $t = trouver_jointure_champ($champ, $boucle); |
|
| 1053 | + } |
|
| 1054 | + return !$t ? '' : ("'" . $t . '.' . $champ . "'"); |
|
| 1055 | 1055 | } |
| 1056 | 1056 | |
| 1057 | 1057 | /** |
@@ -1076,33 +1076,33 @@ discard block |
||
| 1076 | 1076 | */ |
| 1077 | 1077 | function critere_inverse_dist($idb, &$boucles, $crit) { |
| 1078 | 1078 | |
| 1079 | - $boucle = &$boucles[$idb]; |
|
| 1080 | - // Classement par ordre inverse |
|
| 1081 | - if ($crit->not) { |
|
| 1082 | - critere_parinverse($idb, $boucles, $crit); |
|
| 1083 | - } else { |
|
| 1084 | - $order = "' DESC'"; |
|
| 1085 | - // Classement par ordre inverse fonction eventuelle de #ENV{...} |
|
| 1086 | - if (isset($crit->param[0])) { |
|
| 1087 | - $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 1088 | - $order = "(($critere)?' DESC':'')"; |
|
| 1089 | - } |
|
| 1090 | - |
|
| 1091 | - $n = is_countable($boucle->order) ? count($boucle->order) : 0; |
|
| 1092 | - if (!$n) { |
|
| 1093 | - if (isset($boucle->default_order[0])) { |
|
| 1094 | - $boucle->default_order[0] .= ' . " DESC"'; |
|
| 1095 | - } else { |
|
| 1096 | - $boucle->default_order[] = ' DESC'; |
|
| 1097 | - } |
|
| 1098 | - } else { |
|
| 1099 | - $t = $boucle->order[$n - 1] . " . $order"; |
|
| 1100 | - if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) { |
|
| 1101 | - $t = $r[1] . $r[2]; |
|
| 1102 | - } |
|
| 1103 | - $boucle->order[$n - 1] = $t; |
|
| 1104 | - } |
|
| 1105 | - } |
|
| 1079 | + $boucle = &$boucles[$idb]; |
|
| 1080 | + // Classement par ordre inverse |
|
| 1081 | + if ($crit->not) { |
|
| 1082 | + critere_parinverse($idb, $boucles, $crit); |
|
| 1083 | + } else { |
|
| 1084 | + $order = "' DESC'"; |
|
| 1085 | + // Classement par ordre inverse fonction eventuelle de #ENV{...} |
|
| 1086 | + if (isset($crit->param[0])) { |
|
| 1087 | + $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 1088 | + $order = "(($critere)?' DESC':'')"; |
|
| 1089 | + } |
|
| 1090 | + |
|
| 1091 | + $n = is_countable($boucle->order) ? count($boucle->order) : 0; |
|
| 1092 | + if (!$n) { |
|
| 1093 | + if (isset($boucle->default_order[0])) { |
|
| 1094 | + $boucle->default_order[0] .= ' . " DESC"'; |
|
| 1095 | + } else { |
|
| 1096 | + $boucle->default_order[] = ' DESC'; |
|
| 1097 | + } |
|
| 1098 | + } else { |
|
| 1099 | + $t = $boucle->order[$n - 1] . " . $order"; |
|
| 1100 | + if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) { |
|
| 1101 | + $t = $r[1] . $r[2]; |
|
| 1102 | + } |
|
| 1103 | + $boucle->order[$n - 1] = $t; |
|
| 1104 | + } |
|
| 1105 | + } |
|
| 1106 | 1106 | } |
| 1107 | 1107 | |
| 1108 | 1108 | /** |
@@ -1113,137 +1113,137 @@ discard block |
||
| 1113 | 1113 | * @return void|array |
| 1114 | 1114 | */ |
| 1115 | 1115 | function critere_par_ordre_liste_dist($idb, &$boucles, $crit) { |
| 1116 | - $boucle = &$boucles[$idb]; |
|
| 1116 | + $boucle = &$boucles[$idb]; |
|
| 1117 | 1117 | |
| 1118 | - $sens = $collecte = ''; |
|
| 1119 | - if ($crit->not) { |
|
| 1120 | - $sens = " . ' DESC'"; |
|
| 1121 | - } |
|
| 1118 | + $sens = $collecte = ''; |
|
| 1119 | + if ($crit->not) { |
|
| 1120 | + $sens = " . ' DESC'"; |
|
| 1121 | + } |
|
| 1122 | 1122 | |
| 1123 | - $crit2 = clone $crit; |
|
| 1124 | - $crit2->not = false; |
|
| 1125 | - $crit2->param = [reset($crit->param)]; |
|
| 1126 | - $res = critere_parinverse($idb, $boucles, $crit2); |
|
| 1123 | + $crit2 = clone $crit; |
|
| 1124 | + $crit2->not = false; |
|
| 1125 | + $crit2->param = [reset($crit->param)]; |
|
| 1126 | + $res = critere_parinverse($idb, $boucles, $crit2); |
|
| 1127 | 1127 | |
| 1128 | - // erreur ? |
|
| 1129 | - if (is_array($res)) { |
|
| 1130 | - return $res; |
|
| 1131 | - } |
|
| 1128 | + // erreur ? |
|
| 1129 | + if (is_array($res)) { |
|
| 1130 | + return $res; |
|
| 1131 | + } |
|
| 1132 | 1132 | |
| 1133 | - $_order = array_pop($boucle->order); |
|
| 1133 | + $_order = array_pop($boucle->order); |
|
| 1134 | 1134 | |
| 1135 | - $_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent); |
|
| 1136 | - $boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens"; |
|
| 1135 | + $_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent); |
|
| 1136 | + $boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens"; |
|
| 1137 | 1137 | } |
| 1138 | 1138 | |
| 1139 | 1139 | |
| 1140 | 1140 | function critere_agenda_dist($idb, &$boucles, $crit) { |
| 1141 | - $params = $crit->param; |
|
| 1142 | - |
|
| 1143 | - if ((is_countable($params) ? count($params) : 0) < 1) { |
|
| 1144 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]; |
|
| 1145 | - } |
|
| 1146 | - |
|
| 1147 | - $boucle = &$boucles[$idb]; |
|
| 1148 | - $parent = $boucle->id_parent; |
|
| 1149 | - $fields = $boucle->show['field']; |
|
| 1150 | - |
|
| 1151 | - $date = array_shift($params); |
|
| 1152 | - $type = array_shift($params); |
|
| 1153 | - |
|
| 1154 | - // la valeur $type doit etre connue a la compilation |
|
| 1155 | - // donc etre forcement reduite a un litteral unique dans le source |
|
| 1156 | - $type = is_object($type[0]) ? $type[0]->texte : null; |
|
| 1157 | - |
|
| 1158 | - // La valeur date doit designer un champ de la table SQL. |
|
| 1159 | - // Si c'est un litteral unique dans le source, verifier a la compil, |
|
| 1160 | - // sinon synthetiser le test de verif pour execution ulterieure |
|
| 1161 | - // On prendra arbitrairement le premier champ si test negatif. |
|
| 1162 | - if (((is_countable($date) ? count($date) : 0) == 1) and ($date[0]->type == 'texte')) { |
|
| 1163 | - $date = $date[0]->texte; |
|
| 1164 | - if (!isset($fields[$date])) { |
|
| 1165 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]]; |
|
| 1166 | - } |
|
| 1167 | - } else { |
|
| 1168 | - $a = calculer_liste($date, $idb, $boucles, $parent); |
|
| 1169 | - $noms = array_keys($fields); |
|
| 1170 | - $defaut = $noms[0]; |
|
| 1171 | - $noms = join(' ', $noms); |
|
| 1172 | - # bien laisser 2 espaces avant $nom pour que strpos<>0 |
|
| 1173 | - $cond = "(\$a=strval($a))AND\nstrpos(\" $noms \",\" \$a \")"; |
|
| 1174 | - $date = "'.(($cond)\n?\$a:\"$defaut\").'"; |
|
| 1175 | - } |
|
| 1176 | - $annee = $params ? array_shift($params) : ''; |
|
| 1177 | - $annee = "\n" . 'sprintf("%04d", ($x = ' . |
|
| 1178 | - calculer_liste($annee, $idb, $boucles, $parent) . |
|
| 1179 | - ') ? $x : date("Y"))'; |
|
| 1180 | - |
|
| 1181 | - $mois = $params ? array_shift($params) : ''; |
|
| 1182 | - $mois = "\n" . 'sprintf("%02d", ($x = ' . |
|
| 1183 | - calculer_liste($mois, $idb, $boucles, $parent) . |
|
| 1184 | - ') ? $x : date("m"))'; |
|
| 1185 | - |
|
| 1186 | - $jour = $params ? array_shift($params) : ''; |
|
| 1187 | - $jour = "\n" . 'sprintf("%02d", ($x = ' . |
|
| 1188 | - calculer_liste($jour, $idb, $boucles, $parent) . |
|
| 1189 | - ') ? $x : date("d"))'; |
|
| 1190 | - |
|
| 1191 | - $annee2 = $params ? array_shift($params) : ''; |
|
| 1192 | - $annee2 = "\n" . 'sprintf("%04d", ($x = ' . |
|
| 1193 | - calculer_liste($annee2, $idb, $boucles, $parent) . |
|
| 1194 | - ') ? $x : date("Y"))'; |
|
| 1195 | - |
|
| 1196 | - $mois2 = $params ? array_shift($params) : ''; |
|
| 1197 | - $mois2 = "\n" . 'sprintf("%02d", ($x = ' . |
|
| 1198 | - calculer_liste($mois2, $idb, $boucles, $parent) . |
|
| 1199 | - ') ? $x : date("m"))'; |
|
| 1200 | - |
|
| 1201 | - $jour2 = $params ? array_shift($params) : ''; |
|
| 1202 | - $jour2 = "\n" . 'sprintf("%02d", ($x = ' . |
|
| 1203 | - calculer_liste($jour2, $idb, $boucles, $parent) . |
|
| 1204 | - ') ? $x : date("d"))'; |
|
| 1205 | - |
|
| 1206 | - $date = $boucle->id_table . ".$date"; |
|
| 1207 | - |
|
| 1208 | - $quote_end = ",'" . $boucle->sql_serveur . "','text'"; |
|
| 1209 | - if ($type == 'jour') { |
|
| 1210 | - $boucle->where[] = [ |
|
| 1211 | - "'='", |
|
| 1212 | - "'DATE_FORMAT($date, \'%Y%m%d\')'", |
|
| 1213 | - ("sql_quote($annee . $mois . $jour$quote_end)") |
|
| 1214 | - ]; |
|
| 1215 | - } elseif ($type == 'mois') { |
|
| 1216 | - $boucle->where[] = [ |
|
| 1217 | - "'='", |
|
| 1218 | - "'DATE_FORMAT($date, \'%Y%m\')'", |
|
| 1219 | - ("sql_quote($annee . $mois$quote_end)") |
|
| 1220 | - ]; |
|
| 1221 | - } elseif ($type == 'semaine') { |
|
| 1222 | - $boucle->where[] = [ |
|
| 1223 | - "'AND'", |
|
| 1224 | - [ |
|
| 1225 | - "'>='", |
|
| 1226 | - "'DATE_FORMAT($date, \'%Y%m%d\')'", |
|
| 1227 | - ("date_debut_semaine($annee, $mois, $jour)") |
|
| 1228 | - ], |
|
| 1229 | - [ |
|
| 1230 | - "'<='", |
|
| 1231 | - "'DATE_FORMAT($date, \'%Y%m%d\')'", |
|
| 1232 | - ("date_fin_semaine($annee, $mois, $jour)") |
|
| 1233 | - ] |
|
| 1234 | - ]; |
|
| 1235 | - } elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) { |
|
| 1236 | - $boucle->where[] = [ |
|
| 1237 | - "'AND'", |
|
| 1238 | - [ |
|
| 1239 | - "'>='", |
|
| 1240 | - "'DATE_FORMAT($date, \'%Y%m%d\')'", |
|
| 1241 | - ("sql_quote($annee . $mois . $jour$quote_end)") |
|
| 1242 | - ], |
|
| 1243 | - ["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")] |
|
| 1244 | - ]; |
|
| 1245 | - } |
|
| 1246 | - // sinon on prend tout |
|
| 1141 | + $params = $crit->param; |
|
| 1142 | + |
|
| 1143 | + if ((is_countable($params) ? count($params) : 0) < 1) { |
|
| 1144 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]; |
|
| 1145 | + } |
|
| 1146 | + |
|
| 1147 | + $boucle = &$boucles[$idb]; |
|
| 1148 | + $parent = $boucle->id_parent; |
|
| 1149 | + $fields = $boucle->show['field']; |
|
| 1150 | + |
|
| 1151 | + $date = array_shift($params); |
|
| 1152 | + $type = array_shift($params); |
|
| 1153 | + |
|
| 1154 | + // la valeur $type doit etre connue a la compilation |
|
| 1155 | + // donc etre forcement reduite a un litteral unique dans le source |
|
| 1156 | + $type = is_object($type[0]) ? $type[0]->texte : null; |
|
| 1157 | + |
|
| 1158 | + // La valeur date doit designer un champ de la table SQL. |
|
| 1159 | + // Si c'est un litteral unique dans le source, verifier a la compil, |
|
| 1160 | + // sinon synthetiser le test de verif pour execution ulterieure |
|
| 1161 | + // On prendra arbitrairement le premier champ si test negatif. |
|
| 1162 | + if (((is_countable($date) ? count($date) : 0) == 1) and ($date[0]->type == 'texte')) { |
|
| 1163 | + $date = $date[0]->texte; |
|
| 1164 | + if (!isset($fields[$date])) { |
|
| 1165 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]]; |
|
| 1166 | + } |
|
| 1167 | + } else { |
|
| 1168 | + $a = calculer_liste($date, $idb, $boucles, $parent); |
|
| 1169 | + $noms = array_keys($fields); |
|
| 1170 | + $defaut = $noms[0]; |
|
| 1171 | + $noms = join(' ', $noms); |
|
| 1172 | + # bien laisser 2 espaces avant $nom pour que strpos<>0 |
|
| 1173 | + $cond = "(\$a=strval($a))AND\nstrpos(\" $noms \",\" \$a \")"; |
|
| 1174 | + $date = "'.(($cond)\n?\$a:\"$defaut\").'"; |
|
| 1175 | + } |
|
| 1176 | + $annee = $params ? array_shift($params) : ''; |
|
| 1177 | + $annee = "\n" . 'sprintf("%04d", ($x = ' . |
|
| 1178 | + calculer_liste($annee, $idb, $boucles, $parent) . |
|
| 1179 | + ') ? $x : date("Y"))'; |
|
| 1180 | + |
|
| 1181 | + $mois = $params ? array_shift($params) : ''; |
|
| 1182 | + $mois = "\n" . 'sprintf("%02d", ($x = ' . |
|
| 1183 | + calculer_liste($mois, $idb, $boucles, $parent) . |
|
| 1184 | + ') ? $x : date("m"))'; |
|
| 1185 | + |
|
| 1186 | + $jour = $params ? array_shift($params) : ''; |
|
| 1187 | + $jour = "\n" . 'sprintf("%02d", ($x = ' . |
|
| 1188 | + calculer_liste($jour, $idb, $boucles, $parent) . |
|
| 1189 | + ') ? $x : date("d"))'; |
|
| 1190 | + |
|
| 1191 | + $annee2 = $params ? array_shift($params) : ''; |
|
| 1192 | + $annee2 = "\n" . 'sprintf("%04d", ($x = ' . |
|
| 1193 | + calculer_liste($annee2, $idb, $boucles, $parent) . |
|
| 1194 | + ') ? $x : date("Y"))'; |
|
| 1195 | + |
|
| 1196 | + $mois2 = $params ? array_shift($params) : ''; |
|
| 1197 | + $mois2 = "\n" . 'sprintf("%02d", ($x = ' . |
|
| 1198 | + calculer_liste($mois2, $idb, $boucles, $parent) . |
|
| 1199 | + ') ? $x : date("m"))'; |
|
| 1200 | + |
|
| 1201 | + $jour2 = $params ? array_shift($params) : ''; |
|
| 1202 | + $jour2 = "\n" . 'sprintf("%02d", ($x = ' . |
|
| 1203 | + calculer_liste($jour2, $idb, $boucles, $parent) . |
|
| 1204 | + ') ? $x : date("d"))'; |
|
| 1205 | + |
|
| 1206 | + $date = $boucle->id_table . ".$date"; |
|
| 1207 | + |
|
| 1208 | + $quote_end = ",'" . $boucle->sql_serveur . "','text'"; |
|
| 1209 | + if ($type == 'jour') { |
|
| 1210 | + $boucle->where[] = [ |
|
| 1211 | + "'='", |
|
| 1212 | + "'DATE_FORMAT($date, \'%Y%m%d\')'", |
|
| 1213 | + ("sql_quote($annee . $mois . $jour$quote_end)") |
|
| 1214 | + ]; |
|
| 1215 | + } elseif ($type == 'mois') { |
|
| 1216 | + $boucle->where[] = [ |
|
| 1217 | + "'='", |
|
| 1218 | + "'DATE_FORMAT($date, \'%Y%m\')'", |
|
| 1219 | + ("sql_quote($annee . $mois$quote_end)") |
|
| 1220 | + ]; |
|
| 1221 | + } elseif ($type == 'semaine') { |
|
| 1222 | + $boucle->where[] = [ |
|
| 1223 | + "'AND'", |
|
| 1224 | + [ |
|
| 1225 | + "'>='", |
|
| 1226 | + "'DATE_FORMAT($date, \'%Y%m%d\')'", |
|
| 1227 | + ("date_debut_semaine($annee, $mois, $jour)") |
|
| 1228 | + ], |
|
| 1229 | + [ |
|
| 1230 | + "'<='", |
|
| 1231 | + "'DATE_FORMAT($date, \'%Y%m%d\')'", |
|
| 1232 | + ("date_fin_semaine($annee, $mois, $jour)") |
|
| 1233 | + ] |
|
| 1234 | + ]; |
|
| 1235 | + } elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) { |
|
| 1236 | + $boucle->where[] = [ |
|
| 1237 | + "'AND'", |
|
| 1238 | + [ |
|
| 1239 | + "'>='", |
|
| 1240 | + "'DATE_FORMAT($date, \'%Y%m%d\')'", |
|
| 1241 | + ("sql_quote($annee . $mois . $jour$quote_end)") |
|
| 1242 | + ], |
|
| 1243 | + ["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")] |
|
| 1244 | + ]; |
|
| 1245 | + } |
|
| 1246 | + // sinon on prend tout |
|
| 1247 | 1247 | } |
| 1248 | 1248 | |
| 1249 | 1249 | |
@@ -1268,33 +1268,33 @@ discard block |
||
| 1268 | 1268 | * @return void |
| 1269 | 1269 | **/ |
| 1270 | 1270 | function calculer_critere_parties($idb, &$boucles, $crit) { |
| 1271 | - $boucle = &$boucles[$idb]; |
|
| 1272 | - $a1 = $crit->param[0]; |
|
| 1273 | - $a2 = $crit->param[1]; |
|
| 1274 | - $op = $crit->op; |
|
| 1275 | - |
|
| 1276 | - [$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1); |
|
| 1277 | - [$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2); |
|
| 1278 | - |
|
| 1279 | - if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) { |
|
| 1280 | - $boucle->limit = $a11 . ',' . $a21; |
|
| 1281 | - } else { |
|
| 1282 | - // 3 dans {1/3}, {2,3} ou {1,n-3} |
|
| 1283 | - $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22; |
|
| 1284 | - // 2 dans {2/3}, {2,5}, {n-2,1} |
|
| 1285 | - $partie = ($a11 != 'n') ? $a11 : $a12; |
|
| 1286 | - $mode = (($op == '/') ? '/' : |
|
| 1287 | - (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+')); |
|
| 1288 | - // cas simple {0,#ENV{truc}} compilons le en LIMIT : |
|
| 1289 | - if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') { |
|
| 1290 | - $boucle->limit = |
|
| 1291 | - (is_numeric($a11) ? "'$a11'" : $a11) |
|
| 1292 | - . ".','." |
|
| 1293 | - . (is_numeric($a21) ? "'$a21'" : $a21); |
|
| 1294 | - } else { |
|
| 1295 | - calculer_parties($boucles, $idb, $partie, $mode); |
|
| 1296 | - } |
|
| 1297 | - } |
|
| 1271 | + $boucle = &$boucles[$idb]; |
|
| 1272 | + $a1 = $crit->param[0]; |
|
| 1273 | + $a2 = $crit->param[1]; |
|
| 1274 | + $op = $crit->op; |
|
| 1275 | + |
|
| 1276 | + [$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1); |
|
| 1277 | + [$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2); |
|
| 1278 | + |
|
| 1279 | + if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) { |
|
| 1280 | + $boucle->limit = $a11 . ',' . $a21; |
|
| 1281 | + } else { |
|
| 1282 | + // 3 dans {1/3}, {2,3} ou {1,n-3} |
|
| 1283 | + $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22; |
|
| 1284 | + // 2 dans {2/3}, {2,5}, {n-2,1} |
|
| 1285 | + $partie = ($a11 != 'n') ? $a11 : $a12; |
|
| 1286 | + $mode = (($op == '/') ? '/' : |
|
| 1287 | + (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+')); |
|
| 1288 | + // cas simple {0,#ENV{truc}} compilons le en LIMIT : |
|
| 1289 | + if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') { |
|
| 1290 | + $boucle->limit = |
|
| 1291 | + (is_numeric($a11) ? "'$a11'" : $a11) |
|
| 1292 | + . ".','." |
|
| 1293 | + . (is_numeric($a21) ? "'$a21'" : $a21); |
|
| 1294 | + } else { |
|
| 1295 | + calculer_parties($boucles, $idb, $partie, $mode); |
|
| 1296 | + } |
|
| 1297 | + } |
|
| 1298 | 1298 | } |
| 1299 | 1299 | |
| 1300 | 1300 | /** |
@@ -1322,63 +1322,63 @@ discard block |
||
| 1322 | 1322 | * @return void |
| 1323 | 1323 | **/ |
| 1324 | 1324 | function calculer_parties(&$boucles, $id_boucle, $debut, $mode) { |
| 1325 | - $total_parties = $boucles[$id_boucle]->total_parties; |
|
| 1326 | - |
|
| 1327 | - preg_match(',([+-/p])([+-/])?,', $mode, $regs); |
|
| 1328 | - [, $op1, $op2] = array_pad($regs, 3, null); |
|
| 1329 | - $nombre_boucle = "\$Numrows['$id_boucle']['total']"; |
|
| 1330 | - // {1/3} |
|
| 1331 | - if ($op1 == '/') { |
|
| 1332 | - $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)"; |
|
| 1333 | - $totpos = is_numeric($total_parties) ? ($total_parties) : |
|
| 1334 | - "($total_parties ? $total_parties : 1)"; |
|
| 1335 | - $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1"; |
|
| 1336 | - $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);"; |
|
| 1337 | - } else { |
|
| 1338 | - // cas {n-1,x} |
|
| 1339 | - if ($op1 == '-') { |
|
| 1340 | - $debut = "$nombre_boucle - $debut;"; |
|
| 1341 | - } |
|
| 1342 | - |
|
| 1343 | - // cas {x,n-1} |
|
| 1344 | - if ($op2 == '-') { |
|
| 1345 | - $fin = '$debut_boucle + ' . $nombre_boucle . ' - ' |
|
| 1346 | - . (is_numeric($total_parties) ? ($total_parties + 1) : |
|
| 1347 | - ($total_parties . ' - 1')); |
|
| 1348 | - } else { |
|
| 1349 | - // {x,1} ou {pagination} |
|
| 1350 | - $fin = '$debut_boucle' |
|
| 1351 | - . (is_numeric($total_parties) ? |
|
| 1352 | - (($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) : |
|
| 1353 | - ('+' . $total_parties . ' - 1')); |
|
| 1354 | - } |
|
| 1355 | - |
|
| 1356 | - // {pagination}, gerer le debut_xx=-1 pour tout voir |
|
| 1357 | - if ($op1 == 'p') { |
|
| 1358 | - $debut .= ";\n \$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))"; |
|
| 1359 | - $debut .= ";\n \$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))"; |
|
| 1360 | - $fin = "(\$tout ? $nombre_boucle : $fin)"; |
|
| 1361 | - } |
|
| 1362 | - } |
|
| 1363 | - |
|
| 1364 | - // Notes : |
|
| 1365 | - // $debut_boucle et $fin_boucle sont les indices SQL du premier |
|
| 1366 | - // et du dernier demandes dans la boucle : 0 pour le premier, |
|
| 1367 | - // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin |
|
| 1368 | - // Utiliser min pour rabattre $fin_boucle sur total_boucle. |
|
| 1369 | - |
|
| 1370 | - $boucles[$id_boucle]->mode_partie = "\n\t" |
|
| 1371 | - . '$debut_boucle = ' . $debut . ";\n " |
|
| 1372 | - . "\$debut_boucle = intval(\$debut_boucle);\n " |
|
| 1373 | - . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n " |
|
| 1374 | - . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n " |
|
| 1375 | - . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);' |
|
| 1376 | - . "\n\tif (\$debut_boucle>0" |
|
| 1377 | - . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']" |
|
| 1378 | - . " AND \$iter->seek(\$debut_boucle,'continue'))" |
|
| 1379 | - . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t"; |
|
| 1380 | - |
|
| 1381 | - $boucles[$id_boucle]->partie = " |
|
| 1325 | + $total_parties = $boucles[$id_boucle]->total_parties; |
|
| 1326 | + |
|
| 1327 | + preg_match(',([+-/p])([+-/])?,', $mode, $regs); |
|
| 1328 | + [, $op1, $op2] = array_pad($regs, 3, null); |
|
| 1329 | + $nombre_boucle = "\$Numrows['$id_boucle']['total']"; |
|
| 1330 | + // {1/3} |
|
| 1331 | + if ($op1 == '/') { |
|
| 1332 | + $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)"; |
|
| 1333 | + $totpos = is_numeric($total_parties) ? ($total_parties) : |
|
| 1334 | + "($total_parties ? $total_parties : 1)"; |
|
| 1335 | + $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1"; |
|
| 1336 | + $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);"; |
|
| 1337 | + } else { |
|
| 1338 | + // cas {n-1,x} |
|
| 1339 | + if ($op1 == '-') { |
|
| 1340 | + $debut = "$nombre_boucle - $debut;"; |
|
| 1341 | + } |
|
| 1342 | + |
|
| 1343 | + // cas {x,n-1} |
|
| 1344 | + if ($op2 == '-') { |
|
| 1345 | + $fin = '$debut_boucle + ' . $nombre_boucle . ' - ' |
|
| 1346 | + . (is_numeric($total_parties) ? ($total_parties + 1) : |
|
| 1347 | + ($total_parties . ' - 1')); |
|
| 1348 | + } else { |
|
| 1349 | + // {x,1} ou {pagination} |
|
| 1350 | + $fin = '$debut_boucle' |
|
| 1351 | + . (is_numeric($total_parties) ? |
|
| 1352 | + (($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) : |
|
| 1353 | + ('+' . $total_parties . ' - 1')); |
|
| 1354 | + } |
|
| 1355 | + |
|
| 1356 | + // {pagination}, gerer le debut_xx=-1 pour tout voir |
|
| 1357 | + if ($op1 == 'p') { |
|
| 1358 | + $debut .= ";\n \$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))"; |
|
| 1359 | + $debut .= ";\n \$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))"; |
|
| 1360 | + $fin = "(\$tout ? $nombre_boucle : $fin)"; |
|
| 1361 | + } |
|
| 1362 | + } |
|
| 1363 | + |
|
| 1364 | + // Notes : |
|
| 1365 | + // $debut_boucle et $fin_boucle sont les indices SQL du premier |
|
| 1366 | + // et du dernier demandes dans la boucle : 0 pour le premier, |
|
| 1367 | + // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin |
|
| 1368 | + // Utiliser min pour rabattre $fin_boucle sur total_boucle. |
|
| 1369 | + |
|
| 1370 | + $boucles[$id_boucle]->mode_partie = "\n\t" |
|
| 1371 | + . '$debut_boucle = ' . $debut . ";\n " |
|
| 1372 | + . "\$debut_boucle = intval(\$debut_boucle);\n " |
|
| 1373 | + . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n " |
|
| 1374 | + . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n " |
|
| 1375 | + . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);' |
|
| 1376 | + . "\n\tif (\$debut_boucle>0" |
|
| 1377 | + . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']" |
|
| 1378 | + . " AND \$iter->seek(\$debut_boucle,'continue'))" |
|
| 1379 | + . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t"; |
|
| 1380 | + |
|
| 1381 | + $boucles[$id_boucle]->partie = " |
|
| 1382 | 1382 | if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue; |
| 1383 | 1383 | if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;"; |
| 1384 | 1384 | } |
@@ -1395,26 +1395,26 @@ discard block |
||
| 1395 | 1395 | * @return array Valeur de l'élément (peut être une expression PHP), Nombre soustrait |
| 1396 | 1396 | **/ |
| 1397 | 1397 | function calculer_critere_parties_aux($idb, &$boucles, $param) { |
| 1398 | - if ($param[0]->type != 'texte') { |
|
| 1399 | - $a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 1400 | - if (isset($param[1]->texte)) { |
|
| 1401 | - preg_match(',^\s*(-([0-9]+))?\s*$,', $param[1]->texte, $m); |
|
| 1402 | - |
|
| 1403 | - return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)]; |
|
| 1404 | - } else { |
|
| 1405 | - return ["intval($a1)", 0]; |
|
| 1406 | - } |
|
| 1407 | - } else { |
|
| 1408 | - preg_match(',^\s*(([0-9]+)|n)\s*(-\s*([0-9]+)?\s*)?$,', $param[0]->texte, $m); |
|
| 1409 | - $a1 = $m[1]; |
|
| 1410 | - if (empty($m[3])) { |
|
| 1411 | - return [$a1, 0]; |
|
| 1412 | - } elseif (!empty($m[4])) { |
|
| 1413 | - return [$a1, $m[4]]; |
|
| 1414 | - } else { |
|
| 1415 | - return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)]; |
|
| 1416 | - } |
|
| 1417 | - } |
|
| 1398 | + if ($param[0]->type != 'texte') { |
|
| 1399 | + $a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent); |
|
| 1400 | + if (isset($param[1]->texte)) { |
|
| 1401 | + preg_match(',^\s*(-([0-9]+))?\s*$,', $param[1]->texte, $m); |
|
| 1402 | + |
|
| 1403 | + return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)]; |
|
| 1404 | + } else { |
|
| 1405 | + return ["intval($a1)", 0]; |
|
| 1406 | + } |
|
| 1407 | + } else { |
|
| 1408 | + preg_match(',^\s*(([0-9]+)|n)\s*(-\s*([0-9]+)?\s*)?$,', $param[0]->texte, $m); |
|
| 1409 | + $a1 = $m[1]; |
|
| 1410 | + if (empty($m[3])) { |
|
| 1411 | + return [$a1, 0]; |
|
| 1412 | + } elseif (!empty($m[4])) { |
|
| 1413 | + return [$a1, $m[4]]; |
|
| 1414 | + } else { |
|
| 1415 | + return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)]; |
|
| 1416 | + } |
|
| 1417 | + } |
|
| 1418 | 1418 | } |
| 1419 | 1419 | |
| 1420 | 1420 | |
@@ -1441,47 +1441,47 @@ discard block |
||
| 1441 | 1441 | * array : Erreur sur un des critères |
| 1442 | 1442 | **/ |
| 1443 | 1443 | function calculer_criteres($idb, &$boucles) { |
| 1444 | - $msg = ''; |
|
| 1445 | - $boucle = $boucles[$idb]; |
|
| 1446 | - $table = strtoupper($boucle->type_requete); |
|
| 1447 | - $serveur = strtolower($boucle->sql_serveur); |
|
| 1448 | - |
|
| 1449 | - $defaut = charger_fonction('DEFAUT', 'calculer_critere'); |
|
| 1450 | - // s'il y avait une erreur de syntaxe, propager cette info |
|
| 1451 | - if (!is_array($boucle->criteres)) { |
|
| 1452 | - return []; |
|
| 1453 | - } |
|
| 1454 | - |
|
| 1455 | - foreach ($boucle->criteres as $crit) { |
|
| 1456 | - $critere = $crit->op; |
|
| 1457 | - // critere personnalise ? |
|
| 1458 | - if ( |
|
| 1459 | - (!$serveur or |
|
| 1460 | - ((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere)) |
|
| 1461 | - and (!function_exists($f = $f . '_dist')) |
|
| 1462 | - and (!function_exists($f = 'critere_' . $serveur . '_' . $critere)) |
|
| 1463 | - and (!function_exists($f = $f . '_dist')) |
|
| 1464 | - ) |
|
| 1465 | - ) |
|
| 1466 | - and (!function_exists($f = 'critere_' . $table . '_' . $critere)) |
|
| 1467 | - and (!function_exists($f = $f . '_dist')) |
|
| 1468 | - and (!function_exists($f = 'critere_' . $critere)) |
|
| 1469 | - and (!function_exists($f = $f . '_dist')) |
|
| 1470 | - ) { |
|
| 1471 | - // fonction critere standard |
|
| 1472 | - $f = $defaut; |
|
| 1473 | - } |
|
| 1474 | - // compile le critere |
|
| 1475 | - $res = $f($idb, $boucles, $crit); |
|
| 1476 | - |
|
| 1477 | - // Gestion centralisee des erreurs pour pouvoir propager |
|
| 1478 | - if (is_array($res)) { |
|
| 1479 | - $msg = $res; |
|
| 1480 | - erreur_squelette($msg, $boucle); |
|
| 1481 | - } |
|
| 1482 | - } |
|
| 1483 | - |
|
| 1484 | - return $msg; |
|
| 1444 | + $msg = ''; |
|
| 1445 | + $boucle = $boucles[$idb]; |
|
| 1446 | + $table = strtoupper($boucle->type_requete); |
|
| 1447 | + $serveur = strtolower($boucle->sql_serveur); |
|
| 1448 | + |
|
| 1449 | + $defaut = charger_fonction('DEFAUT', 'calculer_critere'); |
|
| 1450 | + // s'il y avait une erreur de syntaxe, propager cette info |
|
| 1451 | + if (!is_array($boucle->criteres)) { |
|
| 1452 | + return []; |
|
| 1453 | + } |
|
| 1454 | + |
|
| 1455 | + foreach ($boucle->criteres as $crit) { |
|
| 1456 | + $critere = $crit->op; |
|
| 1457 | + // critere personnalise ? |
|
| 1458 | + if ( |
|
| 1459 | + (!$serveur or |
|
| 1460 | + ((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere)) |
|
| 1461 | + and (!function_exists($f = $f . '_dist')) |
|
| 1462 | + and (!function_exists($f = 'critere_' . $serveur . '_' . $critere)) |
|
| 1463 | + and (!function_exists($f = $f . '_dist')) |
|
| 1464 | + ) |
|
| 1465 | + ) |
|
| 1466 | + and (!function_exists($f = 'critere_' . $table . '_' . $critere)) |
|
| 1467 | + and (!function_exists($f = $f . '_dist')) |
|
| 1468 | + and (!function_exists($f = 'critere_' . $critere)) |
|
| 1469 | + and (!function_exists($f = $f . '_dist')) |
|
| 1470 | + ) { |
|
| 1471 | + // fonction critere standard |
|
| 1472 | + $f = $defaut; |
|
| 1473 | + } |
|
| 1474 | + // compile le critere |
|
| 1475 | + $res = $f($idb, $boucles, $crit); |
|
| 1476 | + |
|
| 1477 | + // Gestion centralisee des erreurs pour pouvoir propager |
|
| 1478 | + if (is_array($res)) { |
|
| 1479 | + $msg = $res; |
|
| 1480 | + erreur_squelette($msg, $boucle); |
|
| 1481 | + } |
|
| 1482 | + } |
|
| 1483 | + |
|
| 1484 | + return $msg; |
|
| 1485 | 1485 | } |
| 1486 | 1486 | |
| 1487 | 1487 | /** |
@@ -1496,11 +1496,11 @@ discard block |
||
| 1496 | 1496 | * @return string Code compilé rééchappé |
| 1497 | 1497 | */ |
| 1498 | 1498 | function kwote($lisp, $serveur = '', $type = '') { |
| 1499 | - if (preg_match(_CODE_QUOTE, $lisp, $r)) { |
|
| 1500 | - return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"'; |
|
| 1501 | - } else { |
|
| 1502 | - return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')"; |
|
| 1503 | - } |
|
| 1499 | + if (preg_match(_CODE_QUOTE, $lisp, $r)) { |
|
| 1500 | + return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"'; |
|
| 1501 | + } else { |
|
| 1502 | + return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')"; |
|
| 1503 | + } |
|
| 1504 | 1504 | } |
| 1505 | 1505 | |
| 1506 | 1506 | |
@@ -1519,81 +1519,81 @@ discard block |
||
| 1519 | 1519 | * @return void|array |
| 1520 | 1520 | **/ |
| 1521 | 1521 | function critere_IN_dist($idb, &$boucles, $crit) { |
| 1522 | - $r = calculer_critere_infixe($idb, $boucles, $crit); |
|
| 1523 | - if (!$r) { |
|
| 1524 | - return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]; |
|
| 1525 | - } |
|
| 1526 | - [$arg, $op, $val, $col, $where_complement] = $r; |
|
| 1527 | - |
|
| 1528 | - $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col); |
|
| 1529 | - |
|
| 1530 | - // inserer la condition; exemple: {id_mot ?IN (66, 62, 64)} |
|
| 1531 | - $where = $in; |
|
| 1532 | - if ($crit->cond) { |
|
| 1533 | - $pred = calculer_argument_precedent($idb, $col, $boucles); |
|
| 1534 | - $where = ["'?'", $pred, $where, "''"]; |
|
| 1535 | - if ($where_complement) { // condition annexe du type "AND (objet='article')" |
|
| 1536 | - $where_complement = ["'?'", $pred, $where_complement, "''"]; |
|
| 1537 | - } |
|
| 1538 | - } |
|
| 1539 | - if ($crit->exclus) { |
|
| 1540 | - if (!preg_match(',^L[0-9]+[.],', $arg)) { |
|
| 1541 | - $where = ["'NOT'", $where]; |
|
| 1542 | - } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete |
|
| 1543 | - // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent |
|
| 1544 | - { |
|
| 1545 | - $where = [ |
|
| 1546 | - "'NOT'", |
|
| 1547 | - [ |
|
| 1548 | - "'IN'", |
|
| 1549 | - "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", |
|
| 1550 | - ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where] |
|
| 1551 | - ] |
|
| 1552 | - ]; |
|
| 1553 | - } |
|
| 1554 | - } |
|
| 1555 | - |
|
| 1556 | - $boucles[$idb]->where[] = $where; |
|
| 1557 | - if ($where_complement) { // condition annexe du type "AND (objet='article')" |
|
| 1558 | - $boucles[$idb]->where[] = $where_complement; |
|
| 1559 | - } |
|
| 1522 | + $r = calculer_critere_infixe($idb, $boucles, $crit); |
|
| 1523 | + if (!$r) { |
|
| 1524 | + return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]; |
|
| 1525 | + } |
|
| 1526 | + [$arg, $op, $val, $col, $where_complement] = $r; |
|
| 1527 | + |
|
| 1528 | + $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col); |
|
| 1529 | + |
|
| 1530 | + // inserer la condition; exemple: {id_mot ?IN (66, 62, 64)} |
|
| 1531 | + $where = $in; |
|
| 1532 | + if ($crit->cond) { |
|
| 1533 | + $pred = calculer_argument_precedent($idb, $col, $boucles); |
|
| 1534 | + $where = ["'?'", $pred, $where, "''"]; |
|
| 1535 | + if ($where_complement) { // condition annexe du type "AND (objet='article')" |
|
| 1536 | + $where_complement = ["'?'", $pred, $where_complement, "''"]; |
|
| 1537 | + } |
|
| 1538 | + } |
|
| 1539 | + if ($crit->exclus) { |
|
| 1540 | + if (!preg_match(',^L[0-9]+[.],', $arg)) { |
|
| 1541 | + $where = ["'NOT'", $where]; |
|
| 1542 | + } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete |
|
| 1543 | + // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent |
|
| 1544 | + { |
|
| 1545 | + $where = [ |
|
| 1546 | + "'NOT'", |
|
| 1547 | + [ |
|
| 1548 | + "'IN'", |
|
| 1549 | + "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", |
|
| 1550 | + ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where] |
|
| 1551 | + ] |
|
| 1552 | + ]; |
|
| 1553 | + } |
|
| 1554 | + } |
|
| 1555 | + |
|
| 1556 | + $boucles[$idb]->where[] = $where; |
|
| 1557 | + if ($where_complement) { // condition annexe du type "AND (objet='article')" |
|
| 1558 | + $boucles[$idb]->where[] = $where_complement; |
|
| 1559 | + } |
|
| 1560 | 1560 | } |
| 1561 | 1561 | |
| 1562 | 1562 | function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) { |
| 1563 | - static $num = []; |
|
| 1564 | - $descr = $boucles[$idb]->descr; |
|
| 1565 | - $cpt = &$num[$descr['nom']][$descr['gram']][$idb]; |
|
| 1566 | - |
|
| 1567 | - $var = '$in' . $cpt++; |
|
| 1568 | - $x = "\n\t$var = array();"; |
|
| 1569 | - foreach ($val as $k => $v) { |
|
| 1570 | - if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) { |
|
| 1571 | - // optimiser le traitement des constantes |
|
| 1572 | - if (is_numeric($r[2])) { |
|
| 1573 | - $x .= "\n\t$var" . "[]= $r[2];"; |
|
| 1574 | - } else { |
|
| 1575 | - $x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';'; |
|
| 1576 | - } |
|
| 1577 | - } else { |
|
| 1578 | - // Pour permettre de passer des tableaux de valeurs |
|
| 1579 | - // on repere l'utilisation brute de #ENV**{X}, |
|
| 1580 | - // c'est-a-dire sa traduction en ($PILE[0][X]). |
|
| 1581 | - // et on deballe mais en rajoutant l'anti XSS |
|
| 1582 | - $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);"; |
|
| 1583 | - } |
|
| 1584 | - } |
|
| 1585 | - |
|
| 1586 | - $boucles[$idb]->in .= $x; |
|
| 1587 | - |
|
| 1588 | - // inserer le tri par defaut selon les ordres du IN ... |
|
| 1589 | - // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp) |
|
| 1590 | - // et que l'on limite donc strictement aux cas necessaires : |
|
| 1591 | - // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle |
|
| 1592 | - if (!$crit2) { |
|
| 1593 | - $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))"; |
|
| 1594 | - } |
|
| 1595 | - |
|
| 1596 | - return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')'; |
|
| 1563 | + static $num = []; |
|
| 1564 | + $descr = $boucles[$idb]->descr; |
|
| 1565 | + $cpt = &$num[$descr['nom']][$descr['gram']][$idb]; |
|
| 1566 | + |
|
| 1567 | + $var = '$in' . $cpt++; |
|
| 1568 | + $x = "\n\t$var = array();"; |
|
| 1569 | + foreach ($val as $k => $v) { |
|
| 1570 | + if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) { |
|
| 1571 | + // optimiser le traitement des constantes |
|
| 1572 | + if (is_numeric($r[2])) { |
|
| 1573 | + $x .= "\n\t$var" . "[]= $r[2];"; |
|
| 1574 | + } else { |
|
| 1575 | + $x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';'; |
|
| 1576 | + } |
|
| 1577 | + } else { |
|
| 1578 | + // Pour permettre de passer des tableaux de valeurs |
|
| 1579 | + // on repere l'utilisation brute de #ENV**{X}, |
|
| 1580 | + // c'est-a-dire sa traduction en ($PILE[0][X]). |
|
| 1581 | + // et on deballe mais en rajoutant l'anti XSS |
|
| 1582 | + $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);"; |
|
| 1583 | + } |
|
| 1584 | + } |
|
| 1585 | + |
|
| 1586 | + $boucles[$idb]->in .= $x; |
|
| 1587 | + |
|
| 1588 | + // inserer le tri par defaut selon les ordres du IN ... |
|
| 1589 | + // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp) |
|
| 1590 | + // et que l'on limite donc strictement aux cas necessaires : |
|
| 1591 | + // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle |
|
| 1592 | + if (!$crit2) { |
|
| 1593 | + $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))"; |
|
| 1594 | + } |
|
| 1595 | + |
|
| 1596 | + return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')'; |
|
| 1597 | 1597 | } |
| 1598 | 1598 | |
| 1599 | 1599 | /** |
@@ -1609,22 +1609,22 @@ discard block |
||
| 1609 | 1609 | * @return void |
| 1610 | 1610 | */ |
| 1611 | 1611 | function critere_where_dist($idb, &$boucles, $crit) { |
| 1612 | - $boucle = &$boucles[$idb]; |
|
| 1613 | - if (isset($crit->param[0])) { |
|
| 1614 | - $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent); |
|
| 1615 | - } else { |
|
| 1616 | - $_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")'; |
|
| 1617 | - } |
|
| 1618 | - |
|
| 1619 | - if ($crit->cond) { |
|
| 1620 | - $_where = "((\$zzw = $_where) ? \$zzw : '')"; |
|
| 1621 | - } |
|
| 1622 | - |
|
| 1623 | - if ($crit->not) { |
|
| 1624 | - $_where = "array('NOT',$_where)"; |
|
| 1625 | - } |
|
| 1626 | - |
|
| 1627 | - $boucle->where[] = $_where; |
|
| 1612 | + $boucle = &$boucles[$idb]; |
|
| 1613 | + if (isset($crit->param[0])) { |
|
| 1614 | + $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent); |
|
| 1615 | + } else { |
|
| 1616 | + $_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")'; |
|
| 1617 | + } |
|
| 1618 | + |
|
| 1619 | + if ($crit->cond) { |
|
| 1620 | + $_where = "((\$zzw = $_where) ? \$zzw : '')"; |
|
| 1621 | + } |
|
| 1622 | + |
|
| 1623 | + if ($crit->not) { |
|
| 1624 | + $_where = "array('NOT',$_where)"; |
|
| 1625 | + } |
|
| 1626 | + |
|
| 1627 | + $boucle->where[] = $_where; |
|
| 1628 | 1628 | } |
| 1629 | 1629 | |
| 1630 | 1630 | /** |
@@ -1652,31 +1652,31 @@ discard block |
||
| 1652 | 1652 | * @return void |
| 1653 | 1653 | */ |
| 1654 | 1654 | function critere_id__dist($idb, &$boucles, $crit) { |
| 1655 | - /** @var Boucle $boucle */ |
|
| 1656 | - $boucle = $boucles[$idb]; |
|
| 1657 | - |
|
| 1658 | - $champs = lister_champs_id_conditionnel( |
|
| 1659 | - $boucle->show['table'], |
|
| 1660 | - $boucle->show, |
|
| 1661 | - $boucle->sql_serveur |
|
| 1662 | - ); |
|
| 1663 | - |
|
| 1664 | - // ne pas tenir compte des critères identiques déjà présents. |
|
| 1665 | - if (!empty($boucle->modificateur['criteres'])) { |
|
| 1666 | - $champs = array_diff($champs, array_keys($boucle->modificateur['criteres'])); |
|
| 1667 | - } |
|
| 1668 | - // nous aider en mode debug. |
|
| 1669 | - $boucle->debug[] = 'id_ : ' . implode(', ', $champs); |
|
| 1670 | - $boucle->modificateur['id_'] = $champs; |
|
| 1671 | - |
|
| 1672 | - // créer un critère {id_xxx?} de chaque champ retenu |
|
| 1673 | - foreach ($champs as $champ) { |
|
| 1674 | - $critere_id_table = new Critere(); |
|
| 1675 | - $critere_id_table->op = $champ; |
|
| 1676 | - $critere_id_table->cond = '?'; |
|
| 1677 | - $critere_id_table->ligne = $crit->ligne; |
|
| 1678 | - calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table); |
|
| 1679 | - } |
|
| 1655 | + /** @var Boucle $boucle */ |
|
| 1656 | + $boucle = $boucles[$idb]; |
|
| 1657 | + |
|
| 1658 | + $champs = lister_champs_id_conditionnel( |
|
| 1659 | + $boucle->show['table'], |
|
| 1660 | + $boucle->show, |
|
| 1661 | + $boucle->sql_serveur |
|
| 1662 | + ); |
|
| 1663 | + |
|
| 1664 | + // ne pas tenir compte des critères identiques déjà présents. |
|
| 1665 | + if (!empty($boucle->modificateur['criteres'])) { |
|
| 1666 | + $champs = array_diff($champs, array_keys($boucle->modificateur['criteres'])); |
|
| 1667 | + } |
|
| 1668 | + // nous aider en mode debug. |
|
| 1669 | + $boucle->debug[] = 'id_ : ' . implode(', ', $champs); |
|
| 1670 | + $boucle->modificateur['id_'] = $champs; |
|
| 1671 | + |
|
| 1672 | + // créer un critère {id_xxx?} de chaque champ retenu |
|
| 1673 | + foreach ($champs as $champ) { |
|
| 1674 | + $critere_id_table = new Critere(); |
|
| 1675 | + $critere_id_table->op = $champ; |
|
| 1676 | + $critere_id_table->cond = '?'; |
|
| 1677 | + $critere_id_table->ligne = $crit->ligne; |
|
| 1678 | + calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table); |
|
| 1679 | + } |
|
| 1680 | 1680 | } |
| 1681 | 1681 | |
| 1682 | 1682 | /** |
@@ -1696,75 +1696,75 @@ discard block |
||
| 1696 | 1696 | * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...) |
| 1697 | 1697 | */ |
| 1698 | 1698 | function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') { |
| 1699 | - // calculer la description de la table |
|
| 1700 | - if (!is_array($desc)) { |
|
| 1701 | - $desc = description_table($table, $serveur); |
|
| 1702 | - } |
|
| 1703 | - if (!$desc) { |
|
| 1704 | - return []; |
|
| 1705 | - } |
|
| 1706 | - |
|
| 1707 | - // Les champs id_xx de la table demandée |
|
| 1708 | - $champs = array_filter( |
|
| 1709 | - array_keys($desc['field']), |
|
| 1710 | - fn($champ) => strpos($champ, 'id_') === 0 or (in_array($champ, ['objet'])) |
|
| 1711 | - ); |
|
| 1712 | - |
|
| 1713 | - // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute. |
|
| 1714 | - if ( |
|
| 1715 | - in_array('id_rubrique', $champs) |
|
| 1716 | - and !in_array('id_secteur', $champs) |
|
| 1717 | - ) { |
|
| 1718 | - $champs[] = 'id_secteur'; |
|
| 1719 | - } |
|
| 1720 | - |
|
| 1721 | - // On ne fera pas mieux pour les tables d’un autre serveur |
|
| 1722 | - if ($serveur) { |
|
| 1723 | - return $champs; |
|
| 1724 | - } |
|
| 1725 | - |
|
| 1726 | - $primary = false; |
|
| 1727 | - $associable = false; |
|
| 1728 | - include_spip('action/editer_liens'); |
|
| 1729 | - |
|
| 1730 | - if (isset($desc['type'])) { |
|
| 1731 | - $primary = id_table_objet($desc['type']); |
|
| 1732 | - $associable = objet_associable($desc['type']); |
|
| 1733 | - } |
|
| 1734 | - if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) { |
|
| 1735 | - $associable = true; |
|
| 1736 | - } |
|
| 1737 | - |
|
| 1738 | - // liste de toutes les tables principales, sauf la notre |
|
| 1739 | - $tables = lister_tables_objets_sql(); |
|
| 1740 | - unset($tables[$table]); |
|
| 1741 | - |
|
| 1742 | - foreach ($tables as $_table => $_desc) { |
|
| 1743 | - if ( |
|
| 1744 | - $associable |
|
| 1745 | - or ($primary and in_array($primary, array_keys($_desc['field']))) |
|
| 1746 | - or objet_associable($_desc['type']) |
|
| 1747 | - ) { |
|
| 1748 | - $champs[] = id_table_objet($_table); |
|
| 1749 | - } |
|
| 1750 | - } |
|
| 1751 | - $champs = array_values(array_unique($champs)); |
|
| 1752 | - |
|
| 1753 | - // Exclusions de certains id |
|
| 1754 | - $exclusions = pipeline( |
|
| 1755 | - 'exclure_id_conditionnel', |
|
| 1756 | - [ |
|
| 1757 | - 'args' => [ |
|
| 1758 | - 'table' => $table, |
|
| 1759 | - 'id_table_objet' => $primary, |
|
| 1760 | - 'associable' => $associable, |
|
| 1761 | - ], |
|
| 1762 | - 'data' => [], |
|
| 1763 | - ] |
|
| 1764 | - ); |
|
| 1765 | - $champs = array_diff($champs, $exclusions); |
|
| 1766 | - |
|
| 1767 | - return $champs; |
|
| 1699 | + // calculer la description de la table |
|
| 1700 | + if (!is_array($desc)) { |
|
| 1701 | + $desc = description_table($table, $serveur); |
|
| 1702 | + } |
|
| 1703 | + if (!$desc) { |
|
| 1704 | + return []; |
|
| 1705 | + } |
|
| 1706 | + |
|
| 1707 | + // Les champs id_xx de la table demandée |
|
| 1708 | + $champs = array_filter( |
|
| 1709 | + array_keys($desc['field']), |
|
| 1710 | + fn($champ) => strpos($champ, 'id_') === 0 or (in_array($champ, ['objet'])) |
|
| 1711 | + ); |
|
| 1712 | + |
|
| 1713 | + // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute. |
|
| 1714 | + if ( |
|
| 1715 | + in_array('id_rubrique', $champs) |
|
| 1716 | + and !in_array('id_secteur', $champs) |
|
| 1717 | + ) { |
|
| 1718 | + $champs[] = 'id_secteur'; |
|
| 1719 | + } |
|
| 1720 | + |
|
| 1721 | + // On ne fera pas mieux pour les tables d’un autre serveur |
|
| 1722 | + if ($serveur) { |
|
| 1723 | + return $champs; |
|
| 1724 | + } |
|
| 1725 | + |
|
| 1726 | + $primary = false; |
|
| 1727 | + $associable = false; |
|
| 1728 | + include_spip('action/editer_liens'); |
|
| 1729 | + |
|
| 1730 | + if (isset($desc['type'])) { |
|
| 1731 | + $primary = id_table_objet($desc['type']); |
|
| 1732 | + $associable = objet_associable($desc['type']); |
|
| 1733 | + } |
|
| 1734 | + if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) { |
|
| 1735 | + $associable = true; |
|
| 1736 | + } |
|
| 1737 | + |
|
| 1738 | + // liste de toutes les tables principales, sauf la notre |
|
| 1739 | + $tables = lister_tables_objets_sql(); |
|
| 1740 | + unset($tables[$table]); |
|
| 1741 | + |
|
| 1742 | + foreach ($tables as $_table => $_desc) { |
|
| 1743 | + if ( |
|
| 1744 | + $associable |
|
| 1745 | + or ($primary and in_array($primary, array_keys($_desc['field']))) |
|
| 1746 | + or objet_associable($_desc['type']) |
|
| 1747 | + ) { |
|
| 1748 | + $champs[] = id_table_objet($_table); |
|
| 1749 | + } |
|
| 1750 | + } |
|
| 1751 | + $champs = array_values(array_unique($champs)); |
|
| 1752 | + |
|
| 1753 | + // Exclusions de certains id |
|
| 1754 | + $exclusions = pipeline( |
|
| 1755 | + 'exclure_id_conditionnel', |
|
| 1756 | + [ |
|
| 1757 | + 'args' => [ |
|
| 1758 | + 'table' => $table, |
|
| 1759 | + 'id_table_objet' => $primary, |
|
| 1760 | + 'associable' => $associable, |
|
| 1761 | + ], |
|
| 1762 | + 'data' => [], |
|
| 1763 | + ] |
|
| 1764 | + ); |
|
| 1765 | + $champs = array_diff($champs, $exclusions); |
|
| 1766 | + |
|
| 1767 | + return $champs; |
|
| 1768 | 1768 | } |
| 1769 | 1769 | |
| 1770 | 1770 | /** |
@@ -1819,28 +1819,28 @@ discard block |
||
| 1819 | 1819 | * @return void |
| 1820 | 1820 | */ |
| 1821 | 1821 | function critere_tri_dist($idb, &$boucles, $crit) { |
| 1822 | - $boucle = &$boucles[$idb]; |
|
| 1823 | - |
|
| 1824 | - // definition du champ par defaut |
|
| 1825 | - $_champ_defaut = !isset($crit->param[0][0]) ? "''" |
|
| 1826 | - : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent); |
|
| 1827 | - $_liste_sens_defaut = !isset($crit->param[1][0]) ? '1' |
|
| 1828 | - : calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent); |
|
| 1829 | - $_variable = !isset($crit->param[2][0]) ? "'$idb'" |
|
| 1830 | - : calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent); |
|
| 1831 | - |
|
| 1832 | - $_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')"; |
|
| 1833 | - |
|
| 1834 | - $_sens_defaut = "(is_array(\$s=$_liste_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)"; |
|
| 1835 | - $_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)"; |
|
| 1836 | - |
|
| 1837 | - $boucle->modificateur['tri_champ'] = $_tri; |
|
| 1838 | - $boucle->modificateur['tri_sens'] = $_sens; |
|
| 1839 | - $boucle->modificateur['tri_liste_sens_defaut'] = $_liste_sens_defaut; |
|
| 1840 | - $boucle->modificateur['tri_nom'] = $_variable; |
|
| 1841 | - // faut il inserer un test sur l'existence de $tri parmi les champs de la table ? |
|
| 1842 | - // evite des erreurs sql, mais peut empecher des tri sur jointure ... |
|
| 1843 | - $boucle->hash .= " |
|
| 1822 | + $boucle = &$boucles[$idb]; |
|
| 1823 | + |
|
| 1824 | + // definition du champ par defaut |
|
| 1825 | + $_champ_defaut = !isset($crit->param[0][0]) ? "''" |
|
| 1826 | + : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent); |
|
| 1827 | + $_liste_sens_defaut = !isset($crit->param[1][0]) ? '1' |
|
| 1828 | + : calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent); |
|
| 1829 | + $_variable = !isset($crit->param[2][0]) ? "'$idb'" |
|
| 1830 | + : calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent); |
|
| 1831 | + |
|
| 1832 | + $_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')"; |
|
| 1833 | + |
|
| 1834 | + $_sens_defaut = "(is_array(\$s=$_liste_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)"; |
|
| 1835 | + $_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)"; |
|
| 1836 | + |
|
| 1837 | + $boucle->modificateur['tri_champ'] = $_tri; |
|
| 1838 | + $boucle->modificateur['tri_sens'] = $_sens; |
|
| 1839 | + $boucle->modificateur['tri_liste_sens_defaut'] = $_liste_sens_defaut; |
|
| 1840 | + $boucle->modificateur['tri_nom'] = $_variable; |
|
| 1841 | + // faut il inserer un test sur l'existence de $tri parmi les champs de la table ? |
|
| 1842 | + // evite des erreurs sql, mais peut empecher des tri sur jointure ... |
|
| 1843 | + $boucle->hash .= " |
|
| 1844 | 1844 | \$senstri = ''; |
| 1845 | 1845 | \$tri = $_tri; |
| 1846 | 1846 | if (\$tri){ |
@@ -1848,8 +1848,8 @@ discard block |
||
| 1848 | 1848 | \$senstri = (\$senstri<0)?' DESC':''; |
| 1849 | 1849 | }; |
| 1850 | 1850 | "; |
| 1851 | - $boucle->select[] = '".tri_champ_select($tri)."'; |
|
| 1852 | - $boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)"; |
|
| 1851 | + $boucle->select[] = '".tri_champ_select($tri)."'; |
|
| 1852 | + $boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)"; |
|
| 1853 | 1853 | } |
| 1854 | 1854 | |
| 1855 | 1855 | # Criteres de comparaison |
@@ -1866,20 +1866,20 @@ discard block |
||
| 1866 | 1866 | * @return void|array |
| 1867 | 1867 | **/ |
| 1868 | 1868 | function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) { |
| 1869 | - // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale |
|
| 1870 | - if (($crit->op == ',') or ($crit->op == '/')) { |
|
| 1871 | - return calculer_critere_parties($idb, $boucles, $crit); |
|
| 1872 | - } |
|
| 1873 | - |
|
| 1874 | - $r = calculer_critere_infixe($idb, $boucles, $crit); |
|
| 1875 | - if (!$r) { |
|
| 1876 | - # // on produit une erreur seulement si le critere n'a pas de '?' |
|
| 1877 | - # if (!$crit->cond) { |
|
| 1878 | - return ['zbug_critere_inconnu', ['critere' => $crit->op]]; |
|
| 1879 | - # } |
|
| 1880 | - } else { |
|
| 1881 | - calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r); |
|
| 1882 | - } |
|
| 1869 | + // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale |
|
| 1870 | + if (($crit->op == ',') or ($crit->op == '/')) { |
|
| 1871 | + return calculer_critere_parties($idb, $boucles, $crit); |
|
| 1872 | + } |
|
| 1873 | + |
|
| 1874 | + $r = calculer_critere_infixe($idb, $boucles, $crit); |
|
| 1875 | + if (!$r) { |
|
| 1876 | + # // on produit une erreur seulement si le critere n'a pas de '?' |
|
| 1877 | + # if (!$crit->cond) { |
|
| 1878 | + return ['zbug_critere_inconnu', ['critere' => $crit->op]]; |
|
| 1879 | + # } |
|
| 1880 | + } else { |
|
| 1881 | + calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r); |
|
| 1882 | + } |
|
| 1883 | 1883 | } |
| 1884 | 1884 | |
| 1885 | 1885 | |
@@ -1899,62 +1899,62 @@ discard block |
||
| 1899 | 1899 | * @return void |
| 1900 | 1900 | **/ |
| 1901 | 1901 | function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) { |
| 1902 | - [$arg, $op, $val, $col, $where_complement] = $args; |
|
| 1903 | - |
|
| 1904 | - $where = ["'$op'", "'$arg'", $val[0]]; |
|
| 1905 | - |
|
| 1906 | - // inserer la negation (cf !...) |
|
| 1907 | - |
|
| 1908 | - if ($crit->not) { |
|
| 1909 | - $where = ["'NOT'", $where]; |
|
| 1910 | - } |
|
| 1911 | - if ($crit->exclus) { |
|
| 1912 | - if (!preg_match(',^L[0-9]+[.],', $arg)) { |
|
| 1913 | - $where = ["'NOT'", $where]; |
|
| 1914 | - } else { |
|
| 1915 | - // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete |
|
| 1916 | - // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent |
|
| 1917 | - $where = [ |
|
| 1918 | - "'NOT'", |
|
| 1919 | - [ |
|
| 1920 | - "'IN'", |
|
| 1921 | - "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", |
|
| 1922 | - ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where] |
|
| 1923 | - ] |
|
| 1924 | - ]; |
|
| 1925 | - } |
|
| 1926 | - } |
|
| 1927 | - |
|
| 1928 | - // inserer la condition (cf {lang?}) |
|
| 1929 | - // traiter a part la date, elle est mise d'office par SPIP, |
|
| 1930 | - if ($crit->cond) { |
|
| 1931 | - $pred = calculer_argument_precedent($idb, $col, $boucles); |
|
| 1932 | - if ($col === 'date' or $col === 'date_redac') { |
|
| 1933 | - if ($pred === "\$Pile[0]['" . $col . "']") { |
|
| 1934 | - $pred = "(\$Pile[0]['{$col}_default']?'':$pred)"; |
|
| 1935 | - } |
|
| 1936 | - } |
|
| 1937 | - |
|
| 1938 | - if ($op === '=' and !$crit->not) { |
|
| 1939 | - $where = [ |
|
| 1940 | - "'?'", |
|
| 1941 | - "(is_array($pred))", |
|
| 1942 | - critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col), |
|
| 1943 | - $where |
|
| 1944 | - ]; |
|
| 1945 | - } |
|
| 1946 | - $where = ["'?'", "!is_whereable($pred)", "''", $where]; |
|
| 1947 | - if ($where_complement) { |
|
| 1948 | - // condition annexe du type "AND (objet='article')" |
|
| 1949 | - $where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement]; |
|
| 1950 | - } |
|
| 1951 | - } |
|
| 1952 | - |
|
| 1953 | - $boucles[$idb]->where[] = $where; |
|
| 1954 | - if ($where_complement) { |
|
| 1955 | - // condition annexe du type "AND (objet='article')" |
|
| 1956 | - $boucles[$idb]->where[] = $where_complement; |
|
| 1957 | - } |
|
| 1902 | + [$arg, $op, $val, $col, $where_complement] = $args; |
|
| 1903 | + |
|
| 1904 | + $where = ["'$op'", "'$arg'", $val[0]]; |
|
| 1905 | + |
|
| 1906 | + // inserer la negation (cf !...) |
|
| 1907 | + |
|
| 1908 | + if ($crit->not) { |
|
| 1909 | + $where = ["'NOT'", $where]; |
|
| 1910 | + } |
|
| 1911 | + if ($crit->exclus) { |
|
| 1912 | + if (!preg_match(',^L[0-9]+[.],', $arg)) { |
|
| 1913 | + $where = ["'NOT'", $where]; |
|
| 1914 | + } else { |
|
| 1915 | + // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete |
|
| 1916 | + // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent |
|
| 1917 | + $where = [ |
|
| 1918 | + "'NOT'", |
|
| 1919 | + [ |
|
| 1920 | + "'IN'", |
|
| 1921 | + "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", |
|
| 1922 | + ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where] |
|
| 1923 | + ] |
|
| 1924 | + ]; |
|
| 1925 | + } |
|
| 1926 | + } |
|
| 1927 | + |
|
| 1928 | + // inserer la condition (cf {lang?}) |
|
| 1929 | + // traiter a part la date, elle est mise d'office par SPIP, |
|
| 1930 | + if ($crit->cond) { |
|
| 1931 | + $pred = calculer_argument_precedent($idb, $col, $boucles); |
|
| 1932 | + if ($col === 'date' or $col === 'date_redac') { |
|
| 1933 | + if ($pred === "\$Pile[0]['" . $col . "']") { |
|
| 1934 | + $pred = "(\$Pile[0]['{$col}_default']?'':$pred)"; |
|
| 1935 | + } |
|
| 1936 | + } |
|
| 1937 | + |
|
| 1938 | + if ($op === '=' and !$crit->not) { |
|
| 1939 | + $where = [ |
|
| 1940 | + "'?'", |
|
| 1941 | + "(is_array($pred))", |
|
| 1942 | + critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col), |
|
| 1943 | + $where |
|
| 1944 | + ]; |
|
| 1945 | + } |
|
| 1946 | + $where = ["'?'", "!is_whereable($pred)", "''", $where]; |
|
| 1947 | + if ($where_complement) { |
|
| 1948 | + // condition annexe du type "AND (objet='article')" |
|
| 1949 | + $where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement]; |
|
| 1950 | + } |
|
| 1951 | + } |
|
| 1952 | + |
|
| 1953 | + $boucles[$idb]->where[] = $where; |
|
| 1954 | + if ($where_complement) { |
|
| 1955 | + // condition annexe du type "AND (objet='article')" |
|
| 1956 | + $boucles[$idb]->where[] = $where_complement; |
|
| 1957 | + } |
|
| 1958 | 1958 | } |
| 1959 | 1959 | |
| 1960 | 1960 | |
@@ -1995,165 +1995,165 @@ discard block |
||
| 1995 | 1995 | **/ |
| 1996 | 1996 | function calculer_critere_infixe($idb, &$boucles, $crit) { |
| 1997 | 1997 | |
| 1998 | - $boucle = &$boucles[$idb]; |
|
| 1999 | - $type = $boucle->type_requete; |
|
| 2000 | - $table = $boucle->id_table ?? ''; |
|
| 2001 | - $desc = $boucle->show; |
|
| 2002 | - $col_vraie = null; |
|
| 2003 | - |
|
| 2004 | - [$fct, $col, $op, $val, $args_sql] = |
|
| 2005 | - calculer_critere_infixe_ops($idb, $boucles, $crit); |
|
| 2006 | - |
|
| 2007 | - $col_alias = $col; |
|
| 2008 | - $where_complement = false; |
|
| 2009 | - |
|
| 2010 | - // Cas particulier : id_enfant => utiliser la colonne id_objet |
|
| 2011 | - if ($col == 'id_enfant') { |
|
| 2012 | - $col = $boucle->primary; |
|
| 2013 | - } |
|
| 2014 | - |
|
| 2015 | - // Cas particulier : id_parent => verifier les exceptions de tables |
|
| 2016 | - if ( |
|
| 2017 | - (in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col])) |
|
| 2018 | - or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col])) |
|
| 2019 | - ) { |
|
| 2020 | - $col = $GLOBALS['exceptions_des_tables'][$table][$col]; |
|
| 2021 | - } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums) |
|
| 2022 | - else { |
|
| 2023 | - if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) { |
|
| 2024 | - $table = $critere_secteur($idb, $boucles, $val, $crit); |
|
| 2025 | - } |
|
| 2026 | - |
|
| 2027 | - // cas id_article=xx qui se mappe en id_objet=xx AND objet=article |
|
| 2028 | - // sauf si exception declaree : sauter cette etape |
|
| 2029 | - else { |
|
| 2030 | - if ( |
|
| 2031 | - !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col]) |
|
| 2032 | - and !isset($GLOBALS['exceptions_des_jointures'][$col]) |
|
| 2033 | - and count(trouver_champs_decomposes($col, $desc)) > 1 |
|
| 2034 | - ) { |
|
| 2035 | - $e = decompose_champ_id_objet($col); |
|
| 2036 | - $col = array_shift($e); |
|
| 2037 | - $where_complement = primary_doublee($e, $table); |
|
| 2038 | - } // Cas particulier : expressions de date |
|
| 2039 | - else { |
|
| 2040 | - if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) { |
|
| 2041 | - [$col, $col_vraie] = $c; |
|
| 2042 | - $table = ''; |
|
| 2043 | - } // table explicitée {mots.titre} |
|
| 2044 | - else { |
|
| 2045 | - if (preg_match('/^(.*)\.(.*)$/', $col, $r)) { |
|
| 2046 | - [, $table, $col] = $r; |
|
| 2047 | - $col_alias = $col; |
|
| 2048 | - |
|
| 2049 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 2050 | - if ( |
|
| 2051 | - $desc = $trouver_table($table, $boucle->sql_serveur) |
|
| 2052 | - and isset($desc['field'][$col]) |
|
| 2053 | - and $cle = array_search($desc['table'], $boucle->from) |
|
| 2054 | - ) { |
|
| 2055 | - $table = $cle; |
|
| 2056 | - } else { |
|
| 2057 | - $table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '=')); |
|
| 2058 | - } |
|
| 2059 | - #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true); |
|
| 2060 | - if (!$table) { |
|
| 2061 | - return ''; |
|
| 2062 | - } |
|
| 2063 | - } |
|
| 2064 | - // si le champ n'est pas trouvé dans la table, |
|
| 2065 | - // on cherche si une jointure peut l'obtenir |
|
| 2066 | - elseif (@!array_key_exists($col, $desc['field'])) { |
|
| 2067 | - // Champ joker * des iterateurs DATA qui accepte tout |
|
| 2068 | - if (@array_key_exists('*', $desc['field'])) { |
|
| 2069 | - $desc['field'][$col_vraie ?: $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA |
|
| 2070 | - } |
|
| 2071 | - else { |
|
| 2072 | - $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table); |
|
| 2073 | - if (!$r) { |
|
| 2074 | - return ''; |
|
| 2075 | - } |
|
| 2076 | - [$col, $col_alias, $table, $where_complement, $desc] = $r; |
|
| 2077 | - } |
|
| 2078 | - } |
|
| 2079 | - } |
|
| 2080 | - } |
|
| 2081 | - } |
|
| 2082 | - } |
|
| 2083 | - |
|
| 2084 | - $col_vraie = ($col_vraie ?: $col); |
|
| 2085 | - // Dans tous les cas, |
|
| 2086 | - // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL) |
|
| 2087 | - // et passer dans sql_quote avec le type si connu |
|
| 2088 | - // et int sinon si la valeur est numerique |
|
| 2089 | - // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon) |
|
| 2090 | - // Ne pas utiliser intval, PHP tronquant les Bigint de SQL |
|
| 2091 | - if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) { |
|
| 2092 | - $type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL'); |
|
| 2093 | - // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon |
|
| 2094 | - // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut |
|
| 2095 | - if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) { |
|
| 2096 | - $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"'; |
|
| 2097 | - } |
|
| 2098 | - // sinon expliciter les |
|
| 2099 | - // sql_quote(truc) en sql_quote(truc,'',type) |
|
| 2100 | - // sql_quote(truc,serveur) en sql_quote(truc,serveur,type) |
|
| 2101 | - // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type) |
|
| 2102 | - // sans toucher aux |
|
| 2103 | - // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE') |
|
| 2104 | - // sql_quote(truc,'','varchar') |
|
| 2105 | - elseif ( |
|
| 2106 | - preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r) |
|
| 2107 | - // si pas deja un type |
|
| 2108 | - and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '")) |
|
| 2109 | - ) { |
|
| 2110 | - $r = $r[1] |
|
| 2111 | - . ((isset($r[2]) and $r[2]) ? $r[2] : ",''") |
|
| 2112 | - . ",'" . addslashes($type_cast_quote) . "'"; |
|
| 2113 | - $val[0] = "sql_quote($r)"; |
|
| 2114 | - } |
|
| 2115 | - elseif ( |
|
| 2116 | - strpos($val[0], '@@defaultcast@@') !== false |
|
| 2117 | - and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r) |
|
| 2118 | - ) { |
|
| 2119 | - $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')"; |
|
| 2120 | - } |
|
| 2121 | - } |
|
| 2122 | - |
|
| 2123 | - if ( |
|
| 2124 | - strpos($val[0], '@@defaultcast@@') !== false |
|
| 2125 | - and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r) |
|
| 2126 | - ) { |
|
| 2127 | - $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')"; |
|
| 2128 | - } |
|
| 2129 | - |
|
| 2130 | - // Indicateur pour permettre aux fonctionx boucle_X de modifier |
|
| 2131 | - // leurs requetes par defaut, notamment le champ statut |
|
| 2132 | - // Ne pas confondre champs de la table principale et des jointures |
|
| 2133 | - if ($table === $boucle->id_table) { |
|
| 2134 | - $boucles[$idb]->modificateur['criteres'][$col_vraie] = true; |
|
| 2135 | - if ($col_alias != $col_vraie) { |
|
| 2136 | - $boucles[$idb]->modificateur['criteres'][$col_alias] = true; |
|
| 2137 | - } |
|
| 2138 | - } |
|
| 2139 | - |
|
| 2140 | - // inserer le nom de la table SQL devant le nom du champ |
|
| 2141 | - if ($table) { |
|
| 2142 | - if ($col[0] == '`') { |
|
| 2143 | - $arg = "$table." . substr($col, 1, -1); |
|
| 2144 | - } else { |
|
| 2145 | - $arg = "$table.$col"; |
|
| 2146 | - } |
|
| 2147 | - } else { |
|
| 2148 | - $arg = $col; |
|
| 2149 | - } |
|
| 2150 | - |
|
| 2151 | - // inserer la fonction SQL |
|
| 2152 | - if ($fct) { |
|
| 2153 | - $arg = "$fct($arg$args_sql)"; |
|
| 2154 | - } |
|
| 2155 | - |
|
| 2156 | - return [$arg, $op, $val, $col_alias, $where_complement]; |
|
| 1998 | + $boucle = &$boucles[$idb]; |
|
| 1999 | + $type = $boucle->type_requete; |
|
| 2000 | + $table = $boucle->id_table ?? ''; |
|
| 2001 | + $desc = $boucle->show; |
|
| 2002 | + $col_vraie = null; |
|
| 2003 | + |
|
| 2004 | + [$fct, $col, $op, $val, $args_sql] = |
|
| 2005 | + calculer_critere_infixe_ops($idb, $boucles, $crit); |
|
| 2006 | + |
|
| 2007 | + $col_alias = $col; |
|
| 2008 | + $where_complement = false; |
|
| 2009 | + |
|
| 2010 | + // Cas particulier : id_enfant => utiliser la colonne id_objet |
|
| 2011 | + if ($col == 'id_enfant') { |
|
| 2012 | + $col = $boucle->primary; |
|
| 2013 | + } |
|
| 2014 | + |
|
| 2015 | + // Cas particulier : id_parent => verifier les exceptions de tables |
|
| 2016 | + if ( |
|
| 2017 | + (in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col])) |
|
| 2018 | + or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col])) |
|
| 2019 | + ) { |
|
| 2020 | + $col = $GLOBALS['exceptions_des_tables'][$table][$col]; |
|
| 2021 | + } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums) |
|
| 2022 | + else { |
|
| 2023 | + if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) { |
|
| 2024 | + $table = $critere_secteur($idb, $boucles, $val, $crit); |
|
| 2025 | + } |
|
| 2026 | + |
|
| 2027 | + // cas id_article=xx qui se mappe en id_objet=xx AND objet=article |
|
| 2028 | + // sauf si exception declaree : sauter cette etape |
|
| 2029 | + else { |
|
| 2030 | + if ( |
|
| 2031 | + !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col]) |
|
| 2032 | + and !isset($GLOBALS['exceptions_des_jointures'][$col]) |
|
| 2033 | + and count(trouver_champs_decomposes($col, $desc)) > 1 |
|
| 2034 | + ) { |
|
| 2035 | + $e = decompose_champ_id_objet($col); |
|
| 2036 | + $col = array_shift($e); |
|
| 2037 | + $where_complement = primary_doublee($e, $table); |
|
| 2038 | + } // Cas particulier : expressions de date |
|
| 2039 | + else { |
|
| 2040 | + if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) { |
|
| 2041 | + [$col, $col_vraie] = $c; |
|
| 2042 | + $table = ''; |
|
| 2043 | + } // table explicitée {mots.titre} |
|
| 2044 | + else { |
|
| 2045 | + if (preg_match('/^(.*)\.(.*)$/', $col, $r)) { |
|
| 2046 | + [, $table, $col] = $r; |
|
| 2047 | + $col_alias = $col; |
|
| 2048 | + |
|
| 2049 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 2050 | + if ( |
|
| 2051 | + $desc = $trouver_table($table, $boucle->sql_serveur) |
|
| 2052 | + and isset($desc['field'][$col]) |
|
| 2053 | + and $cle = array_search($desc['table'], $boucle->from) |
|
| 2054 | + ) { |
|
| 2055 | + $table = $cle; |
|
| 2056 | + } else { |
|
| 2057 | + $table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '=')); |
|
| 2058 | + } |
|
| 2059 | + #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true); |
|
| 2060 | + if (!$table) { |
|
| 2061 | + return ''; |
|
| 2062 | + } |
|
| 2063 | + } |
|
| 2064 | + // si le champ n'est pas trouvé dans la table, |
|
| 2065 | + // on cherche si une jointure peut l'obtenir |
|
| 2066 | + elseif (@!array_key_exists($col, $desc['field'])) { |
|
| 2067 | + // Champ joker * des iterateurs DATA qui accepte tout |
|
| 2068 | + if (@array_key_exists('*', $desc['field'])) { |
|
| 2069 | + $desc['field'][$col_vraie ?: $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA |
|
| 2070 | + } |
|
| 2071 | + else { |
|
| 2072 | + $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table); |
|
| 2073 | + if (!$r) { |
|
| 2074 | + return ''; |
|
| 2075 | + } |
|
| 2076 | + [$col, $col_alias, $table, $where_complement, $desc] = $r; |
|
| 2077 | + } |
|
| 2078 | + } |
|
| 2079 | + } |
|
| 2080 | + } |
|
| 2081 | + } |
|
| 2082 | + } |
|
| 2083 | + |
|
| 2084 | + $col_vraie = ($col_vraie ?: $col); |
|
| 2085 | + // Dans tous les cas, |
|
| 2086 | + // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL) |
|
| 2087 | + // et passer dans sql_quote avec le type si connu |
|
| 2088 | + // et int sinon si la valeur est numerique |
|
| 2089 | + // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon) |
|
| 2090 | + // Ne pas utiliser intval, PHP tronquant les Bigint de SQL |
|
| 2091 | + if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) { |
|
| 2092 | + $type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL'); |
|
| 2093 | + // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon |
|
| 2094 | + // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut |
|
| 2095 | + if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) { |
|
| 2096 | + $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"'; |
|
| 2097 | + } |
|
| 2098 | + // sinon expliciter les |
|
| 2099 | + // sql_quote(truc) en sql_quote(truc,'',type) |
|
| 2100 | + // sql_quote(truc,serveur) en sql_quote(truc,serveur,type) |
|
| 2101 | + // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type) |
|
| 2102 | + // sans toucher aux |
|
| 2103 | + // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE') |
|
| 2104 | + // sql_quote(truc,'','varchar') |
|
| 2105 | + elseif ( |
|
| 2106 | + preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r) |
|
| 2107 | + // si pas deja un type |
|
| 2108 | + and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '")) |
|
| 2109 | + ) { |
|
| 2110 | + $r = $r[1] |
|
| 2111 | + . ((isset($r[2]) and $r[2]) ? $r[2] : ",''") |
|
| 2112 | + . ",'" . addslashes($type_cast_quote) . "'"; |
|
| 2113 | + $val[0] = "sql_quote($r)"; |
|
| 2114 | + } |
|
| 2115 | + elseif ( |
|
| 2116 | + strpos($val[0], '@@defaultcast@@') !== false |
|
| 2117 | + and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r) |
|
| 2118 | + ) { |
|
| 2119 | + $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')"; |
|
| 2120 | + } |
|
| 2121 | + } |
|
| 2122 | + |
|
| 2123 | + if ( |
|
| 2124 | + strpos($val[0], '@@defaultcast@@') !== false |
|
| 2125 | + and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r) |
|
| 2126 | + ) { |
|
| 2127 | + $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')"; |
|
| 2128 | + } |
|
| 2129 | + |
|
| 2130 | + // Indicateur pour permettre aux fonctionx boucle_X de modifier |
|
| 2131 | + // leurs requetes par defaut, notamment le champ statut |
|
| 2132 | + // Ne pas confondre champs de la table principale et des jointures |
|
| 2133 | + if ($table === $boucle->id_table) { |
|
| 2134 | + $boucles[$idb]->modificateur['criteres'][$col_vraie] = true; |
|
| 2135 | + if ($col_alias != $col_vraie) { |
|
| 2136 | + $boucles[$idb]->modificateur['criteres'][$col_alias] = true; |
|
| 2137 | + } |
|
| 2138 | + } |
|
| 2139 | + |
|
| 2140 | + // inserer le nom de la table SQL devant le nom du champ |
|
| 2141 | + if ($table) { |
|
| 2142 | + if ($col[0] == '`') { |
|
| 2143 | + $arg = "$table." . substr($col, 1, -1); |
|
| 2144 | + } else { |
|
| 2145 | + $arg = "$table.$col"; |
|
| 2146 | + } |
|
| 2147 | + } else { |
|
| 2148 | + $arg = $col; |
|
| 2149 | + } |
|
| 2150 | + |
|
| 2151 | + // inserer la fonction SQL |
|
| 2152 | + if ($fct) { |
|
| 2153 | + $arg = "$fct($arg$args_sql)"; |
|
| 2154 | + } |
|
| 2155 | + |
|
| 2156 | + return [$arg, $op, $val, $col_alias, $where_complement]; |
|
| 2157 | 2157 | } |
| 2158 | 2158 | |
| 2159 | 2159 | |
@@ -2182,77 +2182,77 @@ discard block |
||
| 2182 | 2182 | **/ |
| 2183 | 2183 | function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) { |
| 2184 | 2184 | |
| 2185 | - $where = ''; |
|
| 2186 | - |
|
| 2187 | - $calculer_critere_externe = 'calculer_critere_externe_init'; |
|
| 2188 | - // gestion par les plugins des jointures tordues |
|
| 2189 | - // pas automatiques mais necessaires |
|
| 2190 | - $table_sql = table_objet_sql($table); |
|
| 2191 | - if ( |
|
| 2192 | - isset($GLOBALS['exceptions_des_jointures'][$table_sql]) |
|
| 2193 | - and is_array($GLOBALS['exceptions_des_jointures'][$table_sql]) |
|
| 2194 | - and |
|
| 2195 | - ( |
|
| 2196 | - isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col]) |
|
| 2197 | - or |
|
| 2198 | - isset($GLOBALS['exceptions_des_jointures'][$table_sql]['']) |
|
| 2199 | - ) |
|
| 2200 | - ) { |
|
| 2201 | - $t = $GLOBALS['exceptions_des_jointures'][$table_sql]; |
|
| 2202 | - $index = $t[$col] ?? $t[''] ?? []; |
|
| 2203 | - |
|
| 2204 | - if ((is_countable($index) ? count($index) : 0) == 3) { |
|
| 2205 | - [$t, $col, $calculer_critere_externe] = $index; |
|
| 2206 | - } elseif ((is_countable($index) ? count($index) : 0) == 2) { |
|
| 2207 | - [$t, $col] = $t[$col]; |
|
| 2208 | - } elseif ((is_countable($index) ? count($index) : 0) == 1) { |
|
| 2209 | - [$calculer_critere_externe] = $index; |
|
| 2210 | - $t = $table; |
|
| 2211 | - } else { |
|
| 2212 | - $t = ''; |
|
| 2213 | - } // jointure non declaree. La trouver. |
|
| 2214 | - } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) { |
|
| 2215 | - [$t, $col] = $GLOBALS['exceptions_des_jointures'][$col]; |
|
| 2216 | - } else { |
|
| 2217 | - $t = ''; |
|
| 2218 | - } // jointure non declaree. La trouver. |
|
| 2219 | - |
|
| 2220 | - // ici on construit le from pour fournir $col en piochant dans les jointures |
|
| 2221 | - |
|
| 2222 | - // si des jointures explicites sont fournies, on cherche d'abord dans celles ci |
|
| 2223 | - // permet de forcer une table de lien quand il y a ambiguite |
|
| 2224 | - // <BOUCLE_(DOCUMENTS documents_liens){id_mot}> |
|
| 2225 | - // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}> |
|
| 2226 | - $table = ''; |
|
| 2227 | - if ($boucle->jointures_explicites) { |
|
| 2228 | - $jointures_explicites = explode(' ', $boucle->jointures_explicites); |
|
| 2229 | - $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t); |
|
| 2230 | - } |
|
| 2231 | - |
|
| 2232 | - // et sinon on cherche parmi toutes les jointures declarees |
|
| 2233 | - if (!$table) { |
|
| 2234 | - $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t); |
|
| 2235 | - } |
|
| 2236 | - |
|
| 2237 | - if (!$table) { |
|
| 2238 | - return ''; |
|
| 2239 | - } |
|
| 2240 | - |
|
| 2241 | - // il ne reste plus qu'a trouver le champ dans les from |
|
| 2242 | - [$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle); |
|
| 2243 | - |
|
| 2244 | - if ((is_countable($cle) ? count($cle) : 0) > 1 or reset($cle) !== $col) { |
|
| 2245 | - $col_alias = $col; // id_article devient juste le nom d'origine |
|
| 2246 | - if ((is_countable($cle) ? count($cle) : 0) > 1 and reset($cle) == 'id_objet') { |
|
| 2247 | - $e = decompose_champ_id_objet($col); |
|
| 2248 | - $col = array_shift($e); |
|
| 2249 | - $where = primary_doublee($e, $table); |
|
| 2250 | - } else { |
|
| 2251 | - $col = reset($cle); |
|
| 2252 | - } |
|
| 2253 | - } |
|
| 2254 | - |
|
| 2255 | - return [$col, $col_alias, $table, $where, $desc]; |
|
| 2185 | + $where = ''; |
|
| 2186 | + |
|
| 2187 | + $calculer_critere_externe = 'calculer_critere_externe_init'; |
|
| 2188 | + // gestion par les plugins des jointures tordues |
|
| 2189 | + // pas automatiques mais necessaires |
|
| 2190 | + $table_sql = table_objet_sql($table); |
|
| 2191 | + if ( |
|
| 2192 | + isset($GLOBALS['exceptions_des_jointures'][$table_sql]) |
|
| 2193 | + and is_array($GLOBALS['exceptions_des_jointures'][$table_sql]) |
|
| 2194 | + and |
|
| 2195 | + ( |
|
| 2196 | + isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col]) |
|
| 2197 | + or |
|
| 2198 | + isset($GLOBALS['exceptions_des_jointures'][$table_sql]['']) |
|
| 2199 | + ) |
|
| 2200 | + ) { |
|
| 2201 | + $t = $GLOBALS['exceptions_des_jointures'][$table_sql]; |
|
| 2202 | + $index = $t[$col] ?? $t[''] ?? []; |
|
| 2203 | + |
|
| 2204 | + if ((is_countable($index) ? count($index) : 0) == 3) { |
|
| 2205 | + [$t, $col, $calculer_critere_externe] = $index; |
|
| 2206 | + } elseif ((is_countable($index) ? count($index) : 0) == 2) { |
|
| 2207 | + [$t, $col] = $t[$col]; |
|
| 2208 | + } elseif ((is_countable($index) ? count($index) : 0) == 1) { |
|
| 2209 | + [$calculer_critere_externe] = $index; |
|
| 2210 | + $t = $table; |
|
| 2211 | + } else { |
|
| 2212 | + $t = ''; |
|
| 2213 | + } // jointure non declaree. La trouver. |
|
| 2214 | + } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) { |
|
| 2215 | + [$t, $col] = $GLOBALS['exceptions_des_jointures'][$col]; |
|
| 2216 | + } else { |
|
| 2217 | + $t = ''; |
|
| 2218 | + } // jointure non declaree. La trouver. |
|
| 2219 | + |
|
| 2220 | + // ici on construit le from pour fournir $col en piochant dans les jointures |
|
| 2221 | + |
|
| 2222 | + // si des jointures explicites sont fournies, on cherche d'abord dans celles ci |
|
| 2223 | + // permet de forcer une table de lien quand il y a ambiguite |
|
| 2224 | + // <BOUCLE_(DOCUMENTS documents_liens){id_mot}> |
|
| 2225 | + // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}> |
|
| 2226 | + $table = ''; |
|
| 2227 | + if ($boucle->jointures_explicites) { |
|
| 2228 | + $jointures_explicites = explode(' ', $boucle->jointures_explicites); |
|
| 2229 | + $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t); |
|
| 2230 | + } |
|
| 2231 | + |
|
| 2232 | + // et sinon on cherche parmi toutes les jointures declarees |
|
| 2233 | + if (!$table) { |
|
| 2234 | + $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t); |
|
| 2235 | + } |
|
| 2236 | + |
|
| 2237 | + if (!$table) { |
|
| 2238 | + return ''; |
|
| 2239 | + } |
|
| 2240 | + |
|
| 2241 | + // il ne reste plus qu'a trouver le champ dans les from |
|
| 2242 | + [$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle); |
|
| 2243 | + |
|
| 2244 | + if ((is_countable($cle) ? count($cle) : 0) > 1 or reset($cle) !== $col) { |
|
| 2245 | + $col_alias = $col; // id_article devient juste le nom d'origine |
|
| 2246 | + if ((is_countable($cle) ? count($cle) : 0) > 1 and reset($cle) == 'id_objet') { |
|
| 2247 | + $e = decompose_champ_id_objet($col); |
|
| 2248 | + $col = array_shift($e); |
|
| 2249 | + $where = primary_doublee($e, $table); |
|
| 2250 | + } else { |
|
| 2251 | + $col = reset($cle); |
|
| 2252 | + } |
|
| 2253 | + } |
|
| 2254 | + |
|
| 2255 | + return [$col, $col_alias, $table, $where, $desc]; |
|
| 2256 | 2256 | } |
| 2257 | 2257 | |
| 2258 | 2258 | |
@@ -2273,10 +2273,10 @@ discard block |
||
| 2273 | 2273 | * - valeur |
| 2274 | 2274 | **/ |
| 2275 | 2275 | function primary_doublee($decompose, $table) { |
| 2276 | - $e1 = reset($decompose); |
|
| 2277 | - $e2 = "sql_quote('" . end($decompose) . "')"; |
|
| 2276 | + $e1 = reset($decompose); |
|
| 2277 | + $e2 = "sql_quote('" . end($decompose) . "')"; |
|
| 2278 | 2278 | |
| 2279 | - return ["'='", "'$table." . $e1 . "'", $e2]; |
|
| 2279 | + return ["'='", "'$table." . $e1 . "'", $e2]; |
|
| 2280 | 2280 | } |
| 2281 | 2281 | |
| 2282 | 2282 | /** |
@@ -2307,57 +2307,57 @@ discard block |
||
| 2307 | 2307 | * Vide sinon. |
| 2308 | 2308 | */ |
| 2309 | 2309 | function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) { |
| 2310 | - // si on demande un truc du genre spip_mots |
|
| 2311 | - // avec aussi spip_mots_liens dans les jointures dispo |
|
| 2312 | - // et qu'on est la |
|
| 2313 | - // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots |
|
| 2314 | - if ( |
|
| 2315 | - $checkarrivee |
|
| 2316 | - and is_string($checkarrivee) |
|
| 2317 | - and $a = table_objet($checkarrivee) |
|
| 2318 | - and in_array($a . '_liens', $joints) |
|
| 2319 | - ) { |
|
| 2320 | - if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) { |
|
| 2321 | - return $res; |
|
| 2322 | - } |
|
| 2323 | - } |
|
| 2324 | - foreach ($joints as $joint) { |
|
| 2325 | - if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) { |
|
| 2326 | - // alias de table dans le from |
|
| 2327 | - $t = array_search($arrivee[0], $boucle->from); |
|
| 2328 | - // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet) |
|
| 2329 | - $cols = $arrivee[2]; |
|
| 2330 | - // mais on ignore la 3eme cle si presente qui correspond alors au point de depart |
|
| 2331 | - if ((is_countable($cols) ? count($cols) : 0) > 2) { |
|
| 2332 | - array_pop($cols); |
|
| 2333 | - } |
|
| 2334 | - if ($t) { |
|
| 2335 | - // la table est déjà dans le FROM, on vérifie si le champ est utilisé. |
|
| 2336 | - $joindre = false; |
|
| 2337 | - foreach ($cols as $col) { |
|
| 2338 | - $c = '/\b' . $t . ".$col" . '\b/'; |
|
| 2339 | - if (trouver_champ($c, $boucle->where)) { |
|
| 2340 | - $joindre = true; |
|
| 2341 | - } else { |
|
| 2342 | - // mais ca peut etre dans le FIELD pour le Having |
|
| 2343 | - $c = "/FIELD.$t" . ".$col,/"; |
|
| 2344 | - if (trouver_champ($c, $boucle->select)) { |
|
| 2345 | - $joindre = true; |
|
| 2346 | - } |
|
| 2347 | - } |
|
| 2348 | - } |
|
| 2349 | - if (!$joindre) { |
|
| 2350 | - return $t; |
|
| 2351 | - } |
|
| 2352 | - } |
|
| 2353 | - array_pop($arrivee); |
|
| 2354 | - if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) { |
|
| 2355 | - return $res; |
|
| 2356 | - } |
|
| 2357 | - } |
|
| 2358 | - } |
|
| 2359 | - |
|
| 2360 | - return ''; |
|
| 2310 | + // si on demande un truc du genre spip_mots |
|
| 2311 | + // avec aussi spip_mots_liens dans les jointures dispo |
|
| 2312 | + // et qu'on est la |
|
| 2313 | + // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots |
|
| 2314 | + if ( |
|
| 2315 | + $checkarrivee |
|
| 2316 | + and is_string($checkarrivee) |
|
| 2317 | + and $a = table_objet($checkarrivee) |
|
| 2318 | + and in_array($a . '_liens', $joints) |
|
| 2319 | + ) { |
|
| 2320 | + if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) { |
|
| 2321 | + return $res; |
|
| 2322 | + } |
|
| 2323 | + } |
|
| 2324 | + foreach ($joints as $joint) { |
|
| 2325 | + if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) { |
|
| 2326 | + // alias de table dans le from |
|
| 2327 | + $t = array_search($arrivee[0], $boucle->from); |
|
| 2328 | + // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet) |
|
| 2329 | + $cols = $arrivee[2]; |
|
| 2330 | + // mais on ignore la 3eme cle si presente qui correspond alors au point de depart |
|
| 2331 | + if ((is_countable($cols) ? count($cols) : 0) > 2) { |
|
| 2332 | + array_pop($cols); |
|
| 2333 | + } |
|
| 2334 | + if ($t) { |
|
| 2335 | + // la table est déjà dans le FROM, on vérifie si le champ est utilisé. |
|
| 2336 | + $joindre = false; |
|
| 2337 | + foreach ($cols as $col) { |
|
| 2338 | + $c = '/\b' . $t . ".$col" . '\b/'; |
|
| 2339 | + if (trouver_champ($c, $boucle->where)) { |
|
| 2340 | + $joindre = true; |
|
| 2341 | + } else { |
|
| 2342 | + // mais ca peut etre dans le FIELD pour le Having |
|
| 2343 | + $c = "/FIELD.$t" . ".$col,/"; |
|
| 2344 | + if (trouver_champ($c, $boucle->select)) { |
|
| 2345 | + $joindre = true; |
|
| 2346 | + } |
|
| 2347 | + } |
|
| 2348 | + } |
|
| 2349 | + if (!$joindre) { |
|
| 2350 | + return $t; |
|
| 2351 | + } |
|
| 2352 | + } |
|
| 2353 | + array_pop($arrivee); |
|
| 2354 | + if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) { |
|
| 2355 | + return $res; |
|
| 2356 | + } |
|
| 2357 | + } |
|
| 2358 | + } |
|
| 2359 | + |
|
| 2360 | + return ''; |
|
| 2361 | 2361 | } |
| 2362 | 2362 | |
| 2363 | 2363 | /** |
@@ -2383,35 +2383,35 @@ discard block |
||
| 2383 | 2383 | * Alias de la table de jointure (Lx) |
| 2384 | 2384 | */ |
| 2385 | 2385 | function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) { |
| 2386 | - $primary_arrivee = id_table_objet($checkarrivee); |
|
| 2387 | - |
|
| 2388 | - // [FIXME] $checkarrivee peut-il arriver avec false ???? |
|
| 2389 | - $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens'); |
|
| 2390 | - $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee); |
|
| 2391 | - |
|
| 2392 | - if (!$intermediaire or !$arrivee) { |
|
| 2393 | - return ''; |
|
| 2394 | - } |
|
| 2395 | - array_pop($intermediaire); // enlever la cle en 3eme argument |
|
| 2396 | - array_pop($arrivee); // enlever la cle en 3eme argument |
|
| 2397 | - |
|
| 2398 | - $res = fabrique_jointures( |
|
| 2399 | - $boucle, |
|
| 2400 | - [ |
|
| 2401 | - [ |
|
| 2402 | - $boucle->id_table, |
|
| 2403 | - $intermediaire, |
|
| 2404 | - [id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']] |
|
| 2405 | - ], |
|
| 2406 | - [reset($intermediaire), $arrivee, $primary_arrivee] |
|
| 2407 | - ], |
|
| 2408 | - $cond, |
|
| 2409 | - $desc, |
|
| 2410 | - $boucle->id_table, |
|
| 2411 | - [$col] |
|
| 2412 | - ); |
|
| 2413 | - |
|
| 2414 | - return $res; |
|
| 2386 | + $primary_arrivee = id_table_objet($checkarrivee); |
|
| 2387 | + |
|
| 2388 | + // [FIXME] $checkarrivee peut-il arriver avec false ???? |
|
| 2389 | + $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens'); |
|
| 2390 | + $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee); |
|
| 2391 | + |
|
| 2392 | + if (!$intermediaire or !$arrivee) { |
|
| 2393 | + return ''; |
|
| 2394 | + } |
|
| 2395 | + array_pop($intermediaire); // enlever la cle en 3eme argument |
|
| 2396 | + array_pop($arrivee); // enlever la cle en 3eme argument |
|
| 2397 | + |
|
| 2398 | + $res = fabrique_jointures( |
|
| 2399 | + $boucle, |
|
| 2400 | + [ |
|
| 2401 | + [ |
|
| 2402 | + $boucle->id_table, |
|
| 2403 | + $intermediaire, |
|
| 2404 | + [id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']] |
|
| 2405 | + ], |
|
| 2406 | + [reset($intermediaire), $arrivee, $primary_arrivee] |
|
| 2407 | + ], |
|
| 2408 | + $cond, |
|
| 2409 | + $desc, |
|
| 2410 | + $boucle->id_table, |
|
| 2411 | + [$col] |
|
| 2412 | + ); |
|
| 2413 | + |
|
| 2414 | + return $res; |
|
| 2415 | 2415 | } |
| 2416 | 2416 | |
| 2417 | 2417 | |
@@ -2428,17 +2428,17 @@ discard block |
||
| 2428 | 2428 | * false sinon. |
| 2429 | 2429 | **/ |
| 2430 | 2430 | function trouver_champ($champ, $where) { |
| 2431 | - if (!is_array($where)) { |
|
| 2432 | - return preg_match($champ, $where); |
|
| 2433 | - } else { |
|
| 2434 | - foreach ($where as $clause) { |
|
| 2435 | - if (trouver_champ($champ, $clause)) { |
|
| 2436 | - return true; |
|
| 2437 | - } |
|
| 2438 | - } |
|
| 2439 | - |
|
| 2440 | - return false; |
|
| 2441 | - } |
|
| 2431 | + if (!is_array($where)) { |
|
| 2432 | + return preg_match($champ, $where); |
|
| 2433 | + } else { |
|
| 2434 | + foreach ($where as $clause) { |
|
| 2435 | + if (trouver_champ($champ, $clause)) { |
|
| 2436 | + return true; |
|
| 2437 | + } |
|
| 2438 | + } |
|
| 2439 | + |
|
| 2440 | + return false; |
|
| 2441 | + } |
|
| 2442 | 2442 | } |
| 2443 | 2443 | |
| 2444 | 2444 | |
@@ -2464,129 +2464,129 @@ discard block |
||
| 2464 | 2464 | * - string $args_sql Suite des arguments du critère. ? |
| 2465 | 2465 | **/ |
| 2466 | 2466 | function calculer_critere_infixe_ops($idb, &$boucles, $crit) { |
| 2467 | - // cas d'une valeur comparee a elle-meme ou son referent |
|
| 2468 | - if (count($crit->param) == 0) { |
|
| 2469 | - $op = '='; |
|
| 2470 | - $col = $val = $crit->op; |
|
| 2471 | - if (preg_match('/^(.*)\.(.*)$/', $col, $r)) { |
|
| 2472 | - $val = $r[2]; |
|
| 2473 | - } |
|
| 2474 | - // Cas special {lang} : aller chercher $GLOBALS['spip_lang'] |
|
| 2475 | - if ($val == 'lang') { |
|
| 2476 | - $val = [kwote('$GLOBALS[\'spip_lang\']')]; |
|
| 2477 | - } else { |
|
| 2478 | - $defaut = null; |
|
| 2479 | - if ($val == 'id_parent') { |
|
| 2480 | - // Si id_parent, comparer l'id_parent avec l'id_objet |
|
| 2481 | - // de la boucle superieure.... faudrait verifier qu'il existe |
|
| 2482 | - // pour eviter l'erreur SQL |
|
| 2483 | - $val = $boucles[$idb]->primary; |
|
| 2484 | - // mais si pas de boucle superieure, prendre id_parent dans l'env |
|
| 2485 | - $defaut = "(\$Pile[0]['id_parent'] ?? null)"; |
|
| 2486 | - } elseif ($val == 'id_enfant') { |
|
| 2487 | - // Si id_enfant, comparer l'id_objet avec l'id_parent |
|
| 2488 | - // de la boucle superieure |
|
| 2489 | - $val = 'id_parent'; |
|
| 2490 | - } elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) { |
|
| 2491 | - // un critere conditionnel sur date est traite a part |
|
| 2492 | - // car la date est mise d'office par SPIP, |
|
| 2493 | - $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])"; |
|
| 2494 | - } |
|
| 2495 | - |
|
| 2496 | - $val = calculer_argument_precedent($idb, $val, $boucles, $defaut); |
|
| 2497 | - $val = [kwote($val)]; |
|
| 2498 | - } |
|
| 2499 | - } else { |
|
| 2500 | - // comparaison explicite |
|
| 2501 | - // le phraseur impose que le premier param soit du texte |
|
| 2502 | - $params = $crit->param; |
|
| 2503 | - $op = $crit->op; |
|
| 2504 | - if ($op == '==') { |
|
| 2505 | - $op = 'REGEXP'; |
|
| 2506 | - } |
|
| 2507 | - $col = array_shift($params); |
|
| 2508 | - $col = $col[0]->texte; |
|
| 2509 | - |
|
| 2510 | - $val = []; |
|
| 2511 | - $parent = $boucles[$idb]->id_parent; |
|
| 2512 | - |
|
| 2513 | - // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur, |
|
| 2514 | - // celui ne sachant pas ce qu'est un critere infixe |
|
| 2515 | - // et a fortiori son 2e operande qu'entoure " ou ' |
|
| 2516 | - if ( |
|
| 2517 | - count($params) == 1 |
|
| 2518 | - and (is_countable($params[0]) ? count($params[0]) : 0) == 3 |
|
| 2519 | - and $params[0][0]->type == 'texte' |
|
| 2520 | - and $params[0][2]->type == 'texte' |
|
| 2521 | - and ($p = $params[0][0]->texte) == $params[0][2]->texte |
|
| 2522 | - and (($p == "'") or ($p == '"')) |
|
| 2523 | - and $params[0][1]->type == 'champ' |
|
| 2524 | - ) { |
|
| 2525 | - $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p"; |
|
| 2526 | - } else { |
|
| 2527 | - foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) { |
|
| 2528 | - $a = calculer_liste($p, $idb, $boucles, $parent); |
|
| 2529 | - if (strcasecmp($op, 'IN') == 0) { |
|
| 2530 | - $val[] = $a; |
|
| 2531 | - } else { |
|
| 2532 | - $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@'); |
|
| 2533 | - } // toujours quoter en char ici |
|
| 2534 | - } |
|
| 2535 | - } |
|
| 2536 | - } |
|
| 2537 | - |
|
| 2538 | - $fct = $args_sql = ''; |
|
| 2539 | - // fonction SQL ? |
|
| 2540 | - // chercher FONCTION(champ) tel que CONCAT(titre,descriptif) |
|
| 2541 | - if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) { |
|
| 2542 | - $fct = $m[1]; |
|
| 2543 | - preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a); |
|
| 2544 | - $col = $a[1]; |
|
| 2545 | - if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) { |
|
| 2546 | - $col = $m[1]; |
|
| 2547 | - $args_sql = $m[2]; |
|
| 2548 | - } |
|
| 2549 | - $args_sql .= $a[2]; |
|
| 2550 | - } |
|
| 2551 | - |
|
| 2552 | - return [$fct, $col, $op, $val, $args_sql]; |
|
| 2467 | + // cas d'une valeur comparee a elle-meme ou son referent |
|
| 2468 | + if (count($crit->param) == 0) { |
|
| 2469 | + $op = '='; |
|
| 2470 | + $col = $val = $crit->op; |
|
| 2471 | + if (preg_match('/^(.*)\.(.*)$/', $col, $r)) { |
|
| 2472 | + $val = $r[2]; |
|
| 2473 | + } |
|
| 2474 | + // Cas special {lang} : aller chercher $GLOBALS['spip_lang'] |
|
| 2475 | + if ($val == 'lang') { |
|
| 2476 | + $val = [kwote('$GLOBALS[\'spip_lang\']')]; |
|
| 2477 | + } else { |
|
| 2478 | + $defaut = null; |
|
| 2479 | + if ($val == 'id_parent') { |
|
| 2480 | + // Si id_parent, comparer l'id_parent avec l'id_objet |
|
| 2481 | + // de la boucle superieure.... faudrait verifier qu'il existe |
|
| 2482 | + // pour eviter l'erreur SQL |
|
| 2483 | + $val = $boucles[$idb]->primary; |
|
| 2484 | + // mais si pas de boucle superieure, prendre id_parent dans l'env |
|
| 2485 | + $defaut = "(\$Pile[0]['id_parent'] ?? null)"; |
|
| 2486 | + } elseif ($val == 'id_enfant') { |
|
| 2487 | + // Si id_enfant, comparer l'id_objet avec l'id_parent |
|
| 2488 | + // de la boucle superieure |
|
| 2489 | + $val = 'id_parent'; |
|
| 2490 | + } elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) { |
|
| 2491 | + // un critere conditionnel sur date est traite a part |
|
| 2492 | + // car la date est mise d'office par SPIP, |
|
| 2493 | + $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])"; |
|
| 2494 | + } |
|
| 2495 | + |
|
| 2496 | + $val = calculer_argument_precedent($idb, $val, $boucles, $defaut); |
|
| 2497 | + $val = [kwote($val)]; |
|
| 2498 | + } |
|
| 2499 | + } else { |
|
| 2500 | + // comparaison explicite |
|
| 2501 | + // le phraseur impose que le premier param soit du texte |
|
| 2502 | + $params = $crit->param; |
|
| 2503 | + $op = $crit->op; |
|
| 2504 | + if ($op == '==') { |
|
| 2505 | + $op = 'REGEXP'; |
|
| 2506 | + } |
|
| 2507 | + $col = array_shift($params); |
|
| 2508 | + $col = $col[0]->texte; |
|
| 2509 | + |
|
| 2510 | + $val = []; |
|
| 2511 | + $parent = $boucles[$idb]->id_parent; |
|
| 2512 | + |
|
| 2513 | + // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur, |
|
| 2514 | + // celui ne sachant pas ce qu'est un critere infixe |
|
| 2515 | + // et a fortiori son 2e operande qu'entoure " ou ' |
|
| 2516 | + if ( |
|
| 2517 | + count($params) == 1 |
|
| 2518 | + and (is_countable($params[0]) ? count($params[0]) : 0) == 3 |
|
| 2519 | + and $params[0][0]->type == 'texte' |
|
| 2520 | + and $params[0][2]->type == 'texte' |
|
| 2521 | + and ($p = $params[0][0]->texte) == $params[0][2]->texte |
|
| 2522 | + and (($p == "'") or ($p == '"')) |
|
| 2523 | + and $params[0][1]->type == 'champ' |
|
| 2524 | + ) { |
|
| 2525 | + $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p"; |
|
| 2526 | + } else { |
|
| 2527 | + foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) { |
|
| 2528 | + $a = calculer_liste($p, $idb, $boucles, $parent); |
|
| 2529 | + if (strcasecmp($op, 'IN') == 0) { |
|
| 2530 | + $val[] = $a; |
|
| 2531 | + } else { |
|
| 2532 | + $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@'); |
|
| 2533 | + } // toujours quoter en char ici |
|
| 2534 | + } |
|
| 2535 | + } |
|
| 2536 | + } |
|
| 2537 | + |
|
| 2538 | + $fct = $args_sql = ''; |
|
| 2539 | + // fonction SQL ? |
|
| 2540 | + // chercher FONCTION(champ) tel que CONCAT(titre,descriptif) |
|
| 2541 | + if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) { |
|
| 2542 | + $fct = $m[1]; |
|
| 2543 | + preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a); |
|
| 2544 | + $col = $a[1]; |
|
| 2545 | + if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) { |
|
| 2546 | + $col = $m[1]; |
|
| 2547 | + $args_sql = $m[2]; |
|
| 2548 | + } |
|
| 2549 | + $args_sql .= $a[2]; |
|
| 2550 | + } |
|
| 2551 | + |
|
| 2552 | + return [$fct, $col, $op, $val, $args_sql]; |
|
| 2553 | 2553 | } |
| 2554 | 2554 | |
| 2555 | 2555 | // compatibilite ancienne version |
| 2556 | 2556 | |
| 2557 | 2557 | function calculer_vieux_in($params) { |
| 2558 | - $deb = $params[0][0]; |
|
| 2559 | - $k = (is_countable($params) ? count($params) : 0) - 1; |
|
| 2560 | - $last = $params[$k]; |
|
| 2561 | - $j = (is_countable($last) ? count($last) : 0) - 1; |
|
| 2562 | - $last = $last[$j]; |
|
| 2563 | - $n = isset($last->texte) ? strlen($last->texte) : 0; |
|
| 2564 | - |
|
| 2565 | - if ( |
|
| 2566 | - !((isset($deb->texte[0]) and $deb->texte[0] == '(') |
|
| 2567 | - && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')')) |
|
| 2568 | - ) { |
|
| 2569 | - return $params; |
|
| 2570 | - } |
|
| 2571 | - $params[0][0]->texte = substr($deb->texte, 1); |
|
| 2572 | - // attention, on peut avoir k=0,j=0 ==> recalculer |
|
| 2573 | - $last = $params[$k][$j]; |
|
| 2574 | - $n = strlen($last->texte); |
|
| 2575 | - $params[$k][$j]->texte = substr($last->texte, 0, $n - 1); |
|
| 2576 | - $newp = []; |
|
| 2577 | - foreach ($params as $v) { |
|
| 2578 | - if ($v[0]->type != 'texte') { |
|
| 2579 | - $newp[] = $v; |
|
| 2580 | - } else { |
|
| 2581 | - foreach (explode(',', $v[0]->texte) as $x) { |
|
| 2582 | - $t = new Texte(); |
|
| 2583 | - $t->texte = $x; |
|
| 2584 | - $newp[] = [$t]; |
|
| 2585 | - } |
|
| 2586 | - } |
|
| 2587 | - } |
|
| 2588 | - |
|
| 2589 | - return $newp; |
|
| 2558 | + $deb = $params[0][0]; |
|
| 2559 | + $k = (is_countable($params) ? count($params) : 0) - 1; |
|
| 2560 | + $last = $params[$k]; |
|
| 2561 | + $j = (is_countable($last) ? count($last) : 0) - 1; |
|
| 2562 | + $last = $last[$j]; |
|
| 2563 | + $n = isset($last->texte) ? strlen($last->texte) : 0; |
|
| 2564 | + |
|
| 2565 | + if ( |
|
| 2566 | + !((isset($deb->texte[0]) and $deb->texte[0] == '(') |
|
| 2567 | + && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')')) |
|
| 2568 | + ) { |
|
| 2569 | + return $params; |
|
| 2570 | + } |
|
| 2571 | + $params[0][0]->texte = substr($deb->texte, 1); |
|
| 2572 | + // attention, on peut avoir k=0,j=0 ==> recalculer |
|
| 2573 | + $last = $params[$k][$j]; |
|
| 2574 | + $n = strlen($last->texte); |
|
| 2575 | + $params[$k][$j]->texte = substr($last->texte, 0, $n - 1); |
|
| 2576 | + $newp = []; |
|
| 2577 | + foreach ($params as $v) { |
|
| 2578 | + if ($v[0]->type != 'texte') { |
|
| 2579 | + $newp[] = $v; |
|
| 2580 | + } else { |
|
| 2581 | + foreach (explode(',', $v[0]->texte) as $x) { |
|
| 2582 | + $t = new Texte(); |
|
| 2583 | + $t->texte = $x; |
|
| 2584 | + $newp[] = [$t]; |
|
| 2585 | + } |
|
| 2586 | + } |
|
| 2587 | + } |
|
| 2588 | + |
|
| 2589 | + return $newp; |
|
| 2590 | 2590 | } |
| 2591 | 2591 | |
| 2592 | 2592 | /** |
@@ -2605,95 +2605,95 @@ discard block |
||
| 2605 | 2605 | * - nom de la colonne de date (si le calcul n'est pas relatif) |
| 2606 | 2606 | **/ |
| 2607 | 2607 | function calculer_critere_infixe_date($idb, &$boucles, $col) { |
| 2608 | - if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) { |
|
| 2609 | - return ''; |
|
| 2610 | - } |
|
| 2611 | - |
|
| 2612 | - $boucle = $boucles[$idb]; |
|
| 2613 | - $table = $boucle->show; |
|
| 2614 | - |
|
| 2615 | - // si c'est une colonne de la table, ne rien faire |
|
| 2616 | - if (isset($table['field'][$col])) { |
|
| 2617 | - return ''; |
|
| 2618 | - } |
|
| 2619 | - |
|
| 2620 | - // Le type de critère à prendre en compte |
|
| 2621 | - $col = $regs[1]; |
|
| 2622 | - |
|
| 2623 | - // Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet |
|
| 2624 | - if (isset($regs[3]) and $suite = $regs[3]) { |
|
| 2625 | - # Recherche de l'existence du champ date_xxxx, |
|
| 2626 | - # si oui choisir ce champ, sinon choisir xxxx |
|
| 2627 | - if (isset($table['field']["date$suite"])) { |
|
| 2628 | - $date_orig = 'date' . $suite; |
|
| 2629 | - } else { |
|
| 2630 | - $date_orig = substr($suite, 1); |
|
| 2631 | - } |
|
| 2632 | - |
|
| 2633 | - $pred = $date_orig; |
|
| 2634 | - } else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet |
|
| 2635 | - // Si aucune déclaration trouvée, on quitte |
|
| 2636 | - if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) { |
|
| 2637 | - return ''; |
|
| 2638 | - } |
|
| 2639 | - // Par défaut, on prend le champ date déclaré dans l'API |
|
| 2640 | - $pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date']; |
|
| 2641 | - |
|
| 2642 | - // Si c'est pour du relatif |
|
| 2643 | - if (isset($regs[2]) and $rel = $regs[2]) { |
|
| 2644 | - $pred = 'date'; |
|
| 2645 | - } |
|
| 2646 | - } |
|
| 2647 | - |
|
| 2648 | - $date_compare = "\"' . normaliser_date(" . |
|
| 2649 | - calculer_argument_precedent($idb, $pred, $boucles) . |
|
| 2650 | - ") . '\""; |
|
| 2651 | - |
|
| 2652 | - $col_vraie = $date_orig; |
|
| 2653 | - $date_orig = $boucle->id_table . '.' . $date_orig; |
|
| 2654 | - |
|
| 2655 | - switch ($col) { |
|
| 2656 | - case 'date': |
|
| 2657 | - $col = $date_orig; |
|
| 2658 | - break; |
|
| 2659 | - case 'jour': |
|
| 2660 | - $col = "DAYOFMONTH($date_orig)"; |
|
| 2661 | - break; |
|
| 2662 | - case 'mois': |
|
| 2663 | - $col = "MONTH($date_orig)"; |
|
| 2664 | - break; |
|
| 2665 | - case 'annee': |
|
| 2666 | - $col = "YEAR($date_orig)"; |
|
| 2667 | - break; |
|
| 2668 | - case 'heure': |
|
| 2669 | - $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')"; |
|
| 2670 | - break; |
|
| 2671 | - case 'age': |
|
| 2672 | - $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig); |
|
| 2673 | - $col_vraie = '';// comparer a un int (par defaut) |
|
| 2674 | - break; |
|
| 2675 | - case 'age_relatif': |
|
| 2676 | - $col = calculer_param_date($date_compare, $date_orig); |
|
| 2677 | - $col_vraie = '';// comparer a un int (par defaut) |
|
| 2678 | - break; |
|
| 2679 | - case 'jour_relatif': |
|
| 2680 | - $col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))'; |
|
| 2681 | - $col_vraie = '';// comparer a un int (par defaut) |
|
| 2682 | - break; |
|
| 2683 | - case 'mois_relatif': |
|
| 2684 | - $col = 'MONTH(' . $date_compare . ')-MONTH(' . |
|
| 2685 | - $date_orig . ')+12*(YEAR(' . $date_compare . |
|
| 2686 | - ')-YEAR(' . $date_orig . '))'; |
|
| 2687 | - $col_vraie = '';// comparer a un int (par defaut) |
|
| 2688 | - break; |
|
| 2689 | - case 'annee_relatif': |
|
| 2690 | - $col = 'YEAR(' . $date_compare . ')-YEAR(' . |
|
| 2691 | - $date_orig . ')'; |
|
| 2692 | - $col_vraie = '';// comparer a un int (par defaut) |
|
| 2693 | - break; |
|
| 2694 | - } |
|
| 2695 | - |
|
| 2696 | - return [$col, $col_vraie]; |
|
| 2608 | + if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) { |
|
| 2609 | + return ''; |
|
| 2610 | + } |
|
| 2611 | + |
|
| 2612 | + $boucle = $boucles[$idb]; |
|
| 2613 | + $table = $boucle->show; |
|
| 2614 | + |
|
| 2615 | + // si c'est une colonne de la table, ne rien faire |
|
| 2616 | + if (isset($table['field'][$col])) { |
|
| 2617 | + return ''; |
|
| 2618 | + } |
|
| 2619 | + |
|
| 2620 | + // Le type de critère à prendre en compte |
|
| 2621 | + $col = $regs[1]; |
|
| 2622 | + |
|
| 2623 | + // Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet |
|
| 2624 | + if (isset($regs[3]) and $suite = $regs[3]) { |
|
| 2625 | + # Recherche de l'existence du champ date_xxxx, |
|
| 2626 | + # si oui choisir ce champ, sinon choisir xxxx |
|
| 2627 | + if (isset($table['field']["date$suite"])) { |
|
| 2628 | + $date_orig = 'date' . $suite; |
|
| 2629 | + } else { |
|
| 2630 | + $date_orig = substr($suite, 1); |
|
| 2631 | + } |
|
| 2632 | + |
|
| 2633 | + $pred = $date_orig; |
|
| 2634 | + } else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet |
|
| 2635 | + // Si aucune déclaration trouvée, on quitte |
|
| 2636 | + if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) { |
|
| 2637 | + return ''; |
|
| 2638 | + } |
|
| 2639 | + // Par défaut, on prend le champ date déclaré dans l'API |
|
| 2640 | + $pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date']; |
|
| 2641 | + |
|
| 2642 | + // Si c'est pour du relatif |
|
| 2643 | + if (isset($regs[2]) and $rel = $regs[2]) { |
|
| 2644 | + $pred = 'date'; |
|
| 2645 | + } |
|
| 2646 | + } |
|
| 2647 | + |
|
| 2648 | + $date_compare = "\"' . normaliser_date(" . |
|
| 2649 | + calculer_argument_precedent($idb, $pred, $boucles) . |
|
| 2650 | + ") . '\""; |
|
| 2651 | + |
|
| 2652 | + $col_vraie = $date_orig; |
|
| 2653 | + $date_orig = $boucle->id_table . '.' . $date_orig; |
|
| 2654 | + |
|
| 2655 | + switch ($col) { |
|
| 2656 | + case 'date': |
|
| 2657 | + $col = $date_orig; |
|
| 2658 | + break; |
|
| 2659 | + case 'jour': |
|
| 2660 | + $col = "DAYOFMONTH($date_orig)"; |
|
| 2661 | + break; |
|
| 2662 | + case 'mois': |
|
| 2663 | + $col = "MONTH($date_orig)"; |
|
| 2664 | + break; |
|
| 2665 | + case 'annee': |
|
| 2666 | + $col = "YEAR($date_orig)"; |
|
| 2667 | + break; |
|
| 2668 | + case 'heure': |
|
| 2669 | + $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')"; |
|
| 2670 | + break; |
|
| 2671 | + case 'age': |
|
| 2672 | + $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig); |
|
| 2673 | + $col_vraie = '';// comparer a un int (par defaut) |
|
| 2674 | + break; |
|
| 2675 | + case 'age_relatif': |
|
| 2676 | + $col = calculer_param_date($date_compare, $date_orig); |
|
| 2677 | + $col_vraie = '';// comparer a un int (par defaut) |
|
| 2678 | + break; |
|
| 2679 | + case 'jour_relatif': |
|
| 2680 | + $col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))'; |
|
| 2681 | + $col_vraie = '';// comparer a un int (par defaut) |
|
| 2682 | + break; |
|
| 2683 | + case 'mois_relatif': |
|
| 2684 | + $col = 'MONTH(' . $date_compare . ')-MONTH(' . |
|
| 2685 | + $date_orig . ')+12*(YEAR(' . $date_compare . |
|
| 2686 | + ')-YEAR(' . $date_orig . '))'; |
|
| 2687 | + $col_vraie = '';// comparer a un int (par defaut) |
|
| 2688 | + break; |
|
| 2689 | + case 'annee_relatif': |
|
| 2690 | + $col = 'YEAR(' . $date_compare . ')-YEAR(' . |
|
| 2691 | + $date_orig . ')'; |
|
| 2692 | + $col_vraie = '';// comparer a un int (par defaut) |
|
| 2693 | + break; |
|
| 2694 | + } |
|
| 2695 | + |
|
| 2696 | + return [$col, $col_vraie]; |
|
| 2697 | 2697 | } |
| 2698 | 2698 | |
| 2699 | 2699 | /** |
@@ -2712,16 +2712,16 @@ discard block |
||
| 2712 | 2712 | * de colonne SQL et une date. |
| 2713 | 2713 | **/ |
| 2714 | 2714 | function calculer_param_date($date_compare, $date_orig) { |
| 2715 | - if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) { |
|
| 2716 | - $init = "'\" . (\$x = $r[1]) . \"'"; |
|
| 2717 | - $date_compare = '\'$x\''; |
|
| 2718 | - } else { |
|
| 2719 | - $init = $date_compare; |
|
| 2720 | - } |
|
| 2721 | - |
|
| 2722 | - return |
|
| 2723 | - // optimisation : mais prevoir le support SQLite avant |
|
| 2724 | - "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24"; |
|
| 2715 | + if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) { |
|
| 2716 | + $init = "'\" . (\$x = $r[1]) . \"'"; |
|
| 2717 | + $date_compare = '\'$x\''; |
|
| 2718 | + } else { |
|
| 2719 | + $init = $date_compare; |
|
| 2720 | + } |
|
| 2721 | + |
|
| 2722 | + return |
|
| 2723 | + // optimisation : mais prevoir le support SQLite avant |
|
| 2724 | + "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24"; |
|
| 2725 | 2725 | } |
| 2726 | 2726 | |
| 2727 | 2727 | /** |
@@ -2739,20 +2739,20 @@ discard block |
||
| 2739 | 2739 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 2740 | 2740 | */ |
| 2741 | 2741 | function critere_DATA_source_dist($idb, &$boucles, $crit) { |
| 2742 | - $boucle = &$boucles[$idb]; |
|
| 2743 | - |
|
| 2744 | - $args = []; |
|
| 2745 | - foreach ($crit->param as &$param) { |
|
| 2746 | - array_push( |
|
| 2747 | - $args, |
|
| 2748 | - calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) |
|
| 2749 | - ); |
|
| 2750 | - } |
|
| 2742 | + $boucle = &$boucles[$idb]; |
|
| 2751 | 2743 | |
| 2752 | - $boucle->hash .= ' |
|
| 2744 | + $args = []; |
|
| 2745 | + foreach ($crit->param as &$param) { |
|
| 2746 | + array_push( |
|
| 2747 | + $args, |
|
| 2748 | + calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) |
|
| 2749 | + ); |
|
| 2750 | + } |
|
| 2751 | + |
|
| 2752 | + $boucle->hash .= ' |
|
| 2753 | 2753 | $command[\'sourcemode\'] = ' . array_shift($args) . ";\n"; |
| 2754 | 2754 | |
| 2755 | - $boucle->hash .= ' |
|
| 2755 | + $boucle->hash .= ' |
|
| 2756 | 2756 | $command[\'source\'] = array(' . join(', ', $args) . ");\n"; |
| 2757 | 2757 | } |
| 2758 | 2758 | |
@@ -2770,8 +2770,8 @@ discard block |
||
| 2770 | 2770 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 2771 | 2771 | */ |
| 2772 | 2772 | function critere_DATA_datacache_dist($idb, &$boucles, $crit) { |
| 2773 | - $boucle = &$boucles[$idb]; |
|
| 2774 | - $boucle->hash .= ' |
|
| 2773 | + $boucle = &$boucles[$idb]; |
|
| 2774 | + $boucle->hash .= ' |
|
| 2775 | 2775 | $command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';'; |
| 2776 | 2776 | } |
| 2777 | 2777 | |
@@ -2787,12 +2787,12 @@ discard block |
||
| 2787 | 2787 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 2788 | 2788 | */ |
| 2789 | 2789 | function critere_php_args_dist($idb, &$boucles, $crit) { |
| 2790 | - $boucle = &$boucles[$idb]; |
|
| 2791 | - $boucle->hash .= '$command[\'args\']=array();'; |
|
| 2792 | - foreach ($crit->param as $param) { |
|
| 2793 | - $boucle->hash .= ' |
|
| 2790 | + $boucle = &$boucles[$idb]; |
|
| 2791 | + $boucle->hash .= '$command[\'args\']=array();'; |
|
| 2792 | + foreach ($crit->param as $param) { |
|
| 2793 | + $boucle->hash .= ' |
|
| 2794 | 2794 | $command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';'; |
| 2795 | - } |
|
| 2795 | + } |
|
| 2796 | 2796 | } |
| 2797 | 2797 | |
| 2798 | 2798 | /** |
@@ -2809,16 +2809,16 @@ discard block |
||
| 2809 | 2809 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 2810 | 2810 | */ |
| 2811 | 2811 | function critere_DATA_liste_dist($idb, &$boucles, $crit) { |
| 2812 | - $boucle = &$boucles[$idb]; |
|
| 2813 | - $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n"; |
|
| 2814 | - foreach ($crit->param as $param) { |
|
| 2815 | - $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste( |
|
| 2816 | - $param, |
|
| 2817 | - $idb, |
|
| 2818 | - $boucles, |
|
| 2819 | - $boucles[$idb]->id_parent |
|
| 2820 | - ) . ";\n"; |
|
| 2821 | - } |
|
| 2812 | + $boucle = &$boucles[$idb]; |
|
| 2813 | + $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n"; |
|
| 2814 | + foreach ($crit->param as $param) { |
|
| 2815 | + $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste( |
|
| 2816 | + $param, |
|
| 2817 | + $idb, |
|
| 2818 | + $boucles, |
|
| 2819 | + $boucles[$idb]->id_parent |
|
| 2820 | + ) . ";\n"; |
|
| 2821 | + } |
|
| 2822 | 2822 | } |
| 2823 | 2823 | |
| 2824 | 2824 | /** |
@@ -2843,16 +2843,16 @@ discard block |
||
| 2843 | 2843 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 2844 | 2844 | */ |
| 2845 | 2845 | function critere_DATA_enum_dist($idb, &$boucles, $crit) { |
| 2846 | - $boucle = &$boucles[$idb]; |
|
| 2847 | - $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n"; |
|
| 2848 | - foreach ($crit->param as $param) { |
|
| 2849 | - $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste( |
|
| 2850 | - $param, |
|
| 2851 | - $idb, |
|
| 2852 | - $boucles, |
|
| 2853 | - $boucles[$idb]->id_parent |
|
| 2854 | - ) . ";\n"; |
|
| 2855 | - } |
|
| 2846 | + $boucle = &$boucles[$idb]; |
|
| 2847 | + $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n"; |
|
| 2848 | + foreach ($crit->param as $param) { |
|
| 2849 | + $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste( |
|
| 2850 | + $param, |
|
| 2851 | + $idb, |
|
| 2852 | + $boucles, |
|
| 2853 | + $boucles[$idb]->id_parent |
|
| 2854 | + ) . ";\n"; |
|
| 2855 | + } |
|
| 2856 | 2856 | } |
| 2857 | 2857 | |
| 2858 | 2858 | /** |
@@ -2867,11 +2867,11 @@ discard block |
||
| 2867 | 2867 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 2868 | 2868 | */ |
| 2869 | 2869 | function critere_DATA_datapath_dist($idb, &$boucles, $crit) { |
| 2870 | - $boucle = &$boucles[$idb]; |
|
| 2871 | - foreach ($crit->param as $param) { |
|
| 2872 | - $boucle->hash .= ' |
|
| 2870 | + $boucle = &$boucles[$idb]; |
|
| 2871 | + foreach ($crit->param as $param) { |
|
| 2872 | + $boucle->hash .= ' |
|
| 2873 | 2873 | $command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';'; |
| 2874 | - } |
|
| 2874 | + } |
|
| 2875 | 2875 | } |
| 2876 | 2876 | |
| 2877 | 2877 | |
@@ -2903,20 +2903,20 @@ discard block |
||
| 2903 | 2903 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 2904 | 2904 | */ |
| 2905 | 2905 | function critere_si_dist($idb, &$boucles, $crit) { |
| 2906 | - $boucle = &$boucles[$idb]; |
|
| 2907 | - // il faut initialiser 1 fois le tableau a chaque appel de la boucle |
|
| 2908 | - // (par exemple lorsque notre boucle est appelee dans une autre boucle) |
|
| 2909 | - // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle ! |
|
| 2910 | - $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n"; |
|
| 2911 | - if ($crit->param) { |
|
| 2912 | - foreach ($crit->param as $param) { |
|
| 2913 | - $boucle->hash .= "\t\$command['si'][] = " |
|
| 2914 | - . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n"; |
|
| 2915 | - } |
|
| 2916 | - // interdire {si 0} aussi ! |
|
| 2917 | - } else { |
|
| 2918 | - $boucle->hash .= '$command[\'si\'][] = 0;'; |
|
| 2919 | - } |
|
| 2906 | + $boucle = &$boucles[$idb]; |
|
| 2907 | + // il faut initialiser 1 fois le tableau a chaque appel de la boucle |
|
| 2908 | + // (par exemple lorsque notre boucle est appelee dans une autre boucle) |
|
| 2909 | + // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle ! |
|
| 2910 | + $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n"; |
|
| 2911 | + if ($crit->param) { |
|
| 2912 | + foreach ($crit->param as $param) { |
|
| 2913 | + $boucle->hash .= "\t\$command['si'][] = " |
|
| 2914 | + . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n"; |
|
| 2915 | + } |
|
| 2916 | + // interdire {si 0} aussi ! |
|
| 2917 | + } else { |
|
| 2918 | + $boucle->hash .= '$command[\'si\'][] = 0;'; |
|
| 2919 | + } |
|
| 2920 | 2920 | } |
| 2921 | 2921 | |
| 2922 | 2922 | /** |
@@ -2933,8 +2933,8 @@ discard block |
||
| 2933 | 2933 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 2934 | 2934 | */ |
| 2935 | 2935 | function critere_POUR_tableau_dist($idb, &$boucles, $crit) { |
| 2936 | - $boucle = &$boucles[$idb]; |
|
| 2937 | - $boucle->hash .= ' |
|
| 2936 | + $boucle = &$boucles[$idb]; |
|
| 2937 | + $boucle->hash .= ' |
|
| 2938 | 2938 | $command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . '); |
| 2939 | 2939 | $command[\'sourcemode\'] = \'table\';'; |
| 2940 | 2940 | } |
@@ -2955,27 +2955,27 @@ discard block |
||
| 2955 | 2955 | */ |
| 2956 | 2956 | function critere_noeud_dist($idb, &$boucles, $crit) { |
| 2957 | 2957 | |
| 2958 | - $not = $crit->not; |
|
| 2959 | - $boucle = &$boucles[$idb]; |
|
| 2960 | - $primary = $boucle->primary; |
|
| 2958 | + $not = $crit->not; |
|
| 2959 | + $boucle = &$boucles[$idb]; |
|
| 2960 | + $primary = $boucle->primary; |
|
| 2961 | 2961 | |
| 2962 | - if (!$primary or strpos($primary, ',')) { |
|
| 2963 | - erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle); |
|
| 2962 | + if (!$primary or strpos($primary, ',')) { |
|
| 2963 | + erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle); |
|
| 2964 | 2964 | |
| 2965 | - return; |
|
| 2966 | - } |
|
| 2967 | - $table = $boucle->type_requete; |
|
| 2968 | - $table_sql = table_objet_sql(objet_type($table)); |
|
| 2965 | + return; |
|
| 2966 | + } |
|
| 2967 | + $table = $boucle->type_requete; |
|
| 2968 | + $table_sql = table_objet_sql(objet_type($table)); |
|
| 2969 | 2969 | |
| 2970 | - $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent'; |
|
| 2970 | + $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent'; |
|
| 2971 | 2971 | |
| 2972 | - $in = 'IN'; |
|
| 2973 | - $where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"]; |
|
| 2974 | - if ($not) { |
|
| 2975 | - $where = ["'NOT'", $where]; |
|
| 2976 | - } |
|
| 2972 | + $in = 'IN'; |
|
| 2973 | + $where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"]; |
|
| 2974 | + if ($not) { |
|
| 2975 | + $where = ["'NOT'", $where]; |
|
| 2976 | + } |
|
| 2977 | 2977 | |
| 2978 | - $boucle->where[] = $where; |
|
| 2978 | + $boucle->where[] = $where; |
|
| 2979 | 2979 | } |
| 2980 | 2980 | |
| 2981 | 2981 | /** |
@@ -2991,8 +2991,8 @@ discard block |
||
| 2991 | 2991 | * @param Critere $crit Paramètres du critère dans cette boucle |
| 2992 | 2992 | */ |
| 2993 | 2993 | function critere_feuille_dist($idb, &$boucles, $crit) { |
| 2994 | - $not = $crit->not; |
|
| 2995 | - $crit->not = $not ? false : true; |
|
| 2996 | - critere_noeud_dist($idb, $boucles, $crit); |
|
| 2997 | - $crit->not = $not; |
|
| 2994 | + $not = $crit->not; |
|
| 2995 | + $crit->not = $not ? false : true; |
|
| 2996 | + critere_noeud_dist($idb, $boucles, $crit); |
|
| 2997 | + $crit->not = $not; |
|
| 2998 | 2998 | } |
@@ -26,7 +26,7 @@ discard block |
||
| 26 | 26 | **/ |
| 27 | 27 | |
| 28 | 28 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 29 | - return; |
|
| 29 | + return; |
|
| 30 | 30 | } |
| 31 | 31 | |
| 32 | 32 | /** |
@@ -48,16 +48,16 @@ discard block |
||
| 48 | 48 | * Code PHP si cet argument est présent, sinon null |
| 49 | 49 | **/ |
| 50 | 50 | function interprete_argument_balise(int $n, Champ $p): ?string { |
| 51 | - if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) { |
|
| 52 | - return calculer_liste( |
|
| 53 | - $p->param[0][$n], |
|
| 54 | - $p->descr, |
|
| 55 | - $p->boucles, |
|
| 56 | - $p->id_boucle |
|
| 57 | - ); |
|
| 58 | - } else { |
|
| 59 | - return null; |
|
| 60 | - } |
|
| 51 | + if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) { |
|
| 52 | + return calculer_liste( |
|
| 53 | + $p->param[0][$n], |
|
| 54 | + $p->descr, |
|
| 55 | + $p->boucles, |
|
| 56 | + $p->id_boucle |
|
| 57 | + ); |
|
| 58 | + } else { |
|
| 59 | + return null; |
|
| 60 | + } |
|
| 61 | 61 | } |
| 62 | 62 | |
| 63 | 63 | |
@@ -77,10 +77,10 @@ discard block |
||
| 77 | 77 | * Pile complétée par le code à générer |
| 78 | 78 | **/ |
| 79 | 79 | function balise_NOM_SITE_SPIP_dist($p) { |
| 80 | - $p->code = "\$GLOBALS['meta']['nom_site']"; |
|
| 80 | + $p->code = "\$GLOBALS['meta']['nom_site']"; |
|
| 81 | 81 | |
| 82 | - #$p->interdire_scripts = true; |
|
| 83 | - return $p; |
|
| 82 | + #$p->interdire_scripts = true; |
|
| 83 | + return $p; |
|
| 84 | 84 | } |
| 85 | 85 | |
| 86 | 86 | /** |
@@ -96,10 +96,10 @@ discard block |
||
| 96 | 96 | * Pile complétée par le code à générer |
| 97 | 97 | **/ |
| 98 | 98 | function balise_EMAIL_WEBMASTER_dist($p) { |
| 99 | - $p->code = "\$GLOBALS['meta']['email_webmaster']"; |
|
| 99 | + $p->code = "\$GLOBALS['meta']['email_webmaster']"; |
|
| 100 | 100 | |
| 101 | - #$p->interdire_scripts = true; |
|
| 102 | - return $p; |
|
| 101 | + #$p->interdire_scripts = true; |
|
| 102 | + return $p; |
|
| 103 | 103 | } |
| 104 | 104 | |
| 105 | 105 | /** |
@@ -115,10 +115,10 @@ discard block |
||
| 115 | 115 | * Pile complétée par le code à générer |
| 116 | 116 | **/ |
| 117 | 117 | function balise_DESCRIPTIF_SITE_SPIP_dist($p) { |
| 118 | - $p->code = "\$GLOBALS['meta']['descriptif_site']"; |
|
| 118 | + $p->code = "\$GLOBALS['meta']['descriptif_site']"; |
|
| 119 | 119 | |
| 120 | - #$p->interdire_scripts = true; |
|
| 121 | - return $p; |
|
| 120 | + #$p->interdire_scripts = true; |
|
| 121 | + return $p; |
|
| 122 | 122 | } |
| 123 | 123 | |
| 124 | 124 | |
@@ -139,10 +139,10 @@ discard block |
||
| 139 | 139 | * Pile complétée par le code à générer |
| 140 | 140 | **/ |
| 141 | 141 | function balise_CHARSET_dist($p) { |
| 142 | - $p->code = "\$GLOBALS['meta']['charset']"; |
|
| 142 | + $p->code = "\$GLOBALS['meta']['charset']"; |
|
| 143 | 143 | |
| 144 | - #$p->interdire_scripts = true; |
|
| 145 | - return $p; |
|
| 144 | + #$p->interdire_scripts = true; |
|
| 145 | + return $p; |
|
| 146 | 146 | } |
| 147 | 147 | |
| 148 | 148 | /** |
@@ -167,11 +167,11 @@ discard block |
||
| 167 | 167 | * Pile complétée par le code à générer |
| 168 | 168 | **/ |
| 169 | 169 | function balise_LANG_LEFT_dist($p) { |
| 170 | - $_lang = champ_sql('lang', $p); |
|
| 171 | - $p->code = "lang_dir($_lang, 'left','right')"; |
|
| 172 | - $p->interdire_scripts = false; |
|
| 170 | + $_lang = champ_sql('lang', $p); |
|
| 171 | + $p->code = "lang_dir($_lang, 'left','right')"; |
|
| 172 | + $p->interdire_scripts = false; |
|
| 173 | 173 | |
| 174 | - return $p; |
|
| 174 | + return $p; |
|
| 175 | 175 | } |
| 176 | 176 | |
| 177 | 177 | /** |
@@ -191,11 +191,11 @@ discard block |
||
| 191 | 191 | * Pile complétée par le code à générer |
| 192 | 192 | **/ |
| 193 | 193 | function balise_LANG_RIGHT_dist($p) { |
| 194 | - $_lang = champ_sql('lang', $p); |
|
| 195 | - $p->code = "lang_dir($_lang, 'right','left')"; |
|
| 196 | - $p->interdire_scripts = false; |
|
| 194 | + $_lang = champ_sql('lang', $p); |
|
| 195 | + $p->code = "lang_dir($_lang, 'right','left')"; |
|
| 196 | + $p->interdire_scripts = false; |
|
| 197 | 197 | |
| 198 | - return $p; |
|
| 198 | + return $p; |
|
| 199 | 199 | } |
| 200 | 200 | |
| 201 | 201 | /** |
@@ -220,11 +220,11 @@ discard block |
||
| 220 | 220 | * Pile complétée par le code à générer |
| 221 | 221 | **/ |
| 222 | 222 | function balise_LANG_DIR_dist($p) { |
| 223 | - $_lang = champ_sql('lang', $p); |
|
| 224 | - $p->code = "lang_dir($_lang, 'ltr','rtl')"; |
|
| 225 | - $p->interdire_scripts = false; |
|
| 223 | + $_lang = champ_sql('lang', $p); |
|
| 224 | + $p->code = "lang_dir($_lang, 'ltr','rtl')"; |
|
| 225 | + $p->interdire_scripts = false; |
|
| 226 | 226 | |
| 227 | - return $p; |
|
| 227 | + return $p; |
|
| 228 | 228 | } |
| 229 | 229 | |
| 230 | 230 | |
@@ -241,10 +241,10 @@ discard block |
||
| 241 | 241 | * Pile complétée par le code à générer |
| 242 | 242 | **/ |
| 243 | 243 | function balise_PUCE_dist($p) { |
| 244 | - $p->code = 'definir_puce()'; |
|
| 245 | - $p->interdire_scripts = false; |
|
| 244 | + $p->code = 'definir_puce()'; |
|
| 245 | + $p->interdire_scripts = false; |
|
| 246 | 246 | |
| 247 | - return $p; |
|
| 247 | + return $p; |
|
| 248 | 248 | } |
| 249 | 249 | |
| 250 | 250 | |
@@ -268,9 +268,9 @@ discard block |
||
| 268 | 268 | * Pile completée du code PHP d'exécution de la balise |
| 269 | 269 | */ |
| 270 | 270 | function balise_DATE_dist($p) { |
| 271 | - $p->code = champ_sql('date', $p); |
|
| 271 | + $p->code = champ_sql('date', $p); |
|
| 272 | 272 | |
| 273 | - return $p; |
|
| 273 | + return $p; |
|
| 274 | 274 | } |
| 275 | 275 | |
| 276 | 276 | |
@@ -290,10 +290,10 @@ discard block |
||
| 290 | 290 | * Pile completée du code PHP d'exécution de la balise |
| 291 | 291 | */ |
| 292 | 292 | function balise_DATE_REDAC_dist($p) { |
| 293 | - $p->code = champ_sql('date_redac', $p); |
|
| 294 | - $p->interdire_scripts = false; |
|
| 293 | + $p->code = champ_sql('date_redac', $p); |
|
| 294 | + $p->interdire_scripts = false; |
|
| 295 | 295 | |
| 296 | - return $p; |
|
| 296 | + return $p; |
|
| 297 | 297 | } |
| 298 | 298 | |
| 299 | 299 | /** |
@@ -312,10 +312,10 @@ discard block |
||
| 312 | 312 | * Pile completée du code PHP d'exécution de la balise |
| 313 | 313 | */ |
| 314 | 314 | function balise_DATE_MODIF_dist($p) { |
| 315 | - $p->code = champ_sql('date_modif', $p); |
|
| 316 | - $p->interdire_scripts = false; |
|
| 315 | + $p->code = champ_sql('date_modif', $p); |
|
| 316 | + $p->interdire_scripts = false; |
|
| 317 | 317 | |
| 318 | - return $p; |
|
| 318 | + return $p; |
|
| 319 | 319 | } |
| 320 | 320 | |
| 321 | 321 | /** |
@@ -333,13 +333,13 @@ discard block |
||
| 333 | 333 | * Pile completée du code PHP d'exécution de la balise |
| 334 | 334 | */ |
| 335 | 335 | function balise_DATE_NOUVEAUTES_dist($p) { |
| 336 | - $p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui' |
|
| 336 | + $p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui' |
|
| 337 | 337 | AND isset(\$GLOBALS['meta']['dernier_envoi_neuf'])) ? |
| 338 | 338 | \$GLOBALS['meta']['dernier_envoi_neuf'] : |
| 339 | 339 | \"'0000-00-00'\")"; |
| 340 | - $p->interdire_scripts = false; |
|
| 340 | + $p->interdire_scripts = false; |
|
| 341 | 341 | |
| 342 | - return $p; |
|
| 342 | + return $p; |
|
| 343 | 343 | } |
| 344 | 344 | |
| 345 | 345 | |
@@ -357,11 +357,11 @@ discard block |
||
| 357 | 357 | * Pile completée du code PHP d'exécution de la balise |
| 358 | 358 | */ |
| 359 | 359 | function balise_DOSSIER_SQUELETTE_dist($p) { |
| 360 | - $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE)); |
|
| 361 | - $p->code = "_DIR_RACINE . '$code'" . |
|
| 362 | - $p->interdire_scripts = false; |
|
| 360 | + $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE)); |
|
| 361 | + $p->code = "_DIR_RACINE . '$code'" . |
|
| 362 | + $p->interdire_scripts = false; |
|
| 363 | 363 | |
| 364 | - return $p; |
|
| 364 | + return $p; |
|
| 365 | 365 | } |
| 366 | 366 | |
| 367 | 367 | /** |
@@ -376,11 +376,11 @@ discard block |
||
| 376 | 376 | * Pile completée du code PHP d'exécution de la balise |
| 377 | 377 | */ |
| 378 | 378 | function balise_SQUELETTE_dist($p) { |
| 379 | - $code = addslashes($p->descr['sourcefile']); |
|
| 380 | - $p->code = "'$code'" . |
|
| 381 | - $p->interdire_scripts = false; |
|
| 379 | + $code = addslashes($p->descr['sourcefile']); |
|
| 380 | + $p->code = "'$code'" . |
|
| 381 | + $p->interdire_scripts = false; |
|
| 382 | 382 | |
| 383 | - return $p; |
|
| 383 | + return $p; |
|
| 384 | 384 | } |
| 385 | 385 | |
| 386 | 386 | /** |
@@ -399,10 +399,10 @@ discard block |
||
| 399 | 399 | * Pile completée du code PHP d'exécution de la balise |
| 400 | 400 | */ |
| 401 | 401 | function balise_SPIP_VERSION_dist($p) { |
| 402 | - $p->code = 'spip_version()'; |
|
| 403 | - $p->interdire_scripts = false; |
|
| 402 | + $p->code = 'spip_version()'; |
|
| 403 | + $p->interdire_scripts = false; |
|
| 404 | 404 | |
| 405 | - return $p; |
|
| 405 | + return $p; |
|
| 406 | 406 | } |
| 407 | 407 | |
| 408 | 408 | |
@@ -428,18 +428,18 @@ discard block |
||
| 428 | 428 | * Pile complétée par le code à générer |
| 429 | 429 | **/ |
| 430 | 430 | function balise_NOM_SITE_dist($p) { |
| 431 | - if (!$p->etoile) { |
|
| 432 | - $p->code = 'supprimer_numero(calculer_url(' . |
|
| 433 | - champ_sql('url_site', $p) . ',' . |
|
| 434 | - champ_sql('nom_site', $p) . |
|
| 435 | - ", 'titre', \$connect, false))"; |
|
| 436 | - } else { |
|
| 437 | - $p->code = champ_sql('nom_site', $p); |
|
| 438 | - } |
|
| 431 | + if (!$p->etoile) { |
|
| 432 | + $p->code = 'supprimer_numero(calculer_url(' . |
|
| 433 | + champ_sql('url_site', $p) . ',' . |
|
| 434 | + champ_sql('nom_site', $p) . |
|
| 435 | + ", 'titre', \$connect, false))"; |
|
| 436 | + } else { |
|
| 437 | + $p->code = champ_sql('nom_site', $p); |
|
| 438 | + } |
|
| 439 | 439 | |
| 440 | - $p->interdire_scripts = true; |
|
| 440 | + $p->interdire_scripts = true; |
|
| 441 | 441 | |
| 442 | - return $p; |
|
| 442 | + return $p; |
|
| 443 | 443 | } |
| 444 | 444 | |
| 445 | 445 | |
@@ -456,11 +456,11 @@ discard block |
||
| 456 | 456 | * Pile complétée par le code à générer |
| 457 | 457 | **/ |
| 458 | 458 | function balise_NOTES_dist($p) { |
| 459 | - // Recuperer les notes |
|
| 460 | - $p->code = 'calculer_notes()'; |
|
| 459 | + // Recuperer les notes |
|
| 460 | + $p->code = 'calculer_notes()'; |
|
| 461 | 461 | |
| 462 | - #$p->interdire_scripts = true; |
|
| 463 | - return $p; |
|
| 462 | + #$p->interdire_scripts = true; |
|
| 463 | + return $p; |
|
| 464 | 464 | } |
| 465 | 465 | |
| 466 | 466 | |
@@ -482,10 +482,10 @@ discard block |
||
| 482 | 482 | * Pile complétée par le code à générer |
| 483 | 483 | **/ |
| 484 | 484 | function balise_RECHERCHE_dist($p) { |
| 485 | - $p->code = 'entites_html(_request("recherche"))'; |
|
| 486 | - $p->interdire_scripts = false; |
|
| 485 | + $p->code = 'entites_html(_request("recherche"))'; |
|
| 486 | + $p->interdire_scripts = false; |
|
| 487 | 487 | |
| 488 | - return $p; |
|
| 488 | + return $p; |
|
| 489 | 489 | } |
| 490 | 490 | |
| 491 | 491 | |
@@ -503,17 +503,17 @@ discard block |
||
| 503 | 503 | * Pile complétée par le code à générer |
| 504 | 504 | **/ |
| 505 | 505 | function balise_COMPTEUR_BOUCLE_dist($p) { |
| 506 | - $b = index_boucle_mere($p); |
|
| 507 | - if ($b === '') { |
|
| 508 | - $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]]; |
|
| 509 | - erreur_squelette($msg, $p); |
|
| 510 | - } else { |
|
| 511 | - $p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)"; |
|
| 512 | - $p->boucles[$b]->cptrows = true; |
|
| 513 | - $p->interdire_scripts = false; |
|
| 506 | + $b = index_boucle_mere($p); |
|
| 507 | + if ($b === '') { |
|
| 508 | + $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]]; |
|
| 509 | + erreur_squelette($msg, $p); |
|
| 510 | + } else { |
|
| 511 | + $p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)"; |
|
| 512 | + $p->boucles[$b]->cptrows = true; |
|
| 513 | + $p->interdire_scripts = false; |
|
| 514 | 514 | |
| 515 | - return $p; |
|
| 516 | - } |
|
| 515 | + return $p; |
|
| 516 | + } |
|
| 517 | 517 | } |
| 518 | 518 | |
| 519 | 519 | /** |
@@ -531,17 +531,17 @@ discard block |
||
| 531 | 531 | * Pile complétée par le code à générer |
| 532 | 532 | **/ |
| 533 | 533 | function balise_TOTAL_BOUCLE_dist($p) { |
| 534 | - $b = index_boucle_mere($p); |
|
| 535 | - if ($b === '') { |
|
| 536 | - $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]]; |
|
| 537 | - erreur_squelette($msg, $p); |
|
| 538 | - } else { |
|
| 539 | - $p->code = "(\$Numrows['$b']['total'] ?? 0)"; |
|
| 540 | - $p->boucles[$b]->numrows = true; |
|
| 541 | - $p->interdire_scripts = false; |
|
| 542 | - } |
|
| 534 | + $b = index_boucle_mere($p); |
|
| 535 | + if ($b === '') { |
|
| 536 | + $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]]; |
|
| 537 | + erreur_squelette($msg, $p); |
|
| 538 | + } else { |
|
| 539 | + $p->code = "(\$Numrows['$b']['total'] ?? 0)"; |
|
| 540 | + $p->boucles[$b]->numrows = true; |
|
| 541 | + $p->interdire_scripts = false; |
|
| 542 | + } |
|
| 543 | 543 | |
| 544 | - return $p; |
|
| 544 | + return $p; |
|
| 545 | 545 | } |
| 546 | 546 | |
| 547 | 547 | |
@@ -561,7 +561,7 @@ discard block |
||
| 561 | 561 | * Pile complétée par le code à générer |
| 562 | 562 | **/ |
| 563 | 563 | function balise_POINTS_dist($p) { |
| 564 | - return rindex_pile($p, 'points', 'recherche'); |
|
| 564 | + return rindex_pile($p, 'points', 'recherche'); |
|
| 565 | 565 | } |
| 566 | 566 | |
| 567 | 567 | |
@@ -582,12 +582,12 @@ discard block |
||
| 582 | 582 | * Pile complétée par le code à générer |
| 583 | 583 | **/ |
| 584 | 584 | function balise_POPULARITE_ABSOLUE_dist($p) { |
| 585 | - $p->code = 'ceil(' . |
|
| 586 | - champ_sql('popularite', $p) . |
|
| 587 | - ')'; |
|
| 588 | - $p->interdire_scripts = false; |
|
| 585 | + $p->code = 'ceil(' . |
|
| 586 | + champ_sql('popularite', $p) . |
|
| 587 | + ')'; |
|
| 588 | + $p->interdire_scripts = false; |
|
| 589 | 589 | |
| 590 | - return $p; |
|
| 590 | + return $p; |
|
| 591 | 591 | } |
| 592 | 592 | |
| 593 | 593 | /** |
@@ -607,10 +607,10 @@ discard block |
||
| 607 | 607 | * Pile complétée par le code à générer |
| 608 | 608 | **/ |
| 609 | 609 | function balise_POPULARITE_SITE_dist($p) { |
| 610 | - $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])'; |
|
| 611 | - $p->interdire_scripts = false; |
|
| 610 | + $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])'; |
|
| 611 | + $p->interdire_scripts = false; |
|
| 612 | 612 | |
| 613 | - return $p; |
|
| 613 | + return $p; |
|
| 614 | 614 | } |
| 615 | 615 | |
| 616 | 616 | /** |
@@ -631,10 +631,10 @@ discard block |
||
| 631 | 631 | * Pile complétée par le code à générer |
| 632 | 632 | **/ |
| 633 | 633 | function balise_POPULARITE_MAX_dist($p) { |
| 634 | - $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])'; |
|
| 635 | - $p->interdire_scripts = false; |
|
| 634 | + $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])'; |
|
| 635 | + $p->interdire_scripts = false; |
|
| 636 | 636 | |
| 637 | - return $p; |
|
| 637 | + return $p; |
|
| 638 | 638 | } |
| 639 | 639 | |
| 640 | 640 | |
@@ -660,15 +660,15 @@ discard block |
||
| 660 | 660 | * Pile complétée par le code à générer |
| 661 | 661 | **/ |
| 662 | 662 | function balise_VALEUR_dist($p) { |
| 663 | - $b = $p->nom_boucle ?: $p->id_boucle; |
|
| 664 | - $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b); |
|
| 663 | + $b = $p->nom_boucle ?: $p->id_boucle; |
|
| 664 | + $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b); |
|
| 665 | 665 | ; |
| 666 | - if (($v = interprete_argument_balise(1, $p)) !== null) { |
|
| 667 | - $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')'; |
|
| 668 | - } |
|
| 669 | - $p->interdire_scripts = true; |
|
| 666 | + if (($v = interprete_argument_balise(1, $p)) !== null) { |
|
| 667 | + $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')'; |
|
| 668 | + } |
|
| 669 | + $p->interdire_scripts = true; |
|
| 670 | 670 | |
| 671 | - return $p; |
|
| 671 | + return $p; |
|
| 672 | 672 | } |
| 673 | 673 | |
| 674 | 674 | /** |
@@ -697,16 +697,16 @@ discard block |
||
| 697 | 697 | * Pile complétée par le code à générer |
| 698 | 698 | **/ |
| 699 | 699 | function balise_EXPOSE_dist($p) { |
| 700 | - $on = "'on'"; |
|
| 701 | - $off = "''"; |
|
| 702 | - if (($v = interprete_argument_balise(1, $p)) !== null) { |
|
| 703 | - $on = $v; |
|
| 704 | - if (($v = interprete_argument_balise(2, $p)) !== null) { |
|
| 705 | - $off = $v; |
|
| 706 | - } |
|
| 707 | - } |
|
| 700 | + $on = "'on'"; |
|
| 701 | + $off = "''"; |
|
| 702 | + if (($v = interprete_argument_balise(1, $p)) !== null) { |
|
| 703 | + $on = $v; |
|
| 704 | + if (($v = interprete_argument_balise(2, $p)) !== null) { |
|
| 705 | + $off = $v; |
|
| 706 | + } |
|
| 707 | + } |
|
| 708 | 708 | |
| 709 | - return calculer_balise_expose($p, $on, $off); |
|
| 709 | + return calculer_balise_expose($p, $on, $off); |
|
| 710 | 710 | } |
| 711 | 711 | |
| 712 | 712 | /** |
@@ -724,35 +724,35 @@ discard block |
||
| 724 | 724 | * Pile complétée par le code à générer |
| 725 | 725 | **/ |
| 726 | 726 | function calculer_balise_expose($p, $on, $off) { |
| 727 | - $b = index_boucle($p); |
|
| 728 | - if (empty($p->boucles[$b]->primary)) { |
|
| 729 | - $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]]; |
|
| 730 | - erreur_squelette($msg, $p); |
|
| 731 | - } else { |
|
| 732 | - $key = $p->boucles[$b]->primary; |
|
| 733 | - $type = $p->boucles[$p->id_boucle]->primary; |
|
| 734 | - $desc = $p->boucles[$b]->show; |
|
| 735 | - $connect = sql_quote($p->boucles[$b]->sql_serveur); |
|
| 727 | + $b = index_boucle($p); |
|
| 728 | + if (empty($p->boucles[$b]->primary)) { |
|
| 729 | + $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]]; |
|
| 730 | + erreur_squelette($msg, $p); |
|
| 731 | + } else { |
|
| 732 | + $key = $p->boucles[$b]->primary; |
|
| 733 | + $type = $p->boucles[$p->id_boucle]->primary; |
|
| 734 | + $desc = $p->boucles[$b]->show; |
|
| 735 | + $connect = sql_quote($p->boucles[$b]->sql_serveur); |
|
| 736 | 736 | |
| 737 | - // Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite |
|
| 738 | - $c = index_pile($p->id_boucle, $type, $p->boucles); |
|
| 737 | + // Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite |
|
| 738 | + $c = index_pile($p->id_boucle, $type, $p->boucles); |
|
| 739 | 739 | |
| 740 | - if (isset($desc['field']['id_parent'])) { |
|
| 741 | - $parent = 0; // pour if (!$parent) dans calculer_expose |
|
| 742 | - } elseif (isset($desc['field']['id_rubrique'])) { |
|
| 743 | - $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b); |
|
| 744 | - } elseif (isset($desc['field']['id_groupe'])) { |
|
| 745 | - $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b); |
|
| 746 | - } else { |
|
| 747 | - $parent = "''"; |
|
| 748 | - } |
|
| 740 | + if (isset($desc['field']['id_parent'])) { |
|
| 741 | + $parent = 0; // pour if (!$parent) dans calculer_expose |
|
| 742 | + } elseif (isset($desc['field']['id_rubrique'])) { |
|
| 743 | + $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b); |
|
| 744 | + } elseif (isset($desc['field']['id_groupe'])) { |
|
| 745 | + $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b); |
|
| 746 | + } else { |
|
| 747 | + $parent = "''"; |
|
| 748 | + } |
|
| 749 | 749 | |
| 750 | - $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)"; |
|
| 751 | - } |
|
| 750 | + $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)"; |
|
| 751 | + } |
|
| 752 | 752 | |
| 753 | - $p->interdire_scripts = false; |
|
| 753 | + $p->interdire_scripts = false; |
|
| 754 | 754 | |
| 755 | - return $p; |
|
| 755 | + return $p; |
|
| 756 | 756 | } |
| 757 | 757 | |
| 758 | 758 | |
@@ -793,46 +793,46 @@ discard block |
||
| 793 | 793 | **/ |
| 794 | 794 | function balise_INTRODUCTION_dist($p) { |
| 795 | 795 | |
| 796 | - $type_objet = $p->type_requete; |
|
| 797 | - $cle_objet = id_table_objet($type_objet); |
|
| 798 | - $_id_objet = champ_sql($cle_objet, $p); |
|
| 799 | - |
|
| 800 | - // Récupérer les valeurs sql nécessaires : descriptif, texte et chapo |
|
| 801 | - // ainsi que le longueur d'introduction donnée dans la description de l'objet. |
|
| 802 | - $_introduction_longueur = 'null'; |
|
| 803 | - $_ligne = 'array('; |
|
| 804 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 805 | - if ($desc = $trouver_table(table_objet_sql($type_objet))) { |
|
| 806 | - if (isset($desc['field']['descriptif'])) { |
|
| 807 | - $_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ','; |
|
| 808 | - } |
|
| 809 | - if (isset($desc['field']['texte'])) { |
|
| 810 | - $_ligne .= "'texte' => " . champ_sql('texte', $p) . ','; |
|
| 811 | - } |
|
| 812 | - if (isset($desc['field']['chapo'])) { |
|
| 813 | - $_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ','; |
|
| 814 | - } |
|
| 815 | - if (isset($desc['introduction_longueur'])) { |
|
| 816 | - $_introduction_longueur = "'" . $desc['introduction_longueur'] . "'"; |
|
| 817 | - } |
|
| 818 | - } |
|
| 819 | - $_ligne .= ')'; |
|
| 820 | - |
|
| 821 | - // Récupérer la longueur et la suite passés en paramètres |
|
| 822 | - $_longueur_ou_suite = 'null'; |
|
| 823 | - if (($v1 = interprete_argument_balise(1, $p)) !== null) { |
|
| 824 | - $_longueur_ou_suite = $v1; |
|
| 825 | - } |
|
| 826 | - $_suite = 'null'; |
|
| 827 | - if (($v2 = interprete_argument_balise(2, $p)) !== null) { |
|
| 828 | - $_suite = $v2; |
|
| 829 | - } |
|
| 830 | - |
|
| 831 | - $p->code = "generer_objet_introduction($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)"; |
|
| 832 | - |
|
| 833 | - #$p->interdire_scripts = true; |
|
| 834 | - $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro |
|
| 835 | - return $p; |
|
| 796 | + $type_objet = $p->type_requete; |
|
| 797 | + $cle_objet = id_table_objet($type_objet); |
|
| 798 | + $_id_objet = champ_sql($cle_objet, $p); |
|
| 799 | + |
|
| 800 | + // Récupérer les valeurs sql nécessaires : descriptif, texte et chapo |
|
| 801 | + // ainsi que le longueur d'introduction donnée dans la description de l'objet. |
|
| 802 | + $_introduction_longueur = 'null'; |
|
| 803 | + $_ligne = 'array('; |
|
| 804 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 805 | + if ($desc = $trouver_table(table_objet_sql($type_objet))) { |
|
| 806 | + if (isset($desc['field']['descriptif'])) { |
|
| 807 | + $_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ','; |
|
| 808 | + } |
|
| 809 | + if (isset($desc['field']['texte'])) { |
|
| 810 | + $_ligne .= "'texte' => " . champ_sql('texte', $p) . ','; |
|
| 811 | + } |
|
| 812 | + if (isset($desc['field']['chapo'])) { |
|
| 813 | + $_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ','; |
|
| 814 | + } |
|
| 815 | + if (isset($desc['introduction_longueur'])) { |
|
| 816 | + $_introduction_longueur = "'" . $desc['introduction_longueur'] . "'"; |
|
| 817 | + } |
|
| 818 | + } |
|
| 819 | + $_ligne .= ')'; |
|
| 820 | + |
|
| 821 | + // Récupérer la longueur et la suite passés en paramètres |
|
| 822 | + $_longueur_ou_suite = 'null'; |
|
| 823 | + if (($v1 = interprete_argument_balise(1, $p)) !== null) { |
|
| 824 | + $_longueur_ou_suite = $v1; |
|
| 825 | + } |
|
| 826 | + $_suite = 'null'; |
|
| 827 | + if (($v2 = interprete_argument_balise(2, $p)) !== null) { |
|
| 828 | + $_suite = $v2; |
|
| 829 | + } |
|
| 830 | + |
|
| 831 | + $p->code = "generer_objet_introduction($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)"; |
|
| 832 | + |
|
| 833 | + #$p->interdire_scripts = true; |
|
| 834 | + $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro |
|
| 835 | + return $p; |
|
| 836 | 836 | } |
| 837 | 837 | |
| 838 | 838 | |
@@ -852,15 +852,15 @@ discard block |
||
| 852 | 852 | * Pile complétée par le code à générer |
| 853 | 853 | **/ |
| 854 | 854 | function balise_LANG_dist($p) { |
| 855 | - $_lang = champ_sql('lang', $p); |
|
| 856 | - if (!$p->etoile) { |
|
| 857 | - $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])"; |
|
| 858 | - } else { |
|
| 859 | - $p->code = "spip_htmlentities($_lang)"; |
|
| 860 | - } |
|
| 861 | - $p->interdire_scripts = false; |
|
| 855 | + $_lang = champ_sql('lang', $p); |
|
| 856 | + if (!$p->etoile) { |
|
| 857 | + $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])"; |
|
| 858 | + } else { |
|
| 859 | + $p->code = "spip_htmlentities($_lang)"; |
|
| 860 | + } |
|
| 861 | + $p->interdire_scripts = false; |
|
| 862 | 862 | |
| 863 | - return $p; |
|
| 863 | + return $p; |
|
| 864 | 864 | } |
| 865 | 865 | |
| 866 | 866 | /** |
@@ -882,45 +882,45 @@ discard block |
||
| 882 | 882 | * Pile complétée par le code à générer |
| 883 | 883 | */ |
| 884 | 884 | function balise_LESAUTEURS_dist($p) { |
| 885 | - // Cherche le champ 'lesauteurs' dans la pile |
|
| 886 | - $_lesauteurs = champ_sql('lesauteurs', $p, ''); |
|
| 887 | - |
|
| 888 | - // Si le champ n'existe pas (cas de spip_articles), on applique |
|
| 889 | - // le modele lesauteurs.html en passant id_article dans le contexte; |
|
| 890 | - // dans le cas contraire on prend le champ 'lesauteurs' |
|
| 891 | - // (cf extension sites/) |
|
| 892 | - if ($_lesauteurs) { |
|
| 893 | - $p->code = "safehtml($_lesauteurs)"; |
|
| 894 | - // $p->interdire_scripts = true; |
|
| 895 | - } else { |
|
| 896 | - if (!$p->id_boucle) { |
|
| 897 | - $connect = ''; |
|
| 898 | - $objet = 'article'; |
|
| 899 | - $id_table_objet = 'id_article'; |
|
| 900 | - } else { |
|
| 901 | - $b = $p->nom_boucle ?: $p->id_boucle; |
|
| 902 | - $connect = $p->boucles[$b]->sql_serveur; |
|
| 903 | - $type_boucle = $p->boucles[$b]->type_requete; |
|
| 904 | - $objet = objet_type($type_boucle); |
|
| 905 | - $id_table_objet = id_table_objet($type_boucle); |
|
| 906 | - } |
|
| 907 | - $c = memoriser_contexte_compil($p); |
|
| 908 | - |
|
| 909 | - $p->code = sprintf( |
|
| 910 | - CODE_RECUPERER_FOND, |
|
| 911 | - "'modeles/lesauteurs'", |
|
| 912 | - "array('objet'=>'" . $objet . |
|
| 913 | - "','id_objet' => " . champ_sql($id_table_objet, $p) . |
|
| 914 | - ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) . |
|
| 915 | - ($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) . |
|
| 916 | - ')', |
|
| 917 | - "'trim'=>true, 'compil'=>array($c)", |
|
| 918 | - _q($connect) |
|
| 919 | - ); |
|
| 920 | - $p->interdire_scripts = false; // securite apposee par recuperer_fond() |
|
| 921 | - } |
|
| 922 | - |
|
| 923 | - return $p; |
|
| 885 | + // Cherche le champ 'lesauteurs' dans la pile |
|
| 886 | + $_lesauteurs = champ_sql('lesauteurs', $p, ''); |
|
| 887 | + |
|
| 888 | + // Si le champ n'existe pas (cas de spip_articles), on applique |
|
| 889 | + // le modele lesauteurs.html en passant id_article dans le contexte; |
|
| 890 | + // dans le cas contraire on prend le champ 'lesauteurs' |
|
| 891 | + // (cf extension sites/) |
|
| 892 | + if ($_lesauteurs) { |
|
| 893 | + $p->code = "safehtml($_lesauteurs)"; |
|
| 894 | + // $p->interdire_scripts = true; |
|
| 895 | + } else { |
|
| 896 | + if (!$p->id_boucle) { |
|
| 897 | + $connect = ''; |
|
| 898 | + $objet = 'article'; |
|
| 899 | + $id_table_objet = 'id_article'; |
|
| 900 | + } else { |
|
| 901 | + $b = $p->nom_boucle ?: $p->id_boucle; |
|
| 902 | + $connect = $p->boucles[$b]->sql_serveur; |
|
| 903 | + $type_boucle = $p->boucles[$b]->type_requete; |
|
| 904 | + $objet = objet_type($type_boucle); |
|
| 905 | + $id_table_objet = id_table_objet($type_boucle); |
|
| 906 | + } |
|
| 907 | + $c = memoriser_contexte_compil($p); |
|
| 908 | + |
|
| 909 | + $p->code = sprintf( |
|
| 910 | + CODE_RECUPERER_FOND, |
|
| 911 | + "'modeles/lesauteurs'", |
|
| 912 | + "array('objet'=>'" . $objet . |
|
| 913 | + "','id_objet' => " . champ_sql($id_table_objet, $p) . |
|
| 914 | + ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) . |
|
| 915 | + ($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) . |
|
| 916 | + ')', |
|
| 917 | + "'trim'=>true, 'compil'=>array($c)", |
|
| 918 | + _q($connect) |
|
| 919 | + ); |
|
| 920 | + $p->interdire_scripts = false; // securite apposee par recuperer_fond() |
|
| 921 | + } |
|
| 922 | + |
|
| 923 | + return $p; |
|
| 924 | 924 | } |
| 925 | 925 | |
| 926 | 926 | |
@@ -947,76 +947,76 @@ discard block |
||
| 947 | 947 | * Pile complétée par le code à générer |
| 948 | 948 | */ |
| 949 | 949 | function balise_RANG_dist($p) { |
| 950 | - $b = index_boucle($p); |
|
| 951 | - if ($b === '') { |
|
| 952 | - $msg = [ |
|
| 953 | - 'zbug_champ_hors_boucle', |
|
| 954 | - ['champ' => '#RANG'] |
|
| 955 | - ]; |
|
| 956 | - erreur_squelette($msg, $p); |
|
| 957 | - } else { |
|
| 958 | - // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql) |
|
| 959 | - // dans la boucle immediatement englobante uniquement |
|
| 960 | - // sinon on compose le champ calcule |
|
| 961 | - $_rang = champ_sql('rang', $p, '', false); |
|
| 962 | - |
|
| 963 | - // si pas trouve de champ sql rang : |
|
| 964 | - if (!$_rang or $_rang == "''") { |
|
| 965 | - $boucle = &$p->boucles[$b]; |
|
| 966 | - |
|
| 967 | - // on gere le cas ou #RANG est une extraction du numero dans le titre |
|
| 968 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 969 | - $desc = $trouver_table($boucle->id_table); |
|
| 970 | - $_titre = ''; # où extraire le numero ? |
|
| 971 | - |
|
| 972 | - if (isset($desc['titre'])) { |
|
| 973 | - $t = $desc['titre']; |
|
| 974 | - if ( |
|
| 975 | - // Soit on trouve avec la déclaration de la lang AVANT |
|
| 976 | - preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m) |
|
| 977 | - // Soit on prend depuis le début |
|
| 978 | - or preg_match(';^(.*?titre)\s*(,|$);', $t, $m) |
|
| 979 | - ) { |
|
| 980 | - $m = preg_replace(',as\s+titre$,i', '', $m[1]); |
|
| 981 | - $m = trim($m); |
|
| 982 | - if ($m != "''") { |
|
| 983 | - if (!preg_match(',\W,', $m)) { |
|
| 984 | - $m = $boucle->id_table . ".$m"; |
|
| 985 | - } |
|
| 986 | - |
|
| 987 | - $m .= ' AS titre_rang'; |
|
| 988 | - |
|
| 989 | - $boucle->select[] = $m; |
|
| 990 | - $_titre = '$Pile[$SP][\'titre_rang\']'; |
|
| 991 | - } |
|
| 992 | - } |
|
| 993 | - } |
|
| 994 | - |
|
| 995 | - // si on n'a rien trouvé, on utilise le champ titre classique |
|
| 996 | - if (!$_titre) { |
|
| 997 | - $_titre = champ_sql('titre', $p); |
|
| 998 | - } |
|
| 999 | - |
|
| 1000 | - // et on recupere aussi les infos de liaison si on est en train d'editer les liens justement |
|
| 1001 | - // cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS |
|
| 1002 | - $type_boucle = $boucle->type_requete; |
|
| 1003 | - $objet = objet_type($type_boucle); |
|
| 1004 | - $id_table_objet = id_table_objet($type_boucle); |
|
| 1005 | - $_primary = champ_sql($id_table_objet, $p, '', false); |
|
| 1006 | - $_env = '$Pile[0]'; |
|
| 1007 | - |
|
| 1008 | - if (!$_titre) {$_titre = "''"; |
|
| 1009 | - } |
|
| 1010 | - if (!$_primary) {$_primary = "''"; |
|
| 1011 | - } |
|
| 1012 | - $_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)"; |
|
| 1013 | - } |
|
| 1014 | - |
|
| 1015 | - $p->code = $_rang; |
|
| 1016 | - $p->interdire_scripts = false; |
|
| 1017 | - } |
|
| 1018 | - |
|
| 1019 | - return $p; |
|
| 950 | + $b = index_boucle($p); |
|
| 951 | + if ($b === '') { |
|
| 952 | + $msg = [ |
|
| 953 | + 'zbug_champ_hors_boucle', |
|
| 954 | + ['champ' => '#RANG'] |
|
| 955 | + ]; |
|
| 956 | + erreur_squelette($msg, $p); |
|
| 957 | + } else { |
|
| 958 | + // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql) |
|
| 959 | + // dans la boucle immediatement englobante uniquement |
|
| 960 | + // sinon on compose le champ calcule |
|
| 961 | + $_rang = champ_sql('rang', $p, '', false); |
|
| 962 | + |
|
| 963 | + // si pas trouve de champ sql rang : |
|
| 964 | + if (!$_rang or $_rang == "''") { |
|
| 965 | + $boucle = &$p->boucles[$b]; |
|
| 966 | + |
|
| 967 | + // on gere le cas ou #RANG est une extraction du numero dans le titre |
|
| 968 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 969 | + $desc = $trouver_table($boucle->id_table); |
|
| 970 | + $_titre = ''; # où extraire le numero ? |
|
| 971 | + |
|
| 972 | + if (isset($desc['titre'])) { |
|
| 973 | + $t = $desc['titre']; |
|
| 974 | + if ( |
|
| 975 | + // Soit on trouve avec la déclaration de la lang AVANT |
|
| 976 | + preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m) |
|
| 977 | + // Soit on prend depuis le début |
|
| 978 | + or preg_match(';^(.*?titre)\s*(,|$);', $t, $m) |
|
| 979 | + ) { |
|
| 980 | + $m = preg_replace(',as\s+titre$,i', '', $m[1]); |
|
| 981 | + $m = trim($m); |
|
| 982 | + if ($m != "''") { |
|
| 983 | + if (!preg_match(',\W,', $m)) { |
|
| 984 | + $m = $boucle->id_table . ".$m"; |
|
| 985 | + } |
|
| 986 | + |
|
| 987 | + $m .= ' AS titre_rang'; |
|
| 988 | + |
|
| 989 | + $boucle->select[] = $m; |
|
| 990 | + $_titre = '$Pile[$SP][\'titre_rang\']'; |
|
| 991 | + } |
|
| 992 | + } |
|
| 993 | + } |
|
| 994 | + |
|
| 995 | + // si on n'a rien trouvé, on utilise le champ titre classique |
|
| 996 | + if (!$_titre) { |
|
| 997 | + $_titre = champ_sql('titre', $p); |
|
| 998 | + } |
|
| 999 | + |
|
| 1000 | + // et on recupere aussi les infos de liaison si on est en train d'editer les liens justement |
|
| 1001 | + // cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS |
|
| 1002 | + $type_boucle = $boucle->type_requete; |
|
| 1003 | + $objet = objet_type($type_boucle); |
|
| 1004 | + $id_table_objet = id_table_objet($type_boucle); |
|
| 1005 | + $_primary = champ_sql($id_table_objet, $p, '', false); |
|
| 1006 | + $_env = '$Pile[0]'; |
|
| 1007 | + |
|
| 1008 | + if (!$_titre) {$_titre = "''"; |
|
| 1009 | + } |
|
| 1010 | + if (!$_primary) {$_primary = "''"; |
|
| 1011 | + } |
|
| 1012 | + $_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)"; |
|
| 1013 | + } |
|
| 1014 | + |
|
| 1015 | + $p->code = $_rang; |
|
| 1016 | + $p->interdire_scripts = false; |
|
| 1017 | + } |
|
| 1018 | + |
|
| 1019 | + return $p; |
|
| 1020 | 1020 | } |
| 1021 | 1021 | |
| 1022 | 1022 | |
@@ -1038,12 +1038,12 @@ discard block |
||
| 1038 | 1038 | * Pile complétée par le code à générer |
| 1039 | 1039 | **/ |
| 1040 | 1040 | function balise_POPULARITE_dist($p) { |
| 1041 | - $_popularite = champ_sql('popularite', $p); |
|
| 1042 | - $p->code = "(ceil(min(100, 100 * $_popularite |
|
| 1041 | + $_popularite = champ_sql('popularite', $p); |
|
| 1042 | + $p->code = "(ceil(min(100, 100 * $_popularite |
|
| 1043 | 1043 | / max(1 , 0 + \$GLOBALS['meta']['popularite_max']))))"; |
| 1044 | - $p->interdire_scripts = false; |
|
| 1044 | + $p->interdire_scripts = false; |
|
| 1045 | 1045 | |
| 1046 | - return $p; |
|
| 1046 | + return $p; |
|
| 1047 | 1047 | } |
| 1048 | 1048 | |
| 1049 | 1049 | /** |
@@ -1054,8 +1054,8 @@ discard block |
||
| 1054 | 1054 | * l'absence peut-être due à une faute de frappe dans le contexte inclus. |
| 1055 | 1055 | */ |
| 1056 | 1056 | define( |
| 1057 | - 'CODE_PAGINATION', |
|
| 1058 | - '%s($Numrows["%s"]["grand_total"], |
|
| 1057 | + 'CODE_PAGINATION', |
|
| 1058 | + '%s($Numrows["%s"]["grand_total"], |
|
| 1059 | 1059 | %s, |
| 1060 | 1060 | isset($Pile[0][%4$s])?$Pile[0][%4$s]:intval(_request(%4$s)), |
| 1061 | 1061 | %5$s, %6$s, %7$s, %8$s, array(%9$s))' |
@@ -1092,75 +1092,75 @@ discard block |
||
| 1092 | 1092 | * Pile complétée par le code à générer |
| 1093 | 1093 | */ |
| 1094 | 1094 | function balise_PAGINATION_dist($p, $liste = 'true') { |
| 1095 | - $b = index_boucle_mere($p); |
|
| 1096 | - |
|
| 1097 | - // s'il n'y a pas de nom de boucle, on ne peut pas paginer |
|
| 1098 | - if ($b === '') { |
|
| 1099 | - $msg = [ |
|
| 1100 | - 'zbug_champ_hors_boucle', |
|
| 1101 | - ['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION'] |
|
| 1102 | - ]; |
|
| 1103 | - erreur_squelette($msg, $p); |
|
| 1104 | - |
|
| 1105 | - return $p; |
|
| 1106 | - } |
|
| 1107 | - |
|
| 1108 | - // s'il n'y a pas de mode_partie, c'est qu'on se trouve |
|
| 1109 | - // dans un boucle recursive ou qu'on a oublie le critere {pagination} |
|
| 1110 | - if (!$p->boucles[$b]->mode_partie) { |
|
| 1111 | - if (!$p->boucles[$b]->table_optionnelle) { |
|
| 1112 | - $msg = [ |
|
| 1113 | - 'zbug_pagination_sans_critere', |
|
| 1114 | - ['champ' => '#PAGINATION'] |
|
| 1115 | - ]; |
|
| 1116 | - erreur_squelette($msg, $p); |
|
| 1117 | - } |
|
| 1118 | - |
|
| 1119 | - return $p; |
|
| 1120 | - } |
|
| 1121 | - |
|
| 1122 | - // a priori true |
|
| 1123 | - // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise |
|
| 1124 | - // si true, les arguments simples (sans truc=chose) vont degager |
|
| 1125 | - $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false); |
|
| 1126 | - if (is_countable($_contexte) ? count($_contexte) : 0) { |
|
| 1127 | - $key = key($_contexte); |
|
| 1128 | - if (is_numeric($key)) { |
|
| 1129 | - array_shift($_contexte); |
|
| 1130 | - $__modele = interprete_argument_balise(1, $p); |
|
| 1131 | - } |
|
| 1132 | - } |
|
| 1133 | - |
|
| 1134 | - if (is_countable($_contexte) ? count($_contexte) : 0) { |
|
| 1135 | - $code_contexte = implode(',', $_contexte); |
|
| 1136 | - } else { |
|
| 1137 | - $code_contexte = ''; |
|
| 1138 | - } |
|
| 1139 | - |
|
| 1140 | - $connect = $p->boucles[$b]->sql_serveur; |
|
| 1141 | - $pas = $p->boucles[$b]->total_parties; |
|
| 1142 | - $f_pagination = chercher_filtre('pagination'); |
|
| 1143 | - $type = $p->boucles[$b]->modificateur['debut_nom']; |
|
| 1144 | - $modif = ($type[0] !== "'") ? "'debut'.$type" |
|
| 1145 | - : ("'debut" . substr($type, 1)); |
|
| 1146 | - |
|
| 1147 | - $p->code = sprintf( |
|
| 1148 | - CODE_PAGINATION, |
|
| 1149 | - $f_pagination, |
|
| 1150 | - $b, |
|
| 1151 | - $type, |
|
| 1152 | - $modif, |
|
| 1153 | - $pas, |
|
| 1154 | - $liste, |
|
| 1155 | - ((isset($__modele) and $__modele) ? $__modele : "''"), |
|
| 1156 | - _q($connect), |
|
| 1157 | - $code_contexte |
|
| 1158 | - ); |
|
| 1159 | - |
|
| 1160 | - $p->boucles[$b]->numrows = true; |
|
| 1161 | - $p->interdire_scripts = false; |
|
| 1162 | - |
|
| 1163 | - return $p; |
|
| 1095 | + $b = index_boucle_mere($p); |
|
| 1096 | + |
|
| 1097 | + // s'il n'y a pas de nom de boucle, on ne peut pas paginer |
|
| 1098 | + if ($b === '') { |
|
| 1099 | + $msg = [ |
|
| 1100 | + 'zbug_champ_hors_boucle', |
|
| 1101 | + ['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION'] |
|
| 1102 | + ]; |
|
| 1103 | + erreur_squelette($msg, $p); |
|
| 1104 | + |
|
| 1105 | + return $p; |
|
| 1106 | + } |
|
| 1107 | + |
|
| 1108 | + // s'il n'y a pas de mode_partie, c'est qu'on se trouve |
|
| 1109 | + // dans un boucle recursive ou qu'on a oublie le critere {pagination} |
|
| 1110 | + if (!$p->boucles[$b]->mode_partie) { |
|
| 1111 | + if (!$p->boucles[$b]->table_optionnelle) { |
|
| 1112 | + $msg = [ |
|
| 1113 | + 'zbug_pagination_sans_critere', |
|
| 1114 | + ['champ' => '#PAGINATION'] |
|
| 1115 | + ]; |
|
| 1116 | + erreur_squelette($msg, $p); |
|
| 1117 | + } |
|
| 1118 | + |
|
| 1119 | + return $p; |
|
| 1120 | + } |
|
| 1121 | + |
|
| 1122 | + // a priori true |
|
| 1123 | + // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise |
|
| 1124 | + // si true, les arguments simples (sans truc=chose) vont degager |
|
| 1125 | + $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false); |
|
| 1126 | + if (is_countable($_contexte) ? count($_contexte) : 0) { |
|
| 1127 | + $key = key($_contexte); |
|
| 1128 | + if (is_numeric($key)) { |
|
| 1129 | + array_shift($_contexte); |
|
| 1130 | + $__modele = interprete_argument_balise(1, $p); |
|
| 1131 | + } |
|
| 1132 | + } |
|
| 1133 | + |
|
| 1134 | + if (is_countable($_contexte) ? count($_contexte) : 0) { |
|
| 1135 | + $code_contexte = implode(',', $_contexte); |
|
| 1136 | + } else { |
|
| 1137 | + $code_contexte = ''; |
|
| 1138 | + } |
|
| 1139 | + |
|
| 1140 | + $connect = $p->boucles[$b]->sql_serveur; |
|
| 1141 | + $pas = $p->boucles[$b]->total_parties; |
|
| 1142 | + $f_pagination = chercher_filtre('pagination'); |
|
| 1143 | + $type = $p->boucles[$b]->modificateur['debut_nom']; |
|
| 1144 | + $modif = ($type[0] !== "'") ? "'debut'.$type" |
|
| 1145 | + : ("'debut" . substr($type, 1)); |
|
| 1146 | + |
|
| 1147 | + $p->code = sprintf( |
|
| 1148 | + CODE_PAGINATION, |
|
| 1149 | + $f_pagination, |
|
| 1150 | + $b, |
|
| 1151 | + $type, |
|
| 1152 | + $modif, |
|
| 1153 | + $pas, |
|
| 1154 | + $liste, |
|
| 1155 | + ((isset($__modele) and $__modele) ? $__modele : "''"), |
|
| 1156 | + _q($connect), |
|
| 1157 | + $code_contexte |
|
| 1158 | + ); |
|
| 1159 | + |
|
| 1160 | + $p->boucles[$b]->numrows = true; |
|
| 1161 | + $p->interdire_scripts = false; |
|
| 1162 | + |
|
| 1163 | + return $p; |
|
| 1164 | 1164 | } |
| 1165 | 1165 | |
| 1166 | 1166 | |
@@ -1187,11 +1187,11 @@ discard block |
||
| 1187 | 1187 | * Pile complétée par le code à générer |
| 1188 | 1188 | **/ |
| 1189 | 1189 | function balise_ANCRE_PAGINATION_dist($p) { |
| 1190 | - if ($f = charger_fonction('PAGINATION', 'balise', true)) { |
|
| 1191 | - return $f($p, $liste = 'false'); |
|
| 1192 | - } else { |
|
| 1193 | - return null; |
|
| 1194 | - } // ou une erreur ? |
|
| 1190 | + if ($f = charger_fonction('PAGINATION', 'balise', true)) { |
|
| 1191 | + return $f($p, $liste = 'false'); |
|
| 1192 | + } else { |
|
| 1193 | + return null; |
|
| 1194 | + } // ou une erreur ? |
|
| 1195 | 1195 | } |
| 1196 | 1196 | |
| 1197 | 1197 | |
@@ -1212,17 +1212,17 @@ discard block |
||
| 1212 | 1212 | * Pile complétée par le code à générer |
| 1213 | 1213 | **/ |
| 1214 | 1214 | function balise_GRAND_TOTAL_dist($p) { |
| 1215 | - $b = index_boucle_mere($p); |
|
| 1216 | - if ($b === '') { |
|
| 1217 | - $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]]; |
|
| 1218 | - erreur_squelette($msg, $p); |
|
| 1219 | - } else { |
|
| 1220 | - $p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)"; |
|
| 1221 | - $p->boucles[$b]->numrows = true; |
|
| 1222 | - $p->interdire_scripts = false; |
|
| 1223 | - } |
|
| 1215 | + $b = index_boucle_mere($p); |
|
| 1216 | + if ($b === '') { |
|
| 1217 | + $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]]; |
|
| 1218 | + erreur_squelette($msg, $p); |
|
| 1219 | + } else { |
|
| 1220 | + $p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)"; |
|
| 1221 | + $p->boucles[$b]->numrows = true; |
|
| 1222 | + $p->interdire_scripts = false; |
|
| 1223 | + } |
|
| 1224 | 1224 | |
| 1225 | - return $p; |
|
| 1225 | + return $p; |
|
| 1226 | 1226 | } |
| 1227 | 1227 | |
| 1228 | 1228 | |
@@ -1250,10 +1250,10 @@ discard block |
||
| 1250 | 1250 | * Pile complétée par le code à générer |
| 1251 | 1251 | **/ |
| 1252 | 1252 | function balise_SELF_dist($p) { |
| 1253 | - $p->code = 'self()'; |
|
| 1254 | - $p->interdire_scripts = false; |
|
| 1253 | + $p->code = 'self()'; |
|
| 1254 | + $p->interdire_scripts = false; |
|
| 1255 | 1255 | |
| 1256 | - return $p; |
|
| 1256 | + return $p; |
|
| 1257 | 1257 | } |
| 1258 | 1258 | |
| 1259 | 1259 | |
@@ -1280,17 +1280,17 @@ discard block |
||
| 1280 | 1280 | * Pile complétée par le code à générer |
| 1281 | 1281 | **/ |
| 1282 | 1282 | function balise_CHEMIN_dist($p) { |
| 1283 | - $arg = interprete_argument_balise(1, $p); |
|
| 1284 | - if (!$arg) { |
|
| 1285 | - $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']]; |
|
| 1286 | - erreur_squelette($msg, $p); |
|
| 1287 | - } else { |
|
| 1288 | - $p->code = 'find_in_path((string)' . $arg . ')'; |
|
| 1289 | - } |
|
| 1283 | + $arg = interprete_argument_balise(1, $p); |
|
| 1284 | + if (!$arg) { |
|
| 1285 | + $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']]; |
|
| 1286 | + erreur_squelette($msg, $p); |
|
| 1287 | + } else { |
|
| 1288 | + $p->code = 'find_in_path((string)' . $arg . ')'; |
|
| 1289 | + } |
|
| 1290 | 1290 | |
| 1291 | - $p->interdire_scripts = false; |
|
| 1291 | + $p->interdire_scripts = false; |
|
| 1292 | 1292 | |
| 1293 | - return $p; |
|
| 1293 | + return $p; |
|
| 1294 | 1294 | } |
| 1295 | 1295 | |
| 1296 | 1296 | /** |
@@ -1315,16 +1315,16 @@ discard block |
||
| 1315 | 1315 | * Pile complétée par le code à générer |
| 1316 | 1316 | **/ |
| 1317 | 1317 | function balise_CHEMIN_IMAGE_dist($p) { |
| 1318 | - $arg = interprete_argument_balise(1, $p); |
|
| 1319 | - if (!$arg) { |
|
| 1320 | - $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']]; |
|
| 1321 | - erreur_squelette($msg, $p); |
|
| 1322 | - } else { |
|
| 1323 | - $p->code = 'chemin_image((string)' . $arg . ')'; |
|
| 1324 | - } |
|
| 1318 | + $arg = interprete_argument_balise(1, $p); |
|
| 1319 | + if (!$arg) { |
|
| 1320 | + $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']]; |
|
| 1321 | + erreur_squelette($msg, $p); |
|
| 1322 | + } else { |
|
| 1323 | + $p->code = 'chemin_image((string)' . $arg . ')'; |
|
| 1324 | + } |
|
| 1325 | 1325 | |
| 1326 | - $p->interdire_scripts = false; |
|
| 1327 | - return $p; |
|
| 1326 | + $p->interdire_scripts = false; |
|
| 1327 | + return $p; |
|
| 1328 | 1328 | } |
| 1329 | 1329 | |
| 1330 | 1330 | |
@@ -1362,36 +1362,36 @@ discard block |
||
| 1362 | 1362 | **/ |
| 1363 | 1363 | function balise_ENV_dist($p, $src = null) { |
| 1364 | 1364 | |
| 1365 | - // cle du tableau desiree |
|
| 1366 | - $_nom = interprete_argument_balise(1, $p); |
|
| 1367 | - // valeur par defaut |
|
| 1368 | - $_sinon = interprete_argument_balise(2, $p); |
|
| 1365 | + // cle du tableau desiree |
|
| 1366 | + $_nom = interprete_argument_balise(1, $p); |
|
| 1367 | + // valeur par defaut |
|
| 1368 | + $_sinon = interprete_argument_balise(2, $p); |
|
| 1369 | 1369 | |
| 1370 | - // $src est un tableau de donnees sources eventuellement transmis |
|
| 1371 | - // en absence, on utilise l'environnement du squelette $Pile[0] |
|
| 1370 | + // $src est un tableau de donnees sources eventuellement transmis |
|
| 1371 | + // en absence, on utilise l'environnement du squelette $Pile[0] |
|
| 1372 | 1372 | |
| 1373 | - if (!$_nom) { |
|
| 1374 | - // cas de #ENV sans argument : on retourne le serialize() du tableau |
|
| 1375 | - // une belle fonction [(#ENV|affiche_env)] serait pratique |
|
| 1376 | - if ($src) { |
|
| 1377 | - $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")'; |
|
| 1378 | - } else { |
|
| 1379 | - $p->code = 'serialize($Pile[0]??[])'; |
|
| 1380 | - } |
|
| 1381 | - } else { |
|
| 1382 | - if (!$src) { |
|
| 1383 | - $src = '$Pile[0]??[]'; |
|
| 1384 | - } |
|
| 1385 | - if ($_sinon) { |
|
| 1386 | - $p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)"; |
|
| 1387 | - } else { |
|
| 1388 | - $p->code = "table_valeur($src, (string)$_nom, null)"; |
|
| 1389 | - } |
|
| 1390 | - } |
|
| 1373 | + if (!$_nom) { |
|
| 1374 | + // cas de #ENV sans argument : on retourne le serialize() du tableau |
|
| 1375 | + // une belle fonction [(#ENV|affiche_env)] serait pratique |
|
| 1376 | + if ($src) { |
|
| 1377 | + $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")'; |
|
| 1378 | + } else { |
|
| 1379 | + $p->code = 'serialize($Pile[0]??[])'; |
|
| 1380 | + } |
|
| 1381 | + } else { |
|
| 1382 | + if (!$src) { |
|
| 1383 | + $src = '$Pile[0]??[]'; |
|
| 1384 | + } |
|
| 1385 | + if ($_sinon) { |
|
| 1386 | + $p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)"; |
|
| 1387 | + } else { |
|
| 1388 | + $p->code = "table_valeur($src, (string)$_nom, null)"; |
|
| 1389 | + } |
|
| 1390 | + } |
|
| 1391 | 1391 | |
| 1392 | - #$p->interdire_scripts = true; |
|
| 1392 | + #$p->interdire_scripts = true; |
|
| 1393 | 1393 | |
| 1394 | - return $p; |
|
| 1394 | + return $p; |
|
| 1395 | 1395 | } |
| 1396 | 1396 | |
| 1397 | 1397 | /** |
@@ -1421,16 +1421,16 @@ discard block |
||
| 1421 | 1421 | * Pile completée du code PHP d'exécution de la balise |
| 1422 | 1422 | */ |
| 1423 | 1423 | function balise_CONFIG_dist($p) { |
| 1424 | - if (!$arg = interprete_argument_balise(1, $p)) { |
|
| 1425 | - $arg = "''"; |
|
| 1426 | - } |
|
| 1427 | - $_sinon = interprete_argument_balise(2, $p); |
|
| 1428 | - $_unserialize = sinon(interprete_argument_balise(3, $p), 'false'); |
|
| 1424 | + if (!$arg = interprete_argument_balise(1, $p)) { |
|
| 1425 | + $arg = "''"; |
|
| 1426 | + } |
|
| 1427 | + $_sinon = interprete_argument_balise(2, $p); |
|
| 1428 | + $_unserialize = sinon(interprete_argument_balise(3, $p), 'false'); |
|
| 1429 | 1429 | |
| 1430 | - $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' . |
|
| 1431 | - ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')"; |
|
| 1430 | + $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' . |
|
| 1431 | + ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')"; |
|
| 1432 | 1432 | |
| 1433 | - return $p; |
|
| 1433 | + return $p; |
|
| 1434 | 1434 | } |
| 1435 | 1435 | |
| 1436 | 1436 | |
@@ -1453,10 +1453,10 @@ discard block |
||
| 1453 | 1453 | * Pile completée du code PHP d'exécution de la balise |
| 1454 | 1454 | */ |
| 1455 | 1455 | function balise_CONNECT_dist($p) { |
| 1456 | - $p->code = '($connect ? $connect : NULL)'; |
|
| 1457 | - $p->interdire_scripts = false; |
|
| 1456 | + $p->code = '($connect ? $connect : NULL)'; |
|
| 1457 | + $p->interdire_scripts = false; |
|
| 1458 | 1458 | |
| 1459 | - return $p; |
|
| 1459 | + return $p; |
|
| 1460 | 1460 | } |
| 1461 | 1461 | |
| 1462 | 1462 | |
@@ -1484,15 +1484,15 @@ discard block |
||
| 1484 | 1484 | * Pile completée du code PHP d'exécution de la balise |
| 1485 | 1485 | **/ |
| 1486 | 1486 | function balise_SESSION_dist($p) { |
| 1487 | - $p->descr['session'] = true; |
|
| 1487 | + $p->descr['session'] = true; |
|
| 1488 | 1488 | |
| 1489 | - $f = function_exists('balise_ENV') |
|
| 1490 | - ? 'balise_ENV' |
|
| 1491 | - : 'balise_ENV_dist'; |
|
| 1489 | + $f = function_exists('balise_ENV') |
|
| 1490 | + ? 'balise_ENV' |
|
| 1491 | + : 'balise_ENV_dist'; |
|
| 1492 | 1492 | |
| 1493 | - $p = $f($p, '$GLOBALS["visiteur_session"]??[]'); |
|
| 1493 | + $p = $f($p, '$GLOBALS["visiteur_session"]??[]'); |
|
| 1494 | 1494 | |
| 1495 | - return $p; |
|
| 1495 | + return $p; |
|
| 1496 | 1496 | } |
| 1497 | 1497 | |
| 1498 | 1498 | |
@@ -1515,18 +1515,18 @@ discard block |
||
| 1515 | 1515 | * Pile completée du code PHP d'exécution de la balise |
| 1516 | 1516 | **/ |
| 1517 | 1517 | function balise_SESSION_SET_dist($p) { |
| 1518 | - $_nom = interprete_argument_balise(1, $p); |
|
| 1519 | - $_val = interprete_argument_balise(2, $p); |
|
| 1520 | - if (!$_nom or !$_val) { |
|
| 1521 | - $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']]; |
|
| 1522 | - erreur_squelette($err_b_s_a, $p); |
|
| 1523 | - } else { |
|
| 1524 | - $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))'; |
|
| 1525 | - } |
|
| 1518 | + $_nom = interprete_argument_balise(1, $p); |
|
| 1519 | + $_val = interprete_argument_balise(2, $p); |
|
| 1520 | + if (!$_nom or !$_val) { |
|
| 1521 | + $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']]; |
|
| 1522 | + erreur_squelette($err_b_s_a, $p); |
|
| 1523 | + } else { |
|
| 1524 | + $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))'; |
|
| 1525 | + } |
|
| 1526 | 1526 | |
| 1527 | - $p->interdire_scripts = false; |
|
| 1527 | + $p->interdire_scripts = false; |
|
| 1528 | 1528 | |
| 1529 | - return $p; |
|
| 1529 | + return $p; |
|
| 1530 | 1530 | } |
| 1531 | 1531 | |
| 1532 | 1532 | |
@@ -1557,30 +1557,30 @@ discard block |
||
| 1557 | 1557 | * Pile completée du code PHP d'exécution de la balise |
| 1558 | 1558 | **/ |
| 1559 | 1559 | function balise_EVAL_dist($p) { |
| 1560 | - $php = interprete_argument_balise(1, $p); |
|
| 1561 | - if ($php) { |
|
| 1562 | - # optimisation sur les #EVAL{une expression sans #BALISE} |
|
| 1563 | - # attention au commentaire "// x signes" qui precede |
|
| 1564 | - if ( |
|
| 1565 | - preg_match( |
|
| 1566 | - ",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms", |
|
| 1567 | - $php, |
|
| 1568 | - $r |
|
| 1569 | - ) |
|
| 1570 | - ) { |
|
| 1571 | - $p->code = /* $r[1]. */ |
|
| 1572 | - '(' . $r[2] . ')'; |
|
| 1573 | - } else { |
|
| 1574 | - $p->code = "eval('return '.$php.';')"; |
|
| 1575 | - } |
|
| 1576 | - } else { |
|
| 1577 | - $msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']]; |
|
| 1578 | - erreur_squelette($msg, $p); |
|
| 1579 | - } |
|
| 1580 | - |
|
| 1581 | - #$p->interdire_scripts = true; |
|
| 1582 | - |
|
| 1583 | - return $p; |
|
| 1560 | + $php = interprete_argument_balise(1, $p); |
|
| 1561 | + if ($php) { |
|
| 1562 | + # optimisation sur les #EVAL{une expression sans #BALISE} |
|
| 1563 | + # attention au commentaire "// x signes" qui precede |
|
| 1564 | + if ( |
|
| 1565 | + preg_match( |
|
| 1566 | + ",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms", |
|
| 1567 | + $php, |
|
| 1568 | + $r |
|
| 1569 | + ) |
|
| 1570 | + ) { |
|
| 1571 | + $p->code = /* $r[1]. */ |
|
| 1572 | + '(' . $r[2] . ')'; |
|
| 1573 | + } else { |
|
| 1574 | + $p->code = "eval('return '.$php.';')"; |
|
| 1575 | + } |
|
| 1576 | + } else { |
|
| 1577 | + $msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']]; |
|
| 1578 | + erreur_squelette($msg, $p); |
|
| 1579 | + } |
|
| 1580 | + |
|
| 1581 | + #$p->interdire_scripts = true; |
|
| 1582 | + |
|
| 1583 | + return $p; |
|
| 1584 | 1584 | } |
| 1585 | 1585 | |
| 1586 | 1586 | |
@@ -1610,19 +1610,19 @@ discard block |
||
| 1610 | 1610 | **/ |
| 1611 | 1611 | function balise_CHAMP_SQL_dist($p) { |
| 1612 | 1612 | |
| 1613 | - if ( |
|
| 1614 | - $p->param |
|
| 1615 | - and isset($p->param[0][1][0]) |
|
| 1616 | - and $champ = ($p->param[0][1][0]->texte) |
|
| 1617 | - ) { |
|
| 1618 | - $p->code = champ_sql($champ, $p); |
|
| 1619 | - } else { |
|
| 1620 | - $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']]; |
|
| 1621 | - erreur_squelette($err_b_s_a, $p); |
|
| 1622 | - } |
|
| 1613 | + if ( |
|
| 1614 | + $p->param |
|
| 1615 | + and isset($p->param[0][1][0]) |
|
| 1616 | + and $champ = ($p->param[0][1][0]->texte) |
|
| 1617 | + ) { |
|
| 1618 | + $p->code = champ_sql($champ, $p); |
|
| 1619 | + } else { |
|
| 1620 | + $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']]; |
|
| 1621 | + erreur_squelette($err_b_s_a, $p); |
|
| 1622 | + } |
|
| 1623 | 1623 | |
| 1624 | - #$p->interdire_scripts = true; |
|
| 1625 | - return $p; |
|
| 1624 | + #$p->interdire_scripts = true; |
|
| 1625 | + return $p; |
|
| 1626 | 1626 | } |
| 1627 | 1627 | |
| 1628 | 1628 | /** |
@@ -1648,13 +1648,13 @@ discard block |
||
| 1648 | 1648 | * Pile complétée par le code à générer |
| 1649 | 1649 | **/ |
| 1650 | 1650 | function balise_VAL_dist($p) { |
| 1651 | - $p->code = interprete_argument_balise(1, $p); |
|
| 1652 | - if ($p->code === null || !strlen($p->code)) { |
|
| 1653 | - $p->code = "''"; |
|
| 1654 | - } |
|
| 1655 | - $p->interdire_scripts = false; |
|
| 1651 | + $p->code = interprete_argument_balise(1, $p); |
|
| 1652 | + if ($p->code === null || !strlen($p->code)) { |
|
| 1653 | + $p->code = "''"; |
|
| 1654 | + } |
|
| 1655 | + $p->interdire_scripts = false; |
|
| 1656 | 1656 | |
| 1657 | - return $p; |
|
| 1657 | + return $p; |
|
| 1658 | 1658 | } |
| 1659 | 1659 | |
| 1660 | 1660 | /** |
@@ -1683,10 +1683,10 @@ discard block |
||
| 1683 | 1683 | * Pile complétée par le code à générer |
| 1684 | 1684 | **/ |
| 1685 | 1685 | function balise_REM_dist($p) { |
| 1686 | - $p->code = "''"; |
|
| 1687 | - $p->interdire_scripts = false; |
|
| 1686 | + $p->code = "''"; |
|
| 1687 | + $p->interdire_scripts = false; |
|
| 1688 | 1688 | |
| 1689 | - return $p; |
|
| 1689 | + return $p; |
|
| 1690 | 1690 | } |
| 1691 | 1691 | |
| 1692 | 1692 | /** |
@@ -1696,10 +1696,10 @@ discard block |
||
| 1696 | 1696 | * @return mixed |
| 1697 | 1697 | */ |
| 1698 | 1698 | function balise_NULL_dist($p) { |
| 1699 | - $p->code = 'null'; |
|
| 1700 | - $p->interdire_scripts = false; |
|
| 1699 | + $p->code = 'null'; |
|
| 1700 | + $p->interdire_scripts = false; |
|
| 1701 | 1701 | |
| 1702 | - return $p; |
|
| 1702 | + return $p; |
|
| 1703 | 1703 | } |
| 1704 | 1704 | |
| 1705 | 1705 | |
@@ -1723,18 +1723,18 @@ discard block |
||
| 1723 | 1723 | **/ |
| 1724 | 1724 | function balise_HTTP_HEADER_dist($p) { |
| 1725 | 1725 | |
| 1726 | - $header = interprete_argument_balise(1, $p); |
|
| 1727 | - if (!$header) { |
|
| 1728 | - $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']]; |
|
| 1729 | - erreur_squelette($err_b_s_a, $p); |
|
| 1730 | - } else { |
|
| 1731 | - $p->code = "'<'.'?php header(' . _q(" |
|
| 1732 | - . $header |
|
| 1733 | - . ") . '); ?'.'>'"; |
|
| 1734 | - } |
|
| 1735 | - $p->interdire_scripts = false; |
|
| 1726 | + $header = interprete_argument_balise(1, $p); |
|
| 1727 | + if (!$header) { |
|
| 1728 | + $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']]; |
|
| 1729 | + erreur_squelette($err_b_s_a, $p); |
|
| 1730 | + } else { |
|
| 1731 | + $p->code = "'<'.'?php header(' . _q(" |
|
| 1732 | + . $header |
|
| 1733 | + . ") . '); ?'.'>'"; |
|
| 1734 | + } |
|
| 1735 | + $p->interdire_scripts = false; |
|
| 1736 | 1736 | |
| 1737 | - return $p; |
|
| 1737 | + return $p; |
|
| 1738 | 1738 | } |
| 1739 | 1739 | |
| 1740 | 1740 | |
@@ -1759,20 +1759,20 @@ discard block |
||
| 1759 | 1759 | * Pile complétée par le code à générer |
| 1760 | 1760 | **/ |
| 1761 | 1761 | function balise_FILTRE_dist($p) { |
| 1762 | - if ($p->param) { |
|
| 1763 | - $args = []; |
|
| 1764 | - foreach ($p->param as $i => $ignore) { |
|
| 1765 | - $args[] = interprete_argument_balise($i + 1, $p); |
|
| 1766 | - } |
|
| 1767 | - $p->code = "'<' . '" |
|
| 1768 | - . '?php header("X-Spip-Filtre: \'.' |
|
| 1769 | - . join('.\'|\'.', $args) |
|
| 1770 | - . " . '\"); ?'.'>'"; |
|
| 1762 | + if ($p->param) { |
|
| 1763 | + $args = []; |
|
| 1764 | + foreach ($p->param as $i => $ignore) { |
|
| 1765 | + $args[] = interprete_argument_balise($i + 1, $p); |
|
| 1766 | + } |
|
| 1767 | + $p->code = "'<' . '" |
|
| 1768 | + . '?php header("X-Spip-Filtre: \'.' |
|
| 1769 | + . join('.\'|\'.', $args) |
|
| 1770 | + . " . '\"); ?'.'>'"; |
|
| 1771 | 1771 | |
| 1772 | - $p->interdire_scripts = false; |
|
| 1772 | + $p->interdire_scripts = false; |
|
| 1773 | 1773 | |
| 1774 | - return $p; |
|
| 1775 | - } |
|
| 1774 | + return $p; |
|
| 1775 | + } |
|
| 1776 | 1776 | } |
| 1777 | 1777 | |
| 1778 | 1778 | |
@@ -1808,55 +1808,55 @@ discard block |
||
| 1808 | 1808 | **/ |
| 1809 | 1809 | function balise_CACHE_dist($p) { |
| 1810 | 1810 | |
| 1811 | - if ($p->param) { |
|
| 1812 | - $duree = valeur_numerique($p->param[0][1][0]->texte); |
|
| 1813 | - |
|
| 1814 | - // noter la duree du cache dans un entete proprietaire |
|
| 1815 | - |
|
| 1816 | - $code = "'<'.'" . '?php header("X-Spip-Cache: ' |
|
| 1817 | - . $duree |
|
| 1818 | - . '"); ?' . "'.'>'"; |
|
| 1819 | - |
|
| 1820 | - // Remplir le header Cache-Control |
|
| 1821 | - // cas #CACHE{0} |
|
| 1822 | - if ($duree == 0) { |
|
| 1823 | - $code .= ".'<'.'" |
|
| 1824 | - . '?php header("Cache-Control: no-cache, must-revalidate"); ?' |
|
| 1825 | - . "'.'><'.'" |
|
| 1826 | - . '?php header("Pragma: no-cache"); ?' |
|
| 1827 | - . "'.'>'"; |
|
| 1828 | - } |
|
| 1829 | - |
|
| 1830 | - // recuperer les parametres suivants |
|
| 1831 | - $i = 1; |
|
| 1832 | - while (isset($p->param[0][++$i])) { |
|
| 1833 | - $pa = ($p->param[0][$i][0]->texte); |
|
| 1834 | - |
|
| 1835 | - if ( |
|
| 1836 | - $pa == 'cache-client' |
|
| 1837 | - and $duree > 0 |
|
| 1838 | - ) { |
|
| 1839 | - $code .= ".'<'.'" . '?php header("Cache-Control: max-age=' |
|
| 1840 | - . $duree |
|
| 1841 | - . '"); ?' . "'.'>'"; |
|
| 1842 | - // il semble logique, si on cache-client, de ne pas invalider |
|
| 1843 | - $pa = 'statique'; |
|
| 1844 | - } |
|
| 1845 | - |
|
| 1846 | - if ( |
|
| 1847 | - $pa == 'statique' |
|
| 1848 | - and $duree > 0 |
|
| 1849 | - ) { |
|
| 1850 | - $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'"; |
|
| 1851 | - } |
|
| 1852 | - } |
|
| 1853 | - } else { |
|
| 1854 | - $code = "''"; |
|
| 1855 | - } |
|
| 1856 | - $p->code = $code; |
|
| 1857 | - $p->interdire_scripts = false; |
|
| 1858 | - |
|
| 1859 | - return $p; |
|
| 1811 | + if ($p->param) { |
|
| 1812 | + $duree = valeur_numerique($p->param[0][1][0]->texte); |
|
| 1813 | + |
|
| 1814 | + // noter la duree du cache dans un entete proprietaire |
|
| 1815 | + |
|
| 1816 | + $code = "'<'.'" . '?php header("X-Spip-Cache: ' |
|
| 1817 | + . $duree |
|
| 1818 | + . '"); ?' . "'.'>'"; |
|
| 1819 | + |
|
| 1820 | + // Remplir le header Cache-Control |
|
| 1821 | + // cas #CACHE{0} |
|
| 1822 | + if ($duree == 0) { |
|
| 1823 | + $code .= ".'<'.'" |
|
| 1824 | + . '?php header("Cache-Control: no-cache, must-revalidate"); ?' |
|
| 1825 | + . "'.'><'.'" |
|
| 1826 | + . '?php header("Pragma: no-cache"); ?' |
|
| 1827 | + . "'.'>'"; |
|
| 1828 | + } |
|
| 1829 | + |
|
| 1830 | + // recuperer les parametres suivants |
|
| 1831 | + $i = 1; |
|
| 1832 | + while (isset($p->param[0][++$i])) { |
|
| 1833 | + $pa = ($p->param[0][$i][0]->texte); |
|
| 1834 | + |
|
| 1835 | + if ( |
|
| 1836 | + $pa == 'cache-client' |
|
| 1837 | + and $duree > 0 |
|
| 1838 | + ) { |
|
| 1839 | + $code .= ".'<'.'" . '?php header("Cache-Control: max-age=' |
|
| 1840 | + . $duree |
|
| 1841 | + . '"); ?' . "'.'>'"; |
|
| 1842 | + // il semble logique, si on cache-client, de ne pas invalider |
|
| 1843 | + $pa = 'statique'; |
|
| 1844 | + } |
|
| 1845 | + |
|
| 1846 | + if ( |
|
| 1847 | + $pa == 'statique' |
|
| 1848 | + and $duree > 0 |
|
| 1849 | + ) { |
|
| 1850 | + $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'"; |
|
| 1851 | + } |
|
| 1852 | + } |
|
| 1853 | + } else { |
|
| 1854 | + $code = "''"; |
|
| 1855 | + } |
|
| 1856 | + $p->code = $code; |
|
| 1857 | + $p->interdire_scripts = false; |
|
| 1858 | + |
|
| 1859 | + return $p; |
|
| 1860 | 1860 | } |
| 1861 | 1861 | |
| 1862 | 1862 | |
@@ -1888,13 +1888,13 @@ discard block |
||
| 1888 | 1888 | * Pile complétée par le code à générer |
| 1889 | 1889 | */ |
| 1890 | 1890 | function balise_INSERT_HEAD_dist($p) { |
| 1891 | - $p->code = "'<'.'" |
|
| 1892 | - . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?' |
|
| 1893 | - . "'.'>'"; |
|
| 1894 | - $p->code .= ". pipeline('insert_head','<!-- insert_head -->')"; |
|
| 1895 | - $p->interdire_scripts = false; |
|
| 1891 | + $p->code = "'<'.'" |
|
| 1892 | + . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?' |
|
| 1893 | + . "'.'>'"; |
|
| 1894 | + $p->code .= ". pipeline('insert_head','<!-- insert_head -->')"; |
|
| 1895 | + $p->interdire_scripts = false; |
|
| 1896 | 1896 | |
| 1897 | - return $p; |
|
| 1897 | + return $p; |
|
| 1898 | 1898 | } |
| 1899 | 1899 | |
| 1900 | 1900 | /** |
@@ -1912,10 +1912,10 @@ discard block |
||
| 1912 | 1912 | * Pile complétée par le code à générer |
| 1913 | 1913 | */ |
| 1914 | 1914 | function balise_INSERT_HEAD_CSS_dist($p) { |
| 1915 | - $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')"; |
|
| 1916 | - $p->interdire_scripts = false; |
|
| 1915 | + $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')"; |
|
| 1916 | + $p->interdire_scripts = false; |
|
| 1917 | 1917 | |
| 1918 | - return $p; |
|
| 1918 | + return $p; |
|
| 1919 | 1919 | } |
| 1920 | 1920 | |
| 1921 | 1921 | /** |
@@ -1930,11 +1930,11 @@ discard block |
||
| 1930 | 1930 | * Pile complétée par le code à générer |
| 1931 | 1931 | **/ |
| 1932 | 1932 | function balise_INCLUDE_dist($p) { |
| 1933 | - if (function_exists('balise_INCLURE')) { |
|
| 1934 | - return balise_INCLURE($p); |
|
| 1935 | - } else { |
|
| 1936 | - return balise_INCLURE_dist($p); |
|
| 1937 | - } |
|
| 1933 | + if (function_exists('balise_INCLURE')) { |
|
| 1934 | + return balise_INCLURE($p); |
|
| 1935 | + } else { |
|
| 1936 | + return balise_INCLURE_dist($p); |
|
| 1937 | + } |
|
| 1938 | 1938 | } |
| 1939 | 1939 | |
| 1940 | 1940 | /** |
@@ -1968,66 +1968,66 @@ discard block |
||
| 1968 | 1968 | * Pile complétée par le code à générer |
| 1969 | 1969 | **/ |
| 1970 | 1970 | function balise_INCLURE_dist($p) { |
| 1971 | - $id_boucle = $p->id_boucle; |
|
| 1972 | - // la lang n'est pas passe de facon automatique par argumenter |
|
| 1973 | - // mais le sera pas recuperer_fond, sauf si etoile=>true est passe |
|
| 1974 | - // en option |
|
| 1975 | - |
|
| 1976 | - $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false); |
|
| 1977 | - |
|
| 1978 | - // erreur de syntaxe = fond absent |
|
| 1979 | - // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP |
|
| 1980 | - if (!$_contexte) { |
|
| 1981 | - $contexte = []; |
|
| 1982 | - } |
|
| 1983 | - |
|
| 1984 | - if (isset($_contexte['fond'])) { |
|
| 1985 | - $f = $_contexte['fond']; |
|
| 1986 | - // toujours vrai : |
|
| 1987 | - if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) { |
|
| 1988 | - $f = $r[1]; |
|
| 1989 | - unset($_contexte['fond']); |
|
| 1990 | - } else { |
|
| 1991 | - spip_log('compilation de #INCLURE a revoir'); |
|
| 1992 | - } |
|
| 1993 | - |
|
| 1994 | - // #INCLURE{doublons} |
|
| 1995 | - if (isset($_contexte['doublons'])) { |
|
| 1996 | - $_contexte['doublons'] = "'doublons' => \$doublons"; |
|
| 1997 | - } |
|
| 1998 | - |
|
| 1999 | - // Critere d'inclusion {env} (et {self} pour compatibilite ascendante) |
|
| 2000 | - $flag_env = false; |
|
| 2001 | - if (isset($_contexte['env']) or isset($_contexte['self'])) { |
|
| 2002 | - $flag_env = true; |
|
| 2003 | - unset($_contexte['env']); |
|
| 2004 | - } |
|
| 2005 | - |
|
| 2006 | - $_options = []; |
|
| 2007 | - if (isset($_contexte['ajax'])) { |
|
| 2008 | - $_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']); |
|
| 2009 | - unset($_contexte['ajax']); |
|
| 2010 | - } |
|
| 2011 | - if ($p->etoile) { |
|
| 2012 | - $_options[] = "'etoile'=>true"; |
|
| 2013 | - } |
|
| 2014 | - $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')'; |
|
| 2015 | - |
|
| 2016 | - $_l = 'array(' . join(",\n\t", $_contexte) . ')'; |
|
| 2017 | - if ($flag_env) { |
|
| 2018 | - $_l = "array_merge(\$Pile[0],$_l)"; |
|
| 2019 | - } |
|
| 2020 | - |
|
| 2021 | - $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''"); |
|
| 2022 | - } elseif (!isset($_contexte[1])) { |
|
| 2023 | - $msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']]; |
|
| 2024 | - erreur_squelette($msg, $p); |
|
| 2025 | - } else { |
|
| 2026 | - $p->code = 'charge_scripts(' . $_contexte[1] . ',false)'; |
|
| 2027 | - } |
|
| 2028 | - |
|
| 2029 | - $p->interdire_scripts = false; // la securite est assuree par recuperer_fond |
|
| 2030 | - return $p; |
|
| 1971 | + $id_boucle = $p->id_boucle; |
|
| 1972 | + // la lang n'est pas passe de facon automatique par argumenter |
|
| 1973 | + // mais le sera pas recuperer_fond, sauf si etoile=>true est passe |
|
| 1974 | + // en option |
|
| 1975 | + |
|
| 1976 | + $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false); |
|
| 1977 | + |
|
| 1978 | + // erreur de syntaxe = fond absent |
|
| 1979 | + // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP |
|
| 1980 | + if (!$_contexte) { |
|
| 1981 | + $contexte = []; |
|
| 1982 | + } |
|
| 1983 | + |
|
| 1984 | + if (isset($_contexte['fond'])) { |
|
| 1985 | + $f = $_contexte['fond']; |
|
| 1986 | + // toujours vrai : |
|
| 1987 | + if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) { |
|
| 1988 | + $f = $r[1]; |
|
| 1989 | + unset($_contexte['fond']); |
|
| 1990 | + } else { |
|
| 1991 | + spip_log('compilation de #INCLURE a revoir'); |
|
| 1992 | + } |
|
| 1993 | + |
|
| 1994 | + // #INCLURE{doublons} |
|
| 1995 | + if (isset($_contexte['doublons'])) { |
|
| 1996 | + $_contexte['doublons'] = "'doublons' => \$doublons"; |
|
| 1997 | + } |
|
| 1998 | + |
|
| 1999 | + // Critere d'inclusion {env} (et {self} pour compatibilite ascendante) |
|
| 2000 | + $flag_env = false; |
|
| 2001 | + if (isset($_contexte['env']) or isset($_contexte['self'])) { |
|
| 2002 | + $flag_env = true; |
|
| 2003 | + unset($_contexte['env']); |
|
| 2004 | + } |
|
| 2005 | + |
|
| 2006 | + $_options = []; |
|
| 2007 | + if (isset($_contexte['ajax'])) { |
|
| 2008 | + $_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']); |
|
| 2009 | + unset($_contexte['ajax']); |
|
| 2010 | + } |
|
| 2011 | + if ($p->etoile) { |
|
| 2012 | + $_options[] = "'etoile'=>true"; |
|
| 2013 | + } |
|
| 2014 | + $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')'; |
|
| 2015 | + |
|
| 2016 | + $_l = 'array(' . join(",\n\t", $_contexte) . ')'; |
|
| 2017 | + if ($flag_env) { |
|
| 2018 | + $_l = "array_merge(\$Pile[0],$_l)"; |
|
| 2019 | + } |
|
| 2020 | + |
|
| 2021 | + $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''"); |
|
| 2022 | + } elseif (!isset($_contexte[1])) { |
|
| 2023 | + $msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']]; |
|
| 2024 | + erreur_squelette($msg, $p); |
|
| 2025 | + } else { |
|
| 2026 | + $p->code = 'charge_scripts(' . $_contexte[1] . ',false)'; |
|
| 2027 | + } |
|
| 2028 | + |
|
| 2029 | + $p->interdire_scripts = false; // la securite est assuree par recuperer_fond |
|
| 2030 | + return $p; |
|
| 2031 | 2031 | } |
| 2032 | 2032 | |
| 2033 | 2033 | |
@@ -2055,69 +2055,69 @@ discard block |
||
| 2055 | 2055 | **/ |
| 2056 | 2056 | function balise_MODELE_dist($p) { |
| 2057 | 2057 | |
| 2058 | - $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false); |
|
| 2059 | - |
|
| 2060 | - // erreur de syntaxe = fond absent |
|
| 2061 | - // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP |
|
| 2062 | - if (!$_contexte) { |
|
| 2063 | - $_contexte = []; |
|
| 2064 | - } |
|
| 2065 | - |
|
| 2066 | - if (!isset($_contexte[1])) { |
|
| 2067 | - $msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']]; |
|
| 2068 | - erreur_squelette($msg, $p); |
|
| 2069 | - } else { |
|
| 2070 | - $nom = $_contexte[1]; |
|
| 2071 | - unset($_contexte[1]); |
|
| 2072 | - |
|
| 2073 | - if (preg_match("/^\s*'[^']*'/s", $nom)) { |
|
| 2074 | - $nom = "'modeles/" . substr($nom, 1); |
|
| 2075 | - } else { |
|
| 2076 | - $nom = "'modeles/' . $nom"; |
|
| 2077 | - } |
|
| 2078 | - |
|
| 2079 | - $flag_env = false; |
|
| 2080 | - if (isset($_contexte['env'])) { |
|
| 2081 | - $flag_env = true; |
|
| 2082 | - unset($_contexte['env']); |
|
| 2083 | - } |
|
| 2084 | - |
|
| 2085 | - // Incoherence dans la syntaxe du contexte. A revoir. |
|
| 2086 | - // Reserver la cle primaire de la boucle courante si elle existe |
|
| 2087 | - if (isset($p->boucles[$p->id_boucle]->primary)) { |
|
| 2088 | - $primary = $p->boucles[$p->id_boucle]->primary; |
|
| 2089 | - if (!strpos($primary, ',')) { |
|
| 2090 | - $id = champ_sql($primary, $p); |
|
| 2091 | - $_contexte[] = "'$primary'=>" . $id; |
|
| 2092 | - $_contexte[] = "'id'=>" . $id; |
|
| 2093 | - } |
|
| 2094 | - } |
|
| 2095 | - $_contexte[] = "'recurs'=>(++\$recurs)"; |
|
| 2096 | - $connect = ''; |
|
| 2097 | - if (isset($p->boucles[$p->id_boucle])) { |
|
| 2098 | - $connect = $p->boucles[$p->id_boucle]->sql_serveur; |
|
| 2099 | - } |
|
| 2100 | - |
|
| 2101 | - $_options = memoriser_contexte_compil($p); |
|
| 2102 | - $_options = "'compil'=>array($_options), 'trim'=>true"; |
|
| 2103 | - if (isset($_contexte['ajax'])) { |
|
| 2104 | - $_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']); |
|
| 2105 | - unset($_contexte['ajax']); |
|
| 2106 | - } |
|
| 2107 | - |
|
| 2108 | - $_l = 'array(' . join(",\n\t", $_contexte) . ')'; |
|
| 2109 | - if ($flag_env) { |
|
| 2110 | - $_l = "array_merge(\$Pile[0],$_l)"; |
|
| 2111 | - } |
|
| 2112 | - |
|
| 2113 | - $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect)); |
|
| 2114 | - |
|
| 2115 | - $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n"; |
|
| 2116 | - |
|
| 2117 | - $p->interdire_scripts = false; // securite assuree par le squelette |
|
| 2118 | - } |
|
| 2119 | - |
|
| 2120 | - return $p; |
|
| 2058 | + $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false); |
|
| 2059 | + |
|
| 2060 | + // erreur de syntaxe = fond absent |
|
| 2061 | + // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP |
|
| 2062 | + if (!$_contexte) { |
|
| 2063 | + $_contexte = []; |
|
| 2064 | + } |
|
| 2065 | + |
|
| 2066 | + if (!isset($_contexte[1])) { |
|
| 2067 | + $msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']]; |
|
| 2068 | + erreur_squelette($msg, $p); |
|
| 2069 | + } else { |
|
| 2070 | + $nom = $_contexte[1]; |
|
| 2071 | + unset($_contexte[1]); |
|
| 2072 | + |
|
| 2073 | + if (preg_match("/^\s*'[^']*'/s", $nom)) { |
|
| 2074 | + $nom = "'modeles/" . substr($nom, 1); |
|
| 2075 | + } else { |
|
| 2076 | + $nom = "'modeles/' . $nom"; |
|
| 2077 | + } |
|
| 2078 | + |
|
| 2079 | + $flag_env = false; |
|
| 2080 | + if (isset($_contexte['env'])) { |
|
| 2081 | + $flag_env = true; |
|
| 2082 | + unset($_contexte['env']); |
|
| 2083 | + } |
|
| 2084 | + |
|
| 2085 | + // Incoherence dans la syntaxe du contexte. A revoir. |
|
| 2086 | + // Reserver la cle primaire de la boucle courante si elle existe |
|
| 2087 | + if (isset($p->boucles[$p->id_boucle]->primary)) { |
|
| 2088 | + $primary = $p->boucles[$p->id_boucle]->primary; |
|
| 2089 | + if (!strpos($primary, ',')) { |
|
| 2090 | + $id = champ_sql($primary, $p); |
|
| 2091 | + $_contexte[] = "'$primary'=>" . $id; |
|
| 2092 | + $_contexte[] = "'id'=>" . $id; |
|
| 2093 | + } |
|
| 2094 | + } |
|
| 2095 | + $_contexte[] = "'recurs'=>(++\$recurs)"; |
|
| 2096 | + $connect = ''; |
|
| 2097 | + if (isset($p->boucles[$p->id_boucle])) { |
|
| 2098 | + $connect = $p->boucles[$p->id_boucle]->sql_serveur; |
|
| 2099 | + } |
|
| 2100 | + |
|
| 2101 | + $_options = memoriser_contexte_compil($p); |
|
| 2102 | + $_options = "'compil'=>array($_options), 'trim'=>true"; |
|
| 2103 | + if (isset($_contexte['ajax'])) { |
|
| 2104 | + $_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']); |
|
| 2105 | + unset($_contexte['ajax']); |
|
| 2106 | + } |
|
| 2107 | + |
|
| 2108 | + $_l = 'array(' . join(",\n\t", $_contexte) . ')'; |
|
| 2109 | + if ($flag_env) { |
|
| 2110 | + $_l = "array_merge(\$Pile[0],$_l)"; |
|
| 2111 | + } |
|
| 2112 | + |
|
| 2113 | + $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect)); |
|
| 2114 | + |
|
| 2115 | + $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n"; |
|
| 2116 | + |
|
| 2117 | + $p->interdire_scripts = false; // securite assuree par le squelette |
|
| 2118 | + } |
|
| 2119 | + |
|
| 2120 | + return $p; |
|
| 2121 | 2121 | } |
| 2122 | 2122 | |
| 2123 | 2123 | |
@@ -2141,21 +2141,21 @@ discard block |
||
| 2141 | 2141 | * Pile complétée par le code à générer |
| 2142 | 2142 | **/ |
| 2143 | 2143 | function balise_SET_dist($p) { |
| 2144 | - $_nom = interprete_argument_balise(1, $p); |
|
| 2145 | - $_val = interprete_argument_balise(2, $p); |
|
| 2144 | + $_nom = interprete_argument_balise(1, $p); |
|
| 2145 | + $_val = interprete_argument_balise(2, $p); |
|
| 2146 | 2146 | |
| 2147 | - if (!$_nom or !$_val) { |
|
| 2148 | - $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']]; |
|
| 2149 | - erreur_squelette($err_b_s_a, $p); |
|
| 2150 | - } |
|
| 2151 | - // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4 |
|
| 2152 | - // cf https://bugs.php.net/bug.php?id=65845 |
|
| 2153 | - else { |
|
| 2154 | - $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)"; |
|
| 2155 | - } |
|
| 2147 | + if (!$_nom or !$_val) { |
|
| 2148 | + $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']]; |
|
| 2149 | + erreur_squelette($err_b_s_a, $p); |
|
| 2150 | + } |
|
| 2151 | + // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4 |
|
| 2152 | + // cf https://bugs.php.net/bug.php?id=65845 |
|
| 2153 | + else { |
|
| 2154 | + $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)"; |
|
| 2155 | + } |
|
| 2156 | 2156 | |
| 2157 | - $p->interdire_scripts = false; // la balise ne renvoie rien |
|
| 2158 | - return $p; |
|
| 2157 | + $p->interdire_scripts = false; // la balise ne renvoie rien |
|
| 2158 | + return $p; |
|
| 2159 | 2159 | } |
| 2160 | 2160 | |
| 2161 | 2161 | |
@@ -2185,12 +2185,12 @@ discard block |
||
| 2185 | 2185 | * Pile complétée par le code à générer |
| 2186 | 2186 | **/ |
| 2187 | 2187 | function balise_GET_dist($p) { |
| 2188 | - $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance |
|
| 2189 | - if (function_exists('balise_ENV')) { |
|
| 2190 | - return balise_ENV($p, '$Pile["vars"]??[]'); |
|
| 2191 | - } else { |
|
| 2192 | - return balise_ENV_dist($p, '$Pile["vars"]??[]'); |
|
| 2193 | - } |
|
| 2188 | + $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance |
|
| 2189 | + if (function_exists('balise_ENV')) { |
|
| 2190 | + return balise_ENV($p, '$Pile["vars"]??[]'); |
|
| 2191 | + } else { |
|
| 2192 | + return balise_ENV_dist($p, '$Pile["vars"]??[]'); |
|
| 2193 | + } |
|
| 2194 | 2194 | } |
| 2195 | 2195 | |
| 2196 | 2196 | |
@@ -2213,22 +2213,22 @@ discard block |
||
| 2213 | 2213 | * Pile complétée par le code à générer |
| 2214 | 2214 | **/ |
| 2215 | 2215 | function balise_DOUBLONS_dist($p) { |
| 2216 | - if ($type = interprete_argument_balise(1, $p)) { |
|
| 2217 | - if ($famille = interprete_argument_balise(2, $p)) { |
|
| 2218 | - $type .= '.' . $famille; |
|
| 2219 | - } |
|
| 2220 | - $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")'; |
|
| 2221 | - if (!$p->etoile) { |
|
| 2222 | - $p->code = 'array_filter(array_map("intval",explode(",",' |
|
| 2223 | - . $p->code . ')))'; |
|
| 2224 | - } |
|
| 2225 | - } else { |
|
| 2226 | - $p->code = '$doublons'; |
|
| 2227 | - } |
|
| 2216 | + if ($type = interprete_argument_balise(1, $p)) { |
|
| 2217 | + if ($famille = interprete_argument_balise(2, $p)) { |
|
| 2218 | + $type .= '.' . $famille; |
|
| 2219 | + } |
|
| 2220 | + $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")'; |
|
| 2221 | + if (!$p->etoile) { |
|
| 2222 | + $p->code = 'array_filter(array_map("intval",explode(",",' |
|
| 2223 | + . $p->code . ')))'; |
|
| 2224 | + } |
|
| 2225 | + } else { |
|
| 2226 | + $p->code = '$doublons'; |
|
| 2227 | + } |
|
| 2228 | 2228 | |
| 2229 | - $p->interdire_scripts = false; |
|
| 2229 | + $p->interdire_scripts = false; |
|
| 2230 | 2230 | |
| 2231 | - return $p; |
|
| 2231 | + return $p; |
|
| 2232 | 2232 | } |
| 2233 | 2233 | |
| 2234 | 2234 | |
@@ -2251,18 +2251,18 @@ discard block |
||
| 2251 | 2251 | * Pile complétée par le code à générer |
| 2252 | 2252 | **/ |
| 2253 | 2253 | function balise_PIPELINE_dist($p) { |
| 2254 | - $_pipe = interprete_argument_balise(1, $p); |
|
| 2255 | - if (!$_pipe) { |
|
| 2256 | - $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']]; |
|
| 2257 | - erreur_squelette($err_b_s_a, $p); |
|
| 2258 | - } else { |
|
| 2259 | - $_flux = interprete_argument_balise(2, $p); |
|
| 2260 | - $_flux = $_flux ?: "''"; |
|
| 2261 | - $p->code = "pipeline( $_pipe , $_flux )"; |
|
| 2262 | - $p->interdire_scripts = false; |
|
| 2263 | - } |
|
| 2254 | + $_pipe = interprete_argument_balise(1, $p); |
|
| 2255 | + if (!$_pipe) { |
|
| 2256 | + $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']]; |
|
| 2257 | + erreur_squelette($err_b_s_a, $p); |
|
| 2258 | + } else { |
|
| 2259 | + $_flux = interprete_argument_balise(2, $p); |
|
| 2260 | + $_flux = $_flux ?: "''"; |
|
| 2261 | + $p->code = "pipeline( $_pipe , $_flux )"; |
|
| 2262 | + $p->interdire_scripts = false; |
|
| 2263 | + } |
|
| 2264 | 2264 | |
| 2265 | - return $p; |
|
| 2265 | + return $p; |
|
| 2266 | 2266 | } |
| 2267 | 2267 | |
| 2268 | 2268 | |
@@ -2287,10 +2287,10 @@ discard block |
||
| 2287 | 2287 | * Pile complétée par le code à générer |
| 2288 | 2288 | **/ |
| 2289 | 2289 | function balise_EDIT_dist($p) { |
| 2290 | - $p->code = "''"; |
|
| 2291 | - $p->interdire_scripts = false; |
|
| 2290 | + $p->code = "''"; |
|
| 2291 | + $p->interdire_scripts = false; |
|
| 2292 | 2292 | |
| 2293 | - return $p; |
|
| 2293 | + return $p; |
|
| 2294 | 2294 | } |
| 2295 | 2295 | |
| 2296 | 2296 | |
@@ -2313,11 +2313,11 @@ discard block |
||
| 2313 | 2313 | * Pile complétée par le code à générer |
| 2314 | 2314 | **/ |
| 2315 | 2315 | function balise_TOTAL_UNIQUE_dist($p) { |
| 2316 | - $_famille = interprete_argument_balise(1, $p); |
|
| 2317 | - $_famille = $_famille ?: "''"; |
|
| 2318 | - $p->code = "unique('', $_famille, true)"; |
|
| 2316 | + $_famille = interprete_argument_balise(1, $p); |
|
| 2317 | + $_famille = $_famille ?: "''"; |
|
| 2318 | + $p->code = "unique('', $_famille, true)"; |
|
| 2319 | 2319 | |
| 2320 | - return $p; |
|
| 2320 | + return $p; |
|
| 2321 | 2321 | } |
| 2322 | 2322 | |
| 2323 | 2323 | /** |
@@ -2340,19 +2340,19 @@ discard block |
||
| 2340 | 2340 | * Pile complétée par le code à générer |
| 2341 | 2341 | **/ |
| 2342 | 2342 | function balise_ARRAY_dist($p) { |
| 2343 | - $_code = []; |
|
| 2344 | - $n = 1; |
|
| 2345 | - do { |
|
| 2346 | - $_key = interprete_argument_balise($n++, $p); |
|
| 2347 | - $_val = interprete_argument_balise($n++, $p); |
|
| 2348 | - if ($_key and $_val) { |
|
| 2349 | - $_code[] = "$_key => $_val"; |
|
| 2350 | - } |
|
| 2351 | - } while ($_key && $_val); |
|
| 2352 | - $p->code = 'array(' . join(', ', $_code) . ')'; |
|
| 2353 | - $p->interdire_scripts = false; |
|
| 2343 | + $_code = []; |
|
| 2344 | + $n = 1; |
|
| 2345 | + do { |
|
| 2346 | + $_key = interprete_argument_balise($n++, $p); |
|
| 2347 | + $_val = interprete_argument_balise($n++, $p); |
|
| 2348 | + if ($_key and $_val) { |
|
| 2349 | + $_code[] = "$_key => $_val"; |
|
| 2350 | + } |
|
| 2351 | + } while ($_key && $_val); |
|
| 2352 | + $p->code = 'array(' . join(', ', $_code) . ')'; |
|
| 2353 | + $p->interdire_scripts = false; |
|
| 2354 | 2354 | |
| 2355 | - return $p; |
|
| 2355 | + return $p; |
|
| 2356 | 2356 | } |
| 2357 | 2357 | |
| 2358 | 2358 | /** |
@@ -2371,15 +2371,15 @@ discard block |
||
| 2371 | 2371 | * Pile complétée par le code à générer |
| 2372 | 2372 | */ |
| 2373 | 2373 | function balise_LISTE_dist($p) { |
| 2374 | - $_code = []; |
|
| 2375 | - $n = 1; |
|
| 2376 | - while ($_val = interprete_argument_balise($n++, $p)) { |
|
| 2377 | - $_code[] = $_val; |
|
| 2378 | - } |
|
| 2379 | - $p->code = 'array(' . join(', ', $_code) . ')'; |
|
| 2380 | - $p->interdire_scripts = false; |
|
| 2374 | + $_code = []; |
|
| 2375 | + $n = 1; |
|
| 2376 | + while ($_val = interprete_argument_balise($n++, $p)) { |
|
| 2377 | + $_code[] = $_val; |
|
| 2378 | + } |
|
| 2379 | + $p->code = 'array(' . join(', ', $_code) . ')'; |
|
| 2380 | + $p->interdire_scripts = false; |
|
| 2381 | 2381 | |
| 2382 | - return $p; |
|
| 2382 | + return $p; |
|
| 2383 | 2383 | } |
| 2384 | 2384 | |
| 2385 | 2385 | |
@@ -2413,21 +2413,21 @@ discard block |
||
| 2413 | 2413 | * Pile complétée par le code à générer |
| 2414 | 2414 | **/ |
| 2415 | 2415 | function balise_AUTORISER_dist($p) { |
| 2416 | - $_code = []; |
|
| 2417 | - $p->descr['session'] = true; // faire un cache par session |
|
| 2416 | + $_code = []; |
|
| 2417 | + $p->descr['session'] = true; // faire un cache par session |
|
| 2418 | 2418 | |
| 2419 | - $n = 1; |
|
| 2420 | - while ($_v = interprete_argument_balise($n++, $p)) { |
|
| 2421 | - $_code[] = $_v; |
|
| 2422 | - } |
|
| 2419 | + $n = 1; |
|
| 2420 | + while ($_v = interprete_argument_balise($n++, $p)) { |
|
| 2421 | + $_code[] = $_v; |
|
| 2422 | + } |
|
| 2423 | 2423 | |
| 2424 | - $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join( |
|
| 2425 | - ', ', |
|
| 2426 | - $_code |
|
| 2427 | - ) . ')?" ":"")'; |
|
| 2428 | - $p->interdire_scripts = false; |
|
| 2424 | + $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join( |
|
| 2425 | + ', ', |
|
| 2426 | + $_code |
|
| 2427 | + ) . ')?" ":"")'; |
|
| 2428 | + $p->interdire_scripts = false; |
|
| 2429 | 2429 | |
| 2430 | - return $p; |
|
| 2430 | + return $p; |
|
| 2431 | 2431 | } |
| 2432 | 2432 | |
| 2433 | 2433 | |
@@ -2451,15 +2451,15 @@ discard block |
||
| 2451 | 2451 | * Pile complétée par le code à générer |
| 2452 | 2452 | **/ |
| 2453 | 2453 | function balise_PLUGIN_dist($p) { |
| 2454 | - $plugin = interprete_argument_balise(1, $p); |
|
| 2455 | - $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""'; |
|
| 2456 | - $type_info = interprete_argument_balise(2, $p); |
|
| 2457 | - $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"'; |
|
| 2454 | + $plugin = interprete_argument_balise(1, $p); |
|
| 2455 | + $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""'; |
|
| 2456 | + $type_info = interprete_argument_balise(2, $p); |
|
| 2457 | + $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"'; |
|
| 2458 | 2458 | |
| 2459 | - $f = chercher_filtre('info_plugin'); |
|
| 2460 | - $p->code = $f . '(' . $plugin . ', ' . $type_info . ')'; |
|
| 2459 | + $f = chercher_filtre('info_plugin'); |
|
| 2460 | + $p->code = $f . '(' . $plugin . ', ' . $type_info . ')'; |
|
| 2461 | 2461 | |
| 2462 | - return $p; |
|
| 2462 | + return $p; |
|
| 2463 | 2463 | } |
| 2464 | 2464 | |
| 2465 | 2465 | /** |
@@ -2480,9 +2480,9 @@ discard block |
||
| 2480 | 2480 | * Pile complétée par le code à générer |
| 2481 | 2481 | **/ |
| 2482 | 2482 | function balise_AIDER_dist($p) { |
| 2483 | - $_motif = interprete_argument_balise(1, $p); |
|
| 2484 | - $p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')"; |
|
| 2485 | - return $p; |
|
| 2483 | + $_motif = interprete_argument_balise(1, $p); |
|
| 2484 | + $p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')"; |
|
| 2485 | + return $p; |
|
| 2486 | 2486 | } |
| 2487 | 2487 | |
| 2488 | 2488 | /** |
@@ -2508,16 +2508,16 @@ discard block |
||
| 2508 | 2508 | * Pile complétée par le code à générer |
| 2509 | 2509 | **/ |
| 2510 | 2510 | function balise_ACTION_FORMULAIRE($p) { |
| 2511 | - if (!$_url = interprete_argument_balise(1, $p)) { |
|
| 2512 | - $_url = "(\$Pile[0]['action'] ?? '')"; |
|
| 2513 | - } |
|
| 2514 | - if (!$_form = interprete_argument_balise(2, $p)) { |
|
| 2515 | - $_form = "(\$Pile[0]['form'] ?? '')"; |
|
| 2516 | - } |
|
| 2517 | - |
|
| 2518 | - // envoyer le nom du formulaire que l'on traite |
|
| 2519 | - // transmettre les eventuels args de la balise formulaire |
|
| 2520 | - $p->code = " '<span class=\"form-hidden\">' . |
|
| 2511 | + if (!$_url = interprete_argument_balise(1, $p)) { |
|
| 2512 | + $_url = "(\$Pile[0]['action'] ?? '')"; |
|
| 2513 | + } |
|
| 2514 | + if (!$_form = interprete_argument_balise(2, $p)) { |
|
| 2515 | + $_form = "(\$Pile[0]['form'] ?? '')"; |
|
| 2516 | + } |
|
| 2517 | + |
|
| 2518 | + // envoyer le nom du formulaire que l'on traite |
|
| 2519 | + // transmettre les eventuels args de la balise formulaire |
|
| 2520 | + $p->code = " '<span class=\"form-hidden\">' . |
|
| 2521 | 2521 | form_hidden($_url) . |
| 2522 | 2522 | '<input name=\'formulaire_action\' type=\'hidden\' |
| 2523 | 2523 | value=\'' . $_form . '\' />' . |
@@ -2528,9 +2528,9 @@ discard block |
||
| 2528 | 2528 | (\$Pile[0]['_hidden'] ?? '') . |
| 2529 | 2529 | '</span>'"; |
| 2530 | 2530 | |
| 2531 | - $p->interdire_scripts = false; |
|
| 2531 | + $p->interdire_scripts = false; |
|
| 2532 | 2532 | |
| 2533 | - return $p; |
|
| 2533 | + return $p; |
|
| 2534 | 2534 | } |
| 2535 | 2535 | |
| 2536 | 2536 | |
@@ -2571,25 +2571,25 @@ discard block |
||
| 2571 | 2571 | */ |
| 2572 | 2572 | function balise_BOUTON_ACTION_dist($p) { |
| 2573 | 2573 | |
| 2574 | - $args = []; |
|
| 2575 | - for ($k = 1; $k <= 6; $k++) { |
|
| 2576 | - $_a = interprete_argument_balise($k, $p); |
|
| 2577 | - if (!$_a) { |
|
| 2578 | - $_a = "''"; |
|
| 2579 | - } |
|
| 2580 | - $args[] = $_a; |
|
| 2581 | - } |
|
| 2582 | - // supprimer les args vides |
|
| 2583 | - while (end($args) == "''" and count($args) > 2) { |
|
| 2584 | - array_pop($args); |
|
| 2585 | - } |
|
| 2586 | - $args = implode(',', $args); |
|
| 2574 | + $args = []; |
|
| 2575 | + for ($k = 1; $k <= 6; $k++) { |
|
| 2576 | + $_a = interprete_argument_balise($k, $p); |
|
| 2577 | + if (!$_a) { |
|
| 2578 | + $_a = "''"; |
|
| 2579 | + } |
|
| 2580 | + $args[] = $_a; |
|
| 2581 | + } |
|
| 2582 | + // supprimer les args vides |
|
| 2583 | + while (end($args) == "''" and count($args) > 2) { |
|
| 2584 | + array_pop($args); |
|
| 2585 | + } |
|
| 2586 | + $args = implode(',', $args); |
|
| 2587 | 2587 | |
| 2588 | - $bouton_action = chercher_filtre('bouton_action'); |
|
| 2589 | - $p->code = "$bouton_action($args)"; |
|
| 2590 | - $p->interdire_scripts = false; |
|
| 2588 | + $bouton_action = chercher_filtre('bouton_action'); |
|
| 2589 | + $p->code = "$bouton_action($args)"; |
|
| 2590 | + $p->interdire_scripts = false; |
|
| 2591 | 2591 | |
| 2592 | - return $p; |
|
| 2592 | + return $p; |
|
| 2593 | 2593 | } |
| 2594 | 2594 | |
| 2595 | 2595 | |
@@ -2608,10 +2608,10 @@ discard block |
||
| 2608 | 2608 | * Pile complétée par le code à générer |
| 2609 | 2609 | */ |
| 2610 | 2610 | function balise_SLOGAN_SITE_SPIP_dist($p) { |
| 2611 | - $p->code = "\$GLOBALS['meta']['slogan_site']"; |
|
| 2611 | + $p->code = "\$GLOBALS['meta']['slogan_site']"; |
|
| 2612 | 2612 | |
| 2613 | - #$p->interdire_scripts = true; |
|
| 2614 | - return $p; |
|
| 2613 | + #$p->interdire_scripts = true; |
|
| 2614 | + return $p; |
|
| 2615 | 2615 | } |
| 2616 | 2616 | |
| 2617 | 2617 | |
@@ -2635,10 +2635,10 @@ discard block |
||
| 2635 | 2635 | * Pile complétée par le code à générer |
| 2636 | 2636 | */ |
| 2637 | 2637 | function balise_HTML5_dist($p) { |
| 2638 | - $p->code = html5_permis() ? "' '" : "''"; |
|
| 2639 | - $p->interdire_scripts = false; |
|
| 2638 | + $p->code = html5_permis() ? "' '" : "''"; |
|
| 2639 | + $p->interdire_scripts = false; |
|
| 2640 | 2640 | |
| 2641 | - return $p; |
|
| 2641 | + return $p; |
|
| 2642 | 2642 | } |
| 2643 | 2643 | |
| 2644 | 2644 | |
@@ -2664,58 +2664,58 @@ discard block |
||
| 2664 | 2664 | * Pile complétée par le code à générer |
| 2665 | 2665 | */ |
| 2666 | 2666 | function balise_TRI_dist($p, $liste = 'true') { |
| 2667 | - $b = index_boucle_mere($p); |
|
| 2668 | - // s'il n'y a pas de nom de boucle, on ne peut pas trier |
|
| 2669 | - if ($b === '') { |
|
| 2670 | - $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]]; |
|
| 2671 | - erreur_squelette($msg, $p); |
|
| 2672 | - $p->code = "''"; |
|
| 2667 | + $b = index_boucle_mere($p); |
|
| 2668 | + // s'il n'y a pas de nom de boucle, on ne peut pas trier |
|
| 2669 | + if ($b === '') { |
|
| 2670 | + $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]]; |
|
| 2671 | + erreur_squelette($msg, $p); |
|
| 2672 | + $p->code = "''"; |
|
| 2673 | 2673 | |
| 2674 | - return $p; |
|
| 2675 | - } |
|
| 2676 | - $boucle = $p->boucles[$b]; |
|
| 2674 | + return $p; |
|
| 2675 | + } |
|
| 2676 | + $boucle = $p->boucles[$b]; |
|
| 2677 | 2677 | |
| 2678 | - // s'il n'y a pas de tri_champ, c'est qu'on se trouve |
|
| 2679 | - // dans un boucle recursive ou qu'on a oublie le critere {tri} |
|
| 2680 | - if (!isset($boucle->modificateur['tri_champ'])) { |
|
| 2681 | - $msg = ['zbug_champ_hors_critere', [ |
|
| 2682 | - 'champ' => zbug_presenter_champ($p), |
|
| 2683 | - 'critere' => 'tri' |
|
| 2684 | - ]]; |
|
| 2685 | - erreur_squelette($msg, $p); |
|
| 2686 | - $p->code = "''"; |
|
| 2678 | + // s'il n'y a pas de tri_champ, c'est qu'on se trouve |
|
| 2679 | + // dans un boucle recursive ou qu'on a oublie le critere {tri} |
|
| 2680 | + if (!isset($boucle->modificateur['tri_champ'])) { |
|
| 2681 | + $msg = ['zbug_champ_hors_critere', [ |
|
| 2682 | + 'champ' => zbug_presenter_champ($p), |
|
| 2683 | + 'critere' => 'tri' |
|
| 2684 | + ]]; |
|
| 2685 | + erreur_squelette($msg, $p); |
|
| 2686 | + $p->code = "''"; |
|
| 2687 | 2687 | |
| 2688 | - return $p; |
|
| 2689 | - } |
|
| 2688 | + return $p; |
|
| 2689 | + } |
|
| 2690 | 2690 | |
| 2691 | - // Différentes infos relatives au tri présentes dans les modificateurs |
|
| 2692 | - $_tri_nom = $boucle->modificateur['tri_nom'] ; // nom du paramètre définissant le tri |
|
| 2693 | - $_tri_champ = $boucle->modificateur['tri_champ']; // champ actuel utilisé le tri |
|
| 2694 | - $_tri_sens = $boucle->modificateur['tri_sens']; // sens de tri actuel |
|
| 2695 | - $_tri_liste_sens_defaut = $boucle->modificateur['tri_liste_sens_defaut']; // sens par défaut pour chaque champ |
|
| 2691 | + // Différentes infos relatives au tri présentes dans les modificateurs |
|
| 2692 | + $_tri_nom = $boucle->modificateur['tri_nom'] ; // nom du paramètre définissant le tri |
|
| 2693 | + $_tri_champ = $boucle->modificateur['tri_champ']; // champ actuel utilisé le tri |
|
| 2694 | + $_tri_sens = $boucle->modificateur['tri_sens']; // sens de tri actuel |
|
| 2695 | + $_tri_liste_sens_defaut = $boucle->modificateur['tri_liste_sens_defaut']; // sens par défaut pour chaque champ |
|
| 2696 | 2696 | |
| 2697 | - $_champ_ou_sens = interprete_argument_balise(1, $p); |
|
| 2698 | - // si pas de champ, renvoyer le critère de tri actuel |
|
| 2699 | - if (!$_champ_ou_sens) { |
|
| 2700 | - $p->code = $_tri_champ; |
|
| 2697 | + $_champ_ou_sens = interprete_argument_balise(1, $p); |
|
| 2698 | + // si pas de champ, renvoyer le critère de tri actuel |
|
| 2699 | + if (!$_champ_ou_sens) { |
|
| 2700 | + $p->code = $_tri_champ; |
|
| 2701 | 2701 | |
| 2702 | - return $p; |
|
| 2703 | - } |
|
| 2704 | - // forcer la jointure si besoin, et si le champ est statique |
|
| 2705 | - if (preg_match(",^'([\w.]+)'$,i", $_champ_ou_sens, $m)) { |
|
| 2706 | - index_pile($b, $m[1], $p->boucles, '', null, true, false); |
|
| 2707 | - } |
|
| 2702 | + return $p; |
|
| 2703 | + } |
|
| 2704 | + // forcer la jointure si besoin, et si le champ est statique |
|
| 2705 | + if (preg_match(",^'([\w.]+)'$,i", $_champ_ou_sens, $m)) { |
|
| 2706 | + index_pile($b, $m[1], $p->boucles, '', null, true, false); |
|
| 2707 | + } |
|
| 2708 | 2708 | |
| 2709 | - $_libelle = interprete_argument_balise(2, $p); |
|
| 2710 | - $_libelle = $_libelle ?: $_champ_ou_sens; |
|
| 2709 | + $_libelle = interprete_argument_balise(2, $p); |
|
| 2710 | + $_libelle = $_libelle ?: $_champ_ou_sens; |
|
| 2711 | 2711 | |
| 2712 | - $_class = interprete_argument_balise(3, $p) ?? "''"; |
|
| 2712 | + $_class = interprete_argument_balise(3, $p) ?? "''"; |
|
| 2713 | 2713 | |
| 2714 | - $p->code = "calculer_balise_tri($_champ_ou_sens, $_libelle, $_class, $_tri_nom, $_tri_champ, $_tri_sens, $_tri_liste_sens_defaut)"; |
|
| 2714 | + $p->code = "calculer_balise_tri($_champ_ou_sens, $_libelle, $_class, $_tri_nom, $_tri_champ, $_tri_sens, $_tri_liste_sens_defaut)"; |
|
| 2715 | 2715 | |
| 2716 | - $p->interdire_scripts = false; |
|
| 2716 | + $p->interdire_scripts = false; |
|
| 2717 | 2717 | |
| 2718 | - return $p; |
|
| 2718 | + return $p; |
|
| 2719 | 2719 | } |
| 2720 | 2720 | |
| 2721 | 2721 | |
@@ -2736,21 +2736,21 @@ discard block |
||
| 2736 | 2736 | * Pile complétée par le code à générer |
| 2737 | 2737 | */ |
| 2738 | 2738 | function balise_SAUTER_dist($p) { |
| 2739 | - $id_boucle = $p->id_boucle; |
|
| 2739 | + $id_boucle = $p->id_boucle; |
|
| 2740 | 2740 | |
| 2741 | - if (empty($p->boucles[$id_boucle])) { |
|
| 2742 | - $msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']]; |
|
| 2743 | - erreur_squelette($msg, $p); |
|
| 2744 | - } else { |
|
| 2745 | - $_saut = interprete_argument_balise(1, $p); |
|
| 2746 | - $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']"; |
|
| 2747 | - $_total = "(\$Numrows['$id_boucle']['total'] ?? null)"; |
|
| 2741 | + if (empty($p->boucles[$id_boucle])) { |
|
| 2742 | + $msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']]; |
|
| 2743 | + erreur_squelette($msg, $p); |
|
| 2744 | + } else { |
|
| 2745 | + $_saut = interprete_argument_balise(1, $p); |
|
| 2746 | + $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']"; |
|
| 2747 | + $_total = "(\$Numrows['$id_boucle']['total'] ?? null)"; |
|
| 2748 | 2748 | |
| 2749 | - $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))"; |
|
| 2750 | - } |
|
| 2751 | - $p->interdire_scripts = false; |
|
| 2749 | + $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))"; |
|
| 2750 | + } |
|
| 2751 | + $p->interdire_scripts = false; |
|
| 2752 | 2752 | |
| 2753 | - return $p; |
|
| 2753 | + return $p; |
|
| 2754 | 2754 | } |
| 2755 | 2755 | |
| 2756 | 2756 | |
@@ -2772,22 +2772,22 @@ discard block |
||
| 2772 | 2772 | * Pile complétée par le code à générer |
| 2773 | 2773 | */ |
| 2774 | 2774 | function balise_PUBLIE_dist($p) { |
| 2775 | - if (!$_type = interprete_argument_balise(1, $p)) { |
|
| 2776 | - $_type = _q($p->type_requete); |
|
| 2777 | - $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p); |
|
| 2778 | - } else { |
|
| 2779 | - $_id = interprete_argument_balise(2, $p); |
|
| 2780 | - } |
|
| 2775 | + if (!$_type = interprete_argument_balise(1, $p)) { |
|
| 2776 | + $_type = _q($p->type_requete); |
|
| 2777 | + $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p); |
|
| 2778 | + } else { |
|
| 2779 | + $_id = interprete_argument_balise(2, $p); |
|
| 2780 | + } |
|
| 2781 | 2781 | |
| 2782 | - $connect = ''; |
|
| 2783 | - if (isset($p->boucles[$p->id_boucle])) { |
|
| 2784 | - $connect = $p->boucles[$p->id_boucle]->sql_serveur; |
|
| 2785 | - } |
|
| 2782 | + $connect = ''; |
|
| 2783 | + if (isset($p->boucles[$p->id_boucle])) { |
|
| 2784 | + $connect = $p->boucles[$p->id_boucle]->sql_serveur; |
|
| 2785 | + } |
|
| 2786 | 2786 | |
| 2787 | - $p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')"; |
|
| 2788 | - $p->interdire_scripts = false; |
|
| 2787 | + $p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')"; |
|
| 2788 | + $p->interdire_scripts = false; |
|
| 2789 | 2789 | |
| 2790 | - return $p; |
|
| 2790 | + return $p; |
|
| 2791 | 2791 | } |
| 2792 | 2792 | |
| 2793 | 2793 | /** |
@@ -2816,12 +2816,12 @@ discard block |
||
| 2816 | 2816 | * Pile complétée par le code à générer |
| 2817 | 2817 | */ |
| 2818 | 2818 | function balise_PRODUIRE_dist($p) { |
| 2819 | - $balise_inclure = charger_fonction('INCLURE', 'balise'); |
|
| 2820 | - $p = $balise_inclure($p); |
|
| 2819 | + $balise_inclure = charger_fonction('INCLURE', 'balise'); |
|
| 2820 | + $p = $balise_inclure($p); |
|
| 2821 | 2821 | |
| 2822 | - $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code); |
|
| 2822 | + $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code); |
|
| 2823 | 2823 | |
| 2824 | - return $p; |
|
| 2824 | + return $p; |
|
| 2825 | 2825 | } |
| 2826 | 2826 | |
| 2827 | 2827 | /** |
@@ -2840,13 +2840,13 @@ discard block |
||
| 2840 | 2840 | * Pile complétée par le code à générer |
| 2841 | 2841 | */ |
| 2842 | 2842 | function balise_LARGEUR_ECRAN_dist($p) { |
| 2843 | - $_class = interprete_argument_balise(1, $p); |
|
| 2844 | - if (!$_class) { |
|
| 2845 | - $_class = 'null'; |
|
| 2846 | - } |
|
| 2847 | - $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))"; |
|
| 2843 | + $_class = interprete_argument_balise(1, $p); |
|
| 2844 | + if (!$_class) { |
|
| 2845 | + $_class = 'null'; |
|
| 2846 | + } |
|
| 2847 | + $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))"; |
|
| 2848 | 2848 | |
| 2849 | - return $p; |
|
| 2849 | + return $p; |
|
| 2850 | 2850 | } |
| 2851 | 2851 | |
| 2852 | 2852 | |
@@ -2862,14 +2862,14 @@ discard block |
||
| 2862 | 2862 | * Pile complétée par le code à générer |
| 2863 | 2863 | **/ |
| 2864 | 2864 | function balise_CONST_dist($p) { |
| 2865 | - $_const = interprete_argument_balise(1, $p); |
|
| 2866 | - if (!strlen($_const ?? '')) { |
|
| 2867 | - $p->code = "''"; |
|
| 2868 | - } |
|
| 2869 | - else { |
|
| 2870 | - $p->code = "(defined($_const)?constant($_const):'')"; |
|
| 2871 | - } |
|
| 2872 | - $p->interdire_scripts = false; |
|
| 2873 | - |
|
| 2874 | - return $p; |
|
| 2865 | + $_const = interprete_argument_balise(1, $p); |
|
| 2866 | + if (!strlen($_const ?? '')) { |
|
| 2867 | + $p->code = "''"; |
|
| 2868 | + } |
|
| 2869 | + else { |
|
| 2870 | + $p->code = "(defined($_const)?constant($_const):'')"; |
|
| 2871 | + } |
|
| 2872 | + $p->interdire_scripts = false; |
|
| 2873 | + |
|
| 2874 | + return $p; |
|
| 2875 | 2875 | } |
@@ -19,7 +19,7 @@ discard block |
||
| 19 | 19 | use Spip\Chiffrer\SpipCles; |
| 20 | 20 | |
| 21 | 21 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 22 | - return; |
|
| 22 | + return; |
|
| 23 | 23 | } |
| 24 | 24 | |
| 25 | 25 | /** |
@@ -34,171 +34,171 @@ discard block |
||
| 34 | 34 | */ |
| 35 | 35 | function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) { |
| 36 | 36 | |
| 37 | - // retrouver le login |
|
| 38 | - $login = auth_spip_retrouver_login($login); |
|
| 39 | - // login inconnu, n'allons pas plus loin |
|
| 40 | - if (!$login) { |
|
| 41 | - return []; |
|
| 42 | - } |
|
| 43 | - |
|
| 44 | - $md5pass = ''; |
|
| 45 | - $shapass = $shanext = ''; |
|
| 46 | - $auteur_peut_sauver_cles = false; |
|
| 47 | - |
|
| 48 | - if ($pass) { |
|
| 49 | - $row = sql_fetsel( |
|
| 50 | - '*', |
|
| 51 | - 'spip_auteurs', |
|
| 52 | - 'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'", |
|
| 53 | - '', |
|
| 54 | - '', |
|
| 55 | - '', |
|
| 56 | - '', |
|
| 57 | - $serveur |
|
| 58 | - ); |
|
| 59 | - |
|
| 60 | - // lever un flag si cet auteur peut sauver les cles |
|
| 61 | - if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) { |
|
| 62 | - $auteur_peut_sauver_cles = true; |
|
| 63 | - } |
|
| 64 | - } |
|
| 65 | - |
|
| 66 | - // login inexistant ou mot de passe vide |
|
| 67 | - if (!$pass or !$row) { |
|
| 68 | - return []; |
|
| 69 | - } |
|
| 70 | - |
|
| 71 | - include_spip('inc/chiffrer'); |
|
| 72 | - $cles = SpipCles::instance(); |
|
| 73 | - $secret = $cles->getSecretAuth(); |
|
| 74 | - |
|
| 75 | - $hash = null; |
|
| 76 | - switch (strlen($row['pass'])) { |
|
| 77 | - |
|
| 78 | - // legacy = md5 ou sha256 |
|
| 79 | - case 32: |
|
| 80 | - // tres anciens mots de passe encodes en md5(alea.pass) |
|
| 81 | - $hash = md5($row['alea_actuel'] . $pass); |
|
| 82 | - $methode = 'md5'; |
|
| 83 | - case 64: |
|
| 84 | - if (empty($hash)) { |
|
| 85 | - // anciens mots de passe encodes en sha256(alea.pass) |
|
| 86 | - include_spip('auth/sha256.inc'); |
|
| 87 | - $hash = spip_sha256($row['alea_actuel'] . $pass); |
|
| 88 | - $methode = 'sha256'; |
|
| 89 | - } |
|
| 90 | - if ($row['pass'] === $hash) { |
|
| 91 | - spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via $methode", 'auth' . _LOG_DEBUG); |
|
| 92 | - // ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth |
|
| 93 | - if (!empty($row['backup_cles'])) { |
|
| 94 | - sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
|
| 95 | - } |
|
| 96 | - break; |
|
| 97 | - } |
|
| 98 | - |
|
| 99 | - // on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long |
|
| 100 | - |
|
| 101 | - case 60: |
|
| 102 | - case 98: |
|
| 103 | - default: |
|
| 104 | - // doit-on restaurer un backup des cles ? |
|
| 105 | - // si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass |
|
| 106 | - if ( |
|
| 107 | - !$secret |
|
| 108 | - and $auteur_peut_sauver_cles |
|
| 109 | - and !empty($row['backup_cles']) |
|
| 110 | - ) { |
|
| 111 | - if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) { |
|
| 112 | - spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 113 | - if ($cles->save()) { |
|
| 114 | - $secret = $cles->getSecretAuth(); |
|
| 115 | - } |
|
| 116 | - else { |
|
| 117 | - spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
|
| 118 | - // et on echoue car on ne veut pas que la situation reste telle quelle |
|
| 119 | - raler_fichier(_DIR_ETC . 'cles.php'); |
|
| 120 | - } |
|
| 121 | - } |
|
| 122 | - else { |
|
| 123 | - spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR); |
|
| 124 | - sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
|
| 125 | - } |
|
| 126 | - } |
|
| 127 | - |
|
| 128 | - if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) { |
|
| 129 | - unset($row); |
|
| 130 | - } |
|
| 131 | - else { |
|
| 132 | - spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via Password::verifier", 'auth' . _LOG_DEBUG); |
|
| 133 | - } |
|
| 134 | - break; |
|
| 135 | - } |
|
| 136 | - |
|
| 137 | - // Migration depuis ancienne version : si on a pas encore de cle |
|
| 138 | - // ET si c'est le login d'un auteur qui peut sauver la cle |
|
| 139 | - // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php) |
|
| 140 | - // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre |
|
| 141 | - if (!$secret and $auteur_peut_sauver_cles) { |
|
| 142 | - if (auth_spip_initialiser_secret()) { |
|
| 143 | - $secret = $cles->getSecretAuth(); |
|
| 144 | - } |
|
| 145 | - } |
|
| 146 | - |
|
| 147 | - // login/mot de passe incorrect |
|
| 148 | - if (empty($row)) { |
|
| 149 | - return []; |
|
| 150 | - } |
|
| 151 | - |
|
| 152 | - // fait tourner le codage du pass dans la base |
|
| 153 | - // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action() |
|
| 154 | - if (!$phpauth and $secret) { |
|
| 155 | - include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess |
|
| 156 | - $pass_hash_next = Password::hacher($pass, $secret); |
|
| 157 | - if ($pass_hash_next) { |
|
| 158 | - $set = [ |
|
| 159 | - 'alea_actuel' => 'alea_futur', // @deprecated 4.1 |
|
| 160 | - 'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1 |
|
| 161 | - 'pass' => sql_quote($pass_hash_next, $serveur, 'text'), |
|
| 162 | - ]; |
|
| 163 | - |
|
| 164 | - // regenerer un htpass si on a active/desactive le plugin htpasswd |
|
| 165 | - // et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo |
|
| 166 | - $htpass = generer_htpass($pass); |
|
| 167 | - if (strlen($htpass) !== strlen($row['htpass'])) { |
|
| 168 | - $set['htpass'] = sql_quote($htpass, $serveur, 'text'); |
|
| 169 | - } |
|
| 170 | - |
|
| 171 | - // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre) |
|
| 172 | - if ($auteur_peut_sauver_cles) { |
|
| 173 | - $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text'); |
|
| 174 | - } |
|
| 175 | - |
|
| 176 | - @sql_update( |
|
| 177 | - 'spip_auteurs', |
|
| 178 | - $set, |
|
| 179 | - 'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote( |
|
| 180 | - $row['pass'], |
|
| 181 | - $serveur, |
|
| 182 | - 'text' |
|
| 183 | - ), |
|
| 184 | - [], |
|
| 185 | - $serveur |
|
| 186 | - ); |
|
| 187 | - |
|
| 188 | - // si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd |
|
| 189 | - if (isset($set['htpass'])) { |
|
| 190 | - ecrire_acces(); |
|
| 191 | - } |
|
| 192 | - } |
|
| 193 | - |
|
| 194 | - // En profiter pour verifier la securite de tmp/ |
|
| 195 | - // Si elle ne fonctionne pas a l'installation, prevenir |
|
| 196 | - if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) { |
|
| 197 | - return false; |
|
| 198 | - } |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - return $row; |
|
| 37 | + // retrouver le login |
|
| 38 | + $login = auth_spip_retrouver_login($login); |
|
| 39 | + // login inconnu, n'allons pas plus loin |
|
| 40 | + if (!$login) { |
|
| 41 | + return []; |
|
| 42 | + } |
|
| 43 | + |
|
| 44 | + $md5pass = ''; |
|
| 45 | + $shapass = $shanext = ''; |
|
| 46 | + $auteur_peut_sauver_cles = false; |
|
| 47 | + |
|
| 48 | + if ($pass) { |
|
| 49 | + $row = sql_fetsel( |
|
| 50 | + '*', |
|
| 51 | + 'spip_auteurs', |
|
| 52 | + 'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'", |
|
| 53 | + '', |
|
| 54 | + '', |
|
| 55 | + '', |
|
| 56 | + '', |
|
| 57 | + $serveur |
|
| 58 | + ); |
|
| 59 | + |
|
| 60 | + // lever un flag si cet auteur peut sauver les cles |
|
| 61 | + if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) { |
|
| 62 | + $auteur_peut_sauver_cles = true; |
|
| 63 | + } |
|
| 64 | + } |
|
| 65 | + |
|
| 66 | + // login inexistant ou mot de passe vide |
|
| 67 | + if (!$pass or !$row) { |
|
| 68 | + return []; |
|
| 69 | + } |
|
| 70 | + |
|
| 71 | + include_spip('inc/chiffrer'); |
|
| 72 | + $cles = SpipCles::instance(); |
|
| 73 | + $secret = $cles->getSecretAuth(); |
|
| 74 | + |
|
| 75 | + $hash = null; |
|
| 76 | + switch (strlen($row['pass'])) { |
|
| 77 | + |
|
| 78 | + // legacy = md5 ou sha256 |
|
| 79 | + case 32: |
|
| 80 | + // tres anciens mots de passe encodes en md5(alea.pass) |
|
| 81 | + $hash = md5($row['alea_actuel'] . $pass); |
|
| 82 | + $methode = 'md5'; |
|
| 83 | + case 64: |
|
| 84 | + if (empty($hash)) { |
|
| 85 | + // anciens mots de passe encodes en sha256(alea.pass) |
|
| 86 | + include_spip('auth/sha256.inc'); |
|
| 87 | + $hash = spip_sha256($row['alea_actuel'] . $pass); |
|
| 88 | + $methode = 'sha256'; |
|
| 89 | + } |
|
| 90 | + if ($row['pass'] === $hash) { |
|
| 91 | + spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via $methode", 'auth' . _LOG_DEBUG); |
|
| 92 | + // ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth |
|
| 93 | + if (!empty($row['backup_cles'])) { |
|
| 94 | + sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
|
| 95 | + } |
|
| 96 | + break; |
|
| 97 | + } |
|
| 98 | + |
|
| 99 | + // on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long |
|
| 100 | + |
|
| 101 | + case 60: |
|
| 102 | + case 98: |
|
| 103 | + default: |
|
| 104 | + // doit-on restaurer un backup des cles ? |
|
| 105 | + // si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass |
|
| 106 | + if ( |
|
| 107 | + !$secret |
|
| 108 | + and $auteur_peut_sauver_cles |
|
| 109 | + and !empty($row['backup_cles']) |
|
| 110 | + ) { |
|
| 111 | + if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) { |
|
| 112 | + spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 113 | + if ($cles->save()) { |
|
| 114 | + $secret = $cles->getSecretAuth(); |
|
| 115 | + } |
|
| 116 | + else { |
|
| 117 | + spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
|
| 118 | + // et on echoue car on ne veut pas que la situation reste telle quelle |
|
| 119 | + raler_fichier(_DIR_ETC . 'cles.php'); |
|
| 120 | + } |
|
| 121 | + } |
|
| 122 | + else { |
|
| 123 | + spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR); |
|
| 124 | + sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); |
|
| 125 | + } |
|
| 126 | + } |
|
| 127 | + |
|
| 128 | + if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) { |
|
| 129 | + unset($row); |
|
| 130 | + } |
|
| 131 | + else { |
|
| 132 | + spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via Password::verifier", 'auth' . _LOG_DEBUG); |
|
| 133 | + } |
|
| 134 | + break; |
|
| 135 | + } |
|
| 136 | + |
|
| 137 | + // Migration depuis ancienne version : si on a pas encore de cle |
|
| 138 | + // ET si c'est le login d'un auteur qui peut sauver la cle |
|
| 139 | + // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php) |
|
| 140 | + // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre |
|
| 141 | + if (!$secret and $auteur_peut_sauver_cles) { |
|
| 142 | + if (auth_spip_initialiser_secret()) { |
|
| 143 | + $secret = $cles->getSecretAuth(); |
|
| 144 | + } |
|
| 145 | + } |
|
| 146 | + |
|
| 147 | + // login/mot de passe incorrect |
|
| 148 | + if (empty($row)) { |
|
| 149 | + return []; |
|
| 150 | + } |
|
| 151 | + |
|
| 152 | + // fait tourner le codage du pass dans la base |
|
| 153 | + // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action() |
|
| 154 | + if (!$phpauth and $secret) { |
|
| 155 | + include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess |
|
| 156 | + $pass_hash_next = Password::hacher($pass, $secret); |
|
| 157 | + if ($pass_hash_next) { |
|
| 158 | + $set = [ |
|
| 159 | + 'alea_actuel' => 'alea_futur', // @deprecated 4.1 |
|
| 160 | + 'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1 |
|
| 161 | + 'pass' => sql_quote($pass_hash_next, $serveur, 'text'), |
|
| 162 | + ]; |
|
| 163 | + |
|
| 164 | + // regenerer un htpass si on a active/desactive le plugin htpasswd |
|
| 165 | + // et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo |
|
| 166 | + $htpass = generer_htpass($pass); |
|
| 167 | + if (strlen($htpass) !== strlen($row['htpass'])) { |
|
| 168 | + $set['htpass'] = sql_quote($htpass, $serveur, 'text'); |
|
| 169 | + } |
|
| 170 | + |
|
| 171 | + // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre) |
|
| 172 | + if ($auteur_peut_sauver_cles) { |
|
| 173 | + $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text'); |
|
| 174 | + } |
|
| 175 | + |
|
| 176 | + @sql_update( |
|
| 177 | + 'spip_auteurs', |
|
| 178 | + $set, |
|
| 179 | + 'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote( |
|
| 180 | + $row['pass'], |
|
| 181 | + $serveur, |
|
| 182 | + 'text' |
|
| 183 | + ), |
|
| 184 | + [], |
|
| 185 | + $serveur |
|
| 186 | + ); |
|
| 187 | + |
|
| 188 | + // si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd |
|
| 189 | + if (isset($set['htpass'])) { |
|
| 190 | + ecrire_acces(); |
|
| 191 | + } |
|
| 192 | + } |
|
| 193 | + |
|
| 194 | + // En profiter pour verifier la securite de tmp/ |
|
| 195 | + // Si elle ne fonctionne pas a l'installation, prevenir |
|
| 196 | + if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) { |
|
| 197 | + return false; |
|
| 198 | + } |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + return $row; |
|
| 202 | 202 | } |
| 203 | 203 | |
| 204 | 204 | /** |
@@ -213,37 +213,37 @@ discard block |
||
| 213 | 213 | * @return bool |
| 214 | 214 | */ |
| 215 | 215 | function auth_spip_initialiser_secret(bool $force = false): bool { |
| 216 | - include_spip('inc/chiffrer'); |
|
| 217 | - $cles = SpipCles::instance(); |
|
| 218 | - $secret = $cles->getSecretAuth(); |
|
| 219 | - |
|
| 220 | - // on ne fait rien si on a un secret dispo |
|
| 221 | - if ($secret) { |
|
| 222 | - return false; |
|
| 223 | - } |
|
| 224 | - |
|
| 225 | - // si force, on ne verifie pas la presence d'un backup chez un webmestre |
|
| 226 | - if ($force) { |
|
| 227 | - spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 228 | - $secret = $cles->getSecretAuth(true); |
|
| 229 | - return true; |
|
| 230 | - } |
|
| 231 | - |
|
| 232 | - $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''"); |
|
| 233 | - $has_backup = array_column($has_backup, 'id_auteur'); |
|
| 234 | - if (empty($has_backup)) { |
|
| 235 | - spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 236 | - if ($secret = $cles->getSecretAuth(true)) { |
|
| 237 | - return true; |
|
| 238 | - } |
|
| 239 | - spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
|
| 240 | - // et on echoue car on ne veut pas que la situation reste telle quelle |
|
| 241 | - raler_fichier(_DIR_ETC . 'cles.php'); |
|
| 242 | - } |
|
| 243 | - else { |
|
| 244 | - spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR); |
|
| 245 | - } |
|
| 246 | - return false; |
|
| 216 | + include_spip('inc/chiffrer'); |
|
| 217 | + $cles = SpipCles::instance(); |
|
| 218 | + $secret = $cles->getSecretAuth(); |
|
| 219 | + |
|
| 220 | + // on ne fait rien si on a un secret dispo |
|
| 221 | + if ($secret) { |
|
| 222 | + return false; |
|
| 223 | + } |
|
| 224 | + |
|
| 225 | + // si force, on ne verifie pas la presence d'un backup chez un webmestre |
|
| 226 | + if ($force) { |
|
| 227 | + spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 228 | + $secret = $cles->getSecretAuth(true); |
|
| 229 | + return true; |
|
| 230 | + } |
|
| 231 | + |
|
| 232 | + $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''"); |
|
| 233 | + $has_backup = array_column($has_backup, 'id_auteur'); |
|
| 234 | + if (empty($has_backup)) { |
|
| 235 | + spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE); |
|
| 236 | + if ($secret = $cles->getSecretAuth(true)) { |
|
| 237 | + return true; |
|
| 238 | + } |
|
| 239 | + spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); |
|
| 240 | + // et on echoue car on ne veut pas que la situation reste telle quelle |
|
| 241 | + raler_fichier(_DIR_ETC . 'cles.php'); |
|
| 242 | + } |
|
| 243 | + else { |
|
| 244 | + spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR); |
|
| 245 | + } |
|
| 246 | + return false; |
|
| 247 | 247 | } |
| 248 | 248 | |
| 249 | 249 | /** |
@@ -253,19 +253,19 @@ discard block |
||
| 253 | 253 | * @return array |
| 254 | 254 | */ |
| 255 | 255 | function auth_spip_formulaire_login($flux) { |
| 256 | - // javascript qui gere la securite du login en evitant de faire circuler le pass en clair |
|
| 257 | - $js = file_get_contents(find_in_path('prive/javascript/login.js')); |
|
| 258 | - $flux['data'] .= |
|
| 259 | - '<script type="text/javascript">/*<![CDATA[*/' |
|
| 260 | - . "$js\n" |
|
| 261 | - . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "'," |
|
| 262 | - . "'page_auteur': '" . generer_url_public('informer_auteur') . "'," |
|
| 263 | - . "'informe_auteur_en_cours':false," |
|
| 264 | - . "'attente_informe':0};" |
|
| 265 | - . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});" |
|
| 266 | - . '/*]]>*/</script>'; |
|
| 267 | - |
|
| 268 | - return $flux; |
|
| 256 | + // javascript qui gere la securite du login en evitant de faire circuler le pass en clair |
|
| 257 | + $js = file_get_contents(find_in_path('prive/javascript/login.js')); |
|
| 258 | + $flux['data'] .= |
|
| 259 | + '<script type="text/javascript">/*<![CDATA[*/' |
|
| 260 | + . "$js\n" |
|
| 261 | + . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "'," |
|
| 262 | + . "'page_auteur': '" . generer_url_public('informer_auteur') . "'," |
|
| 263 | + . "'informe_auteur_en_cours':false," |
|
| 264 | + . "'attente_informe':0};" |
|
| 265 | + . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});" |
|
| 266 | + . '/*]]>*/</script>'; |
|
| 267 | + |
|
| 268 | + return $flux; |
|
| 269 | 269 | } |
| 270 | 270 | |
| 271 | 271 | |
@@ -277,11 +277,11 @@ discard block |
||
| 277 | 277 | * toujours true pour un auteur cree dans SPIP |
| 278 | 278 | */ |
| 279 | 279 | function auth_spip_autoriser_modifier_login(string $serveur = ''): bool { |
| 280 | - // les fonctions d'ecriture sur base distante sont encore incompletes |
|
| 281 | - if (strlen($serveur)) { |
|
| 282 | - return false; |
|
| 283 | - } |
|
| 284 | - return true; |
|
| 280 | + // les fonctions d'ecriture sur base distante sont encore incompletes |
|
| 281 | + if (strlen($serveur)) { |
|
| 282 | + return false; |
|
| 283 | + } |
|
| 284 | + return true; |
|
| 285 | 285 | } |
| 286 | 286 | |
| 287 | 287 | /** |
@@ -295,25 +295,25 @@ discard block |
||
| 295 | 295 | * message d'erreur si login non valide, chaine vide sinon |
| 296 | 296 | */ |
| 297 | 297 | function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = '') { |
| 298 | - // login et mot de passe |
|
| 299 | - if (strlen($new_login)) { |
|
| 300 | - if (strlen($new_login) < _LOGIN_TROP_COURT) { |
|
| 301 | - return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]); |
|
| 302 | - } else { |
|
| 303 | - $n = sql_countsel( |
|
| 304 | - 'spip_auteurs', |
|
| 305 | - 'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'", |
|
| 306 | - '', |
|
| 307 | - '', |
|
| 308 | - $serveur |
|
| 309 | - ); |
|
| 310 | - if ($n) { |
|
| 311 | - return _T('info_login_existant'); |
|
| 312 | - } |
|
| 313 | - } |
|
| 314 | - } |
|
| 315 | - |
|
| 316 | - return ''; |
|
| 298 | + // login et mot de passe |
|
| 299 | + if (strlen($new_login)) { |
|
| 300 | + if (strlen($new_login) < _LOGIN_TROP_COURT) { |
|
| 301 | + return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]); |
|
| 302 | + } else { |
|
| 303 | + $n = sql_countsel( |
|
| 304 | + 'spip_auteurs', |
|
| 305 | + 'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'", |
|
| 306 | + '', |
|
| 307 | + '', |
|
| 308 | + $serveur |
|
| 309 | + ); |
|
| 310 | + if ($n) { |
|
| 311 | + return _T('info_login_existant'); |
|
| 312 | + } |
|
| 313 | + } |
|
| 314 | + } |
|
| 315 | + |
|
| 316 | + return ''; |
|
| 317 | 317 | } |
| 318 | 318 | |
| 319 | 319 | /** |
@@ -325,41 +325,41 @@ discard block |
||
| 325 | 325 | * @return bool |
| 326 | 326 | */ |
| 327 | 327 | function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') { |
| 328 | - if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') { |
|
| 329 | - return false; |
|
| 330 | - } |
|
| 331 | - if ( |
|
| 332 | - !$id_auteur = intval($id_auteur) |
|
| 333 | - or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) |
|
| 334 | - ) { |
|
| 335 | - return false; |
|
| 336 | - } |
|
| 337 | - if ($new_login == $auteur['login']) { |
|
| 338 | - return true; |
|
| 339 | - } // on a rien fait mais c'est bon ! |
|
| 340 | - |
|
| 341 | - include_spip('action/editer_auteur'); |
|
| 342 | - |
|
| 343 | - // vider le login des auteurs a la poubelle qui avaient ce meme login |
|
| 344 | - if (strlen($new_login)) { |
|
| 345 | - $anciens = sql_allfetsel( |
|
| 346 | - 'id_auteur', |
|
| 347 | - 'spip_auteurs', |
|
| 348 | - 'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'", |
|
| 349 | - '', |
|
| 350 | - '', |
|
| 351 | - '', |
|
| 352 | - '', |
|
| 353 | - $serveur |
|
| 354 | - ); |
|
| 355 | - while ($row = array_pop($anciens)) { |
|
| 356 | - auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur |
|
| 357 | - } |
|
| 358 | - } |
|
| 359 | - |
|
| 360 | - auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur |
|
| 361 | - |
|
| 362 | - return true; |
|
| 328 | + if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') { |
|
| 329 | + return false; |
|
| 330 | + } |
|
| 331 | + if ( |
|
| 332 | + !$id_auteur = intval($id_auteur) |
|
| 333 | + or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) |
|
| 334 | + ) { |
|
| 335 | + return false; |
|
| 336 | + } |
|
| 337 | + if ($new_login == $auteur['login']) { |
|
| 338 | + return true; |
|
| 339 | + } // on a rien fait mais c'est bon ! |
|
| 340 | + |
|
| 341 | + include_spip('action/editer_auteur'); |
|
| 342 | + |
|
| 343 | + // vider le login des auteurs a la poubelle qui avaient ce meme login |
|
| 344 | + if (strlen($new_login)) { |
|
| 345 | + $anciens = sql_allfetsel( |
|
| 346 | + 'id_auteur', |
|
| 347 | + 'spip_auteurs', |
|
| 348 | + 'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'", |
|
| 349 | + '', |
|
| 350 | + '', |
|
| 351 | + '', |
|
| 352 | + '', |
|
| 353 | + $serveur |
|
| 354 | + ); |
|
| 355 | + while ($row = array_pop($anciens)) { |
|
| 356 | + auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur |
|
| 357 | + } |
|
| 358 | + } |
|
| 359 | + |
|
| 360 | + auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur |
|
| 361 | + |
|
| 362 | + return true; |
|
| 363 | 363 | } |
| 364 | 364 | |
| 365 | 365 | /** |
@@ -371,44 +371,44 @@ discard block |
||
| 371 | 371 | * @return string |
| 372 | 372 | */ |
| 373 | 373 | function auth_spip_retrouver_login($login, $serveur = '') { |
| 374 | - if (!strlen($login)) { |
|
| 375 | - return null; |
|
| 376 | - } // pas la peine de requeter |
|
| 377 | - $l = sql_quote($login, $serveur, 'text'); |
|
| 378 | - if ( |
|
| 379 | - $r = sql_getfetsel( |
|
| 380 | - 'login', |
|
| 381 | - 'spip_auteurs', |
|
| 382 | - "statut<>'5poubelle'" . |
|
| 383 | - ' AND (length(pass)>0)' . |
|
| 384 | - " AND (login=$l)", |
|
| 385 | - '', |
|
| 386 | - '', |
|
| 387 | - '', |
|
| 388 | - '', |
|
| 389 | - $serveur |
|
| 390 | - ) |
|
| 391 | - ) { |
|
| 392 | - return $r; |
|
| 393 | - } |
|
| 394 | - // Si pas d'auteur avec ce login |
|
| 395 | - // regarder s'il a saisi son nom ou son mail. |
|
| 396 | - // Ne pas fusionner avec la requete precedente |
|
| 397 | - // car un nom peut etre homonyme d'un autre login |
|
| 398 | - else { |
|
| 399 | - return sql_getfetsel( |
|
| 400 | - 'login', |
|
| 401 | - 'spip_auteurs', |
|
| 402 | - "statut<>'5poubelle'" . |
|
| 403 | - ' AND (length(pass)>0)' . |
|
| 404 | - " AND (login<>'' AND (nom=$l OR email=$l))", |
|
| 405 | - '', |
|
| 406 | - '', |
|
| 407 | - '', |
|
| 408 | - '', |
|
| 409 | - $serveur |
|
| 410 | - ); |
|
| 411 | - } |
|
| 374 | + if (!strlen($login)) { |
|
| 375 | + return null; |
|
| 376 | + } // pas la peine de requeter |
|
| 377 | + $l = sql_quote($login, $serveur, 'text'); |
|
| 378 | + if ( |
|
| 379 | + $r = sql_getfetsel( |
|
| 380 | + 'login', |
|
| 381 | + 'spip_auteurs', |
|
| 382 | + "statut<>'5poubelle'" . |
|
| 383 | + ' AND (length(pass)>0)' . |
|
| 384 | + " AND (login=$l)", |
|
| 385 | + '', |
|
| 386 | + '', |
|
| 387 | + '', |
|
| 388 | + '', |
|
| 389 | + $serveur |
|
| 390 | + ) |
|
| 391 | + ) { |
|
| 392 | + return $r; |
|
| 393 | + } |
|
| 394 | + // Si pas d'auteur avec ce login |
|
| 395 | + // regarder s'il a saisi son nom ou son mail. |
|
| 396 | + // Ne pas fusionner avec la requete precedente |
|
| 397 | + // car un nom peut etre homonyme d'un autre login |
|
| 398 | + else { |
|
| 399 | + return sql_getfetsel( |
|
| 400 | + 'login', |
|
| 401 | + 'spip_auteurs', |
|
| 402 | + "statut<>'5poubelle'" . |
|
| 403 | + ' AND (length(pass)>0)' . |
|
| 404 | + " AND (login<>'' AND (nom=$l OR email=$l))", |
|
| 405 | + '', |
|
| 406 | + '', |
|
| 407 | + '', |
|
| 408 | + '', |
|
| 409 | + $serveur |
|
| 410 | + ); |
|
| 411 | + } |
|
| 412 | 412 | } |
| 413 | 413 | |
| 414 | 414 | /** |
@@ -419,11 +419,11 @@ discard block |
||
| 419 | 419 | * toujours true pour un auteur cree dans SPIP |
| 420 | 420 | */ |
| 421 | 421 | function auth_spip_autoriser_modifier_pass(string $serveur = ''): bool { |
| 422 | - // les fonctions d'ecriture sur base distante sont encore incompletes |
|
| 423 | - if (strlen($serveur)) { |
|
| 424 | - return false; |
|
| 425 | - } |
|
| 426 | - return true; |
|
| 422 | + // les fonctions d'ecriture sur base distante sont encore incompletes |
|
| 423 | + if (strlen($serveur)) { |
|
| 424 | + return false; |
|
| 425 | + } |
|
| 426 | + return true; |
|
| 427 | 427 | } |
| 428 | 428 | |
| 429 | 429 | |
@@ -444,12 +444,12 @@ discard block |
||
| 444 | 444 | * message d'erreur si login non valide, chaine vide sinon |
| 445 | 445 | */ |
| 446 | 446 | function auth_spip_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = '') { |
| 447 | - // login et mot de passe |
|
| 448 | - if (strlen($new_pass) < _PASS_LONGUEUR_MINI) { |
|
| 449 | - return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]); |
|
| 450 | - } |
|
| 447 | + // login et mot de passe |
|
| 448 | + if (strlen($new_pass) < _PASS_LONGUEUR_MINI) { |
|
| 449 | + return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]); |
|
| 450 | + } |
|
| 451 | 451 | |
| 452 | - return ''; |
|
| 452 | + return ''; |
|
| 453 | 453 | } |
| 454 | 454 | |
| 455 | 455 | /** |
@@ -463,48 +463,48 @@ discard block |
||
| 463 | 463 | * @return bool |
| 464 | 464 | */ |
| 465 | 465 | function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') { |
| 466 | - if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { |
|
| 467 | - return false; |
|
| 468 | - } |
|
| 469 | - |
|
| 470 | - if ( |
|
| 471 | - !$id_auteur = intval($id_auteur) |
|
| 472 | - or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) |
|
| 473 | - ) { |
|
| 474 | - return false; |
|
| 475 | - } |
|
| 476 | - |
|
| 477 | - include_spip('inc/chiffrer'); |
|
| 478 | - $cles = SpipCles::instance(); |
|
| 479 | - $secret = $cles->getSecretAuth(); |
|
| 480 | - if (!$secret) { |
|
| 481 | - if (auth_spip_initialiser_secret()) { |
|
| 482 | - $secret = $cles->getSecretAuth(); |
|
| 483 | - } |
|
| 484 | - else { |
|
| 485 | - return false; |
|
| 486 | - } |
|
| 487 | - } |
|
| 488 | - |
|
| 489 | - |
|
| 490 | - include_spip('inc/acces'); |
|
| 491 | - $set = [ |
|
| 492 | - 'pass' => Password::hacher($new_pass, $secret), |
|
| 493 | - 'htpass' => generer_htpass($new_pass), |
|
| 494 | - 'alea_actuel' => creer_uniqid(), // @deprecated 4.1 |
|
| 495 | - 'alea_futur' => creer_uniqid(), // @deprecated 4.1 |
|
| 496 | - 'low_sec' => '', |
|
| 497 | - ]; |
|
| 498 | - |
|
| 499 | - // si c'est un webmestre, on met a jour son backup des cles |
|
| 500 | - if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') { |
|
| 501 | - $set['backup_cles'] = $cles->backup($new_pass); |
|
| 502 | - } |
|
| 503 | - |
|
| 504 | - include_spip('action/editer_auteur'); |
|
| 505 | - auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur |
|
| 506 | - |
|
| 507 | - return true; // on a bien modifie le pass |
|
| 466 | + if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { |
|
| 467 | + return false; |
|
| 468 | + } |
|
| 469 | + |
|
| 470 | + if ( |
|
| 471 | + !$id_auteur = intval($id_auteur) |
|
| 472 | + or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) |
|
| 473 | + ) { |
|
| 474 | + return false; |
|
| 475 | + } |
|
| 476 | + |
|
| 477 | + include_spip('inc/chiffrer'); |
|
| 478 | + $cles = SpipCles::instance(); |
|
| 479 | + $secret = $cles->getSecretAuth(); |
|
| 480 | + if (!$secret) { |
|
| 481 | + if (auth_spip_initialiser_secret()) { |
|
| 482 | + $secret = $cles->getSecretAuth(); |
|
| 483 | + } |
|
| 484 | + else { |
|
| 485 | + return false; |
|
| 486 | + } |
|
| 487 | + } |
|
| 488 | + |
|
| 489 | + |
|
| 490 | + include_spip('inc/acces'); |
|
| 491 | + $set = [ |
|
| 492 | + 'pass' => Password::hacher($new_pass, $secret), |
|
| 493 | + 'htpass' => generer_htpass($new_pass), |
|
| 494 | + 'alea_actuel' => creer_uniqid(), // @deprecated 4.1 |
|
| 495 | + 'alea_futur' => creer_uniqid(), // @deprecated 4.1 |
|
| 496 | + 'low_sec' => '', |
|
| 497 | + ]; |
|
| 498 | + |
|
| 499 | + // si c'est un webmestre, on met a jour son backup des cles |
|
| 500 | + if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') { |
|
| 501 | + $set['backup_cles'] = $cles->backup($new_pass); |
|
| 502 | + } |
|
| 503 | + |
|
| 504 | + include_spip('action/editer_auteur'); |
|
| 505 | + auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur |
|
| 506 | + |
|
| 507 | + return true; // on a bien modifie le pass |
|
| 508 | 508 | } |
| 509 | 509 | |
| 510 | 510 | /** |
@@ -518,58 +518,58 @@ discard block |
||
| 518 | 518 | * @return void |
| 519 | 519 | */ |
| 520 | 520 | function auth_spip_synchroniser_distant($id_auteur, $champs, $options = [], string $serveur = ''): void { |
| 521 | - // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess |
|
| 522 | - if (strlen($serveur)) { |
|
| 523 | - return; |
|
| 524 | - } |
|
| 525 | - // si un login, pass ou statut a ete modifie |
|
| 526 | - // regenerer les fichier htpass |
|
| 527 | - if ( |
|
| 528 | - isset($champs['login']) |
|
| 529 | - or isset($champs['pass']) |
|
| 530 | - or isset($champs['statut']) |
|
| 531 | - or (isset($options['all']) and $options['all']) |
|
| 532 | - ) { |
|
| 533 | - $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME; |
|
| 534 | - $htpasswd = _DIR_TMP . _AUTH_USER_FILE; |
|
| 535 | - |
|
| 536 | - // Cette variable de configuration peut etre posee par un plugin |
|
| 537 | - // par exemple acces_restreint ; |
|
| 538 | - // si .htaccess existe, outrepasser spip_meta |
|
| 539 | - if ( |
|
| 540 | - (!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui')) |
|
| 541 | - and !@file_exists($htaccess) |
|
| 542 | - ) { |
|
| 543 | - spip_unlink($htpasswd); |
|
| 544 | - spip_unlink($htpasswd . '-admin'); |
|
| 545 | - |
|
| 546 | - return; |
|
| 547 | - } |
|
| 548 | - |
|
| 549 | - # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre |
|
| 550 | - # de devenir redacteur le cas echeant (auth http)... a nettoyer |
|
| 551 | - // attention, il faut au prealable se connecter a la base (necessaire car utilise par install) |
|
| 552 | - |
|
| 553 | - $p1 = ''; // login:htpass pour tous |
|
| 554 | - $p2 = ''; // login:htpass pour les admins |
|
| 555 | - $s = sql_select( |
|
| 556 | - 'login, htpass, statut', |
|
| 557 | - 'spip_auteurs', |
|
| 558 | - sql_in('statut', ['1comite', '0minirezo', 'nouveau']) |
|
| 559 | - ); |
|
| 560 | - while ($t = sql_fetch($s)) { |
|
| 561 | - if (strlen($t['login']) and strlen($t['htpass'])) { |
|
| 562 | - $p1 .= $t['login'] . ':' . $t['htpass'] . "\n"; |
|
| 563 | - if ($t['statut'] == '0minirezo') { |
|
| 564 | - $p2 .= $t['login'] . ':' . $t['htpass'] . "\n"; |
|
| 565 | - } |
|
| 566 | - } |
|
| 567 | - } |
|
| 568 | - sql_free($s); |
|
| 569 | - if ($p1) { |
|
| 570 | - ecrire_fichier($htpasswd, $p1); |
|
| 571 | - ecrire_fichier($htpasswd . '-admin', $p2); |
|
| 572 | - spip_log("Ecriture de $htpasswd et $htpasswd-admin"); |
|
| 573 | - } |
|
| 574 | - } |
|
| 521 | + // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess |
|
| 522 | + if (strlen($serveur)) { |
|
| 523 | + return; |
|
| 524 | + } |
|
| 525 | + // si un login, pass ou statut a ete modifie |
|
| 526 | + // regenerer les fichier htpass |
|
| 527 | + if ( |
|
| 528 | + isset($champs['login']) |
|
| 529 | + or isset($champs['pass']) |
|
| 530 | + or isset($champs['statut']) |
|
| 531 | + or (isset($options['all']) and $options['all']) |
|
| 532 | + ) { |
|
| 533 | + $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME; |
|
| 534 | + $htpasswd = _DIR_TMP . _AUTH_USER_FILE; |
|
| 535 | + |
|
| 536 | + // Cette variable de configuration peut etre posee par un plugin |
|
| 537 | + // par exemple acces_restreint ; |
|
| 538 | + // si .htaccess existe, outrepasser spip_meta |
|
| 539 | + if ( |
|
| 540 | + (!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui')) |
|
| 541 | + and !@file_exists($htaccess) |
|
| 542 | + ) { |
|
| 543 | + spip_unlink($htpasswd); |
|
| 544 | + spip_unlink($htpasswd . '-admin'); |
|
| 545 | + |
|
| 546 | + return; |
|
| 547 | + } |
|
| 548 | + |
|
| 549 | + # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre |
|
| 550 | + # de devenir redacteur le cas echeant (auth http)... a nettoyer |
|
| 551 | + // attention, il faut au prealable se connecter a la base (necessaire car utilise par install) |
|
| 552 | + |
|
| 553 | + $p1 = ''; // login:htpass pour tous |
|
| 554 | + $p2 = ''; // login:htpass pour les admins |
|
| 555 | + $s = sql_select( |
|
| 556 | + 'login, htpass, statut', |
|
| 557 | + 'spip_auteurs', |
|
| 558 | + sql_in('statut', ['1comite', '0minirezo', 'nouveau']) |
|
| 559 | + ); |
|
| 560 | + while ($t = sql_fetch($s)) { |
|
| 561 | + if (strlen($t['login']) and strlen($t['htpass'])) { |
|
| 562 | + $p1 .= $t['login'] . ':' . $t['htpass'] . "\n"; |
|
| 563 | + if ($t['statut'] == '0minirezo') { |
|
| 564 | + $p2 .= $t['login'] . ':' . $t['htpass'] . "\n"; |
|
| 565 | + } |
|
| 566 | + } |
|
| 567 | + } |
|
| 568 | + sql_free($s); |
|
| 569 | + if ($p1) { |
|
| 570 | + ecrire_fichier($htpasswd, $p1); |
|
| 571 | + ecrire_fichier($htpasswd . '-admin', $p2); |
|
| 572 | + spip_log("Ecriture de $htpasswd et $htpasswd-admin"); |
|
| 573 | + } |
|
| 574 | + } |
|
| 575 | 575 | } |
@@ -19,78 +19,78 @@ |
||
| 19 | 19 | * @link https://www.php.net/manual/fr/book.sodium.php |
| 20 | 20 | */ |
| 21 | 21 | class Chiffrement { |
| 22 | - /** Chiffre un message en utilisant une clé ou un mot de passe */ |
|
| 23 | - public static function chiffrer( |
|
| 24 | - string $message, |
|
| 25 | - #[\SensitiveParameter] |
|
| 26 | - string $key |
|
| 27 | - ): ?string { |
|
| 28 | - // create a random salt for key derivation |
|
| 29 | - $salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES); |
|
| 30 | - $key = self::deriveKeyFromPassword($key, $salt); |
|
| 31 | - $nonce = random_bytes(\SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); |
|
| 32 | - $padded_message = sodium_pad($message, 16); |
|
| 33 | - $encrypted = sodium_crypto_secretbox($padded_message, $nonce, $key); |
|
| 34 | - $encoded = base64_encode($salt . $nonce . $encrypted); |
|
| 35 | - sodium_memzero($key); |
|
| 36 | - sodium_memzero($nonce); |
|
| 37 | - sodium_memzero($salt); |
|
| 38 | - #spip_log("chiffrer($message)=$encoded", 'chiffrer' . _LOG_DEBUG); |
|
| 39 | - return $encoded; |
|
| 40 | - } |
|
| 22 | + /** Chiffre un message en utilisant une clé ou un mot de passe */ |
|
| 23 | + public static function chiffrer( |
|
| 24 | + string $message, |
|
| 25 | + #[\SensitiveParameter] |
|
| 26 | + string $key |
|
| 27 | + ): ?string { |
|
| 28 | + // create a random salt for key derivation |
|
| 29 | + $salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES); |
|
| 30 | + $key = self::deriveKeyFromPassword($key, $salt); |
|
| 31 | + $nonce = random_bytes(\SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); |
|
| 32 | + $padded_message = sodium_pad($message, 16); |
|
| 33 | + $encrypted = sodium_crypto_secretbox($padded_message, $nonce, $key); |
|
| 34 | + $encoded = base64_encode($salt . $nonce . $encrypted); |
|
| 35 | + sodium_memzero($key); |
|
| 36 | + sodium_memzero($nonce); |
|
| 37 | + sodium_memzero($salt); |
|
| 38 | + #spip_log("chiffrer($message)=$encoded", 'chiffrer' . _LOG_DEBUG); |
|
| 39 | + return $encoded; |
|
| 40 | + } |
|
| 41 | 41 | |
| 42 | - /** Déchiffre un message en utilisant une clé ou un mot de passe */ |
|
| 43 | - public static function dechiffrer( |
|
| 44 | - string $encoded, |
|
| 45 | - #[\SensitiveParameter] |
|
| 46 | - string $key |
|
| 47 | - ): ?string { |
|
| 48 | - $decoded = base64_decode($encoded); |
|
| 49 | - $salt = substr($decoded, 0, \SODIUM_CRYPTO_PWHASH_SALTBYTES); |
|
| 50 | - $nonce = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES, \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); |
|
| 51 | - $encrypted = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES + \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); |
|
| 52 | - $key = self::deriveKeyFromPassword($key, $salt); |
|
| 53 | - $padded_message = sodium_crypto_secretbox_open($encrypted, $nonce, $key); |
|
| 54 | - sodium_memzero($key); |
|
| 55 | - sodium_memzero($nonce); |
|
| 56 | - sodium_memzero($salt); |
|
| 57 | - if ($padded_message === false) { |
|
| 58 | - spip_log("dechiffrer() chiffre corrompu `$encoded`", 'chiffrer' . _LOG_DEBUG); |
|
| 59 | - return null; |
|
| 60 | - } |
|
| 61 | - $message = sodium_unpad($padded_message, 16); |
|
| 62 | - #spip_log("dechiffrer($encoded)=$message", 'chiffrer' . _LOG_DEBUG); |
|
| 63 | - return $message; |
|
| 64 | - } |
|
| 42 | + /** Déchiffre un message en utilisant une clé ou un mot de passe */ |
|
| 43 | + public static function dechiffrer( |
|
| 44 | + string $encoded, |
|
| 45 | + #[\SensitiveParameter] |
|
| 46 | + string $key |
|
| 47 | + ): ?string { |
|
| 48 | + $decoded = base64_decode($encoded); |
|
| 49 | + $salt = substr($decoded, 0, \SODIUM_CRYPTO_PWHASH_SALTBYTES); |
|
| 50 | + $nonce = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES, \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); |
|
| 51 | + $encrypted = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES + \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); |
|
| 52 | + $key = self::deriveKeyFromPassword($key, $salt); |
|
| 53 | + $padded_message = sodium_crypto_secretbox_open($encrypted, $nonce, $key); |
|
| 54 | + sodium_memzero($key); |
|
| 55 | + sodium_memzero($nonce); |
|
| 56 | + sodium_memzero($salt); |
|
| 57 | + if ($padded_message === false) { |
|
| 58 | + spip_log("dechiffrer() chiffre corrompu `$encoded`", 'chiffrer' . _LOG_DEBUG); |
|
| 59 | + return null; |
|
| 60 | + } |
|
| 61 | + $message = sodium_unpad($padded_message, 16); |
|
| 62 | + #spip_log("dechiffrer($encoded)=$message", 'chiffrer' . _LOG_DEBUG); |
|
| 63 | + return $message; |
|
| 64 | + } |
|
| 65 | 65 | |
| 66 | - /** Génère une clé de la taille attendue pour le chiffrement */ |
|
| 67 | - public static function keygen(): string { |
|
| 68 | - return sodium_crypto_secretbox_keygen(); |
|
| 69 | - } |
|
| 66 | + /** Génère une clé de la taille attendue pour le chiffrement */ |
|
| 67 | + public static function keygen(): string { |
|
| 68 | + return sodium_crypto_secretbox_keygen(); |
|
| 69 | + } |
|
| 70 | 70 | |
| 71 | - /** |
|
| 72 | - * Retourne une clé de la taille attendue pour le chiffrement |
|
| 73 | - * |
|
| 74 | - * Notamment si on utilise un mot de passe comme clé, il faut le hacher |
|
| 75 | - * pour servir de clé à la taille correspondante. |
|
| 76 | - */ |
|
| 77 | - private static function deriveKeyFromPassword( |
|
| 78 | - #[\SensitiveParameter] |
|
| 79 | - string $password, |
|
| 80 | - string $salt |
|
| 81 | - ): string { |
|
| 82 | - if (strlen($password) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) { |
|
| 83 | - return $password; |
|
| 84 | - } |
|
| 85 | - $key = sodium_crypto_pwhash( |
|
| 86 | - \SODIUM_CRYPTO_SECRETBOX_KEYBYTES, |
|
| 87 | - $password, |
|
| 88 | - $salt, |
|
| 89 | - \SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, |
|
| 90 | - \SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE |
|
| 91 | - ); |
|
| 92 | - sodium_memzero($password); |
|
| 71 | + /** |
|
| 72 | + * Retourne une clé de la taille attendue pour le chiffrement |
|
| 73 | + * |
|
| 74 | + * Notamment si on utilise un mot de passe comme clé, il faut le hacher |
|
| 75 | + * pour servir de clé à la taille correspondante. |
|
| 76 | + */ |
|
| 77 | + private static function deriveKeyFromPassword( |
|
| 78 | + #[\SensitiveParameter] |
|
| 79 | + string $password, |
|
| 80 | + string $salt |
|
| 81 | + ): string { |
|
| 82 | + if (strlen($password) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) { |
|
| 83 | + return $password; |
|
| 84 | + } |
|
| 85 | + $key = sodium_crypto_pwhash( |
|
| 86 | + \SODIUM_CRYPTO_SECRETBOX_KEYBYTES, |
|
| 87 | + $password, |
|
| 88 | + $salt, |
|
| 89 | + \SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, |
|
| 90 | + \SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE |
|
| 91 | + ); |
|
| 92 | + sodium_memzero($password); |
|
| 93 | 93 | |
| 94 | - return $key; |
|
| 95 | - } |
|
| 94 | + return $key; |
|
| 95 | + } |
|
| 96 | 96 | } |
@@ -14,171 +14,171 @@ |
||
| 14 | 14 | |
| 15 | 15 | /** Gestion des clés d’authentification / chiffrement de SPIP */ |
| 16 | 16 | final class SpipCles { |
| 17 | - private static array $instances = []; |
|
| 18 | - |
|
| 19 | - private string $file = _DIR_ETC . 'cles.php'; |
|
| 20 | - private Cles $cles; |
|
| 21 | - |
|
| 22 | - public static function instance(string $file = ''): self { |
|
| 23 | - if (empty(self::$instances[$file])) { |
|
| 24 | - self::$instances[$file] = new self($file); |
|
| 25 | - } |
|
| 26 | - return self::$instances[$file]; |
|
| 27 | - } |
|
| 28 | - |
|
| 29 | - /** |
|
| 30 | - * Retourne le secret du site (shorthand) |
|
| 31 | - * @uses self::getSecretSite() |
|
| 32 | - */ |
|
| 33 | - public static function secret_du_site(): ?string { |
|
| 34 | - return (self::instance())->getSecretSite(); |
|
| 35 | - } |
|
| 36 | - |
|
| 37 | - private function __construct(string $file = '') { |
|
| 38 | - if ($file) { |
|
| 39 | - $this->file = $file; |
|
| 40 | - } |
|
| 41 | - $this->cles = new Cles($this->read()); |
|
| 42 | - } |
|
| 43 | - |
|
| 44 | - /** |
|
| 45 | - * Renvoyer le secret du site |
|
| 46 | - * |
|
| 47 | - * Le secret du site doit rester aussi secret que possible, et est eternel |
|
| 48 | - * On ne doit pas l'exporter |
|
| 49 | - * |
|
| 50 | - * Le secret est partagé entre une clé disque et une clé bdd |
|
| 51 | - * |
|
| 52 | - * @return string |
|
| 53 | - */ |
|
| 54 | - public function getSecretSite(bool $autoInit = true): ?string { |
|
| 55 | - $key = $this->getKey('secret_du_site', $autoInit); |
|
| 56 | - $meta = $this->getMetaKey('secret_du_site', $autoInit); |
|
| 57 | - // conserve la même longeur. |
|
| 58 | - return $key ^ $meta; |
|
| 59 | - } |
|
| 60 | - |
|
| 61 | - /** Renvoyer le secret des authentifications */ |
|
| 62 | - public function getSecretAuth(bool $autoInit = false): ?string { |
|
| 63 | - return $this->getKey('secret_des_auth', $autoInit); |
|
| 64 | - } |
|
| 65 | - public function save(): bool { |
|
| 66 | - return ecrire_fichier_securise($this->file, $this->cles->toJson()); |
|
| 67 | - } |
|
| 68 | - |
|
| 69 | - /** |
|
| 70 | - * Fournir une sauvegarde chiffree des cles (a l'aide d'une autre clé, comme le pass d'un auteur) |
|
| 71 | - * |
|
| 72 | - * @param string $withKey Clé de chiffrage de la sauvegarde |
|
| 73 | - * @return string Contenu de la sauvegarde chiffrée générée |
|
| 74 | - */ |
|
| 75 | - public function backup( |
|
| 76 | - #[\SensitiveParameter] |
|
| 77 | - string $withKey |
|
| 78 | - ): string { |
|
| 79 | - if (count($this->cles)) { |
|
| 80 | - return Chiffrement::chiffrer($this->cles->toJson(), $withKey); |
|
| 81 | - } |
|
| 82 | - return ''; |
|
| 83 | - } |
|
| 84 | - |
|
| 85 | - /** |
|
| 86 | - * Restaurer les cles manquantes depuis une sauvegarde chiffree des cles |
|
| 87 | - * (si la sauvegarde est bien valide) |
|
| 88 | - * |
|
| 89 | - * @param string $backup Sauvegarde chiffrée (générée par backup()) |
|
| 90 | - * @param int $id_auteur |
|
| 91 | - * @param string $pass |
|
| 92 | - * @return void |
|
| 93 | - */ |
|
| 94 | - public function restore( |
|
| 95 | - string $backup, |
|
| 96 | - #[\SensitiveParameter] |
|
| 97 | - string $password_clair, |
|
| 98 | - #[\SensitiveParameter] |
|
| 99 | - string $password_hash, |
|
| 100 | - int $id_auteur |
|
| 101 | - ): bool { |
|
| 102 | - if (empty($backup)) { |
|
| 103 | - return false; |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - $sauvegarde = Chiffrement::dechiffrer($backup, $password_clair); |
|
| 107 | - $json = json_decode($sauvegarde, true); |
|
| 108 | - if (!$json) { |
|
| 109 | - return false; |
|
| 110 | - } |
|
| 111 | - |
|
| 112 | - // cela semble une sauvegarde valide |
|
| 113 | - $cles_potentielles = array_map('base64_decode', $json); |
|
| 114 | - |
|
| 115 | - // il faut faire une double verif sur secret_des_auth |
|
| 116 | - // pour s'assurer qu'elle permet bien de decrypter le pass de l'auteur qui fournit la sauvegarde |
|
| 117 | - // et par extension tous les passwords |
|
| 118 | - if (!empty($cles_potentielles['secret_des_auth'])) { |
|
| 119 | - if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) { |
|
| 120 | - spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 121 | - unset($cles_potentielles['secret_des_auth']); |
|
| 122 | - } |
|
| 123 | - } |
|
| 124 | - |
|
| 125 | - // on merge les cles pour recuperer les cles manquantes |
|
| 126 | - $restauration = false; |
|
| 127 | - foreach ($cles_potentielles as $name => $key) { |
|
| 128 | - if (!$this->cles->has($name)) { |
|
| 129 | - $this->cles->set($name, $key); |
|
| 130 | - spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 131 | - $restauration = true; |
|
| 132 | - } |
|
| 133 | - } |
|
| 134 | - return $restauration; |
|
| 135 | - } |
|
| 136 | - |
|
| 137 | - private function getKey(string $name, bool $autoInit): ?string { |
|
| 138 | - if ($this->cles->has($name)) { |
|
| 139 | - return $this->cles->get($name); |
|
| 140 | - } |
|
| 141 | - if ($autoInit) { |
|
| 142 | - $this->cles->generate($name); |
|
| 143 | - // si l'ecriture de fichier a bien marche on peut utiliser la cle |
|
| 144 | - if ($this->save()) { |
|
| 145 | - return $this->cles->get($name); |
|
| 146 | - } |
|
| 147 | - // sinon loger et annule la cle generee car il ne faut pas l'utiliser |
|
| 148 | - spip_log("Echec ecriture du fichier cle ".$this->file." ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR); |
|
| 149 | - $this->cles->delete($name); |
|
| 150 | - } |
|
| 151 | - return null; |
|
| 152 | - } |
|
| 153 | - |
|
| 154 | - private function getMetaKey(string $name, bool $autoInit = true): ?string { |
|
| 155 | - if (!isset($GLOBALS['meta'][$name])) { |
|
| 156 | - include_spip('base/abstract_sql'); |
|
| 157 | - $GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string')); |
|
| 158 | - } |
|
| 159 | - $key = base64_decode($GLOBALS['meta'][$name] ?? ''); |
|
| 160 | - if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) { |
|
| 161 | - return $key; |
|
| 162 | - } |
|
| 163 | - if (!$autoInit) { |
|
| 164 | - return null; |
|
| 165 | - } |
|
| 166 | - $key = Chiffrement::keygen(); |
|
| 167 | - ecrire_meta($name, base64_encode($key), 'non'); |
|
| 168 | - lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas |
|
| 169 | - |
|
| 170 | - return $key; |
|
| 171 | - } |
|
| 172 | - |
|
| 173 | - private function read(): array { |
|
| 174 | - lire_fichier_securise($this->file, $json); |
|
| 175 | - if ( |
|
| 176 | - $json |
|
| 177 | - and $json = \json_decode($json, true) |
|
| 178 | - and is_array($json) |
|
| 179 | - ) { |
|
| 180 | - return array_map('base64_decode', $json); |
|
| 181 | - } |
|
| 182 | - return []; |
|
| 183 | - } |
|
| 17 | + private static array $instances = []; |
|
| 18 | + |
|
| 19 | + private string $file = _DIR_ETC . 'cles.php'; |
|
| 20 | + private Cles $cles; |
|
| 21 | + |
|
| 22 | + public static function instance(string $file = ''): self { |
|
| 23 | + if (empty(self::$instances[$file])) { |
|
| 24 | + self::$instances[$file] = new self($file); |
|
| 25 | + } |
|
| 26 | + return self::$instances[$file]; |
|
| 27 | + } |
|
| 28 | + |
|
| 29 | + /** |
|
| 30 | + * Retourne le secret du site (shorthand) |
|
| 31 | + * @uses self::getSecretSite() |
|
| 32 | + */ |
|
| 33 | + public static function secret_du_site(): ?string { |
|
| 34 | + return (self::instance())->getSecretSite(); |
|
| 35 | + } |
|
| 36 | + |
|
| 37 | + private function __construct(string $file = '') { |
|
| 38 | + if ($file) { |
|
| 39 | + $this->file = $file; |
|
| 40 | + } |
|
| 41 | + $this->cles = new Cles($this->read()); |
|
| 42 | + } |
|
| 43 | + |
|
| 44 | + /** |
|
| 45 | + * Renvoyer le secret du site |
|
| 46 | + * |
|
| 47 | + * Le secret du site doit rester aussi secret que possible, et est eternel |
|
| 48 | + * On ne doit pas l'exporter |
|
| 49 | + * |
|
| 50 | + * Le secret est partagé entre une clé disque et une clé bdd |
|
| 51 | + * |
|
| 52 | + * @return string |
|
| 53 | + */ |
|
| 54 | + public function getSecretSite(bool $autoInit = true): ?string { |
|
| 55 | + $key = $this->getKey('secret_du_site', $autoInit); |
|
| 56 | + $meta = $this->getMetaKey('secret_du_site', $autoInit); |
|
| 57 | + // conserve la même longeur. |
|
| 58 | + return $key ^ $meta; |
|
| 59 | + } |
|
| 60 | + |
|
| 61 | + /** Renvoyer le secret des authentifications */ |
|
| 62 | + public function getSecretAuth(bool $autoInit = false): ?string { |
|
| 63 | + return $this->getKey('secret_des_auth', $autoInit); |
|
| 64 | + } |
|
| 65 | + public function save(): bool { |
|
| 66 | + return ecrire_fichier_securise($this->file, $this->cles->toJson()); |
|
| 67 | + } |
|
| 68 | + |
|
| 69 | + /** |
|
| 70 | + * Fournir une sauvegarde chiffree des cles (a l'aide d'une autre clé, comme le pass d'un auteur) |
|
| 71 | + * |
|
| 72 | + * @param string $withKey Clé de chiffrage de la sauvegarde |
|
| 73 | + * @return string Contenu de la sauvegarde chiffrée générée |
|
| 74 | + */ |
|
| 75 | + public function backup( |
|
| 76 | + #[\SensitiveParameter] |
|
| 77 | + string $withKey |
|
| 78 | + ): string { |
|
| 79 | + if (count($this->cles)) { |
|
| 80 | + return Chiffrement::chiffrer($this->cles->toJson(), $withKey); |
|
| 81 | + } |
|
| 82 | + return ''; |
|
| 83 | + } |
|
| 84 | + |
|
| 85 | + /** |
|
| 86 | + * Restaurer les cles manquantes depuis une sauvegarde chiffree des cles |
|
| 87 | + * (si la sauvegarde est bien valide) |
|
| 88 | + * |
|
| 89 | + * @param string $backup Sauvegarde chiffrée (générée par backup()) |
|
| 90 | + * @param int $id_auteur |
|
| 91 | + * @param string $pass |
|
| 92 | + * @return void |
|
| 93 | + */ |
|
| 94 | + public function restore( |
|
| 95 | + string $backup, |
|
| 96 | + #[\SensitiveParameter] |
|
| 97 | + string $password_clair, |
|
| 98 | + #[\SensitiveParameter] |
|
| 99 | + string $password_hash, |
|
| 100 | + int $id_auteur |
|
| 101 | + ): bool { |
|
| 102 | + if (empty($backup)) { |
|
| 103 | + return false; |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + $sauvegarde = Chiffrement::dechiffrer($backup, $password_clair); |
|
| 107 | + $json = json_decode($sauvegarde, true); |
|
| 108 | + if (!$json) { |
|
| 109 | + return false; |
|
| 110 | + } |
|
| 111 | + |
|
| 112 | + // cela semble une sauvegarde valide |
|
| 113 | + $cles_potentielles = array_map('base64_decode', $json); |
|
| 114 | + |
|
| 115 | + // il faut faire une double verif sur secret_des_auth |
|
| 116 | + // pour s'assurer qu'elle permet bien de decrypter le pass de l'auteur qui fournit la sauvegarde |
|
| 117 | + // et par extension tous les passwords |
|
| 118 | + if (!empty($cles_potentielles['secret_des_auth'])) { |
|
| 119 | + if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) { |
|
| 120 | + spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 121 | + unset($cles_potentielles['secret_des_auth']); |
|
| 122 | + } |
|
| 123 | + } |
|
| 124 | + |
|
| 125 | + // on merge les cles pour recuperer les cles manquantes |
|
| 126 | + $restauration = false; |
|
| 127 | + foreach ($cles_potentielles as $name => $key) { |
|
| 128 | + if (!$this->cles->has($name)) { |
|
| 129 | + $this->cles->set($name, $key); |
|
| 130 | + spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 131 | + $restauration = true; |
|
| 132 | + } |
|
| 133 | + } |
|
| 134 | + return $restauration; |
|
| 135 | + } |
|
| 136 | + |
|
| 137 | + private function getKey(string $name, bool $autoInit): ?string { |
|
| 138 | + if ($this->cles->has($name)) { |
|
| 139 | + return $this->cles->get($name); |
|
| 140 | + } |
|
| 141 | + if ($autoInit) { |
|
| 142 | + $this->cles->generate($name); |
|
| 143 | + // si l'ecriture de fichier a bien marche on peut utiliser la cle |
|
| 144 | + if ($this->save()) { |
|
| 145 | + return $this->cles->get($name); |
|
| 146 | + } |
|
| 147 | + // sinon loger et annule la cle generee car il ne faut pas l'utiliser |
|
| 148 | + spip_log("Echec ecriture du fichier cle ".$this->file." ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR); |
|
| 149 | + $this->cles->delete($name); |
|
| 150 | + } |
|
| 151 | + return null; |
|
| 152 | + } |
|
| 153 | + |
|
| 154 | + private function getMetaKey(string $name, bool $autoInit = true): ?string { |
|
| 155 | + if (!isset($GLOBALS['meta'][$name])) { |
|
| 156 | + include_spip('base/abstract_sql'); |
|
| 157 | + $GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string')); |
|
| 158 | + } |
|
| 159 | + $key = base64_decode($GLOBALS['meta'][$name] ?? ''); |
|
| 160 | + if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) { |
|
| 161 | + return $key; |
|
| 162 | + } |
|
| 163 | + if (!$autoInit) { |
|
| 164 | + return null; |
|
| 165 | + } |
|
| 166 | + $key = Chiffrement::keygen(); |
|
| 167 | + ecrire_meta($name, base64_encode($key), 'non'); |
|
| 168 | + lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas |
|
| 169 | + |
|
| 170 | + return $key; |
|
| 171 | + } |
|
| 172 | + |
|
| 173 | + private function read(): array { |
|
| 174 | + lire_fichier_securise($this->file, $json); |
|
| 175 | + if ( |
|
| 176 | + $json |
|
| 177 | + and $json = \json_decode($json, true) |
|
| 178 | + and is_array($json) |
|
| 179 | + ) { |
|
| 180 | + return array_map('base64_decode', $json); |
|
| 181 | + } |
|
| 182 | + return []; |
|
| 183 | + } |
|
| 184 | 184 | } |