Completed
Push — master ( 8b5a3c...b0cbd6 )
by cam
01:56
created
ecrire/lang/ecrire_fa.php 1 patch
Indentation   +794 added lines, -794 removed lines patch added patch discarded remove patch
@@ -5,829 +5,829 @@
 block discarded – undo
5 5
 
6 6
 return [
7 7
 
8
-	// A
9
-	'activer_plugin' => 'plugin را فعال کنید',
10
-	'affichage' => 'ارايه',
11
-	'aide_non_disponible' => 'اين بخش كمكى براى اين زبان هنوز در دسترس نمى باشد',
12
-	'annuler_recherche' => 'لغو جستجو',
13
-	'auteur' => 'نویسنده:',
14
-	'avis_acces_interdit' => 'دسترسى به اين بخش ممنوع مى باشد',
15
-	'avis_article_modifie' => 'توجه ،              @nom_auteur_modif@                                        روى اين مقاله @date_diff@ پيش كار ميكرده',
16
-	'avis_aucun_resultat' => '.بدون نتيجه',
17
-	'avis_base_inaccessible' => 'دسترسي به پايگاه داده‌هاي @base@ ممكن نيست. ',
18
-	'avis_chemin_invalide_1' => 'راهى كه انتخاب كرده ايد',
19
-	'avis_chemin_invalide_2' => 'معتبر نميباشد. خواهشمند است به صفحه پيشين برگرديد و اطلاعات داده شده را بازنگرى كنيد',
20
-	'avis_connexion_echec_1' => 'ارتباط با پايگاه داده‌‌ها  برقرار نشد',
21
-	'avis_connexion_echec_2' => 'به صفحه پيشين برگرديد و اطلاعاتي را كه داده ايد بازنگرى كنيد',
22
-	'avis_connexion_echec_3' => 'براى تعدادى از سرورها شما بايد درخواست فعال كردن دسترسى به پايگاه ماى اس كيو ال را پيش از استفاده آن بكنيد. اگر ارتباط برقرار نشد مطمئن شويد كه اين كار را انجام داده ايد              ',
23
-	'avis_connexion_erreur_nom_base' => 'نام پايگاه نمي‌تواند چيزي جز حروف، ارقام و خط تيره باشد',
24
-	'avis_connexion_ldap_echec_1' => 'LDAP.ارتباط با سرور ال دى ا پى برقرار نشد                ',
25
-	'avis_connexion_ldap_echec_2' => 'به صفحه پيش برگرديد و ببينيد اطلاعاتي را كه داده ايد صحيح ميباشند',
26
-	'avis_connexion_ldap_echec_3' => 'از سيستم ال دى ا پى به طور پى در پى براى ورود كاربران استفاده نكنيد',
27
-	'avis_deplacement_rubrique' => 'توجه ! اين بخش داراى@contient_breves@ brève@scb@ ميباشد : خواهشمند است درصورت جابجائي آن، علامت مربوطه را تائيد كنيد ',
28
-	'avis_erreur_connexion_mysql' => 'خطاى اتصال SQL   ',
29
-	'avis_espace_interdit' => '<b>بخش ممنوع</b><p> اسپيپ قبلأ نصب شده', # MODIF
30
-	'avis_lecture_noms_bases_1' => '  برنامه نصبى نتوانست نام داده پى هاى مستقر شده را بخواند ',
31
-	'avis_lecture_noms_bases_2' => '  يا هيچ پايگاهى موجود نميباشد، يا كاركردى كه اجازه فهرست گذارى پايگاه ها راميدهد بدلايل ايمنى غير فعال شده است     (مورد بعضى از ميزبانان ميباشد)',
32
-	'avis_lecture_noms_bases_3' => ' در  گزينش دوم، اين احتمال وجود دارد كه پايگاهى   كه حامل نام شما براى ارتباط ميباشد استفاده شده باشد',
33
-	'avis_non_acces_page' => 'اين صفحه در دسترس شما نميباشد',
34
-	'avis_operation_echec' => 'کارکرد نتیجه نداد.',
35
-	'avis_operation_impossible' => 'عمل غیرممکن',
36
-	'avis_suppression_base' => ' توجه! حذف داده ها غير قابل برگشت ميباشد',
8
+    // A
9
+    'activer_plugin' => 'plugin را فعال کنید',
10
+    'affichage' => 'ارايه',
11
+    'aide_non_disponible' => 'اين بخش كمكى براى اين زبان هنوز در دسترس نمى باشد',
12
+    'annuler_recherche' => 'لغو جستجو',
13
+    'auteur' => 'نویسنده:',
14
+    'avis_acces_interdit' => 'دسترسى به اين بخش ممنوع مى باشد',
15
+    'avis_article_modifie' => 'توجه ،              @nom_auteur_modif@                                        روى اين مقاله @date_diff@ پيش كار ميكرده',
16
+    'avis_aucun_resultat' => '.بدون نتيجه',
17
+    'avis_base_inaccessible' => 'دسترسي به پايگاه داده‌هاي @base@ ممكن نيست. ',
18
+    'avis_chemin_invalide_1' => 'راهى كه انتخاب كرده ايد',
19
+    'avis_chemin_invalide_2' => 'معتبر نميباشد. خواهشمند است به صفحه پيشين برگرديد و اطلاعات داده شده را بازنگرى كنيد',
20
+    'avis_connexion_echec_1' => 'ارتباط با پايگاه داده‌‌ها  برقرار نشد',
21
+    'avis_connexion_echec_2' => 'به صفحه پيشين برگرديد و اطلاعاتي را كه داده ايد بازنگرى كنيد',
22
+    'avis_connexion_echec_3' => 'براى تعدادى از سرورها شما بايد درخواست فعال كردن دسترسى به پايگاه ماى اس كيو ال را پيش از استفاده آن بكنيد. اگر ارتباط برقرار نشد مطمئن شويد كه اين كار را انجام داده ايد              ',
23
+    'avis_connexion_erreur_nom_base' => 'نام پايگاه نمي‌تواند چيزي جز حروف، ارقام و خط تيره باشد',
24
+    'avis_connexion_ldap_echec_1' => 'LDAP.ارتباط با سرور ال دى ا پى برقرار نشد                ',
25
+    'avis_connexion_ldap_echec_2' => 'به صفحه پيش برگرديد و ببينيد اطلاعاتي را كه داده ايد صحيح ميباشند',
26
+    'avis_connexion_ldap_echec_3' => 'از سيستم ال دى ا پى به طور پى در پى براى ورود كاربران استفاده نكنيد',
27
+    'avis_deplacement_rubrique' => 'توجه ! اين بخش داراى@contient_breves@ brève@scb@ ميباشد : خواهشمند است درصورت جابجائي آن، علامت مربوطه را تائيد كنيد ',
28
+    'avis_erreur_connexion_mysql' => 'خطاى اتصال SQL   ',
29
+    'avis_espace_interdit' => '<b>بخش ممنوع</b><p> اسپيپ قبلأ نصب شده', # MODIF
30
+    'avis_lecture_noms_bases_1' => '  برنامه نصبى نتوانست نام داده پى هاى مستقر شده را بخواند ',
31
+    'avis_lecture_noms_bases_2' => '  يا هيچ پايگاهى موجود نميباشد، يا كاركردى كه اجازه فهرست گذارى پايگاه ها راميدهد بدلايل ايمنى غير فعال شده است     (مورد بعضى از ميزبانان ميباشد)',
32
+    'avis_lecture_noms_bases_3' => ' در  گزينش دوم، اين احتمال وجود دارد كه پايگاهى   كه حامل نام شما براى ارتباط ميباشد استفاده شده باشد',
33
+    'avis_non_acces_page' => 'اين صفحه در دسترس شما نميباشد',
34
+    'avis_operation_echec' => 'کارکرد نتیجه نداد.',
35
+    'avis_operation_impossible' => 'عمل غیرممکن',
36
+    'avis_suppression_base' => ' توجه! حذف داده ها غير قابل برگشت ميباشد',
37 37
 
38
-	// B
39
-	'bouton_acces_ldap' => 'دسترسى به LDAP را اضافه كنيد',
40
-	'bouton_ajouter' => 'اضافه كنيد',
41
-	'bouton_annuler' => 'باطل کنید',
42
-	'bouton_cache_activer' => 'بازفعال سازي حافظه پنهان',
43
-	'bouton_cache_desactiver' => 'غيرفعال سازي موقت حافظه پنهان ',
44
-	'bouton_demande_publication' => 'انتشار اين مقاله را درخواست كنيد  ',
45
-	'bouton_desactive_tout' => 'همه را غیر فعال کنید',
46
-	'bouton_desinstaller' => 'حذف کنید',
47
-	'bouton_effacer_tout' => 'همه را پاك كنيد',
48
-	'bouton_envoyer_message' => 'پيام آماده : بفرستيد',
49
-	'bouton_fermer' => 'بستن',
50
-	'bouton_mettre_a_jour_base' => 'به هنگام سازي پايگاه داده‌ها',
51
-	'bouton_modifier' => 'اصلاح كنيد',
52
-	'bouton_radio_afficher' => 'نشان دهيد',
53
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'در فهرست نويسندگانى كه به اسپيپ وصل هستند ظاهر شود',
54
-	'bouton_radio_envoi_annonces_adresse' => ':خبرها را به اين آدرس بفرستيد',
55
-	'bouton_radio_envoi_liste_nouveautes' => 'فهرست تازه ها را بفرستيد:',
56
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'در فهرست نويسندها نمايان نشود',
57
-	'bouton_radio_non_envoi_annonces_editoriales' => 'خبرهاى مربوط به سر مقاله ها را نفرستيد',
58
-	'bouton_redirection' => 'هدايت دوباره',
59
-	'bouton_relancer_installation' => 'دوباره نصب كنيد',
60
-	'bouton_suivant' => 'بعدى',
61
-	'bouton_tenter_recuperation' => 'اقدام به تعمير كنيد',
62
-	'bouton_test_proxy' => 'پروكسى را امتحان كنيد',
63
-	'bouton_vider_cache' => 'فايل موقت را خالى كنيد',
38
+    // B
39
+    'bouton_acces_ldap' => 'دسترسى به LDAP را اضافه كنيد',
40
+    'bouton_ajouter' => 'اضافه كنيد',
41
+    'bouton_annuler' => 'باطل کنید',
42
+    'bouton_cache_activer' => 'بازفعال سازي حافظه پنهان',
43
+    'bouton_cache_desactiver' => 'غيرفعال سازي موقت حافظه پنهان ',
44
+    'bouton_demande_publication' => 'انتشار اين مقاله را درخواست كنيد  ',
45
+    'bouton_desactive_tout' => 'همه را غیر فعال کنید',
46
+    'bouton_desinstaller' => 'حذف کنید',
47
+    'bouton_effacer_tout' => 'همه را پاك كنيد',
48
+    'bouton_envoyer_message' => 'پيام آماده : بفرستيد',
49
+    'bouton_fermer' => 'بستن',
50
+    'bouton_mettre_a_jour_base' => 'به هنگام سازي پايگاه داده‌ها',
51
+    'bouton_modifier' => 'اصلاح كنيد',
52
+    'bouton_radio_afficher' => 'نشان دهيد',
53
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'در فهرست نويسندگانى كه به اسپيپ وصل هستند ظاهر شود',
54
+    'bouton_radio_envoi_annonces_adresse' => ':خبرها را به اين آدرس بفرستيد',
55
+    'bouton_radio_envoi_liste_nouveautes' => 'فهرست تازه ها را بفرستيد:',
56
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'در فهرست نويسندها نمايان نشود',
57
+    'bouton_radio_non_envoi_annonces_editoriales' => 'خبرهاى مربوط به سر مقاله ها را نفرستيد',
58
+    'bouton_redirection' => 'هدايت دوباره',
59
+    'bouton_relancer_installation' => 'دوباره نصب كنيد',
60
+    'bouton_suivant' => 'بعدى',
61
+    'bouton_tenter_recuperation' => 'اقدام به تعمير كنيد',
62
+    'bouton_test_proxy' => 'پروكسى را امتحان كنيد',
63
+    'bouton_vider_cache' => 'فايل موقت را خالى كنيد',
64 64
 
65
-	// C
66
-	'cache_modifiable_webmestre' => 'اين پارامترها توسط وب مستر سايت ميتواند اصلاح شود.',
67
-	'calendrier_synchro' => ' درصورت استفاده از نرم افزارهاى روزشمار ويژه<b>iCal</b>, ميتوانيد آنرا با مطالب اين سايت منطبق كنيد',
68
-	'config_activer_champs' => 'بخشهای زیر را فعال کنید',
69
-	'config_choix_base_sup' => 'يك پايگاه روي اين سرور تعيين كنيد',
70
-	'config_erreur_base_sup' => 'اسپيپ به فهرست پايگاه‌هاي قابل دسترس دسترسي ندارد',
71
-	'config_info_base_sup' => 'اگر شما پايگاه داده‌هاي ديگري براي امتحان از طريق اسپيپ داريد، با سرور اس.كيو.ال يا غير آن، بگذاريد كه آن‌ها آشكار شوند. اگر بعضي از ميدان‌ها را خالي بگذاريد، شناسه‌هاي ارتباط با پايگاه اصلي مورد استفاده قرار خواهند گرفت. ',
72
-	'config_info_base_sup_disponibles' => 'پايگاه‌هاي مكمل اكنون جستجوپذير اند',
73
-	'config_info_enregistree' => 'پيكربندي جديد ثبت شده',
74
-	'config_info_logos' => 'هر قسمت سایت میتواند یک لوگو logo و یک لوگوی survol داشته باشد',
75
-	'config_info_logos_utiliser' => 'از لوگوها استفاده کنید',
76
-	'config_info_logos_utiliser_non' => 'از لوگوها استفاده نکنید',
77
-	'config_info_logos_utiliser_survol' => 'از لوگوهای survol استفاده کنید',
78
-	'config_info_logos_utiliser_survol_non' => 'از لوگوهای survol استفاده نکنید',
79
-	'config_info_redirection' => 'با فعال کردن این گزینش شما میتوانید مقالات مجازی درست کنید و یا مراجع مقالات منتشر شده در دیگر سایتها را بدهید',
80
-	'config_redirection' => 'مقالات مجازی',
81
-	'config_titre_base_sup' => 'اعلام يك پايگاه مكمل',
82
-	'config_titre_base_sup_choix' => 'يك پايگاه مكمل انتخاب كنيد',
83
-	'connexion_ldap' => 'ارتباط',
84
-	'creer_et_associer_un_auteur' => 'ايجاد و اتصال نويسنده',
65
+    // C
66
+    'cache_modifiable_webmestre' => 'اين پارامترها توسط وب مستر سايت ميتواند اصلاح شود.',
67
+    'calendrier_synchro' => ' درصورت استفاده از نرم افزارهاى روزشمار ويژه<b>iCal</b>, ميتوانيد آنرا با مطالب اين سايت منطبق كنيد',
68
+    'config_activer_champs' => 'بخشهای زیر را فعال کنید',
69
+    'config_choix_base_sup' => 'يك پايگاه روي اين سرور تعيين كنيد',
70
+    'config_erreur_base_sup' => 'اسپيپ به فهرست پايگاه‌هاي قابل دسترس دسترسي ندارد',
71
+    'config_info_base_sup' => 'اگر شما پايگاه داده‌هاي ديگري براي امتحان از طريق اسپيپ داريد، با سرور اس.كيو.ال يا غير آن، بگذاريد كه آن‌ها آشكار شوند. اگر بعضي از ميدان‌ها را خالي بگذاريد، شناسه‌هاي ارتباط با پايگاه اصلي مورد استفاده قرار خواهند گرفت. ',
72
+    'config_info_base_sup_disponibles' => 'پايگاه‌هاي مكمل اكنون جستجوپذير اند',
73
+    'config_info_enregistree' => 'پيكربندي جديد ثبت شده',
74
+    'config_info_logos' => 'هر قسمت سایت میتواند یک لوگو logo و یک لوگوی survol داشته باشد',
75
+    'config_info_logos_utiliser' => 'از لوگوها استفاده کنید',
76
+    'config_info_logos_utiliser_non' => 'از لوگوها استفاده نکنید',
77
+    'config_info_logos_utiliser_survol' => 'از لوگوهای survol استفاده کنید',
78
+    'config_info_logos_utiliser_survol_non' => 'از لوگوهای survol استفاده نکنید',
79
+    'config_info_redirection' => 'با فعال کردن این گزینش شما میتوانید مقالات مجازی درست کنید و یا مراجع مقالات منتشر شده در دیگر سایتها را بدهید',
80
+    'config_redirection' => 'مقالات مجازی',
81
+    'config_titre_base_sup' => 'اعلام يك پايگاه مكمل',
82
+    'config_titre_base_sup_choix' => 'يك پايگاه مكمل انتخاب كنيد',
83
+    'connexion_ldap' => 'ارتباط',
84
+    'creer_et_associer_un_auteur' => 'ايجاد و اتصال نويسنده',
85 85
 
86
-	// D
87
-	'date_mot_heures' => 'ساعت',
86
+    // D
87
+    'date_mot_heures' => 'ساعت',
88 88
 
89
-	// E
90
-	'ecran_securite' => '+ نمايشگر ايمني @version@',
91
-	'email' => 'ايميل',
92
-	'email_2' => ': ايميل ',
93
-	'en_savoir_plus' => 'براي آگاهي بيشتر ',
94
-	'entree_adresse_annuaire' => 'آدرس راهنما',
95
-	'entree_adresse_email' => 'آدرس ايميل شما ',
96
-	'entree_adresse_email_2' => 'نشاني ايميل ',
97
-	'entree_base_donnee_1' => 'آدرس داده پى ها',
98
-	'entree_base_donnee_2' => 'اغلب, اين آدرس با آدرس سايتتون مطابقت ميكند گاهى با گزينش «localhost»  مطابقت و گاهى كاملأ خاليست)',
99
-	'entree_biographie' => 'زندگينامه كوتاه در چند كلمه',
100
-	'entree_chemin_acces' => ' راه ورود </b> وارد شويد <b>',
101
-	'entree_cle_pgp' => 'PGP كليد شما          ',
102
-	'entree_cle_pgp_2' => 'كليد پي.چي.پي',
103
-	'entree_contenu_rubrique' => '(محتوى اين بخش در چند كلمه)',
104
-	'entree_identifiants_connexion' => 'كلمه شناسائى براى متصل شدن',
105
-	'entree_identifiants_connexion_2' => 'شناسه‌ي ارتباط',
106
-	'entree_informations_connexion_ldap' => 'LDAP     خواهشمند است، اطلاعات مربوط به ارتباط به راهنماى  ال دى ا پى را در اين پرسشنامه وارد كنيد.
89
+    // E
90
+    'ecran_securite' => '+ نمايشگر ايمني @version@',
91
+    'email' => 'ايميل',
92
+    'email_2' => ': ايميل ',
93
+    'en_savoir_plus' => 'براي آگاهي بيشتر ',
94
+    'entree_adresse_annuaire' => 'آدرس راهنما',
95
+    'entree_adresse_email' => 'آدرس ايميل شما ',
96
+    'entree_adresse_email_2' => 'نشاني ايميل ',
97
+    'entree_base_donnee_1' => 'آدرس داده پى ها',
98
+    'entree_base_donnee_2' => 'اغلب, اين آدرس با آدرس سايتتون مطابقت ميكند گاهى با گزينش «localhost»  مطابقت و گاهى كاملأ خاليست)',
99
+    'entree_biographie' => 'زندگينامه كوتاه در چند كلمه',
100
+    'entree_chemin_acces' => ' راه ورود </b> وارد شويد <b>',
101
+    'entree_cle_pgp' => 'PGP كليد شما          ',
102
+    'entree_cle_pgp_2' => 'كليد پي.چي.پي',
103
+    'entree_contenu_rubrique' => '(محتوى اين بخش در چند كلمه)',
104
+    'entree_identifiants_connexion' => 'كلمه شناسائى براى متصل شدن',
105
+    'entree_identifiants_connexion_2' => 'شناسه‌ي ارتباط',
106
+    'entree_informations_connexion_ldap' => 'LDAP     خواهشمند است، اطلاعات مربوط به ارتباط به راهنماى  ال دى ا پى را در اين پرسشنامه وارد كنيد.
107 107
  اين ااطلاعات ميبايد توسط گرداننده  سيستم 
108 108
 يا شبكه به شما داده شود',
109
-	'entree_infos_perso' => ' كى هستيد؟',
110
-	'entree_infos_perso_2' => 'نويسنده كيست؟',
111
-	'entree_interieur_rubrique' => ': در داخل اين بخش',
112
-	'entree_liens_sites' => '<b>ارتباط hypertexte</b> (.مراجع , سايت هايي براى بازديد )',
113
-	'entree_login' => 'شما login',
114
-	'entree_login_connexion_1' => 'ارتباط login',
115
-	'entree_login_connexion_2' => '(مطابقت ميكند، گاهى خالى گذاشته شده  FTPورود به login گاهى با)    ',
116
-	'entree_mot_passe' => 'كلمه ورودتان',
117
-	'entree_mot_passe_1' => '(كلمه ورود براى ارتباط (كنكشن',
118
-	'entree_mot_passe_2' => '(مطابقت ميكند، گاهى خالى گذاشته شده FTP گاهى با كلمه ورود )      ',
119
-	'entree_nom_fichier' => '@texte_compresse@:خواهشمند است نام فايل را داخل بنمائيد',
120
-	'entree_nom_pseudo' => 'نام يا نام مستعارتان',
121
-	'entree_nom_pseudo_1' => '(نام يا نام مستعارتان)',
122
-	'entree_nom_pseudo_2' => 'نام يا نام مستعار',
123
-	'entree_nom_site' => 'نام سايتتان',
124
-	'entree_nom_site_2' => 'نام سايت نويسنده',
125
-	'entree_nouveau_passe' => 'كلمه ورود جديد',
126
-	'entree_passe_ldap' => 'كلمه ورود',
127
-	'entree_port_annuaire' => 'شماره وردى راهنما',
128
-	'entree_signature' => 'امضاء',
129
-	'entree_titre_obligatoire' => '</b>عنوان<b> [اجبارى]<br />',
130
-	'entree_url' => '(URL) آدرس سايتتان',
131
-	'entree_url_2' => 'آدرس (يو.آر.ال) سايت',
132
-	'erreur_connect_deja_existant' => 'سروري به نام     موجود است',
133
-	'erreur_email_deja_existant' => 'اين نشاني ايميل قبلاً ثبت شده است.',
134
-	'erreur_nom_connect_incorrect' => 'نام سرور مجاز نيست',
135
-	'erreur_plugin_desinstalation_echouee' => 'نصب زدايي پلاگين موفق نبود. با اين وجود مي‌توانيد آن را غيرفعال سازيد.',
136
-	'erreur_plugin_fichier_absent' => 'فایل موجود نیست',
137
-	'erreur_plugin_fichier_def_absent' => 'فایل معیار موجود نیست',
138
-	'erreur_plugin_nom_fonction_interdit' => 'نام تابع مجاز نمیباشد',
139
-	'erreur_plugin_nom_manquant' => 'نام plugin یافت نمیشود',
140
-	'erreur_plugin_prefix_manquant' => 'بخش نامگذاری plugin کامل نمیباشد',
141
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; در فایل توضیحی موجود نمیباشد',
142
-	'erreur_plugin_version_manquant' => 'نسخه ی plugin موجود نمیباشد',
109
+    'entree_infos_perso' => ' كى هستيد؟',
110
+    'entree_infos_perso_2' => 'نويسنده كيست؟',
111
+    'entree_interieur_rubrique' => ': در داخل اين بخش',
112
+    'entree_liens_sites' => '<b>ارتباط hypertexte</b> (.مراجع , سايت هايي براى بازديد )',
113
+    'entree_login' => 'شما login',
114
+    'entree_login_connexion_1' => 'ارتباط login',
115
+    'entree_login_connexion_2' => '(مطابقت ميكند، گاهى خالى گذاشته شده  FTPورود به login گاهى با)    ',
116
+    'entree_mot_passe' => 'كلمه ورودتان',
117
+    'entree_mot_passe_1' => '(كلمه ورود براى ارتباط (كنكشن',
118
+    'entree_mot_passe_2' => '(مطابقت ميكند، گاهى خالى گذاشته شده FTP گاهى با كلمه ورود )      ',
119
+    'entree_nom_fichier' => '@texte_compresse@:خواهشمند است نام فايل را داخل بنمائيد',
120
+    'entree_nom_pseudo' => 'نام يا نام مستعارتان',
121
+    'entree_nom_pseudo_1' => '(نام يا نام مستعارتان)',
122
+    'entree_nom_pseudo_2' => 'نام يا نام مستعار',
123
+    'entree_nom_site' => 'نام سايتتان',
124
+    'entree_nom_site_2' => 'نام سايت نويسنده',
125
+    'entree_nouveau_passe' => 'كلمه ورود جديد',
126
+    'entree_passe_ldap' => 'كلمه ورود',
127
+    'entree_port_annuaire' => 'شماره وردى راهنما',
128
+    'entree_signature' => 'امضاء',
129
+    'entree_titre_obligatoire' => '</b>عنوان<b> [اجبارى]<br />',
130
+    'entree_url' => '(URL) آدرس سايتتان',
131
+    'entree_url_2' => 'آدرس (يو.آر.ال) سايت',
132
+    'erreur_connect_deja_existant' => 'سروري به نام     موجود است',
133
+    'erreur_email_deja_existant' => 'اين نشاني ايميل قبلاً ثبت شده است.',
134
+    'erreur_nom_connect_incorrect' => 'نام سرور مجاز نيست',
135
+    'erreur_plugin_desinstalation_echouee' => 'نصب زدايي پلاگين موفق نبود. با اين وجود مي‌توانيد آن را غيرفعال سازيد.',
136
+    'erreur_plugin_fichier_absent' => 'فایل موجود نیست',
137
+    'erreur_plugin_fichier_def_absent' => 'فایل معیار موجود نیست',
138
+    'erreur_plugin_nom_fonction_interdit' => 'نام تابع مجاز نمیباشد',
139
+    'erreur_plugin_nom_manquant' => 'نام plugin یافت نمیشود',
140
+    'erreur_plugin_prefix_manquant' => 'بخش نامگذاری plugin کامل نمیباشد',
141
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; در فایل توضیحی موجود نمیباشد',
142
+    'erreur_plugin_version_manquant' => 'نسخه ی plugin موجود نمیباشد',
143 143
 
144
-	// H
145
-	'htaccess_a_simuler' => 'هشدار:‌ پيكربندي HTTP سرور شما پرونده‌هاي @htaccess@ را ناديده مي‌گيرد. براي تضمين امنيت كافي،‌ بايد پيكربندي اين را عضو كنيد. يا مطمئن شويد ثابت‌هاي @constantes@ (تعريف شده در پرونده‌ي mes_options.ph) همان مقدار خارج از ديركتوار @document_root@ را دارد.  ',
146
-	'htaccess_inoperant' => 'htaccess بي‌اثر',
144
+    // H
145
+    'htaccess_a_simuler' => 'هشدار:‌ پيكربندي HTTP سرور شما پرونده‌هاي @htaccess@ را ناديده مي‌گيرد. براي تضمين امنيت كافي،‌ بايد پيكربندي اين را عضو كنيد. يا مطمئن شويد ثابت‌هاي @constantes@ (تعريف شده در پرونده‌ي mes_options.ph) همان مقدار خارج از ديركتوار @document_root@ را دارد.  ',
146
+    'htaccess_inoperant' => 'htaccess بي‌اثر',
147 147
 
148
-	// I
149
-	'ical_info1' => 'اين صفحه شيوه هاى گوناگونى را براى آگاهى از مسايل روزانه سايت معرفى ميكند.',
150
-	'ical_info2' => 'براى آگاهى بيشتر از جزييات فنى به, <a href="@spipnet@">اسناد اسپيپ </a> مراجعه كنيد.',
151
-	'ical_info_calendrier' => '٢ روزشمار در دسترس شما ميباشد.  روزشمار اول وضعيت سايت را همراه با خبرهاى مربوط به مقالات منتشره نشان ميدهد. روزشمار دوم حاوى مقالات تحريريه و آخرين پيامهاى خصوصى شما كه بواسطه يك كد شخصى تنها در درسترس شما ميباشد است. شما ميتوانيد آنرا در هر زمانى كه مايل باشيد تغيير دهيد. ',
152
-	'ical_methode_http' => 'بارگذارى',
153
-	'ical_methode_webcal' => 'مقارن كردن (webcal://)',
154
-	'ical_texte_prive' => 'اين روزشمار شما را در جريان فعاليتهاى تحريريه ويژه سايت ميگذارد (كار, ملاقات هاى شخصى,  مقالات ...). ',
155
-	'ical_texte_public' => 'اين روزشمار بشما امكان پيگيرى فعاليت هاى همگانى سايت را ميدهد (مقالات,...). ',
156
-	'ical_texte_rss' => ' شما ميتوانيد تازه هاى اين سايت را با فايلهاى XML/RSS (Rich Site Summary)  بديگر سايتها پيوند دهيد.همچنين اين نوع فايل به اسپيپ امكان خواندن تازه هاى ديگر سايتها را ميدهد.',
157
-	'ical_titre_js' => 'جاوا اسكريپت',
158
-	'ical_titre_mailing' => 'ليست ايميلها',
159
-	'ical_titre_rss' => ' فايل syndication',
160
-	'icone_accueil' => 'خانه',
161
-	'icone_activer_cookie' => 'كوكى مكاتبه را فعال كنيد',
162
-	'icone_activite' => 'بازخورد',
163
-	'icone_admin_plugin' => 'اداره ی plugins',
164
-	'icone_administration' => 'نگه‌داري',
165
-	'icone_afficher_auteurs' => 'فهرست نويسند گان را بروى صفحه نشان دهيد ',
166
-	'icone_afficher_visiteurs' => ' فهرست بازديدكنند گان را بروى صفحه نشان دهيد ',
167
-	'icone_arret_discussion' => 'ديگر در اين بحث شركت نكنيد',
168
-	'icone_calendrier' => 'تقويم',
169
-	'icone_configuration' => 'پيكربندي',
170
-	'icone_creer_auteur' => 'يك نويسنده جديد اضافه و به اين مقاله مرتبطش كنيد',
171
-	'icone_creer_mot_cle' => 'يك كليد-واژه نو بسازيد و به اين مقاله مرتبطش كنيد',
172
-	'icone_creer_rubrique_2' => 'يك بخش جديد بسازيد',
173
-	'icone_edition' => 'ويرايش',
174
-	'icone_ma_langue' => 'زبان من',
175
-	'icone_mes_infos' => 'اطلاعات من',
176
-	'icone_mes_preferences' => 'ترجيح‌هاي من',
177
-	'icone_modifier_article' => 'اين مقاله را اصلاح كنيد',
178
-	'icone_modifier_rubrique' => 'اين بخش را اصلاح كنيد',
179
-	'icone_publication' => 'انتشار',
180
-	'icone_relancer_signataire' => 'بازنشر امضاء',
181
-	'icone_retour' => 'بازگشت',
182
-	'icone_retour_article' => 'بازگشت به مقاله',
183
-	'icone_squelette' => 'اسكلت',
184
-	'icone_suivi_publication' => 'پيگيري انتشارات',
185
-	'icone_supprimer_cookie' => 'كوكى مكاتبه را حذف كنيد',
186
-	'icone_supprimer_rubrique' => 'اين بخش را حذف كنيد',
187
-	'icone_supprimer_signature' => 'اين امضاء را حذف كنيد',
188
-	'icone_valider_signature' => 'اين امضاء را معتبر كنيد',
189
-	'image_administrer_rubrique' => 'شما ميتوانيد اين بخش را اداره كنيد',
190
-	'impossible_modifier_login_auteur' => 'تغيير لاگين ممكن نيست.', # MODIF
191
-	'impossible_modifier_pass_auteur' => 'تغيير گذرواژه ممكن نيست.', # MODIF
192
-	'info_1_article' => '١ مقاله',
193
-	'info_1_auteur' => 'نويسنده‌ي 1',
194
-	'info_1_message' => 'پيام 1',
195
-	'info_1_mot_cle' => 'كليدواژه‌ي 1',
196
-	'info_1_rubrique' => 'بخش 1',
197
-	'info_1_visiteur' => 'بازديد‌كننده‌ي 1',
198
-	'info_activer_cookie' => ' شما ميتوانيد  كوكى مكاتبه  را فعال نماپيد اينكار به شما اجازه خواهد داد كه براحتى از سايت همگانى به سايت خصوصى برويد',
199
-	'info_admin_etre_webmestre' => 'دادن حق وب مستر به من',
200
-	'info_admin_je_suis_webmestre' => 'من <b>webmestre</b> هستم',
201
-	'info_admin_statuer_webmestre' => 'تفويض حق وب مستري به اين مدير',
202
-	'info_admin_webmestre' => 'اين مدير <b>webmestre</b> است',
203
-	'info_administrateur' => 'گردانند سايت',
204
-	'info_administrateur_1' => 'گرداننده  ',
205
-	'info_administrateur_2' => '(<i>با احتياط استفاده كنيد </i>) سايت ',
206
-	'info_administrateur_site_01' => 'اگر شما از گردانند گان سايت هستيد، خواهشمند است',
207
-	'info_administrateur_site_02' => 'روى اين پيوند كليك كنيد',
208
-	'info_administrateurs' => 'گردانند گان سايت',
209
-	'info_administrer_rubrique' => 'شما ميتوانيد اين بخش را اداره كنيد',
210
-	'info_adresse' => ': به آدرس',
211
-	'info_adresse_desinscription' => 'نساني قطع آبونمان: ',
212
-	'info_adresse_url' => '(URL) آدرس سايت همگانى      ',
213
-	'info_afficher_par_nb' => 'نشان دادن با',
214
-	'info_aide_en_ligne' => 'SPIP كمك در تارنما',
215
-	'info_ajout_image' => '  هنگامى كه تصاويرى را ضميمه مقاله اى ميكنيد، اسپيپ ميتواند بطور خودكار آنها را بصورت كوچك شده اضافه كند. با اين روش ميتوان براى مثال نمايى از مجموع تصاوير را بطور خودكار درست كرد ',
216
-	'info_ajouter_rubrique' => 'يك بخش ديگر را براى اداه كردن اضافه كنيد',
217
-	'info_annonce_nouveautes' => 'خبر تازه ها',
218
-	'info_article' => 'مقاله',
219
-	'info_article_2' => 'مقاله',
220
-	'info_article_a_paraitre' => 'مقالات با تاريخ آينده منتشر شوند',
221
-	'info_articles_02' => 'مقالات',
222
-	'info_articles_2' => 'مقالات',
223
-	'info_articles_auteur' => 'مقالات اين نويسنده',
224
-	'info_articles_miens' => 'مقالات من',
225
-	'info_articles_tous' => 'تمام مقاله‌ها',
226
-	'info_articles_trouves' => 'مقالات پيدا شده',
227
-	'info_attente_validation' => 'مقاله هايتان در انتظار تأئيد شدن',
228
-	'info_aucun_article' => 'مقاله‌اي نيست',
229
-	'info_aucun_auteur' => 'هيچ مؤلفي موجود نيست',
230
-	'info_aucun_message' => 'هيچ پيامي موجود نيست',
231
-	'info_aucun_rubrique' => 'هيچ بخش',
232
-	'info_aujourdhui' => ': امروز',
233
-	'info_auteur_gere_toutes_rubriques_2' => 'من <b> تمام بخش‌ها را اداره مي‌كنم</b>', # MODIF
234
-	'info_auteurs' => 'نويسندگان ',
235
-	'info_auteurs_par_tri' => '@partri@ نويسنده گان',
236
-	'info_auteurs_trouves' => 'نويسنده گان پيدا شده   ',
237
-	'info_authentification_externe' => 'تأئيد از خارج',
238
-	'info_avertissement' => 'تذكر',
239
-	'info_barre_outils' => 'با ميل ابزار آن؟',
240
-	'info_base_installee' => '.ساختار داده پى هايتان نصب شده',
241
-	'info_bio' => 'زندگي‌نامه',
242
-	'info_cache_desactive' => 'حفاظه پنهان موقتاً غيرفعال است.',
243
-	'info_chapeau' => 'سر متن',
244
-	'info_chapeau_2' => ':سر متن',
245
-	'info_chemin_acces_1' => 'گزینش: <b>مسير ورود به راهنما</b>',
246
-	'info_chemin_acces_2' => 'شما بايد پس از اين مسير دسترسى به اطلاعات را در راهنما تنظيم كنيد. اين اطلاعات براى شناسائى كاربرانى كه در راهنما هستند ضرورى ميباشد',
247
-	'info_chemin_acces_annuaire' => 'گزینش : <b>مسير ورود به راهنما',
248
-	'info_choix_base' => ': سومين مرحله',
249
-	'info_classement_1' => '<sup>ين</sup>در @liste@',
250
-	'info_classement_2' => '<sup>ين</sup>در@liste@',
251
-	'info_code_acces' => '! كد ها ى وردي تان را فراموش نكنيد',
252
-	'info_config_suivi' => 'اگر اين آدرس به فهرست ايميل ها mailing-list مربوط ميشود, ميتوانيد در زير آدرسى را كه شركت كنندگان سايت ميتوانند در آن ثبت نام كنند را مشخص كنيد. اين آدرس ميتواند يك  URL( مانند صفحه ثبت نام در فهرست) و يا ميتواند بدين صورت باشد : <tt>@adresse_suivi@?subject=subscribe</tt>):',
253
-	'info_config_suivi_explication' => ' شما ميتوانيد بطور خودكار بوسيله ايميل خبرهاى مربوط به فعاليت تحريريه سايت را دريافت كنيد. براى اين منظور شما بايد در فهرست ايميلها mailing-list ثبت نام كنيد.',
254
-	'info_confirmer_passe' => ':كلمه ورودى جديدتان را تأئيد كنيد',
255
-	'info_conflit_edition_avis_non_sauvegarde' => 'توجه: ميدان‌هاي بعدي از جاهاي ديگر اصلاح شده است. در نتيجه اصلاحات شما ثبت نشده است. ',
256
-	'info_conflit_edition_differences' => 'تفاوت‌ها:',
257
-	'info_conflit_edition_version_enregistree' => 'نسخه ثبت شده:',
258
-	'info_conflit_edition_votre_version' => 'نسخه شما:',
259
-	'info_connexion_base' => '<b>آزمايش ارتباط با پايگاه</b>',
260
-	'info_connexion_base_donnee' => 'اتصال با پايگاه داده‌هاي شما',
261
-	'info_connexion_ldap_ok' => '<b>ارتباط ال.دي.اي.پي موفقيت آميز است.</b><p> مي‌توانيد به مرحله بعد برويد.</p>',
262
-	'info_connexion_mysql' => 'ارتباط شما با SQL',
263
-	'info_connexion_ok' => '.ارتباط برقرار شد',
264
-	'info_contact' => 'تماس',
265
-	'info_contenu_articles' => 'محتوى مقاله ها',
266
-	'info_contributions' => 'مشاركت‌ها',
267
-	'info_creation_paragraphe' => 'براى درست كردن پاراگراف، كافيست كه خط  خالى ايجاد كنيد.',
268
-	'info_creation_rubrique' => 'پيش از نوشتن مقاله ,<br />شما بايد دست كم يك بخش درست كنيد <br />',
269
-	'info_creation_tables' => '<b>درست كردن جداول پايگاه</b>',
270
-	'info_creer_base' => 'يك داده پى جديد <b>بسازيد</b>:',
271
-	'info_dans_rubrique' => ':درون بخش',
272
-	'info_date_publication_anterieure' => 'تاريخ نگارش قبلى :',
273
-	'info_date_referencement' => ': تاريخ پيوند اين سايت',
274
-	'info_derniere_etape' => 'پايان !',
275
-	'info_descriptif' => ':توصيف',
276
-	'info_desinstaller_plugin' => 'داده ها را حذف و plugin را غیر فعال کنید',
277
-	'info_discussion_cours' => 'در حال بحث',
278
-	'info_ecrire_article' => 'پيش از نوشتن مقاله، شما ميبايد دست كم يك بخش درست كنيد.',
279
-	'info_email_envoi' => 'آدرس ايميل برای ارسال (اختياری)',
280
-	'info_email_envoi_txt' => 'آدرس مورد استفاده تان را برای ارسال ايميل در اينجا درج کنيد  (وگرنه از آدرس گيرنده استفاده خواهد شد)',
281
-	'info_email_webmestre' => 'آدرس ايميل وب مستر ',
282
-	'info_envoi_email_automatique' => 'ارسال نامه ها بطور خودكار',
283
-	'info_envoyer_maintenant' => 'الان بفرستيد',
284
-	'info_etape_suivante' => 'به مرحله بعدى برويد',
285
-	'info_etape_suivante_1' => 'شما ميتوانيد به مرحله بعدى برويد',
286
-	'info_etape_suivante_2' => 'شما ميتوانيد به مرحله بعدى برويد',
287
-	'info_exceptions_proxy' => 'استثناءها براي پراكسي',
288
-	'info_exportation_base' => 'صدور پايگاه به@archive@',
289
-	'info_facilite_suivi_activite' => 'براى آسان شدن مداوم فعاليت تحريريه، سيستم  ميتواند براى مثال، خبر درخواستهاى انتشار و اعتبار مقالات را به فهرست پيكهاى نويسند گان بفرستد', # MODIF
290
-	'info_fichiers_authent' => 'فايل هاى تأئيدى« .htpasswd »',
291
-	'info_forums_abo_invites' => 'سايتتان داراى سخنگاه براى مشتركين ميباشد: از بازديد كنندگان دعوت ميشود كه در قسمت همگانى سايت ثبت نام  كنند.',
292
-	'info_gauche_admin_tech' => '<b>اين صفحه فقط براى مسئولان سايت قابل دسترسى ميباشد.</b><p>  ورود به آن اجازه دسترسى به كاركردهاى گوناگون تعمير ونگهدارى فنى را ميدهد. از جمله روند باز شناسى و تأئيد ويژه اى كه لازمه اش داشتن حق ورود به تارنما است (FTP)',
293
-	'info_gauche_admin_vider' => '<b>اين صفحه فقط براى مسئولان سايت قابل دسترسى ميباشد.</b><p>  ورود به آن اجازه دسترسى به كاركرهاى گوناگون تعمير ونگهداى فنى را ميدهد. از جمله روند باز شناسى و تأئيد ويژه اى كه لازمه اش داشتن حق ورود به تارنما است (FTP)',
294
-	'info_gauche_auteurs' => 'شما نام تمام نگارند گان را در اينجا خواهيد يافت. نوع مسئوليتشان با رنگهاى ايكونها مشخص شده است (نگارنده=آيكون سبز، گردانند سايت=آيكون زرد )',
295
-	'info_gauche_auteurs_exterieurs' => 'نويسندگان بازديدكننده، بدون دسترسي به سايت، با علامت آبي مشخص شده‌اند؛ نويسندگان حذف شده با علامت خاكتسري. ',
296
-	'info_gauche_messagerie' => 'پيام گير بشما اجازه رد و بدل پيام را با ديگر نويسند گان، نگهدارى يادداشتها (براى استفاده شخصى ) همچنين اعلان خبر در صفحه پذيرش را (در صورتى كه از گردانند گان سايت باشيد )ميدهد.',
297
-	'info_gauche_statistiques_referers' => 'اين صفحه, فهرست سايتهاى مرجع را ارائه ميدهد، بعبارتى سايتهايى كه داراى پيوند با سايت شما هستند، (فقط براى ديروز و امروز) : در واقع اين فهرست هر ٢٤ ساعت يكبار نو ميشود',
298
-	'info_gauche_visiteurs_enregistres' => 'شما, در اينجا, همه بازديد كنند گان ثبت شده در قسمت همگانى را خواهيد يافت  (براى مشتركين).',
299
-	'info_generation_miniatures_images' => 'ساخت تصاوير كوچك شده',
300
-	'info_gerer_trad_objets' => '@objets@ :مديريت پيوند‌هاي ترجمه',
301
-	'info_hebergeur_desactiver_envoi_email' => 'تعدادى از ميزبانان ارسال خودكار نامه ها را از سرورهايشان غير فعال ميكنند. در اين صورت،  عملكردهاى بعدى اسپيپ  كار نخوهند كرد. ',
302
-	'info_hier' => ': ديروز',
303
-	'info_identification_publique' => '...شناسنامه شما',
304
-	'info_image_process' => 'خواهشمند است بهترين شيوه ساخت تصاوير كوچك را با كليك كردن بروي تصوير مربوطه انتخاب نماييد.',
305
-	'info_images_auto' => 'تصاوير بطور خودكار محاسبه شده اند',
306
-	'info_informations_personnelles' => 'اطلاعات شخصى',
307
-	'info_inscription' => 'ثبت شده در ',
308
-	'info_inscription_automatique' => 'ثبت نام خوكار نويسند گان جديد',
309
-	'info_jeu_caractere' => 'انتخاب نوع و شكل حروف سايت',
310
-	'info_jours' => 'روز',
311
-	'info_laisser_champs_vides' => 'اين قسمتها را خالى بگذاريد)',
312
-	'info_langues' => 'زبانهاى سايت',
313
-	'info_ldap_ok' => 'گواهى درستى LDAP مستقر شده',
314
-	'info_lien_hypertexte' => ': پيوند هايپرتكست',
315
-	'info_liste_nouveautes_envoyee' => 'فهرست تازه‌ها ارسال شده است',
316
-	'info_liste_redacteurs_connectes' => 'فهرست نويسنده گان روى خط',
317
-	'info_login_existant' => '.موجود ميباشد login اين',
318
-	'info_login_trop_court' => 'بيش از اندازه كوتاه Login .',
319
-	'info_login_trop_court_car_pluriel' => 'لاگين بايد دست كم @nb@ كاراكتر داشته باشد.',
320
-	'info_logos' => 'لوگوها',
321
-	'info_maximum' => ': حداكثر',
322
-	'info_meme_rubrique' => 'در همان بخش',
323
-	'info_message_en_redaction' => 'پيام هايتان در حال نگارش',
324
-	'info_message_technique' => ':پيام فنى',
325
-	'info_messagerie_interne' => 'پيام گير داخلى',
326
-	'info_mise_a_niveau_base' => 'تراز گذارى پايگاه SQL',
327
-	'info_mise_a_niveau_base_2' => '{{!توجه}}شما نسخه { قديمى} اسپيپ را نصب كرده ايد براى داده پى هايتان خطر  از بين رفتن وجود دارد و همچنين از كار افتاد گى سايتتان   .<br />{{فايلهاى اسپيپ را دوباره نصب كنيد}}',
328
-	'info_modification_enregistree' => 'تغييرها ثبت شد',
329
-	'info_modifier_auteur' => 'اصلاح نويسنده',
330
-	'info_modifier_rubrique' => ':اصلاح بخش ',
331
-	'info_modifier_titre' => '@titre@ : اصلاح       ',
332
-	'info_mon_site_spip' => 'SPIP سايت من',
333
-	'info_moyenne' => ': متوسط',
334
-	'info_multi_cet_article' => ' زبان اين مقاله :',
335
-	'info_multi_langues_choisies' => 'خواهشمند است كه زبانهاى موجود براى نويسند گان سايتتان را در زير انتخاب كنيد. زبانهاى از پيش استفاده شده نميتوانند غير فعال شوند.',
336
-	'info_multi_objets' => '@objets@ :فعال‌سازي منوي زبان',
337
-	'info_multi_secteurs' => '...تنها براى بخشهاى واقع در ريشه؟',
338
-	'info_nb_articles' => '@nb@ مقاله',
339
-	'info_nb_auteurs' => '@nb@ نويسنده',
340
-	'info_nb_messages' => '@nb@ پيام',
341
-	'info_nb_mots_cles' => '@nb@ كليدواژه',
342
-	'info_nb_rubriques' => '@nb@ بخش',
343
-	'info_nb_visiteurs' => '@nb@ بازديد‌كننده',
344
-	'info_nom' => 'نام',
345
-	'info_nom_destinataire' => 'نام گيرنده',
346
-	'info_nom_pas_conforme' => 'تگ‌هاي اچ.تي.ام.ال مجاز نيستند',
347
-	'info_nom_site' => 'نام سايتتان',
348
-	'info_nombre_articles' => 'مقاله @nb_articles@ ',
349
-	'info_nombre_rubriques' => 'بخش @nb_rubriques@ ',
350
-	'info_nombre_sites' => 'سايت @nb_sites@',
351
-	'info_non_deplacer' => '...جابجا نكنيد',
352
-	'info_non_envoi_annonce_dernieres_nouveautes' => 'اسپيپ ميتواند بطور منظم اخبار تازه هاى سايت را مانند مقاله ها، مقاله هاى كوتاه تازه منتشر شده و... را بفرستد ',
353
-	'info_non_envoi_liste_nouveautes' => 'فهرست تازه ها را نفرستيد',
354
-	'info_non_modifiable' => 'نميتواند اصلاح شود',
355
-	'info_non_suppression_mot_cle' => 'نميخواهم اين كليد-واژه را حذف كنم',
356
-	'info_notes' => 'يادداشت ',
357
-	'info_nouvel_article' => 'مقاله جديد',
358
-	'info_nouvelle_traduction' => 'برگردان جديد',
359
-	'info_numero_article' => ': مقاله شماره',
360
-	'info_obligatoire_02' => '(اجباري)', # MODIF
361
-	'info_option_accepter_visiteurs' => 'پذيرفتن ثبت نام بازديد كنندگان سايت همگانى',
362
-	'info_option_ne_pas_accepter_visiteurs' => 'رد ثبت نام بازديدكنندگان',
363
-	'info_options_avancees' => 'گزينش هاى پيشرفته',
364
-	'info_ou' => '...يا',
365
-	'info_page_interdite' => 'صفحه ممنوع',
366
-	'info_par_nom' => 'توسط نام',
367
-	'info_par_nombre_article' => 'توسط شمار مقالها',
368
-	'info_par_statut' => 'توسط نوع',
369
-	'info_par_tri' => '’(بترتيب@tri@)’',
370
-	'info_passe_trop_court' => 'كلمه ورود خيلى كوتاه',
371
-	'info_passe_trop_court_car_pluriel' => 'گذرواژه‌ دست كم بايد @nb@ كاراكتر داشته باشد.',
372
-	'info_passes_identiques' => 'دو كلمه ورود با هم يكسان نيستند',
373
-	'info_plus_cinq_car' => 'بيش از پنج حرف',
374
-	'info_plus_cinq_car_2' => '(بيش از پنج حرف)',
375
-	'info_plus_trois_car' => '(بيش از سه حرف)',
376
-	'info_popularite' => '@popularite@ : محبوبيت@visites@ : بازديد',
377
-	'info_post_scriptum' => 'نوشتار پس از متن اصلى',
378
-	'info_post_scriptum_2' => ':نوشتار پس از متن اصلى',
379
-	'info_pour' => 'براى',
380
-	'info_preview_texte' => 'اين امكان وجود دارد كه سايت را پيش از آماده شدن (پيش از پيشنهاد مقالات) بازبينى كرد مانند زمانيكه همه ى مقالات و اخبار منتشر شده اند.اين امكان ميتواند تنها براى گردانند گان سايت يا نويسندگان يا براى هيچكس نباشد.', # MODIF
381
-	'info_procedez_par_etape' => 'مرحله به مرحله اقدام كنيد',
382
-	'info_procedure_maj_version' => 'روند به روز كردن بايد به جريان بيفتد تا داده پى ها بتوانند با نسخه جديد منطبق شوند.',
383
-	'info_proxy_ok' => 'آزمایش پروکسی با موفقیت انجام شد.',
384
-	'info_ps' => 'P.-S.',
385
-	'info_publier' => 'منتشر کنید',
386
-	'info_publies' => 'مقاله هاى منتشر شده تان روى تارنما',
387
-	'info_question_accepter_visiteurs' => 'اگر اسكلت سايتتان ثبت شمار بازديدكنندگان  را بى آنكه اجازه ى ورود به قسمت خصوصى سايت را داشته باشند را  داراست خواهشمند است گزينه ى زير را فعال كنيد:',
388
-	'info_question_inscription_nouveaux_redacteurs' => 'آيا ثبت نام نويسند گان جديد را از سايت همگانى قبول ميكنيد؟ اگر ميكنيد، كاربران ميتوانند با پر كردن يك پرسشنامه ثبت نام كنند و به محوطه خصوصى راه يابند. آنها ميتوانند مقالاتشان را مطرح كنند <blockquote><i>در هنگام ثبت نام كاربران يك ايميل دريافت خواهند كرد كه شامل كد ورودي شان به سايت خصوصى خواهد بود. تعدادى از ميزبانان، ارسال ايميل را از سرورها غير فعال كرده اند: دراينصورت ثبت نام خودكار غير ممكن خواهد بود..</i></blockquote>',
389
-	'info_qui_edite' => '@nom_auteur_modif@ روي اين مطلب @date_diff@ كار كرده است.',
390
-	'info_racine_site' => 'ريشه سايت',
391
-	'info_recharger_page' => 'خواهشمند است اين صفحه را تا چند لحظه بعد دوباره شارژ كنيد',
392
-	'info_recherche_auteur_zero' => '"@cherche_auteur@" : جستجوى بدون نتيجه براى',
393
-	'info_recommencer' => '.خواهشمند است دوباره شروع كنيد',
394
-	'info_redacteur_1' => 'نويسنده',
395
-	'info_redacteur_2' => 'به بخش خصوصى دسترسى دارد(<i>توصيه ميشود</i>)',
396
-	'info_redacteurs' => 'نويسندگان',
397
-	'info_redaction_en_cours' => 'در حال نگارش',
398
-	'info_redirection' => 'هدايت دوباره آدرس ',
399
-	'info_redirection_activee' => 'باز سو دهي فعال است. ',
400
-	'info_redirection_desactivee' => 'باز سو دهي حذف شده. ',
401
-	'info_refuses' => 'مقاله هايتان كه پذيرفته نشده اند',
402
-	'info_reglage_ldap' => ' گزينش :<b> تنظيم ورود LDAP</b>',
403
-	'info_renvoi_article' => 'تغییر محل. اين مقاله به این صفحه برمیگردد:',
404
-	'info_reserve_admin' => 'تنها گردانندگان سايت حق اصلاح اين آدرس را دارند',
405
-	'info_restreindre_rubrique' => ':محدوديت در اداره بخش',
406
-	'info_resultat_recherche' => ':نتيجه جستجو',
407
-	'info_rubriques' => 'بخش ها',
408
-	'info_rubriques_02' => 'بخش ها',
409
-	'info_rubriques_trouvees' => 'بخش هاى پيدا شده',
410
-	'info_sans_titre' => 'بدون عنوان',
411
-	'info_selection_chemin_acces' => '<b>انتخاب كنيد</b> راه ورودى را در راهنما',
412
-	'info_signatures' => 'امضاء',
413
-	'info_site' => 'سايت',
414
-	'info_site_2' => ':سايت',
415
-	'info_site_min' => 'سايت',
416
-	'info_site_reference_2' => 'سايت مرجع',
417
-	'info_site_web' => 'وب سايت:',
418
-	'info_sites' => 'سايت',
419
-	'info_sites_lies_mot' => 'سايتهاى پيوندى مربوط به اين واژه-كليد',
420
-	'info_sites_proxy' => 'از پروكسى استفاده كنيد',
421
-	'info_sites_trouves' => 'سايت هاى پيدا شده',
422
-	'info_sous_titre' => ':عنوان فرعى',
423
-	'info_statut_administrateur' => 'گرداننده سايت',
424
-	'info_statut_auteur' => 'وضعيت اين نويسنده:',
425
-	'info_statut_auteur_2' => 'من هستم',
426
-	'info_statut_auteur_a_confirmer' => 'ثبت نام تائید شود',
427
-	'info_statut_auteur_autre' => 'وضعیت دیگر:',
428
-	'info_statut_redacteur' => 'نويسنده',
429
-	'info_statut_utilisateurs_1' => 'وضعيت كاربران ورودى',
430
-	'info_statut_utilisateurs_2' => 'وضعيت اشخاص حاضر در راهنماى ال دى ا پى را كه براى اولين بار به سايت ميپيوندند مشخص كنيد. شما ميتوانيد پس از آن  براى هر نويسنده آنرا مورد به مورد اصلاح كنيد',
431
-	'info_suivi_activite' => 'دنباله سر مقاله',
432
-	'info_surtitre' => ':سر عنوان',
433
-	'info_syndication_integrale_1' => 'سایتتان فایلهای syndication را پیشنهاد میکند (voir « <a href="@url@">@titre@</a> »). ',
434
-	'info_syndication_integrale_2' => 'آیا مایلید که مقاله ها را بطور کامل یا فقط خلاصه ای از آنها را بفرستید؟',
435
-	'info_table_prefix' => 'شما میتوانید پیشوند نام جدولهای داده ها را اصلاح کنید زیرا هنگامیکه از یک داده پی برای چند سایت استفاده میکنید اینکار اجباری است. پیشوند باید با حروف کوچک بدون اکسان و بی فاصله باشد.',
436
-	'info_taille_maximale_images' => 'اسپيپ برش‌ بالاتر تصاوير را كه مي‌تواند نشان دهد(در ميليون‌ها پيكشل) آزمايش مي‌كند. <br /> تصاوير بزرگتر كاهش نمي‌يابند.',
437
-	'info_taille_maximale_vignette' => 'حد اكثر اندازه براى توليد تصاوير كوچك توسط سيستم',
438
-	'info_terminer_installation' => 'شما اكنون ميتوانيد روند استقرار برنامه را پايان دهيد.',
439
-	'info_texte' => 'متن',
440
-	'info_texte_explicatif' => 'متن توضيحى',
441
-	'info_texte_long' => 'متن بيش از اندازه بلند ميباشد : در ابتدا به چند قسمت تقسيم و پس از تائيد، قطعات به هم متصل خواهند شد.',
442
-	'info_texte_message' => 'متن پيام شما',
443
-	'info_texte_message_02' => 'متن پيام',
444
-	'info_titre' => ':عنوان',
445
-	'info_total' => ':كل',
446
-	'info_tous_articles_en_redaction' => 'تمام مقالات در حال نگارش',
447
-	'info_tous_articles_presents' => 'تمام مقالات منتشر شده در اين بخش',
448
-	'info_tous_articles_refuses' => 'تمام مقالات رد شده',
449
-	'info_tous_les' => 'تمام :',
450
-	'info_tout_site' => 'همه سايت',
451
-	'info_tout_site2' => 'مقاله به اين زبان ترجمه نشده.',
452
-	'info_tout_site3' => 'مقاله به اين زبان ترجمه شده,  سپس تغييراتى در مقاله ى اصلى صورت گرفته, بدين جهت بايد برگردان آنرا بروز كرد.',
453
-	'info_tout_site4' => 'مقاله به اين زبان ترجمه و برگردان آن بروز شده.',
454
-	'info_tout_site5' => 'مقاله ى اصلى',
455
-	'info_tout_site6' => ' :<b>توجه<b/> تنها مقالات اصلى اعلان ميشوند و برگردانهايشان با رنگهايى كه گوياى وضعيت آنهاست به آنها متصلند.',
456
-	'info_traductions' => 'ترجمه‌ها',
457
-	'info_travail_colaboratif' => 'مقالات حاصل كار دست جمعى',
458
-	'info_un_article' => 'يك مقاله',
459
-	'info_un_site' => ',يك سايت',
460
-	'info_une_rubrique' => ',يك بخش',
461
-	'info_une_rubrique_02' => '١ بخش',
462
-	'info_url' => ':URL',
463
-	'info_url_proxy' => 'پراكسي URL',
464
-	'info_url_site_pas_conforme' => 'يو.آر.ال سايت معتبر نيست. ',
465
-	'info_url_test_proxy' => 'تست URL',
466
-	'info_urlref' => 'پيوند هايپرتکست:',
467
-	'info_utilisation_spip' => 'شما اكنون ميتوانيد از سيستم انتشار حضورى استفاده كنيد',
468
-	'info_visites_par_mois' => ':نمودار ماهانه',
469
-	'info_visiteur_1' => 'بازديد كننده',
470
-	'info_visiteur_2' => 'سايت همگانى',
471
-	'info_visiteurs' => 'بازديد كنندگان',
472
-	'info_visiteurs_02' => 'بازديد كنندگان سايت همگانى',
473
-	'info_webmestre_forces' => 'وب مستر‌ها در حال حاضر در <  tt>@file_options@</tt تعريف مي‌شوند.',
474
-	'install_adresse_base_hebergeur' => 'آدرس داده ها که توسط میزبان وب اعطا شده',
475
-	'install_connect_ok' => 'پايگاه داده‌هاي جديد اعلام كرده از سرور با نام @connect@استفاده مي‌كند. ',
476
-	'install_echec_annonce' => 'نصب احتمالا موفق آميز نخواهد بود يا به يك سايت غير كاربردى خاتمه ميابد...',
477
-	'install_extension_php_obligatoire' => 'اسپيپ به فايلهاى php نياز دارد:',
478
-	'install_login_base_hebergeur' => 'Login ورودی به سایت که توسط میزبان وب داده شده',
479
-	'install_nom_base_hebergeur' => 'نام پایگاه داده ها که توسط میزبان وب داده شده:',
480
-	'install_pas_table' => 'پايگاه عملاً بدون جدول‌ها',
481
-	'install_pass_base_hebergeur' => 'کد ورودی به سایت که توسط میزبان وب داده شده',
482
-	'install_php_version' => 'نسخه @version@ PHP ناکافیست  دستکم= @minimum@',
483
-	'install_select_langue' => 'يك زبان را انتخاب كنيد سپس روى دكمه "بعدى" كليك كنيد، روند استقرار برنامه بكار خواهد افتاد',
484
-	'install_select_type_db' => 'نوع پايگاه داده‌ها را تعيين كردن',
485
-	'install_select_type_mysql' => 'MySQL',
486
-	'install_select_type_pg' => 'PostgreSQL',
487
-	'install_select_type_sqlite2' => 'SQLite 2',
488
-	'install_select_type_sqlite3' => 'SQLite 3',
489
-	'install_serveur_hebergeur' => 'Serveur de base de données attribué par l’hébergeur ',
490
-	'install_table_prefix_hebergeur' => 'پیشوند جدولها که توسط میزبان وب داده شده:',
491
-	'install_tables_base' => 'جدول‌هاي پايگاه',
492
-	'install_types_db_connus' => 'اسپيپ مي‌تواند<b>MySQL</b> (رايج‌تر)و <b>SQLite</b> را استفاده كند.',
493
-	'install_types_db_connus_avertissement' => 'حمايت از <b>PostgreSQL</b> عملاً به صورت تجربي پيشنهاد شده است.',
494
-	'instituer_erreur_statut_a_change' => 'وضعيت همين الأن اصلاح شده',
495
-	'instituer_erreur_statut_non_autorise' => 'نمي‌توانيد اين وضعيت را انتخاب كنيد',
496
-	'intem_redacteur' => 'نويسنده',
497
-	'intitule_licence' => 'مجوز',
498
-	'item_accepter_inscriptions' => 'ثبت نامها را بپذيريد',
499
-	'item_activer_messages_avertissement' => 'پيامهاى اخطار را فعال كنيد',
500
-	'item_administrateur_2' => 'گرداننده سايت',
501
-	'item_afficher_calendrier' => 'در بخش تقويم نمايش دهيد',
502
-	'item_autoriser_syndication_integrale' => 'پخش کامل مقاله ها در فایل های syndication',
503
-	'item_choix_administrateurs' => 'گردانندگان سايت',
504
-	'item_choix_generation_miniature' => '.تصاوير كوچك را بطور خودكار بسازيد',
505
-	'item_choix_non_generation_miniature' => '.تصاوير كوچك را بطور خودكار نسازيد',
506
-	'item_choix_redacteurs' => 'نويسندگان',
507
-	'item_choix_visiteurs' => 'بازديد كنندگان سايت همگانى',
508
-	'item_creer_fichiers_authent' => '.htpasswd : از اين فايلها بسازيد',
509
-	'item_login' => 'Login',
510
-	'item_messagerie_agenda' => 'فعال سازي سامانه‌ي پيام‌دهي و تقويم',
511
-	'item_mots_cles_association_articles' => 'به مقالات',
512
-	'item_mots_cles_association_rubriques' => 'به بخشها ',
513
-	'item_mots_cles_association_sites' => 'به سايتهاى مرجع يا پيوندى',
514
-	'item_non' => 'خير',
515
-	'item_non_accepter_inscriptions' => 'ثبت نامها را نپذيريد',
516
-	'item_non_activer_messages_avertissement' => 'بدون پيام اخطار',
517
-	'item_non_afficher_calendrier' => 'در تقويم نيايد',
518
-	'item_non_autoriser_syndication_integrale' => 'تنها خلاصه ی آنرا منتشر کنید',
519
-	'item_non_creer_fichiers_authent' => 'اين فايلها را درست نكنيد',
520
-	'item_non_messagerie_agenda' => 'غيرفعال سازي سامانه‌ي پيام‌دهي و تقويم',
521
-	'item_non_publier_articles' => 'مقالات را پيش از تعيين تاريخ قطعى انتشار منتشر نكنيد',
522
-	'item_nouvel_auteur' => 'نويسنده جديد',
523
-	'item_nouvelle_rubrique' => 'بخش جديد',
524
-	'item_oui' => 'آرى',
525
-	'item_publier_articles' => '.مقالات را عليرغم تاريخ نشرشان منتشر كنيد',
526
-	'item_reponse_article' => 'پاسخ به مقاله',
527
-	'item_visiteur' => 'بازديد كننده',
148
+    // I
149
+    'ical_info1' => 'اين صفحه شيوه هاى گوناگونى را براى آگاهى از مسايل روزانه سايت معرفى ميكند.',
150
+    'ical_info2' => 'براى آگاهى بيشتر از جزييات فنى به, <a href="@spipnet@">اسناد اسپيپ </a> مراجعه كنيد.',
151
+    'ical_info_calendrier' => '٢ روزشمار در دسترس شما ميباشد.  روزشمار اول وضعيت سايت را همراه با خبرهاى مربوط به مقالات منتشره نشان ميدهد. روزشمار دوم حاوى مقالات تحريريه و آخرين پيامهاى خصوصى شما كه بواسطه يك كد شخصى تنها در درسترس شما ميباشد است. شما ميتوانيد آنرا در هر زمانى كه مايل باشيد تغيير دهيد. ',
152
+    'ical_methode_http' => 'بارگذارى',
153
+    'ical_methode_webcal' => 'مقارن كردن (webcal://)',
154
+    'ical_texte_prive' => 'اين روزشمار شما را در جريان فعاليتهاى تحريريه ويژه سايت ميگذارد (كار, ملاقات هاى شخصى,  مقالات ...). ',
155
+    'ical_texte_public' => 'اين روزشمار بشما امكان پيگيرى فعاليت هاى همگانى سايت را ميدهد (مقالات,...). ',
156
+    'ical_texte_rss' => ' شما ميتوانيد تازه هاى اين سايت را با فايلهاى XML/RSS (Rich Site Summary)  بديگر سايتها پيوند دهيد.همچنين اين نوع فايل به اسپيپ امكان خواندن تازه هاى ديگر سايتها را ميدهد.',
157
+    'ical_titre_js' => 'جاوا اسكريپت',
158
+    'ical_titre_mailing' => 'ليست ايميلها',
159
+    'ical_titre_rss' => ' فايل syndication',
160
+    'icone_accueil' => 'خانه',
161
+    'icone_activer_cookie' => 'كوكى مكاتبه را فعال كنيد',
162
+    'icone_activite' => 'بازخورد',
163
+    'icone_admin_plugin' => 'اداره ی plugins',
164
+    'icone_administration' => 'نگه‌داري',
165
+    'icone_afficher_auteurs' => 'فهرست نويسند گان را بروى صفحه نشان دهيد ',
166
+    'icone_afficher_visiteurs' => ' فهرست بازديدكنند گان را بروى صفحه نشان دهيد ',
167
+    'icone_arret_discussion' => 'ديگر در اين بحث شركت نكنيد',
168
+    'icone_calendrier' => 'تقويم',
169
+    'icone_configuration' => 'پيكربندي',
170
+    'icone_creer_auteur' => 'يك نويسنده جديد اضافه و به اين مقاله مرتبطش كنيد',
171
+    'icone_creer_mot_cle' => 'يك كليد-واژه نو بسازيد و به اين مقاله مرتبطش كنيد',
172
+    'icone_creer_rubrique_2' => 'يك بخش جديد بسازيد',
173
+    'icone_edition' => 'ويرايش',
174
+    'icone_ma_langue' => 'زبان من',
175
+    'icone_mes_infos' => 'اطلاعات من',
176
+    'icone_mes_preferences' => 'ترجيح‌هاي من',
177
+    'icone_modifier_article' => 'اين مقاله را اصلاح كنيد',
178
+    'icone_modifier_rubrique' => 'اين بخش را اصلاح كنيد',
179
+    'icone_publication' => 'انتشار',
180
+    'icone_relancer_signataire' => 'بازنشر امضاء',
181
+    'icone_retour' => 'بازگشت',
182
+    'icone_retour_article' => 'بازگشت به مقاله',
183
+    'icone_squelette' => 'اسكلت',
184
+    'icone_suivi_publication' => 'پيگيري انتشارات',
185
+    'icone_supprimer_cookie' => 'كوكى مكاتبه را حذف كنيد',
186
+    'icone_supprimer_rubrique' => 'اين بخش را حذف كنيد',
187
+    'icone_supprimer_signature' => 'اين امضاء را حذف كنيد',
188
+    'icone_valider_signature' => 'اين امضاء را معتبر كنيد',
189
+    'image_administrer_rubrique' => 'شما ميتوانيد اين بخش را اداره كنيد',
190
+    'impossible_modifier_login_auteur' => 'تغيير لاگين ممكن نيست.', # MODIF
191
+    'impossible_modifier_pass_auteur' => 'تغيير گذرواژه ممكن نيست.', # MODIF
192
+    'info_1_article' => '١ مقاله',
193
+    'info_1_auteur' => 'نويسنده‌ي 1',
194
+    'info_1_message' => 'پيام 1',
195
+    'info_1_mot_cle' => 'كليدواژه‌ي 1',
196
+    'info_1_rubrique' => 'بخش 1',
197
+    'info_1_visiteur' => 'بازديد‌كننده‌ي 1',
198
+    'info_activer_cookie' => ' شما ميتوانيد  كوكى مكاتبه  را فعال نماپيد اينكار به شما اجازه خواهد داد كه براحتى از سايت همگانى به سايت خصوصى برويد',
199
+    'info_admin_etre_webmestre' => 'دادن حق وب مستر به من',
200
+    'info_admin_je_suis_webmestre' => 'من <b>webmestre</b> هستم',
201
+    'info_admin_statuer_webmestre' => 'تفويض حق وب مستري به اين مدير',
202
+    'info_admin_webmestre' => 'اين مدير <b>webmestre</b> است',
203
+    'info_administrateur' => 'گردانند سايت',
204
+    'info_administrateur_1' => 'گرداننده  ',
205
+    'info_administrateur_2' => '(<i>با احتياط استفاده كنيد </i>) سايت ',
206
+    'info_administrateur_site_01' => 'اگر شما از گردانند گان سايت هستيد، خواهشمند است',
207
+    'info_administrateur_site_02' => 'روى اين پيوند كليك كنيد',
208
+    'info_administrateurs' => 'گردانند گان سايت',
209
+    'info_administrer_rubrique' => 'شما ميتوانيد اين بخش را اداره كنيد',
210
+    'info_adresse' => ': به آدرس',
211
+    'info_adresse_desinscription' => 'نساني قطع آبونمان: ',
212
+    'info_adresse_url' => '(URL) آدرس سايت همگانى      ',
213
+    'info_afficher_par_nb' => 'نشان دادن با',
214
+    'info_aide_en_ligne' => 'SPIP كمك در تارنما',
215
+    'info_ajout_image' => '  هنگامى كه تصاويرى را ضميمه مقاله اى ميكنيد، اسپيپ ميتواند بطور خودكار آنها را بصورت كوچك شده اضافه كند. با اين روش ميتوان براى مثال نمايى از مجموع تصاوير را بطور خودكار درست كرد ',
216
+    'info_ajouter_rubrique' => 'يك بخش ديگر را براى اداه كردن اضافه كنيد',
217
+    'info_annonce_nouveautes' => 'خبر تازه ها',
218
+    'info_article' => 'مقاله',
219
+    'info_article_2' => 'مقاله',
220
+    'info_article_a_paraitre' => 'مقالات با تاريخ آينده منتشر شوند',
221
+    'info_articles_02' => 'مقالات',
222
+    'info_articles_2' => 'مقالات',
223
+    'info_articles_auteur' => 'مقالات اين نويسنده',
224
+    'info_articles_miens' => 'مقالات من',
225
+    'info_articles_tous' => 'تمام مقاله‌ها',
226
+    'info_articles_trouves' => 'مقالات پيدا شده',
227
+    'info_attente_validation' => 'مقاله هايتان در انتظار تأئيد شدن',
228
+    'info_aucun_article' => 'مقاله‌اي نيست',
229
+    'info_aucun_auteur' => 'هيچ مؤلفي موجود نيست',
230
+    'info_aucun_message' => 'هيچ پيامي موجود نيست',
231
+    'info_aucun_rubrique' => 'هيچ بخش',
232
+    'info_aujourdhui' => ': امروز',
233
+    'info_auteur_gere_toutes_rubriques_2' => 'من <b> تمام بخش‌ها را اداره مي‌كنم</b>', # MODIF
234
+    'info_auteurs' => 'نويسندگان ',
235
+    'info_auteurs_par_tri' => '@partri@ نويسنده گان',
236
+    'info_auteurs_trouves' => 'نويسنده گان پيدا شده   ',
237
+    'info_authentification_externe' => 'تأئيد از خارج',
238
+    'info_avertissement' => 'تذكر',
239
+    'info_barre_outils' => 'با ميل ابزار آن؟',
240
+    'info_base_installee' => '.ساختار داده پى هايتان نصب شده',
241
+    'info_bio' => 'زندگي‌نامه',
242
+    'info_cache_desactive' => 'حفاظه پنهان موقتاً غيرفعال است.',
243
+    'info_chapeau' => 'سر متن',
244
+    'info_chapeau_2' => ':سر متن',
245
+    'info_chemin_acces_1' => 'گزینش: <b>مسير ورود به راهنما</b>',
246
+    'info_chemin_acces_2' => 'شما بايد پس از اين مسير دسترسى به اطلاعات را در راهنما تنظيم كنيد. اين اطلاعات براى شناسائى كاربرانى كه در راهنما هستند ضرورى ميباشد',
247
+    'info_chemin_acces_annuaire' => 'گزینش : <b>مسير ورود به راهنما',
248
+    'info_choix_base' => ': سومين مرحله',
249
+    'info_classement_1' => '<sup>ين</sup>در @liste@',
250
+    'info_classement_2' => '<sup>ين</sup>در@liste@',
251
+    'info_code_acces' => '! كد ها ى وردي تان را فراموش نكنيد',
252
+    'info_config_suivi' => 'اگر اين آدرس به فهرست ايميل ها mailing-list مربوط ميشود, ميتوانيد در زير آدرسى را كه شركت كنندگان سايت ميتوانند در آن ثبت نام كنند را مشخص كنيد. اين آدرس ميتواند يك  URL( مانند صفحه ثبت نام در فهرست) و يا ميتواند بدين صورت باشد : <tt>@adresse_suivi@?subject=subscribe</tt>):',
253
+    'info_config_suivi_explication' => ' شما ميتوانيد بطور خودكار بوسيله ايميل خبرهاى مربوط به فعاليت تحريريه سايت را دريافت كنيد. براى اين منظور شما بايد در فهرست ايميلها mailing-list ثبت نام كنيد.',
254
+    'info_confirmer_passe' => ':كلمه ورودى جديدتان را تأئيد كنيد',
255
+    'info_conflit_edition_avis_non_sauvegarde' => 'توجه: ميدان‌هاي بعدي از جاهاي ديگر اصلاح شده است. در نتيجه اصلاحات شما ثبت نشده است. ',
256
+    'info_conflit_edition_differences' => 'تفاوت‌ها:',
257
+    'info_conflit_edition_version_enregistree' => 'نسخه ثبت شده:',
258
+    'info_conflit_edition_votre_version' => 'نسخه شما:',
259
+    'info_connexion_base' => '<b>آزمايش ارتباط با پايگاه</b>',
260
+    'info_connexion_base_donnee' => 'اتصال با پايگاه داده‌هاي شما',
261
+    'info_connexion_ldap_ok' => '<b>ارتباط ال.دي.اي.پي موفقيت آميز است.</b><p> مي‌توانيد به مرحله بعد برويد.</p>',
262
+    'info_connexion_mysql' => 'ارتباط شما با SQL',
263
+    'info_connexion_ok' => '.ارتباط برقرار شد',
264
+    'info_contact' => 'تماس',
265
+    'info_contenu_articles' => 'محتوى مقاله ها',
266
+    'info_contributions' => 'مشاركت‌ها',
267
+    'info_creation_paragraphe' => 'براى درست كردن پاراگراف، كافيست كه خط  خالى ايجاد كنيد.',
268
+    'info_creation_rubrique' => 'پيش از نوشتن مقاله ,<br />شما بايد دست كم يك بخش درست كنيد <br />',
269
+    'info_creation_tables' => '<b>درست كردن جداول پايگاه</b>',
270
+    'info_creer_base' => 'يك داده پى جديد <b>بسازيد</b>:',
271
+    'info_dans_rubrique' => ':درون بخش',
272
+    'info_date_publication_anterieure' => 'تاريخ نگارش قبلى :',
273
+    'info_date_referencement' => ': تاريخ پيوند اين سايت',
274
+    'info_derniere_etape' => 'پايان !',
275
+    'info_descriptif' => ':توصيف',
276
+    'info_desinstaller_plugin' => 'داده ها را حذف و plugin را غیر فعال کنید',
277
+    'info_discussion_cours' => 'در حال بحث',
278
+    'info_ecrire_article' => 'پيش از نوشتن مقاله، شما ميبايد دست كم يك بخش درست كنيد.',
279
+    'info_email_envoi' => 'آدرس ايميل برای ارسال (اختياری)',
280
+    'info_email_envoi_txt' => 'آدرس مورد استفاده تان را برای ارسال ايميل در اينجا درج کنيد  (وگرنه از آدرس گيرنده استفاده خواهد شد)',
281
+    'info_email_webmestre' => 'آدرس ايميل وب مستر ',
282
+    'info_envoi_email_automatique' => 'ارسال نامه ها بطور خودكار',
283
+    'info_envoyer_maintenant' => 'الان بفرستيد',
284
+    'info_etape_suivante' => 'به مرحله بعدى برويد',
285
+    'info_etape_suivante_1' => 'شما ميتوانيد به مرحله بعدى برويد',
286
+    'info_etape_suivante_2' => 'شما ميتوانيد به مرحله بعدى برويد',
287
+    'info_exceptions_proxy' => 'استثناءها براي پراكسي',
288
+    'info_exportation_base' => 'صدور پايگاه به@archive@',
289
+    'info_facilite_suivi_activite' => 'براى آسان شدن مداوم فعاليت تحريريه، سيستم  ميتواند براى مثال، خبر درخواستهاى انتشار و اعتبار مقالات را به فهرست پيكهاى نويسند گان بفرستد', # MODIF
290
+    'info_fichiers_authent' => 'فايل هاى تأئيدى« .htpasswd »',
291
+    'info_forums_abo_invites' => 'سايتتان داراى سخنگاه براى مشتركين ميباشد: از بازديد كنندگان دعوت ميشود كه در قسمت همگانى سايت ثبت نام  كنند.',
292
+    'info_gauche_admin_tech' => '<b>اين صفحه فقط براى مسئولان سايت قابل دسترسى ميباشد.</b><p>  ورود به آن اجازه دسترسى به كاركردهاى گوناگون تعمير ونگهدارى فنى را ميدهد. از جمله روند باز شناسى و تأئيد ويژه اى كه لازمه اش داشتن حق ورود به تارنما است (FTP)',
293
+    'info_gauche_admin_vider' => '<b>اين صفحه فقط براى مسئولان سايت قابل دسترسى ميباشد.</b><p>  ورود به آن اجازه دسترسى به كاركرهاى گوناگون تعمير ونگهداى فنى را ميدهد. از جمله روند باز شناسى و تأئيد ويژه اى كه لازمه اش داشتن حق ورود به تارنما است (FTP)',
294
+    'info_gauche_auteurs' => 'شما نام تمام نگارند گان را در اينجا خواهيد يافت. نوع مسئوليتشان با رنگهاى ايكونها مشخص شده است (نگارنده=آيكون سبز، گردانند سايت=آيكون زرد )',
295
+    'info_gauche_auteurs_exterieurs' => 'نويسندگان بازديدكننده، بدون دسترسي به سايت، با علامت آبي مشخص شده‌اند؛ نويسندگان حذف شده با علامت خاكتسري. ',
296
+    'info_gauche_messagerie' => 'پيام گير بشما اجازه رد و بدل پيام را با ديگر نويسند گان، نگهدارى يادداشتها (براى استفاده شخصى ) همچنين اعلان خبر در صفحه پذيرش را (در صورتى كه از گردانند گان سايت باشيد )ميدهد.',
297
+    'info_gauche_statistiques_referers' => 'اين صفحه, فهرست سايتهاى مرجع را ارائه ميدهد، بعبارتى سايتهايى كه داراى پيوند با سايت شما هستند، (فقط براى ديروز و امروز) : در واقع اين فهرست هر ٢٤ ساعت يكبار نو ميشود',
298
+    'info_gauche_visiteurs_enregistres' => 'شما, در اينجا, همه بازديد كنند گان ثبت شده در قسمت همگانى را خواهيد يافت  (براى مشتركين).',
299
+    'info_generation_miniatures_images' => 'ساخت تصاوير كوچك شده',
300
+    'info_gerer_trad_objets' => '@objets@ :مديريت پيوند‌هاي ترجمه',
301
+    'info_hebergeur_desactiver_envoi_email' => 'تعدادى از ميزبانان ارسال خودكار نامه ها را از سرورهايشان غير فعال ميكنند. در اين صورت،  عملكردهاى بعدى اسپيپ  كار نخوهند كرد. ',
302
+    'info_hier' => ': ديروز',
303
+    'info_identification_publique' => '...شناسنامه شما',
304
+    'info_image_process' => 'خواهشمند است بهترين شيوه ساخت تصاوير كوچك را با كليك كردن بروي تصوير مربوطه انتخاب نماييد.',
305
+    'info_images_auto' => 'تصاوير بطور خودكار محاسبه شده اند',
306
+    'info_informations_personnelles' => 'اطلاعات شخصى',
307
+    'info_inscription' => 'ثبت شده در ',
308
+    'info_inscription_automatique' => 'ثبت نام خوكار نويسند گان جديد',
309
+    'info_jeu_caractere' => 'انتخاب نوع و شكل حروف سايت',
310
+    'info_jours' => 'روز',
311
+    'info_laisser_champs_vides' => 'اين قسمتها را خالى بگذاريد)',
312
+    'info_langues' => 'زبانهاى سايت',
313
+    'info_ldap_ok' => 'گواهى درستى LDAP مستقر شده',
314
+    'info_lien_hypertexte' => ': پيوند هايپرتكست',
315
+    'info_liste_nouveautes_envoyee' => 'فهرست تازه‌ها ارسال شده است',
316
+    'info_liste_redacteurs_connectes' => 'فهرست نويسنده گان روى خط',
317
+    'info_login_existant' => '.موجود ميباشد login اين',
318
+    'info_login_trop_court' => 'بيش از اندازه كوتاه Login .',
319
+    'info_login_trop_court_car_pluriel' => 'لاگين بايد دست كم @nb@ كاراكتر داشته باشد.',
320
+    'info_logos' => 'لوگوها',
321
+    'info_maximum' => ': حداكثر',
322
+    'info_meme_rubrique' => 'در همان بخش',
323
+    'info_message_en_redaction' => 'پيام هايتان در حال نگارش',
324
+    'info_message_technique' => ':پيام فنى',
325
+    'info_messagerie_interne' => 'پيام گير داخلى',
326
+    'info_mise_a_niveau_base' => 'تراز گذارى پايگاه SQL',
327
+    'info_mise_a_niveau_base_2' => '{{!توجه}}شما نسخه { قديمى} اسپيپ را نصب كرده ايد براى داده پى هايتان خطر  از بين رفتن وجود دارد و همچنين از كار افتاد گى سايتتان   .<br />{{فايلهاى اسپيپ را دوباره نصب كنيد}}',
328
+    'info_modification_enregistree' => 'تغييرها ثبت شد',
329
+    'info_modifier_auteur' => 'اصلاح نويسنده',
330
+    'info_modifier_rubrique' => ':اصلاح بخش ',
331
+    'info_modifier_titre' => '@titre@ : اصلاح       ',
332
+    'info_mon_site_spip' => 'SPIP سايت من',
333
+    'info_moyenne' => ': متوسط',
334
+    'info_multi_cet_article' => ' زبان اين مقاله :',
335
+    'info_multi_langues_choisies' => 'خواهشمند است كه زبانهاى موجود براى نويسند گان سايتتان را در زير انتخاب كنيد. زبانهاى از پيش استفاده شده نميتوانند غير فعال شوند.',
336
+    'info_multi_objets' => '@objets@ :فعال‌سازي منوي زبان',
337
+    'info_multi_secteurs' => '...تنها براى بخشهاى واقع در ريشه؟',
338
+    'info_nb_articles' => '@nb@ مقاله',
339
+    'info_nb_auteurs' => '@nb@ نويسنده',
340
+    'info_nb_messages' => '@nb@ پيام',
341
+    'info_nb_mots_cles' => '@nb@ كليدواژه',
342
+    'info_nb_rubriques' => '@nb@ بخش',
343
+    'info_nb_visiteurs' => '@nb@ بازديد‌كننده',
344
+    'info_nom' => 'نام',
345
+    'info_nom_destinataire' => 'نام گيرنده',
346
+    'info_nom_pas_conforme' => 'تگ‌هاي اچ.تي.ام.ال مجاز نيستند',
347
+    'info_nom_site' => 'نام سايتتان',
348
+    'info_nombre_articles' => 'مقاله @nb_articles@ ',
349
+    'info_nombre_rubriques' => 'بخش @nb_rubriques@ ',
350
+    'info_nombre_sites' => 'سايت @nb_sites@',
351
+    'info_non_deplacer' => '...جابجا نكنيد',
352
+    'info_non_envoi_annonce_dernieres_nouveautes' => 'اسپيپ ميتواند بطور منظم اخبار تازه هاى سايت را مانند مقاله ها، مقاله هاى كوتاه تازه منتشر شده و... را بفرستد ',
353
+    'info_non_envoi_liste_nouveautes' => 'فهرست تازه ها را نفرستيد',
354
+    'info_non_modifiable' => 'نميتواند اصلاح شود',
355
+    'info_non_suppression_mot_cle' => 'نميخواهم اين كليد-واژه را حذف كنم',
356
+    'info_notes' => 'يادداشت ',
357
+    'info_nouvel_article' => 'مقاله جديد',
358
+    'info_nouvelle_traduction' => 'برگردان جديد',
359
+    'info_numero_article' => ': مقاله شماره',
360
+    'info_obligatoire_02' => '(اجباري)', # MODIF
361
+    'info_option_accepter_visiteurs' => 'پذيرفتن ثبت نام بازديد كنندگان سايت همگانى',
362
+    'info_option_ne_pas_accepter_visiteurs' => 'رد ثبت نام بازديدكنندگان',
363
+    'info_options_avancees' => 'گزينش هاى پيشرفته',
364
+    'info_ou' => '...يا',
365
+    'info_page_interdite' => 'صفحه ممنوع',
366
+    'info_par_nom' => 'توسط نام',
367
+    'info_par_nombre_article' => 'توسط شمار مقالها',
368
+    'info_par_statut' => 'توسط نوع',
369
+    'info_par_tri' => '’(بترتيب@tri@)’',
370
+    'info_passe_trop_court' => 'كلمه ورود خيلى كوتاه',
371
+    'info_passe_trop_court_car_pluriel' => 'گذرواژه‌ دست كم بايد @nb@ كاراكتر داشته باشد.',
372
+    'info_passes_identiques' => 'دو كلمه ورود با هم يكسان نيستند',
373
+    'info_plus_cinq_car' => 'بيش از پنج حرف',
374
+    'info_plus_cinq_car_2' => '(بيش از پنج حرف)',
375
+    'info_plus_trois_car' => '(بيش از سه حرف)',
376
+    'info_popularite' => '@popularite@ : محبوبيت@visites@ : بازديد',
377
+    'info_post_scriptum' => 'نوشتار پس از متن اصلى',
378
+    'info_post_scriptum_2' => ':نوشتار پس از متن اصلى',
379
+    'info_pour' => 'براى',
380
+    'info_preview_texte' => 'اين امكان وجود دارد كه سايت را پيش از آماده شدن (پيش از پيشنهاد مقالات) بازبينى كرد مانند زمانيكه همه ى مقالات و اخبار منتشر شده اند.اين امكان ميتواند تنها براى گردانند گان سايت يا نويسندگان يا براى هيچكس نباشد.', # MODIF
381
+    'info_procedez_par_etape' => 'مرحله به مرحله اقدام كنيد',
382
+    'info_procedure_maj_version' => 'روند به روز كردن بايد به جريان بيفتد تا داده پى ها بتوانند با نسخه جديد منطبق شوند.',
383
+    'info_proxy_ok' => 'آزمایش پروکسی با موفقیت انجام شد.',
384
+    'info_ps' => 'P.-S.',
385
+    'info_publier' => 'منتشر کنید',
386
+    'info_publies' => 'مقاله هاى منتشر شده تان روى تارنما',
387
+    'info_question_accepter_visiteurs' => 'اگر اسكلت سايتتان ثبت شمار بازديدكنندگان  را بى آنكه اجازه ى ورود به قسمت خصوصى سايت را داشته باشند را  داراست خواهشمند است گزينه ى زير را فعال كنيد:',
388
+    'info_question_inscription_nouveaux_redacteurs' => 'آيا ثبت نام نويسند گان جديد را از سايت همگانى قبول ميكنيد؟ اگر ميكنيد، كاربران ميتوانند با پر كردن يك پرسشنامه ثبت نام كنند و به محوطه خصوصى راه يابند. آنها ميتوانند مقالاتشان را مطرح كنند <blockquote><i>در هنگام ثبت نام كاربران يك ايميل دريافت خواهند كرد كه شامل كد ورودي شان به سايت خصوصى خواهد بود. تعدادى از ميزبانان، ارسال ايميل را از سرورها غير فعال كرده اند: دراينصورت ثبت نام خودكار غير ممكن خواهد بود..</i></blockquote>',
389
+    'info_qui_edite' => '@nom_auteur_modif@ روي اين مطلب @date_diff@ كار كرده است.',
390
+    'info_racine_site' => 'ريشه سايت',
391
+    'info_recharger_page' => 'خواهشمند است اين صفحه را تا چند لحظه بعد دوباره شارژ كنيد',
392
+    'info_recherche_auteur_zero' => '"@cherche_auteur@" : جستجوى بدون نتيجه براى',
393
+    'info_recommencer' => '.خواهشمند است دوباره شروع كنيد',
394
+    'info_redacteur_1' => 'نويسنده',
395
+    'info_redacteur_2' => 'به بخش خصوصى دسترسى دارد(<i>توصيه ميشود</i>)',
396
+    'info_redacteurs' => 'نويسندگان',
397
+    'info_redaction_en_cours' => 'در حال نگارش',
398
+    'info_redirection' => 'هدايت دوباره آدرس ',
399
+    'info_redirection_activee' => 'باز سو دهي فعال است. ',
400
+    'info_redirection_desactivee' => 'باز سو دهي حذف شده. ',
401
+    'info_refuses' => 'مقاله هايتان كه پذيرفته نشده اند',
402
+    'info_reglage_ldap' => ' گزينش :<b> تنظيم ورود LDAP</b>',
403
+    'info_renvoi_article' => 'تغییر محل. اين مقاله به این صفحه برمیگردد:',
404
+    'info_reserve_admin' => 'تنها گردانندگان سايت حق اصلاح اين آدرس را دارند',
405
+    'info_restreindre_rubrique' => ':محدوديت در اداره بخش',
406
+    'info_resultat_recherche' => ':نتيجه جستجو',
407
+    'info_rubriques' => 'بخش ها',
408
+    'info_rubriques_02' => 'بخش ها',
409
+    'info_rubriques_trouvees' => 'بخش هاى پيدا شده',
410
+    'info_sans_titre' => 'بدون عنوان',
411
+    'info_selection_chemin_acces' => '<b>انتخاب كنيد</b> راه ورودى را در راهنما',
412
+    'info_signatures' => 'امضاء',
413
+    'info_site' => 'سايت',
414
+    'info_site_2' => ':سايت',
415
+    'info_site_min' => 'سايت',
416
+    'info_site_reference_2' => 'سايت مرجع',
417
+    'info_site_web' => 'وب سايت:',
418
+    'info_sites' => 'سايت',
419
+    'info_sites_lies_mot' => 'سايتهاى پيوندى مربوط به اين واژه-كليد',
420
+    'info_sites_proxy' => 'از پروكسى استفاده كنيد',
421
+    'info_sites_trouves' => 'سايت هاى پيدا شده',
422
+    'info_sous_titre' => ':عنوان فرعى',
423
+    'info_statut_administrateur' => 'گرداننده سايت',
424
+    'info_statut_auteur' => 'وضعيت اين نويسنده:',
425
+    'info_statut_auteur_2' => 'من هستم',
426
+    'info_statut_auteur_a_confirmer' => 'ثبت نام تائید شود',
427
+    'info_statut_auteur_autre' => 'وضعیت دیگر:',
428
+    'info_statut_redacteur' => 'نويسنده',
429
+    'info_statut_utilisateurs_1' => 'وضعيت كاربران ورودى',
430
+    'info_statut_utilisateurs_2' => 'وضعيت اشخاص حاضر در راهنماى ال دى ا پى را كه براى اولين بار به سايت ميپيوندند مشخص كنيد. شما ميتوانيد پس از آن  براى هر نويسنده آنرا مورد به مورد اصلاح كنيد',
431
+    'info_suivi_activite' => 'دنباله سر مقاله',
432
+    'info_surtitre' => ':سر عنوان',
433
+    'info_syndication_integrale_1' => 'سایتتان فایلهای syndication را پیشنهاد میکند (voir « <a href="@url@">@titre@</a> »). ',
434
+    'info_syndication_integrale_2' => 'آیا مایلید که مقاله ها را بطور کامل یا فقط خلاصه ای از آنها را بفرستید؟',
435
+    'info_table_prefix' => 'شما میتوانید پیشوند نام جدولهای داده ها را اصلاح کنید زیرا هنگامیکه از یک داده پی برای چند سایت استفاده میکنید اینکار اجباری است. پیشوند باید با حروف کوچک بدون اکسان و بی فاصله باشد.',
436
+    'info_taille_maximale_images' => 'اسپيپ برش‌ بالاتر تصاوير را كه مي‌تواند نشان دهد(در ميليون‌ها پيكشل) آزمايش مي‌كند. <br /> تصاوير بزرگتر كاهش نمي‌يابند.',
437
+    'info_taille_maximale_vignette' => 'حد اكثر اندازه براى توليد تصاوير كوچك توسط سيستم',
438
+    'info_terminer_installation' => 'شما اكنون ميتوانيد روند استقرار برنامه را پايان دهيد.',
439
+    'info_texte' => 'متن',
440
+    'info_texte_explicatif' => 'متن توضيحى',
441
+    'info_texte_long' => 'متن بيش از اندازه بلند ميباشد : در ابتدا به چند قسمت تقسيم و پس از تائيد، قطعات به هم متصل خواهند شد.',
442
+    'info_texte_message' => 'متن پيام شما',
443
+    'info_texte_message_02' => 'متن پيام',
444
+    'info_titre' => ':عنوان',
445
+    'info_total' => ':كل',
446
+    'info_tous_articles_en_redaction' => 'تمام مقالات در حال نگارش',
447
+    'info_tous_articles_presents' => 'تمام مقالات منتشر شده در اين بخش',
448
+    'info_tous_articles_refuses' => 'تمام مقالات رد شده',
449
+    'info_tous_les' => 'تمام :',
450
+    'info_tout_site' => 'همه سايت',
451
+    'info_tout_site2' => 'مقاله به اين زبان ترجمه نشده.',
452
+    'info_tout_site3' => 'مقاله به اين زبان ترجمه شده,  سپس تغييراتى در مقاله ى اصلى صورت گرفته, بدين جهت بايد برگردان آنرا بروز كرد.',
453
+    'info_tout_site4' => 'مقاله به اين زبان ترجمه و برگردان آن بروز شده.',
454
+    'info_tout_site5' => 'مقاله ى اصلى',
455
+    'info_tout_site6' => ' :<b>توجه<b/> تنها مقالات اصلى اعلان ميشوند و برگردانهايشان با رنگهايى كه گوياى وضعيت آنهاست به آنها متصلند.',
456
+    'info_traductions' => 'ترجمه‌ها',
457
+    'info_travail_colaboratif' => 'مقالات حاصل كار دست جمعى',
458
+    'info_un_article' => 'يك مقاله',
459
+    'info_un_site' => ',يك سايت',
460
+    'info_une_rubrique' => ',يك بخش',
461
+    'info_une_rubrique_02' => '١ بخش',
462
+    'info_url' => ':URL',
463
+    'info_url_proxy' => 'پراكسي URL',
464
+    'info_url_site_pas_conforme' => 'يو.آر.ال سايت معتبر نيست. ',
465
+    'info_url_test_proxy' => 'تست URL',
466
+    'info_urlref' => 'پيوند هايپرتکست:',
467
+    'info_utilisation_spip' => 'شما اكنون ميتوانيد از سيستم انتشار حضورى استفاده كنيد',
468
+    'info_visites_par_mois' => ':نمودار ماهانه',
469
+    'info_visiteur_1' => 'بازديد كننده',
470
+    'info_visiteur_2' => 'سايت همگانى',
471
+    'info_visiteurs' => 'بازديد كنندگان',
472
+    'info_visiteurs_02' => 'بازديد كنندگان سايت همگانى',
473
+    'info_webmestre_forces' => 'وب مستر‌ها در حال حاضر در <  tt>@file_options@</tt تعريف مي‌شوند.',
474
+    'install_adresse_base_hebergeur' => 'آدرس داده ها که توسط میزبان وب اعطا شده',
475
+    'install_connect_ok' => 'پايگاه داده‌هاي جديد اعلام كرده از سرور با نام @connect@استفاده مي‌كند. ',
476
+    'install_echec_annonce' => 'نصب احتمالا موفق آميز نخواهد بود يا به يك سايت غير كاربردى خاتمه ميابد...',
477
+    'install_extension_php_obligatoire' => 'اسپيپ به فايلهاى php نياز دارد:',
478
+    'install_login_base_hebergeur' => 'Login ورودی به سایت که توسط میزبان وب داده شده',
479
+    'install_nom_base_hebergeur' => 'نام پایگاه داده ها که توسط میزبان وب داده شده:',
480
+    'install_pas_table' => 'پايگاه عملاً بدون جدول‌ها',
481
+    'install_pass_base_hebergeur' => 'کد ورودی به سایت که توسط میزبان وب داده شده',
482
+    'install_php_version' => 'نسخه @version@ PHP ناکافیست  دستکم= @minimum@',
483
+    'install_select_langue' => 'يك زبان را انتخاب كنيد سپس روى دكمه "بعدى" كليك كنيد، روند استقرار برنامه بكار خواهد افتاد',
484
+    'install_select_type_db' => 'نوع پايگاه داده‌ها را تعيين كردن',
485
+    'install_select_type_mysql' => 'MySQL',
486
+    'install_select_type_pg' => 'PostgreSQL',
487
+    'install_select_type_sqlite2' => 'SQLite 2',
488
+    'install_select_type_sqlite3' => 'SQLite 3',
489
+    'install_serveur_hebergeur' => 'Serveur de base de données attribué par l’hébergeur ',
490
+    'install_table_prefix_hebergeur' => 'پیشوند جدولها که توسط میزبان وب داده شده:',
491
+    'install_tables_base' => 'جدول‌هاي پايگاه',
492
+    'install_types_db_connus' => 'اسپيپ مي‌تواند<b>MySQL</b> (رايج‌تر)و <b>SQLite</b> را استفاده كند.',
493
+    'install_types_db_connus_avertissement' => 'حمايت از <b>PostgreSQL</b> عملاً به صورت تجربي پيشنهاد شده است.',
494
+    'instituer_erreur_statut_a_change' => 'وضعيت همين الأن اصلاح شده',
495
+    'instituer_erreur_statut_non_autorise' => 'نمي‌توانيد اين وضعيت را انتخاب كنيد',
496
+    'intem_redacteur' => 'نويسنده',
497
+    'intitule_licence' => 'مجوز',
498
+    'item_accepter_inscriptions' => 'ثبت نامها را بپذيريد',
499
+    'item_activer_messages_avertissement' => 'پيامهاى اخطار را فعال كنيد',
500
+    'item_administrateur_2' => 'گرداننده سايت',
501
+    'item_afficher_calendrier' => 'در بخش تقويم نمايش دهيد',
502
+    'item_autoriser_syndication_integrale' => 'پخش کامل مقاله ها در فایل های syndication',
503
+    'item_choix_administrateurs' => 'گردانندگان سايت',
504
+    'item_choix_generation_miniature' => '.تصاوير كوچك را بطور خودكار بسازيد',
505
+    'item_choix_non_generation_miniature' => '.تصاوير كوچك را بطور خودكار نسازيد',
506
+    'item_choix_redacteurs' => 'نويسندگان',
507
+    'item_choix_visiteurs' => 'بازديد كنندگان سايت همگانى',
508
+    'item_creer_fichiers_authent' => '.htpasswd : از اين فايلها بسازيد',
509
+    'item_login' => 'Login',
510
+    'item_messagerie_agenda' => 'فعال سازي سامانه‌ي پيام‌دهي و تقويم',
511
+    'item_mots_cles_association_articles' => 'به مقالات',
512
+    'item_mots_cles_association_rubriques' => 'به بخشها ',
513
+    'item_mots_cles_association_sites' => 'به سايتهاى مرجع يا پيوندى',
514
+    'item_non' => 'خير',
515
+    'item_non_accepter_inscriptions' => 'ثبت نامها را نپذيريد',
516
+    'item_non_activer_messages_avertissement' => 'بدون پيام اخطار',
517
+    'item_non_afficher_calendrier' => 'در تقويم نيايد',
518
+    'item_non_autoriser_syndication_integrale' => 'تنها خلاصه ی آنرا منتشر کنید',
519
+    'item_non_creer_fichiers_authent' => 'اين فايلها را درست نكنيد',
520
+    'item_non_messagerie_agenda' => 'غيرفعال سازي سامانه‌ي پيام‌دهي و تقويم',
521
+    'item_non_publier_articles' => 'مقالات را پيش از تعيين تاريخ قطعى انتشار منتشر نكنيد',
522
+    'item_nouvel_auteur' => 'نويسنده جديد',
523
+    'item_nouvelle_rubrique' => 'بخش جديد',
524
+    'item_oui' => 'آرى',
525
+    'item_publier_articles' => '.مقالات را عليرغم تاريخ نشرشان منتشر كنيد',
526
+    'item_reponse_article' => 'پاسخ به مقاله',
527
+    'item_visiteur' => 'بازديد كننده',
528 528
 
529
-	// J
530
-	'jour_non_connu_nc' => 'n.c.',
529
+    // J
530
+    'jour_non_connu_nc' => 'n.c.',
531 531
 
532
-	// L
533
-	'label_bando_outils' => 'ميل ابزار ',
534
-	'label_bando_outils_afficher' => 'نمايش ابزارها',
535
-	'label_bando_outils_masquer' => 'پوشاندن ابزارها',
536
-	'label_choix_langue' => 'زبان خود را انتخاب كنيد',
537
-	'label_nom_fichier_connect' => 'اعلام نام مورد استفاده براي اين سرور ',
538
-	'label_slogan_site' => 'شعار سايت',
539
-	'label_taille_ecran' => 'پهناي پرده‌ي نمايش', # MODIF
540
-	'label_texte_et_icones_navigation' => 'منوي ناوبري ',
541
-	'label_texte_et_icones_page' => 'صفحه‌ي نمايش ',
542
-	'ldap_correspondance' => 'ميدان موروثي @champ@',
543
-	'ldap_correspondance_1' => 'ميدان‌هاي موروثي LDAP',
544
-	'ldap_correspondance_2' => 'براي هر يك از ميدان‌هاي بعدي اسپيپ، نام متناسب با ميدان LDAP را وارد كنيد. اگر نمي‌خواهيد پر كنيد آن را خالي بگذاريد، براي پركردن چندين ميدان LDAP  با كاما يا فاصله جداشان كنيد.',
545
-	'lien_ajouter_auteur' => 'نام اين نويسنده را اضافه كنيد',
546
-	'lien_ajouter_une_rubrique' => 'افزودن اين بخش',
547
-	'lien_email' => 'ايميل',
548
-	'lien_nom_site' => ':نام سايت',
549
-	'lien_retirer_auteur' => 'خارج كردن نام نويسنده',
550
-	'lien_retirer_rubrique' => 'حذف كردن بخش',
551
-	'lien_retirer_tous_auteurs' => 'حذف تمام مؤلفان',
552
-	'lien_retirer_toutes_rubriques' => 'حذف تمام بخش‌ها',
553
-	'lien_site' => 'سايت',
554
-	'lien_tout_deplier' => 'همه را باز كنيد',
555
-	'lien_tout_replier' => 'همه را ببنديد',
556
-	'lien_tout_supprimer' => 'همه را حذف کنید',
557
-	'lien_trier_nom' => 'بترتيب نام',
558
-	'lien_trier_nombre_articles' => 'بترتيب تعداد مقالات',
559
-	'lien_trier_statut' => 'بترتيب موقعيت',
560
-	'lien_voir_en_ligne' => 'روى شبكه ببينيد :',
561
-	'logo_article' => 'لوگوي مقاله',
562
-	'logo_auteur' => 'لوگوي نويسنده',
563
-	'logo_rubrique' => 'لوگوي بخش',
564
-	'logo_site' => 'لوگوي اين سايت',
565
-	'logo_standard_rubrique' => 'لوگوي استاندارد بخش‌ها',
566
-	'logo_survol' => 'لوگوي موش‌ روش!',
532
+    // L
533
+    'label_bando_outils' => 'ميل ابزار ',
534
+    'label_bando_outils_afficher' => 'نمايش ابزارها',
535
+    'label_bando_outils_masquer' => 'پوشاندن ابزارها',
536
+    'label_choix_langue' => 'زبان خود را انتخاب كنيد',
537
+    'label_nom_fichier_connect' => 'اعلام نام مورد استفاده براي اين سرور ',
538
+    'label_slogan_site' => 'شعار سايت',
539
+    'label_taille_ecran' => 'پهناي پرده‌ي نمايش', # MODIF
540
+    'label_texte_et_icones_navigation' => 'منوي ناوبري ',
541
+    'label_texte_et_icones_page' => 'صفحه‌ي نمايش ',
542
+    'ldap_correspondance' => 'ميدان موروثي @champ@',
543
+    'ldap_correspondance_1' => 'ميدان‌هاي موروثي LDAP',
544
+    'ldap_correspondance_2' => 'براي هر يك از ميدان‌هاي بعدي اسپيپ، نام متناسب با ميدان LDAP را وارد كنيد. اگر نمي‌خواهيد پر كنيد آن را خالي بگذاريد، براي پركردن چندين ميدان LDAP  با كاما يا فاصله جداشان كنيد.',
545
+    'lien_ajouter_auteur' => 'نام اين نويسنده را اضافه كنيد',
546
+    'lien_ajouter_une_rubrique' => 'افزودن اين بخش',
547
+    'lien_email' => 'ايميل',
548
+    'lien_nom_site' => ':نام سايت',
549
+    'lien_retirer_auteur' => 'خارج كردن نام نويسنده',
550
+    'lien_retirer_rubrique' => 'حذف كردن بخش',
551
+    'lien_retirer_tous_auteurs' => 'حذف تمام مؤلفان',
552
+    'lien_retirer_toutes_rubriques' => 'حذف تمام بخش‌ها',
553
+    'lien_site' => 'سايت',
554
+    'lien_tout_deplier' => 'همه را باز كنيد',
555
+    'lien_tout_replier' => 'همه را ببنديد',
556
+    'lien_tout_supprimer' => 'همه را حذف کنید',
557
+    'lien_trier_nom' => 'بترتيب نام',
558
+    'lien_trier_nombre_articles' => 'بترتيب تعداد مقالات',
559
+    'lien_trier_statut' => 'بترتيب موقعيت',
560
+    'lien_voir_en_ligne' => 'روى شبكه ببينيد :',
561
+    'logo_article' => 'لوگوي مقاله',
562
+    'logo_auteur' => 'لوگوي نويسنده',
563
+    'logo_rubrique' => 'لوگوي بخش',
564
+    'logo_site' => 'لوگوي اين سايت',
565
+    'logo_standard_rubrique' => 'لوگوي استاندارد بخش‌ها',
566
+    'logo_survol' => 'لوگوي موش‌ روش!',
567 567
 
568
-	// M
569
-	'menu_aide_installation_choix_base' => 'انتخاب پايگاه',
570
-	'module_fichier_langue' => 'فايل زبان',
571
-	'module_raccourci' => 'راه كوتاه',
572
-	'module_texte_affiche' => 'متن اعلانى',
573
-	'module_texte_explicatif' => 'شما ميتوانيد راه هاى كوتاه زير را در اسكلتهاى سايتتان بگنجانيد. آنها بطور خودكار به زبانهايى كه داراى فايل زبان هستند, ترجمه ميشوند.',
574
-	'module_texte_traduction' => 'فايل زبان« @module@ »بصورت زير در دسترس ميباشد:',
575
-	'mois_non_connu' => 'شناخته نشده',
568
+    // M
569
+    'menu_aide_installation_choix_base' => 'انتخاب پايگاه',
570
+    'module_fichier_langue' => 'فايل زبان',
571
+    'module_raccourci' => 'راه كوتاه',
572
+    'module_texte_affiche' => 'متن اعلانى',
573
+    'module_texte_explicatif' => 'شما ميتوانيد راه هاى كوتاه زير را در اسكلتهاى سايتتان بگنجانيد. آنها بطور خودكار به زبانهايى كه داراى فايل زبان هستند, ترجمه ميشوند.',
574
+    'module_texte_traduction' => 'فايل زبان« @module@ »بصورت زير در دسترس ميباشد:',
575
+    'mois_non_connu' => 'شناخته نشده',
576 576
 
577
-	// N
578
-	'nouvelle_version_spip' => 'اسپيپ نسخه‌ي @version@ در دسترس است  ', # MODIF
577
+    // N
578
+    'nouvelle_version_spip' => 'اسپيپ نسخه‌ي @version@ در دسترس است  ', # MODIF
579 579
 
580
-	// O
581
-	'onglet_contenu' => 'محتوا',
582
-	'onglet_declarer_une_autre_base' => 'اعلام يك پايگاه ديگر',
583
-	'onglet_discuter' => 'بحث',
584
-	'onglet_interactivite' => 'تعامل',
585
-	'onglet_proprietes' => 'خصوصيات',
586
-	'onglet_repartition_actuelle' => 'در حال حاضر',
587
-	'onglet_sous_rubriques' => 'زيربخش‌ها',
580
+    // O
581
+    'onglet_contenu' => 'محتوا',
582
+    'onglet_declarer_une_autre_base' => 'اعلام يك پايگاه ديگر',
583
+    'onglet_discuter' => 'بحث',
584
+    'onglet_interactivite' => 'تعامل',
585
+    'onglet_proprietes' => 'خصوصيات',
586
+    'onglet_repartition_actuelle' => 'در حال حاضر',
587
+    'onglet_sous_rubriques' => 'زيربخش‌ها',
588 588
 
589
-	// P
590
-	'page_pas_proxy' => 'اين صفحه نبايد از طريق پراكسي بگذرد',
591
-	'pas_de_proxy_pour' => 'در صورت لزوم نام ماشینها یا موضوعاتی که باید در برابر این پروکسی بی اثر باشد را مشخص کنید (برای مثال:@مثال@)',
592
-	'plugin_charge_paquet' => 'باربرداري فايل آرشيوي @name@',
593
-	'plugin_charger' => 'بارگذاري ',
594
-	'plugin_erreur_charger' => 'خطا: بارگذاري @zip@ ممكن نيست',
595
-	'plugin_erreur_droit1' => 'نوشتن در ديركتوري <code>@dest@</code> ممكن نيست.',
596
-	'plugin_erreur_droit2' => 'لطفاً مجوز‌هاي نوشتن در اين ديركتوري را چك كنيد (و اگر لازم بود آن را ايجاد كنيد)، در غير اين صورت، فايل‌ها را با اف.تي.پي نصب كنيد. ',
597
-	'plugin_erreur_zip' => 'اشكال pclzip: خطا @status@',
598
-	'plugin_etat_developpement' => 'در حال تکمیل',
599
-	'plugin_etat_experimental' => 'آزمایشی',
600
-	'plugin_etat_stable' => 'ثابت',
601
-	'plugin_etat_test' => 'در حال آزمایش',
602
-	'plugin_impossible_activer' => 'فعال کردن plugin @plugin@ غیر ممکن میباشد',
603
-	'plugin_info_automatique1' => 'اگر مي‌خواهيد نصب خودكار پلاكنين‌ها را مجاز كنيد، لطفاً: ',
604
-	'plugin_info_automatique1_lib' => 'اگر مي‌خواهيد نصب خودكار اين مجموعه‌فايل را مجاز كنيد، لطفاً: ',
605
-	'plugin_info_automatique2' => 'يك ديركتوري <code>@rep@</code> ايجاد كنيد؛',
606
-	'plugin_info_automatique3' => 'بررسي كنيد كه سرور مجوز‌ نوشتن در اين ديركتوري را دارد.',
607
-	'plugin_info_automatique_creer' => 'ايجاد در ريشه‌ي سايت.',
608
-	'plugin_info_automatique_exemples' => 'نمونه‌ها:',
609
-	'plugin_info_automatique_ftp' => 'مي‌توانيد پلاگين‌ها را با FTP در ديركتوري  <tt>@rep@</tt> نصب كنيد',
610
-	'plugin_info_automatique_lib' => 'بعضي پلاگين‌ها لازم است بتوانند فايل‌ها را در ديركتوري <code>lib/</code> بارگذاري كنند. در اين صورت، اين ديركتوري بايد در ريشه‌ي سايت ايجاد شود.  ',
611
-	'plugin_info_automatique_liste' => 'فهرست‌هاي پلاگين‌هايتان: ',
612
-	'plugin_info_automatique_liste_officielle' => 'پلاگين‌هاي رسمي',
613
-	'plugin_info_automatique_liste_update' => 'روزآمدسازي فهرست‌ها',
614
-	'plugin_info_automatique_ou' => 'يا...',
615
-	'plugin_info_automatique_select' => 'يكي از پلاگين‌هاي زير را انتخاب كنيد: اسپيپ آن را در ديركتوري <code>@rep@</code> بارگذاري مي‌كند؛ اگر آن پلاگين آنجا باشد آن را به روز مي‌كند.',
616
-	'plugin_info_credit' => 'معتبر',
617
-	'plugin_info_erreur_xml' => 'اعلام پلاگين علط',
618
-	'plugin_info_install_ok' => 'نصب موفق',
619
-	'plugin_info_necessite' => 'الزام‌ها:‌',
620
-	'plugin_info_non_compatible_spip' => 'اين پلاگن با اين نسخه‌ي اسپيپ نمي‌خواند',
621
-	'plugin_info_plugins_dist_1' => 'پلاگين‌هاي زير در پوشه‌ي @plugins_dist@ بارگذاري و فعال‌ شده‌اند. ',
622
-	'plugin_info_plugins_dist_2' => 'غيرفعال نمي‌شوند',
623
-	'plugin_info_telecharger' => 'باربرداري از @url@ و نصب در @rep@',
624
-	'plugin_info_upgrade_ok' => ' روزآمدسازي موفق',
625
-	'plugin_librairies_installees' => 'آرشيو‌هاي نصب‌ شده',
626
-	'plugin_necessite_lib' => 'اين پلاگين به آرشيو @lib@ نياز دارد',
627
-	'plugin_necessite_plugin' => 'به plugin @plugin@ نسخه ی @version@ نیاز دارید', # MODIF
628
-	'plugin_necessite_plugin_sans_version' => 'پلاگين @plugin@ لازم است ',
629
-	'plugin_necessite_spip' => 'به اسپیپ نسخه ی @version@ نیاز دارید.',
630
-	'plugin_source' => 'منبع: ',
631
-	'plugin_titre_automatique' => 'نصب خودكار ',
632
-	'plugin_titre_automatique_ajouter' => 'افرودن پلاگين‌ها',
633
-	'plugin_titre_installation' => 'نصب پلاگين  @plugin@',
634
-	'plugin_titre_modifier' => 'پلاگين‌هاي من ',
635
-	'plugin_zip_active' => 'براي فعال سازي ادامه دهيد',
636
-	'plugin_zip_adresse' => 'در زير، نشاني فايل زيپ پلاگين يا نشاني فهرست پلاگين‌ها را مشخص كنيد تا بارگذاري شود',
637
-	'plugin_zip_adresse_champ' => 'نشاني پلاگين يا فهرست',
638
-	'plugin_zip_content' => 'شامل فايل‌هاي (@taille@) آماده براي بازگذاري در ديركتوري <code>@rep@</code> ',
639
-	'plugin_zip_installe_finie' => 'فايل @zip@ باز و نصب شده است.',
640
-	'plugin_zip_installe_rep_finie' => 'فايل @zip@ باز و در ديركتوري @zip@ نصب شده است',
641
-	'plugin_zip_installer' => 'اكنون مي‌توانيد نصبش كنيد.',
642
-	'plugin_zip_telecharge' => 'فايل @zip@ بارگذاري شده',
643
-	'plugins_actif_aucun' => 'هيچ پلاگيني فعال نيست.',
644
-	'plugins_actif_un' => 'يك پلاگين فعال است. ',
645
-	'plugins_actifs' => ' @count@ پلاگين فعال است.',
646
-	'plugins_actifs_liste' => 'فعال‌سازي شده',
647
-	'plugins_compte' => '@count@ پلاگين ',
648
-	'plugins_disponible_un' => 'يك پلاگين در دصترس.',
649
-	'plugins_disponibles' => '@count@ پلاگين در دسترس.',
650
-	'plugins_erreur' => 'خطا در پلاگين‌ها: @plugins@',
651
-	'plugins_liste' => 'فهرست plugins',
652
-	'plugins_liste_dist' => 'پلاگين‌هاي قفل شده ',
653
-	'plugins_recents' => 'پلاگين‌هاي اخير.',
654
-	'plugins_tous_liste' => 'همه',
655
-	'plugins_vue_hierarchie' => 'سلسله مراتب ',
656
-	'plugins_vue_liste' => 'فهرست',
657
-	'protocole_ldap' => 'نسخه ی پروتکل:',
589
+    // P
590
+    'page_pas_proxy' => 'اين صفحه نبايد از طريق پراكسي بگذرد',
591
+    'pas_de_proxy_pour' => 'در صورت لزوم نام ماشینها یا موضوعاتی که باید در برابر این پروکسی بی اثر باشد را مشخص کنید (برای مثال:@مثال@)',
592
+    'plugin_charge_paquet' => 'باربرداري فايل آرشيوي @name@',
593
+    'plugin_charger' => 'بارگذاري ',
594
+    'plugin_erreur_charger' => 'خطا: بارگذاري @zip@ ممكن نيست',
595
+    'plugin_erreur_droit1' => 'نوشتن در ديركتوري <code>@dest@</code> ممكن نيست.',
596
+    'plugin_erreur_droit2' => 'لطفاً مجوز‌هاي نوشتن در اين ديركتوري را چك كنيد (و اگر لازم بود آن را ايجاد كنيد)، در غير اين صورت، فايل‌ها را با اف.تي.پي نصب كنيد. ',
597
+    'plugin_erreur_zip' => 'اشكال pclzip: خطا @status@',
598
+    'plugin_etat_developpement' => 'در حال تکمیل',
599
+    'plugin_etat_experimental' => 'آزمایشی',
600
+    'plugin_etat_stable' => 'ثابت',
601
+    'plugin_etat_test' => 'در حال آزمایش',
602
+    'plugin_impossible_activer' => 'فعال کردن plugin @plugin@ غیر ممکن میباشد',
603
+    'plugin_info_automatique1' => 'اگر مي‌خواهيد نصب خودكار پلاكنين‌ها را مجاز كنيد، لطفاً: ',
604
+    'plugin_info_automatique1_lib' => 'اگر مي‌خواهيد نصب خودكار اين مجموعه‌فايل را مجاز كنيد، لطفاً: ',
605
+    'plugin_info_automatique2' => 'يك ديركتوري <code>@rep@</code> ايجاد كنيد؛',
606
+    'plugin_info_automatique3' => 'بررسي كنيد كه سرور مجوز‌ نوشتن در اين ديركتوري را دارد.',
607
+    'plugin_info_automatique_creer' => 'ايجاد در ريشه‌ي سايت.',
608
+    'plugin_info_automatique_exemples' => 'نمونه‌ها:',
609
+    'plugin_info_automatique_ftp' => 'مي‌توانيد پلاگين‌ها را با FTP در ديركتوري  <tt>@rep@</tt> نصب كنيد',
610
+    'plugin_info_automatique_lib' => 'بعضي پلاگين‌ها لازم است بتوانند فايل‌ها را در ديركتوري <code>lib/</code> بارگذاري كنند. در اين صورت، اين ديركتوري بايد در ريشه‌ي سايت ايجاد شود.  ',
611
+    'plugin_info_automatique_liste' => 'فهرست‌هاي پلاگين‌هايتان: ',
612
+    'plugin_info_automatique_liste_officielle' => 'پلاگين‌هاي رسمي',
613
+    'plugin_info_automatique_liste_update' => 'روزآمدسازي فهرست‌ها',
614
+    'plugin_info_automatique_ou' => 'يا...',
615
+    'plugin_info_automatique_select' => 'يكي از پلاگين‌هاي زير را انتخاب كنيد: اسپيپ آن را در ديركتوري <code>@rep@</code> بارگذاري مي‌كند؛ اگر آن پلاگين آنجا باشد آن را به روز مي‌كند.',
616
+    'plugin_info_credit' => 'معتبر',
617
+    'plugin_info_erreur_xml' => 'اعلام پلاگين علط',
618
+    'plugin_info_install_ok' => 'نصب موفق',
619
+    'plugin_info_necessite' => 'الزام‌ها:‌',
620
+    'plugin_info_non_compatible_spip' => 'اين پلاگن با اين نسخه‌ي اسپيپ نمي‌خواند',
621
+    'plugin_info_plugins_dist_1' => 'پلاگين‌هاي زير در پوشه‌ي @plugins_dist@ بارگذاري و فعال‌ شده‌اند. ',
622
+    'plugin_info_plugins_dist_2' => 'غيرفعال نمي‌شوند',
623
+    'plugin_info_telecharger' => 'باربرداري از @url@ و نصب در @rep@',
624
+    'plugin_info_upgrade_ok' => ' روزآمدسازي موفق',
625
+    'plugin_librairies_installees' => 'آرشيو‌هاي نصب‌ شده',
626
+    'plugin_necessite_lib' => 'اين پلاگين به آرشيو @lib@ نياز دارد',
627
+    'plugin_necessite_plugin' => 'به plugin @plugin@ نسخه ی @version@ نیاز دارید', # MODIF
628
+    'plugin_necessite_plugin_sans_version' => 'پلاگين @plugin@ لازم است ',
629
+    'plugin_necessite_spip' => 'به اسپیپ نسخه ی @version@ نیاز دارید.',
630
+    'plugin_source' => 'منبع: ',
631
+    'plugin_titre_automatique' => 'نصب خودكار ',
632
+    'plugin_titre_automatique_ajouter' => 'افرودن پلاگين‌ها',
633
+    'plugin_titre_installation' => 'نصب پلاگين  @plugin@',
634
+    'plugin_titre_modifier' => 'پلاگين‌هاي من ',
635
+    'plugin_zip_active' => 'براي فعال سازي ادامه دهيد',
636
+    'plugin_zip_adresse' => 'در زير، نشاني فايل زيپ پلاگين يا نشاني فهرست پلاگين‌ها را مشخص كنيد تا بارگذاري شود',
637
+    'plugin_zip_adresse_champ' => 'نشاني پلاگين يا فهرست',
638
+    'plugin_zip_content' => 'شامل فايل‌هاي (@taille@) آماده براي بازگذاري در ديركتوري <code>@rep@</code> ',
639
+    'plugin_zip_installe_finie' => 'فايل @zip@ باز و نصب شده است.',
640
+    'plugin_zip_installe_rep_finie' => 'فايل @zip@ باز و در ديركتوري @zip@ نصب شده است',
641
+    'plugin_zip_installer' => 'اكنون مي‌توانيد نصبش كنيد.',
642
+    'plugin_zip_telecharge' => 'فايل @zip@ بارگذاري شده',
643
+    'plugins_actif_aucun' => 'هيچ پلاگيني فعال نيست.',
644
+    'plugins_actif_un' => 'يك پلاگين فعال است. ',
645
+    'plugins_actifs' => ' @count@ پلاگين فعال است.',
646
+    'plugins_actifs_liste' => 'فعال‌سازي شده',
647
+    'plugins_compte' => '@count@ پلاگين ',
648
+    'plugins_disponible_un' => 'يك پلاگين در دصترس.',
649
+    'plugins_disponibles' => '@count@ پلاگين در دسترس.',
650
+    'plugins_erreur' => 'خطا در پلاگين‌ها: @plugins@',
651
+    'plugins_liste' => 'فهرست plugins',
652
+    'plugins_liste_dist' => 'پلاگين‌هاي قفل شده ',
653
+    'plugins_recents' => 'پلاگين‌هاي اخير.',
654
+    'plugins_tous_liste' => 'همه',
655
+    'plugins_vue_hierarchie' => 'سلسله مراتب ',
656
+    'plugins_vue_liste' => 'فهرست',
657
+    'protocole_ldap' => 'نسخه ی پروتکل:',
658 658
 
659
-	// Q
660
-	'queue_executer_maintenant' => 'اجرا حالا',
661
-	'queue_info_purger' => 'مي‌‌توانيد تمام كارهاي در دست انجام را حذف كنيد و فهرست  كارهاي دوره‌اي را بازتنظيم (ريست) كنيد', # MODIF
662
-	'queue_nb_jobs_in_queue' => '@nb@ وظيفه در صف ', # MODIF
663
-	'queue_next_job_in_nb_sec' => 'وظيفه‌ي بعدي در  @nb@ امين', # MODIF
664
-	'queue_no_job_in_queue' => 'وظيفه‌اي در دست اجرا نيست', # MODIF
665
-	'queue_one_job_in_queue' => '1 وظيفه در صف', # MODIF
666
-	'queue_purger_queue' => 'بازتنظيم فهرست كارها', # MODIF
667
-	'queue_titre' => 'فهرست وظيفه‌ها', # MODIF
659
+    // Q
660
+    'queue_executer_maintenant' => 'اجرا حالا',
661
+    'queue_info_purger' => 'مي‌‌توانيد تمام كارهاي در دست انجام را حذف كنيد و فهرست  كارهاي دوره‌اي را بازتنظيم (ريست) كنيد', # MODIF
662
+    'queue_nb_jobs_in_queue' => '@nb@ وظيفه در صف ', # MODIF
663
+    'queue_next_job_in_nb_sec' => 'وظيفه‌ي بعدي در  @nb@ امين', # MODIF
664
+    'queue_no_job_in_queue' => 'وظيفه‌اي در دست اجرا نيست', # MODIF
665
+    'queue_one_job_in_queue' => '1 وظيفه در صف', # MODIF
666
+    'queue_purger_queue' => 'بازتنظيم فهرست كارها', # MODIF
667
+    'queue_titre' => 'فهرست وظيفه‌ها', # MODIF
668 668
 
669
-	// R
670
-	'repertoire_plugins' => 'رپرتوار:',
671
-	'required' => '(اجباري)', # MODIF
669
+    // R
670
+    'repertoire_plugins' => 'رپرتوار:',
671
+    'required' => '(اجباري)', # MODIF
672 672
 
673
-	// S
674
-	'sans_heure' => 'زمان نامشخص',
675
-	'statut_admin_restreint' => 'ادمين محدود',
676
-	'statut_webmestre' => 'وب مستر ',
673
+    // S
674
+    'sans_heure' => 'زمان نامشخص',
675
+    'statut_admin_restreint' => 'ادمين محدود',
676
+    'statut_webmestre' => 'وب مستر ',
677 677
 
678
-	// T
679
-	'tache_cron_asap' => 'وظيفه‌ي CRON @function@ (ASAP)', # MODIF
680
-	'tache_cron_secondes' => 'وظيفه‌ي CRON @function@ (تمام @nb@)', # MODIF
681
-	'taille_cache_image' => 'اندازه ى تصاوير, كه توسط اسپيپ حساب شده ( تصاوير كوچك اسناد, عناوين گرافيكى عرضه شده, كاربردهاى رياضى با فرمهاى TeX...) در رپرتوار @dir@جمعا @taille@ را اشغال ميكنند.',
682
-	'taille_cache_moins_de' => 'اندازه‌ي حافظه‌ي پنهان كمتر از@octets@ است.',
683
-	'taille_cache_octets' => ' اندازه ى فايل پنهان در حال حاضر تقريبا @octets@ است.  ',
684
-	'taille_cache_vide' => 'فايل پنهان خالى است.',
685
-	'taille_repertoire_cache' => 'اندازه ى فايل پنهان',
686
-	'text_article_propose_publication' => ' مقاله‌ى پيشنهادى براى انتشار.',
687
-	'texte_acces_ldap_anonyme_1' => 'تعدادى از سرورهاى ال دى اپى ورود بدون نام را نميپذيرند. در اينصورت شما بايد يك نام شناسايى را مشخص كنيد تا بتوانيد به اطلاعات راهنما دسترسى داشته باشيد. در بيشتر موارد ميادين بعدى را ميتوان خالى گذاشت.',
688
-	'texte_admin_effacer_01' => 'اين فرمان محتوى داده پى ها، همچنين دسترسى نويسندگان و گردانندگان به سايت را كاملأ پاك خواهد كرد، در صورت اجراى آن شما بايد اسپيپ را دوباره نصب كنيد تا بتوانيد پايگاه جديدى همراه با حق استفاده براى گردانندگان را داشته باشيد.',
689
-	'texte_adresse_annuaire_1' => 'اگر راهنماتان در همان رايانه اى نصب شده كه سايت تارنما، احتمالا مربوط است به :«localhost» ',
690
-	'texte_ajout_auteur' => 'نام نويسنده بعدى به مقاله اضافه شد :',
691
-	'texte_annuaire_ldap_1' => 'اگر شما به راهنماى ال دى ا پى دسترسى داريد، ميتوانيد بطور خودكار كاربران را به اسپيپ اضافه كنيد',
692
-	'texte_article_statut' => 'اين مقاله :',
693
-	'texte_article_virtuel' => 'مقاله مجازى',
694
-	'texte_article_virtuel_reference' => ' <b>مقاله مجازى :</b> مقاله پيوندى شما در سايت اسپيپ است، اما شما ميتوانيد آنرا به آدرس ديگرى هدايت كنيد.براى اينكار بايد آدرس زيرى را حذف كنيد (URL)',
695
-	'texte_aucun_resultat_auteur' => 'جستجوى بى نتيجه براى"@cherche_auteur@"',
696
-	'texte_auteur_messagerie' => ' اين سايت ميتواند ليست نويسندگان متصل به سايت را بطور دائم نشان دهد اين بشما امكان رد و بدل كردن پيام را بطور مستقيم ميدهد. شما همچنين ميتوانيد گزينش «نامرئي» را انتخاب كنيد',
697
-	'texte_auteurs' => 'نويسندگان',
698
-	'texte_choix_base_1' => 'پايگاه تان را انتخاب كنيد :',
699
-	'texte_choix_base_2' => 'سرور اس كيوال حاوى چند داده پى است.',
700
-	'texte_choix_base_3' => 'پايگاهى را كه توسط ميزبانتان بشما داده شده <b>انتخاب كنيد</b>:',
701
-	'texte_choix_table_prefix' => 'پیشوند جدولها:',
702
-	'texte_compte_element' => 'عنصر @count@ ',
703
-	'texte_compte_elements' => ' @count@ عنصر',
704
-	'texte_conflit_edition_correction' => 'لطفاً تفاوت‌هاي دو متن زير را چك كنيد؛ نيز مي‌توانيد اصلاحات خود را روبرداري كرده و سپس از نو شروع كنيد.',
705
-	'texte_connexion_mysql' => 'اطلاعات داده شده توسط ميزبانتان را بخوانيد: اين اطلاعات بايد كدهاي ارتباطي با سرور ماي‌اسكيو‌ال شما را داشته باشد.',
706
-	'texte_contenu_article' => '(محتوى مقاله در چند كلمه)',
707
-	'texte_contenu_articles' => 'بنابر ماكت مورد استفاده سايتتان، شما ميتوانيد تصميم به استفاده تنها تعدادى از اجزاى مقالات را بگيريد. از ليست زير براى انتخاب اجزاى مورد نيازتان استفاده كنيد.',
708
-	'texte_crash_base' => 'اگر داده پى هايتان از بين رفتند، ميتوانيد گزينش ترميم خودكار را آزمايش كنيد',
709
-	'texte_creer_rubrique' => 'پيش از نوشتن مقاله، شما بايد يك بخش بسازيد',
710
-	'texte_date_creation_article' => ' تاريخ نوشتن مقاله',
711
-	'texte_date_creation_objet' => 'تاريخ ايجاد', # on ajoute le &quot;:&quot;
712
-	'texte_date_publication_anterieure' => 'تاريخ نگارش قبلى:',
713
-	'texte_date_publication_anterieure_nonaffichee' => 'تاريخ نگارش قبلى را اعلان نكنيد.',
714
-	'texte_date_publication_article' => 'تاريخ انتشار بروى تارنما:',
715
-	'texte_date_publication_objet' => 'تاريخ نشر وصل‌خط:',
716
-	'texte_descriptif_rapide' => 'توصيف سريع',
717
-	'texte_effacer_base' => 'داده پى هاى اسپيپ را پاك كنيد',
718
-	'texte_effacer_statistiques' => 'حذف آمارها',
719
-	'texte_en_cours_validation' => 'مطالب زير در انتظار تأييد هستند. ',
720
-	'texte_enrichir_mise_a_jour' => 'شما ميتوانيد صفحه بندى متن تان را با بعضى از علائم آراسته كنيد (مانند كروشه، آكولاد،...)',
721
-	'texte_fichier_authent' => '<b>آيا سپيپ بايد فايل‌هاى <tt>.htpasswd</tt>
678
+    // T
679
+    'tache_cron_asap' => 'وظيفه‌ي CRON @function@ (ASAP)', # MODIF
680
+    'tache_cron_secondes' => 'وظيفه‌ي CRON @function@ (تمام @nb@)', # MODIF
681
+    'taille_cache_image' => 'اندازه ى تصاوير, كه توسط اسپيپ حساب شده ( تصاوير كوچك اسناد, عناوين گرافيكى عرضه شده, كاربردهاى رياضى با فرمهاى TeX...) در رپرتوار @dir@جمعا @taille@ را اشغال ميكنند.',
682
+    'taille_cache_moins_de' => 'اندازه‌ي حافظه‌ي پنهان كمتر از@octets@ است.',
683
+    'taille_cache_octets' => ' اندازه ى فايل پنهان در حال حاضر تقريبا @octets@ است.  ',
684
+    'taille_cache_vide' => 'فايل پنهان خالى است.',
685
+    'taille_repertoire_cache' => 'اندازه ى فايل پنهان',
686
+    'text_article_propose_publication' => ' مقاله‌ى پيشنهادى براى انتشار.',
687
+    'texte_acces_ldap_anonyme_1' => 'تعدادى از سرورهاى ال دى اپى ورود بدون نام را نميپذيرند. در اينصورت شما بايد يك نام شناسايى را مشخص كنيد تا بتوانيد به اطلاعات راهنما دسترسى داشته باشيد. در بيشتر موارد ميادين بعدى را ميتوان خالى گذاشت.',
688
+    'texte_admin_effacer_01' => 'اين فرمان محتوى داده پى ها، همچنين دسترسى نويسندگان و گردانندگان به سايت را كاملأ پاك خواهد كرد، در صورت اجراى آن شما بايد اسپيپ را دوباره نصب كنيد تا بتوانيد پايگاه جديدى همراه با حق استفاده براى گردانندگان را داشته باشيد.',
689
+    'texte_adresse_annuaire_1' => 'اگر راهنماتان در همان رايانه اى نصب شده كه سايت تارنما، احتمالا مربوط است به :«localhost» ',
690
+    'texte_ajout_auteur' => 'نام نويسنده بعدى به مقاله اضافه شد :',
691
+    'texte_annuaire_ldap_1' => 'اگر شما به راهنماى ال دى ا پى دسترسى داريد، ميتوانيد بطور خودكار كاربران را به اسپيپ اضافه كنيد',
692
+    'texte_article_statut' => 'اين مقاله :',
693
+    'texte_article_virtuel' => 'مقاله مجازى',
694
+    'texte_article_virtuel_reference' => ' <b>مقاله مجازى :</b> مقاله پيوندى شما در سايت اسپيپ است، اما شما ميتوانيد آنرا به آدرس ديگرى هدايت كنيد.براى اينكار بايد آدرس زيرى را حذف كنيد (URL)',
695
+    'texte_aucun_resultat_auteur' => 'جستجوى بى نتيجه براى"@cherche_auteur@"',
696
+    'texte_auteur_messagerie' => ' اين سايت ميتواند ليست نويسندگان متصل به سايت را بطور دائم نشان دهد اين بشما امكان رد و بدل كردن پيام را بطور مستقيم ميدهد. شما همچنين ميتوانيد گزينش «نامرئي» را انتخاب كنيد',
697
+    'texte_auteurs' => 'نويسندگان',
698
+    'texte_choix_base_1' => 'پايگاه تان را انتخاب كنيد :',
699
+    'texte_choix_base_2' => 'سرور اس كيوال حاوى چند داده پى است.',
700
+    'texte_choix_base_3' => 'پايگاهى را كه توسط ميزبانتان بشما داده شده <b>انتخاب كنيد</b>:',
701
+    'texte_choix_table_prefix' => 'پیشوند جدولها:',
702
+    'texte_compte_element' => 'عنصر @count@ ',
703
+    'texte_compte_elements' => ' @count@ عنصر',
704
+    'texte_conflit_edition_correction' => 'لطفاً تفاوت‌هاي دو متن زير را چك كنيد؛ نيز مي‌توانيد اصلاحات خود را روبرداري كرده و سپس از نو شروع كنيد.',
705
+    'texte_connexion_mysql' => 'اطلاعات داده شده توسط ميزبانتان را بخوانيد: اين اطلاعات بايد كدهاي ارتباطي با سرور ماي‌اسكيو‌ال شما را داشته باشد.',
706
+    'texte_contenu_article' => '(محتوى مقاله در چند كلمه)',
707
+    'texte_contenu_articles' => 'بنابر ماكت مورد استفاده سايتتان، شما ميتوانيد تصميم به استفاده تنها تعدادى از اجزاى مقالات را بگيريد. از ليست زير براى انتخاب اجزاى مورد نيازتان استفاده كنيد.',
708
+    'texte_crash_base' => 'اگر داده پى هايتان از بين رفتند، ميتوانيد گزينش ترميم خودكار را آزمايش كنيد',
709
+    'texte_creer_rubrique' => 'پيش از نوشتن مقاله، شما بايد يك بخش بسازيد',
710
+    'texte_date_creation_article' => ' تاريخ نوشتن مقاله',
711
+    'texte_date_creation_objet' => 'تاريخ ايجاد', # on ajoute le &quot;:&quot;
712
+    'texte_date_publication_anterieure' => 'تاريخ نگارش قبلى:',
713
+    'texte_date_publication_anterieure_nonaffichee' => 'تاريخ نگارش قبلى را اعلان نكنيد.',
714
+    'texte_date_publication_article' => 'تاريخ انتشار بروى تارنما:',
715
+    'texte_date_publication_objet' => 'تاريخ نشر وصل‌خط:',
716
+    'texte_descriptif_rapide' => 'توصيف سريع',
717
+    'texte_effacer_base' => 'داده پى هاى اسپيپ را پاك كنيد',
718
+    'texte_effacer_statistiques' => 'حذف آمارها',
719
+    'texte_en_cours_validation' => 'مطالب زير در انتظار تأييد هستند. ',
720
+    'texte_enrichir_mise_a_jour' => 'شما ميتوانيد صفحه بندى متن تان را با بعضى از علائم آراسته كنيد (مانند كروشه، آكولاد،...)',
721
+    'texte_fichier_authent' => '<b>آيا سپيپ بايد فايل‌هاى <tt>.htpasswd</tt>
722 722
 و <tt>.htpasswd-admin</tt> را در دايركتوري @dossier@ بسازد؟</b><p>
723 723
 اين فايل‌ها مي‌توانند بشما در محدود كردن دسترسى نويسندگان وگردانندگان سايت در جاهاى ديگر( براى مثال برنامه خارجى آمار) كمك كنند).</p><p>
724 724
 اگر به اين گزينه نياز نيست، اسپيپ خودبخود آنرا اداره ميكند (بدون  ساخت فايل‌ها)</p>.', # MODIF
725
-	'texte_informations_personnelles_1' => 'اكنون سيستم براى شما دسترسى انحصارى به سايت را درست ميكند.',
726
-	'texte_informations_personnelles_2' => 'تذكر : اگر  نصب دوباره است، اگر دسترسى شما به سايت برقرار است، مي‌توانيد',
727
-	'texte_introductif_article' => '(متن مقدمه اى مقاله.)',
728
-	'texte_jeu_caractere' => 'بشما توصیه میشود برای سایتتان از الفبای جهانی (<tt>utf-8</tt> استفاده کنید زیرا امکان خواندن متنها در تمامی زبانها را میدهد و مشکلی هم برای مرورگرهای جدید پدید نمیآورد. ',
729
-	'texte_jeu_caractere_3' => 'سایت شما اکنون نویسه ها را مستقر کرد.',
730
-	'texte_jeu_caractere_4' => 'اگر این نویسه ها با سایت شما مطابق نیست (برای مثال پس از بازسازی داده پی ها) یا اینکه شما مایل به بکارگیری نویسه های دیگری هستید آنرا در اینجا مشخص کنید:',
731
-	'texte_login_ldap_1' => '(براى ورود بى نام، خالى بگذاريد، يا تمام مسير را درج كنيد، براى مثال« <tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt> ».)',
732
-	'texte_login_precaution' => 'توجه ! شما با اين كد متصل شديد. از اين پرسشنامه با احتياط استفاده كنيد.',
733
-	'texte_messagerie_agenda' => 'يك سامانه‌ي پيام‌دهي به نويسندگان سايت امكان مي‌دهد تا در قسمت شخصي به صورت مستقيم با يكديگر ارتباط برقرار كنند. اين سامانه به تقويم نيز لينك مي‌شود. ',
734
-	'texte_mise_a_niveau_base_1' => 'شما فايلهاى اسپيپ را نو كرديد.
725
+    'texte_informations_personnelles_1' => 'اكنون سيستم براى شما دسترسى انحصارى به سايت را درست ميكند.',
726
+    'texte_informations_personnelles_2' => 'تذكر : اگر  نصب دوباره است، اگر دسترسى شما به سايت برقرار است، مي‌توانيد',
727
+    'texte_introductif_article' => '(متن مقدمه اى مقاله.)',
728
+    'texte_jeu_caractere' => 'بشما توصیه میشود برای سایتتان از الفبای جهانی (<tt>utf-8</tt> استفاده کنید زیرا امکان خواندن متنها در تمامی زبانها را میدهد و مشکلی هم برای مرورگرهای جدید پدید نمیآورد. ',
729
+    'texte_jeu_caractere_3' => 'سایت شما اکنون نویسه ها را مستقر کرد.',
730
+    'texte_jeu_caractere_4' => 'اگر این نویسه ها با سایت شما مطابق نیست (برای مثال پس از بازسازی داده پی ها) یا اینکه شما مایل به بکارگیری نویسه های دیگری هستید آنرا در اینجا مشخص کنید:',
731
+    'texte_login_ldap_1' => '(براى ورود بى نام، خالى بگذاريد، يا تمام مسير را درج كنيد، براى مثال« <tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt> ».)',
732
+    'texte_login_precaution' => 'توجه ! شما با اين كد متصل شديد. از اين پرسشنامه با احتياط استفاده كنيد.',
733
+    'texte_messagerie_agenda' => 'يك سامانه‌ي پيام‌دهي به نويسندگان سايت امكان مي‌دهد تا در قسمت شخصي به صورت مستقيم با يكديگر ارتباط برقرار كنند. اين سامانه به تقويم نيز لينك مي‌شود. ',
734
+    'texte_mise_a_niveau_base_1' => 'شما فايلهاى اسپيپ را نو كرديد.
735 735
 اكنون بايد داده پى هاى سايت را ميزان كنيد.
736 736
  ',
737
-	'texte_modifier_article' => 'مقاله را اصلاح كنيد :',
738
-	'texte_multilinguisme' => 'اگر مايل به اداره موضوع‌ها به چند زبان هستيد، با ناوبري پيچيده، ميتوانيد، بر اساس سازماندهي سايت خود، يك منوي بخش زبان براي اين موضوع‌ها اضافه كنيد.',
739
-	'texte_multilinguisme_trad' => 'شما همچنين ميتوانيد يك سيستم اداره پيوندهاى بين ترجمه‌هاي  گوناگون اين موضوع‌ها را فعال كنيد.',
740
-	'texte_non_compresse' => '<i>فشرده نشده</i> (سرور شما اين عملكرد را قبول نميكند)',
741
-	'texte_nouvelle_version_spip_1' => 'شما نسخه جديد اسپيپ را نصب كرده ايد.',
742
-	'texte_nouvelle_version_spip_2' => 'اين نسخه جديد نياز به روزآمدسازي كامل تر دارد. اگر شما وب مستر سايت هستيد لطفا فايل @connect@ را پاك كنيد و دوباره نصب اسپيپ را از سر بگيريد تا پارامترهاى اتصال داده پى ها نو شوند.<p>(اگر شما پارامترهاى اتصال را فراموش كرده‌ايد، ميتوانيد به فايل زير مراجعه كنيد @connect@ (پيش از اينكه آنرا حذف كنيد...)</p>',
743
-	'texte_operation_echec' => 'به صفحه پيشين برگرديد، يك پايگاه انتخاب كنيد يا اينكه جديدش را بسازيد.اطلاعات داده شده توسط ميزبانتان را در مدنظر داشته باشيد.',
744
-	'texte_plus_trois_car' => 'بيش از سه حرف',
745
-	'texte_plusieurs_articles' => 'براى اين جستجو چندين نويسنده پيدا شده: "@cherche_auteur@"',
746
-	'texte_port_annuaire' => '(ارزش مشخص شده عموما مناسب است)',
747
-	'texte_presente_plugin' => 'این صفحه فهرست plugins موجود را نشان میدهد. برای فعال کردن آنها مربع مربوطه را علامت بزنید.',
748
-	'texte_proposer_publication' => 'هنگاميكه مقاله تان تمام شد ميتوانيد پيشنهاد انتشارش را بكنيد.',
749
-	'texte_proxy' => 'در بعضى موارد (اينترانت، شبكه هاى محافظت شده،...) براى دسترسى به سايتهاى پيوندى نياز به پروكسى داريد. <i>proxy HTTP</i> در اينصورت آدرسها را در زير به اين شكل مشخص كنيد
737
+    'texte_modifier_article' => 'مقاله را اصلاح كنيد :',
738
+    'texte_multilinguisme' => 'اگر مايل به اداره موضوع‌ها به چند زبان هستيد، با ناوبري پيچيده، ميتوانيد، بر اساس سازماندهي سايت خود، يك منوي بخش زبان براي اين موضوع‌ها اضافه كنيد.',
739
+    'texte_multilinguisme_trad' => 'شما همچنين ميتوانيد يك سيستم اداره پيوندهاى بين ترجمه‌هاي  گوناگون اين موضوع‌ها را فعال كنيد.',
740
+    'texte_non_compresse' => '<i>فشرده نشده</i> (سرور شما اين عملكرد را قبول نميكند)',
741
+    'texte_nouvelle_version_spip_1' => 'شما نسخه جديد اسپيپ را نصب كرده ايد.',
742
+    'texte_nouvelle_version_spip_2' => 'اين نسخه جديد نياز به روزآمدسازي كامل تر دارد. اگر شما وب مستر سايت هستيد لطفا فايل @connect@ را پاك كنيد و دوباره نصب اسپيپ را از سر بگيريد تا پارامترهاى اتصال داده پى ها نو شوند.<p>(اگر شما پارامترهاى اتصال را فراموش كرده‌ايد، ميتوانيد به فايل زير مراجعه كنيد @connect@ (پيش از اينكه آنرا حذف كنيد...)</p>',
743
+    'texte_operation_echec' => 'به صفحه پيشين برگرديد، يك پايگاه انتخاب كنيد يا اينكه جديدش را بسازيد.اطلاعات داده شده توسط ميزبانتان را در مدنظر داشته باشيد.',
744
+    'texte_plus_trois_car' => 'بيش از سه حرف',
745
+    'texte_plusieurs_articles' => 'براى اين جستجو چندين نويسنده پيدا شده: "@cherche_auteur@"',
746
+    'texte_port_annuaire' => '(ارزش مشخص شده عموما مناسب است)',
747
+    'texte_presente_plugin' => 'این صفحه فهرست plugins موجود را نشان میدهد. برای فعال کردن آنها مربع مربوطه را علامت بزنید.',
748
+    'texte_proposer_publication' => 'هنگاميكه مقاله تان تمام شد ميتوانيد پيشنهاد انتشارش را بكنيد.',
749
+    'texte_proxy' => 'در بعضى موارد (اينترانت، شبكه هاى محافظت شده،...) براى دسترسى به سايتهاى پيوندى نياز به پروكسى داريد. <i>proxy HTTP</i> در اينصورت آدرسها را در زير به اين شكل مشخص كنيد
750 750
   <tt><html>http://proxy:8080</html></tt>معمولا بهتر است اين مربع را خالى بگذاريد ',
751
-	'texte_publication_articles_post_dates' => 'اسپيپ بايد چه واكنشى را در مورد مقالاتى كه موعد تاريخ انتشارشان در آينده منقضى ميشود بپذيرد؟',
752
-	'texte_rappel_selection_champs' => '[اين موارد را درست انتخاب كنيد.]',
753
-	'texte_recalcul_page' => 'اگر ميخواهيد تنها يك صفحه را نو كنيد، بهتر است كه به قسمت همگانى رويد و بروى دكمه «تازه كنيد» كليك كنيد.',
754
-	'texte_recuperer_base' => 'داده پى ها را ترميم كنيد',
755
-	'texte_reference_mais_redirige' => 'مقاله پيوندى در سايت اسپيپ، كه به آدرس ديگرى هدايت شده.',
756
-	'texte_requetes_echouent' => '<b>هنگاميكه بعضى از جويش‌هاي اس كيو ال بدون هيچ دليلى به صورت سيستماتيك پذيرفته نميشوند، اين احتمال وجود دارد كه از پايگاه داده‌‌ها باشد.</b><p>
751
+    'texte_publication_articles_post_dates' => 'اسپيپ بايد چه واكنشى را در مورد مقالاتى كه موعد تاريخ انتشارشان در آينده منقضى ميشود بپذيرد؟',
752
+    'texte_rappel_selection_champs' => '[اين موارد را درست انتخاب كنيد.]',
753
+    'texte_recalcul_page' => 'اگر ميخواهيد تنها يك صفحه را نو كنيد، بهتر است كه به قسمت همگانى رويد و بروى دكمه «تازه كنيد» كليك كنيد.',
754
+    'texte_recuperer_base' => 'داده پى ها را ترميم كنيد',
755
+    'texte_reference_mais_redirige' => 'مقاله پيوندى در سايت اسپيپ، كه به آدرس ديگرى هدايت شده.',
756
+    'texte_requetes_echouent' => '<b>هنگاميكه بعضى از جويش‌هاي اس كيو ال بدون هيچ دليلى به صورت سيستماتيك پذيرفته نميشوند، اين احتمال وجود دارد كه از پايگاه داده‌‌ها باشد.</b><p>
757 757
 سرور اس كيوال توانائى ترميم جداولش را هنگاميكه براثر حادثه خراب شده باشند دارد.شما ميتوانيد اقدام به ترميم آنها كنيد، در صورت شكست، يك كپى از فهرست اشكالات را نگه داريد ...</p><p>
758 758
 اگر مشكل حل نشد، با ميزبانتان تماس بگيريد.</p>',
759
-	'texte_selection_langue_principale' => 'شما ميتوانيد در زير زبان اصلى سايت را انتخاب كنيد.اين گزينش شما را مجبور به نوشتن در زبان انتخابى نميكند،<ul><li> ولى امكان تعيين تاريخ، نوع موتورى كه اسپيپ بايد استفاده كند تا متون قابل رويت باشند، زبان پرسشنامه ها در قسمت همگانى سايت و همچنين زبان قسمت خصوصى را ميدهد.<ul><li>',
760
-	'texte_sous_titre' => 'عنوان فرعى',
761
-	'texte_statistiques_visites' => 'خطوط پررنگ : يكشنبه /    منحنى پررنگ : ميانگين تحولات  ',
762
-	'texte_statut_attente_validation' => 'در انتظار تائيد',
763
-	'texte_statut_publies' => 'برروى تارنما منتشر شود',
764
-	'texte_statut_refuses' => 'پذيرفته نشده',
765
-	'texte_suppression_fichiers' => 'از اين فرمان براى حذف تمام فايلها موجود در فايلهاى موقت اسپيپ استفاده كنيد.
759
+    'texte_selection_langue_principale' => 'شما ميتوانيد در زير زبان اصلى سايت را انتخاب كنيد.اين گزينش شما را مجبور به نوشتن در زبان انتخابى نميكند،<ul><li> ولى امكان تعيين تاريخ، نوع موتورى كه اسپيپ بايد استفاده كند تا متون قابل رويت باشند، زبان پرسشنامه ها در قسمت همگانى سايت و همچنين زبان قسمت خصوصى را ميدهد.<ul><li>',
760
+    'texte_sous_titre' => 'عنوان فرعى',
761
+    'texte_statistiques_visites' => 'خطوط پررنگ : يكشنبه /    منحنى پررنگ : ميانگين تحولات  ',
762
+    'texte_statut_attente_validation' => 'در انتظار تائيد',
763
+    'texte_statut_publies' => 'برروى تارنما منتشر شود',
764
+    'texte_statut_refuses' => 'پذيرفته نشده',
765
+    'texte_suppression_fichiers' => 'از اين فرمان براى حذف تمام فايلها موجود در فايلهاى موقت اسپيپ استفاده كنيد.
766 766
 اين بشما امكان نو كردن تمام صفحات را ميدهد بويژه اگر شما تغييرات مهمى در نما يا در ساختار سايت داده باشيد.',
767
-	'texte_sur_titre' => 'سر عنوان',
768
-	'texte_table_ok' => 'اين جدول درست است :',
769
-	'texte_tentative_recuperation' => 'كوشش براى تعمير',
770
-	'texte_tenter_reparation' => 'اقدام به ترميم داده پى ها كنيد',
771
-	'texte_test_proxy' => 'براى امتحان اين پروكسى، آدرس سايت تارنماى مورد دلخواهتان را در اينجا درج كنيد.',
772
-	'texte_titre_02' => 'عنوان :',
773
-	'texte_titre_obligatoire' => '<b>عنوان</b> [اجبارى]',
774
-	'texte_travail_article' => '@nom_auteur_modif@ بروى اين مقاله @date_diff@ پيش كار كرده است.',
775
-	'texte_travail_collaboratif' => 'اين امكان وجود دارد كه يك مقاله توسط چند نويسنده نوشته شده باشد. اسپيپ ميتواند مقالات تازه وارد شده را نشان دهد تا از تغييرات همزمان جلوگيرى كند.
767
+    'texte_sur_titre' => 'سر عنوان',
768
+    'texte_table_ok' => 'اين جدول درست است :',
769
+    'texte_tentative_recuperation' => 'كوشش براى تعمير',
770
+    'texte_tenter_reparation' => 'اقدام به ترميم داده پى ها كنيد',
771
+    'texte_test_proxy' => 'براى امتحان اين پروكسى، آدرس سايت تارنماى مورد دلخواهتان را در اينجا درج كنيد.',
772
+    'texte_titre_02' => 'عنوان :',
773
+    'texte_titre_obligatoire' => '<b>عنوان</b> [اجبارى]',
774
+    'texte_travail_article' => '@nom_auteur_modif@ بروى اين مقاله @date_diff@ پيش كار كرده است.',
775
+    'texte_travail_collaboratif' => 'اين امكان وجود دارد كه يك مقاله توسط چند نويسنده نوشته شده باشد. اسپيپ ميتواند مقالات تازه وارد شده را نشان دهد تا از تغييرات همزمان جلوگيرى كند.
776 776
 اين گزينش معمولا غير فعال ميباشد تا از اعلان خبرهاى بيموقع جلوگيرى كند.
777 777
 ',
778
-	'texte_vide' => 'خالى',
779
-	'texte_vider_cache' => 'فايل هاى موقت را خالى كنيد',
780
-	'titre_admin_tech' => 'نگهدارى و تعميرات فنى',
781
-	'titre_admin_vider' => 'نگهدارى و تعميرات فنى',
782
-	'titre_ajouter_un_auteur' => 'افزودن يك مؤلف',
783
-	'titre_ajouter_un_mot' => 'افزودن يك كليد-واژه',
784
-	'titre_cadre_afficher_article' => 'مقالات را نمايش دهيد',
785
-	'titre_cadre_afficher_traductions' => ' وضعيت برگردانها را براى زبانهاي زير نشان دهيد :',
786
-	'titre_cadre_ajouter_auteur' => 'يك نويسنده اضافه كنيد :',
787
-	'titre_cadre_interieur_rubrique' => 'در داخل بخش',
788
-	'titre_cadre_numero_auteur' => 'نويسنده شماره',
789
-	'titre_cadre_numero_objet' => '@objet@ شماره‌ي: ',
790
-	'titre_cadre_signature_obligatoire' => '<b>امضا</b> [اجبارى]<br />',
791
-	'titre_config_contenu_notifications' => 'اخطاريه‌ها',
792
-	'titre_config_contenu_prive' => 'در قسمت شخصي',
793
-	'titre_config_contenu_public' => 'در سايت همگاني',
794
-	'titre_config_fonctions' => 'پيكربندى سايت',
795
-	'titre_config_langage' => 'پيكربندي زبان',
796
-	'titre_configuration' => 'پيكربندى سايت',
797
-	'titre_configurer_preferences' => 'پيكربندي ترجيح‌هاي شما',
798
-	'titre_conflit_edition' => 'ناسازگاري هنگام ويرايش ',
799
-	'titre_connexion_ldap' => 'گزينش : <b>اتصال LDAP</b>',
800
-	'titre_groupe_mots' => 'گروه واژه ها :',
801
-	'titre_identite_site' => 'هويت سايت',
802
-	'titre_langue_article' => 'زبان مقاله',
803
-	'titre_langue_rubrique' => 'زبان بخش',
804
-	'titre_langue_trad_article' => 'زبان و ترجمه هاى مقاله ',
805
-	'titre_les_articles' => 'مقالات',
806
-	'titre_messagerie_agenda' => 'سامانه پيام‌دهي و روزنويسي ',
807
-	'titre_naviguer_dans_le_site' => 'در سايت گردش كنيد',
808
-	'titre_nouvelle_rubrique' => 'بخش جديد',
809
-	'titre_numero_rubrique' => 'بخش شماره :',
810
-	'titre_page_articles_edit' => 'اصلاح كنيد :@titre@',
811
-	'titre_page_articles_page' => 'مقالات',
812
-	'titre_page_articles_tous' => 'تمام سايت',
813
-	'titre_page_calendrier' => 'سالنما @nom_mois@ @annee@',
814
-	'titre_page_config_contenu' => 'پيكربندى سايت',
815
-	'titre_page_delete_all' => 'حذف كامل و غير قابل برگشت',
816
-	'titre_page_recherche' => 'نتايج جستجوى@recherche@',
817
-	'titre_page_statistiques_referers' => 'آمار (پيوندهاى وارد شده)',
818
-	'titre_page_upgrade' => 'همسان كردن اسپيپ',
819
-	'titre_publication_articles_post_dates' => 'انتشار مقالات با تاريخ آينده',
820
-	'titre_reparation' => 'تعمير',
821
-	'titre_suivi_petition' => 'دنباله درخواستها',
822
-	'tls_ldap' => 'Transport Layer Security :',
823
-	'trad_article_traduction' => 'تمام ترجمه هاى اين مقاله :',
824
-	'trad_delier' => 'پيوند به اين ترجمه‌هاي متوقف شود',
825
-	'trad_lier' => 'اين مقاله برگردان مقاله شماره زير ميباشد :',
826
-	'trad_new' => 'ترجمه‌ي جديد',
778
+    'texte_vide' => 'خالى',
779
+    'texte_vider_cache' => 'فايل هاى موقت را خالى كنيد',
780
+    'titre_admin_tech' => 'نگهدارى و تعميرات فنى',
781
+    'titre_admin_vider' => 'نگهدارى و تعميرات فنى',
782
+    'titre_ajouter_un_auteur' => 'افزودن يك مؤلف',
783
+    'titre_ajouter_un_mot' => 'افزودن يك كليد-واژه',
784
+    'titre_cadre_afficher_article' => 'مقالات را نمايش دهيد',
785
+    'titre_cadre_afficher_traductions' => ' وضعيت برگردانها را براى زبانهاي زير نشان دهيد :',
786
+    'titre_cadre_ajouter_auteur' => 'يك نويسنده اضافه كنيد :',
787
+    'titre_cadre_interieur_rubrique' => 'در داخل بخش',
788
+    'titre_cadre_numero_auteur' => 'نويسنده شماره',
789
+    'titre_cadre_numero_objet' => '@objet@ شماره‌ي: ',
790
+    'titre_cadre_signature_obligatoire' => '<b>امضا</b> [اجبارى]<br />',
791
+    'titre_config_contenu_notifications' => 'اخطاريه‌ها',
792
+    'titre_config_contenu_prive' => 'در قسمت شخصي',
793
+    'titre_config_contenu_public' => 'در سايت همگاني',
794
+    'titre_config_fonctions' => 'پيكربندى سايت',
795
+    'titre_config_langage' => 'پيكربندي زبان',
796
+    'titre_configuration' => 'پيكربندى سايت',
797
+    'titre_configurer_preferences' => 'پيكربندي ترجيح‌هاي شما',
798
+    'titre_conflit_edition' => 'ناسازگاري هنگام ويرايش ',
799
+    'titre_connexion_ldap' => 'گزينش : <b>اتصال LDAP</b>',
800
+    'titre_groupe_mots' => 'گروه واژه ها :',
801
+    'titre_identite_site' => 'هويت سايت',
802
+    'titre_langue_article' => 'زبان مقاله',
803
+    'titre_langue_rubrique' => 'زبان بخش',
804
+    'titre_langue_trad_article' => 'زبان و ترجمه هاى مقاله ',
805
+    'titre_les_articles' => 'مقالات',
806
+    'titre_messagerie_agenda' => 'سامانه پيام‌دهي و روزنويسي ',
807
+    'titre_naviguer_dans_le_site' => 'در سايت گردش كنيد',
808
+    'titre_nouvelle_rubrique' => 'بخش جديد',
809
+    'titre_numero_rubrique' => 'بخش شماره :',
810
+    'titre_page_articles_edit' => 'اصلاح كنيد :@titre@',
811
+    'titre_page_articles_page' => 'مقالات',
812
+    'titre_page_articles_tous' => 'تمام سايت',
813
+    'titre_page_calendrier' => 'سالنما @nom_mois@ @annee@',
814
+    'titre_page_config_contenu' => 'پيكربندى سايت',
815
+    'titre_page_delete_all' => 'حذف كامل و غير قابل برگشت',
816
+    'titre_page_recherche' => 'نتايج جستجوى@recherche@',
817
+    'titre_page_statistiques_referers' => 'آمار (پيوندهاى وارد شده)',
818
+    'titre_page_upgrade' => 'همسان كردن اسپيپ',
819
+    'titre_publication_articles_post_dates' => 'انتشار مقالات با تاريخ آينده',
820
+    'titre_reparation' => 'تعمير',
821
+    'titre_suivi_petition' => 'دنباله درخواستها',
822
+    'tls_ldap' => 'Transport Layer Security :',
823
+    'trad_article_traduction' => 'تمام ترجمه هاى اين مقاله :',
824
+    'trad_delier' => 'پيوند به اين ترجمه‌هاي متوقف شود',
825
+    'trad_lier' => 'اين مقاله برگردان مقاله شماره زير ميباشد :',
826
+    'trad_new' => 'ترجمه‌ي جديد',
827 827
 
828
-	// U
829
-	'utf8_convert_erreur_orig' => 'اشتباه: نویسه های @charset@ پذیرفته نمیشود.',
828
+    // U
829
+    'utf8_convert_erreur_orig' => 'اشتباه: نویسه های @charset@ پذیرفته نمیشود.',
830 830
 
831
-	// V
832
-	'version' => 'نسخه:',
831
+    // V
832
+    'version' => 'نسخه:',
833 833
 ];
Please login to merge, or discard this patch.
ecrire/lang/spip_pt.php 1 patch
Indentation   +643 added lines, -643 removed lines patch added patch discarded remove patch
@@ -5,566 +5,566 @@  discard block
 block discarded – undo
5 5
 
6 6
 return [
7 7
 
8
-	// A
9
-	'access_interface_graphique' => 'Voltar à interface gráfica completa',
10
-	'access_mode_texte' => 'Exibir a interface textual simplificada',
11
-	'admin_debug' => 'debug',
12
-	'admin_modifier_article' => 'Modificar este artigo',
13
-	'admin_modifier_auteur' => 'Modificar este autor',
14
-	'admin_modifier_breve' => 'Modificar esta notícia',
15
-	'admin_modifier_mot' => 'Modificar esta palavra-chave',
16
-	'admin_modifier_rubrique' => 'Modificar esta rubrica',
17
-	'admin_recalculer' => 'Recompor esta página',
18
-	'afficher_calendrier' => 'Exibir o calendário',
19
-	'afficher_trad' => 'exibir as traduções',
20
-	'alerte_maj_impossible' => '<b>Alerta !</b> A actualização da base de dados SQL para a versão @version@ é impossível, talvez por causa de um problema de permissão de modificação na base de dados. Por favor contacte o seu serviço de hospedagem.',
21
-	'alerte_modif_info_concourante' => 'ATTENÇÃO : Esta informação já foi modificada noutro menu. O valor actual é :',
22
-	'analyse_xml' => 'Análise XML',
23
-	'annuler' => 'Cancelar',
24
-	'antispam_champ_vide' => 'Por favor deixe este campo vazio :',
25
-	'articles_recents' => 'Artigos mais recentes',
26
-	'avis_archive_incorrect' => 'o ficheiro arquivo não é um ficheiro SPIP',
27
-	'avis_archive_invalide' => 'o ficheiro arquivo não é válido ',
28
-	'avis_attention' => ' ATENÇÂO!',
29
-	'avis_champ_incorrect_type_objet' => 'Nome de campo incorrecto @name@ para objecto de tipo @type@',
30
-	'avis_colonne_inexistante' => 'A coluna  @col@ não existe',
31
-	'avis_erreur' => 'Erro: ver mais abaixo',
32
-	'avis_erreur_connexion' => 'Erro de ligação ',
33
-	'avis_erreur_cookie' => 'problema de cookie',
34
-	'avis_erreur_fonction_contexte' => 'Erro de programação. Não se pode chamar esta função neste contexto.',
35
-	'avis_erreur_mysql' => 'Erro SQL',
36
-	'avis_erreur_sauvegarde' => 'Erro na cópia de segurança  (@type@ @id_objet@) !',
37
-	'avis_erreur_visiteur' => 'Problema de acesso à área privada',
8
+    // A
9
+    'access_interface_graphique' => 'Voltar à interface gráfica completa',
10
+    'access_mode_texte' => 'Exibir a interface textual simplificada',
11
+    'admin_debug' => 'debug',
12
+    'admin_modifier_article' => 'Modificar este artigo',
13
+    'admin_modifier_auteur' => 'Modificar este autor',
14
+    'admin_modifier_breve' => 'Modificar esta notícia',
15
+    'admin_modifier_mot' => 'Modificar esta palavra-chave',
16
+    'admin_modifier_rubrique' => 'Modificar esta rubrica',
17
+    'admin_recalculer' => 'Recompor esta página',
18
+    'afficher_calendrier' => 'Exibir o calendário',
19
+    'afficher_trad' => 'exibir as traduções',
20
+    'alerte_maj_impossible' => '<b>Alerta !</b> A actualização da base de dados SQL para a versão @version@ é impossível, talvez por causa de um problema de permissão de modificação na base de dados. Por favor contacte o seu serviço de hospedagem.',
21
+    'alerte_modif_info_concourante' => 'ATTENÇÃO : Esta informação já foi modificada noutro menu. O valor actual é :',
22
+    'analyse_xml' => 'Análise XML',
23
+    'annuler' => 'Cancelar',
24
+    'antispam_champ_vide' => 'Por favor deixe este campo vazio :',
25
+    'articles_recents' => 'Artigos mais recentes',
26
+    'avis_archive_incorrect' => 'o ficheiro arquivo não é um ficheiro SPIP',
27
+    'avis_archive_invalide' => 'o ficheiro arquivo não é válido ',
28
+    'avis_attention' => ' ATENÇÂO!',
29
+    'avis_champ_incorrect_type_objet' => 'Nome de campo incorrecto @name@ para objecto de tipo @type@',
30
+    'avis_colonne_inexistante' => 'A coluna  @col@ não existe',
31
+    'avis_erreur' => 'Erro: ver mais abaixo',
32
+    'avis_erreur_connexion' => 'Erro de ligação ',
33
+    'avis_erreur_cookie' => 'problema de cookie',
34
+    'avis_erreur_fonction_contexte' => 'Erro de programação. Não se pode chamar esta função neste contexto.',
35
+    'avis_erreur_mysql' => 'Erro SQL',
36
+    'avis_erreur_sauvegarde' => 'Erro na cópia de segurança  (@type@ @id_objet@) !',
37
+    'avis_erreur_visiteur' => 'Problema de acesso à área privada',
38 38
 
39
-	// B
40
-	'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave',
41
-	'barre_aide' => 'Utilize as abreviaturas tipográficas para enriquecer a sua paginação.',
42
-	'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo ',
43
-	'barre_eo' => 'Inserir um E no O',
44
-	'barre_eo_maj' => 'Inserir um E no O maiúsculo',
45
-	'barre_euro' => 'Inserir o símbolo €',
46
-	'barre_gras' => '  Escrever em {{negro}}',
47
-	'barre_guillemets' => 'Colocar entre "aspas" ',
48
-	'barre_guillemets_simples' => 'Colocar entre ’aspas simples’',
49
-	'barre_intertitre' => 'Transfomar em  {{{intertítulo}}} ',
50
-	'barre_italic' => 'Pôr em itálico ',
51
-	'barre_lien' => 'Transformar em [ligação hipertexto->http://...]',
52
-	'barre_lien_input' => 'Por favor indique o endereço da sua ligação (pode indicar um endereço Web sob a forma  http://www.monsite/com ou simplesmente indicar o número de um artigo deste sítio.) ',
53
-	'barre_note' => 'Transformar em  [[Nota de rodapé ]]',
54
-	'barre_paragraphe' => 'Criar um parágrafo',
55
-	'barre_quote' => '<quote>Citar uma  mensagem</quote>',
56
-	'bouton_changer' => 'Modificar',
57
-	'bouton_chercher' => 'Procurar',
58
-	'bouton_choisir' => 'Seleccionar',
59
-	'bouton_deplacer' => 'Mover',
60
-	'bouton_download' => 'Download',
61
-	'bouton_enregistrer' => 'Guardar',
62
-	'bouton_radio_desactiver_messagerie_interne' => 'Desactivar a caixa de correio interno',
63
-	'bouton_radio_envoi_annonces' => 'Enviar os anúncios editoriais',
64
-	'bouton_radio_non_envoi_annonces' => 'Não enviar anúncios',
65
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades',
66
-	'bouton_recharger_page' => 'recarregar esta página',
67
-	'bouton_telecharger' => 'Carregar',
68
-	'bouton_upload' => 'Carregar',
69
-	'bouton_valider' => 'Submeter',
39
+    // B
40
+    'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave',
41
+    'barre_aide' => 'Utilize as abreviaturas tipográficas para enriquecer a sua paginação.',
42
+    'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo ',
43
+    'barre_eo' => 'Inserir um E no O',
44
+    'barre_eo_maj' => 'Inserir um E no O maiúsculo',
45
+    'barre_euro' => 'Inserir o símbolo €',
46
+    'barre_gras' => '  Escrever em {{negro}}',
47
+    'barre_guillemets' => 'Colocar entre "aspas" ',
48
+    'barre_guillemets_simples' => 'Colocar entre ’aspas simples’',
49
+    'barre_intertitre' => 'Transfomar em  {{{intertítulo}}} ',
50
+    'barre_italic' => 'Pôr em itálico ',
51
+    'barre_lien' => 'Transformar em [ligação hipertexto->http://...]',
52
+    'barre_lien_input' => 'Por favor indique o endereço da sua ligação (pode indicar um endereço Web sob a forma  http://www.monsite/com ou simplesmente indicar o número de um artigo deste sítio.) ',
53
+    'barre_note' => 'Transformar em  [[Nota de rodapé ]]',
54
+    'barre_paragraphe' => 'Criar um parágrafo',
55
+    'barre_quote' => '<quote>Citar uma  mensagem</quote>',
56
+    'bouton_changer' => 'Modificar',
57
+    'bouton_chercher' => 'Procurar',
58
+    'bouton_choisir' => 'Seleccionar',
59
+    'bouton_deplacer' => 'Mover',
60
+    'bouton_download' => 'Download',
61
+    'bouton_enregistrer' => 'Guardar',
62
+    'bouton_radio_desactiver_messagerie_interne' => 'Desactivar a caixa de correio interno',
63
+    'bouton_radio_envoi_annonces' => 'Enviar os anúncios editoriais',
64
+    'bouton_radio_non_envoi_annonces' => 'Não enviar anúncios',
65
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades',
66
+    'bouton_recharger_page' => 'recarregar esta página',
67
+    'bouton_telecharger' => 'Carregar',
68
+    'bouton_upload' => 'Carregar',
69
+    'bouton_valider' => 'Submeter',
70 70
 
71
-	// C
72
-	'cal_apresmidi' => 'tarde',
73
-	'cal_jour_entier' => 'dia todo',
74
-	'cal_matin' => 'manhã',
75
-	'cal_par_jour' => 'calendário por dia',
76
-	'cal_par_mois' => 'calendário por mês',
77
-	'cal_par_semaine' => 'calendário por semana',
78
-	'choix_couleur_interface' => 'cor',
79
-	'choix_interface' => 'escolha da interface',
80
-	'colonne' => 'Coluna',
81
-	'confirm_changer_statut' => 'Atenção, solicitou a alteração do estatuto deste elemento. Deseja continuar?',
82
-	'correcte' => 'correcto',
71
+    // C
72
+    'cal_apresmidi' => 'tarde',
73
+    'cal_jour_entier' => 'dia todo',
74
+    'cal_matin' => 'manhã',
75
+    'cal_par_jour' => 'calendário por dia',
76
+    'cal_par_mois' => 'calendário por mês',
77
+    'cal_par_semaine' => 'calendário por semana',
78
+    'choix_couleur_interface' => 'cor',
79
+    'choix_interface' => 'escolha da interface',
80
+    'colonne' => 'Coluna',
81
+    'confirm_changer_statut' => 'Atenção, solicitou a alteração do estatuto deste elemento. Deseja continuar?',
82
+    'correcte' => 'correcto',
83 83
 
84
-	// D
85
-	'date_aujourdhui' => 'hoje',
86
-	'date_avant_jc' => 'a. J.C.',
87
-	'date_dans' => 'entre @delai@',
88
-	'date_de_mois_1' => '@j@ de @nommois@',
89
-	'date_de_mois_10' => '@j@ de @nommois@',
90
-	'date_de_mois_11' => '@j@ de @nommois@',
91
-	'date_de_mois_12' => '@j@ de @nommois@',
92
-	'date_de_mois_2' => '@j@ de @nommois@',
93
-	'date_de_mois_3' => '@j@ de @nommois@',
94
-	'date_de_mois_4' => '@j@ de @nommois@',
95
-	'date_de_mois_5' => '@j@ de @nommois@',
96
-	'date_de_mois_6' => '@j@ de @nommois@',
97
-	'date_de_mois_7' => '@j@ de @nommois@',
98
-	'date_de_mois_8' => '@j@ de @nommois@',
99
-	'date_de_mois_9' => '@j@ de @nommois@',
100
-	'date_demain' => 'amanhã',
101
-	'date_fmt_heures_minutes' => '@h@h@m@min',
102
-	'date_fmt_heures_minutes_court' => '@h@:@m@',
103
-	'date_fmt_jour' => '@nomjour@ @jour@',
104
-	'date_fmt_jour_heure' => '@jour@ a @heure@',
105
-	'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ a @heure_fin@', # MODIF
106
-	'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@', # MODIF
107
-	'date_fmt_jour_mois' => '@jour@ de @nommois@',
108
-	'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@',
109
-	'date_fmt_mois_annee' => '@nommois@ de @annee@',
110
-	'date_fmt_nomjour' => '@nomjour@ @date@',
111
-	'date_fmt_nomjour_date' => ' @nomjour@ @date@',
112
-	'date_fmt_periode' => 'De @date_debut@ a @date_fin@',
113
-	'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@',
114
-	'date_fmt_periode_from' => 'De',
115
-	'date_fmt_periode_to' => 'a',
116
-	'date_heures' => 'horas',
117
-	'date_hier' => 'ontem',
118
-	'date_il_y_a' => 'há @delai@',
119
-	'date_jnum1' => '1',
120
-	'date_jnum10' => '10',
121
-	'date_jnum11' => '11',
122
-	'date_jnum12' => '12',
123
-	'date_jnum13' => '13',
124
-	'date_jnum14' => '14',
125
-	'date_jnum15' => '15',
126
-	'date_jnum16' => '16',
127
-	'date_jnum17' => '17',
128
-	'date_jnum18' => '18',
129
-	'date_jnum19' => '19',
130
-	'date_jnum2' => '2',
131
-	'date_jnum20' => '20',
132
-	'date_jnum21' => '21',
133
-	'date_jnum22' => '22',
134
-	'date_jnum23' => '23',
135
-	'date_jnum24' => '24',
136
-	'date_jnum25' => '25',
137
-	'date_jnum26' => '26',
138
-	'date_jnum27' => '27',
139
-	'date_jnum28' => '28',
140
-	'date_jnum29' => '29',
141
-	'date_jnum3' => '3',
142
-	'date_jnum30' => '30',
143
-	'date_jnum31' => '31',
144
-	'date_jnum4' => '4',
145
-	'date_jnum5' => '5',
146
-	'date_jnum6' => '6',
147
-	'date_jnum7' => '7',
148
-	'date_jnum8' => '8',
149
-	'date_jnum9' => '9',
150
-	'date_jour_1' => 'domingo',
151
-	'date_jour_1_abbr' => 'Dom.',
152
-	'date_jour_1_initiale' => 'D.',
153
-	'date_jour_2' => 'segunda-feira',
154
-	'date_jour_2_abbr' => 'Seg.',
155
-	'date_jour_2_initiale' => 'S.',
156
-	'date_jour_3' => 'terça-feira',
157
-	'date_jour_3_abbr' => 'Ter.',
158
-	'date_jour_3_initiale' => 'T.',
159
-	'date_jour_4' => 'quarta-feira',
160
-	'date_jour_4_abbr' => 'Qua.',
161
-	'date_jour_4_initiale' => 'Q.',
162
-	'date_jour_5' => 'quinta-feira',
163
-	'date_jour_5_abbr' => 'Qui.',
164
-	'date_jour_5_initiale' => 'Q.',
165
-	'date_jour_6' => 'sexta-feira',
166
-	'date_jour_6_abbr' => 'Sex.',
167
-	'date_jour_6_initiale' => 'S.',
168
-	'date_jour_7' => 'sábado',
169
-	'date_jour_7_abbr' => 'Sab.',
170
-	'date_jour_7_initiale' => 'S.',
171
-	'date_jours' => 'dias',
172
-	'date_minutes' => 'minutos',
173
-	'date_mois' => 'meses',
174
-	'date_mois_1' => 'Janeiro',
175
-	'date_mois_10' => 'Outubro',
176
-	'date_mois_10_abbr' => 'Out.',
177
-	'date_mois_11' => 'Novembro',
178
-	'date_mois_11_abbr' => 'Nov.',
179
-	'date_mois_12' => 'Dezembro',
180
-	'date_mois_12_abbr' => 'Dez.',
181
-	'date_mois_1_abbr' => 'Jan.',
182
-	'date_mois_2' => 'Fevereiro',
183
-	'date_mois_2_abbr' => 'Feb.',
184
-	'date_mois_3' => 'Março',
185
-	'date_mois_3_abbr' => 'Mar',
186
-	'date_mois_4' => 'Abril',
187
-	'date_mois_4_abbr' => 'Abr.',
188
-	'date_mois_5' => 'Maio',
189
-	'date_mois_5_abbr' => 'Mai',
190
-	'date_mois_6' => 'Junho',
191
-	'date_mois_6_abbr' => 'Jun',
192
-	'date_mois_7' => 'Julho',
193
-	'date_mois_7_abbr' => 'Jul',
194
-	'date_mois_8' => 'Agosto',
195
-	'date_mois_8_abbr' => 'Ago',
196
-	'date_mois_9' => 'Setembro',
197
-	'date_mois_9_abbr' => 'Set',
198
-	'date_saison_1' => 'inverno',
199
-	'date_saison_2' => 'primavera',
200
-	'date_saison_3' => 'verão',
201
-	'date_saison_4' => 'outono',
202
-	'date_secondes' => 'segundos',
203
-	'date_semaines' => 'semanas',
204
-	'date_un_mois' => 'mês',
205
-	'date_une_heure' => 'hora',
206
-	'date_une_minute' => 'minuto',
207
-	'date_une_seconde' => 'segundo',
208
-	'date_une_semaine' => 'semana',
209
-	'dirs_commencer' => 'a fim de começar realmente a instalação',
210
-	'dirs_preliminaire' => 'Preliminar : <b>Configurar os direitos de acesso</b>',
211
-	'dirs_probleme_droits' => 'Problema de direitos de acesso',
212
-	'dirs_repertoires_absents' => '<b>Os seguintes directórios não foram encontrados : <ul>@bad_dirs@.</ul> </b>
84
+    // D
85
+    'date_aujourdhui' => 'hoje',
86
+    'date_avant_jc' => 'a. J.C.',
87
+    'date_dans' => 'entre @delai@',
88
+    'date_de_mois_1' => '@j@ de @nommois@',
89
+    'date_de_mois_10' => '@j@ de @nommois@',
90
+    'date_de_mois_11' => '@j@ de @nommois@',
91
+    'date_de_mois_12' => '@j@ de @nommois@',
92
+    'date_de_mois_2' => '@j@ de @nommois@',
93
+    'date_de_mois_3' => '@j@ de @nommois@',
94
+    'date_de_mois_4' => '@j@ de @nommois@',
95
+    'date_de_mois_5' => '@j@ de @nommois@',
96
+    'date_de_mois_6' => '@j@ de @nommois@',
97
+    'date_de_mois_7' => '@j@ de @nommois@',
98
+    'date_de_mois_8' => '@j@ de @nommois@',
99
+    'date_de_mois_9' => '@j@ de @nommois@',
100
+    'date_demain' => 'amanhã',
101
+    'date_fmt_heures_minutes' => '@h@h@m@min',
102
+    'date_fmt_heures_minutes_court' => '@h@:@m@',
103
+    'date_fmt_jour' => '@nomjour@ @jour@',
104
+    'date_fmt_jour_heure' => '@jour@ a @heure@',
105
+    'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ a @heure_fin@', # MODIF
106
+    'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@', # MODIF
107
+    'date_fmt_jour_mois' => '@jour@ de @nommois@',
108
+    'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@',
109
+    'date_fmt_mois_annee' => '@nommois@ de @annee@',
110
+    'date_fmt_nomjour' => '@nomjour@ @date@',
111
+    'date_fmt_nomjour_date' => ' @nomjour@ @date@',
112
+    'date_fmt_periode' => 'De @date_debut@ a @date_fin@',
113
+    'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@',
114
+    'date_fmt_periode_from' => 'De',
115
+    'date_fmt_periode_to' => 'a',
116
+    'date_heures' => 'horas',
117
+    'date_hier' => 'ontem',
118
+    'date_il_y_a' => 'há @delai@',
119
+    'date_jnum1' => '1',
120
+    'date_jnum10' => '10',
121
+    'date_jnum11' => '11',
122
+    'date_jnum12' => '12',
123
+    'date_jnum13' => '13',
124
+    'date_jnum14' => '14',
125
+    'date_jnum15' => '15',
126
+    'date_jnum16' => '16',
127
+    'date_jnum17' => '17',
128
+    'date_jnum18' => '18',
129
+    'date_jnum19' => '19',
130
+    'date_jnum2' => '2',
131
+    'date_jnum20' => '20',
132
+    'date_jnum21' => '21',
133
+    'date_jnum22' => '22',
134
+    'date_jnum23' => '23',
135
+    'date_jnum24' => '24',
136
+    'date_jnum25' => '25',
137
+    'date_jnum26' => '26',
138
+    'date_jnum27' => '27',
139
+    'date_jnum28' => '28',
140
+    'date_jnum29' => '29',
141
+    'date_jnum3' => '3',
142
+    'date_jnum30' => '30',
143
+    'date_jnum31' => '31',
144
+    'date_jnum4' => '4',
145
+    'date_jnum5' => '5',
146
+    'date_jnum6' => '6',
147
+    'date_jnum7' => '7',
148
+    'date_jnum8' => '8',
149
+    'date_jnum9' => '9',
150
+    'date_jour_1' => 'domingo',
151
+    'date_jour_1_abbr' => 'Dom.',
152
+    'date_jour_1_initiale' => 'D.',
153
+    'date_jour_2' => 'segunda-feira',
154
+    'date_jour_2_abbr' => 'Seg.',
155
+    'date_jour_2_initiale' => 'S.',
156
+    'date_jour_3' => 'terça-feira',
157
+    'date_jour_3_abbr' => 'Ter.',
158
+    'date_jour_3_initiale' => 'T.',
159
+    'date_jour_4' => 'quarta-feira',
160
+    'date_jour_4_abbr' => 'Qua.',
161
+    'date_jour_4_initiale' => 'Q.',
162
+    'date_jour_5' => 'quinta-feira',
163
+    'date_jour_5_abbr' => 'Qui.',
164
+    'date_jour_5_initiale' => 'Q.',
165
+    'date_jour_6' => 'sexta-feira',
166
+    'date_jour_6_abbr' => 'Sex.',
167
+    'date_jour_6_initiale' => 'S.',
168
+    'date_jour_7' => 'sábado',
169
+    'date_jour_7_abbr' => 'Sab.',
170
+    'date_jour_7_initiale' => 'S.',
171
+    'date_jours' => 'dias',
172
+    'date_minutes' => 'minutos',
173
+    'date_mois' => 'meses',
174
+    'date_mois_1' => 'Janeiro',
175
+    'date_mois_10' => 'Outubro',
176
+    'date_mois_10_abbr' => 'Out.',
177
+    'date_mois_11' => 'Novembro',
178
+    'date_mois_11_abbr' => 'Nov.',
179
+    'date_mois_12' => 'Dezembro',
180
+    'date_mois_12_abbr' => 'Dez.',
181
+    'date_mois_1_abbr' => 'Jan.',
182
+    'date_mois_2' => 'Fevereiro',
183
+    'date_mois_2_abbr' => 'Feb.',
184
+    'date_mois_3' => 'Março',
185
+    'date_mois_3_abbr' => 'Mar',
186
+    'date_mois_4' => 'Abril',
187
+    'date_mois_4_abbr' => 'Abr.',
188
+    'date_mois_5' => 'Maio',
189
+    'date_mois_5_abbr' => 'Mai',
190
+    'date_mois_6' => 'Junho',
191
+    'date_mois_6_abbr' => 'Jun',
192
+    'date_mois_7' => 'Julho',
193
+    'date_mois_7_abbr' => 'Jul',
194
+    'date_mois_8' => 'Agosto',
195
+    'date_mois_8_abbr' => 'Ago',
196
+    'date_mois_9' => 'Setembro',
197
+    'date_mois_9_abbr' => 'Set',
198
+    'date_saison_1' => 'inverno',
199
+    'date_saison_2' => 'primavera',
200
+    'date_saison_3' => 'verão',
201
+    'date_saison_4' => 'outono',
202
+    'date_secondes' => 'segundos',
203
+    'date_semaines' => 'semanas',
204
+    'date_un_mois' => 'mês',
205
+    'date_une_heure' => 'hora',
206
+    'date_une_minute' => 'minuto',
207
+    'date_une_seconde' => 'segundo',
208
+    'date_une_semaine' => 'semana',
209
+    'dirs_commencer' => 'a fim de começar realmente a instalação',
210
+    'dirs_preliminaire' => 'Preliminar : <b>Configurar os direitos de acesso</b>',
211
+    'dirs_probleme_droits' => 'Problema de direitos de acesso',
212
+    'dirs_repertoires_absents' => '<b>Os seguintes directórios não foram encontrados : <ul>@bad_dirs@.</ul> </b>
213 213
   <p>É provável que resulte de um problema de má colocação de maiúsculas ou minúsculas.
214 214
   Verifique que as minúsculas e maiúsculas destes directórios concordam com o que está exibido
215 215
  acima; se não for o caso, renomeie os repertórios com o seu software FTP de modo a corrigir o erro.
216 216
   <p>Terminada esta operação, poderá</p>',
217
-	'dirs_repertoires_suivants' => '<b>Os seguintes directórios não estão acessíveis para escrita: <ul>@bad_dirs@.</ul> </b>
217
+    'dirs_repertoires_suivants' => '<b>Os seguintes directórios não estão acessíveis para escrita: <ul>@bad_dirs@.</ul> </b>
218 218
   <p>Para corrigir, utilize o seu programa de FTP para configurar os direitos de acesso de cada um
219 219
   destes directórios. O procedimento está explicado em detalhe no manual de instalação.
220 220
   <p>Uma vez efectuada esta alteração, poderá',
221
-	'double_occurrence' => 'Dupla ocorrência de @balise@',
221
+    'double_occurrence' => 'Dupla ocorrência de @balise@',
222 222
 
223
-	// E
224
-	'en_cours' => 'em curso',
225
-	'envoi_via_le_site' => 'Envio pelo sítio',
226
-	'erreur' => 'Erro',
227
-	'erreur_balise_non_fermee' => 'última tag não fechada :',
228
-	'erreur_technique_ajaxform' => 'Ooops. Uum erro inesperado impediu o formulário de ser enviado. Por favor tente novamente.',
229
-	'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu o registo correcto do campo @champs@.',
230
-	'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu o registo.',
231
-	'erreur_texte' => 'erro(s)',
232
-	'etape' => 'Etapa',
223
+    // E
224
+    'en_cours' => 'em curso',
225
+    'envoi_via_le_site' => 'Envio pelo sítio',
226
+    'erreur' => 'Erro',
227
+    'erreur_balise_non_fermee' => 'última tag não fechada :',
228
+    'erreur_technique_ajaxform' => 'Ooops. Uum erro inesperado impediu o formulário de ser enviado. Por favor tente novamente.',
229
+    'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu o registo correcto do campo @champs@.',
230
+    'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu o registo.',
231
+    'erreur_texte' => 'erro(s)',
232
+    'etape' => 'Etapa',
233 233
 
234
-	// F
235
-	'fichier_introuvable' => 'Ficheiro @fichier@ não localizado', # MODIF
236
-	'form_auteur_confirmation' => 'Confirme o seu endereço e-mail',
237
-	'form_auteur_email_modifie' => 'O seu endereço e-mail foi alterado.',
238
-	'form_auteur_envoi_mail_confirmation' => 'Um e-mail de confirmação foi enviado para @email@. Para validar o seu endereço de e-mail, deve abrir o endereço Web mencionado na mensagem.',
239
-	'form_auteur_mail_confirmation' => 'Olá,
234
+    // F
235
+    'fichier_introuvable' => 'Ficheiro @fichier@ não localizado', # MODIF
236
+    'form_auteur_confirmation' => 'Confirme o seu endereço e-mail',
237
+    'form_auteur_email_modifie' => 'O seu endereço e-mail foi alterado.',
238
+    'form_auteur_envoi_mail_confirmation' => 'Um e-mail de confirmação foi enviado para @email@. Para validar o seu endereço de e-mail, deve abrir o endereço Web mencionado na mensagem.',
239
+    'form_auteur_mail_confirmation' => 'Olá,
240 240
 
241 241
 Pediu para alterar o seu endereço e-mail. Para confirmar o seu novo endereço, precisa de se conectar ao endereço abaixo (caso contrário, o seu pedido será ignorado) :
242 242
 
243 243
     @url@
244 244
 ',
245
-	'form_deja_inscrit' => 'Já está inscrito.',
246
-	'form_email_non_valide' => 'O seu endereço email não é válido',
247
-	'form_forum_access_refuse' => 'Você já não tem acesso a este sítio',
248
-	'form_forum_bonjour' => 'Bom dia @nom@,',
249
-	'form_forum_confirmer_email' => 'Para confirmar o seu endereço e-maill, abra esta ligação : @url_confirm@',
250
-	'form_forum_email_deja_enregistre' => 'Este endereço e-mail já está registado,pode portanto utilizar a sua palavra-passe habitual',
251
-	'form_forum_identifiant_mail' => 'O seu novo identificador acabou de lhe ser enviado por email.',
252
-	'form_forum_identifiants' => 'Identificadores pessoais',
253
-	'form_forum_indiquer_nom_email' => 'Indicar aqui o seu nome e o seu endereço email. O seu identificador pessoal ser-lhe-á enviado rapidamente por correio electrónico.',
254
-	'form_forum_login' => 'login:',
255
-	'form_forum_message_auto' => '(esta é uma mensagem automática)',
256
-	'form_forum_pass' => 'palavra-passe',
257
-	'form_forum_probleme_mail' => 'Problema de mail :o identificador não pôde ser enviado',
258
-	'form_forum_voici1' => 'Aqui estão os seus dados para poder aceder ao sítio Internet do  "@nom_site_spip@" (@adresse_site@):',
259
-	'form_forum_voici2' => 'Eis os seus identificadores para propor artigos no
245
+    'form_deja_inscrit' => 'Já está inscrito.',
246
+    'form_email_non_valide' => 'O seu endereço email não é válido',
247
+    'form_forum_access_refuse' => 'Você já não tem acesso a este sítio',
248
+    'form_forum_bonjour' => 'Bom dia @nom@,',
249
+    'form_forum_confirmer_email' => 'Para confirmar o seu endereço e-maill, abra esta ligação : @url_confirm@',
250
+    'form_forum_email_deja_enregistre' => 'Este endereço e-mail já está registado,pode portanto utilizar a sua palavra-passe habitual',
251
+    'form_forum_identifiant_mail' => 'O seu novo identificador acabou de lhe ser enviado por email.',
252
+    'form_forum_identifiants' => 'Identificadores pessoais',
253
+    'form_forum_indiquer_nom_email' => 'Indicar aqui o seu nome e o seu endereço email. O seu identificador pessoal ser-lhe-á enviado rapidamente por correio electrónico.',
254
+    'form_forum_login' => 'login:',
255
+    'form_forum_message_auto' => '(esta é uma mensagem automática)',
256
+    'form_forum_pass' => 'palavra-passe',
257
+    'form_forum_probleme_mail' => 'Problema de mail :o identificador não pôde ser enviado',
258
+    'form_forum_voici1' => 'Aqui estão os seus dados para poder aceder ao sítio Internet do  "@nom_site_spip@" (@adresse_site@):',
259
+    'form_forum_voici2' => 'Eis os seus identificadores para propor artigos no
260 260
  sítio "@nom_site_spip@" (@adresse_login@):',
261
-	'form_indiquer_email' => 'Por favor indique o seu endereço email.',
262
-	'form_indiquer_nom' => 'Por favor indique o seu nome.',
263
-	'form_indiquer_nom_site' => 'Por favor indique o nome do seu sítio.',
264
-	'form_pet_deja_enregistre' => 'Este sítio já está registado',
265
-	'form_pet_signature_pasprise' => 'A sua assinatura não está tomada em conta.',
266
-	'form_prop_confirmer_envoi' => 'Confirmar o envio',
267
-	'form_prop_description' => 'Descrição/comentário',
268
-	'form_prop_enregistre' => 'A sua proposta foi registada. Aparecerá online após a validação pelos responsáveis deste sítio.',
269
-	'form_prop_envoyer' => 'Enviar uma mensagem',
270
-	'form_prop_indiquer_email' => 'Por favor indique um endereço email válido',
271
-	'form_prop_indiquer_nom_site' => 'Por favor indique o nome do sítio.',
272
-	'form_prop_indiquer_sujet' => 'Por favor indique um tema',
273
-	'form_prop_message_envoye' => 'Mensagem enviada',
274
-	'form_prop_non_enregistre' => 'A sua proposta não foi registada.',
275
-	'form_prop_sujet' => 'Tema',
276
-	'form_prop_url_site' => 'Endereço (URL) do sítio',
277
-	'forum_non_inscrit' => 'Não está inscrito, ou o endereço ou a palavra-passe estão errados.',
278
-	'forum_par_auteur' => 'por @auteur@',
279
-	'forum_titre_erreur' => 'Erro...',
261
+    'form_indiquer_email' => 'Por favor indique o seu endereço email.',
262
+    'form_indiquer_nom' => 'Por favor indique o seu nome.',
263
+    'form_indiquer_nom_site' => 'Por favor indique o nome do seu sítio.',
264
+    'form_pet_deja_enregistre' => 'Este sítio já está registado',
265
+    'form_pet_signature_pasprise' => 'A sua assinatura não está tomada em conta.',
266
+    'form_prop_confirmer_envoi' => 'Confirmar o envio',
267
+    'form_prop_description' => 'Descrição/comentário',
268
+    'form_prop_enregistre' => 'A sua proposta foi registada. Aparecerá online após a validação pelos responsáveis deste sítio.',
269
+    'form_prop_envoyer' => 'Enviar uma mensagem',
270
+    'form_prop_indiquer_email' => 'Por favor indique um endereço email válido',
271
+    'form_prop_indiquer_nom_site' => 'Por favor indique o nome do sítio.',
272
+    'form_prop_indiquer_sujet' => 'Por favor indique um tema',
273
+    'form_prop_message_envoye' => 'Mensagem enviada',
274
+    'form_prop_non_enregistre' => 'A sua proposta não foi registada.',
275
+    'form_prop_sujet' => 'Tema',
276
+    'form_prop_url_site' => 'Endereço (URL) do sítio',
277
+    'forum_non_inscrit' => 'Não está inscrito, ou o endereço ou a palavra-passe estão errados.',
278
+    'forum_par_auteur' => 'por @auteur@',
279
+    'forum_titre_erreur' => 'Erro...',
280 280
 
281
-	// I
282
-	'ical_texte_rss_articles' => 'O ficheiro «backend» dos artigos deste sítio encontra-se neste endereço:',
283
-	'ical_texte_rss_articles2' => 'Pode igualmente obter os ficheiros «backend» para os artigos de cada rubrica do sítio:',
284
-	'ical_texte_rss_breves' => 'Existe também um ficheiro contendo notícias do sítio. Especificando um número de rubrica, obterá unicamente as notícias dessa rubrica.',
285
-	'icone_a_suivre' => 'Continua',
286
-	'icone_admin_site' => 'Administração do sítio',
287
-	'icone_agenda' => 'Agenda e correio',
288
-	'icone_aide_ligne' => 'Ajuda',
289
-	'icone_articles' => 'Artigos',
290
-	'icone_auteurs' => 'Autores',
291
-	'icone_brouteur' => 'Navegação rápida',
292
-	'icone_configuration_site' => 'Configuração',
293
-	'icone_configurer_site' => 'Configurar o seu sítio',
294
-	'icone_creer_nouvel_auteur' => 'Criar um novo autor',
295
-	'icone_creer_rubrique' => 'Criar uma rubrica',
296
-	'icone_creer_sous_rubrique' => 'Criar uma sub-rubrica',
297
-	'icone_deconnecter' => 'Sair',
298
-	'icone_discussions' => 'Discussões',
299
-	'icone_doc_rubrique' => 'Documentos das rubricas',
300
-	'icone_ecrire_article' => 'Escrever um novo artigo',
301
-	'icone_edition_site' => 'Edição',
302
-	'icone_gestion_langues' => 'Opções de idiomas',
303
-	'icone_informations_personnelles' => 'Informações pessoais',
304
-	'icone_interface_complet' => 'interface completa',
305
-	'icone_interface_simple' => 'Interface simplificada',
306
-	'icone_maintenance_site' => 'Manutenção do sítio',
307
-	'icone_messagerie_personnelle' => 'Mensagens privadas',
308
-	'icone_repartition_debut' => 'Exibir a distribuição desde o início',
309
-	'icone_rubriques' => 'Rubricas',
310
-	'icone_sauver_site' => 'Cópia de segurança do sítio',
311
-	'icone_site_entier' => 'Todo o sítio',
312
-	'icone_sites_references' => 'Sítios referenciados',
313
-	'icone_statistiques' => 'Estatísticas do sítio',
314
-	'icone_suivi_activite' => 'Acompanhar a actividade do sítio',
315
-	'icone_suivi_actualite' => 'Evolução do sítio',
316
-	'icone_suivi_pettions' => 'Seguir/gerir os abaixo-assinados',
317
-	'icone_suivi_revisions' => 'Modificações dos artigos',
318
-	'icone_supprimer_document' => 'Suprimir este documento',
319
-	'icone_supprimer_image' => 'Suprimir esta imagem',
320
-	'icone_tous_articles' => 'Todos os seus artigos',
321
-	'icone_tous_auteur' => 'Todos os autores',
322
-	'icone_tous_visiteur' => 'Todos os visitantes',
323
-	'icone_visiter_site' => 'Visitar o sítio público',
324
-	'icone_voir_en_ligne' => 'Ver online',
325
-	'img_indisponible' => 'imagem indisponível',
326
-	'impossible' => 'impossível',
327
-	'info_a_suivre' => 'A SEGUIR »',
328
-	'info_acces_interdit' => 'Acesso proibido',
329
-	'info_acces_refuse' => 'Acesso recusado',
330
-	'info_action' => 'Acção : @action@',
331
-	'info_administrer_rubriques' => 'Pode administrar esta rubrica e as suas sub-rubricas',
332
-	'info_adresse_non_indiquee' => 'Não indicou endereço a testar !',
333
-	'info_aide' => 'AJUDA',
334
-	'info_ajouter_mot' => 'Acrescentar esta palavra',
335
-	'info_annonce' => 'ANÚNCIO',
336
-	'info_annonces_generales' => 'Anúncios gerais :',
337
-	'info_article_propose' => 'Artigo proposto',
338
-	'info_article_publie' => 'Artigo publicado',
339
-	'info_article_redaction' => 'Artigo em curso de redacção',
340
-	'info_article_refuse' => 'Artigo recusado',
341
-	'info_article_supprime' => 'Artigo suprimido',
342
-	'info_articles' => 'Artigos',
343
-	'info_articles_a_valider' => 'Os artigos a validar',
344
-	'info_articles_nb' => '@nb@ artigos',
345
-	'info_articles_proposes' => 'Artigos propostos',
346
-	'info_articles_un' => '1 artigo',
347
-	'info_auteurs_nombre' => 'autor(es) :',
348
-	'info_authentification_ftp' => 'Autenticação (por FTP)',
349
-	'info_breves_2' => 'notícias',
350
-	'info_breves_nb' => '@nb@ notícias',
351
-	'info_breves_un' => '1 notícia',
352
-	'info_connexion_refusee' => 'Ligação recusada',
353
-	'info_contact_developpeur' => 'Por favor contacte um programador',
354
-	'info_contenance' => 'Este sítio contém:',
355
-	'info_contribution' => 'contribuições de fórum',
356
-	'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.',
357
-	'info_copyright_doc' => 'Para mais informações, visite o sítio <a href="@spipnet@">@spipnet_affiche@</a',
358
-	'info_copyright_gpl' => 'sob licença GPL',
359
-	'info_cours_edition' => 'Os seus artigos em curso de redacção', # MODIF
360
-	'info_creer_repertoire' => 'Por favor crie um ficheiro ou um directório chamado :',
361
-	'info_creer_repertoire_2' => 'dentro do sub-directório <b>@repertoire@</b>, depois :',
362
-	'info_creer_vignette' => 'criação automática de miniatura',
363
-	'info_creerdansrubrique_non_autorise' => 'Não tem direitos suficientes para criar conteúdo nesta rubrica.',
364
-	'info_deplier' => 'Desenvolver',
365
-	'info_descriptif_nombre' => 'descritivo(s) :',
366
-	'info_description' => 'Descrição :',
367
-	'info_description_2' => 'Descrição :',
368
-	'info_dimension' => 'Dimensões :',
369
-	'info_documents_nb' => '@nb@ documentos',
370
-	'info_documents_un' => '1 documento',
371
-	'info_ecire_message_prive' => 'Escrever uma mensagem privada',
372
-	'info_email_invalide' => 'Endereço email inválido.',
373
-	'info_en_cours_validation' => 'Os seus artigos em curso de redação',
374
-	'info_en_ligne' => 'Actualmente online:',
375
-	'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor',
376
-	'info_erreur_requete' => 'Erro no pedido :',
377
-	'info_erreur_squelette2' => 'Modelo <b>@fichier@</b> não disponível...',
378
-	'info_erreur_systeme' => 'Erro de Sistema (errno @errsys@)',
379
-	'info_erreur_systeme2' => 'O disco rígido poderá estar cheio, ou a base de dados danificada.<br />
281
+    // I
282
+    'ical_texte_rss_articles' => 'O ficheiro «backend» dos artigos deste sítio encontra-se neste endereço:',
283
+    'ical_texte_rss_articles2' => 'Pode igualmente obter os ficheiros «backend» para os artigos de cada rubrica do sítio:',
284
+    'ical_texte_rss_breves' => 'Existe também um ficheiro contendo notícias do sítio. Especificando um número de rubrica, obterá unicamente as notícias dessa rubrica.',
285
+    'icone_a_suivre' => 'Continua',
286
+    'icone_admin_site' => 'Administração do sítio',
287
+    'icone_agenda' => 'Agenda e correio',
288
+    'icone_aide_ligne' => 'Ajuda',
289
+    'icone_articles' => 'Artigos',
290
+    'icone_auteurs' => 'Autores',
291
+    'icone_brouteur' => 'Navegação rápida',
292
+    'icone_configuration_site' => 'Configuração',
293
+    'icone_configurer_site' => 'Configurar o seu sítio',
294
+    'icone_creer_nouvel_auteur' => 'Criar um novo autor',
295
+    'icone_creer_rubrique' => 'Criar uma rubrica',
296
+    'icone_creer_sous_rubrique' => 'Criar uma sub-rubrica',
297
+    'icone_deconnecter' => 'Sair',
298
+    'icone_discussions' => 'Discussões',
299
+    'icone_doc_rubrique' => 'Documentos das rubricas',
300
+    'icone_ecrire_article' => 'Escrever um novo artigo',
301
+    'icone_edition_site' => 'Edição',
302
+    'icone_gestion_langues' => 'Opções de idiomas',
303
+    'icone_informations_personnelles' => 'Informações pessoais',
304
+    'icone_interface_complet' => 'interface completa',
305
+    'icone_interface_simple' => 'Interface simplificada',
306
+    'icone_maintenance_site' => 'Manutenção do sítio',
307
+    'icone_messagerie_personnelle' => 'Mensagens privadas',
308
+    'icone_repartition_debut' => 'Exibir a distribuição desde o início',
309
+    'icone_rubriques' => 'Rubricas',
310
+    'icone_sauver_site' => 'Cópia de segurança do sítio',
311
+    'icone_site_entier' => 'Todo o sítio',
312
+    'icone_sites_references' => 'Sítios referenciados',
313
+    'icone_statistiques' => 'Estatísticas do sítio',
314
+    'icone_suivi_activite' => 'Acompanhar a actividade do sítio',
315
+    'icone_suivi_actualite' => 'Evolução do sítio',
316
+    'icone_suivi_pettions' => 'Seguir/gerir os abaixo-assinados',
317
+    'icone_suivi_revisions' => 'Modificações dos artigos',
318
+    'icone_supprimer_document' => 'Suprimir este documento',
319
+    'icone_supprimer_image' => 'Suprimir esta imagem',
320
+    'icone_tous_articles' => 'Todos os seus artigos',
321
+    'icone_tous_auteur' => 'Todos os autores',
322
+    'icone_tous_visiteur' => 'Todos os visitantes',
323
+    'icone_visiter_site' => 'Visitar o sítio público',
324
+    'icone_voir_en_ligne' => 'Ver online',
325
+    'img_indisponible' => 'imagem indisponível',
326
+    'impossible' => 'impossível',
327
+    'info_a_suivre' => 'A SEGUIR »',
328
+    'info_acces_interdit' => 'Acesso proibido',
329
+    'info_acces_refuse' => 'Acesso recusado',
330
+    'info_action' => 'Acção : @action@',
331
+    'info_administrer_rubriques' => 'Pode administrar esta rubrica e as suas sub-rubricas',
332
+    'info_adresse_non_indiquee' => 'Não indicou endereço a testar !',
333
+    'info_aide' => 'AJUDA',
334
+    'info_ajouter_mot' => 'Acrescentar esta palavra',
335
+    'info_annonce' => 'ANÚNCIO',
336
+    'info_annonces_generales' => 'Anúncios gerais :',
337
+    'info_article_propose' => 'Artigo proposto',
338
+    'info_article_publie' => 'Artigo publicado',
339
+    'info_article_redaction' => 'Artigo em curso de redacção',
340
+    'info_article_refuse' => 'Artigo recusado',
341
+    'info_article_supprime' => 'Artigo suprimido',
342
+    'info_articles' => 'Artigos',
343
+    'info_articles_a_valider' => 'Os artigos a validar',
344
+    'info_articles_nb' => '@nb@ artigos',
345
+    'info_articles_proposes' => 'Artigos propostos',
346
+    'info_articles_un' => '1 artigo',
347
+    'info_auteurs_nombre' => 'autor(es) :',
348
+    'info_authentification_ftp' => 'Autenticação (por FTP)',
349
+    'info_breves_2' => 'notícias',
350
+    'info_breves_nb' => '@nb@ notícias',
351
+    'info_breves_un' => '1 notícia',
352
+    'info_connexion_refusee' => 'Ligação recusada',
353
+    'info_contact_developpeur' => 'Por favor contacte um programador',
354
+    'info_contenance' => 'Este sítio contém:',
355
+    'info_contribution' => 'contribuições de fórum',
356
+    'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.',
357
+    'info_copyright_doc' => 'Para mais informações, visite o sítio <a href="@spipnet@">@spipnet_affiche@</a',
358
+    'info_copyright_gpl' => 'sob licença GPL',
359
+    'info_cours_edition' => 'Os seus artigos em curso de redacção', # MODIF
360
+    'info_creer_repertoire' => 'Por favor crie um ficheiro ou um directório chamado :',
361
+    'info_creer_repertoire_2' => 'dentro do sub-directório <b>@repertoire@</b>, depois :',
362
+    'info_creer_vignette' => 'criação automática de miniatura',
363
+    'info_creerdansrubrique_non_autorise' => 'Não tem direitos suficientes para criar conteúdo nesta rubrica.',
364
+    'info_deplier' => 'Desenvolver',
365
+    'info_descriptif_nombre' => 'descritivo(s) :',
366
+    'info_description' => 'Descrição :',
367
+    'info_description_2' => 'Descrição :',
368
+    'info_dimension' => 'Dimensões :',
369
+    'info_documents_nb' => '@nb@ documentos',
370
+    'info_documents_un' => '1 documento',
371
+    'info_ecire_message_prive' => 'Escrever uma mensagem privada',
372
+    'info_email_invalide' => 'Endereço email inválido.',
373
+    'info_en_cours_validation' => 'Os seus artigos em curso de redação',
374
+    'info_en_ligne' => 'Actualmente online:',
375
+    'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor',
376
+    'info_erreur_requete' => 'Erro no pedido :',
377
+    'info_erreur_squelette2' => 'Modelo <b>@fichier@</b> não disponível...',
378
+    'info_erreur_systeme' => 'Erro de Sistema (errno @errsys@)',
379
+    'info_erreur_systeme2' => 'O disco rígido poderá estar cheio, ou a base de dados danificada.<br />
380 380
 <span style="color:red;">Tente <a href=\'@script@\'>reparar a base de dados </a>, ou contacte o seu fornecedor de internet.</span>',
381
-	'info_fini' => 'Terminou !',
382
-	'info_format_image' => 'Formatos de imagens que podem ser utilizadas para criar vinhetas : @gd_formats@.',
383
-	'info_format_non_defini' => 'formato não definido',
384
-	'info_grand_ecran' => 'Ecrã total',
385
-	'info_image_aide' => 'AJUDA',
386
-	'info_image_process_titre' => 'Como criar miniaturas',
387
-	'info_impossible_lire_page' => '<b>Erro !</b> Impossível ler a página<tt><html>@test_proxy@</html></tt> através do proxy <tt>',
388
-	'info_installation_systeme_publication' => 'Instalação do sistema de publicação',
389
-	'info_installer_documents' => 'Pode instalar automaticamente todos os documentos contidos na pasta @upload@.',
390
-	'info_installer_ftp' => 'Como administrador, pode instalar (por FTP) ficheiros na pasta @upload@ para depois seleccioná-los directamente aqui.',
391
-	'info_installer_images' => 'Pode instalar imagens nos formatos JPEG, GIF e PNG.',
392
-	'info_installer_images_dossier' => 'Instalar imagens na pasta @upload@ para poder seleccioná-los aqui.',
393
-	'info_interface_complete' => 'Interface completa',
394
-	'info_interface_simple' => 'Interface simplificada',
395
-	'info_joindre_document_article' => 'Pode juntar a este artigo documentos de tipo',
396
-	'info_joindre_document_rubrique' => 'Pode acrescentar a esta rubrica documentos de tipo',
397
-	'info_joindre_documents_article' => 'Pode juntar ao seu artigo documentos de tipo :',
398
-	'info_l_article' => 'o artigo',
399
-	'info_la_breve' => 'a notícia',
400
-	'info_la_rubrique' => 'a rubrica',
401
-	'info_langue_principale' => 'Idioma principal do sítio',
402
-	'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ pixels',
403
-	'info_les_auteurs_1' => 'por @les_auteurs@',
404
-	'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.',
405
-	'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).',
406
-	'info_mail_fournisseur' => 'você@seucorreio.com',
407
-	'info_message_2' => 'MENSAGEM',
408
-	'info_message_supprime' => 'MENSAGEM ELIMINADA',
409
-	'info_messages_nb' => '@nb@ mensagens',
410
-	'info_messages_un' => '1 mensagem',
411
-	'info_mise_en_ligne' => 'Data de colocação online :',
412
-	'info_modification_parametres_securite' => 'modificação dos parâmetros de segurança',
413
-	'info_mois_courant' => 'Durante o mês :',
414
-	'info_mot_cle_ajoute' => 'A seguinte palavra-chave foi acrescentada a',
415
-	'info_multi_herit' => 'Idioma por defeito',
416
-	'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhadas</u> beneficiam de uma tradução de todos os textos da interface. Se seleccionar esses idiomas, muitos elementos do sítio público (datas, formulários) serão automaticamente traduzidos. Para os idiomas não sublinhadas, esses elementos aparecerão no idioma principal do sítio.',
417
-	'info_multilinguisme' => 'Multilinguismo',
418
-	'info_nom_non_utilisateurs_connectes' => 'O seu nome não aparece na lista dos utilizadores ligados.',
419
-	'info_nom_utilisateurs_connectes' => 'O seu nome aparece na lista dos utilizadores ligados.',
420
-	'info_nombre_en_ligne' => 'Actualmente online :',
421
-	'info_non_resultat' => 'Nenhum resultado para "@cherche_mot@"',
422
-	'info_non_utilisation_messagerie' => 'Não utiliza o correio interno deste sítio.',
423
-	'info_nouveau_message' => 'TEM UMA NOVA MENSAGEM',
424
-	'info_nouveaux_messages' => 'TEM @total_messages@ NOVAS MENSAGENS',
425
-	'info_numero_abbreviation' => '<N° >',
426
-	'info_obligatoire' => 'Esta informação é obrigatória',
427
-	'info_pense_bete' => 'MEMORANDO',
428
-	'info_petit_ecran' => 'Ecrã Pequeno',
429
-	'info_petition_close' => 'Petição encerrada',
430
-	'info_pixels' => 'pixels',
431
-	'info_plusieurs_mots_trouves' => 'Muitas palavras-chave encontradas para "@cherche_mot@":',
432
-	'info_portfolio_automatique' => 'Portfolio automático :',
433
-	'info_premier_resultat' => '[@debut_limit@ primeiros resultados em @total@]',
434
-	'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados em @total@]',
435
-	'info_propose_1' => '[@nom_site_spip@] Proposto : @titre@',
436
-	'info_propose_2' => 'Artigos propostos
381
+    'info_fini' => 'Terminou !',
382
+    'info_format_image' => 'Formatos de imagens que podem ser utilizadas para criar vinhetas : @gd_formats@.',
383
+    'info_format_non_defini' => 'formato não definido',
384
+    'info_grand_ecran' => 'Ecrã total',
385
+    'info_image_aide' => 'AJUDA',
386
+    'info_image_process_titre' => 'Como criar miniaturas',
387
+    'info_impossible_lire_page' => '<b>Erro !</b> Impossível ler a página<tt><html>@test_proxy@</html></tt> através do proxy <tt>',
388
+    'info_installation_systeme_publication' => 'Instalação do sistema de publicação',
389
+    'info_installer_documents' => 'Pode instalar automaticamente todos os documentos contidos na pasta @upload@.',
390
+    'info_installer_ftp' => 'Como administrador, pode instalar (por FTP) ficheiros na pasta @upload@ para depois seleccioná-los directamente aqui.',
391
+    'info_installer_images' => 'Pode instalar imagens nos formatos JPEG, GIF e PNG.',
392
+    'info_installer_images_dossier' => 'Instalar imagens na pasta @upload@ para poder seleccioná-los aqui.',
393
+    'info_interface_complete' => 'Interface completa',
394
+    'info_interface_simple' => 'Interface simplificada',
395
+    'info_joindre_document_article' => 'Pode juntar a este artigo documentos de tipo',
396
+    'info_joindre_document_rubrique' => 'Pode acrescentar a esta rubrica documentos de tipo',
397
+    'info_joindre_documents_article' => 'Pode juntar ao seu artigo documentos de tipo :',
398
+    'info_l_article' => 'o artigo',
399
+    'info_la_breve' => 'a notícia',
400
+    'info_la_rubrique' => 'a rubrica',
401
+    'info_langue_principale' => 'Idioma principal do sítio',
402
+    'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ pixels',
403
+    'info_les_auteurs_1' => 'por @les_auteurs@',
404
+    'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.',
405
+    'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).',
406
+    'info_mail_fournisseur' => 'você@seucorreio.com',
407
+    'info_message_2' => 'MENSAGEM',
408
+    'info_message_supprime' => 'MENSAGEM ELIMINADA',
409
+    'info_messages_nb' => '@nb@ mensagens',
410
+    'info_messages_un' => '1 mensagem',
411
+    'info_mise_en_ligne' => 'Data de colocação online :',
412
+    'info_modification_parametres_securite' => 'modificação dos parâmetros de segurança',
413
+    'info_mois_courant' => 'Durante o mês :',
414
+    'info_mot_cle_ajoute' => 'A seguinte palavra-chave foi acrescentada a',
415
+    'info_multi_herit' => 'Idioma por defeito',
416
+    'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhadas</u> beneficiam de uma tradução de todos os textos da interface. Se seleccionar esses idiomas, muitos elementos do sítio público (datas, formulários) serão automaticamente traduzidos. Para os idiomas não sublinhadas, esses elementos aparecerão no idioma principal do sítio.',
417
+    'info_multilinguisme' => 'Multilinguismo',
418
+    'info_nom_non_utilisateurs_connectes' => 'O seu nome não aparece na lista dos utilizadores ligados.',
419
+    'info_nom_utilisateurs_connectes' => 'O seu nome aparece na lista dos utilizadores ligados.',
420
+    'info_nombre_en_ligne' => 'Actualmente online :',
421
+    'info_non_resultat' => 'Nenhum resultado para "@cherche_mot@"',
422
+    'info_non_utilisation_messagerie' => 'Não utiliza o correio interno deste sítio.',
423
+    'info_nouveau_message' => 'TEM UMA NOVA MENSAGEM',
424
+    'info_nouveaux_messages' => 'TEM @total_messages@ NOVAS MENSAGENS',
425
+    'info_numero_abbreviation' => '<N° >',
426
+    'info_obligatoire' => 'Esta informação é obrigatória',
427
+    'info_pense_bete' => 'MEMORANDO',
428
+    'info_petit_ecran' => 'Ecrã Pequeno',
429
+    'info_petition_close' => 'Petição encerrada',
430
+    'info_pixels' => 'pixels',
431
+    'info_plusieurs_mots_trouves' => 'Muitas palavras-chave encontradas para "@cherche_mot@":',
432
+    'info_portfolio_automatique' => 'Portfolio automático :',
433
+    'info_premier_resultat' => '[@debut_limit@ primeiros resultados em @total@]',
434
+    'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados em @total@]',
435
+    'info_propose_1' => '[@nom_site_spip@] Proposto : @titre@',
436
+    'info_propose_2' => 'Artigos propostos
437 437
 ----------------',
438
-	'info_propose_3' => 'O artigo "@titre@" é proposto para publicação.',
439
-	'info_propose_4' => 'Está convidado a vir consultá-lo e a dar a sua opinião',
440
-	'info_propose_5' => 'no fórum que lhe está ligado. Está disponível no endereço:',
441
-	'info_publie_01' => 'O artigo "@titre@" foi validado por @connect_nom@.',
442
-	'info_publie_1' => '[@nom_site_spip@] PUBLICADO : @titre@',
443
-	'info_publie_2' => 'Artigo publicado
438
+    'info_propose_3' => 'O artigo "@titre@" é proposto para publicação.',
439
+    'info_propose_4' => 'Está convidado a vir consultá-lo e a dar a sua opinião',
440
+    'info_propose_5' => 'no fórum que lhe está ligado. Está disponível no endereço:',
441
+    'info_publie_01' => 'O artigo "@titre@" foi validado por @connect_nom@.',
442
+    'info_publie_1' => '[@nom_site_spip@] PUBLICADO : @titre@',
443
+    'info_publie_2' => 'Artigo publicado
444 444
 --------------',
445
-	'info_rechercher' => 'Procurar',
446
-	'info_rechercher_02' => 'Procurar :',
447
-	'info_remplacer_vignette' => 'Substituir a miniatura por defeito por um logotipo personalizado :',
448
-	'info_rubriques_nb' => '@nb@ rubricas',
449
-	'info_rubriques_un' => '1 rubrica',
450
-	'info_sans_titre_2' => 'sem título',
451
-	'info_selectionner_fichier' => 'Pode seleccionar um ficheiro da pasta @upload@',
452
-	'info_selectionner_fichier_2' => 'Seleccionar um ficheiro :',
453
-	'info_sites_nb' => '@nb@ sítios',
454
-	'info_sites_un' => '1 sítio',
455
-	'info_supprimer_vignette' => 'suprimir a miniatura',
456
-	'info_symbole_bleu' => 'O símbolo <b>azul</b> indica um<b>memorando </b>: isto é uma mensagem para o seu uso pessoal.',
457
-	'info_symbole_jaune' => 'O símbolo<b>amarelo</b> indica um <b>anúncio a todos os redactores</b> : modificável por todos os administradores, e visível por todos os redactores.',
458
-	'info_symbole_vert' => 'O símbolo<b>verde</b> indica as <b>mensagens trocadas com outros utilizadores</b> do sítio.',
459
-	'info_telecharger_nouveau_logo' => 'Telecarregar um novo logotipo :',
460
-	'info_telecharger_ordinateur' => 'Telecarregar do seu computador :',
461
-	'info_tous_resultats_enregistres' => '[todos os  resultados estão registados]',
462
-	'info_tout_afficher' => 'Exibir tudo',
463
-	'info_travaux_texte' => 'Este sítio ainda não está configurado. Volte mais tarde...',
464
-	'info_travaux_titre' => 'Sítio em construção',
465
-	'info_trop_resultat' => 'Demasiado resultados para "@cherche_mot@". Por favor afine a pesquisa.',
466
-	'info_utilisation_messagerie_interne' => 'Você utiliza o correio interno deste sítio.',
467
-	'info_valider_lien' => 'validar esta ligação',
468
-	'info_verifier_image' => ', Por favor verifique se as suas imagens foram transferidas correctamente.',
469
-	'info_vignette_defaut' => 'Miniatura por defeito',
470
-	'info_vignette_personnalisee' => 'Miniatura personalizada',
471
-	'info_visite' => 'visita :',
472
-	'info_vos_rendez_vous' => 'Os seus futuros encontros',
473
-	'infos_vos_pense_bete' => 'Os seus memorandos',
445
+    'info_rechercher' => 'Procurar',
446
+    'info_rechercher_02' => 'Procurar :',
447
+    'info_remplacer_vignette' => 'Substituir a miniatura por defeito por um logotipo personalizado :',
448
+    'info_rubriques_nb' => '@nb@ rubricas',
449
+    'info_rubriques_un' => '1 rubrica',
450
+    'info_sans_titre_2' => 'sem título',
451
+    'info_selectionner_fichier' => 'Pode seleccionar um ficheiro da pasta @upload@',
452
+    'info_selectionner_fichier_2' => 'Seleccionar um ficheiro :',
453
+    'info_sites_nb' => '@nb@ sítios',
454
+    'info_sites_un' => '1 sítio',
455
+    'info_supprimer_vignette' => 'suprimir a miniatura',
456
+    'info_symbole_bleu' => 'O símbolo <b>azul</b> indica um<b>memorando </b>: isto é uma mensagem para o seu uso pessoal.',
457
+    'info_symbole_jaune' => 'O símbolo<b>amarelo</b> indica um <b>anúncio a todos os redactores</b> : modificável por todos os administradores, e visível por todos os redactores.',
458
+    'info_symbole_vert' => 'O símbolo<b>verde</b> indica as <b>mensagens trocadas com outros utilizadores</b> do sítio.',
459
+    'info_telecharger_nouveau_logo' => 'Telecarregar um novo logotipo :',
460
+    'info_telecharger_ordinateur' => 'Telecarregar do seu computador :',
461
+    'info_tous_resultats_enregistres' => '[todos os  resultados estão registados]',
462
+    'info_tout_afficher' => 'Exibir tudo',
463
+    'info_travaux_texte' => 'Este sítio ainda não está configurado. Volte mais tarde...',
464
+    'info_travaux_titre' => 'Sítio em construção',
465
+    'info_trop_resultat' => 'Demasiado resultados para "@cherche_mot@". Por favor afine a pesquisa.',
466
+    'info_utilisation_messagerie_interne' => 'Você utiliza o correio interno deste sítio.',
467
+    'info_valider_lien' => 'validar esta ligação',
468
+    'info_verifier_image' => ', Por favor verifique se as suas imagens foram transferidas correctamente.',
469
+    'info_vignette_defaut' => 'Miniatura por defeito',
470
+    'info_vignette_personnalisee' => 'Miniatura personalizada',
471
+    'info_visite' => 'visita :',
472
+    'info_vos_rendez_vous' => 'Os seus futuros encontros',
473
+    'infos_vos_pense_bete' => 'Os seus memorandos',
474 474
 
475
-	// L
476
-	'label_ajout_id_rapide' => 'Adição rápida',
477
-	'label_poids_fichier' => 'Dimensões',
478
-	'lien_afficher_icones_seuls' => 'Exibir apenas os ícones',
479
-	'lien_afficher_texte_icones' => 'Exibir ícones e o texto',
480
-	'lien_afficher_texte_seul' => 'Exibir apenas o texto',
481
-	'lien_liberer' => 'desbloquear',
482
-	'lien_liberer_tous' => 'desbloquear estes artigos',
483
-	'lien_nouvea_pense_bete' => 'NOVO MEMORANDO',
484
-	'lien_nouveau_message' => 'NOVA MENSAGEM',
485
-	'lien_nouvelle_annonce' => 'NOVO ANÚNCIO',
486
-	'lien_petitions' => 'PETIÇÃO',
487
-	'lien_popularite' => 'popularidade : @popularite@%',
488
-	'lien_racine_site' => 'RAIZ DO SÍTIO',
489
-	'lien_reessayer' => 'tentar de novo',
490
-	'lien_repondre_message' => 'Responder a esta mensagem',
491
-	'lien_supprimer' => 'eliminar',
492
-	'lien_tout_afficher' => 'Exibir tudo',
493
-	'lien_visite_site' => 'visitar este sítio',
494
-	'lien_visites' => '@visites@ visitas',
495
-	'lien_voir_auteur' => 'Ver este autor',
496
-	'ligne' => 'Linha',
497
-	'login' => 'Ligação',
498
-	'login_acces_prive' => 'acesso ao espaço privado',
499
-	'login_autre_identifiant' => 'ligar-se sob um outro identificador',
500
-	'login_cookie_accepte' => 'Por favor configure o seu navegador para que os aceite (pelo menos para este sítio).',
501
-	'login_cookie_oblige' => 'Para se identificar de maneira segura neste sítio, deve aceitar os cookies.',
502
-	'login_deconnexion_ok' => 'Ligação terminada.',
503
-	'login_erreur_pass' => 'Erro de palavra-passe',
504
-	'login_espace_prive' => 'área privada',
505
-	'login_identifiant_inconnu' => 'O identificador « @login@ » é desconhecido.',
506
-	'login_login' => 'Login :',
507
-	'login_login2' => 'Login ou endereço de e-mail :',
508
-	'login_login_pass_incorrect' => '(Login ou palavra-passe incorrecta.)',
509
-	'login_motpasseoublie' => 'palavra - passe esquecida ?',
510
-	'login_non_securise' => 'Atenção, este formulário não é seguro.
475
+    // L
476
+    'label_ajout_id_rapide' => 'Adição rápida',
477
+    'label_poids_fichier' => 'Dimensões',
478
+    'lien_afficher_icones_seuls' => 'Exibir apenas os ícones',
479
+    'lien_afficher_texte_icones' => 'Exibir ícones e o texto',
480
+    'lien_afficher_texte_seul' => 'Exibir apenas o texto',
481
+    'lien_liberer' => 'desbloquear',
482
+    'lien_liberer_tous' => 'desbloquear estes artigos',
483
+    'lien_nouvea_pense_bete' => 'NOVO MEMORANDO',
484
+    'lien_nouveau_message' => 'NOVA MENSAGEM',
485
+    'lien_nouvelle_annonce' => 'NOVO ANÚNCIO',
486
+    'lien_petitions' => 'PETIÇÃO',
487
+    'lien_popularite' => 'popularidade : @popularite@%',
488
+    'lien_racine_site' => 'RAIZ DO SÍTIO',
489
+    'lien_reessayer' => 'tentar de novo',
490
+    'lien_repondre_message' => 'Responder a esta mensagem',
491
+    'lien_supprimer' => 'eliminar',
492
+    'lien_tout_afficher' => 'Exibir tudo',
493
+    'lien_visite_site' => 'visitar este sítio',
494
+    'lien_visites' => '@visites@ visitas',
495
+    'lien_voir_auteur' => 'Ver este autor',
496
+    'ligne' => 'Linha',
497
+    'login' => 'Ligação',
498
+    'login_acces_prive' => 'acesso ao espaço privado',
499
+    'login_autre_identifiant' => 'ligar-se sob um outro identificador',
500
+    'login_cookie_accepte' => 'Por favor configure o seu navegador para que os aceite (pelo menos para este sítio).',
501
+    'login_cookie_oblige' => 'Para se identificar de maneira segura neste sítio, deve aceitar os cookies.',
502
+    'login_deconnexion_ok' => 'Ligação terminada.',
503
+    'login_erreur_pass' => 'Erro de palavra-passe',
504
+    'login_espace_prive' => 'área privada',
505
+    'login_identifiant_inconnu' => 'O identificador « @login@ » é desconhecido.',
506
+    'login_login' => 'Login :',
507
+    'login_login2' => 'Login ou endereço de e-mail :',
508
+    'login_login_pass_incorrect' => '(Login ou palavra-passe incorrecta.)',
509
+    'login_motpasseoublie' => 'palavra - passe esquecida ?',
510
+    'login_non_securise' => 'Atenção, este formulário não é seguro.
511 511
  Se não quiser que a sua palavra-passe seja
512 512
  interceptada na rede, por favor active Javascript
513 513
  no seu navegador e',
514
-	'login_nouvelle_tentative' => 'Nova tentativa',
515
-	'login_par_ici' => 'Você está registado... por aqui....',
516
-	'login_pass2' => 'Palavra-passe :',
517
-	'login_preferez_refuser' => '<b>Se prefere recusar os cookies</b>, um outro método de ligação (menos seguro) está à sua disposição',
518
-	'login_recharger' => 'carregar de novo esta página ',
519
-	'login_rester_identifie' => 'Permanecer identificado durante alguns dias ', # MODIF
520
-	'login_retour_public' => 'Regresso ao sítio público',
521
-	'login_retour_site' => 'Regresso ao sítio público',
522
-	'login_retoursitepublic' => 'Regresso ao sítio público',
523
-	'login_securise' => 'Login seguro',
524
-	'login_sinscrire' => 'inscrever-se', # MODIF
525
-	'login_test_navigateur' => 'teste navegação/nova ligação',
526
-	'login_verifiez_navigateur' => '(Verifique, porém, que o seu navegador não memorizou a sua palavra-passe...)',
514
+    'login_nouvelle_tentative' => 'Nova tentativa',
515
+    'login_par_ici' => 'Você está registado... por aqui....',
516
+    'login_pass2' => 'Palavra-passe :',
517
+    'login_preferez_refuser' => '<b>Se prefere recusar os cookies</b>, um outro método de ligação (menos seguro) está à sua disposição',
518
+    'login_recharger' => 'carregar de novo esta página ',
519
+    'login_rester_identifie' => 'Permanecer identificado durante alguns dias ', # MODIF
520
+    'login_retour_public' => 'Regresso ao sítio público',
521
+    'login_retour_site' => 'Regresso ao sítio público',
522
+    'login_retoursitepublic' => 'Regresso ao sítio público',
523
+    'login_securise' => 'Login seguro',
524
+    'login_sinscrire' => 'inscrever-se', # MODIF
525
+    'login_test_navigateur' => 'teste navegação/nova ligação',
526
+    'login_verifiez_navigateur' => '(Verifique, porém, que o seu navegador não memorizou a sua palavra-passe...)',
527 527
 
528
-	// M
529
-	'masquer_colonne' => 'Ocultar esta coluna',
530
-	'masquer_trad' => 'ocultar as traduções',
531
-	'module_fichiers_langues' => 'Ficheiros de idioma',
528
+    // M
529
+    'masquer_colonne' => 'Ocultar esta coluna',
530
+    'masquer_trad' => 'ocultar as traduções',
531
+    'module_fichiers_langues' => 'Ficheiros de idioma',
532 532
 
533
-	// N
534
-	'navigateur_pas_redirige' => 'Se o seu navegador não está redireccionado, clique aqui para continuar.',
535
-	'numero' => 'Número',
533
+    // N
534
+    'navigateur_pas_redirige' => 'Se o seu navegador não está redireccionado, clique aqui para continuar.',
535
+    'numero' => 'Número',
536 536
 
537
-	// O
538
-	'occurence' => 'Ocorrência',
539
-	'onglet_affacer_base' => 'Apagar a base de dados',
540
-	'onglet_auteur' => 'O autor',
541
-	'onglet_contenu_site' => 'Conteúdo do sítio',
542
-	'onglet_evolution_visite_mod' => 'Evolução',
543
-	'onglet_fonctions_avances' => 'Funções avançadas',
544
-	'onglet_informations_personnelles' => 'Informações pessoais',
545
-	'onglet_interactivite' => 'Interactividade',
546
-	'onglet_messagerie' => 'Correio',
547
-	'onglet_repartition_rubrique' => 'Distribuição das rubricas',
548
-	'onglet_save_restaur_base' => 'Guardar uma cópia/restaurar a base',
549
-	'onglet_vider_cache' => 'Esvaziar a cache',
537
+    // O
538
+    'occurence' => 'Ocorrência',
539
+    'onglet_affacer_base' => 'Apagar a base de dados',
540
+    'onglet_auteur' => 'O autor',
541
+    'onglet_contenu_site' => 'Conteúdo do sítio',
542
+    'onglet_evolution_visite_mod' => 'Evolução',
543
+    'onglet_fonctions_avances' => 'Funções avançadas',
544
+    'onglet_informations_personnelles' => 'Informações pessoais',
545
+    'onglet_interactivite' => 'Interactividade',
546
+    'onglet_messagerie' => 'Correio',
547
+    'onglet_repartition_rubrique' => 'Distribuição das rubricas',
548
+    'onglet_save_restaur_base' => 'Guardar uma cópia/restaurar a base',
549
+    'onglet_vider_cache' => 'Esvaziar a cache',
550 550
 
551
-	// P
552
-	'pass_choix_pass' => 'Por favor escolha a sua nova palavra-passe',
553
-	'pass_erreur' => 'Erro',
554
-	'pass_erreur_acces_refuse' => '<b>Erro :</b> já não tem acesso a este sítio.',
555
-	'pass_erreur_code_inconnu' => '<b>Erro :</b> este código não corresponde a nenhum dos visitantes com acesso a este sítio.',
556
-	'pass_erreur_non_enregistre' => '<b>Erro :</b> o endereço <tt>@email_oubli@</tt> não está registado neste sítio. ',
557
-	'pass_erreur_non_valide' => '<b>Erro :</b> este email <tt>@email_oubli@</tt> não é válido !  ',
558
-	'pass_erreur_probleme_technique' => '<b>Erro :</b> por causa de um problema técnico, o email não pôde ser enviado.',
559
-	'pass_espace_prive_bla' => 'O espaço privado deste sítio está aberto aos
551
+    // P
552
+    'pass_choix_pass' => 'Por favor escolha a sua nova palavra-passe',
553
+    'pass_erreur' => 'Erro',
554
+    'pass_erreur_acces_refuse' => '<b>Erro :</b> já não tem acesso a este sítio.',
555
+    'pass_erreur_code_inconnu' => '<b>Erro :</b> este código não corresponde a nenhum dos visitantes com acesso a este sítio.',
556
+    'pass_erreur_non_enregistre' => '<b>Erro :</b> o endereço <tt>@email_oubli@</tt> não está registado neste sítio. ',
557
+    'pass_erreur_non_valide' => '<b>Erro :</b> este email <tt>@email_oubli@</tt> não é válido !  ',
558
+    'pass_erreur_probleme_technique' => '<b>Erro :</b> por causa de um problema técnico, o email não pôde ser enviado.',
559
+    'pass_espace_prive_bla' => 'O espaço privado deste sítio está aberto aos
560 560
  visitantes, após inscrição. Uma vez registado poderá consultar os artigos em curso de redacção,
561 561
 propor artigos e participar em todos os fóruns.',
562
-	'pass_forum_bla' => 'Pediu para intervir num fórum
562
+    'pass_forum_bla' => 'Pediu para intervir num fórum
563 563
  reservado aos visitadores registados.',
564
-	'pass_indiquez_cidessous' => 'Indique abaixo o endereço email sob o qual se registou. Receberá
564
+    'pass_indiquez_cidessous' => 'Indique abaixo o endereço email sob o qual se registou. Receberá
565 565
  um mail que indicará o procedimento a seguir para
566 566
         recuperar o seu acesso.',
567
-	'pass_mail_passcookie' => '(esta é uma mensagem automática)
567
+    'pass_mail_passcookie' => '(esta é uma mensagem automática)
568 568
 Para recuperar o seu acesso ao sítio
569 569
 @nom_site_spip@ (@adresse_site@)
570 570
 
@@ -574,137 +574,137 @@  discard block
 block discarded – undo
574 574
 
575 575
 Poderá então introduzir uma nova palavra-passe e reconectar-se ao sítio.
576 576
 ',
577
-	'pass_mot_oublie' => 'Palavra-passe esquecida',
578
-	'pass_nouveau_enregistre' => 'A sua nova palavra-passe foi registada',
579
-	'pass_nouveau_pass' => 'Nova palavra-passe',
580
-	'pass_ok' => 'OK',
581
-	'pass_oubli_mot' => 'Palavra-passe esquecida',
582
-	'pass_procedure_changer' => 'Para alterar a sua palavra-passe, temos primeiro de verificar a sua identidade. Por favor escreva o endereço e-mail associado a esta conta.', # MODIF
583
-	'pass_quitter_fenetre' => 'Fechar esta janela',
584
-	'pass_rappel_login' => 'Recorde : o seu identificador (login) é « @login@ ».',
585
-	'pass_recevoir_mail' => 'Vai receber um email que indica como recuperar o seu acesso ao sítio.', # MODIF
586
-	'pass_retour_public' => 'Regresso ao sítio público',
587
-	'pass_rien_a_faire_ici' => 'Nada a fazer aqui.',
588
-	'pass_vousinscrire' => 'Inscrever-se neste sítio',
589
-	'precedent' => 'anterior',
590
-	'previsualisation' => 'Visualização',
591
-	'previsualiser' => 'Pré-visualizar',
577
+    'pass_mot_oublie' => 'Palavra-passe esquecida',
578
+    'pass_nouveau_enregistre' => 'A sua nova palavra-passe foi registada',
579
+    'pass_nouveau_pass' => 'Nova palavra-passe',
580
+    'pass_ok' => 'OK',
581
+    'pass_oubli_mot' => 'Palavra-passe esquecida',
582
+    'pass_procedure_changer' => 'Para alterar a sua palavra-passe, temos primeiro de verificar a sua identidade. Por favor escreva o endereço e-mail associado a esta conta.', # MODIF
583
+    'pass_quitter_fenetre' => 'Fechar esta janela',
584
+    'pass_rappel_login' => 'Recorde : o seu identificador (login) é « @login@ ».',
585
+    'pass_recevoir_mail' => 'Vai receber um email que indica como recuperar o seu acesso ao sítio.', # MODIF
586
+    'pass_retour_public' => 'Regresso ao sítio público',
587
+    'pass_rien_a_faire_ici' => 'Nada a fazer aqui.',
588
+    'pass_vousinscrire' => 'Inscrever-se neste sítio',
589
+    'precedent' => 'anterior',
590
+    'previsualisation' => 'Visualização',
591
+    'previsualiser' => 'Pré-visualizar',
592 592
 
593
-	// R
594
-	'retour' => 'Retroceder',
593
+    // R
594
+    'retour' => 'Retroceder',
595 595
 
596
-	// S
597
-	'spip_conforme_dtd' => 'SPIP considera esta página em conforme com o seu DOCTYPE :',
598
-	'squelette' => 'modelo',
599
-	'squelette_inclus_ligne' => 'modelo incluído, linha',
600
-	'squelette_ligne' => 'modelo, linha',
601
-	'stats_visites_et_popularite' => '@visites@ visitas ; popularidade : @popularite@',
602
-	'suivant' => 'seguinte',
596
+    // S
597
+    'spip_conforme_dtd' => 'SPIP considera esta página em conforme com o seu DOCTYPE :',
598
+    'squelette' => 'modelo',
599
+    'squelette_inclus_ligne' => 'modelo incluído, linha',
600
+    'squelette_ligne' => 'modelo, linha',
601
+    'stats_visites_et_popularite' => '@visites@ visitas ; popularidade : @popularite@',
602
+    'suivant' => 'seguinte',
603 603
 
604
-	// T
605
-	'taille_go' => '@taille@ Gb',
606
-	'taille_ko' => '@taille@ kb',
607
-	'taille_mo' => '@taille@ Mb',
608
-	'taille_octets' => ' @taille@ bytes',
609
-	'taille_octets_bi' => ' @taille@ bytes',
610
-	'texte_actualite_site_1' => 'Quando estiver familiarizado(a) com a interface, poderá clicar em «',
611
-	'texte_actualite_site_2' => 'interface completa',
612
-	'texte_actualite_site_3' => '» para abrir mais possibilidades.',
613
-	'texte_creation_automatique_vignette' => 'A criação automática de miniaturas de pré-visualização está activada neste sítio. Se instalar a partir deste formulário imagens de formato(s) @gd_formats@, serão acompanhadas de uma miniatura de um tamanho máximo de @taille_preview@ pixels.',
614
-	'texte_documents_associes' => 'Os documentos seguintes estão associados ao artigo,
604
+    // T
605
+    'taille_go' => '@taille@ Gb',
606
+    'taille_ko' => '@taille@ kb',
607
+    'taille_mo' => '@taille@ Mb',
608
+    'taille_octets' => ' @taille@ bytes',
609
+    'taille_octets_bi' => ' @taille@ bytes',
610
+    'texte_actualite_site_1' => 'Quando estiver familiarizado(a) com a interface, poderá clicar em «',
611
+    'texte_actualite_site_2' => 'interface completa',
612
+    'texte_actualite_site_3' => '» para abrir mais possibilidades.',
613
+    'texte_creation_automatique_vignette' => 'A criação automática de miniaturas de pré-visualização está activada neste sítio. Se instalar a partir deste formulário imagens de formato(s) @gd_formats@, serão acompanhadas de uma miniatura de um tamanho máximo de @taille_preview@ pixels.',
614
+    'texte_documents_associes' => 'Os documentos seguintes estão associados ao artigo,
615 615
   mas não foram directamente
616 616
  inseridos nele. Conforme a paginação do sítio público,
617 617
   poderão aparecer sob forma de documentos anexados.',
618
-	'texte_erreur_mise_niveau_base' => 'Erro de base de dados por ocasião do nivelamento.
618
+    'texte_erreur_mise_niveau_base' => 'Erro de base de dados por ocasião do nivelamento.
619 619
    A imagem <b>@fichier@</b> não passou (artigo @id_article@).
620 620
   Note bem esta referência, volte a tentar o nivelamento, e verifique se as imagens aparecem sempre nos artigos.',
621
-	'texte_erreur_visiteur' => 'Tentou aceder à área privada usando um login não autorizado.',
622
-	'texte_inc_auth_1' => 'Você está identificado sob o
621
+    'texte_erreur_visiteur' => 'Tentou aceder à área privada usando um login não autorizado.',
622
+    'texte_inc_auth_1' => 'Você está identificado sob o
623 623
    login <b>@auth_login@</b>, mas este já/ não existe na base de dados.
624 624
  Tente',
625
-	'texte_inc_auth_2' => 'refazer a ligação',
626
-	'texte_inc_auth_3' => ', depois de eventualmente ter fechado e
625
+    'texte_inc_auth_2' => 'refazer a ligação',
626
+    'texte_inc_auth_3' => ', depois de eventualmente ter fechado e
627 627
  voltado a abrir o seu navegador.',
628
-	'texte_inc_config' => 'As modificações efectuadas nestas páginas influenciam muito o
628
+    'texte_inc_config' => 'As modificações efectuadas nestas páginas influenciam muito o
629 629
  funcionamento do seu sítio. Recomendamos que não intervenha enquanto não estiver familiarizado com o funcionamento do sistema SPIP. <br /><br /><b> Em
630 630
  geral, é fortemente recomendado
631 631
  deixar a responsabilidade dessas páginas ao webmaster principal do seu sítio. <b>',
632
-	'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do sítio, por favor,',
633
-	'texte_inc_meta_2' => 'verificar as permissões de escrita',
634
-	'texte_inc_meta_3' => 'no directório <code>@repertoire@</code>.',
635
-	'texte_statut_en_cours_redaction' => 'em curso de redacção',
636
-	'texte_statut_poubelle' => 'para o caixote de lixo',
637
-	'texte_statut_propose_evaluation' => 'proposto para avaliação',
638
-	'texte_statut_publie' => 'publicado online',
639
-	'texte_statut_refuse' => 'recusado',
640
-	'titre_ajouter_mot_cle' => 'ACRESCENTAR UMA PALAVRA-CHAVE',
641
-	'titre_cadre_raccourcis' => 'ATALHOS :',
642
-	'titre_changer_couleur_interface' => 'Mudar a cor da interface',
643
-	'titre_image_admin_article' => 'Pode administrar este artigo',
644
-	'titre_image_administrateur' => 'Administrador',
645
-	'titre_image_aide' => 'Ajuda sobre este elemento',
646
-	'titre_image_auteur_supprime' => 'Autor eliminado',
647
-	'titre_image_redacteur' => 'Redactor sem acesso',
648
-	'titre_image_redacteur_02' => 'Redactor',
649
-	'titre_image_selecteur' => 'Exibir a lista',
650
-	'titre_image_visiteur' => 'Visitante',
651
-	'titre_joindre_document' => 'ANEXAR UM DOCUMENTO',
652
-	'titre_mots_cles' => 'PALAVRAS-CHAVE',
653
-	'titre_probleme_technique' => 'Atenção : um problema técnico (servidor SQL) impede o acesso a esta parte do sítio. Obrigado pela sua compreensão.',
654
-	'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA RUBRICA',
655
-	'titre_signatures_attente' => 'Assinaturas aguardando validação',
656
-	'titre_signatures_confirmees' => 'Assinaturas confirmadas',
657
-	'titre_statistiques' => 'Estatísticas do sítio',
658
-	'titre_titre_document' => 'Título do documento :',
659
-	'todo' => 'a caminho',
660
-	'trad_reference' => '(referência para as traduções)',
632
+    'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do sítio, por favor,',
633
+    'texte_inc_meta_2' => 'verificar as permissões de escrita',
634
+    'texte_inc_meta_3' => 'no directório <code>@repertoire@</code>.',
635
+    'texte_statut_en_cours_redaction' => 'em curso de redacção',
636
+    'texte_statut_poubelle' => 'para o caixote de lixo',
637
+    'texte_statut_propose_evaluation' => 'proposto para avaliação',
638
+    'texte_statut_publie' => 'publicado online',
639
+    'texte_statut_refuse' => 'recusado',
640
+    'titre_ajouter_mot_cle' => 'ACRESCENTAR UMA PALAVRA-CHAVE',
641
+    'titre_cadre_raccourcis' => 'ATALHOS :',
642
+    'titre_changer_couleur_interface' => 'Mudar a cor da interface',
643
+    'titre_image_admin_article' => 'Pode administrar este artigo',
644
+    'titre_image_administrateur' => 'Administrador',
645
+    'titre_image_aide' => 'Ajuda sobre este elemento',
646
+    'titre_image_auteur_supprime' => 'Autor eliminado',
647
+    'titre_image_redacteur' => 'Redactor sem acesso',
648
+    'titre_image_redacteur_02' => 'Redactor',
649
+    'titre_image_selecteur' => 'Exibir a lista',
650
+    'titre_image_visiteur' => 'Visitante',
651
+    'titre_joindre_document' => 'ANEXAR UM DOCUMENTO',
652
+    'titre_mots_cles' => 'PALAVRAS-CHAVE',
653
+    'titre_probleme_technique' => 'Atenção : um problema técnico (servidor SQL) impede o acesso a esta parte do sítio. Obrigado pela sua compreensão.',
654
+    'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA RUBRICA',
655
+    'titre_signatures_attente' => 'Assinaturas aguardando validação',
656
+    'titre_signatures_confirmees' => 'Assinaturas confirmadas',
657
+    'titre_statistiques' => 'Estatísticas do sítio',
658
+    'titre_titre_document' => 'Título do documento :',
659
+    'todo' => 'a caminho',
660
+    'trad_reference' => '(referência para as traduções)',
661 661
 
662
-	// Z
663
-	'zbug_balise_b_aval' => ': tag B colocada demasiado tarde no laço infinito',
664
-	'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@',
665
-	'zbug_balise_sans_argument' => 'Argumento em falta na tag @balise@',
666
-	'zbug_boucle' => 'laço infinito',
667
-	'zbug_boucle_recursive_undef' => 'laço recursivo não definido @nom@',
668
-	'zbug_calcul' => 'cálculo',
669
-	'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço infinito',
670
-	'zbug_champ_hors_motif' => 'Campo @champ@ fora de contexto @motif@',
671
-	'zbug_code' => 'código',
672
-	'zbug_critere_inconnu' => 'critério desconhecido @critere@ ',
673
-	'zbug_distant_interdit' => 'Dados externos interditos',
674
-	'zbug_doublon_table_sans_cle_primaire' => 'Entradas duplas numa tabela que não tem uma chave primária simples',
675
-	'zbug_doublon_table_sans_index' => 'Entradas duplas numa tabela sem índice',
676
-	'zbug_erreur_boucle_double' => 'laço @id@: Dupla definição ',
677
-	'zbug_erreur_boucle_fermant' => 'laço @id@: tag final em falta   ',
678
-	'zbug_erreur_boucle_syntaxe' => 'Laço com sintaxe incorrecta @id@',
679
-	'zbug_erreur_compilation' => 'Erro de compilação',
680
-	'zbug_erreur_execution_page' => 'erro de execução da página',
681
-	'zbug_erreur_filtre' => 'Erro : filtro indefinido @filtre@ ',
682
-	'zbug_erreur_meme_parent' => '{meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)',
683
-	'zbug_erreur_squelette' => 'Erro(s) no modelo',
684
-	'zbug_hors_compilation' => 'Não compilado',
685
-	'zbug_info_erreur_squelette' => 'Erro no sítio',
686
-	'zbug_inversion_ordre_inexistant' => 'inversão de uma ordem inexistente',
687
-	'zbug_pagination_sans_critere' => '#PAGINAÇÃO sem critério {paginação} ou usada num laço recursivo',
688
-	'zbug_parametres_inclus_incorrects' => 'Parâmetros de inclusão incorrectos: @param@',
689
-	'zbug_profile' => 'Cálculo de tempo : @time@',
690
-	'zbug_resultat' => 'resultado',
691
-	'zbug_serveur_indefini' => 'Sevidor SQL não definido',
692
-	'zbug_statistiques' => 'Estatísticas das consulta SQL classificadas por duração',
693
-	'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida',
694
-	'zxml_connus_attributs' => 'attributos conhecidos',
695
-	'zxml_de' => 'de',
696
-	'zxml_inconnu_attribut' => 'atributo desconhecido',
697
-	'zxml_inconnu_balise' => 'tag desconhecida',
698
-	'zxml_inconnu_entite' => 'entidade desconhecida',
699
-	'zxml_inconnu_id' => 'ID desconhecido',
700
-	'zxml_mais_de' => 'mas de',
701
-	'zxml_non_conforme' => 'não está de acordo com o princípio',
702
-	'zxml_non_fils' => 'não é um filho de ',
703
-	'zxml_nonvide_balise' => 'a tag não está vazia',
704
-	'zxml_obligatoire_attribut' => 'atributo obrigatório está em falta',
705
-	'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorrecta',
706
-	'zxml_survoler' => 'para visualizar os correctos, mover o rato por cima',
707
-	'zxml_valeur_attribut' => 'valor do atributo',
708
-	'zxml_vide_balise' => 'tag vazia',
709
-	'zxml_vu' => 'visualizado antes',
662
+    // Z
663
+    'zbug_balise_b_aval' => ': tag B colocada demasiado tarde no laço infinito',
664
+    'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@',
665
+    'zbug_balise_sans_argument' => 'Argumento em falta na tag @balise@',
666
+    'zbug_boucle' => 'laço infinito',
667
+    'zbug_boucle_recursive_undef' => 'laço recursivo não definido @nom@',
668
+    'zbug_calcul' => 'cálculo',
669
+    'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço infinito',
670
+    'zbug_champ_hors_motif' => 'Campo @champ@ fora de contexto @motif@',
671
+    'zbug_code' => 'código',
672
+    'zbug_critere_inconnu' => 'critério desconhecido @critere@ ',
673
+    'zbug_distant_interdit' => 'Dados externos interditos',
674
+    'zbug_doublon_table_sans_cle_primaire' => 'Entradas duplas numa tabela que não tem uma chave primária simples',
675
+    'zbug_doublon_table_sans_index' => 'Entradas duplas numa tabela sem índice',
676
+    'zbug_erreur_boucle_double' => 'laço @id@: Dupla definição ',
677
+    'zbug_erreur_boucle_fermant' => 'laço @id@: tag final em falta   ',
678
+    'zbug_erreur_boucle_syntaxe' => 'Laço com sintaxe incorrecta @id@',
679
+    'zbug_erreur_compilation' => 'Erro de compilação',
680
+    'zbug_erreur_execution_page' => 'erro de execução da página',
681
+    'zbug_erreur_filtre' => 'Erro : filtro indefinido @filtre@ ',
682
+    'zbug_erreur_meme_parent' => '{meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)',
683
+    'zbug_erreur_squelette' => 'Erro(s) no modelo',
684
+    'zbug_hors_compilation' => 'Não compilado',
685
+    'zbug_info_erreur_squelette' => 'Erro no sítio',
686
+    'zbug_inversion_ordre_inexistant' => 'inversão de uma ordem inexistente',
687
+    'zbug_pagination_sans_critere' => '#PAGINAÇÃO sem critério {paginação} ou usada num laço recursivo',
688
+    'zbug_parametres_inclus_incorrects' => 'Parâmetros de inclusão incorrectos: @param@',
689
+    'zbug_profile' => 'Cálculo de tempo : @time@',
690
+    'zbug_resultat' => 'resultado',
691
+    'zbug_serveur_indefini' => 'Sevidor SQL não definido',
692
+    'zbug_statistiques' => 'Estatísticas das consulta SQL classificadas por duração',
693
+    'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida',
694
+    'zxml_connus_attributs' => 'attributos conhecidos',
695
+    'zxml_de' => 'de',
696
+    'zxml_inconnu_attribut' => 'atributo desconhecido',
697
+    'zxml_inconnu_balise' => 'tag desconhecida',
698
+    'zxml_inconnu_entite' => 'entidade desconhecida',
699
+    'zxml_inconnu_id' => 'ID desconhecido',
700
+    'zxml_mais_de' => 'mas de',
701
+    'zxml_non_conforme' => 'não está de acordo com o princípio',
702
+    'zxml_non_fils' => 'não é um filho de ',
703
+    'zxml_nonvide_balise' => 'a tag não está vazia',
704
+    'zxml_obligatoire_attribut' => 'atributo obrigatório está em falta',
705
+    'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorrecta',
706
+    'zxml_survoler' => 'para visualizar os correctos, mover o rato por cima',
707
+    'zxml_valeur_attribut' => 'valor do atributo',
708
+    'zxml_vide_balise' => 'tag vazia',
709
+    'zxml_vu' => 'visualizado antes',
710 710
 ];
Please login to merge, or discard this patch.
ecrire/lang/public_fr.php 1 patch
Indentation   +114 added lines, -114 removed lines patch added patch discarded remove patch
@@ -4,118 +4,118 @@
 block discarded – undo
4 4
 
5 5
 return [
6 6
 
7
-	// A
8
-	'accueil_site' => 'Accueil',
9
-	'article' => 'Article',
10
-	'articles' => 'Articles',
11
-	'articles_auteur' => 'Articles de cet auteur',
12
-	'articles_populaires' => 'Articles les plus populaires',
13
-	'articles_rubrique' => 'Articles de cette rubrique',
14
-	'aucun_article' => 'Il n’y a pas d’article à cette adresse',
15
-	'aucun_auteur' => 'Il n’y a pas d’auteur à cette adresse',
16
-	'aucun_site' => 'Il n’y a pas de site à cette adresse',
17
-	'aucune_breve' => 'Il n’y a pas de brève à cette adresse',
18
-	'aucune_rubrique' => 'Il n’y a pas de rubrique à cette adresse',
19
-	'auteur' => 'Auteur',
20
-	'autres' => 'Autres',
21
-	'autres_breves' => 'Autres brèves',
22
-	'autres_groupes_mots_clefs' => 'Autres groupes de mots-clés',
23
-	'autres_sites' => 'Autres sites',
24
-
25
-	// B
26
-	'bonjour' => 'Bonjour',
27
-
28
-	// C
29
-	'commenter_site' => 'Commenter ce site',
30
-	'contact' => 'Contact',
31
-	'copie_document_impossible' => 'Impossible de copier le document',
32
-
33
-	// D
34
-	'date' => 'Date',
35
-	'dernier_ajout' => 'Dernier ajout',
36
-	'dernieres_breves' => 'Dernières brèves',
37
-	'derniers_articles' => 'Derniers articles',
38
-	'derniers_commentaires' => 'Derniers commentaires',
39
-	'derniers_messages_forum' => 'Derniers messages publiés dans les forums',
40
-
41
-	// E
42
-	'edition_mode_texte' => 'Édition en mode texte de',
43
-	'en_reponse' => 'En réponse à :',
44
-	'en_resume' => 'En résumé',
45
-	'envoyer_message' => 'Envoyer un message',
46
-	'espace_prive' => 'Espace privé',
47
-
48
-	// F
49
-	'formats_acceptes' => 'Formats acceptés : @formats@.',
50
-
51
-	// H
52
-	'hierarchie_site' => 'Hiérarchie du site',
53
-
54
-	// J
55
-	'jours' => 'jours',
56
-
57
-	// L
58
-	'lien_connecter' => 'Se connecter',
59
-
60
-	// M
61
-	'meme_auteur' => 'Du même auteur',
62
-	'meme_rubrique' => 'Dans la même rubrique',
63
-	'memes_auteurs' => 'Des mêmes auteurs',
64
-	'message' => 'Message',
65
-	'messages_forum' => 'Messages',
66
-	'messages_recents' => 'Messages de forums les plus récents',
67
-	'mots_clef' => 'Mot-clé',
68
-	'mots_clefs' => 'Mots-clés',
69
-	'mots_clefs_meme_groupe' => 'Mots-clés dans le même groupe',
70
-
71
-	// N
72
-	'navigation' => 'Navigation',
73
-	'nom' => 'Nom',
74
-	'nouveautes' => 'Les nouveautés',
75
-	'nouveautes_web' => 'Nouveautés sur le Web',
76
-	'nouveaux_articles' => 'Nouveaux articles',
77
-	'nouvelles_breves' => 'Nouvelles brèves',
78
-
79
-	// P
80
-	'page_precedente' => 'page précédente',
81
-	'page_suivante' => 'page suivante',
82
-	'par_auteur' => 'par ',
83
-	'participer_site' => 'Vous pouvez participer à la vie de ce site et proposer vos propres articles en vous inscrivant ci-dessous. Vous recevrez immédiatement un email vous indiquant vos codes d’accès à l’espace privé du site.',
84
-	'plan_site' => 'Plan du site',
85
-	'popularite' => 'Popularité',
86
-	'poster_message' => 'Poster un message',
87
-	'proposer_site' => 'Vous pouvez proposer un site à ajouter dans cette rubrique :',
88
-
89
-	// R
90
-	'repondre_article' => 'Répondre à cet article',
91
-	'repondre_breve' => 'Répondre à cette brève',
92
-	'resultats_recherche' => 'Résultats de la recherche',
93
-	'retour_debut_forums' => 'Retour au début des forums',
94
-	'rss_abonnement' => 'Copiez l’URL suivante dans votre agrégateur :',
95
-	'rss_abonnement_titre' => 'S’abonner',
96
-	'rss_abonnement_titre_page' => 'S’abonner à',
97
-	'rss_explication' => 'Un fil RSS recueille les informations de mise à jour d’un site. Il fournit le contenu des billets ou des commentaires ou un extrait de ceux-ci, ainsi qu’un lien vers les versions complètes et quelques autres informations. Ce fil a pour vocation d’être lu par un agrégateur RSS.',
98
-	'rss_explication_titre' => 'Qu’est-ce qu’un flux RSS ?',
99
-	'rubrique' => 'Rubrique',
100
-	'rubriques' => 'Rubriques',
101
-
102
-	// S
103
-	'signatures_petition' => 'Signatures',
104
-	'site_realise_avec_spip' => 'Site réalisé avec SPIP',
105
-	'sites_web' => 'Sites Web',
106
-	'sous_rubriques' => 'Sous-rubriques',
107
-	'spam' => 'Spam',
108
-	'suite' => 'suite',
109
-	'sur_web' => 'Sur le Web',
110
-	'syndiquer_rubrique' => 'Syndiquer cette rubrique',
111
-	'syndiquer_site' => 'Syndiquer tout le site',
112
-
113
-	// T
114
-	'texte_lettre_information' => 'Voici la lettre d’information du site',
115
-	'texte_lettre_information_2' => 'Cette lettre recense les nouveautés publiées depuis',
116
-
117
-	// V
118
-	'ver_imprimer' => 'Version à imprimer',
119
-	'voir_en_ligne' => 'Voir en ligne',
120
-	'voir_squelette' => 'voir le squelette de cette page',
7
+    // A
8
+    'accueil_site' => 'Accueil',
9
+    'article' => 'Article',
10
+    'articles' => 'Articles',
11
+    'articles_auteur' => 'Articles de cet auteur',
12
+    'articles_populaires' => 'Articles les plus populaires',
13
+    'articles_rubrique' => 'Articles de cette rubrique',
14
+    'aucun_article' => 'Il n’y a pas d’article à cette adresse',
15
+    'aucun_auteur' => 'Il n’y a pas d’auteur à cette adresse',
16
+    'aucun_site' => 'Il n’y a pas de site à cette adresse',
17
+    'aucune_breve' => 'Il n’y a pas de brève à cette adresse',
18
+    'aucune_rubrique' => 'Il n’y a pas de rubrique à cette adresse',
19
+    'auteur' => 'Auteur',
20
+    'autres' => 'Autres',
21
+    'autres_breves' => 'Autres brèves',
22
+    'autres_groupes_mots_clefs' => 'Autres groupes de mots-clés',
23
+    'autres_sites' => 'Autres sites',
24
+
25
+    // B
26
+    'bonjour' => 'Bonjour',
27
+
28
+    // C
29
+    'commenter_site' => 'Commenter ce site',
30
+    'contact' => 'Contact',
31
+    'copie_document_impossible' => 'Impossible de copier le document',
32
+
33
+    // D
34
+    'date' => 'Date',
35
+    'dernier_ajout' => 'Dernier ajout',
36
+    'dernieres_breves' => 'Dernières brèves',
37
+    'derniers_articles' => 'Derniers articles',
38
+    'derniers_commentaires' => 'Derniers commentaires',
39
+    'derniers_messages_forum' => 'Derniers messages publiés dans les forums',
40
+
41
+    // E
42
+    'edition_mode_texte' => 'Édition en mode texte de',
43
+    'en_reponse' => 'En réponse à :',
44
+    'en_resume' => 'En résumé',
45
+    'envoyer_message' => 'Envoyer un message',
46
+    'espace_prive' => 'Espace privé',
47
+
48
+    // F
49
+    'formats_acceptes' => 'Formats acceptés : @formats@.',
50
+
51
+    // H
52
+    'hierarchie_site' => 'Hiérarchie du site',
53
+
54
+    // J
55
+    'jours' => 'jours',
56
+
57
+    // L
58
+    'lien_connecter' => 'Se connecter',
59
+
60
+    // M
61
+    'meme_auteur' => 'Du même auteur',
62
+    'meme_rubrique' => 'Dans la même rubrique',
63
+    'memes_auteurs' => 'Des mêmes auteurs',
64
+    'message' => 'Message',
65
+    'messages_forum' => 'Messages',
66
+    'messages_recents' => 'Messages de forums les plus récents',
67
+    'mots_clef' => 'Mot-clé',
68
+    'mots_clefs' => 'Mots-clés',
69
+    'mots_clefs_meme_groupe' => 'Mots-clés dans le même groupe',
70
+
71
+    // N
72
+    'navigation' => 'Navigation',
73
+    'nom' => 'Nom',
74
+    'nouveautes' => 'Les nouveautés',
75
+    'nouveautes_web' => 'Nouveautés sur le Web',
76
+    'nouveaux_articles' => 'Nouveaux articles',
77
+    'nouvelles_breves' => 'Nouvelles brèves',
78
+
79
+    // P
80
+    'page_precedente' => 'page précédente',
81
+    'page_suivante' => 'page suivante',
82
+    'par_auteur' => 'par ',
83
+    'participer_site' => 'Vous pouvez participer à la vie de ce site et proposer vos propres articles en vous inscrivant ci-dessous. Vous recevrez immédiatement un email vous indiquant vos codes d’accès à l’espace privé du site.',
84
+    'plan_site' => 'Plan du site',
85
+    'popularite' => 'Popularité',
86
+    'poster_message' => 'Poster un message',
87
+    'proposer_site' => 'Vous pouvez proposer un site à ajouter dans cette rubrique :',
88
+
89
+    // R
90
+    'repondre_article' => 'Répondre à cet article',
91
+    'repondre_breve' => 'Répondre à cette brève',
92
+    'resultats_recherche' => 'Résultats de la recherche',
93
+    'retour_debut_forums' => 'Retour au début des forums',
94
+    'rss_abonnement' => 'Copiez l’URL suivante dans votre agrégateur :',
95
+    'rss_abonnement_titre' => 'S’abonner',
96
+    'rss_abonnement_titre_page' => 'S’abonner à',
97
+    'rss_explication' => 'Un fil RSS recueille les informations de mise à jour d’un site. Il fournit le contenu des billets ou des commentaires ou un extrait de ceux-ci, ainsi qu’un lien vers les versions complètes et quelques autres informations. Ce fil a pour vocation d’être lu par un agrégateur RSS.',
98
+    'rss_explication_titre' => 'Qu’est-ce qu’un flux RSS ?',
99
+    'rubrique' => 'Rubrique',
100
+    'rubriques' => 'Rubriques',
101
+
102
+    // S
103
+    'signatures_petition' => 'Signatures',
104
+    'site_realise_avec_spip' => 'Site réalisé avec SPIP',
105
+    'sites_web' => 'Sites Web',
106
+    'sous_rubriques' => 'Sous-rubriques',
107
+    'spam' => 'Spam',
108
+    'suite' => 'suite',
109
+    'sur_web' => 'Sur le Web',
110
+    'syndiquer_rubrique' => 'Syndiquer cette rubrique',
111
+    'syndiquer_site' => 'Syndiquer tout le site',
112
+
113
+    // T
114
+    'texte_lettre_information' => 'Voici la lettre d’information du site',
115
+    'texte_lettre_information_2' => 'Cette lettre recense les nouveautés publiées depuis',
116
+
117
+    // V
118
+    'ver_imprimer' => 'Version à imprimer',
119
+    'voir_en_ligne' => 'Voir en ligne',
120
+    'voir_squelette' => 'voir le squelette de cette page',
121 121
 ];
Please login to merge, or discard this patch.
ecrire/inc/queue.php 2 patches
Indentation   +474 added lines, -474 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Queue
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 define('_JQ_SCHEDULED', 1);
@@ -49,101 +49,101 @@  discard block
 block discarded – undo
49 49
  *  id of job
50 50
  */
51 51
 function queue_add_job(
52
-	$function,
53
-	$description,
54
-	$arguments = [],
55
-	$file = '',
56
-	$no_duplicate = false,
57
-	$time = 0,
58
-	$priority = 0
52
+    $function,
53
+    $description,
54
+    $arguments = [],
55
+    $file = '',
56
+    $no_duplicate = false,
57
+    $time = 0,
58
+    $priority = 0
59 59
 ) {
60
-	include_spip('base/abstract_sql');
61
-
62
-	// cas pourri de ecrire/action/editer_site avec l'option reload=oui
63
-	if (defined('_GENIE_SYNDIC_NOW')) {
64
-		$arguments['id_syndic'] = _GENIE_SYNDIC_NOW;
65
-	}
66
-
67
-	// serialiser les arguments
68
-	$arguments = serialize($arguments);
69
-	$md5args = md5($arguments);
70
-
71
-	// si pas de date programee, des que possible
72
-	$duplicate_where = 'status=' . intval(_JQ_SCHEDULED) . ' AND ';
73
-	if (!$time) {
74
-		$time = time();
75
-		$duplicate_where = ''; // ne pas dupliquer si deja le meme job en cours d'execution
76
-	}
77
-	$date = date('Y-m-d H:i:s', $time);
78
-
79
-	$set_job = [
80
-		'fonction' => $function,
81
-		'descriptif' => $description,
82
-		'args' => $arguments,
83
-		'md5args' => $md5args,
84
-		'inclure' => $file,
85
-		'priorite' => max(-10, min(10, intval($priority))),
86
-		'date' => $date,
87
-		'status' => _JQ_SCHEDULED,
88
-	];
89
-	// si option ne pas dupliquer, regarder si la fonction existe deja
90
-	// avec les memes args et file
91
-	if (
92
-		$no_duplicate
93
-		&& ($id_job = sql_getfetsel(
94
-			'id_job',
95
-			'spip_jobs',
96
-			$duplicate_where =
97
-				$duplicate_where . 'fonction=' . sql_quote($function)
98
-				. (($no_duplicate === 'function_only') ? '' :
99
-			' AND md5args=' . sql_quote($md5args) . ' AND inclure=' . sql_quote($file))
100
-		))
101
-	) {
102
-		return $id_job;
103
-	}
104
-
105
-	$id_job = sql_insertq('spip_jobs', $set_job);
106
-	// en cas de concurrence, deux process peuvent arriver jusqu'ici en parallele
107
-	// avec le meme job unique a inserer. Dans ce cas, celui qui a eu l'id le plus grand
108
-	// doit s'effacer
109
-	if (
110
-		$no_duplicate
111
-		&& ($id_prev = sql_getfetsel('id_job', 'spip_jobs', 'id_job<' . intval($id_job) . " AND $duplicate_where"))
112
-	) {
113
-		sql_delete('spip_jobs', 'id_job=' . intval($id_job));
114
-
115
-		return $id_prev;
116
-	}
117
-
118
-	// verifier la non duplication qui peut etre problematique en cas de concurence
119
-	// il faut dans ce cas que seul le dernier ajoute se supprime !
120
-
121
-	// une option de debug pour verifier que les arguments en base sont bons
122
-	// ie cas d'un char non acceptables sur certains type de champs
123
-	// qui coupe la valeur
124
-	if (defined('_JQ_INSERT_CHECK_ARGS') && $id_job) {
125
-		$args = sql_getfetsel('args', 'spip_jobs', 'id_job=' . intval($id_job));
126
-		if ($args !== $arguments) {
127
-			spip_log('arguments job errones / longueur ' . strlen($args) . ' vs ' . strlen($arguments) . ' / valeur : ' . var_export(
128
-				$arguments,
129
-				true
130
-			), 'queue');
131
-		}
132
-	}
133
-
134
-	if ($id_job) {
135
-		queue_update_next_job_time($time);
136
-	}
137
-	// si la mise en file d'attente du job echoue,
138
-	// il ne faut pas perdre l'execution de la fonction
139
-	// on la lance immediatement, c'est un fallback
140
-	// sauf en cas d'upgrade necessaire (table spip_jobs inexistante)
141
-	elseif ($GLOBALS['meta']['version_installee'] == $GLOBALS['spip_version_base']) {
142
-		$set_job['id_job'] = 0;
143
-		queue_start_job($set_job);
144
-	}
145
-
146
-	return $id_job;
60
+    include_spip('base/abstract_sql');
61
+
62
+    // cas pourri de ecrire/action/editer_site avec l'option reload=oui
63
+    if (defined('_GENIE_SYNDIC_NOW')) {
64
+        $arguments['id_syndic'] = _GENIE_SYNDIC_NOW;
65
+    }
66
+
67
+    // serialiser les arguments
68
+    $arguments = serialize($arguments);
69
+    $md5args = md5($arguments);
70
+
71
+    // si pas de date programee, des que possible
72
+    $duplicate_where = 'status=' . intval(_JQ_SCHEDULED) . ' AND ';
73
+    if (!$time) {
74
+        $time = time();
75
+        $duplicate_where = ''; // ne pas dupliquer si deja le meme job en cours d'execution
76
+    }
77
+    $date = date('Y-m-d H:i:s', $time);
78
+
79
+    $set_job = [
80
+        'fonction' => $function,
81
+        'descriptif' => $description,
82
+        'args' => $arguments,
83
+        'md5args' => $md5args,
84
+        'inclure' => $file,
85
+        'priorite' => max(-10, min(10, intval($priority))),
86
+        'date' => $date,
87
+        'status' => _JQ_SCHEDULED,
88
+    ];
89
+    // si option ne pas dupliquer, regarder si la fonction existe deja
90
+    // avec les memes args et file
91
+    if (
92
+        $no_duplicate
93
+        && ($id_job = sql_getfetsel(
94
+            'id_job',
95
+            'spip_jobs',
96
+            $duplicate_where =
97
+                $duplicate_where . 'fonction=' . sql_quote($function)
98
+                . (($no_duplicate === 'function_only') ? '' :
99
+            ' AND md5args=' . sql_quote($md5args) . ' AND inclure=' . sql_quote($file))
100
+        ))
101
+    ) {
102
+        return $id_job;
103
+    }
104
+
105
+    $id_job = sql_insertq('spip_jobs', $set_job);
106
+    // en cas de concurrence, deux process peuvent arriver jusqu'ici en parallele
107
+    // avec le meme job unique a inserer. Dans ce cas, celui qui a eu l'id le plus grand
108
+    // doit s'effacer
109
+    if (
110
+        $no_duplicate
111
+        && ($id_prev = sql_getfetsel('id_job', 'spip_jobs', 'id_job<' . intval($id_job) . " AND $duplicate_where"))
112
+    ) {
113
+        sql_delete('spip_jobs', 'id_job=' . intval($id_job));
114
+
115
+        return $id_prev;
116
+    }
117
+
118
+    // verifier la non duplication qui peut etre problematique en cas de concurence
119
+    // il faut dans ce cas que seul le dernier ajoute se supprime !
120
+
121
+    // une option de debug pour verifier que les arguments en base sont bons
122
+    // ie cas d'un char non acceptables sur certains type de champs
123
+    // qui coupe la valeur
124
+    if (defined('_JQ_INSERT_CHECK_ARGS') && $id_job) {
125
+        $args = sql_getfetsel('args', 'spip_jobs', 'id_job=' . intval($id_job));
126
+        if ($args !== $arguments) {
127
+            spip_log('arguments job errones / longueur ' . strlen($args) . ' vs ' . strlen($arguments) . ' / valeur : ' . var_export(
128
+                $arguments,
129
+                true
130
+            ), 'queue');
131
+        }
132
+    }
133
+
134
+    if ($id_job) {
135
+        queue_update_next_job_time($time);
136
+    }
137
+    // si la mise en file d'attente du job echoue,
138
+    // il ne faut pas perdre l'execution de la fonction
139
+    // on la lance immediatement, c'est un fallback
140
+    // sauf en cas d'upgrade necessaire (table spip_jobs inexistante)
141
+    elseif ($GLOBALS['meta']['version_installee'] == $GLOBALS['spip_version_base']) {
142
+        $set_job['id_job'] = 0;
143
+        queue_start_job($set_job);
144
+    }
145
+
146
+    return $id_job;
147 147
 }
148 148
 
149 149
 /**
@@ -152,11 +152,11 @@  discard block
 block discarded – undo
152 152
  * @return void
153 153
  */
154 154
 function queue_purger() {
155
-	include_spip('base/abstract_sql');
156
-	sql_delete('spip_jobs');
157
-	sql_delete('spip_jobs_liens', 'id_job NOT IN (' . sql_get_select('id_job', 'spip_jobs') . ')');
158
-	include_spip('inc/genie');
159
-	genie_queue_watch_dist();
155
+    include_spip('base/abstract_sql');
156
+    sql_delete('spip_jobs');
157
+    sql_delete('spip_jobs_liens', 'id_job NOT IN (' . sql_get_select('id_job', 'spip_jobs') . ')');
158
+    include_spip('inc/genie');
159
+    genie_queue_watch_dist();
160 160
 }
161 161
 
162 162
 /**
@@ -167,25 +167,25 @@  discard block
 block discarded – undo
167 167
  * @return int|bool
168 168
  */
169 169
 function queue_remove_job($id_job) {
170
-	include_spip('base/abstract_sql');
171
-
172
-	if (
173
-		($row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job=' . intval($id_job)))
174
-		&& ($res = sql_delete('spip_jobs', 'id_job=' . intval($id_job)))
175
-	) {
176
-		queue_unlink_job($id_job);
177
-		// est-ce une tache cron qu'il faut relancer ?
178
-		if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) {
179
-			// relancer avec les nouveaux arguments de temps
180
-			include_spip('inc/genie');
181
-			// relancer avec la periode prevue
182
-			queue_genie_replan_job($row['fonction'], $periode, strtotime($row['date']));
183
-		}
184
-		queue_update_next_job_time();
185
-		return $res;
186
-	}
187
-
188
-	return false;
170
+    include_spip('base/abstract_sql');
171
+
172
+    if (
173
+        ($row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job=' . intval($id_job)))
174
+        && ($res = sql_delete('spip_jobs', 'id_job=' . intval($id_job)))
175
+    ) {
176
+        queue_unlink_job($id_job);
177
+        // est-ce une tache cron qu'il faut relancer ?
178
+        if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) {
179
+            // relancer avec les nouveaux arguments de temps
180
+            include_spip('inc/genie');
181
+            // relancer avec la periode prevue
182
+            queue_genie_replan_job($row['fonction'], $periode, strtotime($row['date']));
183
+        }
184
+        queue_update_next_job_time();
185
+        return $res;
186
+    }
187
+
188
+    return false;
189 189
 }
190 190
 
191 191
 /**
@@ -198,18 +198,18 @@  discard block
 block discarded – undo
198 198
  *  ou un tableau composé de tableaux simples pour lieur plusieurs objets en une fois
199 199
  */
200 200
 function queue_link_job($id_job, $objets) {
201
-	include_spip('base/abstract_sql');
202
-
203
-	if (is_array($objets) && count($objets)) {
204
-		if (is_array(reset($objets))) {
205
-			foreach ($objets as $k => $o) {
206
-				$objets[$k]['id_job'] = $id_job;
207
-			}
208
-			sql_insertq_multi('spip_jobs_liens', $objets);
209
-		} else {
210
-			sql_insertq('spip_jobs_liens', array_merge(['id_job' => $id_job], $objets));
211
-		}
212
-	}
201
+    include_spip('base/abstract_sql');
202
+
203
+    if (is_array($objets) && count($objets)) {
204
+        if (is_array(reset($objets))) {
205
+            foreach ($objets as $k => $o) {
206
+                $objets[$k]['id_job'] = $id_job;
207
+            }
208
+            sql_insertq_multi('spip_jobs_liens', $objets);
209
+        } else {
210
+            sql_insertq('spip_jobs_liens', array_merge(['id_job' => $id_job], $objets));
211
+        }
212
+    }
213 213
 }
214 214
 
215 215
 /**
@@ -221,7 +221,7 @@  discard block
 block discarded – undo
221 221
  *  resultat du sql_delete
222 222
  */
223 223
 function queue_unlink_job($id_job) {
224
-	return sql_delete('spip_jobs_liens', 'id_job=' . intval($id_job));
224
+    return sql_delete('spip_jobs_liens', 'id_job=' . intval($id_job));
225 225
 }
226 226
 
227 227
 /**
@@ -234,36 +234,36 @@  discard block
 block discarded – undo
234 234
  */
235 235
 function queue_start_job($row) {
236 236
 
237
-	// deserialiser les arguments
238
-	$args = unserialize($row['args']);
239
-	if (!is_array($args)) {
240
-		spip_log('arguments job errones ' . var_export($row, true), 'queue');
241
-		return false;
242
-	}
243
-
244
-	$fonction = $row['fonction'];
245
-	if (strlen($inclure = trim($row['inclure']))) {
246
-		if (str_ends_with($inclure, '/')) { // c'est un chemin pour charger_fonction
247
-			$f = charger_fonction($fonction, rtrim($inclure, '/'), false);
248
-			if ($f) {
249
-				$fonction = $f;
250
-			}
251
-		} else {
252
-			include_spip($inclure);
253
-		}
254
-	}
255
-
256
-	if (!function_exists($fonction)) {
257
-		spip_log("fonction $fonction ($inclure) inexistante " . var_export($row, true), 'queue');
258
-
259
-		return false;
260
-	}
261
-
262
-	spip_log('queue [' . $row['id_job'] . "]: $fonction() start", 'queue');
263
-	$res = $fonction(...$args);
264
-	spip_log('queue [' . $row['id_job'] . "]: $fonction() end", 'queue');
265
-
266
-	return $res;
237
+    // deserialiser les arguments
238
+    $args = unserialize($row['args']);
239
+    if (!is_array($args)) {
240
+        spip_log('arguments job errones ' . var_export($row, true), 'queue');
241
+        return false;
242
+    }
243
+
244
+    $fonction = $row['fonction'];
245
+    if (strlen($inclure = trim($row['inclure']))) {
246
+        if (str_ends_with($inclure, '/')) { // c'est un chemin pour charger_fonction
247
+            $f = charger_fonction($fonction, rtrim($inclure, '/'), false);
248
+            if ($f) {
249
+                $fonction = $f;
250
+            }
251
+        } else {
252
+            include_spip($inclure);
253
+        }
254
+    }
255
+
256
+    if (!function_exists($fonction)) {
257
+        spip_log("fonction $fonction ($inclure) inexistante " . var_export($row, true), 'queue');
258
+
259
+        return false;
260
+    }
261
+
262
+    spip_log('queue [' . $row['id_job'] . "]: $fonction() start", 'queue');
263
+    $res = $fonction(...$args);
264
+    spip_log('queue [' . $row['id_job'] . "]: $fonction() end", 'queue');
265
+
266
+    return $res;
267 267
 }
268 268
 
269 269
 /**
@@ -290,89 +290,89 @@  discard block
 block discarded – undo
290 290
  *     - true : une planification a été faite.
291 291
  */
292 292
 function queue_schedule($force_jobs = null) {
293
-	$time = time();
294
-	if (defined('_DEBUG_BLOCK_QUEUE')) {
295
-		spip_log('_DEBUG_BLOCK_QUEUE : schedule stop', 'jq' . _LOG_DEBUG);
296
-
297
-		return;
298
-	}
299
-
300
-	// rien a faire si le prochain job est encore dans le futur
301
-	if (queue_sleep_time_to_next_job() > 0 && (!$force_jobs || !count($force_jobs))) {
302
-		spip_log('queue_sleep_time_to_next_job', 'jq' . _LOG_DEBUG);
303
-
304
-		return;
305
-	}
306
-
307
-	include_spip('base/abstract_sql');
308
-	// on ne peut rien faire si pas de connexion SQL
309
-	if (!spip_connect()) {
310
-		return false;
311
-	}
312
-
313
-	if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')) {
314
-		$max_time = ini_get('max_execution_time') / 2;
315
-		// valeur conservatrice si on a pas reussi a lire le max_execution_time
316
-		if (!$max_time) {
317
-			$max_time = 5;
318
-		}
319
-		define('_JQ_MAX_JOBS_TIME_TO_EXECUTE', min($max_time, 15)); // une valeur maxi en temps.
320
-	}
321
-	$end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE;
322
-
323
-	spip_log("JQ schedule $time / $end_time", 'jq' . _LOG_DEBUG);
324
-
325
-	if (!defined('_JQ_MAX_JOBS_EXECUTE')) {
326
-		define('_JQ_MAX_JOBS_EXECUTE', 200);
327
-	}
328
-	$nbj = 0;
329
-	// attraper les jobs
330
-	// dont la date est passee (echus en attente),
331
-	// par ordre :
332
-	//	- de priorite
333
-	//	- de date
334
-	// lorsqu'un job cron n'a pas fini, sa priorite est descendue
335
-	// pour qu'il ne bloque pas les autres jobs en attente
336
-	if (is_array($force_jobs) && count($force_jobs)) {
337
-		$cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND ' . sql_in('id_job', $force_jobs);
338
-	} else {
339
-		$now = date('Y-m-d H:i:s', $time);
340
-		$cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND date<=' . sql_quote($now);
341
-	}
342
-
343
-	register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible
344
-	$res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,' . (_JQ_MAX_JOBS_EXECUTE + 1));
345
-	do {
346
-		if ($row = array_shift($res)) {
347
-			$nbj++;
348
-			// il faut un verrou, a base de sql_delete
349
-			if (sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']) . ' AND status=' . intval(_JQ_SCHEDULED))) {
350
-				#spip_log("JQ schedule job ".$nbj." OK",'jq');
351
-				// on reinsert dans la base aussitot avec un status=_JQ_PENDING
352
-				$row['status'] = _JQ_PENDING;
353
-				$row['date'] = date('Y-m-d H:i:s', $time);
354
-				sql_insertq('spip_jobs', $row);
355
-
356
-				// on a la main sur le job :
357
-				// l'executer
358
-				$result = queue_start_job($row);
359
-
360
-				$time = time();
361
-				queue_close_job($row, $time, $result);
362
-			}
363
-		}
364
-		spip_log('JQ schedule job end time ' . $time, 'jq' . _LOG_DEBUG);
365
-	} while ($nbj < _JQ_MAX_JOBS_EXECUTE && $row && $time < $end_time);
366
-	spip_log('JQ schedule end time ' . time(), 'jq' . _LOG_DEBUG);
367
-
368
-	if ($row = array_shift($res)) {
369
-		queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP
370
-		spip_log('JQ encore !', 'jq' . _LOG_DEBUG);
371
-	} else {
372
-		queue_update_next_job_time();
373
-	}
374
-
375
-	return true;
293
+    $time = time();
294
+    if (defined('_DEBUG_BLOCK_QUEUE')) {
295
+        spip_log('_DEBUG_BLOCK_QUEUE : schedule stop', 'jq' . _LOG_DEBUG);
296
+
297
+        return;
298
+    }
299
+
300
+    // rien a faire si le prochain job est encore dans le futur
301
+    if (queue_sleep_time_to_next_job() > 0 && (!$force_jobs || !count($force_jobs))) {
302
+        spip_log('queue_sleep_time_to_next_job', 'jq' . _LOG_DEBUG);
303
+
304
+        return;
305
+    }
306
+
307
+    include_spip('base/abstract_sql');
308
+    // on ne peut rien faire si pas de connexion SQL
309
+    if (!spip_connect()) {
310
+        return false;
311
+    }
312
+
313
+    if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')) {
314
+        $max_time = ini_get('max_execution_time') / 2;
315
+        // valeur conservatrice si on a pas reussi a lire le max_execution_time
316
+        if (!$max_time) {
317
+            $max_time = 5;
318
+        }
319
+        define('_JQ_MAX_JOBS_TIME_TO_EXECUTE', min($max_time, 15)); // une valeur maxi en temps.
320
+    }
321
+    $end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE;
322
+
323
+    spip_log("JQ schedule $time / $end_time", 'jq' . _LOG_DEBUG);
324
+
325
+    if (!defined('_JQ_MAX_JOBS_EXECUTE')) {
326
+        define('_JQ_MAX_JOBS_EXECUTE', 200);
327
+    }
328
+    $nbj = 0;
329
+    // attraper les jobs
330
+    // dont la date est passee (echus en attente),
331
+    // par ordre :
332
+    //	- de priorite
333
+    //	- de date
334
+    // lorsqu'un job cron n'a pas fini, sa priorite est descendue
335
+    // pour qu'il ne bloque pas les autres jobs en attente
336
+    if (is_array($force_jobs) && count($force_jobs)) {
337
+        $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND ' . sql_in('id_job', $force_jobs);
338
+    } else {
339
+        $now = date('Y-m-d H:i:s', $time);
340
+        $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND date<=' . sql_quote($now);
341
+    }
342
+
343
+    register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible
344
+    $res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,' . (_JQ_MAX_JOBS_EXECUTE + 1));
345
+    do {
346
+        if ($row = array_shift($res)) {
347
+            $nbj++;
348
+            // il faut un verrou, a base de sql_delete
349
+            if (sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']) . ' AND status=' . intval(_JQ_SCHEDULED))) {
350
+                #spip_log("JQ schedule job ".$nbj." OK",'jq');
351
+                // on reinsert dans la base aussitot avec un status=_JQ_PENDING
352
+                $row['status'] = _JQ_PENDING;
353
+                $row['date'] = date('Y-m-d H:i:s', $time);
354
+                sql_insertq('spip_jobs', $row);
355
+
356
+                // on a la main sur le job :
357
+                // l'executer
358
+                $result = queue_start_job($row);
359
+
360
+                $time = time();
361
+                queue_close_job($row, $time, $result);
362
+            }
363
+        }
364
+        spip_log('JQ schedule job end time ' . $time, 'jq' . _LOG_DEBUG);
365
+    } while ($nbj < _JQ_MAX_JOBS_EXECUTE && $row && $time < $end_time);
366
+    spip_log('JQ schedule end time ' . time(), 'jq' . _LOG_DEBUG);
367
+
368
+    if ($row = array_shift($res)) {
369
+        queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP
370
+        spip_log('JQ encore !', 'jq' . _LOG_DEBUG);
371
+    } else {
372
+        queue_update_next_job_time();
373
+    }
374
+
375
+    return true;
376 376
 }
377 377
 
378 378
 /**
@@ -390,21 +390,21 @@  discard block
 block discarded – undo
390 390
  * @param int $result
391 391
  */
392 392
 function queue_close_job(&$row, $time, $result = 0) {
393
-	// est-ce une tache cron qu'il faut relancer ?
394
-	if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) {
395
-		// relancer avec les nouveaux arguments de temps
396
-		include_spip('inc/genie');
397
-		if ($result < 0) { // relancer tout de suite, mais en baissant la priorite
398
-		queue_genie_replan_job($row['fonction'], $periode, 0 - $result, null, $row['priorite'] - 1);
399
-		} else // relancer avec la periode prevue
400
-		{
401
-			queue_genie_replan_job($row['fonction'], $periode, $time);
402
-		}
403
-	}
404
-	// purger ses liens eventuels avec des objets
405
-	sql_delete('spip_jobs_liens', 'id_job=' . intval($row['id_job']));
406
-	// supprimer le job fini
407
-	sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']));
393
+    // est-ce une tache cron qu'il faut relancer ?
394
+    if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) {
395
+        // relancer avec les nouveaux arguments de temps
396
+        include_spip('inc/genie');
397
+        if ($result < 0) { // relancer tout de suite, mais en baissant la priorite
398
+        queue_genie_replan_job($row['fonction'], $periode, 0 - $result, null, $row['priorite'] - 1);
399
+        } else // relancer avec la periode prevue
400
+        {
401
+            queue_genie_replan_job($row['fonction'], $periode, $time);
402
+        }
403
+    }
404
+    // purger ses liens eventuels avec des objets
405
+    sql_delete('spip_jobs_liens', 'id_job=' . intval($row['id_job']));
406
+    // supprimer le job fini
407
+    sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']));
408 408
 }
409 409
 
410 410
 /**
@@ -414,10 +414,10 @@  discard block
 block discarded – undo
414 414
  * @uses queue_update_next_job_time()
415 415
  */
416 416
 function queue_error_handler() {
417
-	// se remettre dans le bon dossier, car Apache le change parfois (toujours?)
418
-	chdir(_ROOT_CWD);
417
+    // se remettre dans le bon dossier, car Apache le change parfois (toujours?)
418
+    chdir(_ROOT_CWD);
419 419
 
420
-	queue_update_next_job_time();
420
+    queue_update_next_job_time();
421 421
 }
422 422
 
423 423
 
@@ -434,18 +434,18 @@  discard block
 block discarded – undo
434 434
  *     Périodicité de la tâche en secondes, si tâche périodique, sinon false.
435 435
  */
436 436
 function queue_is_cron_job($function, $inclure) {
437
-	static $taches = null;
438
-	if (str_starts_with($inclure, 'genie/')) {
439
-		if (is_null($taches)) {
440
-			include_spip('inc/genie');
441
-			$taches = taches_generales();
442
-		}
443
-		if (isset($taches[$function])) {
444
-			return $taches[$function];
445
-		}
446
-	}
447
-
448
-	return false;
437
+    static $taches = null;
438
+    if (str_starts_with($inclure, 'genie/')) {
439
+        if (is_null($taches)) {
440
+            include_spip('inc/genie');
441
+            $taches = taches_generales();
442
+        }
443
+        if (isset($taches[$function])) {
444
+            return $taches[$function];
445
+        }
446
+    }
447
+
448
+    return false;
449 449
 }
450 450
 
451 451
 /**
@@ -459,62 +459,62 @@  discard block
 block discarded – undo
459 459
  *  temps de la tache ajoutee ou 0 pour ASAP
460 460
  */
461 461
 function queue_update_next_job_time($next_time = null) {
462
-	static $nb_jobs_scheduled = null;
463
-	static $deja_la = false;
464
-	// prendre le min des $next_time que l'on voit passer ici, en cas de reentrance
465
-	static $next = null;
466
-	// queue_close_job peut etre reentrant ici
467
-	if ($deja_la) {
468
-		return;
469
-	}
470
-	$deja_la = true;
471
-
472
-	include_spip('base/abstract_sql');
473
-	$time = time();
474
-
475
-	// traiter les jobs morts au combat (_JQ_PENDING depuis plus de 180s)
476
-	// pour cause de timeout ou autre erreur fatale
477
-	$res = sql_allfetsel(
478
-		'*',
479
-		'spip_jobs',
480
-		'status=' . intval(_JQ_PENDING) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time - 180))
481
-	);
482
-	if (is_array($res)) {
483
-		foreach ($res as $row) {
484
-			queue_close_job($row, $time);
485
-			spip_log('queue_close_job car _JQ_PENDING depuis +180s : ' . print_r($row, true), 'job_mort' . _LOG_ERREUR);
486
-		}
487
-	}
488
-
489
-	// chercher la date du prochain job si pas connu
490
-	if (is_null($next) || is_null(queue_sleep_time_to_next_job())) {
491
-		$date = sql_getfetsel('date', 'spip_jobs', 'status=' . intval(_JQ_SCHEDULED), '', 'date', '0,1');
492
-		$next = strtotime($date);
493
-	}
494
-	if (!is_null($next_time)) {
495
-		if (is_null($next) || $next > $next_time) {
496
-			$next = $next_time;
497
-		}
498
-	}
499
-
500
-	if ($next) {
501
-		if (is_null($nb_jobs_scheduled)) {
502
-			$nb_jobs_scheduled = sql_countsel(
503
-				'spip_jobs',
504
-				'status=' . intval(_JQ_SCHEDULED) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time))
505
-			);
506
-		} elseif ($next <= $time) {
507
-			$nb_jobs_scheduled++;
508
-		}
509
-		// si trop de jobs en attente, on force la purge en fin de hit
510
-		// pour assurer le coup
511
-		if ($nb_jobs_scheduled > (defined('_JQ_NB_JOBS_OVERFLOW') ? _JQ_NB_JOBS_OVERFLOW : 10000)) {
512
-			define('_DIRECT_CRON_FORCE', true);
513
-		}
514
-	}
515
-
516
-	queue_set_next_job_time($next);
517
-	$deja_la = false;
462
+    static $nb_jobs_scheduled = null;
463
+    static $deja_la = false;
464
+    // prendre le min des $next_time que l'on voit passer ici, en cas de reentrance
465
+    static $next = null;
466
+    // queue_close_job peut etre reentrant ici
467
+    if ($deja_la) {
468
+        return;
469
+    }
470
+    $deja_la = true;
471
+
472
+    include_spip('base/abstract_sql');
473
+    $time = time();
474
+
475
+    // traiter les jobs morts au combat (_JQ_PENDING depuis plus de 180s)
476
+    // pour cause de timeout ou autre erreur fatale
477
+    $res = sql_allfetsel(
478
+        '*',
479
+        'spip_jobs',
480
+        'status=' . intval(_JQ_PENDING) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time - 180))
481
+    );
482
+    if (is_array($res)) {
483
+        foreach ($res as $row) {
484
+            queue_close_job($row, $time);
485
+            spip_log('queue_close_job car _JQ_PENDING depuis +180s : ' . print_r($row, true), 'job_mort' . _LOG_ERREUR);
486
+        }
487
+    }
488
+
489
+    // chercher la date du prochain job si pas connu
490
+    if (is_null($next) || is_null(queue_sleep_time_to_next_job())) {
491
+        $date = sql_getfetsel('date', 'spip_jobs', 'status=' . intval(_JQ_SCHEDULED), '', 'date', '0,1');
492
+        $next = strtotime($date);
493
+    }
494
+    if (!is_null($next_time)) {
495
+        if (is_null($next) || $next > $next_time) {
496
+            $next = $next_time;
497
+        }
498
+    }
499
+
500
+    if ($next) {
501
+        if (is_null($nb_jobs_scheduled)) {
502
+            $nb_jobs_scheduled = sql_countsel(
503
+                'spip_jobs',
504
+                'status=' . intval(_JQ_SCHEDULED) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time))
505
+            );
506
+        } elseif ($next <= $time) {
507
+            $nb_jobs_scheduled++;
508
+        }
509
+        // si trop de jobs en attente, on force la purge en fin de hit
510
+        // pour assurer le coup
511
+        if ($nb_jobs_scheduled > (defined('_JQ_NB_JOBS_OVERFLOW') ? _JQ_NB_JOBS_OVERFLOW : 10000)) {
512
+            define('_DIRECT_CRON_FORCE', true);
513
+        }
514
+    }
515
+
516
+    queue_set_next_job_time($next);
517
+    $deja_la = false;
518 518
 }
519 519
 
520 520
 
@@ -525,26 +525,26 @@  discard block
 block discarded – undo
525 525
  */
526 526
 function queue_set_next_job_time($next) {
527 527
 
528
-	// utiliser le temps courant reel plutot que temps de la requete ici
529
-	$time = time();
530
-
531
-	// toujours relire la valeur pour comparer, pour tenir compte des maj concourrantes
532
-	// et ne mettre a jour que si il y a un interet a le faire
533
-	// permet ausis d'initialiser le nom de fichier a coup sur
534
-	$curr_next = $_SERVER['REQUEST_TIME'] + max(0, queue_sleep_time_to_next_job(true));
535
-	if (
536
-		$curr_next <= $time && $next > $time // le prochain job est dans le futur mais pas la date planifiee actuelle
537
-		|| $curr_next > $next // le prochain job est plus tot que la date planifiee actuelle
538
-	) {
539
-		if (function_exists('cache_set') && defined('_MEMOIZE_MEMORY') && _MEMOIZE_MEMORY) {
540
-			cache_set(_JQ_NEXT_JOB_TIME_FILENAME, intval($next));
541
-		} else {
542
-			ecrire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, intval($next));
543
-		}
544
-		queue_sleep_time_to_next_job($next);
545
-	}
546
-
547
-	return queue_sleep_time_to_next_job();
528
+    // utiliser le temps courant reel plutot que temps de la requete ici
529
+    $time = time();
530
+
531
+    // toujours relire la valeur pour comparer, pour tenir compte des maj concourrantes
532
+    // et ne mettre a jour que si il y a un interet a le faire
533
+    // permet ausis d'initialiser le nom de fichier a coup sur
534
+    $curr_next = $_SERVER['REQUEST_TIME'] + max(0, queue_sleep_time_to_next_job(true));
535
+    if (
536
+        $curr_next <= $time && $next > $time // le prochain job est dans le futur mais pas la date planifiee actuelle
537
+        || $curr_next > $next // le prochain job est plus tot que la date planifiee actuelle
538
+    ) {
539
+        if (function_exists('cache_set') && defined('_MEMOIZE_MEMORY') && _MEMOIZE_MEMORY) {
540
+            cache_set(_JQ_NEXT_JOB_TIME_FILENAME, intval($next));
541
+        } else {
542
+            ecrire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, intval($next));
543
+        }
544
+        queue_sleep_time_to_next_job($next);
545
+    }
546
+
547
+    return queue_sleep_time_to_next_job();
548 548
 }
549 549
 
550 550
 /**
@@ -561,60 +561,60 @@  discard block
 block discarded – undo
561 561
  * @return string
562 562
  */
563 563
 function queue_affichage_cron() {
564
-	$texte = '';
565
-
566
-	$time_to_next = queue_sleep_time_to_next_job();
567
-	// rien a faire si le prochain job est encore dans le futur
568
-	if ($time_to_next > 0 || defined('_DEBUG_BLOCK_QUEUE')) {
569
-		return $texte;
570
-	}
571
-
572
-	// ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent
573
-	if (file_exists($lock = _DIR_TMP . 'cron.lock') && !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) {
574
-		return $texte;
575
-	}
576
-
577
-	@touch($lock);
578
-
579
-	// il y a des taches en attentes
580
-	// si depuis plus de 5min, on essaye de lancer le cron par tous les moyens pour rattraper le coup
581
-	// on est sans doute sur un site qui n'autorise pas http sortant ou avec peu de trafic
582
-	$urgent = false;
583
-	if ($time_to_next < -300) {
584
-		$urgent = true;
585
-	}
586
-
587
-	$url_cron = generer_url_action('cron', '', false, true);
588
-
589
-	if (!defined('_HTML_BG_CRON_FORCE') || !_HTML_BG_CRON_FORCE) {
590
-		if (queue_lancer_url_http_async($url_cron) && !$urgent) {
591
-			return $texte;
592
-		}
593
-	}
594
-
595
-	// si deja force, on retourne sans rien
596
-	if (defined('_DIRECT_CRON_FORCE')) {
597
-		return $texte;
598
-	}
599
-
600
-	// si c'est un bot
601
-	// inutile de faire un appel par image background,
602
-	// on force un appel direct en fin de hit
603
-	if ((defined('_IS_BOT') && _IS_BOT)) {
604
-		define('_DIRECT_CRON_FORCE', true);
605
-
606
-		return $texte;
607
-	}
608
-
609
-	if (!defined('_HTML_BG_CRON_INHIB') || !_HTML_BG_CRON_INHIB) {
610
-		// en derniere solution, on insere un appel xhr non bloquant ou une image background dans la page si pas de JS
611
-		$url_cron = generer_url_action('cron');
612
-		$texte = '<!-- SPIP-CRON -->'
613
-		  . "<script>setTimeout(function(){var xo = new XMLHttpRequest();xo.open('GET', '$url_cron', true);xo.send('');},100);</script>"
614
-		  . "<noscript><div style=\"background-image: url('$url_cron');\"></div></noscript>";
615
-	}
616
-
617
-	return $texte;
564
+    $texte = '';
565
+
566
+    $time_to_next = queue_sleep_time_to_next_job();
567
+    // rien a faire si le prochain job est encore dans le futur
568
+    if ($time_to_next > 0 || defined('_DEBUG_BLOCK_QUEUE')) {
569
+        return $texte;
570
+    }
571
+
572
+    // ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent
573
+    if (file_exists($lock = _DIR_TMP . 'cron.lock') && !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) {
574
+        return $texte;
575
+    }
576
+
577
+    @touch($lock);
578
+
579
+    // il y a des taches en attentes
580
+    // si depuis plus de 5min, on essaye de lancer le cron par tous les moyens pour rattraper le coup
581
+    // on est sans doute sur un site qui n'autorise pas http sortant ou avec peu de trafic
582
+    $urgent = false;
583
+    if ($time_to_next < -300) {
584
+        $urgent = true;
585
+    }
586
+
587
+    $url_cron = generer_url_action('cron', '', false, true);
588
+
589
+    if (!defined('_HTML_BG_CRON_FORCE') || !_HTML_BG_CRON_FORCE) {
590
+        if (queue_lancer_url_http_async($url_cron) && !$urgent) {
591
+            return $texte;
592
+        }
593
+    }
594
+
595
+    // si deja force, on retourne sans rien
596
+    if (defined('_DIRECT_CRON_FORCE')) {
597
+        return $texte;
598
+    }
599
+
600
+    // si c'est un bot
601
+    // inutile de faire un appel par image background,
602
+    // on force un appel direct en fin de hit
603
+    if ((defined('_IS_BOT') && _IS_BOT)) {
604
+        define('_DIRECT_CRON_FORCE', true);
605
+
606
+        return $texte;
607
+    }
608
+
609
+    if (!defined('_HTML_BG_CRON_INHIB') || !_HTML_BG_CRON_INHIB) {
610
+        // en derniere solution, on insere un appel xhr non bloquant ou une image background dans la page si pas de JS
611
+        $url_cron = generer_url_action('cron');
612
+        $texte = '<!-- SPIP-CRON -->'
613
+            . "<script>setTimeout(function(){var xo = new XMLHttpRequest();xo.open('GET', '$url_cron', true);xo.send('');},100);</script>"
614
+            . "<noscript><div style=\"background-image: url('$url_cron');\"></div></noscript>";
615
+    }
616
+
617
+    return $texte;
618 618
 }
619 619
 
620 620
 /**
@@ -623,73 +623,73 @@  discard block
 block discarded – undo
623 623
  * @return bool : true si l'url a pu être appelée en asynchrone, false sinon
624 624
  */
625 625
 function queue_lancer_url_http_async($url_cron) {
626
-	// methode la plus rapide :
627
-	// Si fsockopen est possible, on lance le cron via un socket en asynchrone
628
-	// si fsockopen echoue (disponibilite serveur, firewall) on essaye pas cURL
629
-	// car on a toutes les chances d'echouer pareil mais sans moyen de le savoir
630
-	// mais on renvoie false direct
631
-	if (function_exists('fsockopen')) {
632
-		$parts = parse_url($url_cron);
633
-
634
-		switch ($parts['scheme']) {
635
-			case 'https':
636
-				$scheme = 'ssl://';
637
-				$port = 443;
638
-				break;
639
-			case 'http':
640
-			default:
641
-				$scheme = '';
642
-				$port = 80;
643
-		}
644
-		$fp = @fsockopen(
645
-			$scheme . $parts['host'],
646
-			$parts['port'] ?? $port,
647
-			$errno,
648
-			$errstr,
649
-			1
650
-		);
651
-
652
-		if ($fp) {
653
-			$host_sent = $parts['host'];
654
-			if (isset($parts['port']) && $parts['port'] !== $port) {
655
-				$host_sent .= ':' . $parts['port'];
656
-			}
657
-			$timeout = 200; // ms
658
-			stream_set_timeout($fp, 0, $timeout * 1000);
659
-			$query = $parts['path'] . ($parts['query'] ? '?' . $parts['query'] : '');
660
-			$out = 'GET ' . $query . " HTTP/1.1\r\n";
661
-			$out .= 'Host: ' . $host_sent . "\r\n";
662
-			$out .= "Connection: Close\r\n\r\n";
663
-			fwrite($fp, $out);
664
-			spip_timer('read');
665
-			$t = 0;
666
-			// on lit la reponse si possible pour fermer proprement la connexion
667
-			// avec un timeout total de 200ms pour ne pas se bloquer
668
-			while (!feof($fp) && $t < $timeout) {
669
-				@fgets($fp, 1024);
670
-				$t += spip_timer('read', true);
671
-				spip_timer('read');
672
-			}
673
-			fclose($fp);
674
-			return true;
675
-		}
676
-	}
677
-	// si fsockopen n'est pas dispo on essaye cURL :
678
-	// lancer le cron par un cURL asynchrone si cURL est present
679
-	elseif (function_exists('curl_init')) {
680
-		//setting the curl parameters.
681
-		$ch = curl_init($url_cron);
682
-		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
683
-		// cf bug : http://www.php.net/manual/en/function.curl-setopt.php#104597
684
-		curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
685
-		// valeur mini pour que la requete soit lancee
686
-		curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
687
-		// lancer
688
-		curl_exec($ch);
689
-		// fermer
690
-		curl_close($ch);
691
-		return true;
692
-	}
693
-
694
-	return false;
626
+    // methode la plus rapide :
627
+    // Si fsockopen est possible, on lance le cron via un socket en asynchrone
628
+    // si fsockopen echoue (disponibilite serveur, firewall) on essaye pas cURL
629
+    // car on a toutes les chances d'echouer pareil mais sans moyen de le savoir
630
+    // mais on renvoie false direct
631
+    if (function_exists('fsockopen')) {
632
+        $parts = parse_url($url_cron);
633
+
634
+        switch ($parts['scheme']) {
635
+            case 'https':
636
+                $scheme = 'ssl://';
637
+                $port = 443;
638
+                break;
639
+            case 'http':
640
+            default:
641
+                $scheme = '';
642
+                $port = 80;
643
+        }
644
+        $fp = @fsockopen(
645
+            $scheme . $parts['host'],
646
+            $parts['port'] ?? $port,
647
+            $errno,
648
+            $errstr,
649
+            1
650
+        );
651
+
652
+        if ($fp) {
653
+            $host_sent = $parts['host'];
654
+            if (isset($parts['port']) && $parts['port'] !== $port) {
655
+                $host_sent .= ':' . $parts['port'];
656
+            }
657
+            $timeout = 200; // ms
658
+            stream_set_timeout($fp, 0, $timeout * 1000);
659
+            $query = $parts['path'] . ($parts['query'] ? '?' . $parts['query'] : '');
660
+            $out = 'GET ' . $query . " HTTP/1.1\r\n";
661
+            $out .= 'Host: ' . $host_sent . "\r\n";
662
+            $out .= "Connection: Close\r\n\r\n";
663
+            fwrite($fp, $out);
664
+            spip_timer('read');
665
+            $t = 0;
666
+            // on lit la reponse si possible pour fermer proprement la connexion
667
+            // avec un timeout total de 200ms pour ne pas se bloquer
668
+            while (!feof($fp) && $t < $timeout) {
669
+                @fgets($fp, 1024);
670
+                $t += spip_timer('read', true);
671
+                spip_timer('read');
672
+            }
673
+            fclose($fp);
674
+            return true;
675
+        }
676
+    }
677
+    // si fsockopen n'est pas dispo on essaye cURL :
678
+    // lancer le cron par un cURL asynchrone si cURL est present
679
+    elseif (function_exists('curl_init')) {
680
+        //setting the curl parameters.
681
+        $ch = curl_init($url_cron);
682
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
683
+        // cf bug : http://www.php.net/manual/en/function.curl-setopt.php#104597
684
+        curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
685
+        // valeur mini pour que la requete soit lancee
686
+        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
687
+        // lancer
688
+        curl_exec($ch);
689
+        // fermer
690
+        curl_close($ch);
691
+        return true;
692
+    }
693
+
694
+    return false;
695 695
 }
Please login to merge, or discard this patch.
Spacing   +37 added lines, -38 removed lines patch added patch discarded remove patch
@@ -69,7 +69,7 @@  discard block
 block discarded – undo
69 69
 	$md5args = md5($arguments);
70 70
 
71 71
 	// si pas de date programee, des que possible
72
-	$duplicate_where = 'status=' . intval(_JQ_SCHEDULED) . ' AND ';
72
+	$duplicate_where = 'status='.intval(_JQ_SCHEDULED).' AND ';
73 73
 	if (!$time) {
74 74
 		$time = time();
75 75
 		$duplicate_where = ''; // ne pas dupliquer si deja le meme job en cours d'execution
@@ -94,9 +94,8 @@  discard block
 block discarded – undo
94 94
 			'id_job',
95 95
 			'spip_jobs',
96 96
 			$duplicate_where =
97
-				$duplicate_where . 'fonction=' . sql_quote($function)
98
-				. (($no_duplicate === 'function_only') ? '' :
99
-			' AND md5args=' . sql_quote($md5args) . ' AND inclure=' . sql_quote($file))
97
+				$duplicate_where.'fonction='.sql_quote($function)
98
+				. (($no_duplicate === 'function_only') ? '' : ' AND md5args='.sql_quote($md5args).' AND inclure='.sql_quote($file))
100 99
 		))
101 100
 	) {
102 101
 		return $id_job;
@@ -108,9 +107,9 @@  discard block
 block discarded – undo
108 107
 	// doit s'effacer
109 108
 	if (
110 109
 		$no_duplicate
111
-		&& ($id_prev = sql_getfetsel('id_job', 'spip_jobs', 'id_job<' . intval($id_job) . " AND $duplicate_where"))
110
+		&& ($id_prev = sql_getfetsel('id_job', 'spip_jobs', 'id_job<'.intval($id_job)." AND $duplicate_where"))
112 111
 	) {
113
-		sql_delete('spip_jobs', 'id_job=' . intval($id_job));
112
+		sql_delete('spip_jobs', 'id_job='.intval($id_job));
114 113
 
115 114
 		return $id_prev;
116 115
 	}
@@ -122,9 +121,9 @@  discard block
 block discarded – undo
122 121
 	// ie cas d'un char non acceptables sur certains type de champs
123 122
 	// qui coupe la valeur
124 123
 	if (defined('_JQ_INSERT_CHECK_ARGS') && $id_job) {
125
-		$args = sql_getfetsel('args', 'spip_jobs', 'id_job=' . intval($id_job));
124
+		$args = sql_getfetsel('args', 'spip_jobs', 'id_job='.intval($id_job));
126 125
 		if ($args !== $arguments) {
127
-			spip_log('arguments job errones / longueur ' . strlen($args) . ' vs ' . strlen($arguments) . ' / valeur : ' . var_export(
126
+			spip_log('arguments job errones / longueur '.strlen($args).' vs '.strlen($arguments).' / valeur : '.var_export(
128 127
 				$arguments,
129 128
 				true
130 129
 			), 'queue');
@@ -154,7 +153,7 @@  discard block
 block discarded – undo
154 153
 function queue_purger() {
155 154
 	include_spip('base/abstract_sql');
156 155
 	sql_delete('spip_jobs');
157
-	sql_delete('spip_jobs_liens', 'id_job NOT IN (' . sql_get_select('id_job', 'spip_jobs') . ')');
156
+	sql_delete('spip_jobs_liens', 'id_job NOT IN ('.sql_get_select('id_job', 'spip_jobs').')');
158 157
 	include_spip('inc/genie');
159 158
 	genie_queue_watch_dist();
160 159
 }
@@ -170,8 +169,8 @@  discard block
 block discarded – undo
170 169
 	include_spip('base/abstract_sql');
171 170
 
172 171
 	if (
173
-		($row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job=' . intval($id_job)))
174
-		&& ($res = sql_delete('spip_jobs', 'id_job=' . intval($id_job)))
172
+		($row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job='.intval($id_job)))
173
+		&& ($res = sql_delete('spip_jobs', 'id_job='.intval($id_job)))
175 174
 	) {
176 175
 		queue_unlink_job($id_job);
177 176
 		// est-ce une tache cron qu'il faut relancer ?
@@ -221,7 +220,7 @@  discard block
 block discarded – undo
221 220
  *  resultat du sql_delete
222 221
  */
223 222
 function queue_unlink_job($id_job) {
224
-	return sql_delete('spip_jobs_liens', 'id_job=' . intval($id_job));
223
+	return sql_delete('spip_jobs_liens', 'id_job='.intval($id_job));
225 224
 }
226 225
 
227 226
 /**
@@ -237,7 +236,7 @@  discard block
 block discarded – undo
237 236
 	// deserialiser les arguments
238 237
 	$args = unserialize($row['args']);
239 238
 	if (!is_array($args)) {
240
-		spip_log('arguments job errones ' . var_export($row, true), 'queue');
239
+		spip_log('arguments job errones '.var_export($row, true), 'queue');
241 240
 		return false;
242 241
 	}
243 242
 
@@ -254,14 +253,14 @@  discard block
 block discarded – undo
254 253
 	}
255 254
 
256 255
 	if (!function_exists($fonction)) {
257
-		spip_log("fonction $fonction ($inclure) inexistante " . var_export($row, true), 'queue');
256
+		spip_log("fonction $fonction ($inclure) inexistante ".var_export($row, true), 'queue');
258 257
 
259 258
 		return false;
260 259
 	}
261 260
 
262
-	spip_log('queue [' . $row['id_job'] . "]: $fonction() start", 'queue');
261
+	spip_log('queue ['.$row['id_job']."]: $fonction() start", 'queue');
263 262
 	$res = $fonction(...$args);
264
-	spip_log('queue [' . $row['id_job'] . "]: $fonction() end", 'queue');
263
+	spip_log('queue ['.$row['id_job']."]: $fonction() end", 'queue');
265 264
 
266 265
 	return $res;
267 266
 }
@@ -292,14 +291,14 @@  discard block
 block discarded – undo
292 291
 function queue_schedule($force_jobs = null) {
293 292
 	$time = time();
294 293
 	if (defined('_DEBUG_BLOCK_QUEUE')) {
295
-		spip_log('_DEBUG_BLOCK_QUEUE : schedule stop', 'jq' . _LOG_DEBUG);
294
+		spip_log('_DEBUG_BLOCK_QUEUE : schedule stop', 'jq'._LOG_DEBUG);
296 295
 
297 296
 		return;
298 297
 	}
299 298
 
300 299
 	// rien a faire si le prochain job est encore dans le futur
301 300
 	if (queue_sleep_time_to_next_job() > 0 && (!$force_jobs || !count($force_jobs))) {
302
-		spip_log('queue_sleep_time_to_next_job', 'jq' . _LOG_DEBUG);
301
+		spip_log('queue_sleep_time_to_next_job', 'jq'._LOG_DEBUG);
303 302
 
304 303
 		return;
305 304
 	}
@@ -320,7 +319,7 @@  discard block
 block discarded – undo
320 319
 	}
321 320
 	$end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE;
322 321
 
323
-	spip_log("JQ schedule $time / $end_time", 'jq' . _LOG_DEBUG);
322
+	spip_log("JQ schedule $time / $end_time", 'jq'._LOG_DEBUG);
324 323
 
325 324
 	if (!defined('_JQ_MAX_JOBS_EXECUTE')) {
326 325
 		define('_JQ_MAX_JOBS_EXECUTE', 200);
@@ -334,19 +333,19 @@  discard block
 block discarded – undo
334 333
 	// lorsqu'un job cron n'a pas fini, sa priorite est descendue
335 334
 	// pour qu'il ne bloque pas les autres jobs en attente
336 335
 	if (is_array($force_jobs) && count($force_jobs)) {
337
-		$cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND ' . sql_in('id_job', $force_jobs);
336
+		$cond = 'status='.intval(_JQ_SCHEDULED).' AND '.sql_in('id_job', $force_jobs);
338 337
 	} else {
339 338
 		$now = date('Y-m-d H:i:s', $time);
340
-		$cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND date<=' . sql_quote($now);
339
+		$cond = 'status='.intval(_JQ_SCHEDULED).' AND date<='.sql_quote($now);
341 340
 	}
342 341
 
343 342
 	register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible
344
-	$res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,' . (_JQ_MAX_JOBS_EXECUTE + 1));
343
+	$res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,'.(_JQ_MAX_JOBS_EXECUTE + 1));
345 344
 	do {
346 345
 		if ($row = array_shift($res)) {
347 346
 			$nbj++;
348 347
 			// il faut un verrou, a base de sql_delete
349
-			if (sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']) . ' AND status=' . intval(_JQ_SCHEDULED))) {
348
+			if (sql_delete('spip_jobs', 'id_job='.intval($row['id_job']).' AND status='.intval(_JQ_SCHEDULED))) {
350 349
 				#spip_log("JQ schedule job ".$nbj." OK",'jq');
351 350
 				// on reinsert dans la base aussitot avec un status=_JQ_PENDING
352 351
 				$row['status'] = _JQ_PENDING;
@@ -361,13 +360,13 @@  discard block
 block discarded – undo
361 360
 				queue_close_job($row, $time, $result);
362 361
 			}
363 362
 		}
364
-		spip_log('JQ schedule job end time ' . $time, 'jq' . _LOG_DEBUG);
363
+		spip_log('JQ schedule job end time '.$time, 'jq'._LOG_DEBUG);
365 364
 	} while ($nbj < _JQ_MAX_JOBS_EXECUTE && $row && $time < $end_time);
366
-	spip_log('JQ schedule end time ' . time(), 'jq' . _LOG_DEBUG);
365
+	spip_log('JQ schedule end time '.time(), 'jq'._LOG_DEBUG);
367 366
 
368 367
 	if ($row = array_shift($res)) {
369 368
 		queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP
370
-		spip_log('JQ encore !', 'jq' . _LOG_DEBUG);
369
+		spip_log('JQ encore !', 'jq'._LOG_DEBUG);
371 370
 	} else {
372 371
 		queue_update_next_job_time();
373 372
 	}
@@ -402,9 +401,9 @@  discard block
 block discarded – undo
402 401
 		}
403 402
 	}
404 403
 	// purger ses liens eventuels avec des objets
405
-	sql_delete('spip_jobs_liens', 'id_job=' . intval($row['id_job']));
404
+	sql_delete('spip_jobs_liens', 'id_job='.intval($row['id_job']));
406 405
 	// supprimer le job fini
407
-	sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']));
406
+	sql_delete('spip_jobs', 'id_job='.intval($row['id_job']));
408 407
 }
409 408
 
410 409
 /**
@@ -477,18 +476,18 @@  discard block
 block discarded – undo
477 476
 	$res = sql_allfetsel(
478 477
 		'*',
479 478
 		'spip_jobs',
480
-		'status=' . intval(_JQ_PENDING) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time - 180))
479
+		'status='.intval(_JQ_PENDING).' AND date<'.sql_quote(date('Y-m-d H:i:s', $time - 180))
481 480
 	);
482 481
 	if (is_array($res)) {
483 482
 		foreach ($res as $row) {
484 483
 			queue_close_job($row, $time);
485
-			spip_log('queue_close_job car _JQ_PENDING depuis +180s : ' . print_r($row, true), 'job_mort' . _LOG_ERREUR);
484
+			spip_log('queue_close_job car _JQ_PENDING depuis +180s : '.print_r($row, true), 'job_mort'._LOG_ERREUR);
486 485
 		}
487 486
 	}
488 487
 
489 488
 	// chercher la date du prochain job si pas connu
490 489
 	if (is_null($next) || is_null(queue_sleep_time_to_next_job())) {
491
-		$date = sql_getfetsel('date', 'spip_jobs', 'status=' . intval(_JQ_SCHEDULED), '', 'date', '0,1');
490
+		$date = sql_getfetsel('date', 'spip_jobs', 'status='.intval(_JQ_SCHEDULED), '', 'date', '0,1');
492 491
 		$next = strtotime($date);
493 492
 	}
494 493
 	if (!is_null($next_time)) {
@@ -501,7 +500,7 @@  discard block
 block discarded – undo
501 500
 		if (is_null($nb_jobs_scheduled)) {
502 501
 			$nb_jobs_scheduled = sql_countsel(
503 502
 				'spip_jobs',
504
-				'status=' . intval(_JQ_SCHEDULED) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time))
503
+				'status='.intval(_JQ_SCHEDULED).' AND date<'.sql_quote(date('Y-m-d H:i:s', $time))
505 504
 			);
506 505
 		} elseif ($next <= $time) {
507 506
 			$nb_jobs_scheduled++;
@@ -570,7 +569,7 @@  discard block
 block discarded – undo
570 569
 	}
571 570
 
572 571
 	// ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent
573
-	if (file_exists($lock = _DIR_TMP . 'cron.lock') && !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) {
572
+	if (file_exists($lock = _DIR_TMP.'cron.lock') && !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) {
574 573
 		return $texte;
575 574
 	}
576 575
 
@@ -642,7 +641,7 @@  discard block
 block discarded – undo
642 641
 				$port = 80;
643 642
 		}
644 643
 		$fp = @fsockopen(
645
-			$scheme . $parts['host'],
644
+			$scheme.$parts['host'],
646 645
 			$parts['port'] ?? $port,
647 646
 			$errno,
648 647
 			$errstr,
@@ -652,13 +651,13 @@  discard block
 block discarded – undo
652 651
 		if ($fp) {
653 652
 			$host_sent = $parts['host'];
654 653
 			if (isset($parts['port']) && $parts['port'] !== $port) {
655
-				$host_sent .= ':' . $parts['port'];
654
+				$host_sent .= ':'.$parts['port'];
656 655
 			}
657 656
 			$timeout = 200; // ms
658 657
 			stream_set_timeout($fp, 0, $timeout * 1000);
659
-			$query = $parts['path'] . ($parts['query'] ? '?' . $parts['query'] : '');
660
-			$out = 'GET ' . $query . " HTTP/1.1\r\n";
661
-			$out .= 'Host: ' . $host_sent . "\r\n";
658
+			$query = $parts['path'].($parts['query'] ? '?'.$parts['query'] : '');
659
+			$out = 'GET '.$query." HTTP/1.1\r\n";
660
+			$out .= 'Host: '.$host_sent."\r\n";
662 661
 			$out .= "Connection: Close\r\n\r\n";
663 662
 			fwrite($fp, $out);
664 663
 			spip_timer('read');
Please login to merge, or discard this patch.
ecrire/inc/plugin.php 3 patches
Indentation   +976 added lines, -976 removed lines patch added patch discarded remove patch
@@ -16,12 +16,12 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /** l'adresse du repertoire de telechargement et de decompactage des plugins */
23 23
 if (!defined('_DIR_PLUGINS_AUTO')) {
24
-	define('_DIR_PLUGINS_AUTO', _DIR_PLUGINS . 'auto/');
24
+    define('_DIR_PLUGINS_AUTO', _DIR_PLUGINS . 'auto/');
25 25
 }
26 26
 
27 27
 #include_spip('inc/texte'); // ????? Appelle public/parametrer trop tot avant la reconstruction du chemin des plugins.
@@ -46,27 +46,27 @@  discard block
 block discarded – undo
46 46
  * @return array
47 47
 **/
48 48
 function liste_plugin_files($dir_plugins = null) {
49
-	static $plugin_files = [];
50
-	if (is_null($dir_plugins)) {
51
-		$dir_plugins = _DIR_PLUGINS;
52
-	}
53
-	if (
54
-		!isset($plugin_files[$dir_plugins])
55
-		|| (is_countable($plugin_files[$dir_plugins]) ? count($plugin_files[$dir_plugins]) : 0) == 0
56
-	) {
57
-		$plugin_files[$dir_plugins] = [];
58
-		foreach (fast_find_plugin_dirs($dir_plugins) as $plugin) {
59
-			$plugin_files[$dir_plugins][] = substr($plugin, strlen($dir_plugins));
60
-		}
61
-
62
-		sort($plugin_files[$dir_plugins]);
63
-		// et on lit le XML de tous les plugins pour le mettre en cache
64
-		// et en profiter pour nettoyer ceux qui n'existent plus du cache
65
-		$get_infos = charger_fonction('get_infos', 'plugins');
66
-		$get_infos($plugin_files[$dir_plugins], false, $dir_plugins, true);
67
-	}
68
-
69
-	return $plugin_files[$dir_plugins];
49
+    static $plugin_files = [];
50
+    if (is_null($dir_plugins)) {
51
+        $dir_plugins = _DIR_PLUGINS;
52
+    }
53
+    if (
54
+        !isset($plugin_files[$dir_plugins])
55
+        || (is_countable($plugin_files[$dir_plugins]) ? count($plugin_files[$dir_plugins]) : 0) == 0
56
+    ) {
57
+        $plugin_files[$dir_plugins] = [];
58
+        foreach (fast_find_plugin_dirs($dir_plugins) as $plugin) {
59
+            $plugin_files[$dir_plugins][] = substr($plugin, strlen($dir_plugins));
60
+        }
61
+
62
+        sort($plugin_files[$dir_plugins]);
63
+        // et on lit le XML de tous les plugins pour le mettre en cache
64
+        // et en profiter pour nettoyer ceux qui n'existent plus du cache
65
+        $get_infos = charger_fonction('get_infos', 'plugins');
66
+        $get_infos($plugin_files[$dir_plugins], false, $dir_plugins, true);
67
+    }
68
+
69
+    return $plugin_files[$dir_plugins];
70 70
 }
71 71
 
72 72
 /**
@@ -82,44 +82,44 @@  discard block
 block discarded – undo
82 82
  *     Liste complète des répeertoires
83 83
 **/
84 84
 function fast_find_plugin_dirs($dir, $max_prof = 100) {
85
-	$fichiers = [];
86
-	// revenir au repertoire racine si on a recu dossier/truc
87
-	// pour regarder dossier/truc/ ne pas oublier le / final
88
-	$dir = preg_replace(',/[^/]*$,', '', $dir);
89
-	if ($dir == '') {
90
-		$dir = '.';
91
-	}
92
-
93
-	if (!is_dir($dir)) {
94
-		return $fichiers;
95
-	}
96
-	if (is_plugin_dir($dir, '')) {
97
-		$fichiers[] = $dir;
98
-
99
-		return $fichiers;
100
-	}
101
-	if ($max_prof <= 0) {
102
-		return $fichiers;
103
-	}
104
-
105
-	$subdirs = [];
106
-	if (@is_dir($dir) && is_readable($dir) && ($d = opendir($dir))) {
107
-		while (($f = readdir($d)) !== false) {
108
-			if (
109
-				$f[0] != '.'
110
-				&& is_dir($f = "$dir/$f")
111
-			) {
112
-				$subdirs[] = $f;
113
-			}
114
-		}
115
-		closedir($d);
116
-	}
117
-
118
-	foreach ($subdirs as $d) {
119
-		$fichiers = array_merge($fichiers, fast_find_plugin_dirs("$d/", $max_prof - 1));
120
-	}
121
-
122
-	return $fichiers;
85
+    $fichiers = [];
86
+    // revenir au repertoire racine si on a recu dossier/truc
87
+    // pour regarder dossier/truc/ ne pas oublier le / final
88
+    $dir = preg_replace(',/[^/]*$,', '', $dir);
89
+    if ($dir == '') {
90
+        $dir = '.';
91
+    }
92
+
93
+    if (!is_dir($dir)) {
94
+        return $fichiers;
95
+    }
96
+    if (is_plugin_dir($dir, '')) {
97
+        $fichiers[] = $dir;
98
+
99
+        return $fichiers;
100
+    }
101
+    if ($max_prof <= 0) {
102
+        return $fichiers;
103
+    }
104
+
105
+    $subdirs = [];
106
+    if (@is_dir($dir) && is_readable($dir) && ($d = opendir($dir))) {
107
+        while (($f = readdir($d)) !== false) {
108
+            if (
109
+                $f[0] != '.'
110
+                && is_dir($f = "$dir/$f")
111
+            ) {
112
+                $subdirs[] = $f;
113
+            }
114
+        }
115
+        closedir($d);
116
+    }
117
+
118
+    foreach ($subdirs as $d) {
119
+        $fichiers = array_merge($fichiers, fast_find_plugin_dirs("$d/", $max_prof - 1));
120
+    }
121
+
122
+    return $fichiers;
123 123
 }
124 124
 
125 125
 /**
@@ -140,27 +140,27 @@  discard block
 block discarded – undo
140 140
 **/
141 141
 function is_plugin_dir($dir, $dir_plugins = null) {
142 142
 
143
-	if (is_array($dir)) {
144
-		foreach ($dir as $k => $d) {
145
-			if (!is_plugin_dir($d, $dir_plugins)) {
146
-				unset($dir[$k]);
147
-			}
148
-		}
149
-
150
-		return $dir;
151
-	}
152
-	if (is_null($dir_plugins)) {
153
-		$dir_plugins = _DIR_PLUGINS;
154
-	}
155
-	$search = ["$dir_plugins$dir/paquet.xml"];
156
-
157
-	foreach ($search as $s) {
158
-		if (file_exists($s)) {
159
-			return $dir;
160
-		}
161
-	}
162
-
163
-	return '';
143
+    if (is_array($dir)) {
144
+        foreach ($dir as $k => $d) {
145
+            if (!is_plugin_dir($d, $dir_plugins)) {
146
+                unset($dir[$k]);
147
+            }
148
+        }
149
+
150
+        return $dir;
151
+    }
152
+    if (is_null($dir_plugins)) {
153
+        $dir_plugins = _DIR_PLUGINS;
154
+    }
155
+    $search = ["$dir_plugins$dir/paquet.xml"];
156
+
157
+    foreach ($search as $s) {
158
+        if (file_exists($s)) {
159
+            return $dir;
160
+        }
161
+    }
162
+
163
+    return '';
164 164
 }
165 165
 
166 166
 /** Regexp d'extraction des informations d'un intervalle de compatibilité */
@@ -187,51 +187,51 @@  discard block
 block discarded – undo
187 187
  **/
188 188
 function plugin_version_compatible($intervalle, $version, $avec_quoi = '') {
189 189
 
190
-	if (!strlen($intervalle)) {
191
-		return true;
192
-	}
193
-	if (!preg_match(_EXTRAIRE_INTERVALLE, $intervalle, $regs)) {
194
-		return false;
195
-	}
196
-	// Extraction des bornes et traitement de * pour la borne sup :
197
-	// -- on autorise uniquement les ecritures 3.0.*, 3.*
198
-	$minimum = $regs[1];
199
-	$maximum = $regs[2];
200
-
201
-	//  si une version SPIP de compatibilité a été définie (dans
202
-	//  mes_options.php, sous la forme : define('_DEV_VERSION_SPIP_COMPAT', '3.1.0');
203
-	//  on l'utilise (phase de dev, de test...) mais *que* en cas de comparaison
204
-	//  avec la version de SPIP (ne nuit donc pas aux tests de necessite
205
-	//  entre plugins)
206
-	if (defined('_DEV_VERSION_SPIP_COMPAT') && $avec_quoi == 'spip' && $version !== _DEV_VERSION_SPIP_COMPAT) {
207
-		if (plugin_version_compatible($intervalle, _DEV_VERSION_SPIP_COMPAT, $avec_quoi)) {
208
-			return true;
209
-		}
210
-		// si pas de compatibilite avec _DEV_VERSION_SPIP_COMPAT, on essaye quand meme avec la vrai version
211
-		// cas du plugin qui n'est compatible qu'avec cette nouvelle version
212
-	}
213
-
214
-	$minimum_inc = $intervalle[0] == '[';
215
-	$maximum_inc = str_ends_with($intervalle, ']');
216
-
217
-	if (strlen($minimum)) {
218
-		if ($minimum_inc && spip_version_compare($version, $minimum, '<')) {
219
-			return false;
220
-		}
221
-		if (!$minimum_inc && spip_version_compare($version, $minimum, '<=')) {
222
-			return false;
223
-		}
224
-	}
225
-	if (strlen($maximum)) {
226
-		if ($maximum_inc && spip_version_compare($version, $maximum, '>')) {
227
-			return false;
228
-		}
229
-		if (!$maximum_inc && spip_version_compare($version, $maximum, '>=')) {
230
-			return false;
231
-		}
232
-	}
233
-
234
-	return true;
190
+    if (!strlen($intervalle)) {
191
+        return true;
192
+    }
193
+    if (!preg_match(_EXTRAIRE_INTERVALLE, $intervalle, $regs)) {
194
+        return false;
195
+    }
196
+    // Extraction des bornes et traitement de * pour la borne sup :
197
+    // -- on autorise uniquement les ecritures 3.0.*, 3.*
198
+    $minimum = $regs[1];
199
+    $maximum = $regs[2];
200
+
201
+    //  si une version SPIP de compatibilité a été définie (dans
202
+    //  mes_options.php, sous la forme : define('_DEV_VERSION_SPIP_COMPAT', '3.1.0');
203
+    //  on l'utilise (phase de dev, de test...) mais *que* en cas de comparaison
204
+    //  avec la version de SPIP (ne nuit donc pas aux tests de necessite
205
+    //  entre plugins)
206
+    if (defined('_DEV_VERSION_SPIP_COMPAT') && $avec_quoi == 'spip' && $version !== _DEV_VERSION_SPIP_COMPAT) {
207
+        if (plugin_version_compatible($intervalle, _DEV_VERSION_SPIP_COMPAT, $avec_quoi)) {
208
+            return true;
209
+        }
210
+        // si pas de compatibilite avec _DEV_VERSION_SPIP_COMPAT, on essaye quand meme avec la vrai version
211
+        // cas du plugin qui n'est compatible qu'avec cette nouvelle version
212
+    }
213
+
214
+    $minimum_inc = $intervalle[0] == '[';
215
+    $maximum_inc = str_ends_with($intervalle, ']');
216
+
217
+    if (strlen($minimum)) {
218
+        if ($minimum_inc && spip_version_compare($version, $minimum, '<')) {
219
+            return false;
220
+        }
221
+        if (!$minimum_inc && spip_version_compare($version, $minimum, '<=')) {
222
+            return false;
223
+        }
224
+    }
225
+    if (strlen($maximum)) {
226
+        if ($maximum_inc && spip_version_compare($version, $maximum, '>')) {
227
+            return false;
228
+        }
229
+        if (!$maximum_inc && spip_version_compare($version, $maximum, '>=')) {
230
+            return false;
231
+        }
232
+    }
233
+
234
+    return true;
235 235
 }
236 236
 
237 237
 /**
@@ -248,62 +248,62 @@  discard block
 block discarded – undo
248 248
  * @return array
249 249
  */
250 250
 function liste_plugin_valides($liste_plug, $force = false) {
251
-	$liste_ext = liste_plugin_files(_DIR_PLUGINS_DIST);
252
-	$get_infos = charger_fonction('get_infos', 'plugins');
253
-	$infos = [
254
-		// lister les extensions qui sont automatiquement actives
255
-		'_DIR_PLUGINS_DIST' => $get_infos($liste_ext, $force, _DIR_PLUGINS_DIST),
256
-		'_DIR_PLUGINS' => $get_infos($liste_plug, $force, _DIR_PLUGINS)
257
-	];
258
-
259
-	// creer une premiere liste non ordonnee mais qui ne retient
260
-	// que les plugins valides, et dans leur derniere version en cas de doublon
261
-	$infos['_DIR_RESTREINT'][''] = $get_infos('./', $force, _DIR_RESTREINT);
262
-	$infos['_DIR_RESTREINT']['SPIP']['version'] = $GLOBALS['spip_version_branche'];
263
-	$infos['_DIR_RESTREINT']['SPIP']['chemin'] = [];
264
-	$liste_non_classee = [
265
-		'SPIP' => [
266
-			'nom' => 'SPIP',
267
-			'etat' => 'stable',
268
-			'version' => $GLOBALS['spip_version_branche'],
269
-			'dir_type' => '_DIR_RESTREINT',
270
-			'dir' => '',
271
-		]
272
-	];
273
-
274
-	$invalides = [];
275
-	foreach ($liste_ext as $plug) {
276
-		if (isset($infos['_DIR_PLUGINS_DIST'][$plug])) {
277
-			plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_DIST');
278
-		}
279
-	}
280
-	foreach ($liste_plug as $plug) {
281
-		if (isset($infos['_DIR_PLUGINS'][$plug])) {
282
-			$r = plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS');
283
-			if (is_array($r)) {
284
-				$invalides = array_merge($invalides, $r);
285
-			}
286
-		}
287
-	}
288
-
289
-	if (defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) {
290
-		$infos['_DIR_PLUGINS_SUPPL'] = $get_infos($liste_plug, false, _DIR_PLUGINS_SUPPL);
291
-		foreach ($liste_plug as $plug) {
292
-			if (isset($infos['_DIR_PLUGINS_SUPPL'][$plug])) {
293
-				$r = plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_SUPPL');
294
-				if (is_array($r)) {
295
-					$invalides = array_merge($invalides, $r);
296
-				}
297
-			}
298
-		}
299
-	}
300
-
301
-	plugin_fixer_procure($liste_non_classee, $infos);
302
-
303
-	// les plugins qui sont dans $liste_non_classee ne sont pas invalides (on a trouve un autre version valide)
304
-	$invalides = array_diff_key($invalides, $liste_non_classee);
305
-
306
-	return [$infos, $liste_non_classee, $invalides];
251
+    $liste_ext = liste_plugin_files(_DIR_PLUGINS_DIST);
252
+    $get_infos = charger_fonction('get_infos', 'plugins');
253
+    $infos = [
254
+        // lister les extensions qui sont automatiquement actives
255
+        '_DIR_PLUGINS_DIST' => $get_infos($liste_ext, $force, _DIR_PLUGINS_DIST),
256
+        '_DIR_PLUGINS' => $get_infos($liste_plug, $force, _DIR_PLUGINS)
257
+    ];
258
+
259
+    // creer une premiere liste non ordonnee mais qui ne retient
260
+    // que les plugins valides, et dans leur derniere version en cas de doublon
261
+    $infos['_DIR_RESTREINT'][''] = $get_infos('./', $force, _DIR_RESTREINT);
262
+    $infos['_DIR_RESTREINT']['SPIP']['version'] = $GLOBALS['spip_version_branche'];
263
+    $infos['_DIR_RESTREINT']['SPIP']['chemin'] = [];
264
+    $liste_non_classee = [
265
+        'SPIP' => [
266
+            'nom' => 'SPIP',
267
+            'etat' => 'stable',
268
+            'version' => $GLOBALS['spip_version_branche'],
269
+            'dir_type' => '_DIR_RESTREINT',
270
+            'dir' => '',
271
+        ]
272
+    ];
273
+
274
+    $invalides = [];
275
+    foreach ($liste_ext as $plug) {
276
+        if (isset($infos['_DIR_PLUGINS_DIST'][$plug])) {
277
+            plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_DIST');
278
+        }
279
+    }
280
+    foreach ($liste_plug as $plug) {
281
+        if (isset($infos['_DIR_PLUGINS'][$plug])) {
282
+            $r = plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS');
283
+            if (is_array($r)) {
284
+                $invalides = array_merge($invalides, $r);
285
+            }
286
+        }
287
+    }
288
+
289
+    if (defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) {
290
+        $infos['_DIR_PLUGINS_SUPPL'] = $get_infos($liste_plug, false, _DIR_PLUGINS_SUPPL);
291
+        foreach ($liste_plug as $plug) {
292
+            if (isset($infos['_DIR_PLUGINS_SUPPL'][$plug])) {
293
+                $r = plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_SUPPL');
294
+                if (is_array($r)) {
295
+                    $invalides = array_merge($invalides, $r);
296
+                }
297
+            }
298
+        }
299
+    }
300
+
301
+    plugin_fixer_procure($liste_non_classee, $infos);
302
+
303
+    // les plugins qui sont dans $liste_non_classee ne sont pas invalides (on a trouve un autre version valide)
304
+    $invalides = array_diff_key($invalides, $liste_non_classee);
305
+
306
+    return [$infos, $liste_non_classee, $invalides];
307 307
 }
308 308
 
309 309
 /**
@@ -323,37 +323,37 @@  discard block
 block discarded – undo
323 323
  *   array description short si on ne le retient pas (pour memorisation dans une table des erreurs)
324 324
  */
325 325
 function plugin_valide_resume(&$liste, $plug, $infos, $dir_type) {
326
-	$i = $infos[$dir_type][$plug];
327
-	// minimum syndical pour afficher si le xml avait des erreurs éventuelles
328
-	$short_desc = [
329
-		'dir' => $plug,
330
-		'dir_type' => $dir_type
331
-	];
332
-	if (empty($i['prefix'])) {
333
-		// erreur xml ? mais sans connaissance du prefix, on retourne le chemin…
334
-		$short_desc['erreur'] = $i['erreur'] ?? ['?'];
335
-		return [$plug => $short_desc];
336
-	}
337
-
338
-	$p = strtoupper($i['prefix']);
339
-	$short_desc['nom'] = $i['nom'];
340
-	$short_desc['etat'] = $i['etat'];
341
-	$short_desc['version'] = $i['version'];
342
-
343
-	if (isset($i['erreur']) && $i['erreur']) {
344
-		$short_desc['erreur'] = $i['erreur'];
345
-		return [$p => $short_desc];
346
-	}
347
-	if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
348
-		return [$p => $short_desc];
349
-	}
350
-	if (
351
-		!isset($liste[$p]) || spip_version_compare($i['version'], $liste[$p]['version'], '>')
352
-	) {
353
-		$liste[$p] = $short_desc;
354
-	}
355
-	// ok le plugin etait deja dans la liste ou on a choisi une version plus recente
356
-	return $p;
326
+    $i = $infos[$dir_type][$plug];
327
+    // minimum syndical pour afficher si le xml avait des erreurs éventuelles
328
+    $short_desc = [
329
+        'dir' => $plug,
330
+        'dir_type' => $dir_type
331
+    ];
332
+    if (empty($i['prefix'])) {
333
+        // erreur xml ? mais sans connaissance du prefix, on retourne le chemin…
334
+        $short_desc['erreur'] = $i['erreur'] ?? ['?'];
335
+        return [$plug => $short_desc];
336
+    }
337
+
338
+    $p = strtoupper($i['prefix']);
339
+    $short_desc['nom'] = $i['nom'];
340
+    $short_desc['etat'] = $i['etat'];
341
+    $short_desc['version'] = $i['version'];
342
+
343
+    if (isset($i['erreur']) && $i['erreur']) {
344
+        $short_desc['erreur'] = $i['erreur'];
345
+        return [$p => $short_desc];
346
+    }
347
+    if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
348
+        return [$p => $short_desc];
349
+    }
350
+    if (
351
+        !isset($liste[$p]) || spip_version_compare($i['version'], $liste[$p]['version'], '>')
352
+    ) {
353
+        $liste[$p] = $short_desc;
354
+    }
355
+    // ok le plugin etait deja dans la liste ou on a choisi une version plus recente
356
+    return $p;
357 357
 }
358 358
 
359 359
 /**
@@ -369,47 +369,47 @@  discard block
 block discarded – undo
369 369
  * @param array $infos
370 370
  */
371 371
 function plugin_fixer_procure(&$liste, &$infos) {
372
-	foreach ($liste as $p => $resume) {
373
-		$i = $infos[$resume['dir_type']][$resume['dir']];
374
-		if (isset($i['procure']) && $i['procure']) {
375
-			foreach ($i['procure'] as $procure) {
376
-				$p = strtoupper($procure['nom']);
377
-				$dir = $resume['dir'];
378
-				if ($dir) {
379
-					$dir .= '/';
380
-				}
381
-				$dir .= 'procure:' . $procure['nom'];
382
-
383
-				$procure['etat'] = '?';
384
-				$procure['dir_type'] = $resume['dir_type'];
385
-				$procure['dir'] = $dir;
386
-
387
-				// si ce plugin n'est pas deja procure, ou dans une version plus ancienne
388
-				// on ajoute cette version a la liste
389
-				if (
390
-					!isset($liste[$p])
391
-					|| spip_version_compare($procure['version'], $liste[$p]['version'], '>')
392
-				) {
393
-					$liste[$p] = $procure;
394
-
395
-					// on fournit une information minimale pour ne pas perturber la compilation
396
-					$infos[$resume['dir_type']][$dir] = [
397
-						'prefix' => $procure['nom'],
398
-						'nom' => $procure['nom'],
399
-						'etat' => $procure['etat'],
400
-						'version' => $procure['version'],
401
-						'chemin' => [],
402
-						'necessite' => [],
403
-						'utilise' => [],
404
-						'lib' => [],
405
-						'menu' => [],
406
-						'onglet' => [],
407
-						'procure' => [],
408
-					];
409
-				}
410
-			}
411
-		}
412
-	}
372
+    foreach ($liste as $p => $resume) {
373
+        $i = $infos[$resume['dir_type']][$resume['dir']];
374
+        if (isset($i['procure']) && $i['procure']) {
375
+            foreach ($i['procure'] as $procure) {
376
+                $p = strtoupper($procure['nom']);
377
+                $dir = $resume['dir'];
378
+                if ($dir) {
379
+                    $dir .= '/';
380
+                }
381
+                $dir .= 'procure:' . $procure['nom'];
382
+
383
+                $procure['etat'] = '?';
384
+                $procure['dir_type'] = $resume['dir_type'];
385
+                $procure['dir'] = $dir;
386
+
387
+                // si ce plugin n'est pas deja procure, ou dans une version plus ancienne
388
+                // on ajoute cette version a la liste
389
+                if (
390
+                    !isset($liste[$p])
391
+                    || spip_version_compare($procure['version'], $liste[$p]['version'], '>')
392
+                ) {
393
+                    $liste[$p] = $procure;
394
+
395
+                    // on fournit une information minimale pour ne pas perturber la compilation
396
+                    $infos[$resume['dir_type']][$dir] = [
397
+                        'prefix' => $procure['nom'],
398
+                        'nom' => $procure['nom'],
399
+                        'etat' => $procure['etat'],
400
+                        'version' => $procure['version'],
401
+                        'chemin' => [],
402
+                        'necessite' => [],
403
+                        'utilise' => [],
404
+                        'lib' => [],
405
+                        'menu' => [],
406
+                        'onglet' => [],
407
+                        'procure' => [],
408
+                    ];
409
+                }
410
+            }
411
+        }
412
+    }
413 413
 }
414 414
 
415 415
 /**
@@ -423,17 +423,17 @@  discard block
 block discarded – undo
423 423
  * @return array
424 424
  */
425 425
 function liste_chemin_plugin($liste, $dir_plugins = _DIR_PLUGINS) {
426
-	foreach ($liste as $prefix => $infos) {
427
-		if (
428
-			!$dir_plugins || defined($infos['dir_type']) && constant($infos['dir_type']) == $dir_plugins
429
-		) {
430
-			$liste[$prefix] = $infos['dir'];
431
-		} else {
432
-			unset($liste[$prefix]);
433
-		}
434
-	}
435
-
436
-	return $liste;
426
+    foreach ($liste as $prefix => $infos) {
427
+        if (
428
+            !$dir_plugins || defined($infos['dir_type']) && constant($infos['dir_type']) == $dir_plugins
429
+        ) {
430
+            $liste[$prefix] = $infos['dir'];
431
+        } else {
432
+            unset($liste[$prefix]);
433
+        }
434
+    }
435
+
436
+    return $liste;
437 437
 }
438 438
 
439 439
 /**
@@ -448,9 +448,9 @@  discard block
 block discarded – undo
448 448
  * @return array
449 449
  */
450 450
 function liste_chemin_plugin_actifs($dir_plugins = _DIR_PLUGINS) {
451
-	include_spip('plugins/installer');
451
+    include_spip('plugins/installer');
452 452
 
453
-	return liste_chemin_plugin(liste_plugin_actifs(), $dir_plugins);
453
+    return liste_chemin_plugin(liste_plugin_actifs(), $dir_plugins);
454 454
 }
455 455
 
456 456
 /**
@@ -481,53 +481,53 @@  discard block
 block discarded – undo
481 481
  *                qui n'ont pas satisfait leurs dépendances
482 482
 **/
483 483
 function plugin_trier($infos, $liste_non_classee) {
484
-	$toute_la_liste = $liste_non_classee;
485
-	$liste = $ordre = [];
486
-	$count = 0;
487
-
488
-	while (($c = count($liste_non_classee)) && $c != $count) { // tant qu'il reste des plugins a classer, et qu'on ne stagne pas
489
-		#echo "tour::";var_dump($liste_non_classee);
490
-		$count = $c;
491
-		foreach ($liste_non_classee as $p => $resume) {
492
-			$plug = $resume['dir'];
493
-			$dir_type = $resume['dir_type'];
494
-			$info1 = $infos[$dir_type][$plug];
495
-			// si des plugins sont necessaires,
496
-			// on ne peut inserer qu'apres eux
497
-			foreach ($info1['necessite'] as $need) {
498
-				$nom = strtoupper($need['nom']);
499
-				$compat = $need['compatibilite'] ?? '';
500
-				if (!isset($liste[$nom]) || !plugin_version_compatible($compat, $liste[$nom]['version'])) {
501
-					$info1 = false;
502
-					break;
503
-				}
504
-			}
505
-			if (!$info1) {
506
-				continue;
507
-			}
508
-			// idem si des plugins sont utiles,
509
-			// sauf si ils sont de toute facon absents de la liste
510
-			foreach ($info1['utilise'] as $need) {
511
-				$nom = strtoupper($need['nom']);
512
-				$compat = $need['compatibilite'] ?? '';
513
-				if (isset($toute_la_liste[$nom])) {
514
-					if (
515
-						!isset($liste[$nom]) || !plugin_version_compatible($compat, $liste[$nom]['version'])
516
-					) {
517
-						$info1 = false;
518
-						break;
519
-					}
520
-				}
521
-			}
522
-			if ($info1) {
523
-				$ordre[$p] = $info1;
524
-				$liste[$p] = $liste_non_classee[$p];
525
-				unset($liste_non_classee[$p]);
526
-			}
527
-		}
528
-	}
529
-
530
-	return [$liste, $ordre, $liste_non_classee];
484
+    $toute_la_liste = $liste_non_classee;
485
+    $liste = $ordre = [];
486
+    $count = 0;
487
+
488
+    while (($c = count($liste_non_classee)) && $c != $count) { // tant qu'il reste des plugins a classer, et qu'on ne stagne pas
489
+        #echo "tour::";var_dump($liste_non_classee);
490
+        $count = $c;
491
+        foreach ($liste_non_classee as $p => $resume) {
492
+            $plug = $resume['dir'];
493
+            $dir_type = $resume['dir_type'];
494
+            $info1 = $infos[$dir_type][$plug];
495
+            // si des plugins sont necessaires,
496
+            // on ne peut inserer qu'apres eux
497
+            foreach ($info1['necessite'] as $need) {
498
+                $nom = strtoupper($need['nom']);
499
+                $compat = $need['compatibilite'] ?? '';
500
+                if (!isset($liste[$nom]) || !plugin_version_compatible($compat, $liste[$nom]['version'])) {
501
+                    $info1 = false;
502
+                    break;
503
+                }
504
+            }
505
+            if (!$info1) {
506
+                continue;
507
+            }
508
+            // idem si des plugins sont utiles,
509
+            // sauf si ils sont de toute facon absents de la liste
510
+            foreach ($info1['utilise'] as $need) {
511
+                $nom = strtoupper($need['nom']);
512
+                $compat = $need['compatibilite'] ?? '';
513
+                if (isset($toute_la_liste[$nom])) {
514
+                    if (
515
+                        !isset($liste[$nom]) || !plugin_version_compatible($compat, $liste[$nom]['version'])
516
+                    ) {
517
+                        $info1 = false;
518
+                        break;
519
+                    }
520
+                }
521
+            }
522
+            if ($info1) {
523
+                $ordre[$p] = $info1;
524
+                $liste[$p] = $liste_non_classee[$p];
525
+                unset($liste_non_classee[$p]);
526
+            }
527
+        }
528
+    }
529
+
530
+    return [$liste, $ordre, $liste_non_classee];
531 531
 }
532 532
 
533 533
 /**
@@ -544,40 +544,40 @@  discard block
 block discarded – undo
544 544
  *     Répertoire (plugins, plugins-dist, ...) => Couples (prefixes => infos completes) des plugins qu'ils contiennent
545 545
 **/
546 546
 function plugins_erreurs($liste_non_classee, $liste, $infos, $msg = []) {
547
-	static $erreurs = [];
548
-
549
-	if (!is_array($liste)) {
550
-		$liste = [];
551
-	}
552
-
553
-	// les plugins en erreur ne sont pas actifs ; ils ne doivent pas être dans la liste
554
-	$liste = array_diff_key($liste, $liste_non_classee);
555
-
556
-	foreach ($liste_non_classee as $p => $resume) {
557
-		$dir_type = $resume['dir_type'];
558
-		$plug = $resume['dir'];
559
-		$k = $infos[$dir_type][$plug];
560
-
561
-		$plug = constant($dir_type) . $plug;
562
-		if (!isset($msg[$p])) {
563
-			if (isset($resume['erreur']) && $resume['erreur']) {
564
-				$msg[$p] = [$resume['erreur']];
565
-			}
566
-			elseif (!plugin_version_compatible($k['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
567
-				$msg[$p] = [plugin_message_incompatibilite($k['compatibilite'], $GLOBALS['spip_version_branche'], 'SPIP', 'necessite')];
568
-			}
569
-			elseif (!$msg[$p] = plugin_necessite($k['necessite'], $liste, 'necessite')) {
570
-				$msg[$p] = plugin_necessite($k['utilise'], $liste, 'utilise');
571
-			}
572
-		} else {
573
-			foreach ($msg[$p] as $c => $l) {
574
-				$msg[$p][$c] = plugin_controler_lib($l['nom'], $l['lien']);
575
-			}
576
-		}
577
-		$erreurs[$plug] = $msg[$p];
578
-	}
579
-
580
-	ecrire_meta('plugin_erreur_activation', serialize($erreurs));
547
+    static $erreurs = [];
548
+
549
+    if (!is_array($liste)) {
550
+        $liste = [];
551
+    }
552
+
553
+    // les plugins en erreur ne sont pas actifs ; ils ne doivent pas être dans la liste
554
+    $liste = array_diff_key($liste, $liste_non_classee);
555
+
556
+    foreach ($liste_non_classee as $p => $resume) {
557
+        $dir_type = $resume['dir_type'];
558
+        $plug = $resume['dir'];
559
+        $k = $infos[$dir_type][$plug];
560
+
561
+        $plug = constant($dir_type) . $plug;
562
+        if (!isset($msg[$p])) {
563
+            if (isset($resume['erreur']) && $resume['erreur']) {
564
+                $msg[$p] = [$resume['erreur']];
565
+            }
566
+            elseif (!plugin_version_compatible($k['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
567
+                $msg[$p] = [plugin_message_incompatibilite($k['compatibilite'], $GLOBALS['spip_version_branche'], 'SPIP', 'necessite')];
568
+            }
569
+            elseif (!$msg[$p] = plugin_necessite($k['necessite'], $liste, 'necessite')) {
570
+                $msg[$p] = plugin_necessite($k['utilise'], $liste, 'utilise');
571
+            }
572
+        } else {
573
+            foreach ($msg[$p] as $c => $l) {
574
+                $msg[$p][$c] = plugin_controler_lib($l['nom'], $l['lien']);
575
+            }
576
+        }
577
+        $erreurs[$plug] = $msg[$p];
578
+    }
579
+
580
+    ecrire_meta('plugin_erreur_activation', serialize($erreurs));
581 581
 }
582 582
 
583 583
 /**
@@ -592,25 +592,25 @@  discard block
 block discarded – undo
592 592
  *     - Liste des erreurs ou code HTML des erreurs
593 593
 **/
594 594
 function plugin_donne_erreurs($raw = false, $raz = true) {
595
-	if (!isset($GLOBALS['meta']['plugin_erreur_activation'])) {
596
-		return $raw ? [] : '';
597
-	}
598
-	$list = @unserialize($GLOBALS['meta']['plugin_erreur_activation']);
599
-	// Compat ancienne version
600
-	if (!$list) {
601
-		$list = $raw ? [] : $GLOBALS['meta']['plugin_erreur_activation'];
602
-	} elseif (!$raw) {
603
-		foreach ($list as $plug => $msg) {
604
-			$list[$plug] = '<li>' . _T('plugin_impossible_activer', ['plugin' => $plug])
605
-				. '<ul><li>' . implode('</li><li>', $msg) . '</li></ul></li>';
606
-		}
607
-		$list = '<ul>' . join("\n", $list) . '</ul>';
608
-	}
609
-	if ($raz) {
610
-		effacer_meta('plugin_erreur_activation');
611
-	}
612
-
613
-	return $list;
595
+    if (!isset($GLOBALS['meta']['plugin_erreur_activation'])) {
596
+        return $raw ? [] : '';
597
+    }
598
+    $list = @unserialize($GLOBALS['meta']['plugin_erreur_activation']);
599
+    // Compat ancienne version
600
+    if (!$list) {
601
+        $list = $raw ? [] : $GLOBALS['meta']['plugin_erreur_activation'];
602
+    } elseif (!$raw) {
603
+        foreach ($list as $plug => $msg) {
604
+            $list[$plug] = '<li>' . _T('plugin_impossible_activer', ['plugin' => $plug])
605
+                . '<ul><li>' . implode('</li><li>', $msg) . '</li></ul></li>';
606
+        }
607
+        $list = '<ul>' . join("\n", $list) . '</ul>';
608
+    }
609
+    if ($raz) {
610
+        effacer_meta('plugin_erreur_activation');
611
+    }
612
+
613
+    return $list;
614 614
 }
615 615
 
616 616
 /**
@@ -630,21 +630,21 @@  discard block
 block discarded – undo
630 630
  *
631 631
  **/
632 632
 function plugin_necessite($n, $liste, $balise = 'necessite') {
633
-	$msg = [];
634
-	foreach ($n as $need) {
635
-		$id = strtoupper($need['nom']);
636
-		$r = plugin_controler_necessite(
637
-			$liste,
638
-			$id,
639
-			$need['compatibilite'] ?? '',
640
-			$balise
641
-		);
642
-		if ($r) {
643
-			$msg[] = $r;
644
-		}
645
-	}
646
-
647
-	return $msg;
633
+    $msg = [];
634
+    foreach ($n as $need) {
635
+        $id = strtoupper($need['nom']);
636
+        $r = plugin_controler_necessite(
637
+            $liste,
638
+            $id,
639
+            $need['compatibilite'] ?? '',
640
+            $balise
641
+        );
642
+        if ($r) {
643
+            $msg[] = $r;
644
+        }
645
+    }
646
+
647
+    return $msg;
648 648
 }
649 649
 
650 650
 /**
@@ -666,19 +666,19 @@  discard block
 block discarded – undo
666 666
  *    Message d'erreur lorsque la dépendance est absente.
667 667
  **/
668 668
 function plugin_controler_necessite($liste, $nom, $intervalle, $balise) {
669
-	if (isset($liste[$nom]) && plugin_version_compatible($intervalle, $liste[$nom]['version'])) {
670
-		return '';
671
-	}
672
-	// Si l'on a un <utilise="plugin non actif" />, ne pas renvoyer d'erreur
673
-	if ($balise === 'utilise' && !isset($liste[$nom])) {
674
-		return '';
675
-	}
676
-	return plugin_message_incompatibilite(
677
-		$intervalle,
678
-		(isset($liste[$nom]) ? $liste[$nom]['version'] : ''),
679
-		$nom,
680
-		$balise
681
-	);
669
+    if (isset($liste[$nom]) && plugin_version_compatible($intervalle, $liste[$nom]['version'])) {
670
+        return '';
671
+    }
672
+    // Si l'on a un <utilise="plugin non actif" />, ne pas renvoyer d'erreur
673
+    if ($balise === 'utilise' && !isset($liste[$nom])) {
674
+        return '';
675
+    }
676
+    return plugin_message_incompatibilite(
677
+        $intervalle,
678
+        (isset($liste[$nom]) ? $liste[$nom]['version'] : ''),
679
+        $nom,
680
+        $balise
681
+    );
682 682
 }
683 683
 
684 684
 /**
@@ -695,70 +695,70 @@  discard block
 block discarded – undo
695 695
  */
696 696
 function plugin_message_incompatibilite($intervalle, $version, $nom, $balise) {
697 697
 
698
-	// prendre en compte les erreurs de dépendances à PHP
699
-	// ou à une extension PHP avec des messages d'erreurs dédiés.
700
-	$type = 'plugin';
701
-	if ($nom === 'SPIP') {
702
-		$type = 'spip';
703
-	} elseif ($nom === 'PHP') {
704
-		$type = 'php';
705
-	} elseif (str_starts_with($nom, 'PHP:')) {
706
-		$type = 'extension_php';
707
-		[, $nom] = explode(':', $nom, 2);
708
-	}
709
-
710
-	if (preg_match(_EXTRAIRE_INTERVALLE, $intervalle, $regs)) {
711
-		$minimum = $regs[1];
712
-		$maximum = $regs[2];
713
-
714
-		$minimum_inclus = $intervalle[0] == '[';
715
-		$maximum_inclus = str_ends_with($intervalle, ']');
716
-
717
-		if (strlen($minimum)) {
718
-			if ($minimum_inclus && spip_version_compare($version, $minimum, '<')) {
719
-				return _T("plugin_{$balise}_{$type}", [
720
-					'plugin' => $nom,
721
-					'version' => ' &ge; ' . $minimum
722
-				]);
723
-			}
724
-			if (!$minimum_inclus && spip_version_compare($version, $minimum, '<=')) {
725
-				return _T("plugin_{$balise}_{$type}", [
726
-					'plugin' => $nom,
727
-					'version' => ' &gt; ' . $minimum
728
-				]);
729
-			}
730
-		}
731
-
732
-		if (strlen($maximum)) {
733
-			if ($maximum_inclus && spip_version_compare($version, $maximum, '>')) {
734
-				return _T("plugin_{$balise}_{$type}", [
735
-					'plugin' => $nom,
736
-					'version' => ' &le; ' . $maximum
737
-				]);
738
-			}
739
-			if (!$maximum_inclus && spip_version_compare($version, $maximum, '>=')) {
740
-				return _T("plugin_{$balise}_plugin", [
741
-					'plugin' => $nom,
742
-					'version' => ' &lt; ' . $maximum
743
-				]);
744
-			}
745
-		}
746
-	}
747
-
748
-	// note : il ne peut pas y avoir d'erreur sur
749
-	// - un 'utilise' sans version.
750
-	// - un 'php' sans version.
751
-	return _T("plugin_necessite_{$type}_sans_version", ['plugin' => $nom]);
698
+    // prendre en compte les erreurs de dépendances à PHP
699
+    // ou à une extension PHP avec des messages d'erreurs dédiés.
700
+    $type = 'plugin';
701
+    if ($nom === 'SPIP') {
702
+        $type = 'spip';
703
+    } elseif ($nom === 'PHP') {
704
+        $type = 'php';
705
+    } elseif (str_starts_with($nom, 'PHP:')) {
706
+        $type = 'extension_php';
707
+        [, $nom] = explode(':', $nom, 2);
708
+    }
709
+
710
+    if (preg_match(_EXTRAIRE_INTERVALLE, $intervalle, $regs)) {
711
+        $minimum = $regs[1];
712
+        $maximum = $regs[2];
713
+
714
+        $minimum_inclus = $intervalle[0] == '[';
715
+        $maximum_inclus = str_ends_with($intervalle, ']');
716
+
717
+        if (strlen($minimum)) {
718
+            if ($minimum_inclus && spip_version_compare($version, $minimum, '<')) {
719
+                return _T("plugin_{$balise}_{$type}", [
720
+                    'plugin' => $nom,
721
+                    'version' => ' &ge; ' . $minimum
722
+                ]);
723
+            }
724
+            if (!$minimum_inclus && spip_version_compare($version, $minimum, '<=')) {
725
+                return _T("plugin_{$balise}_{$type}", [
726
+                    'plugin' => $nom,
727
+                    'version' => ' &gt; ' . $minimum
728
+                ]);
729
+            }
730
+        }
731
+
732
+        if (strlen($maximum)) {
733
+            if ($maximum_inclus && spip_version_compare($version, $maximum, '>')) {
734
+                return _T("plugin_{$balise}_{$type}", [
735
+                    'plugin' => $nom,
736
+                    'version' => ' &le; ' . $maximum
737
+                ]);
738
+            }
739
+            if (!$maximum_inclus && spip_version_compare($version, $maximum, '>=')) {
740
+                return _T("plugin_{$balise}_plugin", [
741
+                    'plugin' => $nom,
742
+                    'version' => ' &lt; ' . $maximum
743
+                ]);
744
+            }
745
+        }
746
+    }
747
+
748
+    // note : il ne peut pas y avoir d'erreur sur
749
+    // - un 'utilise' sans version.
750
+    // - un 'php' sans version.
751
+    return _T("plugin_necessite_{$type}_sans_version", ['plugin' => $nom]);
752 752
 }
753 753
 
754 754
 
755 755
 function plugin_controler_lib($lib, $url) {
756
-	/* Feature sortie du core, voir STP
756
+    /* Feature sortie du core, voir STP
757 757
 	 * if ($url) {
758 758
 		include_spip('inc/charger_plugin');
759 759
 		$url = '<br />'	. bouton_telechargement_plugin($url, 'lib');
760 760
 	}*/
761
-	return _T('plugin_necessite_lib', ['lib' => $lib]) . " <a href='$url'>$url</a>";
761
+    return _T('plugin_necessite_lib', ['lib' => $lib]) . " <a href='$url'>$url</a>";
762 762
 }
763 763
 
764 764
 
@@ -773,7 +773,7 @@  discard block
 block discarded – undo
773 773
  *     true si il y a eu des modifications sur la liste des plugins actifs, false sinon
774 774
  **/
775 775
 function actualise_plugins_actifs($pipe_recherche = false) {
776
-	return ecrire_plugin_actifs('', $pipe_recherche, 'force');
776
+    return ecrire_plugin_actifs('', $pipe_recherche, 'force');
777 777
 }
778 778
 
779 779
 
@@ -800,115 +800,115 @@  discard block
 block discarded – undo
800 800
  **/
801 801
 function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'raz') {
802 802
 
803
-	// creer le repertoire cache/ si necessaire ! (installation notamment)
804
-	$cache = sous_repertoire(_DIR_CACHE, '', false, true);
805
-
806
-	// Si on n'a ni cache accessible, ni connexion SQL, on ne peut pas faire grand chose encore.
807
-	if (!$cache && !spip_connect()) {
808
-		return false;
809
-	}
810
-
811
-	if ($operation != 'raz') {
812
-		$plugin_valides = liste_chemin_plugin_actifs();
813
-		$plugin_valides = is_plugin_dir($plugin_valides);
814
-		if (defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) {
815
-			$plugin_valides_supp = liste_chemin_plugin_actifs(_DIR_PLUGINS_SUPPL);
816
-			$plugin_valides_supp = is_plugin_dir($plugin_valides_supp, _DIR_PLUGINS_SUPPL);
817
-			$plugin_valides = array_merge($plugin_valides, $plugin_valides_supp);
818
-		}
819
-		// si des plugins sont en attentes (coches mais impossible a activer)
820
-		// on les reinjecte ici
821
-		if (
822
-			isset($GLOBALS['meta']['plugin_attente']) && ($a = unserialize($GLOBALS['meta']['plugin_attente']))
823
-		) {
824
-			$plugin_valides = $plugin_valides + liste_chemin_plugin($a);
825
-		}
826
-
827
-		if ($operation == 'ajoute') {
828
-			$plugin = array_merge($plugin_valides, $plugin);
829
-		} elseif ($operation == 'enleve') {
830
-			$plugin = array_diff($plugin_valides, $plugin);
831
-		} else {
832
-			$plugin = $plugin_valides;
833
-		}
834
-	}
835
-	$actifs_avant = $GLOBALS['meta']['plugin'] ?? '';
836
-
837
-	// si une fonction de gestion de dependances existe, l'appeler ici
838
-	if ($ajouter_dependances = charger_fonction('ajouter_dependances', 'plugins', true)) {
839
-		$plugin = $ajouter_dependances($plugin);
840
-	}
841
-
842
-	// recharger le xml des plugins a activer
843
-	// on force le reload ici, meme si le fichier xml n'a pas change
844
-	// pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations
845
-	// pourra etre evite quand on ne supportera plus les plugin.xml
846
-	// en deplacant la detection de ces fichiers dans la compilation ci dessous
847
-	[$infos, $liste, $invalides] = liste_plugin_valides($plugin, true);
848
-	// trouver l'ordre d'activation
849
-	[$plugin_valides, $ordre, $reste] = plugin_trier($infos, $liste);
850
-	if ($invalides || $reste) {
851
-		plugins_erreurs(array_merge($invalides, $reste), $liste, $infos);
852
-	}
853
-
854
-	// Ignorer les plugins necessitant une lib absente
855
-	// et preparer la meta d'entete Http
856
-	$err = $msg = $header = [];
857
-	foreach ($plugin_valides as $p => $resume) {
858
-		// Les headers ne doivent pas indiquer les versions des extensions PHP, ni la version PHP
859
-		if (!str_starts_with($p, 'PHP:') && $p !== 'PHP') {
860
-			$header[] = $p . ($resume['version'] ? '(' . $resume['version'] . ')' : '');
861
-		}
862
-		if ($resume['dir']) {
863
-			foreach ($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) {
864
-				if (!find_in_path($l['nom'], 'lib/')) {
865
-					$err[$p] = $resume;
866
-					$msg[$p][] = $l;
867
-					unset($plugin_valides[$p]);
868
-				}
869
-			}
870
-		}
871
-	}
872
-	if ($err) {
873
-		plugins_erreurs($err, '', $infos, $msg);
874
-	}
875
-
876
-	if (isset($GLOBALS['meta']['message_crash_plugins'])) {
877
-		effacer_meta('message_crash_plugins');
878
-	}
879
-	ecrire_meta('plugin', serialize($plugin_valides));
880
-	$liste = array_diff_key($liste, $plugin_valides);
881
-	ecrire_meta('plugin_attente', serialize($liste));
882
-	$header = strtolower(implode(',', $header));
883
-	if (!isset($GLOBALS['spip_header_silencieux']) || !$GLOBALS['spip_header_silencieux']) {
884
-		ecrire_fichier(
885
-			_DIR_VAR . 'config.txt',
886
-			(defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY : 'Composed-By: SPIP') . ' ' . $GLOBALS['spip_version_affichee'] . ' @ www.spip.net + ' . $header
887
-		);
888
-	} else {
889
-		@unlink(_DIR_VAR . 'config.txt');
890
-	}
891
-	// generer charger_plugins_chemin.php
892
-	plugins_precompile_chemin($plugin_valides, $ordre);
893
-	// generer les fichiers
894
-	// - charger_plugins_options.php
895
-	// - charger_plugins_fonctions.php
896
-	plugins_precompile_xxxtions($plugin_valides, $ordre);
897
-	// charger les chemins des plugins et les fichiers d'options
898
-	// (qui peuvent déclarer / utiliser des pipelines, ajouter d'autres chemins)
899
-	plugins_amorcer_plugins_actifs();
900
-	// mise a jour de la matrice des pipelines
901
-	$prepend_code = pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche);
902
-	// generer le fichier _CACHE_PIPELINE
903
-	pipeline_precompile($prepend_code);
904
-
905
-	if (spip_connect()) {
906
-		// lancer et initialiser les nouveaux crons !
907
-		include_spip('inc/genie');
908
-		genie_queue_watch_dist();
909
-	}
910
-
911
-	return ($GLOBALS['meta']['plugin'] != $actifs_avant);
803
+    // creer le repertoire cache/ si necessaire ! (installation notamment)
804
+    $cache = sous_repertoire(_DIR_CACHE, '', false, true);
805
+
806
+    // Si on n'a ni cache accessible, ni connexion SQL, on ne peut pas faire grand chose encore.
807
+    if (!$cache && !spip_connect()) {
808
+        return false;
809
+    }
810
+
811
+    if ($operation != 'raz') {
812
+        $plugin_valides = liste_chemin_plugin_actifs();
813
+        $plugin_valides = is_plugin_dir($plugin_valides);
814
+        if (defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) {
815
+            $plugin_valides_supp = liste_chemin_plugin_actifs(_DIR_PLUGINS_SUPPL);
816
+            $plugin_valides_supp = is_plugin_dir($plugin_valides_supp, _DIR_PLUGINS_SUPPL);
817
+            $plugin_valides = array_merge($plugin_valides, $plugin_valides_supp);
818
+        }
819
+        // si des plugins sont en attentes (coches mais impossible a activer)
820
+        // on les reinjecte ici
821
+        if (
822
+            isset($GLOBALS['meta']['plugin_attente']) && ($a = unserialize($GLOBALS['meta']['plugin_attente']))
823
+        ) {
824
+            $plugin_valides = $plugin_valides + liste_chemin_plugin($a);
825
+        }
826
+
827
+        if ($operation == 'ajoute') {
828
+            $plugin = array_merge($plugin_valides, $plugin);
829
+        } elseif ($operation == 'enleve') {
830
+            $plugin = array_diff($plugin_valides, $plugin);
831
+        } else {
832
+            $plugin = $plugin_valides;
833
+        }
834
+    }
835
+    $actifs_avant = $GLOBALS['meta']['plugin'] ?? '';
836
+
837
+    // si une fonction de gestion de dependances existe, l'appeler ici
838
+    if ($ajouter_dependances = charger_fonction('ajouter_dependances', 'plugins', true)) {
839
+        $plugin = $ajouter_dependances($plugin);
840
+    }
841
+
842
+    // recharger le xml des plugins a activer
843
+    // on force le reload ici, meme si le fichier xml n'a pas change
844
+    // pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations
845
+    // pourra etre evite quand on ne supportera plus les plugin.xml
846
+    // en deplacant la detection de ces fichiers dans la compilation ci dessous
847
+    [$infos, $liste, $invalides] = liste_plugin_valides($plugin, true);
848
+    // trouver l'ordre d'activation
849
+    [$plugin_valides, $ordre, $reste] = plugin_trier($infos, $liste);
850
+    if ($invalides || $reste) {
851
+        plugins_erreurs(array_merge($invalides, $reste), $liste, $infos);
852
+    }
853
+
854
+    // Ignorer les plugins necessitant une lib absente
855
+    // et preparer la meta d'entete Http
856
+    $err = $msg = $header = [];
857
+    foreach ($plugin_valides as $p => $resume) {
858
+        // Les headers ne doivent pas indiquer les versions des extensions PHP, ni la version PHP
859
+        if (!str_starts_with($p, 'PHP:') && $p !== 'PHP') {
860
+            $header[] = $p . ($resume['version'] ? '(' . $resume['version'] . ')' : '');
861
+        }
862
+        if ($resume['dir']) {
863
+            foreach ($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) {
864
+                if (!find_in_path($l['nom'], 'lib/')) {
865
+                    $err[$p] = $resume;
866
+                    $msg[$p][] = $l;
867
+                    unset($plugin_valides[$p]);
868
+                }
869
+            }
870
+        }
871
+    }
872
+    if ($err) {
873
+        plugins_erreurs($err, '', $infos, $msg);
874
+    }
875
+
876
+    if (isset($GLOBALS['meta']['message_crash_plugins'])) {
877
+        effacer_meta('message_crash_plugins');
878
+    }
879
+    ecrire_meta('plugin', serialize($plugin_valides));
880
+    $liste = array_diff_key($liste, $plugin_valides);
881
+    ecrire_meta('plugin_attente', serialize($liste));
882
+    $header = strtolower(implode(',', $header));
883
+    if (!isset($GLOBALS['spip_header_silencieux']) || !$GLOBALS['spip_header_silencieux']) {
884
+        ecrire_fichier(
885
+            _DIR_VAR . 'config.txt',
886
+            (defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY : 'Composed-By: SPIP') . ' ' . $GLOBALS['spip_version_affichee'] . ' @ www.spip.net + ' . $header
887
+        );
888
+    } else {
889
+        @unlink(_DIR_VAR . 'config.txt');
890
+    }
891
+    // generer charger_plugins_chemin.php
892
+    plugins_precompile_chemin($plugin_valides, $ordre);
893
+    // generer les fichiers
894
+    // - charger_plugins_options.php
895
+    // - charger_plugins_fonctions.php
896
+    plugins_precompile_xxxtions($plugin_valides, $ordre);
897
+    // charger les chemins des plugins et les fichiers d'options
898
+    // (qui peuvent déclarer / utiliser des pipelines, ajouter d'autres chemins)
899
+    plugins_amorcer_plugins_actifs();
900
+    // mise a jour de la matrice des pipelines
901
+    $prepend_code = pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche);
902
+    // generer le fichier _CACHE_PIPELINE
903
+    pipeline_precompile($prepend_code);
904
+
905
+    if (spip_connect()) {
906
+        // lancer et initialiser les nouveaux crons !
907
+        include_spip('inc/genie');
908
+        genie_queue_watch_dist();
909
+    }
910
+
911
+    return ($GLOBALS['meta']['plugin'] != $actifs_avant);
912 912
 }
913 913
 
914 914
 /**
@@ -927,75 +927,75 @@  discard block
 block discarded – undo
927 927
  *     Couples (prefixe => infos complètes) des plugins qui seront actifs, dans l'ordre de leurs dépendances
928 928
 **/
929 929
 function plugins_precompile_chemin($plugin_valides, $ordre) {
930
-	$chemins = [
931
-		'public' => [],
932
-		'prive' => []
933
-	];
934
-	$contenu = '';
935
-	foreach ($ordre as $p => $info) {
936
-		// $ordre peur contenir des plugins en attente et non valides pour ce hit
937
-		if (isset($plugin_valides[$p])) {
938
-			$dir_type = $plugin_valides[$p]['dir_type'];
939
-			$plug = $plugin_valides[$p]['dir'];
940
-			// definir le plugin, donc le path avant l'include du fichier options
941
-			// permet de faire des include_spip pour attraper un inc_ du plugin
942
-
943
-			$dir = $dir_type . ".'" . $plug . "/'";
944
-
945
-			$prefix = strtoupper(preg_replace(',\W,', '_', $info['prefix']));
946
-			if (
947
-				$prefix !== 'SPIP'
948
-				&& !str_contains($dir, ':') // exclure le cas des procure:
949
-			) {
950
-				$contenu .= "define('_DIR_PLUGIN_$prefix',$dir);\n";
951
-				if (!$info['chemin']) {
952
-					$chemins['public'][] = "_DIR_PLUGIN_$prefix";
953
-					$chemins['prive'][] = "_DIR_PLUGIN_$prefix";
954
-					if (is_dir(constant($dir_type) . $plug . '/squelettes/')) {
955
-						$chemins['public'][] = "_DIR_PLUGIN_{$prefix}.'squelettes/'";
956
-					}
957
-				}
958
-				else {
959
-					foreach ($info['chemin'] as $chemin) {
960
-						if (
961
-							!isset($chemin['version'])
962
-							|| plugin_version_compatible(
963
-								$chemin['version'],
964
-								$GLOBALS['spip_version_branche'],
965
-								'spip'
966
-							)
967
-						) {
968
-							$dir = $chemin['path'];
969
-							if (strlen($dir) && $dir[0] == '/') {
970
-								$dir = substr($dir, 1);
971
-							}
972
-							if (strlen($dir) && $dir == './') {
973
-								$dir = '';
974
-							}
975
-							if (strlen($dir)) {
976
-								$dir = rtrim($dir, '/') . '/';
977
-							}
978
-							if (!isset($chemin['type']) || $chemin['type'] == 'public') {
979
-								$chemins['public'][] = "_DIR_PLUGIN_$prefix" . (strlen($dir) ? ".'$dir'" : '');
980
-							}
981
-							if (!isset($chemin['type']) || $chemin['type'] == 'prive') {
982
-								$chemins['prive'][] = "_DIR_PLUGIN_$prefix" . (strlen($dir) ? ".'$dir'" : '');
983
-							}
984
-						}
985
-					}
986
-				}
987
-			}
988
-		}
989
-	}
990
-	if (count($chemins['public']) || count($chemins['prive'])) {
991
-		$contenu .= 'if (_DIR_RESTREINT) _chemin([' . implode(
992
-			',',
993
-			array_reverse($chemins['public'])
994
-		) . "]);\n"
995
-			. 'else _chemin([' . implode(',', array_reverse($chemins['prive'])) . "]);\n";
996
-	}
997
-
998
-	ecrire_fichier_php(_CACHE_PLUGINS_PATH, $contenu);
930
+    $chemins = [
931
+        'public' => [],
932
+        'prive' => []
933
+    ];
934
+    $contenu = '';
935
+    foreach ($ordre as $p => $info) {
936
+        // $ordre peur contenir des plugins en attente et non valides pour ce hit
937
+        if (isset($plugin_valides[$p])) {
938
+            $dir_type = $plugin_valides[$p]['dir_type'];
939
+            $plug = $plugin_valides[$p]['dir'];
940
+            // definir le plugin, donc le path avant l'include du fichier options
941
+            // permet de faire des include_spip pour attraper un inc_ du plugin
942
+
943
+            $dir = $dir_type . ".'" . $plug . "/'";
944
+
945
+            $prefix = strtoupper(preg_replace(',\W,', '_', $info['prefix']));
946
+            if (
947
+                $prefix !== 'SPIP'
948
+                && !str_contains($dir, ':') // exclure le cas des procure:
949
+            ) {
950
+                $contenu .= "define('_DIR_PLUGIN_$prefix',$dir);\n";
951
+                if (!$info['chemin']) {
952
+                    $chemins['public'][] = "_DIR_PLUGIN_$prefix";
953
+                    $chemins['prive'][] = "_DIR_PLUGIN_$prefix";
954
+                    if (is_dir(constant($dir_type) . $plug . '/squelettes/')) {
955
+                        $chemins['public'][] = "_DIR_PLUGIN_{$prefix}.'squelettes/'";
956
+                    }
957
+                }
958
+                else {
959
+                    foreach ($info['chemin'] as $chemin) {
960
+                        if (
961
+                            !isset($chemin['version'])
962
+                            || plugin_version_compatible(
963
+                                $chemin['version'],
964
+                                $GLOBALS['spip_version_branche'],
965
+                                'spip'
966
+                            )
967
+                        ) {
968
+                            $dir = $chemin['path'];
969
+                            if (strlen($dir) && $dir[0] == '/') {
970
+                                $dir = substr($dir, 1);
971
+                            }
972
+                            if (strlen($dir) && $dir == './') {
973
+                                $dir = '';
974
+                            }
975
+                            if (strlen($dir)) {
976
+                                $dir = rtrim($dir, '/') . '/';
977
+                            }
978
+                            if (!isset($chemin['type']) || $chemin['type'] == 'public') {
979
+                                $chemins['public'][] = "_DIR_PLUGIN_$prefix" . (strlen($dir) ? ".'$dir'" : '');
980
+                            }
981
+                            if (!isset($chemin['type']) || $chemin['type'] == 'prive') {
982
+                                $chemins['prive'][] = "_DIR_PLUGIN_$prefix" . (strlen($dir) ? ".'$dir'" : '');
983
+                            }
984
+                        }
985
+                    }
986
+                }
987
+            }
988
+        }
989
+    }
990
+    if (count($chemins['public']) || count($chemins['prive'])) {
991
+        $contenu .= 'if (_DIR_RESTREINT) _chemin([' . implode(
992
+            ',',
993
+            array_reverse($chemins['public'])
994
+        ) . "]);\n"
995
+            . 'else _chemin([' . implode(',', array_reverse($chemins['prive'])) . "]);\n";
996
+    }
997
+
998
+    ecrire_fichier_php(_CACHE_PLUGINS_PATH, $contenu);
999 999
 }
1000 1000
 
1001 1001
 /**
@@ -1013,65 +1013,65 @@  discard block
 block discarded – undo
1013 1013
  *     Couples (prefixe => infos complètes) des plugins qui seront actifs, dans l'ordre de leurs dépendances
1014 1014
 **/
1015 1015
 function plugins_precompile_xxxtions($plugin_valides, $ordre) {
1016
-	$contenu = ['options' => '', 'fonctions' => ''];
1017
-	$boutons = [];
1018
-	$onglets = [];
1019
-	$sign = '';
1020
-
1021
-	foreach ($ordre as $p => $info) {
1022
-		// $ordre peur contenir des plugins en attente et non valides pour ce hit
1023
-		if (isset($plugin_valides[$p])) {
1024
-			$dir_type = $plugin_valides[$p]['dir_type'];
1025
-			$plug = $plugin_valides[$p]['dir'];
1026
-			$dir = constant($dir_type);
1027
-			$root_dir_type = str_replace('_DIR_', '_ROOT_', $dir_type);
1028
-			if ($info['menu']) {
1029
-				$boutons = array_merge($boutons, $info['menu']);
1030
-			}
1031
-			if ($info['onglet']) {
1032
-				$onglets = array_merge($onglets, $info['onglet']);
1033
-			}
1034
-			foreach ($contenu as $charge => $v) {
1035
-				// si pas declare/detecte a la lecture du paquet.xml,
1036
-				// detecer a nouveau ici puisque son ajout ne provoque pas une modif du paquet.xml
1037
-				// donc ni sa relecture, ni sa detection
1038
-				if (
1039
-					!isset($info[$charge])
1040
-					&& $dir
1041
-					&& !str_contains($dir, ':')
1042
-					&& file_exists("$dir$plug/paquet.xml") // uniquement pour les paquet.xml
1043
-				) {
1044
-					if (is_readable("$dir$plug/" . ($file = $info['prefix'] . '_' . $charge . '.php'))) {
1045
-						$info[$charge] = [$file];
1046
-					}
1047
-				}
1048
-				if (isset($info[$charge])) {
1049
-					$files = $info[$charge];
1050
-					foreach ($files as $k => $file) {
1051
-						// on genere un if file_exists devant chaque include
1052
-						// pour pouvoir garder le meme niveau d'erreur general
1053
-						$file = trim($file);
1054
-						if (
1055
-							!is_readable("$dir$plug/$file") && file_exists("$dir$plug/paquet.xml")
1056
-						) {
1057
-							unset($info[$charge][$k]);
1058
-						} else {
1059
-							$_file = $root_dir_type . ".'$plug/$file'";
1060
-							$contenu[$charge] .= "include_once_check($_file);\n";
1061
-						}
1062
-					}
1063
-				}
1064
-			}
1065
-			$sign .= md5(serialize($info));
1066
-		}
1067
-	}
1068
-
1069
-	$contenu['options'] = "define('_PLUGINS_HASH','" . md5($sign) . "');\n" . $contenu['options'];
1070
-	$contenu['fonctions'] .= plugin_ongletbouton('boutons_plugins', $boutons)
1071
-		. plugin_ongletbouton('onglets_plugins', $onglets);
1072
-
1073
-	ecrire_fichier_php(_CACHE_PLUGINS_OPT, $contenu['options']);
1074
-	ecrire_fichier_php(_CACHE_PLUGINS_FCT, $contenu['fonctions']);
1016
+    $contenu = ['options' => '', 'fonctions' => ''];
1017
+    $boutons = [];
1018
+    $onglets = [];
1019
+    $sign = '';
1020
+
1021
+    foreach ($ordre as $p => $info) {
1022
+        // $ordre peur contenir des plugins en attente et non valides pour ce hit
1023
+        if (isset($plugin_valides[$p])) {
1024
+            $dir_type = $plugin_valides[$p]['dir_type'];
1025
+            $plug = $plugin_valides[$p]['dir'];
1026
+            $dir = constant($dir_type);
1027
+            $root_dir_type = str_replace('_DIR_', '_ROOT_', $dir_type);
1028
+            if ($info['menu']) {
1029
+                $boutons = array_merge($boutons, $info['menu']);
1030
+            }
1031
+            if ($info['onglet']) {
1032
+                $onglets = array_merge($onglets, $info['onglet']);
1033
+            }
1034
+            foreach ($contenu as $charge => $v) {
1035
+                // si pas declare/detecte a la lecture du paquet.xml,
1036
+                // detecer a nouveau ici puisque son ajout ne provoque pas une modif du paquet.xml
1037
+                // donc ni sa relecture, ni sa detection
1038
+                if (
1039
+                    !isset($info[$charge])
1040
+                    && $dir
1041
+                    && !str_contains($dir, ':')
1042
+                    && file_exists("$dir$plug/paquet.xml") // uniquement pour les paquet.xml
1043
+                ) {
1044
+                    if (is_readable("$dir$plug/" . ($file = $info['prefix'] . '_' . $charge . '.php'))) {
1045
+                        $info[$charge] = [$file];
1046
+                    }
1047
+                }
1048
+                if (isset($info[$charge])) {
1049
+                    $files = $info[$charge];
1050
+                    foreach ($files as $k => $file) {
1051
+                        // on genere un if file_exists devant chaque include
1052
+                        // pour pouvoir garder le meme niveau d'erreur general
1053
+                        $file = trim($file);
1054
+                        if (
1055
+                            !is_readable("$dir$plug/$file") && file_exists("$dir$plug/paquet.xml")
1056
+                        ) {
1057
+                            unset($info[$charge][$k]);
1058
+                        } else {
1059
+                            $_file = $root_dir_type . ".'$plug/$file'";
1060
+                            $contenu[$charge] .= "include_once_check($_file);\n";
1061
+                        }
1062
+                    }
1063
+                }
1064
+            }
1065
+            $sign .= md5(serialize($info));
1066
+        }
1067
+    }
1068
+
1069
+    $contenu['options'] = "define('_PLUGINS_HASH','" . md5($sign) . "');\n" . $contenu['options'];
1070
+    $contenu['fonctions'] .= plugin_ongletbouton('boutons_plugins', $boutons)
1071
+        . plugin_ongletbouton('onglets_plugins', $onglets);
1072
+
1073
+    ecrire_fichier_php(_CACHE_PLUGINS_OPT, $contenu['options']);
1074
+    ecrire_fichier_php(_CACHE_PLUGINS_FCT, $contenu['fonctions']);
1075 1075
 }
1076 1076
 
1077 1077
 /**
@@ -1090,24 +1090,24 @@  discard block
 block discarded – undo
1090 1090
  * @return string Code php
1091 1091
  */
1092 1092
 function plugin_ongletbouton($nom, $val) {
1093
-	if (!$val) {
1094
-		$val = [];
1095
-	}
1096
-
1097
-	$val = serialize($val);
1098
-	$md5 = md5($val);
1099
-
1100
-	if (!defined("_UPDATED_$nom")) {
1101
-		define("_UPDATED_$nom", $val);
1102
-		define("_UPDATED_md5_$nom", $md5);
1103
-	}
1104
-	$val = "unserialize('" . str_replace("'", "\'", $val) . "')";
1105
-
1106
-	return
1107
-		"if (!function_exists('$nom')) {\n"
1108
-		. "function $nom(){return defined('_UPDATED_$nom')?unserialize(_UPDATED_$nom):$val;}\n"
1109
-		. "function md5_$nom(){return defined('_UPDATED_md5_$nom')?_UPDATED_md5_$nom:'" . $md5 . "';}\n"
1110
-		. "}\n";
1093
+    if (!$val) {
1094
+        $val = [];
1095
+    }
1096
+
1097
+    $val = serialize($val);
1098
+    $md5 = md5($val);
1099
+
1100
+    if (!defined("_UPDATED_$nom")) {
1101
+        define("_UPDATED_$nom", $val);
1102
+        define("_UPDATED_md5_$nom", $md5);
1103
+    }
1104
+    $val = "unserialize('" . str_replace("'", "\'", $val) . "')";
1105
+
1106
+    return
1107
+        "if (!function_exists('$nom')) {\n"
1108
+        . "function $nom(){return defined('_UPDATED_$nom')?unserialize(_UPDATED_$nom):$val;}\n"
1109
+        . "function md5_$nom(){return defined('_UPDATED_md5_$nom')?_UPDATED_md5_$nom:'" . $md5 . "';}\n"
1110
+        . "}\n";
1111 1111
 }
1112 1112
 
1113 1113
 /**
@@ -1122,15 +1122,15 @@  discard block
 block discarded – undo
1122 1122
 **/
1123 1123
 function plugins_amorcer_plugins_actifs() {
1124 1124
 
1125
-	if (@is_readable(_CACHE_PLUGINS_PATH)) {
1126
-		include_once(_CACHE_PLUGINS_PATH);
1127
-	}
1125
+    if (@is_readable(_CACHE_PLUGINS_PATH)) {
1126
+        include_once(_CACHE_PLUGINS_PATH);
1127
+    }
1128 1128
 
1129
-	if (@is_readable(_CACHE_PLUGINS_OPT)) {
1130
-		include_once(_CACHE_PLUGINS_OPT);
1131
-	} else {
1132
-		spip_log('pipelines desactives: impossible de produire ' . _CACHE_PLUGINS_OPT);
1133
-	}
1129
+    if (@is_readable(_CACHE_PLUGINS_OPT)) {
1130
+        include_once(_CACHE_PLUGINS_OPT);
1131
+    } else {
1132
+        spip_log('pipelines desactives: impossible de produire ' . _CACHE_PLUGINS_OPT);
1133
+    }
1134 1134
 }
1135 1135
 
1136 1136
 /**
@@ -1153,140 +1153,140 @@  discard block
 block discarded – undo
1153 1153
  *     Couples (nom du pipeline => Code PHP à insérer au début du pipeline)
1154 1154
 **/
1155 1155
 function pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche) {
1156
-	static $liste_pipe_manquants = [];
1157
-	if (($pipe_recherche) && (!in_array($pipe_recherche, $liste_pipe_manquants))) {
1158
-		$liste_pipe_manquants[] = $pipe_recherche;
1159
-	}
1160
-
1161
-	$prepend_code = [];
1162
-
1163
-	foreach ($ordre as $p => $info) {
1164
-		// $ordre peur contenir des plugins en attente et non valides pour ce hit
1165
-		if (isset($plugin_valides[$p])) {
1166
-			$dir_type = $plugin_valides[$p]['dir_type'];
1167
-			$root_dir_type = str_replace('_DIR_', '_ROOT_', $dir_type);
1168
-			$plug = $plugin_valides[$p]['dir'];
1169
-			$prefix = (($info['prefix'] == 'spip') ? '' : $info['prefix'] . '_');
1170
-			if (isset($info['pipeline']) && is_array($info['pipeline'])) {
1171
-				foreach ($info['pipeline'] as $pipe) {
1172
-					$nom = $pipe['nom'];
1173
-					if (isset($pipe['action'])) {
1174
-						$action = $pipe['action'];
1175
-					} else {
1176
-						$action = $nom;
1177
-					}
1178
-					$nomlower = strtolower($nom);
1179
-					if (
1180
-						$nomlower != $nom
1181
-						&& isset($GLOBALS['spip_pipeline'][$nom])
1182
-						&& !isset($GLOBALS['spip_pipeline'][$nomlower])
1183
-					) {
1184
-						$GLOBALS['spip_pipeline'][$nomlower] = $GLOBALS['spip_pipeline'][$nom];
1185
-						unset($GLOBALS['spip_pipeline'][$nom]);
1186
-					}
1187
-					$nom = $nomlower;
1188
-					// une action vide est une declaration qui ne doit pas etre compilee !
1189
-					if (!isset($GLOBALS['spip_pipeline'][$nom])) { // creer le pipeline eventuel
1190
-					$GLOBALS['spip_pipeline'][$nom] = '';
1191
-					}
1192
-					if ($action) {
1193
-						if (!str_contains($GLOBALS['spip_pipeline'][$nom], (string) "|$prefix$action")) {
1194
-							$GLOBALS['spip_pipeline'][$nom] = preg_replace(
1195
-								',(\|\||$),',
1196
-								"|$prefix$action\\1",
1197
-								$GLOBALS['spip_pipeline'][$nom],
1198
-								1
1199
-							);
1200
-						}
1201
-						if (isset($pipe['inclure'])) {
1202
-							$GLOBALS['spip_matrice']["$prefix$action"] =
1203
-								"$root_dir_type:$plug/" . $pipe['inclure'];
1204
-						}
1205
-					}
1206
-				}
1207
-			}
1208
-			if (isset($info['genie']) && (is_countable($info['genie']) ? count($info['genie']) : 0)) {
1209
-				if (!isset($prepend_code['taches_generales_cron'])) {
1210
-					$prepend_code['taches_generales_cron'] = '';
1211
-				}
1212
-				foreach ($info['genie'] as $genie) {
1213
-					$nom = $prefix . $genie['nom'];
1214
-					$periode = max(60, intval($genie['periode']));
1215
-					if (charger_fonction($nom, 'genie', true)) {
1216
-						$prepend_code['taches_generales_cron'] .= "\$val['$nom'] = $periode;\n";
1217
-					} else {
1218
-						spip_log("Fonction genie_$nom introuvable", _LOG_ERREUR);
1219
-					}
1220
-				}
1221
-			}
1222
-			if (isset($info['style']) && (is_countable($info['style']) ? count($info['style']) : 0)) {
1223
-				if (!isset($prepend_code['insert_head_css'])) {
1224
-					$prepend_code['insert_head_css'] = '';
1225
-				}
1226
-				if (!isset($prepend_code['header_prive_css'])) {
1227
-					$prepend_code['header_prive_css'] = '';
1228
-				}
1229
-				foreach ($info['style'] as $style) {
1230
-					if (isset($style['path']) && $style['path']) {
1231
-						$code = "if (\$f=timestamp(direction_css(find_in_path('" . addslashes($style['path']) . "')))) ";
1232
-					} else {
1233
-						$code = "if (\$f='" . addslashes($style['url']) . "') ";
1234
-					}
1235
-					$code .= "\$val .= '<link rel=\"stylesheet\" href=\"'.\$f.'\" type=\"text/css\"";
1236
-					if (isset($style['media']) && strlen($style['media'])) {
1237
-						$code .= ' media="' . addslashes($style['media']) . '"';
1238
-					}
1239
-					$code .= "/>';\n";
1240
-					if ($style['type'] != 'prive') {
1241
-						$prepend_code['insert_head_css'] .= $code;
1242
-					}
1243
-					if ($style['type'] != 'public') {
1244
-						$prepend_code['header_prive_css'] .= $code;
1245
-					}
1246
-				}
1247
-			}
1248
-			if (!isset($prepend_code['insert_head'])) {
1249
-				$prepend_code['insert_head'] = '';
1250
-			}
1251
-			if (!isset($prepend_code['header_prive'])) {
1252
-				$prepend_code['header_prive'] = '';
1253
-			}
1254
-			if (isset($info['script']) && (is_countable($info['script']) ? count($info['script']) : 0)) {
1255
-				foreach ($info['script'] as $script) {
1256
-					if (isset($script['path']) && $script['path']) {
1257
-						$code = "if (\$f=timestamp(find_in_path('" . addslashes($script['path']) . "'))) ";
1258
-					} else {
1259
-						$code = "if (\$f='" . addslashes($script['url']) . "') ";
1260
-					}
1261
-					$code .= "\$val .= '<script src=\"'.\$f.'\" type=\"text/javascript\"></script>';\n";
1262
-					if ($script['type'] != 'prive') {
1263
-						$prepend_code['insert_head'] .= $code;
1264
-					}
1265
-					if ($script['type'] != 'public') {
1266
-						$prepend_code['header_prive'] .= $code;
1267
-					}
1268
-				}
1269
-			}
1270
-		}
1271
-	}
1272
-
1273
-	$prepend_code['insert_head'] =
1274
-		"include_once_check(_DIR_RESTREINT . 'inc/pipelines.php');\n"
1275
-		. "\$val = minipipe('f_jQuery', \$val);\n"
1276
-		. $prepend_code['insert_head'];
1277
-	$prepend_code['header_prive'] =
1278
-		"include_once_check(_DIR_RESTREINT . 'inc/pipelines_ecrire.php');\n"
1279
-		. "\$val = minipipe('f_jQuery_prive', \$val);\n"
1280
-		. $prepend_code['header_prive'];
1281
-
1282
-	// on ajoute les pipe qui ont ete recenses manquants
1283
-	foreach ($liste_pipe_manquants as $add_pipe) {
1284
-		if (!isset($GLOBALS['spip_pipeline'][$add_pipe])) {
1285
-			$GLOBALS['spip_pipeline'][$add_pipe] = '';
1286
-		}
1287
-	}
1288
-
1289
-	return $prepend_code;
1156
+    static $liste_pipe_manquants = [];
1157
+    if (($pipe_recherche) && (!in_array($pipe_recherche, $liste_pipe_manquants))) {
1158
+        $liste_pipe_manquants[] = $pipe_recherche;
1159
+    }
1160
+
1161
+    $prepend_code = [];
1162
+
1163
+    foreach ($ordre as $p => $info) {
1164
+        // $ordre peur contenir des plugins en attente et non valides pour ce hit
1165
+        if (isset($plugin_valides[$p])) {
1166
+            $dir_type = $plugin_valides[$p]['dir_type'];
1167
+            $root_dir_type = str_replace('_DIR_', '_ROOT_', $dir_type);
1168
+            $plug = $plugin_valides[$p]['dir'];
1169
+            $prefix = (($info['prefix'] == 'spip') ? '' : $info['prefix'] . '_');
1170
+            if (isset($info['pipeline']) && is_array($info['pipeline'])) {
1171
+                foreach ($info['pipeline'] as $pipe) {
1172
+                    $nom = $pipe['nom'];
1173
+                    if (isset($pipe['action'])) {
1174
+                        $action = $pipe['action'];
1175
+                    } else {
1176
+                        $action = $nom;
1177
+                    }
1178
+                    $nomlower = strtolower($nom);
1179
+                    if (
1180
+                        $nomlower != $nom
1181
+                        && isset($GLOBALS['spip_pipeline'][$nom])
1182
+                        && !isset($GLOBALS['spip_pipeline'][$nomlower])
1183
+                    ) {
1184
+                        $GLOBALS['spip_pipeline'][$nomlower] = $GLOBALS['spip_pipeline'][$nom];
1185
+                        unset($GLOBALS['spip_pipeline'][$nom]);
1186
+                    }
1187
+                    $nom = $nomlower;
1188
+                    // une action vide est une declaration qui ne doit pas etre compilee !
1189
+                    if (!isset($GLOBALS['spip_pipeline'][$nom])) { // creer le pipeline eventuel
1190
+                    $GLOBALS['spip_pipeline'][$nom] = '';
1191
+                    }
1192
+                    if ($action) {
1193
+                        if (!str_contains($GLOBALS['spip_pipeline'][$nom], (string) "|$prefix$action")) {
1194
+                            $GLOBALS['spip_pipeline'][$nom] = preg_replace(
1195
+                                ',(\|\||$),',
1196
+                                "|$prefix$action\\1",
1197
+                                $GLOBALS['spip_pipeline'][$nom],
1198
+                                1
1199
+                            );
1200
+                        }
1201
+                        if (isset($pipe['inclure'])) {
1202
+                            $GLOBALS['spip_matrice']["$prefix$action"] =
1203
+                                "$root_dir_type:$plug/" . $pipe['inclure'];
1204
+                        }
1205
+                    }
1206
+                }
1207
+            }
1208
+            if (isset($info['genie']) && (is_countable($info['genie']) ? count($info['genie']) : 0)) {
1209
+                if (!isset($prepend_code['taches_generales_cron'])) {
1210
+                    $prepend_code['taches_generales_cron'] = '';
1211
+                }
1212
+                foreach ($info['genie'] as $genie) {
1213
+                    $nom = $prefix . $genie['nom'];
1214
+                    $periode = max(60, intval($genie['periode']));
1215
+                    if (charger_fonction($nom, 'genie', true)) {
1216
+                        $prepend_code['taches_generales_cron'] .= "\$val['$nom'] = $periode;\n";
1217
+                    } else {
1218
+                        spip_log("Fonction genie_$nom introuvable", _LOG_ERREUR);
1219
+                    }
1220
+                }
1221
+            }
1222
+            if (isset($info['style']) && (is_countable($info['style']) ? count($info['style']) : 0)) {
1223
+                if (!isset($prepend_code['insert_head_css'])) {
1224
+                    $prepend_code['insert_head_css'] = '';
1225
+                }
1226
+                if (!isset($prepend_code['header_prive_css'])) {
1227
+                    $prepend_code['header_prive_css'] = '';
1228
+                }
1229
+                foreach ($info['style'] as $style) {
1230
+                    if (isset($style['path']) && $style['path']) {
1231
+                        $code = "if (\$f=timestamp(direction_css(find_in_path('" . addslashes($style['path']) . "')))) ";
1232
+                    } else {
1233
+                        $code = "if (\$f='" . addslashes($style['url']) . "') ";
1234
+                    }
1235
+                    $code .= "\$val .= '<link rel=\"stylesheet\" href=\"'.\$f.'\" type=\"text/css\"";
1236
+                    if (isset($style['media']) && strlen($style['media'])) {
1237
+                        $code .= ' media="' . addslashes($style['media']) . '"';
1238
+                    }
1239
+                    $code .= "/>';\n";
1240
+                    if ($style['type'] != 'prive') {
1241
+                        $prepend_code['insert_head_css'] .= $code;
1242
+                    }
1243
+                    if ($style['type'] != 'public') {
1244
+                        $prepend_code['header_prive_css'] .= $code;
1245
+                    }
1246
+                }
1247
+            }
1248
+            if (!isset($prepend_code['insert_head'])) {
1249
+                $prepend_code['insert_head'] = '';
1250
+            }
1251
+            if (!isset($prepend_code['header_prive'])) {
1252
+                $prepend_code['header_prive'] = '';
1253
+            }
1254
+            if (isset($info['script']) && (is_countable($info['script']) ? count($info['script']) : 0)) {
1255
+                foreach ($info['script'] as $script) {
1256
+                    if (isset($script['path']) && $script['path']) {
1257
+                        $code = "if (\$f=timestamp(find_in_path('" . addslashes($script['path']) . "'))) ";
1258
+                    } else {
1259
+                        $code = "if (\$f='" . addslashes($script['url']) . "') ";
1260
+                    }
1261
+                    $code .= "\$val .= '<script src=\"'.\$f.'\" type=\"text/javascript\"></script>';\n";
1262
+                    if ($script['type'] != 'prive') {
1263
+                        $prepend_code['insert_head'] .= $code;
1264
+                    }
1265
+                    if ($script['type'] != 'public') {
1266
+                        $prepend_code['header_prive'] .= $code;
1267
+                    }
1268
+                }
1269
+            }
1270
+        }
1271
+    }
1272
+
1273
+    $prepend_code['insert_head'] =
1274
+        "include_once_check(_DIR_RESTREINT . 'inc/pipelines.php');\n"
1275
+        . "\$val = minipipe('f_jQuery', \$val);\n"
1276
+        . $prepend_code['insert_head'];
1277
+    $prepend_code['header_prive'] =
1278
+        "include_once_check(_DIR_RESTREINT . 'inc/pipelines_ecrire.php');\n"
1279
+        . "\$val = minipipe('f_jQuery_prive', \$val);\n"
1280
+        . $prepend_code['header_prive'];
1281
+
1282
+    // on ajoute les pipe qui ont ete recenses manquants
1283
+    foreach ($liste_pipe_manquants as $add_pipe) {
1284
+        if (!isset($GLOBALS['spip_pipeline'][$add_pipe])) {
1285
+            $GLOBALS['spip_pipeline'][$add_pipe] = '';
1286
+        }
1287
+    }
1288
+
1289
+    return $prepend_code;
1290 1290
 }
1291 1291
 
1292 1292
 /**
@@ -1313,62 +1313,62 @@  discard block
 block discarded – undo
1313 1313
 **/
1314 1314
 function pipeline_precompile($prepend_code = []) {
1315 1315
 
1316
-	$all_pipes = $all_pipes_end = '';
1317
-	if (!empty($GLOBALS['spip_pipeline']['all'])) {
1318
-		$a = explode('||', $GLOBALS['spip_pipeline']['all'], 2);
1319
-		unset($GLOBALS['spip_pipeline']['all']);
1320
-		$all_pipes = trim(array_shift($a));
1321
-		if ($all_pipes) {
1322
-			$all_pipes = '|' . ltrim($all_pipes, '|');
1323
-		}
1324
-		if (count($a)) {
1325
-			$all_pipes_end = '||' . array_shift($a);
1326
-		}
1327
-	}
1328
-	$content = '';
1329
-	foreach ($GLOBALS['spip_pipeline'] as $action => $pipeline) {
1330
-		$s_inc = '';
1331
-		$s_call = '';
1332
-		if ($all_pipes) {
1333
-			$pipeline = preg_replace(',(\|\||$),', "$all_pipes\\1", $pipeline, 1);
1334
-		}
1335
-		if ($all_pipes_end) {
1336
-			$pipeline .= $all_pipes_end;
1337
-		}
1338
-		$pipe = array_filter(explode('|', $pipeline));
1339
-		// Eclater le pipeline en filtres et appliquer chaque filtre
1340
-		foreach ($pipe as $fonc) {
1341
-			$fonc = trim($fonc);
1342
-			$s_call .= '$val = minipipe(\'' . $fonc . '\', $val);' . "\n";
1343
-			if (isset($GLOBALS['spip_matrice'][$fonc])) {
1344
-				$file = $GLOBALS['spip_matrice'][$fonc];
1345
-				$file = "'$file'";
1346
-				// si un _DIR_XXX: est dans la chaine, on extrait la constante
1347
-				if (preg_match(',(_(DIR|ROOT)_[A-Z_]+):,Ums', $file, $regs)) {
1348
-					$dir = $regs[1];
1349
-					$root_dir = str_replace('_DIR_', '_ROOT_', $dir);
1350
-					if (defined($root_dir)) {
1351
-						$dir = $root_dir;
1352
-					}
1353
-					$file = str_replace($regs[0], "'." . $dir . ".'", $file);
1354
-					$file = str_replace("''.", '', $file);
1355
-					$file = str_replace(constant($dir), '', $file);
1356
-				}
1357
-				$s_inc .= "include_once_check($file);\n";
1358
-			}
1359
-		}
1360
-		if (strlen($s_inc)) {
1361
-			$s_inc = "static \$inc=null;\nif (!\$inc){\n$s_inc\$inc=true;\n}\n";
1362
-		}
1363
-		$content .= "// Pipeline $action \n"
1364
-			. "function execute_pipeline_$action(&\$val){\n"
1365
-			. $s_inc
1366
-			. ((isset($prepend_code[$action]) && strlen($prepend_code[$action])) ? trim($prepend_code[$action]) . "\n" : '')
1367
-			. $s_call
1368
-			. "return \$val;\n}\n";
1369
-	}
1370
-	ecrire_fichier_php(_CACHE_PIPELINES, $content);
1371
-	clear_path_cache();
1316
+    $all_pipes = $all_pipes_end = '';
1317
+    if (!empty($GLOBALS['spip_pipeline']['all'])) {
1318
+        $a = explode('||', $GLOBALS['spip_pipeline']['all'], 2);
1319
+        unset($GLOBALS['spip_pipeline']['all']);
1320
+        $all_pipes = trim(array_shift($a));
1321
+        if ($all_pipes) {
1322
+            $all_pipes = '|' . ltrim($all_pipes, '|');
1323
+        }
1324
+        if (count($a)) {
1325
+            $all_pipes_end = '||' . array_shift($a);
1326
+        }
1327
+    }
1328
+    $content = '';
1329
+    foreach ($GLOBALS['spip_pipeline'] as $action => $pipeline) {
1330
+        $s_inc = '';
1331
+        $s_call = '';
1332
+        if ($all_pipes) {
1333
+            $pipeline = preg_replace(',(\|\||$),', "$all_pipes\\1", $pipeline, 1);
1334
+        }
1335
+        if ($all_pipes_end) {
1336
+            $pipeline .= $all_pipes_end;
1337
+        }
1338
+        $pipe = array_filter(explode('|', $pipeline));
1339
+        // Eclater le pipeline en filtres et appliquer chaque filtre
1340
+        foreach ($pipe as $fonc) {
1341
+            $fonc = trim($fonc);
1342
+            $s_call .= '$val = minipipe(\'' . $fonc . '\', $val);' . "\n";
1343
+            if (isset($GLOBALS['spip_matrice'][$fonc])) {
1344
+                $file = $GLOBALS['spip_matrice'][$fonc];
1345
+                $file = "'$file'";
1346
+                // si un _DIR_XXX: est dans la chaine, on extrait la constante
1347
+                if (preg_match(',(_(DIR|ROOT)_[A-Z_]+):,Ums', $file, $regs)) {
1348
+                    $dir = $regs[1];
1349
+                    $root_dir = str_replace('_DIR_', '_ROOT_', $dir);
1350
+                    if (defined($root_dir)) {
1351
+                        $dir = $root_dir;
1352
+                    }
1353
+                    $file = str_replace($regs[0], "'." . $dir . ".'", $file);
1354
+                    $file = str_replace("''.", '', $file);
1355
+                    $file = str_replace(constant($dir), '', $file);
1356
+                }
1357
+                $s_inc .= "include_once_check($file);\n";
1358
+            }
1359
+        }
1360
+        if (strlen($s_inc)) {
1361
+            $s_inc = "static \$inc=null;\nif (!\$inc){\n$s_inc\$inc=true;\n}\n";
1362
+        }
1363
+        $content .= "// Pipeline $action \n"
1364
+            . "function execute_pipeline_$action(&\$val){\n"
1365
+            . $s_inc
1366
+            . ((isset($prepend_code[$action]) && strlen($prepend_code[$action])) ? trim($prepend_code[$action]) . "\n" : '')
1367
+            . $s_call
1368
+            . "return \$val;\n}\n";
1369
+    }
1370
+    ecrire_fichier_php(_CACHE_PIPELINES, $content);
1371
+    clear_path_cache();
1372 1372
 }
1373 1373
 
1374 1374
 
@@ -1381,12 +1381,12 @@  discard block
 block discarded – undo
1381 1381
  *     true si le plugin est actif, false sinon
1382 1382
 **/
1383 1383
 function plugin_est_installe($plug_path) {
1384
-	$plugin_installes = isset($GLOBALS['meta']['plugin_installes']) ? unserialize($GLOBALS['meta']['plugin_installes']) : [];
1385
-	if (!$plugin_installes) {
1386
-		return false;
1387
-	}
1384
+    $plugin_installes = isset($GLOBALS['meta']['plugin_installes']) ? unserialize($GLOBALS['meta']['plugin_installes']) : [];
1385
+    if (!$plugin_installes) {
1386
+        return false;
1387
+    }
1388 1388
 
1389
-	return in_array($plug_path, $plugin_installes);
1389
+    return in_array($plug_path, $plugin_installes);
1390 1390
 }
1391 1391
 
1392 1392
 
@@ -1399,46 +1399,46 @@  discard block
 block discarded – undo
1399 1399
  * @uses plugins_installer_dist()
1400 1400
  **/
1401 1401
 function plugin_installes_meta() {
1402
-	if (isset($GLOBALS['fichier_php_compile_recent'])) {
1403
-		// attendre eventuellement l'invalidation du cache opcode
1404
-		spip_attend_invalidation_opcode_cache($GLOBALS['fichier_php_compile_recent']);
1405
-	}
1406
-
1407
-	$installer_plugins = charger_fonction('installer', 'plugins');
1408
-	$meta_plug_installes = [];
1409
-	foreach (unserialize($GLOBALS['meta']['plugin']) as $prefix => $resume) {
1410
-		if ($plug = $resume['dir']) {
1411
-			$infos = $installer_plugins($plug, 'install', $resume['dir_type']);
1412
-			if ($infos) {
1413
-				if (!is_array($infos) || $infos['install_test'][0]) {
1414
-					$meta_plug_installes[] = $plug;
1415
-				}
1416
-				if (is_array($infos)) {
1417
-					[$ok, $trace] = $infos['install_test'];
1418
-					$titre = _T('plugin_titre_installation', ['plugin' => typo($infos['nom'])]);
1419
-					$result = ($ok ? ((isset($infos['upgrade']) && $infos['upgrade']) ? _T('plugin_info_upgrade_ok') : _T('plugin_info_install_ok')) : _T('avis_operation_echec'));
1420
-					if (_IS_CLI) {
1421
-						include_spip('inc/filtres');
1422
-						$trace = ltrim(textebrut($trace) . "\n" . $result);
1423
-						$trace = '    ' . str_replace("\n", "\n    ", $trace);
1424
-						echo "\n" . ($ok ? 'OK  ' : '/!\ ') . textebrut($titre) . "\n",
1425
-						  $trace,
1426
-						  "\n";
1427
-					}
1428
-					else {
1429
-						include_spip('inc/filtres_boites');
1430
-						echo "<div class='install-plugins svp_retour'>"
1431
-							. boite_ouvrir($titre, ($ok ? 'success' : 'error'))
1432
-							. $trace
1433
-							. "<div class='result'>$result</div>"
1434
-							. boite_fermer()
1435
-							. '</div>';
1436
-					}
1437
-				}
1438
-			}
1439
-		}
1440
-	}
1441
-	ecrire_meta('plugin_installes', serialize($meta_plug_installes), 'non');
1402
+    if (isset($GLOBALS['fichier_php_compile_recent'])) {
1403
+        // attendre eventuellement l'invalidation du cache opcode
1404
+        spip_attend_invalidation_opcode_cache($GLOBALS['fichier_php_compile_recent']);
1405
+    }
1406
+
1407
+    $installer_plugins = charger_fonction('installer', 'plugins');
1408
+    $meta_plug_installes = [];
1409
+    foreach (unserialize($GLOBALS['meta']['plugin']) as $prefix => $resume) {
1410
+        if ($plug = $resume['dir']) {
1411
+            $infos = $installer_plugins($plug, 'install', $resume['dir_type']);
1412
+            if ($infos) {
1413
+                if (!is_array($infos) || $infos['install_test'][0]) {
1414
+                    $meta_plug_installes[] = $plug;
1415
+                }
1416
+                if (is_array($infos)) {
1417
+                    [$ok, $trace] = $infos['install_test'];
1418
+                    $titre = _T('plugin_titre_installation', ['plugin' => typo($infos['nom'])]);
1419
+                    $result = ($ok ? ((isset($infos['upgrade']) && $infos['upgrade']) ? _T('plugin_info_upgrade_ok') : _T('plugin_info_install_ok')) : _T('avis_operation_echec'));
1420
+                    if (_IS_CLI) {
1421
+                        include_spip('inc/filtres');
1422
+                        $trace = ltrim(textebrut($trace) . "\n" . $result);
1423
+                        $trace = '    ' . str_replace("\n", "\n    ", $trace);
1424
+                        echo "\n" . ($ok ? 'OK  ' : '/!\ ') . textebrut($titre) . "\n",
1425
+                            $trace,
1426
+                            "\n";
1427
+                    }
1428
+                    else {
1429
+                        include_spip('inc/filtres_boites');
1430
+                        echo "<div class='install-plugins svp_retour'>"
1431
+                            . boite_ouvrir($titre, ($ok ? 'success' : 'error'))
1432
+                            . $trace
1433
+                            . "<div class='result'>$result</div>"
1434
+                            . boite_fermer()
1435
+                            . '</div>';
1436
+                    }
1437
+                }
1438
+            }
1439
+        }
1440
+    }
1441
+    ecrire_meta('plugin_installes', serialize($meta_plug_installes), 'non');
1442 1442
 }
1443 1443
 
1444 1444
 /**
@@ -1452,29 +1452,29 @@  discard block
 block discarded – undo
1452 1452
  *     Commentaire : code écrit en tout début de fichier, après la balise PHP ouvrante
1453 1453
 **/
1454 1454
 function ecrire_fichier_php($nom, $contenu, $comment = '') {
1455
-	if (!isset($GLOBALS['fichier_php_compile_recent'])) {
1456
-		$GLOBALS['fichier_php_compile_recent'] = 0;
1457
-	}
1458
-
1459
-	$contenu = '<' . '?php' . "\n" . $comment . "\nif (defined('_ECRIRE_INC_VERSION')) {\n" . $contenu . "}\n?" . '>';
1460
-	// si un fichier existe deja on verifie que son contenu change avant de l'ecraser
1461
-	// si pas de modif on ne touche pas au fichier initial
1462
-	if (file_exists($nom)) {
1463
-		if (str_ends_with($nom, '.php')) {
1464
-			$fichier_tmp = substr($nom, 0, -4) . '.tmp.php';
1465
-		}
1466
-		else {
1467
-			$fichier_tmp = $nom . '.tmp';
1468
-		}
1469
-		file_put_contents($fichier_tmp, $contenu);
1470
-		if (md5_file($nom) == md5_file($fichier_tmp)) {
1471
-			$GLOBALS['fichier_php_compile_recent'] = max($GLOBALS['fichier_php_compile_recent'], filemtime($nom));
1472
-			@unlink($fichier_tmp);
1473
-			return;
1474
-		}
1475
-		@unlink($fichier_tmp);
1476
-	}
1477
-	ecrire_fichier($nom, $contenu);
1478
-	$GLOBALS['fichier_php_compile_recent'] = max($GLOBALS['fichier_php_compile_recent'], filemtime($nom));
1479
-	spip_clear_opcode_cache(realpath($nom));
1455
+    if (!isset($GLOBALS['fichier_php_compile_recent'])) {
1456
+        $GLOBALS['fichier_php_compile_recent'] = 0;
1457
+    }
1458
+
1459
+    $contenu = '<' . '?php' . "\n" . $comment . "\nif (defined('_ECRIRE_INC_VERSION')) {\n" . $contenu . "}\n?" . '>';
1460
+    // si un fichier existe deja on verifie que son contenu change avant de l'ecraser
1461
+    // si pas de modif on ne touche pas au fichier initial
1462
+    if (file_exists($nom)) {
1463
+        if (str_ends_with($nom, '.php')) {
1464
+            $fichier_tmp = substr($nom, 0, -4) . '.tmp.php';
1465
+        }
1466
+        else {
1467
+            $fichier_tmp = $nom . '.tmp';
1468
+        }
1469
+        file_put_contents($fichier_tmp, $contenu);
1470
+        if (md5_file($nom) == md5_file($fichier_tmp)) {
1471
+            $GLOBALS['fichier_php_compile_recent'] = max($GLOBALS['fichier_php_compile_recent'], filemtime($nom));
1472
+            @unlink($fichier_tmp);
1473
+            return;
1474
+        }
1475
+        @unlink($fichier_tmp);
1476
+    }
1477
+    ecrire_fichier($nom, $contenu);
1478
+    $GLOBALS['fichier_php_compile_recent'] = max($GLOBALS['fichier_php_compile_recent'], filemtime($nom));
1479
+    spip_clear_opcode_cache(realpath($nom));
1480 1480
 }
Please login to merge, or discard this patch.
Spacing   +48 added lines, -48 removed lines patch added patch discarded remove patch
@@ -21,7 +21,7 @@  discard block
 block discarded – undo
21 21
 
22 22
 /** l'adresse du repertoire de telechargement et de decompactage des plugins */
23 23
 if (!defined('_DIR_PLUGINS_AUTO')) {
24
-	define('_DIR_PLUGINS_AUTO', _DIR_PLUGINS . 'auto/');
24
+	define('_DIR_PLUGINS_AUTO', _DIR_PLUGINS.'auto/');
25 25
 }
26 26
 
27 27
 #include_spip('inc/texte'); // ????? Appelle public/parametrer trop tot avant la reconstruction du chemin des plugins.
@@ -378,7 +378,7 @@  discard block
 block discarded – undo
378 378
 				if ($dir) {
379 379
 					$dir .= '/';
380 380
 				}
381
-				$dir .= 'procure:' . $procure['nom'];
381
+				$dir .= 'procure:'.$procure['nom'];
382 382
 
383 383
 				$procure['etat'] = '?';
384 384
 				$procure['dir_type'] = $resume['dir_type'];
@@ -558,7 +558,7 @@  discard block
 block discarded – undo
558 558
 		$plug = $resume['dir'];
559 559
 		$k = $infos[$dir_type][$plug];
560 560
 
561
-		$plug = constant($dir_type) . $plug;
561
+		$plug = constant($dir_type).$plug;
562 562
 		if (!isset($msg[$p])) {
563 563
 			if (isset($resume['erreur']) && $resume['erreur']) {
564 564
 				$msg[$p] = [$resume['erreur']];
@@ -601,10 +601,10 @@  discard block
 block discarded – undo
601 601
 		$list = $raw ? [] : $GLOBALS['meta']['plugin_erreur_activation'];
602 602
 	} elseif (!$raw) {
603 603
 		foreach ($list as $plug => $msg) {
604
-			$list[$plug] = '<li>' . _T('plugin_impossible_activer', ['plugin' => $plug])
605
-				. '<ul><li>' . implode('</li><li>', $msg) . '</li></ul></li>';
604
+			$list[$plug] = '<li>'._T('plugin_impossible_activer', ['plugin' => $plug])
605
+				. '<ul><li>'.implode('</li><li>', $msg).'</li></ul></li>';
606 606
 		}
607
-		$list = '<ul>' . join("\n", $list) . '</ul>';
607
+		$list = '<ul>'.join("\n", $list).'</ul>';
608 608
 	}
609 609
 	if ($raz) {
610 610
 		effacer_meta('plugin_erreur_activation');
@@ -718,13 +718,13 @@  discard block
 block discarded – undo
718 718
 			if ($minimum_inclus && spip_version_compare($version, $minimum, '<')) {
719 719
 				return _T("plugin_{$balise}_{$type}", [
720 720
 					'plugin' => $nom,
721
-					'version' => ' &ge; ' . $minimum
721
+					'version' => ' &ge; '.$minimum
722 722
 				]);
723 723
 			}
724 724
 			if (!$minimum_inclus && spip_version_compare($version, $minimum, '<=')) {
725 725
 				return _T("plugin_{$balise}_{$type}", [
726 726
 					'plugin' => $nom,
727
-					'version' => ' &gt; ' . $minimum
727
+					'version' => ' &gt; '.$minimum
728 728
 				]);
729 729
 			}
730 730
 		}
@@ -733,13 +733,13 @@  discard block
 block discarded – undo
733 733
 			if ($maximum_inclus && spip_version_compare($version, $maximum, '>')) {
734 734
 				return _T("plugin_{$balise}_{$type}", [
735 735
 					'plugin' => $nom,
736
-					'version' => ' &le; ' . $maximum
736
+					'version' => ' &le; '.$maximum
737 737
 				]);
738 738
 			}
739 739
 			if (!$maximum_inclus && spip_version_compare($version, $maximum, '>=')) {
740 740
 				return _T("plugin_{$balise}_plugin", [
741 741
 					'plugin' => $nom,
742
-					'version' => ' &lt; ' . $maximum
742
+					'version' => ' &lt; '.$maximum
743 743
 				]);
744 744
 			}
745 745
 		}
@@ -758,7 +758,7 @@  discard block
 block discarded – undo
758 758
 		include_spip('inc/charger_plugin');
759 759
 		$url = '<br />'	. bouton_telechargement_plugin($url, 'lib');
760 760
 	}*/
761
-	return _T('plugin_necessite_lib', ['lib' => $lib]) . " <a href='$url'>$url</a>";
761
+	return _T('plugin_necessite_lib', ['lib' => $lib])." <a href='$url'>$url</a>";
762 762
 }
763 763
 
764 764
 
@@ -857,7 +857,7 @@  discard block
 block discarded – undo
857 857
 	foreach ($plugin_valides as $p => $resume) {
858 858
 		// Les headers ne doivent pas indiquer les versions des extensions PHP, ni la version PHP
859 859
 		if (!str_starts_with($p, 'PHP:') && $p !== 'PHP') {
860
-			$header[] = $p . ($resume['version'] ? '(' . $resume['version'] . ')' : '');
860
+			$header[] = $p.($resume['version'] ? '('.$resume['version'].')' : '');
861 861
 		}
862 862
 		if ($resume['dir']) {
863 863
 			foreach ($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) {
@@ -882,11 +882,11 @@  discard block
 block discarded – undo
882 882
 	$header = strtolower(implode(',', $header));
883 883
 	if (!isset($GLOBALS['spip_header_silencieux']) || !$GLOBALS['spip_header_silencieux']) {
884 884
 		ecrire_fichier(
885
-			_DIR_VAR . 'config.txt',
886
-			(defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY : 'Composed-By: SPIP') . ' ' . $GLOBALS['spip_version_affichee'] . ' @ www.spip.net + ' . $header
885
+			_DIR_VAR.'config.txt',
886
+			(defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY : 'Composed-By: SPIP').' '.$GLOBALS['spip_version_affichee'].' @ www.spip.net + '.$header
887 887
 		);
888 888
 	} else {
889
-		@unlink(_DIR_VAR . 'config.txt');
889
+		@unlink(_DIR_VAR.'config.txt');
890 890
 	}
891 891
 	// generer charger_plugins_chemin.php
892 892
 	plugins_precompile_chemin($plugin_valides, $ordre);
@@ -940,7 +940,7 @@  discard block
 block discarded – undo
940 940
 			// definir le plugin, donc le path avant l'include du fichier options
941 941
 			// permet de faire des include_spip pour attraper un inc_ du plugin
942 942
 
943
-			$dir = $dir_type . ".'" . $plug . "/'";
943
+			$dir = $dir_type.".'".$plug."/'";
944 944
 
945 945
 			$prefix = strtoupper(preg_replace(',\W,', '_', $info['prefix']));
946 946
 			if (
@@ -951,7 +951,7 @@  discard block
 block discarded – undo
951 951
 				if (!$info['chemin']) {
952 952
 					$chemins['public'][] = "_DIR_PLUGIN_$prefix";
953 953
 					$chemins['prive'][] = "_DIR_PLUGIN_$prefix";
954
-					if (is_dir(constant($dir_type) . $plug . '/squelettes/')) {
954
+					if (is_dir(constant($dir_type).$plug.'/squelettes/')) {
955 955
 						$chemins['public'][] = "_DIR_PLUGIN_{$prefix}.'squelettes/'";
956 956
 					}
957 957
 				}
@@ -973,13 +973,13 @@  discard block
 block discarded – undo
973 973
 								$dir = '';
974 974
 							}
975 975
 							if (strlen($dir)) {
976
-								$dir = rtrim($dir, '/') . '/';
976
+								$dir = rtrim($dir, '/').'/';
977 977
 							}
978 978
 							if (!isset($chemin['type']) || $chemin['type'] == 'public') {
979
-								$chemins['public'][] = "_DIR_PLUGIN_$prefix" . (strlen($dir) ? ".'$dir'" : '');
979
+								$chemins['public'][] = "_DIR_PLUGIN_$prefix".(strlen($dir) ? ".'$dir'" : '');
980 980
 							}
981 981
 							if (!isset($chemin['type']) || $chemin['type'] == 'prive') {
982
-								$chemins['prive'][] = "_DIR_PLUGIN_$prefix" . (strlen($dir) ? ".'$dir'" : '');
982
+								$chemins['prive'][] = "_DIR_PLUGIN_$prefix".(strlen($dir) ? ".'$dir'" : '');
983 983
 							}
984 984
 						}
985 985
 					}
@@ -988,11 +988,11 @@  discard block
 block discarded – undo
988 988
 		}
989 989
 	}
990 990
 	if (count($chemins['public']) || count($chemins['prive'])) {
991
-		$contenu .= 'if (_DIR_RESTREINT) _chemin([' . implode(
991
+		$contenu .= 'if (_DIR_RESTREINT) _chemin(['.implode(
992 992
 			',',
993 993
 			array_reverse($chemins['public'])
994
-		) . "]);\n"
995
-			. 'else _chemin([' . implode(',', array_reverse($chemins['prive'])) . "]);\n";
994
+		)."]);\n"
995
+			. 'else _chemin(['.implode(',', array_reverse($chemins['prive']))."]);\n";
996 996
 	}
997 997
 
998 998
 	ecrire_fichier_php(_CACHE_PLUGINS_PATH, $contenu);
@@ -1041,7 +1041,7 @@  discard block
 block discarded – undo
1041 1041
 					&& !str_contains($dir, ':')
1042 1042
 					&& file_exists("$dir$plug/paquet.xml") // uniquement pour les paquet.xml
1043 1043
 				) {
1044
-					if (is_readable("$dir$plug/" . ($file = $info['prefix'] . '_' . $charge . '.php'))) {
1044
+					if (is_readable("$dir$plug/".($file = $info['prefix'].'_'.$charge.'.php'))) {
1045 1045
 						$info[$charge] = [$file];
1046 1046
 					}
1047 1047
 				}
@@ -1056,7 +1056,7 @@  discard block
 block discarded – undo
1056 1056
 						) {
1057 1057
 							unset($info[$charge][$k]);
1058 1058
 						} else {
1059
-							$_file = $root_dir_type . ".'$plug/$file'";
1059
+							$_file = $root_dir_type.".'$plug/$file'";
1060 1060
 							$contenu[$charge] .= "include_once_check($_file);\n";
1061 1061
 						}
1062 1062
 					}
@@ -1066,7 +1066,7 @@  discard block
 block discarded – undo
1066 1066
 		}
1067 1067
 	}
1068 1068
 
1069
-	$contenu['options'] = "define('_PLUGINS_HASH','" . md5($sign) . "');\n" . $contenu['options'];
1069
+	$contenu['options'] = "define('_PLUGINS_HASH','".md5($sign)."');\n".$contenu['options'];
1070 1070
 	$contenu['fonctions'] .= plugin_ongletbouton('boutons_plugins', $boutons)
1071 1071
 		. plugin_ongletbouton('onglets_plugins', $onglets);
1072 1072
 
@@ -1101,12 +1101,12 @@  discard block
 block discarded – undo
1101 1101
 		define("_UPDATED_$nom", $val);
1102 1102
 		define("_UPDATED_md5_$nom", $md5);
1103 1103
 	}
1104
-	$val = "unserialize('" . str_replace("'", "\'", $val) . "')";
1104
+	$val = "unserialize('".str_replace("'", "\'", $val)."')";
1105 1105
 
1106 1106
 	return
1107 1107
 		"if (!function_exists('$nom')) {\n"
1108 1108
 		. "function $nom(){return defined('_UPDATED_$nom')?unserialize(_UPDATED_$nom):$val;}\n"
1109
-		. "function md5_$nom(){return defined('_UPDATED_md5_$nom')?_UPDATED_md5_$nom:'" . $md5 . "';}\n"
1109
+		. "function md5_$nom(){return defined('_UPDATED_md5_$nom')?_UPDATED_md5_$nom:'".$md5."';}\n"
1110 1110
 		. "}\n";
1111 1111
 }
1112 1112
 
@@ -1129,7 +1129,7 @@  discard block
 block discarded – undo
1129 1129
 	if (@is_readable(_CACHE_PLUGINS_OPT)) {
1130 1130
 		include_once(_CACHE_PLUGINS_OPT);
1131 1131
 	} else {
1132
-		spip_log('pipelines desactives: impossible de produire ' . _CACHE_PLUGINS_OPT);
1132
+		spip_log('pipelines desactives: impossible de produire '._CACHE_PLUGINS_OPT);
1133 1133
 	}
1134 1134
 }
1135 1135
 
@@ -1166,7 +1166,7 @@  discard block
 block discarded – undo
1166 1166
 			$dir_type = $plugin_valides[$p]['dir_type'];
1167 1167
 			$root_dir_type = str_replace('_DIR_', '_ROOT_', $dir_type);
1168 1168
 			$plug = $plugin_valides[$p]['dir'];
1169
-			$prefix = (($info['prefix'] == 'spip') ? '' : $info['prefix'] . '_');
1169
+			$prefix = (($info['prefix'] == 'spip') ? '' : $info['prefix'].'_');
1170 1170
 			if (isset($info['pipeline']) && is_array($info['pipeline'])) {
1171 1171
 				foreach ($info['pipeline'] as $pipe) {
1172 1172
 					$nom = $pipe['nom'];
@@ -1200,7 +1200,7 @@  discard block
 block discarded – undo
1200 1200
 						}
1201 1201
 						if (isset($pipe['inclure'])) {
1202 1202
 							$GLOBALS['spip_matrice']["$prefix$action"] =
1203
-								"$root_dir_type:$plug/" . $pipe['inclure'];
1203
+								"$root_dir_type:$plug/".$pipe['inclure'];
1204 1204
 						}
1205 1205
 					}
1206 1206
 				}
@@ -1210,7 +1210,7 @@  discard block
 block discarded – undo
1210 1210
 					$prepend_code['taches_generales_cron'] = '';
1211 1211
 				}
1212 1212
 				foreach ($info['genie'] as $genie) {
1213
-					$nom = $prefix . $genie['nom'];
1213
+					$nom = $prefix.$genie['nom'];
1214 1214
 					$periode = max(60, intval($genie['periode']));
1215 1215
 					if (charger_fonction($nom, 'genie', true)) {
1216 1216
 						$prepend_code['taches_generales_cron'] .= "\$val['$nom'] = $periode;\n";
@@ -1228,13 +1228,13 @@  discard block
 block discarded – undo
1228 1228
 				}
1229 1229
 				foreach ($info['style'] as $style) {
1230 1230
 					if (isset($style['path']) && $style['path']) {
1231
-						$code = "if (\$f=timestamp(direction_css(find_in_path('" . addslashes($style['path']) . "')))) ";
1231
+						$code = "if (\$f=timestamp(direction_css(find_in_path('".addslashes($style['path'])."')))) ";
1232 1232
 					} else {
1233
-						$code = "if (\$f='" . addslashes($style['url']) . "') ";
1233
+						$code = "if (\$f='".addslashes($style['url'])."') ";
1234 1234
 					}
1235 1235
 					$code .= "\$val .= '<link rel=\"stylesheet\" href=\"'.\$f.'\" type=\"text/css\"";
1236 1236
 					if (isset($style['media']) && strlen($style['media'])) {
1237
-						$code .= ' media="' . addslashes($style['media']) . '"';
1237
+						$code .= ' media="'.addslashes($style['media']).'"';
1238 1238
 					}
1239 1239
 					$code .= "/>';\n";
1240 1240
 					if ($style['type'] != 'prive') {
@@ -1254,9 +1254,9 @@  discard block
 block discarded – undo
1254 1254
 			if (isset($info['script']) && (is_countable($info['script']) ? count($info['script']) : 0)) {
1255 1255
 				foreach ($info['script'] as $script) {
1256 1256
 					if (isset($script['path']) && $script['path']) {
1257
-						$code = "if (\$f=timestamp(find_in_path('" . addslashes($script['path']) . "'))) ";
1257
+						$code = "if (\$f=timestamp(find_in_path('".addslashes($script['path'])."'))) ";
1258 1258
 					} else {
1259
-						$code = "if (\$f='" . addslashes($script['url']) . "') ";
1259
+						$code = "if (\$f='".addslashes($script['url'])."') ";
1260 1260
 					}
1261 1261
 					$code .= "\$val .= '<script src=\"'.\$f.'\" type=\"text/javascript\"></script>';\n";
1262 1262
 					if ($script['type'] != 'prive') {
@@ -1319,10 +1319,10 @@  discard block
 block discarded – undo
1319 1319
 		unset($GLOBALS['spip_pipeline']['all']);
1320 1320
 		$all_pipes = trim(array_shift($a));
1321 1321
 		if ($all_pipes) {
1322
-			$all_pipes = '|' . ltrim($all_pipes, '|');
1322
+			$all_pipes = '|'.ltrim($all_pipes, '|');
1323 1323
 		}
1324 1324
 		if (count($a)) {
1325
-			$all_pipes_end = '||' . array_shift($a);
1325
+			$all_pipes_end = '||'.array_shift($a);
1326 1326
 		}
1327 1327
 	}
1328 1328
 	$content = '';
@@ -1339,7 +1339,7 @@  discard block
 block discarded – undo
1339 1339
 		// Eclater le pipeline en filtres et appliquer chaque filtre
1340 1340
 		foreach ($pipe as $fonc) {
1341 1341
 			$fonc = trim($fonc);
1342
-			$s_call .= '$val = minipipe(\'' . $fonc . '\', $val);' . "\n";
1342
+			$s_call .= '$val = minipipe(\''.$fonc.'\', $val);'."\n";
1343 1343
 			if (isset($GLOBALS['spip_matrice'][$fonc])) {
1344 1344
 				$file = $GLOBALS['spip_matrice'][$fonc];
1345 1345
 				$file = "'$file'";
@@ -1350,7 +1350,7 @@  discard block
 block discarded – undo
1350 1350
 					if (defined($root_dir)) {
1351 1351
 						$dir = $root_dir;
1352 1352
 					}
1353
-					$file = str_replace($regs[0], "'." . $dir . ".'", $file);
1353
+					$file = str_replace($regs[0], "'.".$dir.".'", $file);
1354 1354
 					$file = str_replace("''.", '', $file);
1355 1355
 					$file = str_replace(constant($dir), '', $file);
1356 1356
 				}
@@ -1363,7 +1363,7 @@  discard block
 block discarded – undo
1363 1363
 		$content .= "// Pipeline $action \n"
1364 1364
 			. "function execute_pipeline_$action(&\$val){\n"
1365 1365
 			. $s_inc
1366
-			. ((isset($prepend_code[$action]) && strlen($prepend_code[$action])) ? trim($prepend_code[$action]) . "\n" : '')
1366
+			. ((isset($prepend_code[$action]) && strlen($prepend_code[$action])) ? trim($prepend_code[$action])."\n" : '')
1367 1367
 			. $s_call
1368 1368
 			. "return \$val;\n}\n";
1369 1369
 	}
@@ -1419,9 +1419,9 @@  discard block
 block discarded – undo
1419 1419
 					$result = ($ok ? ((isset($infos['upgrade']) && $infos['upgrade']) ? _T('plugin_info_upgrade_ok') : _T('plugin_info_install_ok')) : _T('avis_operation_echec'));
1420 1420
 					if (_IS_CLI) {
1421 1421
 						include_spip('inc/filtres');
1422
-						$trace = ltrim(textebrut($trace) . "\n" . $result);
1423
-						$trace = '    ' . str_replace("\n", "\n    ", $trace);
1424
-						echo "\n" . ($ok ? 'OK  ' : '/!\ ') . textebrut($titre) . "\n",
1422
+						$trace = ltrim(textebrut($trace)."\n".$result);
1423
+						$trace = '    '.str_replace("\n", "\n    ", $trace);
1424
+						echo "\n".($ok ? 'OK  ' : '/!\ ').textebrut($titre)."\n",
1425 1425
 						  $trace,
1426 1426
 						  "\n";
1427 1427
 					}
@@ -1456,15 +1456,15 @@  discard block
 block discarded – undo
1456 1456
 		$GLOBALS['fichier_php_compile_recent'] = 0;
1457 1457
 	}
1458 1458
 
1459
-	$contenu = '<' . '?php' . "\n" . $comment . "\nif (defined('_ECRIRE_INC_VERSION')) {\n" . $contenu . "}\n?" . '>';
1459
+	$contenu = '<'.'?php'."\n".$comment."\nif (defined('_ECRIRE_INC_VERSION')) {\n".$contenu."}\n?".'>';
1460 1460
 	// si un fichier existe deja on verifie que son contenu change avant de l'ecraser
1461 1461
 	// si pas de modif on ne touche pas au fichier initial
1462 1462
 	if (file_exists($nom)) {
1463 1463
 		if (str_ends_with($nom, '.php')) {
1464
-			$fichier_tmp = substr($nom, 0, -4) . '.tmp.php';
1464
+			$fichier_tmp = substr($nom, 0, -4).'.tmp.php';
1465 1465
 		}
1466 1466
 		else {
1467
-			$fichier_tmp = $nom . '.tmp';
1467
+			$fichier_tmp = $nom.'.tmp';
1468 1468
 		}
1469 1469
 		file_put_contents($fichier_tmp, $contenu);
1470 1470
 		if (md5_file($nom) == md5_file($fichier_tmp)) {
Please login to merge, or discard this patch.
Braces   +5 added lines, -10 removed lines patch added patch discarded remove patch
@@ -562,11 +562,9 @@  discard block
 block discarded – undo
562 562
 		if (!isset($msg[$p])) {
563 563
 			if (isset($resume['erreur']) && $resume['erreur']) {
564 564
 				$msg[$p] = [$resume['erreur']];
565
-			}
566
-			elseif (!plugin_version_compatible($k['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
565
+			} elseif (!plugin_version_compatible($k['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
567 566
 				$msg[$p] = [plugin_message_incompatibilite($k['compatibilite'], $GLOBALS['spip_version_branche'], 'SPIP', 'necessite')];
568
-			}
569
-			elseif (!$msg[$p] = plugin_necessite($k['necessite'], $liste, 'necessite')) {
567
+			} elseif (!$msg[$p] = plugin_necessite($k['necessite'], $liste, 'necessite')) {
570 568
 				$msg[$p] = plugin_necessite($k['utilise'], $liste, 'utilise');
571 569
 			}
572 570
 		} else {
@@ -954,8 +952,7 @@  discard block
 block discarded – undo
954 952
 					if (is_dir(constant($dir_type) . $plug . '/squelettes/')) {
955 953
 						$chemins['public'][] = "_DIR_PLUGIN_{$prefix}.'squelettes/'";
956 954
 					}
957
-				}
958
-				else {
955
+				} else {
959 956
 					foreach ($info['chemin'] as $chemin) {
960 957
 						if (
961 958
 							!isset($chemin['version'])
@@ -1424,8 +1421,7 @@  discard block
 block discarded – undo
1424 1421
 						echo "\n" . ($ok ? 'OK  ' : '/!\ ') . textebrut($titre) . "\n",
1425 1422
 						  $trace,
1426 1423
 						  "\n";
1427
-					}
1428
-					else {
1424
+					} else {
1429 1425
 						include_spip('inc/filtres_boites');
1430 1426
 						echo "<div class='install-plugins svp_retour'>"
1431 1427
 							. boite_ouvrir($titre, ($ok ? 'success' : 'error'))
@@ -1462,8 +1458,7 @@  discard block
 block discarded – undo
1462 1458
 	if (file_exists($nom)) {
1463 1459
 		if (str_ends_with($nom, '.php')) {
1464 1460
 			$fichier_tmp = substr($nom, 0, -4) . '.tmp.php';
1465
-		}
1466
-		else {
1461
+		} else {
1467 1462
 			$fichier_tmp = $nom . '.tmp';
1468 1463
 		}
1469 1464
 		file_put_contents($fichier_tmp, $contenu);
Please login to merge, or discard this patch.
ecrire/inc/auth.php 2 patches
Indentation   +448 added lines, -448 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('base/abstract_sql');
@@ -34,33 +34,33 @@  discard block
 block discarded – undo
34 34
  *  - une chaîne vide si autorisation à pénétrer dans l'espace privé.
35 35
  */
36 36
 function inc_auth_dist() {
37
-	$row = auth_mode();
37
+    $row = auth_mode();
38 38
 
39
-	if ($row) {
40
-		return auth_init_droits($row);
41
-	}
39
+    if ($row) {
40
+        return auth_init_droits($row);
41
+    }
42 42
 
43
-	if (!$GLOBALS['connect_login']) {
44
-		return auth_a_loger();
45
-	}
43
+    if (!$GLOBALS['connect_login']) {
44
+        return auth_a_loger();
45
+    }
46 46
 
47
-	// Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
48
-	// C'est soit parce que la base est inutilisable,
49
-	// soit parce que la table des auteurs a changee (restauration etc)
50
-	// Pas la peine d'insister.
51
-	// Renvoyer le nom fautif et une URL de remise a zero
47
+    // Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
48
+    // C'est soit parce que la base est inutilisable,
49
+    // soit parce que la table des auteurs a changee (restauration etc)
50
+    // Pas la peine d'insister.
51
+    // Renvoyer le nom fautif et une URL de remise a zero
52 52
 
53
-	if (spip_connect()) {
54
-		return [
55
-			'login' => $GLOBALS['connect_login'],
56
-			'site' => generer_url_public('', 'action=logout&amp;logout=prive')
57
-		];
58
-	}
53
+    if (spip_connect()) {
54
+        return [
55
+            'login' => $GLOBALS['connect_login'],
56
+            'site' => generer_url_public('', 'action=logout&amp;logout=prive')
57
+        ];
58
+    }
59 59
 
60
-	$n = (int) sql_errno();
61
-	spip_log("Erreur base de donnees $n " . sql_error());
60
+    $n = (int) sql_errno();
61
+    spip_log("Erreur base de donnees $n " . sql_error());
62 62
 
63
-	return $n ?: 1;
63
+    return $n ?: 1;
64 64
 }
65 65
 
66 66
 /**
@@ -69,15 +69,15 @@  discard block
 block discarded – undo
69 69
  */
70 70
 function auth_controler_password_auteur_connecte(#[\SensitiveParameter] string $password): bool {
71 71
 
72
-	if (
73
-		empty($GLOBALS['visiteur_session']['id_auteur'])
74
-		|| empty($GLOBALS['visiteur_session']['login'])
75
-	) {
76
-		return false;
77
-	}
72
+    if (
73
+        empty($GLOBALS['visiteur_session']['id_auteur'])
74
+        || empty($GLOBALS['visiteur_session']['login'])
75
+    ) {
76
+        return false;
77
+    }
78 78
 
79
-	$auth = auth_identifier_login($GLOBALS['visiteur_session']['login'], $password, '', true);
80
-	return is_array($auth) && $auth['id_auteur'] == $GLOBALS['visiteur_session']['id_auteur'];
79
+    $auth = auth_identifier_login($GLOBALS['visiteur_session']['login'], $password, '', true);
80
+    return is_array($auth) && $auth['id_auteur'] == $GLOBALS['visiteur_session']['id_auteur'];
81 81
 }
82 82
 
83 83
 /**
@@ -89,47 +89,47 @@  discard block
 block discarded – undo
89 89
  * @return array|string
90 90
  */
91 91
 function auth_echec($raison) {
92
-	include_spip('inc/minipres');
93
-	include_spip('inc/headers');
94
-	// pas authentifie. Pourquoi ?
95
-	if (is_string($raison)) {
96
-		// redirection vers une page d'authentification
97
-		// on ne revient pas de cette fonction
98
-		// sauf si pb de header
99
-		$raison = redirige_formulaire($raison);
100
-	} elseif (is_int($raison)) {
101
-		// erreur SQL a afficher
102
-		$raison = minipres(
103
-			_T('info_travaux_titre'),
104
-			_T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
105
-		);
106
-	} elseif (@$raison['statut']) {
107
-		// un simple visiteur n'a pas acces a l'espace prive
108
-		spip_log('connexion refusee a ' . @$raison['id_auteur']);
109
-		$est_connecte = (!empty($GLOBALS['visiteur_session']['login']) && !empty($GLOBALS['visiteur_session']['statut'])); // idem test balise #URL_LOGOUT
110
-		$raison = minipres(
111
-			_T('avis_erreur_connexion'),
112
-			_T('avis_erreur_visiteur')
113
-				// Lien vers le site public
114
-				. '<br /><a href="' . url_de_base() . '">' . _T('login_retour_public') . '</a>'
115
-				// Si la personne est connectée, lien de déconnexion ramenant vers la page de login
116
-				. ($est_connecte ? ' | <a href="' . generer_url_public('', 'action=logout&amp;logout=prive') . '">' . _T('icone_deconnecter') . '</a>' : '')
117
-		);
118
-	} else {
119
-		// auteur en fin de droits ...
120
-		$h = $raison['site'];
121
-		$raison = minipres(
122
-			_T('avis_erreur_connexion'),
123
-			'<br /><br /><p>'
124
-			. _T('texte_inc_auth_1', ['auth_login' => $raison['login']])
125
-			. " <a href='$h'>"
126
-			. _T('texte_inc_auth_2')
127
-			. '</a>'
128
-			. _T('texte_inc_auth_3')
129
-		);
130
-	}
131
-
132
-	return $raison;
92
+    include_spip('inc/minipres');
93
+    include_spip('inc/headers');
94
+    // pas authentifie. Pourquoi ?
95
+    if (is_string($raison)) {
96
+        // redirection vers une page d'authentification
97
+        // on ne revient pas de cette fonction
98
+        // sauf si pb de header
99
+        $raison = redirige_formulaire($raison);
100
+    } elseif (is_int($raison)) {
101
+        // erreur SQL a afficher
102
+        $raison = minipres(
103
+            _T('info_travaux_titre'),
104
+            _T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
105
+        );
106
+    } elseif (@$raison['statut']) {
107
+        // un simple visiteur n'a pas acces a l'espace prive
108
+        spip_log('connexion refusee a ' . @$raison['id_auteur']);
109
+        $est_connecte = (!empty($GLOBALS['visiteur_session']['login']) && !empty($GLOBALS['visiteur_session']['statut'])); // idem test balise #URL_LOGOUT
110
+        $raison = minipres(
111
+            _T('avis_erreur_connexion'),
112
+            _T('avis_erreur_visiteur')
113
+                // Lien vers le site public
114
+                . '<br /><a href="' . url_de_base() . '">' . _T('login_retour_public') . '</a>'
115
+                // Si la personne est connectée, lien de déconnexion ramenant vers la page de login
116
+                . ($est_connecte ? ' | <a href="' . generer_url_public('', 'action=logout&amp;logout=prive') . '">' . _T('icone_deconnecter') . '</a>' : '')
117
+        );
118
+    } else {
119
+        // auteur en fin de droits ...
120
+        $h = $raison['site'];
121
+        $raison = minipres(
122
+            _T('avis_erreur_connexion'),
123
+            '<br /><br /><p>'
124
+            . _T('texte_inc_auth_1', ['auth_login' => $raison['login']])
125
+            . " <a href='$h'>"
126
+            . _T('texte_inc_auth_2')
127
+            . '</a>'
128
+            . _T('texte_inc_auth_3')
129
+        );
130
+    }
131
+
132
+    return $raison;
133 133
 }
134 134
 
135 135
 /**
@@ -139,79 +139,79 @@  discard block
 block discarded – undo
139 139
  * @return array|bool|string
140 140
  */
141 141
 function auth_mode() {
142
-	//
143
-	// Initialiser variables (eviter hacks par URL)
144
-	//
145
-	$GLOBALS['connect_login'] = '';
146
-	$id_auteur = null;
147
-	$GLOBALS['auth_can_disconnect'] = false;
148
-
149
-	//
150
-	// Recuperer les donnees d'identification
151
-	//
152
-	include_spip('inc/session');
153
-	// Session valide en cours ?
154
-	if ($cookie = lire_cookie_session()) {
155
-		$session = charger_fonction('session', 'inc');
156
-		if (
157
-			($id_auteur = $session()) || $id_auteur === 0 // reprise sur restauration
158
-		) {
159
-			$GLOBALS['auth_can_disconnect'] = true;
160
-			$GLOBALS['connect_login'] = session_get('login');
161
-		} else {
162
-			unset($_COOKIE['spip_session']);
163
-		}
164
-	}
165
-
166
-	// Essayer auth http si significatif
167
-	// (ignorer les login d'intranet independants de spip)
168
-	if (!$GLOBALS['ignore_auth_http']) {
169
-		if (
170
-			isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])
171
-				&& ($r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
172
-			// Si auth http differtente de basic, PHP_AUTH_PW
173
-			// est indisponible mais tentons quand meme pour
174
-			// autocreation via LDAP
175
-			|| isset($_SERVER['REMOTE_USER'])
176
-				&& ($r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], ''))
177
-		) {
178
-			if (!$id_auteur) {
179
-				$_SERVER['PHP_AUTH_PW'] = '';
180
-				$GLOBALS['auth_can_disconnect'] = true;
181
-				$GLOBALS['visiteur_session'] = $r;
182
-				$GLOBALS['connect_login'] = session_get('login');
183
-				$id_auteur = $r['id_auteur'];
184
-			} else {
185
-				// cas de la session en plus de PHP_AUTH
186
-				/*				  if ($id_auteur != $r['id_auteur']){
142
+    //
143
+    // Initialiser variables (eviter hacks par URL)
144
+    //
145
+    $GLOBALS['connect_login'] = '';
146
+    $id_auteur = null;
147
+    $GLOBALS['auth_can_disconnect'] = false;
148
+
149
+    //
150
+    // Recuperer les donnees d'identification
151
+    //
152
+    include_spip('inc/session');
153
+    // Session valide en cours ?
154
+    if ($cookie = lire_cookie_session()) {
155
+        $session = charger_fonction('session', 'inc');
156
+        if (
157
+            ($id_auteur = $session()) || $id_auteur === 0 // reprise sur restauration
158
+        ) {
159
+            $GLOBALS['auth_can_disconnect'] = true;
160
+            $GLOBALS['connect_login'] = session_get('login');
161
+        } else {
162
+            unset($_COOKIE['spip_session']);
163
+        }
164
+    }
165
+
166
+    // Essayer auth http si significatif
167
+    // (ignorer les login d'intranet independants de spip)
168
+    if (!$GLOBALS['ignore_auth_http']) {
169
+        if (
170
+            isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])
171
+                && ($r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
172
+            // Si auth http differtente de basic, PHP_AUTH_PW
173
+            // est indisponible mais tentons quand meme pour
174
+            // autocreation via LDAP
175
+            || isset($_SERVER['REMOTE_USER'])
176
+                && ($r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], ''))
177
+        ) {
178
+            if (!$id_auteur) {
179
+                $_SERVER['PHP_AUTH_PW'] = '';
180
+                $GLOBALS['auth_can_disconnect'] = true;
181
+                $GLOBALS['visiteur_session'] = $r;
182
+                $GLOBALS['connect_login'] = session_get('login');
183
+                $id_auteur = $r['id_auteur'];
184
+            } else {
185
+                // cas de la session en plus de PHP_AUTH
186
+                /*				  if ($id_auteur != $r['id_auteur']){
187 187
 					spip_log("vol de session $id_auteur" . join(', ', $r));
188 188
 				unset($_COOKIE['spip_session']);
189 189
 				$id_auteur = '';
190 190
 				} */
191
-			}
192
-		} else {
193
-			// Authentification .htaccess old style, car .htaccess semble
194
-			// souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
195
-			if (isset($_SERVER['REMOTE_USER'])) {
196
-				$GLOBALS['connect_login'] = $_SERVER['REMOTE_USER'];
197
-			}
198
-		}
199
-	}
200
-
201
-	$where = (is_numeric($id_auteur)
202
-		/*AND $id_auteur>0*/ // reprise lors des restaurations
203
-	) ?
204
-		"id_auteur=$id_auteur" :
205
-		(strlen((string) $GLOBALS['connect_login']) ? 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text') : '');
206
-
207
-	if (!$where) {
208
-		return '';
209
-	}
210
-
211
-	// Trouver les autres infos dans la table auteurs.
212
-	// le champ 'quand' est utilise par l'agenda
213
-
214
-	return sql_fetsel('*, en_ligne AS quand', 'spip_auteurs', "$where AND statut!='5poubelle'");
191
+            }
192
+        } else {
193
+            // Authentification .htaccess old style, car .htaccess semble
194
+            // souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
195
+            if (isset($_SERVER['REMOTE_USER'])) {
196
+                $GLOBALS['connect_login'] = $_SERVER['REMOTE_USER'];
197
+            }
198
+        }
199
+    }
200
+
201
+    $where = (is_numeric($id_auteur)
202
+        /*AND $id_auteur>0*/ // reprise lors des restaurations
203
+    ) ?
204
+        "id_auteur=$id_auteur" :
205
+        (strlen((string) $GLOBALS['connect_login']) ? 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text') : '');
206
+
207
+    if (!$where) {
208
+        return '';
209
+    }
210
+
211
+    // Trouver les autres infos dans la table auteurs.
212
+    // le champ 'quand' est utilise par l'agenda
213
+
214
+    return sql_fetsel('*, en_ligne AS quand', 'spip_auteurs', "$where AND statut!='5poubelle'");
215 215
 }
216 216
 
217 217
 /**
@@ -229,96 +229,96 @@  discard block
 block discarded – undo
229 229
  */
230 230
 function auth_init_droits($row) {
231 231
 
232
-	include_spip('inc/autoriser');
233
-	if (!autoriser('loger', '', 0, $row)) {
234
-		return false;
235
-	}
236
-
237
-
238
-	if ($row['statut'] == 'nouveau') {
239
-		include_spip('action/inscrire_auteur');
240
-		$row = confirmer_statut_inscription($row);
241
-	}
242
-
243
-	$GLOBALS['connect_id_auteur'] = $row['id_auteur'];
244
-	$GLOBALS['connect_login'] = $row['login'];
245
-	$GLOBALS['connect_statut'] = $row['statut'];
246
-
247
-	$GLOBALS['visiteur_session'] = array_merge((array) $GLOBALS['visiteur_session'], $row);
248
-
249
-	// au cas ou : ne pas memoriser les champs sensibles
250
-	$GLOBALS['visiteur_session'] = auth_desensibiliser_session($GLOBALS['visiteur_session']);
251
-
252
-	// creer la session au besoin
253
-	include_spip('inc/session');
254
-	if (!lire_cookie_session()) {
255
-		$session = charger_fonction('session', 'inc');
256
-		$spip_session = $session($row);
257
-	}
258
-
259
-	// reinjecter les preferences_auteur apres le reset de spip_session
260
-	// car utilisees au retour par auth_loger()
261
-	$r = @unserialize($row['prefs']);
262
-	$GLOBALS['visiteur_session']['prefs'] = ($r ?: []);
263
-	// si prefs pas definies, les definir par defaut
264
-	if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) {
265
-		$GLOBALS['visiteur_session']['prefs']['couleur'] = 2;
266
-		$GLOBALS['visiteur_session']['prefs']['display'] = 2;
267
-		$GLOBALS['visiteur_session']['prefs']['display_navigation'] = 'navigation_avec_icones';
268
-	}
269
-
270
-	$GLOBALS['visiteur_session'] = pipeline(
271
-		'preparer_visiteur_session',
272
-		['args' => ['row' => $row],
273
-		'data' => $GLOBALS['visiteur_session']]
274
-	);
275
-
276
-	// Etablir les droits selon le codage attendu
277
-	// dans ecrire/index.php ecrire/prive.php
278
-
279
-	// Pas autorise a acceder a ecrire ? renvoyer le tableau
280
-	// A noter : le premier appel a autoriser() a le bon gout
281
-	// d'initialiser $GLOBALS['visiteur_session']['restreint'],
282
-	// qui ne figure pas dans le fichier de session
283
-
284
-	if (!autoriser('ecrire')) {
285
-		return $row;
286
-	}
287
-
288
-	// autoriser('ecrire') ne laisse passer que les Admin et les Redac
289
-
290
-	auth_trace($row);
291
-
292
-	// Administrateurs
293
-	if (in_array($GLOBALS['connect_statut'], explode(',', _STATUT_AUTEUR_RUBRIQUE))) {
294
-		if (
295
-			isset($GLOBALS['visiteur_session']['restreint'])
296
-			&& is_array($GLOBALS['visiteur_session']['restreint'])
297
-		) {
298
-			$GLOBALS['connect_id_rubrique'] = $GLOBALS['visiteur_session']['restreint'];
299
-		}
300
-		if ($GLOBALS['connect_statut'] == '0minirezo') {
301
-			$GLOBALS['connect_toutes_rubriques'] = !$GLOBALS['connect_id_rubrique'];
302
-		}
303
-	}
304
-
305
-	// Pour les redacteurs, inc_version a fait l'initialisation minimale
306
-
307
-	return ''; // i.e. pas de pb.
232
+    include_spip('inc/autoriser');
233
+    if (!autoriser('loger', '', 0, $row)) {
234
+        return false;
235
+    }
236
+
237
+
238
+    if ($row['statut'] == 'nouveau') {
239
+        include_spip('action/inscrire_auteur');
240
+        $row = confirmer_statut_inscription($row);
241
+    }
242
+
243
+    $GLOBALS['connect_id_auteur'] = $row['id_auteur'];
244
+    $GLOBALS['connect_login'] = $row['login'];
245
+    $GLOBALS['connect_statut'] = $row['statut'];
246
+
247
+    $GLOBALS['visiteur_session'] = array_merge((array) $GLOBALS['visiteur_session'], $row);
248
+
249
+    // au cas ou : ne pas memoriser les champs sensibles
250
+    $GLOBALS['visiteur_session'] = auth_desensibiliser_session($GLOBALS['visiteur_session']);
251
+
252
+    // creer la session au besoin
253
+    include_spip('inc/session');
254
+    if (!lire_cookie_session()) {
255
+        $session = charger_fonction('session', 'inc');
256
+        $spip_session = $session($row);
257
+    }
258
+
259
+    // reinjecter les preferences_auteur apres le reset de spip_session
260
+    // car utilisees au retour par auth_loger()
261
+    $r = @unserialize($row['prefs']);
262
+    $GLOBALS['visiteur_session']['prefs'] = ($r ?: []);
263
+    // si prefs pas definies, les definir par defaut
264
+    if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) {
265
+        $GLOBALS['visiteur_session']['prefs']['couleur'] = 2;
266
+        $GLOBALS['visiteur_session']['prefs']['display'] = 2;
267
+        $GLOBALS['visiteur_session']['prefs']['display_navigation'] = 'navigation_avec_icones';
268
+    }
269
+
270
+    $GLOBALS['visiteur_session'] = pipeline(
271
+        'preparer_visiteur_session',
272
+        ['args' => ['row' => $row],
273
+        'data' => $GLOBALS['visiteur_session']]
274
+    );
275
+
276
+    // Etablir les droits selon le codage attendu
277
+    // dans ecrire/index.php ecrire/prive.php
278
+
279
+    // Pas autorise a acceder a ecrire ? renvoyer le tableau
280
+    // A noter : le premier appel a autoriser() a le bon gout
281
+    // d'initialiser $GLOBALS['visiteur_session']['restreint'],
282
+    // qui ne figure pas dans le fichier de session
283
+
284
+    if (!autoriser('ecrire')) {
285
+        return $row;
286
+    }
287
+
288
+    // autoriser('ecrire') ne laisse passer que les Admin et les Redac
289
+
290
+    auth_trace($row);
291
+
292
+    // Administrateurs
293
+    if (in_array($GLOBALS['connect_statut'], explode(',', _STATUT_AUTEUR_RUBRIQUE))) {
294
+        if (
295
+            isset($GLOBALS['visiteur_session']['restreint'])
296
+            && is_array($GLOBALS['visiteur_session']['restreint'])
297
+        ) {
298
+            $GLOBALS['connect_id_rubrique'] = $GLOBALS['visiteur_session']['restreint'];
299
+        }
300
+        if ($GLOBALS['connect_statut'] == '0minirezo') {
301
+            $GLOBALS['connect_toutes_rubriques'] = !$GLOBALS['connect_id_rubrique'];
302
+        }
303
+    }
304
+
305
+    // Pour les redacteurs, inc_version a fait l'initialisation minimale
306
+
307
+    return ''; // i.e. pas de pb.
308 308
 }
309 309
 
310 310
 /**
311 311
  * Enlever les clés sensibles d'une ligne auteur
312 312
  */
313 313
 function auth_desensibiliser_session(array $auteur): array {
314
-	$cles_sensibles = ['pass', 'htpass', 'low_sec', 'alea_actuel', 'alea_futur', 'ldap_password', 'backup_cles'];
315
-	foreach ($cles_sensibles as $cle) {
316
-		if (array_key_exists($cle, $auteur)) {
317
-			unset($auteur[$cle]);
318
-		}
319
-	}
320
-
321
-	return $auteur;
314
+    $cles_sensibles = ['pass', 'htpass', 'low_sec', 'alea_actuel', 'alea_futur', 'ldap_password', 'backup_cles'];
315
+    foreach ($cles_sensibles as $cle) {
316
+        if (array_key_exists($cle, $auteur)) {
317
+            unset($auteur[$cle]);
318
+        }
319
+    }
320
+
321
+    return $auteur;
322 322
 }
323 323
 
324 324
 /**
@@ -327,23 +327,23 @@  discard block
 block discarded – undo
327 327
  * @return string
328 328
  */
329 329
 function auth_a_loger() {
330
-	$redirect = generer_url_public('login', 'url=' . rawurlencode((string) self('&', true)), true);
331
-
332
-	// un echec au "bonjour" (login initial) quand le statut est
333
-	// inconnu signale sans doute un probleme de cookies
334
-	if (isset($_GET['bonjour'])) {
335
-		$redirect = parametre_url(
336
-			$redirect,
337
-			'var_erreur',
338
-			(isset($GLOBALS['visiteur_session']['statut'])
339
-				? 'statut'
340
-				: 'cookie'
341
-			),
342
-			'&'
343
-		);
344
-	}
345
-
346
-	return $redirect;
330
+    $redirect = generer_url_public('login', 'url=' . rawurlencode((string) self('&', true)), true);
331
+
332
+    // un echec au "bonjour" (login initial) quand le statut est
333
+    // inconnu signale sans doute un probleme de cookies
334
+    if (isset($_GET['bonjour'])) {
335
+        $redirect = parametre_url(
336
+            $redirect,
337
+            'var_erreur',
338
+            (isset($GLOBALS['visiteur_session']['statut'])
339
+                ? 'statut'
340
+                : 'cookie'
341
+            ),
342
+            '&'
343
+        );
344
+    }
345
+
346
+    return $redirect;
347 347
 }
348 348
 
349 349
 /**
@@ -355,19 +355,19 @@  discard block
 block discarded – undo
355 355
  * @param null|string $date
356 356
  */
357 357
 function auth_trace($row, $date = null) {
358
-	// Indiquer la connexion. A la minute pres ca suffit.
359
-	if (!is_numeric($connect_quand = $row['quand'] ?? '')) {
360
-		$connect_quand = strtotime((string) $connect_quand);
361
-	}
358
+    // Indiquer la connexion. A la minute pres ca suffit.
359
+    if (!is_numeric($connect_quand = $row['quand'] ?? '')) {
360
+        $connect_quand = strtotime((string) $connect_quand);
361
+    }
362 362
 
363
-	$date ??= date('Y-m-d H:i:s');
363
+    $date ??= date('Y-m-d H:i:s');
364 364
 
365
-	if (abs(strtotime($date) - $connect_quand) >= 60) {
366
-		sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . (int) $row['id_auteur']);
367
-		$row['en_ligne'] = $date;
368
-	}
365
+    if (abs(strtotime($date) - $connect_quand) >= 60) {
366
+        sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . (int) $row['id_auteur']);
367
+        $row['en_ligne'] = $date;
368
+    }
369 369
 
370
-	pipeline('trig_auth_trace', ['args' => ['row' => $row, 'date' => $date]]);
370
+    pipeline('trig_auth_trace', ['args' => ['row' => $row, 'date' => $date]]);
371 371
 }
372 372
 
373 373
 
@@ -393,27 +393,27 @@  discard block
 block discarded – undo
393 393
  * @return mixed
394 394
  */
395 395
 function auth_administrer($fonction, $args, mixed $defaut = false) {
396
-	$auth_methode = array_shift($args);
397
-	$auth_methode = $auth_methode ?: 'spip'; // valeur par defaut au cas ou
398
-	if (
399
-		($auth = charger_fonction($auth_methode, 'auth', true))
400
-		&& function_exists($f = "auth_{$auth_methode}_$fonction")
401
-	) {
402
-		$res = $f(...$args);
403
-	} else {
404
-		$res = $defaut;
405
-	}
406
-	return pipeline(
407
-		'auth_administrer',
408
-		[
409
-			'args' => [
410
-				'fonction' => $fonction,
411
-				'methode' => $auth_methode,
412
-				'args' => $args
413
-			],
414
-			'data' => $res
415
-		]
416
-	);
396
+    $auth_methode = array_shift($args);
397
+    $auth_methode = $auth_methode ?: 'spip'; // valeur par defaut au cas ou
398
+    if (
399
+        ($auth = charger_fonction($auth_methode, 'auth', true))
400
+        && function_exists($f = "auth_{$auth_methode}_$fonction")
401
+    ) {
402
+        $res = $f(...$args);
403
+    } else {
404
+        $res = $defaut;
405
+    }
406
+    return pipeline(
407
+        'auth_administrer',
408
+        [
409
+            'args' => [
410
+                'fonction' => $fonction,
411
+                'methode' => $auth_methode,
412
+                'args' => $args
413
+            ],
414
+            'data' => $res
415
+        ]
416
+    );
417 417
 }
418 418
 
419 419
 /**
@@ -423,11 +423,11 @@  discard block
 block discarded – undo
423 423
  * @return array
424 424
  */
425 425
 function auth_formulaire_login($flux) {
426
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
427
-		$flux = auth_administrer('formulaire_login', [$methode, $flux], $flux);
428
-	}
426
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
427
+        $flux = auth_administrer('formulaire_login', [$methode, $flux], $flux);
428
+    }
429 429
 
430
-	return $flux;
430
+    return $flux;
431 431
 }
432 432
 
433 433
 
@@ -441,19 +441,19 @@  discard block
 block discarded – undo
441 441
  * @return string/bool
442 442
  */
443 443
 function auth_retrouver_login($login, $serveur = '') {
444
-	if (!spip_connect($serveur)) {
445
-		include_spip('inc/minipres');
446
-		echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
447
-		exit;
448
-	}
449
-
450
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
451
-		if ($auteur = auth_administrer('retrouver_login', [$methode, $login, $serveur])) {
452
-			return $auteur;
453
-		}
454
-	}
455
-
456
-	return false;
444
+    if (!spip_connect($serveur)) {
445
+        include_spip('inc/minipres');
446
+        echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
447
+        exit;
448
+    }
449
+
450
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
451
+        if ($auteur = auth_administrer('retrouver_login', [$methode, $login, $serveur])) {
452
+            return $auteur;
453
+        }
454
+    }
455
+
456
+    return false;
457 457
 }
458 458
 
459 459
 /**
@@ -468,35 +468,35 @@  discard block
 block discarded – undo
468 468
  * @return array
469 469
  */
470 470
 function auth_informer_login($login, $serveur = '') {
471
-	if (
472
-		!$login
473
-		|| !($login_base = auth_retrouver_login($login, $serveur))
474
-		|| !($row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur))
475
-	) {
476
-		// generer de fausses infos, mais credibles, pour eviter une attaque
477
-		// https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
478
-
479
-		$row = [
480
-			'login' => $login,
481
-			'cnx' => '0',
482
-			'logo' => '',
483
-		];
484
-
485
-		return $row;
486
-	}
487
-
488
-	$prefs = @unserialize($row['prefs']);
489
-	$row = auth_desensibiliser_session($row);
490
-	$infos = [
491
-		'id_auteur' => $row['id_auteur'],
492
-		'login' => $row['login'],
493
-		'cnx' => (isset($prefs['cnx']) && $prefs['cnx'] === 'perma') ? '1' : '0',
494
-		'logo' => recuperer_fond('formulaires/inc-logo_auteur', $row),
495
-	];
496
-
497
-	verifier_visiteur();
498
-
499
-	return auth_administrer('informer_login', [$row['source'], $infos, $row, $serveur], $infos);
471
+    if (
472
+        !$login
473
+        || !($login_base = auth_retrouver_login($login, $serveur))
474
+        || !($row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur))
475
+    ) {
476
+        // generer de fausses infos, mais credibles, pour eviter une attaque
477
+        // https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
478
+
479
+        $row = [
480
+            'login' => $login,
481
+            'cnx' => '0',
482
+            'logo' => '',
483
+        ];
484
+
485
+        return $row;
486
+    }
487
+
488
+    $prefs = @unserialize($row['prefs']);
489
+    $row = auth_desensibiliser_session($row);
490
+    $infos = [
491
+        'id_auteur' => $row['id_auteur'],
492
+        'login' => $row['login'],
493
+        'cnx' => (isset($prefs['cnx']) && $prefs['cnx'] === 'perma') ? '1' : '0',
494
+        'logo' => recuperer_fond('formulaires/inc-logo_auteur', $row),
495
+    ];
496
+
497
+    verifier_visiteur();
498
+
499
+    return auth_administrer('informer_login', [$row['source'], $infos, $row, $serveur], $infos);
500 500
 }
501 501
 
502 502
 
@@ -510,21 +510,21 @@  discard block
 block discarded – undo
510 510
  * @return mixed
511 511
  */
512 512
 function auth_identifier_login($login, #[\SensitiveParameter] $password, $serveur = '', bool $phpauth = false) {
513
-	$erreur = '';
514
-	foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
515
-		if ($auth = charger_fonction($methode, 'auth', true)) {
516
-			$auteur = $auth($login, $password, $serveur, $phpauth);
517
-			if (is_array($auteur) && count($auteur)) {
518
-				spip_log("connexion de $login par methode $methode");
519
-				$auteur['auth'] = $methode;
520
-				return $auteur;
521
-			} elseif (is_string($auteur)) {
522
-				$erreur .= "$auteur ";
523
-			}
524
-		}
525
-	}
526
-
527
-	return $erreur;
513
+    $erreur = '';
514
+    foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
515
+        if ($auth = charger_fonction($methode, 'auth', true)) {
516
+            $auteur = $auth($login, $password, $serveur, $phpauth);
517
+            if (is_array($auteur) && count($auteur)) {
518
+                spip_log("connexion de $login par methode $methode");
519
+                $auteur['auth'] = $methode;
520
+                return $auteur;
521
+            } elseif (is_string($auteur)) {
522
+                $erreur .= "$auteur ";
523
+            }
524
+        }
525
+    }
526
+
527
+    return $erreur;
528 528
 }
529 529
 
530 530
 /**
@@ -538,8 +538,8 @@  discard block
 block discarded – undo
538 538
  * @return string
539 539
  */
540 540
 function auth_url_retour_login($auth_methode, $login, $redirect = '', $serveur = '') {
541
-	$securiser_action = charger_fonction('securiser_action', 'inc');
542
-	return $securiser_action('auth', "$auth_methode/$login", $redirect, true);
541
+    $securiser_action = charger_fonction('securiser_action', 'inc');
542
+    return $securiser_action('auth', "$auth_methode/$login", $redirect, true);
543 543
 }
544 544
 
545 545
 /**
@@ -553,8 +553,8 @@  discard block
 block discarded – undo
553 553
  * @return mixed
554 554
  */
555 555
 function auth_terminer_identifier_login($auth_methode, $login, $serveur = '') {
556
-	$args = func_get_args();
557
-	return auth_administrer('terminer_identifier_login', $args);
556
+    $args = func_get_args();
557
+    return auth_administrer('terminer_identifier_login', $args);
558 558
 }
559 559
 
560 560
 /**
@@ -564,29 +564,29 @@  discard block
 block discarded – undo
564 564
  * @return bool
565 565
  */
566 566
 function auth_loger($auteur) {
567
-	if (!is_array($auteur) || $auteur === []) {
568
-		return false;
569
-	}
570
-
571
-	// initialiser et poser le cookie de session
572
-	unset($_COOKIE['spip_session']);
573
-	if (auth_init_droits($auteur) === false) {
574
-		return false;
575
-	}
576
-
577
-	// initialiser les prefs
578
-	$p = $GLOBALS['visiteur_session']['prefs'];
579
-	$p['cnx'] = (isset($auteur['cookie']) && $auteur['cookie'] == 'oui') ? 'perma' : '';
580
-
581
-	sql_updateq(
582
-		'spip_auteurs',
583
-		['prefs' => serialize($p)],
584
-		'id_auteur=' . (int) $auteur['id_auteur']
585
-	);
586
-
587
-	//  bloquer ici le visiteur qui tente d'abuser de ses droits
588
-	verifier_visiteur();
589
-	return true;
567
+    if (!is_array($auteur) || $auteur === []) {
568
+        return false;
569
+    }
570
+
571
+    // initialiser et poser le cookie de session
572
+    unset($_COOKIE['spip_session']);
573
+    if (auth_init_droits($auteur) === false) {
574
+        return false;
575
+    }
576
+
577
+    // initialiser les prefs
578
+    $p = $GLOBALS['visiteur_session']['prefs'];
579
+    $p['cnx'] = (isset($auteur['cookie']) && $auteur['cookie'] == 'oui') ? 'perma' : '';
580
+
581
+    sql_updateq(
582
+        'spip_auteurs',
583
+        ['prefs' => serialize($p)],
584
+        'id_auteur=' . (int) $auteur['id_auteur']
585
+    );
586
+
587
+    //  bloquer ici le visiteur qui tente d'abuser de ses droits
588
+    verifier_visiteur();
589
+    return true;
590 590
 }
591 591
 
592 592
 /**
@@ -596,8 +596,8 @@  discard block
 block discarded – undo
596 596
  * return void
597 597
  **/
598 598
 function auth_deloger() {
599
-	$logout = charger_fonction('logout', 'action');
600
-	$logout();
599
+    $logout = charger_fonction('logout', 'action');
600
+    $logout();
601 601
 }
602 602
 
603 603
 /**
@@ -611,8 +611,8 @@  discard block
 block discarded – undo
611 611
  * @return bool
612 612
  */
613 613
 function auth_autoriser_modifier_login($auth_methode, $serveur = '') {
614
-	$args = func_get_args();
615
-	return auth_administrer('autoriser_modifier_login', $args);
614
+    $args = func_get_args();
615
+    return auth_administrer('autoriser_modifier_login', $args);
616 616
 }
617 617
 
618 618
 /**
@@ -627,8 +627,8 @@  discard block
 block discarded – undo
627 627
  *  message d'erreur ou chaine vide si pas d'erreur
628 628
  */
629 629
 function auth_verifier_login($auth_methode, $new_login, $id_auteur = 0, $serveur = '') {
630
-	$args = func_get_args();
631
-	return auth_administrer('verifier_login', $args, '');
630
+    $args = func_get_args();
631
+    return auth_administrer('verifier_login', $args, '');
632 632
 }
633 633
 
634 634
 /**
@@ -641,8 +641,8 @@  discard block
 block discarded – undo
641 641
  * @return bool
642 642
  */
643 643
 function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur = '') {
644
-	$args = func_get_args();
645
-	return auth_administrer('modifier_login', $args);
644
+    $args = func_get_args();
645
+    return auth_administrer('modifier_login', $args);
646 646
 }
647 647
 
648 648
 /**
@@ -657,8 +657,8 @@  discard block
 block discarded – undo
657 657
  *  succès ou échec
658 658
  */
659 659
 function auth_autoriser_modifier_pass($auth_methode, $serveur = '') {
660
-	$args = func_get_args();
661
-	return auth_administrer('autoriser_modifier_pass', $args);
660
+    $args = func_get_args();
661
+    return auth_administrer('autoriser_modifier_pass', $args);
662 662
 }
663 663
 
664 664
 /**
@@ -674,8 +674,8 @@  discard block
 block discarded – undo
674 674
  *  message d'erreur ou chaine vide si pas d'erreur
675 675
  */
676 676
 function auth_verifier_pass($auth_methode, $login, #[\SensitiveParameter] $new_pass, $id_auteur = 0, $serveur = '') {
677
-	$args = func_get_args();
678
-	return auth_administrer('verifier_pass', $args, '');
677
+    $args = func_get_args();
678
+    return auth_administrer('verifier_pass', $args, '');
679 679
 }
680 680
 
681 681
 /**
@@ -691,8 +691,8 @@  discard block
 block discarded – undo
691 691
  *  succes ou echec
692 692
  */
693 693
 function auth_modifier_pass($auth_methode, $login, #[\SensitiveParameter] $new_pass, $id_auteur, $serveur = '') {
694
-	$args = func_get_args();
695
-	return auth_administrer('modifier_pass', $args);
694
+    $args = func_get_args();
695
+    return auth_administrer('modifier_pass', $args);
696 696
 }
697 697
 
698 698
 /**
@@ -708,24 +708,24 @@  discard block
 block discarded – undo
708 708
  * @return void
709 709
  */
710 710
 function auth_synchroniser_distant(
711
-	$auth_methode = true,
712
-	$id_auteur = 0,
713
-	$champs = [],
714
-	$options = [],
715
-	$serveur = ''
711
+    $auth_methode = true,
712
+    $id_auteur = 0,
713
+    $champs = [],
714
+    $options = [],
715
+    $serveur = ''
716 716
 ) {
717
-	$args = func_get_args();
718
-	if ($auth_methode === true || isset($options['all']) && $options['all'] == true) {
719
-		$options['all'] = true; // ajouter une option all=>true pour chaque auth
720
-		$args = [true, $id_auteur, $champs, $options, $serveur];
721
-		foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
722
-			array_shift($args);
723
-			array_unshift($args, $methode);
724
-			auth_administrer('synchroniser_distant', $args);
725
-		}
726
-	} else {
727
-		auth_administrer('synchroniser_distant', $args);
728
-	}
717
+    $args = func_get_args();
718
+    if ($auth_methode === true || isset($options['all']) && $options['all'] == true) {
719
+        $options['all'] = true; // ajouter une option all=>true pour chaque auth
720
+        $args = [true, $id_auteur, $champs, $options, $serveur];
721
+        foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
722
+            array_shift($args);
723
+            array_unshift($args, $methode);
724
+            auth_administrer('synchroniser_distant', $args);
725
+        }
726
+    } else {
727
+        auth_administrer('synchroniser_distant', $args);
728
+    }
729 729
 }
730 730
 
731 731
 
@@ -738,46 +738,46 @@  discard block
 block discarded – undo
738 738
  * @return array|bool
739 739
  */
740 740
 function lire_php_auth($login, #[\SensitiveParameter] $pw, $serveur = '') {
741
-	if (
742
-		!$login
743
-		|| !$login_base = auth_retrouver_login($login, $serveur)
744
-	) {
745
-		return false;
746
-	}
747
-
748
-	$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur);
749
-
750
-	if (!$row) {
751
-		if (
752
-			include_spip('inc/auth')
753
-			&& auth_ldap_connect($serveur)
754
-			&& ($auth_ldap = charger_fonction('ldap', 'auth', true))
755
-		) {
756
-			return $auth_ldap($login_base, $pw, $serveur, true);
757
-		}
758
-
759
-		return false;
760
-	}
761
-
762
-	// si pas de source definie
763
-	// ou auth/xxx introuvable, utiliser 'spip' ou autre et avec le login passé par PHP_AUTH_USER
764
-	if (
765
-		!($auth_methode = $row['source'])
766
-		|| !($auth = charger_fonction($auth_methode, 'auth', true))
767
-	) {
768
-		$auth = charger_fonction('spip', 'auth', true);
769
-	}
770
-
771
-	$auteur = '';
772
-	if ($auth) {
773
-		$auteur = $auth($login, $pw, $serveur, true);
774
-	}
775
-	// verifier que ce n'est pas un message d'erreur
776
-	if (is_array($auteur) && count($auteur)) {
777
-		return $auteur;
778
-	}
779
-
780
-	return false;
741
+    if (
742
+        !$login
743
+        || !$login_base = auth_retrouver_login($login, $serveur)
744
+    ) {
745
+        return false;
746
+    }
747
+
748
+    $row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur);
749
+
750
+    if (!$row) {
751
+        if (
752
+            include_spip('inc/auth')
753
+            && auth_ldap_connect($serveur)
754
+            && ($auth_ldap = charger_fonction('ldap', 'auth', true))
755
+        ) {
756
+            return $auth_ldap($login_base, $pw, $serveur, true);
757
+        }
758
+
759
+        return false;
760
+    }
761
+
762
+    // si pas de source definie
763
+    // ou auth/xxx introuvable, utiliser 'spip' ou autre et avec le login passé par PHP_AUTH_USER
764
+    if (
765
+        !($auth_methode = $row['source'])
766
+        || !($auth = charger_fonction($auth_methode, 'auth', true))
767
+    ) {
768
+        $auth = charger_fonction('spip', 'auth', true);
769
+    }
770
+
771
+    $auteur = '';
772
+    if ($auth) {
773
+        $auteur = $auth($login, $pw, $serveur, true);
774
+    }
775
+    // verifier que ce n'est pas un message d'erreur
776
+    if (is_array($auteur) && count($auteur)) {
777
+        return $auteur;
778
+    }
779
+
780
+    return false;
781 781
 }
782 782
 
783 783
 /**
@@ -793,21 +793,21 @@  discard block
 block discarded – undo
793 793
  * @param string $lien
794 794
  */
795 795
 function ask_php_auth($pb, $raison, $retour = '', $url = '', $re = '', $lien = '') {
796
-	@Header('WWW-Authenticate: Basic realm="espace prive"');
797
-	@Header('HTTP/1.0 401 Unauthorized');
798
-	$corps = '';
799
-	$public = generer_url_public();
800
-	$ecrire = generer_url_ecrire();
801
-	$retour = $retour ?: _T('icone_retour');
802
-	$corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
803
-	if ($url) {
804
-		$corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
805
-	}
806
-
807
-	if ($lien) {
808
-		$corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
809
-	}
810
-	include_spip('inc/minipres');
811
-	echo minipres($pb, $corps);
812
-	exit;
796
+    @Header('WWW-Authenticate: Basic realm="espace prive"');
797
+    @Header('HTTP/1.0 401 Unauthorized');
798
+    $corps = '';
799
+    $public = generer_url_public();
800
+    $ecrire = generer_url_ecrire();
801
+    $retour = $retour ?: _T('icone_retour');
802
+    $corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
803
+    if ($url) {
804
+        $corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
805
+    }
806
+
807
+    if ($lien) {
808
+        $corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
809
+    }
810
+    include_spip('inc/minipres');
811
+    echo minipres($pb, $corps);
812
+    exit;
813 813
 }
Please login to merge, or discard this patch.
Spacing   +13 added lines, -14 removed lines patch added patch discarded remove patch
@@ -58,7 +58,7 @@  discard block
 block discarded – undo
58 58
 	}
59 59
 
60 60
 	$n = (int) sql_errno();
61
-	spip_log("Erreur base de donnees $n " . sql_error());
61
+	spip_log("Erreur base de donnees $n ".sql_error());
62 62
 
63 63
 	return $n ?: 1;
64 64
 }
@@ -101,19 +101,19 @@  discard block
 block discarded – undo
101 101
 		// erreur SQL a afficher
102 102
 		$raison = minipres(
103 103
 			_T('info_travaux_titre'),
104
-			_T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
104
+			_T('titre_probleme_technique').'<p><tt>'.sql_errno().' '.sql_error().'</tt></p>'
105 105
 		);
106 106
 	} elseif (@$raison['statut']) {
107 107
 		// un simple visiteur n'a pas acces a l'espace prive
108
-		spip_log('connexion refusee a ' . @$raison['id_auteur']);
108
+		spip_log('connexion refusee a '.@$raison['id_auteur']);
109 109
 		$est_connecte = (!empty($GLOBALS['visiteur_session']['login']) && !empty($GLOBALS['visiteur_session']['statut'])); // idem test balise #URL_LOGOUT
110 110
 		$raison = minipres(
111 111
 			_T('avis_erreur_connexion'),
112 112
 			_T('avis_erreur_visiteur')
113 113
 				// Lien vers le site public
114
-				. '<br /><a href="' . url_de_base() . '">' . _T('login_retour_public') . '</a>'
114
+				. '<br /><a href="'.url_de_base().'">'._T('login_retour_public').'</a>'
115 115
 				// Si la personne est connectée, lien de déconnexion ramenant vers la page de login
116
-				. ($est_connecte ? ' | <a href="' . generer_url_public('', 'action=logout&amp;logout=prive') . '">' . _T('icone_deconnecter') . '</a>' : '')
116
+				. ($est_connecte ? ' | <a href="'.generer_url_public('', 'action=logout&amp;logout=prive').'">'._T('icone_deconnecter').'</a>' : '')
117 117
 		);
118 118
 	} else {
119 119
 		// auteur en fin de droits ...
@@ -201,8 +201,7 @@  discard block
 block discarded – undo
201 201
 	$where = (is_numeric($id_auteur)
202 202
 		/*AND $id_auteur>0*/ // reprise lors des restaurations
203 203
 	) ?
204
-		"id_auteur=$id_auteur" :
205
-		(strlen((string) $GLOBALS['connect_login']) ? 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text') : '');
204
+		"id_auteur=$id_auteur" : (strlen((string) $GLOBALS['connect_login']) ? 'login='.sql_quote($GLOBALS['connect_login'], '', 'text') : '');
206 205
 
207 206
 	if (!$where) {
208 207
 		return '';
@@ -327,7 +326,7 @@  discard block
 block discarded – undo
327 326
  * @return string
328 327
  */
329 328
 function auth_a_loger() {
330
-	$redirect = generer_url_public('login', 'url=' . rawurlencode((string) self('&', true)), true);
329
+	$redirect = generer_url_public('login', 'url='.rawurlencode((string) self('&', true)), true);
331 330
 
332 331
 	// un echec au "bonjour" (login initial) quand le statut est
333 332
 	// inconnu signale sans doute un probleme de cookies
@@ -363,7 +362,7 @@  discard block
 block discarded – undo
363 362
 	$date ??= date('Y-m-d H:i:s');
364 363
 
365 364
 	if (abs(strtotime($date) - $connect_quand) >= 60) {
366
-		sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur=' . (int) $row['id_auteur']);
365
+		sql_updateq('spip_auteurs', ['en_ligne' => $date], 'id_auteur='.(int) $row['id_auteur']);
367 366
 		$row['en_ligne'] = $date;
368 367
 	}
369 368
 
@@ -471,7 +470,7 @@  discard block
 block discarded – undo
471 470
 	if (
472 471
 		!$login
473 472
 		|| !($login_base = auth_retrouver_login($login, $serveur))
474
-		|| !($row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur))
473
+		|| !($row = sql_fetsel('*', 'spip_auteurs', 'login='.sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur))
475 474
 	) {
476 475
 		// generer de fausses infos, mais credibles, pour eviter une attaque
477 476
 		// https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691
@@ -581,7 +580,7 @@  discard block
 block discarded – undo
581 580
 	sql_updateq(
582 581
 		'spip_auteurs',
583 582
 		['prefs' => serialize($p)],
584
-		'id_auteur=' . (int) $auteur['id_auteur']
583
+		'id_auteur='.(int) $auteur['id_auteur']
585 584
 	);
586 585
 
587 586
 	//  bloquer ici le visiteur qui tente d'abuser de ses droits
@@ -745,7 +744,7 @@  discard block
 block discarded – undo
745 744
 		return false;
746 745
 	}
747 746
 
748
-	$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur);
747
+	$row = sql_fetsel('*', 'spip_auteurs', 'login='.sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur);
749 748
 
750 749
 	if (!$row) {
751 750
 		if (
@@ -801,11 +800,11 @@  discard block
 block discarded – undo
801 800
 	$retour = $retour ?: _T('icone_retour');
802 801
 	$corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] ";
803 802
 	if ($url) {
804
-		$corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]";
803
+		$corps .= "[<a href='".generer_url_action('cookie', "essai_auth_http=oui&$url")."'>$re</a>]";
805 804
 	}
806 805
 
807 806
 	if ($lien) {
808
-		$corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . '</a>]';
807
+		$corps .= " [<a href='$ecrire'>"._T('login_espace_prive').'</a>]';
809 808
 	}
810 809
 	include_spip('inc/minipres');
811 810
 	echo minipres($pb, $corps);
Please login to merge, or discard this patch.
ecrire/inc/minipres.php 1 patch
Indentation   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  * @package SPIP\Core\Minipres
18 18
  **/
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -37,19 +37,19 @@  discard block
 block discarded – undo
37 37
  */
38 38
 function install_debut_html($titre = 'AUTO', $onLoad = '', $all_inline = false) {
39 39
 
40
-	if ($onLoad) {
41
-		include_spip('inc/filtres');
42
-		$onLoad = extraire_attribut("<body $onLoad>", 'onload');
43
-	}
40
+    if ($onLoad) {
41
+        include_spip('inc/filtres');
42
+        $onLoad = extraire_attribut("<body $onLoad>", 'onload');
43
+    }
44 44
 
45
-	$options = [
46
-		'all_inline' => $all_inline,
47
-		'onload' => $onLoad,
48
-		'titre' => $titre,
49
-	];
45
+    $options = [
46
+        'all_inline' => $all_inline,
47
+        'onload' => $onLoad,
48
+        'titre' => $titre,
49
+    ];
50 50
 
51
-	$minipage = new Admin();
52
-	return $minipage->installDebutPage($options);
51
+    $minipage = new Admin();
52
+    return $minipage->installDebutPage($options);
53 53
 }
54 54
 
55 55
 /**
@@ -61,8 +61,8 @@  discard block
 block discarded – undo
61 61
  * @return string Code HTML
62 62
  */
63 63
 function install_fin_html() {
64
-	$minipage = new Admin();
65
-	return $minipage->installFinPage();
64
+    $minipage = new Admin();
65
+    return $minipage->installFinPage();
66 66
 }
67 67
 
68 68
 
@@ -101,23 +101,23 @@  discard block
 block discarded – undo
101 101
  */
102 102
 function minipres($titre = '', $corps = '', $options = []) {
103 103
 
104
-	// compat signature old
105
-	// minipres($titre='', $corps="", $onload='', $all_inline = false)
106
-	$args = func_get_args();
107
-	if (isset($args[2]) && is_string($args[2])) {
108
-		$options = ['onload' => $args[2]];
109
-	}
110
-	if (isset($args[3])) {
111
-		$options['all_inline'] = $args[3];
112
-	}
104
+    // compat signature old
105
+    // minipres($titre='', $corps="", $onload='', $all_inline = false)
106
+    $args = func_get_args();
107
+    if (isset($args[2]) && is_string($args[2])) {
108
+        $options = ['onload' => $args[2]];
109
+    }
110
+    if (isset($args[3])) {
111
+        $options['all_inline'] = $args[3];
112
+    }
113 113
 
114
-	$options = array_merge([
115
-		'onload' => '',
116
-		'all_inline' => false,
117
-	], $options);
114
+    $options = array_merge([
115
+        'onload' => '',
116
+        'all_inline' => false,
117
+    ], $options);
118 118
 
119
-	$options['titre'] = $titre;
119
+    $options['titre'] = $titre;
120 120
 
121
-	$minipage = new Admin();
122
-	return $minipage->page($corps, $options);
121
+    $minipage = new Admin();
122
+    return $minipage->page($corps, $options);
123 123
 }
Please login to merge, or discard this patch.
ecrire/inc/lang.php 2 patches
Indentation   +256 added lines, -256 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Langue
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 
@@ -38,35 +38,35 @@  discard block
 block discarded – undo
38 38
  **/
39 39
 function changer_langue($lang, $liste_langues = null) {
40 40
 
41
-	if (empty($lang)) {
42
-		return false;
43
-	}
44
-
45
-	if (is_null($liste_langues)) {
46
-		$liste_langues = ($GLOBALS['meta']['langues_proposees'] ?? '') . ',' . ($GLOBALS['meta']['langues_multilingue'] ?? '');
47
-	} else {
48
-		if (is_array($liste_langues)) {
49
-			$liste_langues = implode(',', $liste_langues);
50
-		}
51
-	}
52
-	$liste_langues = ',' . $liste_langues . ',';
53
-
54
-	// Si la langue demandee n'existe pas, on essaie d'autres variantes
55
-	// Exemple : 'pt-br' => 'pt_br' => 'pt'
56
-	$lang = str_replace('-', '_', trim($lang));
57
-
58
-	if (
59
-		str_contains($liste_langues, (string) ",$lang,")
60
-		|| ($lang = preg_replace(',_.*,', '', $lang)) && str_contains($liste_langues, (string) ",$lang,")
61
-	) {
62
-		$GLOBALS['spip_lang_rtl'] = lang_dir($lang, '', '_rtl');
63
-		$GLOBALS['spip_lang_right'] = $GLOBALS['spip_lang_rtl'] ? 'left' : 'right';
64
-		$GLOBALS['spip_lang_left'] = $GLOBALS['spip_lang_rtl'] ? 'right' : 'left';
65
-
66
-		return $GLOBALS['spip_lang'] = $lang;
67
-	} else {
68
-		return false;
69
-	}
41
+    if (empty($lang)) {
42
+        return false;
43
+    }
44
+
45
+    if (is_null($liste_langues)) {
46
+        $liste_langues = ($GLOBALS['meta']['langues_proposees'] ?? '') . ',' . ($GLOBALS['meta']['langues_multilingue'] ?? '');
47
+    } else {
48
+        if (is_array($liste_langues)) {
49
+            $liste_langues = implode(',', $liste_langues);
50
+        }
51
+    }
52
+    $liste_langues = ',' . $liste_langues . ',';
53
+
54
+    // Si la langue demandee n'existe pas, on essaie d'autres variantes
55
+    // Exemple : 'pt-br' => 'pt_br' => 'pt'
56
+    $lang = str_replace('-', '_', trim($lang));
57
+
58
+    if (
59
+        str_contains($liste_langues, (string) ",$lang,")
60
+        || ($lang = preg_replace(',_.*,', '', $lang)) && str_contains($liste_langues, (string) ",$lang,")
61
+    ) {
62
+        $GLOBALS['spip_lang_rtl'] = lang_dir($lang, '', '_rtl');
63
+        $GLOBALS['spip_lang_right'] = $GLOBALS['spip_lang_rtl'] ? 'left' : 'right';
64
+        $GLOBALS['spip_lang_left'] = $GLOBALS['spip_lang_rtl'] ? 'right' : 'left';
65
+
66
+        return $GLOBALS['spip_lang'] = $lang;
67
+    } else {
68
+        return false;
69
+    }
70 70
 }
71 71
 
72 72
 //
@@ -79,9 +79,9 @@  discard block
 block discarded – undo
79 79
 // par exemple le francais pour l'espagnol, l'anglais pour l'allemand, etc.
80 80
 
81 81
 function choisir_traduction($trads, $lang = '') {
82
-	$k = approcher_langue($trads, $lang);
82
+    $k = approcher_langue($trads, $lang);
83 83
 
84
-	return $k ? $trads[$k] : array_shift($trads);
84
+    return $k ? $trads[$k] : array_shift($trads);
85 85
 }
86 86
 
87 87
 // retourne son 2e argument si c'est un index du premier
@@ -89,21 +89,21 @@  discard block
 block discarded – undo
89 89
 // la langue X etant consideree comme une approche de X_Y
90 90
 function approcher_langue($trads, $lang = '') {
91 91
 
92
-	if (!$lang) {
93
-		$lang = $GLOBALS['spip_lang'];
94
-	}
95
-
96
-	if (isset($trads[$lang])) {
97
-		return $lang;
98
-	} // cas des langues xx_yy
99
-	else {
100
-		$r = explode('_', (string) $lang);
101
-		if (isset($trads[$r[0]])) {
102
-			return $r[0];
103
-		}
104
-	}
105
-
106
-	return '';
92
+    if (!$lang) {
93
+        $lang = $GLOBALS['spip_lang'];
94
+    }
95
+
96
+    if (isset($trads[$lang])) {
97
+        return $lang;
98
+    } // cas des langues xx_yy
99
+    else {
100
+        $r = explode('_', (string) $lang);
101
+        if (isset($trads[$r[0]])) {
102
+            return $r[0];
103
+        }
104
+    }
105
+
106
+    return '';
107 107
 }
108 108
 
109 109
 /**
@@ -118,10 +118,10 @@  discard block
 block discarded – undo
118 118
  *     Nom de la langue, sinon son code.
119 119
  **/
120 120
 function traduire_nom_langue($lang) {
121
-	include_spip('inc/lang_liste');
122
-	include_spip('inc/charsets');
121
+    include_spip('inc/lang_liste');
122
+    include_spip('inc/charsets');
123 123
 
124
-	return html2unicode($GLOBALS['codes_langues'][$lang] ?? $lang);
124
+    return html2unicode($GLOBALS['codes_langues'][$lang] ?? $lang);
125 125
 }
126 126
 
127 127
 //
@@ -134,10 +134,10 @@  discard block
 block discarded – undo
134 134
 // hebreu a priori), 'droitier' sinon.
135 135
 // C'est utilise par #LANG_DIR, #LANG_LEFT, #LANG_RIGHT.
136 136
 function lang_dir($lang = '', $droitier = 'ltr', $gaucher = 'rtl') {
137
-	static $lang_rtl = ['ar', 'fa', 'ku', 'prs', 'ps', 'ur', 'he', 'heb', 'hbo', 'yi'];
137
+    static $lang_rtl = ['ar', 'fa', 'ku', 'prs', 'ps', 'ur', 'he', 'heb', 'hbo', 'yi'];
138 138
 
139
-	return in_array(($lang ?: $GLOBALS['spip_lang']), $lang_rtl) ?
140
-		$gaucher : $droitier;
139
+    return in_array(($lang ?: $GLOBALS['spip_lang']), $lang_rtl) ?
140
+        $gaucher : $droitier;
141 141
 }
142 142
 
143 143
 // typo francaise ou anglaise ?
@@ -146,29 +146,29 @@  discard block
 block discarded – undo
146 146
 // sinon determiner la typo en fonction de la langue courante
147 147
 
148 148
 function lang_typo($lang = '') {
149
-	if (!$lang) {
150
-		$lang = $GLOBALS['lang_objet'] ?? $GLOBALS['spip_lang'];
151
-	}
152
-	if (
153
-		$lang == 'eo'
154
-		|| $lang == 'fr'
155
-		|| str_starts_with((string) $lang, 'fr_')
156
-		|| $lang == 'cpf'
157
-	) {
158
-		return 'fr';
159
-	} else {
160
-		return 'en';
161
-	}
149
+    if (!$lang) {
150
+        $lang = $GLOBALS['lang_objet'] ?? $GLOBALS['spip_lang'];
151
+    }
152
+    if (
153
+        $lang == 'eo'
154
+        || $lang == 'fr'
155
+        || str_starts_with((string) $lang, 'fr_')
156
+        || $lang == 'cpf'
157
+    ) {
158
+        return 'fr';
159
+    } else {
160
+        return 'en';
161
+    }
162 162
 }
163 163
 
164 164
 // gestion de la globale $lang_objet pour que les textes soient affiches
165 165
 // avec les memes typo et direction dans l'espace prive que dans le public
166 166
 function changer_typo($lang = '') {
167
-	if ($lang) {
168
-		$GLOBALS['lang_objet'] = $lang;
169
-	} else {
170
-		unset($GLOBALS['lang_objet']);
171
-	}
167
+    if ($lang) {
168
+        $GLOBALS['lang_objet'] = $lang;
169
+    } else {
170
+        unset($GLOBALS['lang_objet']);
171
+    }
172 172
 }
173 173
 
174 174
 //
@@ -178,56 +178,56 @@  discard block
 block discarded – undo
178 178
 // pour 'changer_lang' (langue de l'article, espace prive), c'est en Ajax
179 179
 //
180 180
 function menu_langues($nom_select, $default = '') {
181
-	include_spip('inc/actions');
182
-
183
-	$langues = liste_options_langues($nom_select);
184
-	$ret = '';
185
-	if ($langues === []) {
186
-		return '';
187
-	}
188
-
189
-	if (!$default) {
190
-		$default = $GLOBALS['spip_lang'];
191
-	}
192
-	foreach ($langues as $l) {
193
-		$selected = ($l == $default) ? ' selected=\'selected\'' : '';
194
-		$ret .= "<option value='$l'$selected>[" . $l . '] ' . traduire_nom_langue($l) . "</option>\n";
195
-	}
196
-
197
-	if (!test_espace_prive()) {
198
-		$cible = self();
199
-		$base = '';
200
-	} else {
201
-		$cible = self();
202
-		$base = spip_connect() ? 'base' : '';
203
-	}
204
-
205
-	$change = ' onchange="this.parentNode.parentNode.submit()"';
206
-
207
-	return generer_action_auteur(
208
-		'converser',
209
-		$base,
210
-		$cible,
211
-		(select_langues($nom_select, $change, $ret)
212
-			. "<noscript><div style='display:inline'><input type='submit' class='fondo' value='" . _T('bouton_changer') . "' /></div></noscript>"),
213
-		" method='post'"
214
-	);
181
+    include_spip('inc/actions');
182
+
183
+    $langues = liste_options_langues($nom_select);
184
+    $ret = '';
185
+    if ($langues === []) {
186
+        return '';
187
+    }
188
+
189
+    if (!$default) {
190
+        $default = $GLOBALS['spip_lang'];
191
+    }
192
+    foreach ($langues as $l) {
193
+        $selected = ($l == $default) ? ' selected=\'selected\'' : '';
194
+        $ret .= "<option value='$l'$selected>[" . $l . '] ' . traduire_nom_langue($l) . "</option>\n";
195
+    }
196
+
197
+    if (!test_espace_prive()) {
198
+        $cible = self();
199
+        $base = '';
200
+    } else {
201
+        $cible = self();
202
+        $base = spip_connect() ? 'base' : '';
203
+    }
204
+
205
+    $change = ' onchange="this.parentNode.parentNode.submit()"';
206
+
207
+    return generer_action_auteur(
208
+        'converser',
209
+        $base,
210
+        $cible,
211
+        (select_langues($nom_select, $change, $ret)
212
+            . "<noscript><div style='display:inline'><input type='submit' class='fondo' value='" . _T('bouton_changer') . "' /></div></noscript>"),
213
+        " method='post'"
214
+    );
215 215
 }
216 216
 
217 217
 function select_langues($nom_select, $change, $options, $label = '') {
218
-	static $cpt = 0;
219
-	$id = 'menu_langues' . $cpt++;
220
-
221
-	return
222
-		"<label for='$id'>" . ($label ?: _T('info_langues')) . '</label> ' .
223
-		"<select name='$nom_select' id='$id' "
224
-		. ((test_espace_prive()) ?
225
-			(($nom_select == 'var_lang_ecrire' ? "class='lang_ecrire'" : "class='fondl'")) :
226
-			("class='forml menu_langues'"))
227
-		. $change
228
-		. ">\n"
229
-		. $options
230
-		. '</select>';
218
+    static $cpt = 0;
219
+    $id = 'menu_langues' . $cpt++;
220
+
221
+    return
222
+        "<label for='$id'>" . ($label ?: _T('info_langues')) . '</label> ' .
223
+        "<select name='$nom_select' id='$id' "
224
+        . ((test_espace_prive()) ?
225
+            (($nom_select == 'var_lang_ecrire' ? "class='lang_ecrire'" : "class='fondl'")) :
226
+            ("class='forml menu_langues'"))
227
+        . $change
228
+        . ">\n"
229
+        . $options
230
+        . '</select>';
231 231
 }
232 232
 
233 233
 /**
@@ -249,34 +249,34 @@  discard block
 block discarded – undo
249 249
  */
250 250
 function liste_options_langues($nom_select) {
251 251
 
252
-	switch ($nom_select) {
253
-		# #MENU_LANG
254
-		case 'var_lang':
255
-			# menu de changement de la langue d'un article
256
-			# les langues selectionnees dans la configuration "multilinguisme"
257
-		case 'changer_lang':
258
-			$langues = explode(',', (string) $GLOBALS['meta']['langues_multilingue']);
259
-			break;
260
-		# menu de l'interface (privee, installation et panneau de login)
261
-		# les langues presentes sous forme de fichiers de langue
262
-		# on force la relecture du repertoire des langues pour etre synchrone.
263
-		case 'var_lang_ecrire':
264
-		default:
265
-			$GLOBALS['meta']['langues_proposees'] = '';
266
-			init_langues();
267
-			$langues = explode(',', $GLOBALS['meta']['langues_proposees']);
268
-			break;
252
+    switch ($nom_select) {
253
+        # #MENU_LANG
254
+        case 'var_lang':
255
+            # menu de changement de la langue d'un article
256
+            # les langues selectionnees dans la configuration "multilinguisme"
257
+        case 'changer_lang':
258
+            $langues = explode(',', (string) $GLOBALS['meta']['langues_multilingue']);
259
+            break;
260
+        # menu de l'interface (privee, installation et panneau de login)
261
+        # les langues presentes sous forme de fichiers de langue
262
+        # on force la relecture du repertoire des langues pour etre synchrone.
263
+        case 'var_lang_ecrire':
264
+        default:
265
+            $GLOBALS['meta']['langues_proposees'] = '';
266
+            init_langues();
267
+            $langues = explode(',', $GLOBALS['meta']['langues_proposees']);
268
+            break;
269 269
 
270 270
 # dernier choix possible : toutes les langues = langues_proposees
271 271
 # + langues_multilingues ; mais, ne sert pas
272 272
 #			$langues = explode(',', $GLOBALS['all_langs']);
273
-	}
274
-	if (count($langues) <= 1) {
275
-		return [];
276
-	}
277
-	sort($langues);
273
+    }
274
+    if (count($langues) <= 1) {
275
+        return [];
276
+    }
277
+    sort($langues);
278 278
 
279
-	return $langues;
279
+    return $langues;
280 280
 }
281 281
 
282 282
 
@@ -291,39 +291,39 @@  discard block
 block discarded – undo
291 291
  **/
292 292
 function verifier_lang_url() {
293 293
 
294
-	// quelle langue est demandee ?
295
-	$lang_demandee = (test_espace_prive() ? $GLOBALS['spip_lang'] : $GLOBALS['meta']['langue_site']);
296
-	if (isset($_COOKIE['spip_lang_ecrire'])) {
297
-		$lang_demandee = $_COOKIE['spip_lang_ecrire'];
298
-	}
299
-	if (!test_espace_prive() && isset($_COOKIE['spip_lang'])) {
300
-		$lang_demandee = $_COOKIE['spip_lang'];
301
-	}
302
-	if (isset($_GET['lang'])) {
303
-		$lang_demandee = $_GET['lang'];
304
-	}
305
-
306
-	// Renvoyer si besoin (et si la langue demandee existe)
307
-	if (
308
-		$GLOBALS['spip_lang'] != $lang_demandee
309
-		&& changer_langue($lang_demandee)
310
-		&& $lang_demandee != @$_GET['lang']
311
-	) {
312
-		$destination = parametre_url(self(), 'lang', $lang_demandee, '&');
313
-		// ici on a besoin des var_truc
314
-		foreach ($_GET as $var => $val) {
315
-			if (!strncmp('var_', $var, 4)) {
316
-				$destination = parametre_url($destination, $var, $val, '&');
317
-			}
318
-		}
319
-		include_spip('inc/headers');
320
-		redirige_par_entete($destination);
321
-	}
322
-
323
-	// Subtilite : si la langue demandee par cookie est la bonne
324
-	// alors on fait comme si $lang etait passee dans l'URL
325
-	// (pour criteres {lang}).
326
-	$GLOBALS['lang'] = $_GET['lang'] = $GLOBALS['spip_lang'];
294
+    // quelle langue est demandee ?
295
+    $lang_demandee = (test_espace_prive() ? $GLOBALS['spip_lang'] : $GLOBALS['meta']['langue_site']);
296
+    if (isset($_COOKIE['spip_lang_ecrire'])) {
297
+        $lang_demandee = $_COOKIE['spip_lang_ecrire'];
298
+    }
299
+    if (!test_espace_prive() && isset($_COOKIE['spip_lang'])) {
300
+        $lang_demandee = $_COOKIE['spip_lang'];
301
+    }
302
+    if (isset($_GET['lang'])) {
303
+        $lang_demandee = $_GET['lang'];
304
+    }
305
+
306
+    // Renvoyer si besoin (et si la langue demandee existe)
307
+    if (
308
+        $GLOBALS['spip_lang'] != $lang_demandee
309
+        && changer_langue($lang_demandee)
310
+        && $lang_demandee != @$_GET['lang']
311
+    ) {
312
+        $destination = parametre_url(self(), 'lang', $lang_demandee, '&');
313
+        // ici on a besoin des var_truc
314
+        foreach ($_GET as $var => $val) {
315
+            if (!strncmp('var_', $var, 4)) {
316
+                $destination = parametre_url($destination, $var, $val, '&');
317
+            }
318
+        }
319
+        include_spip('inc/headers');
320
+        redirige_par_entete($destination);
321
+    }
322
+
323
+    // Subtilite : si la langue demandee par cookie est la bonne
324
+    // alors on fait comme si $lang etait passee dans l'URL
325
+    // (pour criteres {lang}).
326
+    $GLOBALS['lang'] = $_GET['lang'] = $GLOBALS['spip_lang'];
327 327
 }
328 328
 
329 329
 
@@ -341,19 +341,19 @@  discard block
 block discarded – undo
341 341
  *     La langue sélectionnée
342 342
  **/
343 343
 function utiliser_langue_site($liste_langues = null) {
344
-	// s'il existe une langue du site (en gros tout le temps en théorie)
345
-	if (
346
-		isset($GLOBALS['meta']['langue_site'])
347
-		&& (!isset($GLOBALS['spip_lang']) || $GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site'])
348
-	) {
349
-		return changer_langue($GLOBALS['meta']['langue_site'], $liste_langues);//@:install
350
-	}
351
-	// en theorie là, la globale est définie, sinon c'est un problème.
352
-	if (!isset($GLOBALS['spip_lang'])) {
353
-		spip_log('La globale spip_lang est indéfinie dans utiliser_langue_site() !', _LOG_ERREUR);
354
-	}
355
-
356
-	return $GLOBALS['spip_lang'];
344
+    // s'il existe une langue du site (en gros tout le temps en théorie)
345
+    if (
346
+        isset($GLOBALS['meta']['langue_site'])
347
+        && (!isset($GLOBALS['spip_lang']) || $GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site'])
348
+    ) {
349
+        return changer_langue($GLOBALS['meta']['langue_site'], $liste_langues);//@:install
350
+    }
351
+    // en theorie là, la globale est définie, sinon c'est un problème.
352
+    if (!isset($GLOBALS['spip_lang'])) {
353
+        spip_log('La globale spip_lang est indéfinie dans utiliser_langue_site() !', _LOG_ERREUR);
354
+    }
355
+
356
+    return $GLOBALS['spip_lang'];
357 357
 }
358 358
 
359 359
 /**
@@ -372,38 +372,38 @@  discard block
 block discarded – undo
372 372
  **/
373 373
 function utiliser_langue_visiteur($liste_langues = null) {
374 374
 
375
-	// si on est dans l'espace public et pas de $liste_langues : se limiter a la config langues_multilingue si définie
376
-	if (is_null($liste_langues) && !test_espace_prive() && !empty($GLOBALS['meta']['langues_multilingue'])) {
377
-		$liste_langues = $GLOBALS['meta']['langues_multilingue'];
378
-	}
379
-
380
-	$l = (test_espace_prive() ? 'spip_lang_ecrire' : 'spip_lang');
381
-	if (
382
-		isset($_COOKIE[$l])
383
-		&& changer_langue($l = $_COOKIE[$l], $liste_langues)
384
-	) {
385
-		return $l;
386
-	}
387
-
388
-	if (
389
-		isset($GLOBALS['visiteur_session']['lang'])
390
-		&& changer_langue($l = $GLOBALS['visiteur_session']['lang'], $liste_langues)
391
-	) {
392
-		return $l;
393
-	}
394
-
395
-	if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
396
-		foreach (explode(',', (string) $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $s) {
397
-			if (
398
-				preg_match('#^([a-z]{2,3})(-[a-z]{2,3})?(;q=[0-9.]+)?$#i', trim($s), $r)
399
-				&& changer_langue($l = strtolower($r[1]), $liste_langues)
400
-			) {
401
-				return $l;
402
-			}
403
-		}
404
-	}
405
-
406
-	return utiliser_langue_site($liste_langues);
375
+    // si on est dans l'espace public et pas de $liste_langues : se limiter a la config langues_multilingue si définie
376
+    if (is_null($liste_langues) && !test_espace_prive() && !empty($GLOBALS['meta']['langues_multilingue'])) {
377
+        $liste_langues = $GLOBALS['meta']['langues_multilingue'];
378
+    }
379
+
380
+    $l = (test_espace_prive() ? 'spip_lang_ecrire' : 'spip_lang');
381
+    if (
382
+        isset($_COOKIE[$l])
383
+        && changer_langue($l = $_COOKIE[$l], $liste_langues)
384
+    ) {
385
+        return $l;
386
+    }
387
+
388
+    if (
389
+        isset($GLOBALS['visiteur_session']['lang'])
390
+        && changer_langue($l = $GLOBALS['visiteur_session']['lang'], $liste_langues)
391
+    ) {
392
+        return $l;
393
+    }
394
+
395
+    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
396
+        foreach (explode(',', (string) $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $s) {
397
+            if (
398
+                preg_match('#^([a-z]{2,3})(-[a-z]{2,3})?(;q=[0-9.]+)?$#i', trim($s), $r)
399
+                && changer_langue($l = strtolower($r[1]), $liste_langues)
400
+            ) {
401
+                return $l;
402
+            }
403
+        }
404
+    }
405
+
406
+    return utiliser_langue_site($liste_langues);
407 407
 }
408 408
 
409 409
 
@@ -413,7 +413,7 @@  discard block
 block discarded – undo
413 413
  * @return int
414 414
  */
415 415
 function match_langue($chaine) {
416
-	return preg_match('/^[a-z]{2,3}(_[a-z]{2,3}){0,2}$/', $chaine);
416
+    return preg_match('/^[a-z]{2,3}(_[a-z]{2,3}){0,2}$/', $chaine);
417 417
 }
418 418
 
419 419
 /**
@@ -431,38 +431,38 @@  discard block
 block discarded – undo
431 431
  **/
432 432
 function init_langues() {
433 433
 
434
-	// liste des langues dans les meta, sauf a l'install
435
-	$all_langs = $GLOBALS['meta']['langues_proposees'] ?? '';
436
-
437
-	$tout = [];
438
-	if (!$all_langs) {
439
-		// trouver tous les modules lang/spip_xx.php
440
-		$modules = find_all_in_path('lang/', '/spip_([a-z_]+)\.php$');
441
-		foreach (array_keys($modules) as $name) {
442
-			if (
443
-				preg_match(',^spip_([a-z_]+)\.php$,', $name, $regs)
444
-				&& match_langue($regs[1])
445
-			) {
446
-				$tout[] = $regs[1];
447
-			}
448
-		}
449
-		sort($tout);
450
-		$tout = implode(',', $tout);
451
-		// Si les langues n'ont pas change, ne rien faire
452
-		if ($tout != $all_langs) {
453
-			$GLOBALS['meta']['langues_proposees'] = $tout;
454
-			include_spip('inc/meta');
455
-			ecrire_meta('langues_proposees', $tout);
456
-		}
457
-	}
458
-	if (!isset($GLOBALS['meta']['langue_site'])) {
459
-		// Initialisation : le francais si dispo, sinon la premiere langue trouvee
460
-		$GLOBALS['meta']['langue_site'] = $tout =
461
-			(!$all_langs || str_contains(',' . _LANGUE_PAR_DEFAUT . ',', (string) ",$all_langs,"))
462
-				? _LANGUE_PAR_DEFAUT
463
-				: substr((string) $all_langs, 0, strpos((string) $all_langs, ','));
464
-		ecrire_meta('langue_site', $tout);
465
-	}
434
+    // liste des langues dans les meta, sauf a l'install
435
+    $all_langs = $GLOBALS['meta']['langues_proposees'] ?? '';
436
+
437
+    $tout = [];
438
+    if (!$all_langs) {
439
+        // trouver tous les modules lang/spip_xx.php
440
+        $modules = find_all_in_path('lang/', '/spip_([a-z_]+)\.php$');
441
+        foreach (array_keys($modules) as $name) {
442
+            if (
443
+                preg_match(',^spip_([a-z_]+)\.php$,', $name, $regs)
444
+                && match_langue($regs[1])
445
+            ) {
446
+                $tout[] = $regs[1];
447
+            }
448
+        }
449
+        sort($tout);
450
+        $tout = implode(',', $tout);
451
+        // Si les langues n'ont pas change, ne rien faire
452
+        if ($tout != $all_langs) {
453
+            $GLOBALS['meta']['langues_proposees'] = $tout;
454
+            include_spip('inc/meta');
455
+            ecrire_meta('langues_proposees', $tout);
456
+        }
457
+    }
458
+    if (!isset($GLOBALS['meta']['langue_site'])) {
459
+        // Initialisation : le francais si dispo, sinon la premiere langue trouvee
460
+        $GLOBALS['meta']['langue_site'] = $tout =
461
+            (!$all_langs || str_contains(',' . _LANGUE_PAR_DEFAUT . ',', (string) ",$all_langs,"))
462
+                ? _LANGUE_PAR_DEFAUT
463
+                : substr((string) $all_langs, 0, strpos((string) $all_langs, ','));
464
+        ecrire_meta('langue_site', $tout);
465
+    }
466 466
 }
467 467
 
468 468
 /**
@@ -476,10 +476,10 @@  discard block
 block discarded – undo
476 476
  *     Code html de la balise <html>
477 477
  **/
478 478
 function html_lang_attributes() {
479
-	$lang = $GLOBALS['spip_lang'];
480
-	$dir = lang_dir($lang);
479
+    $lang = $GLOBALS['spip_lang'];
480
+    $dir = lang_dir($lang);
481 481
 
482
-	return "<html class='$dir $lang no-js' xmlns='http://www.w3.org/1999/xhtml' lang='$lang' dir='$dir'>\n";
482
+    return "<html class='$dir $lang no-js' xmlns='http://www.w3.org/1999/xhtml' lang='$lang' dir='$dir'>\n";
483 483
 }
484 484
 
485 485
 
@@ -493,7 +493,7 @@  discard block
 block discarded – undo
493 493
  * @return string
494 494
  */
495 495
 function aide_lang_dir($spip_lang, $spip_lang_rtl) {
496
-	return ($spip_lang != 'he') ? $spip_lang_rtl : '';
496
+    return ($spip_lang != 'he') ? $spip_lang_rtl : '';
497 497
 }
498 498
 
499 499
 
Please login to merge, or discard this patch.
Spacing   +9 added lines, -10 removed lines patch added patch discarded remove patch
@@ -43,13 +43,13 @@  discard block
 block discarded – undo
43 43
 	}
44 44
 
45 45
 	if (is_null($liste_langues)) {
46
-		$liste_langues = ($GLOBALS['meta']['langues_proposees'] ?? '') . ',' . ($GLOBALS['meta']['langues_multilingue'] ?? '');
46
+		$liste_langues = ($GLOBALS['meta']['langues_proposees'] ?? '').','.($GLOBALS['meta']['langues_multilingue'] ?? '');
47 47
 	} else {
48 48
 		if (is_array($liste_langues)) {
49 49
 			$liste_langues = implode(',', $liste_langues);
50 50
 		}
51 51
 	}
52
-	$liste_langues = ',' . $liste_langues . ',';
52
+	$liste_langues = ','.$liste_langues.',';
53 53
 
54 54
 	// Si la langue demandee n'existe pas, on essaie d'autres variantes
55 55
 	// Exemple : 'pt-br' => 'pt_br' => 'pt'
@@ -191,7 +191,7 @@  discard block
 block discarded – undo
191 191
 	}
192 192
 	foreach ($langues as $l) {
193 193
 		$selected = ($l == $default) ? ' selected=\'selected\'' : '';
194
-		$ret .= "<option value='$l'$selected>[" . $l . '] ' . traduire_nom_langue($l) . "</option>\n";
194
+		$ret .= "<option value='$l'$selected>[".$l.'] '.traduire_nom_langue($l)."</option>\n";
195 195
 	}
196 196
 
197 197
 	if (!test_espace_prive()) {
@@ -209,21 +209,20 @@  discard block
 block discarded – undo
209 209
 		$base,
210 210
 		$cible,
211 211
 		(select_langues($nom_select, $change, $ret)
212
-			. "<noscript><div style='display:inline'><input type='submit' class='fondo' value='" . _T('bouton_changer') . "' /></div></noscript>"),
212
+			. "<noscript><div style='display:inline'><input type='submit' class='fondo' value='"._T('bouton_changer')."' /></div></noscript>"),
213 213
 		" method='post'"
214 214
 	);
215 215
 }
216 216
 
217 217
 function select_langues($nom_select, $change, $options, $label = '') {
218 218
 	static $cpt = 0;
219
-	$id = 'menu_langues' . $cpt++;
219
+	$id = 'menu_langues'.$cpt++;
220 220
 
221 221
 	return
222
-		"<label for='$id'>" . ($label ?: _T('info_langues')) . '</label> ' .
222
+		"<label for='$id'>".($label ?: _T('info_langues')).'</label> '.
223 223
 		"<select name='$nom_select' id='$id' "
224 224
 		. ((test_espace_prive()) ?
225
-			(($nom_select == 'var_lang_ecrire' ? "class='lang_ecrire'" : "class='fondl'")) :
226
-			("class='forml menu_langues'"))
225
+			(($nom_select == 'var_lang_ecrire' ? "class='lang_ecrire'" : "class='fondl'")) : ("class='forml menu_langues'"))
227 226
 		. $change
228 227
 		. ">\n"
229 228
 		. $options
@@ -346,7 +345,7 @@  discard block
 block discarded – undo
346 345
 		isset($GLOBALS['meta']['langue_site'])
347 346
 		&& (!isset($GLOBALS['spip_lang']) || $GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site'])
348 347
 	) {
349
-		return changer_langue($GLOBALS['meta']['langue_site'], $liste_langues);//@:install
348
+		return changer_langue($GLOBALS['meta']['langue_site'], $liste_langues); //@:install
350 349
 	}
351 350
 	// en theorie là, la globale est définie, sinon c'est un problème.
352 351
 	if (!isset($GLOBALS['spip_lang'])) {
@@ -458,7 +457,7 @@  discard block
 block discarded – undo
458 457
 	if (!isset($GLOBALS['meta']['langue_site'])) {
459 458
 		// Initialisation : le francais si dispo, sinon la premiere langue trouvee
460 459
 		$GLOBALS['meta']['langue_site'] = $tout =
461
-			(!$all_langs || str_contains(',' . _LANGUE_PAR_DEFAUT . ',', (string) ",$all_langs,"))
460
+			(!$all_langs || str_contains(','._LANGUE_PAR_DEFAUT.',', (string) ",$all_langs,"))
462 461
 				? _LANGUE_PAR_DEFAUT
463 462
 				: substr((string) $all_langs, 0, strpos((string) $all_langs, ','));
464 463
 		ecrire_meta('langue_site', $tout);
Please login to merge, or discard this patch.
ecrire/inc/pipelines.php 2 patches
Indentation   +125 added lines, -125 removed lines patch added patch discarded remove patch
@@ -15,10 +15,10 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Pipelines
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 if (test_espace_prive()) {
21
-	include_spip('inc/pipelines_ecrire');
21
+    include_spip('inc/pipelines_ecrire');
22 22
 }
23 23
 
24 24
 
@@ -44,26 +44,26 @@  discard block
 block discarded – undo
44 44
  * @return string          Contenu qui sera inséré dans le head HTML
45 45
  **/
46 46
 function f_jQuery($texte) {
47
-	$x = '';
48
-	$jquery_plugins = pipeline(
49
-		'jquery_plugins',
50
-		[
51
-			'javascript/jquery.js',
52
-			'javascript/jquery.form.js',
53
-			'javascript/jquery.autosave.js',
54
-			'javascript/jquery.placeholder-label.js',
55
-			'javascript/ajaxCallback.js',
56
-			'javascript/js.cookie.js',
57
-		]
58
-	);
59
-	foreach (array_unique($jquery_plugins) as $script) {
60
-		if ($script = find_in_path(supprimer_timestamp($script))) {
61
-			$script = timestamp($script);
62
-			$x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
63
-		}
64
-	}
65
-
66
-	return $x . $texte;
47
+    $x = '';
48
+    $jquery_plugins = pipeline(
49
+        'jquery_plugins',
50
+        [
51
+            'javascript/jquery.js',
52
+            'javascript/jquery.form.js',
53
+            'javascript/jquery.autosave.js',
54
+            'javascript/jquery.placeholder-label.js',
55
+            'javascript/ajaxCallback.js',
56
+            'javascript/js.cookie.js',
57
+        ]
58
+    );
59
+    foreach (array_unique($jquery_plugins) as $script) {
60
+        if ($script = find_in_path(supprimer_timestamp($script))) {
61
+            $script = timestamp($script);
62
+            $x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
63
+        }
64
+    }
65
+
66
+    return $x . $texte;
67 67
 }
68 68
 
69 69
 /**
@@ -80,33 +80,33 @@  discard block
 block discarded – undo
80 80
  * @return string         Contenu de la page envoyée au navigateur
81 81
  **/
82 82
 function f_tidy($texte) {
83
-	/**
84
-	 * Indentation à faire ?
85
-	 *
86
-	 * - true : actif.
87
-	 * - false par défaut.
88
-	 */
89
-
90
-	if (
91
-		$GLOBALS['xhtml']
92
-		&& $GLOBALS['html']
93
-		&& strlen($texte)
94
-		&& !headers_sent()
95
-	) {
96
-		# Compatibilite ascendante
97
-		if (!is_string($GLOBALS['xhtml'])) {
98
-			$GLOBALS['xhtml'] = 'tidy';
99
-		}
100
-
101
-		if (!$f = charger_fonction($GLOBALS['xhtml'], 'inc', true)) {
102
-			spip_log("tidy absent, l'indenteur SPIP le remplace");
103
-			$f = charger_fonction('sax', 'xml');
104
-		}
105
-
106
-		return $f($texte);
107
-	}
108
-
109
-	return $texte;
83
+    /**
84
+     * Indentation à faire ?
85
+     *
86
+     * - true : actif.
87
+     * - false par défaut.
88
+     */
89
+
90
+    if (
91
+        $GLOBALS['xhtml']
92
+        && $GLOBALS['html']
93
+        && strlen($texte)
94
+        && !headers_sent()
95
+    ) {
96
+        # Compatibilite ascendante
97
+        if (!is_string($GLOBALS['xhtml'])) {
98
+            $GLOBALS['xhtml'] = 'tidy';
99
+        }
100
+
101
+        if (!$f = charger_fonction($GLOBALS['xhtml'], 'inc', true)) {
102
+            spip_log("tidy absent, l'indenteur SPIP le remplace");
103
+            $f = charger_fonction('sax', 'xml');
104
+        }
105
+
106
+        return $f($texte);
107
+    }
108
+
109
+    return $texte;
110 110
 }
111 111
 
112 112
 
@@ -125,24 +125,24 @@  discard block
 block discarded – undo
125 125
  * @return string         Contenu de la page envoyée au navigateur
126 126
  **/
127 127
 function f_insert_head($texte) {
128
-	if (!$GLOBALS['html']) {
129
-		return $texte;
130
-	}
131
-	include_spip('public/admin'); // pour strripos
132
-
133
-	if (
134
-		!($pos = stripos($texte, '</head>'))
135
-		&& !($pos = stripos($texte, '<body>'))
136
-	) {
137
-		$pos = 0;
138
-	}
139
-
140
-	if (!str_contains(substr($texte, 0, $pos), '<!-- insert_head -->')) {
141
-		$insert = "\n" . pipeline('insert_head', '<!-- f_insert_head -->') . "\n";
142
-		$texte = substr_replace($texte, $insert, $pos, 0);
143
-	}
144
-
145
-	return $texte;
128
+    if (!$GLOBALS['html']) {
129
+        return $texte;
130
+    }
131
+    include_spip('public/admin'); // pour strripos
132
+
133
+    if (
134
+        !($pos = stripos($texte, '</head>'))
135
+        && !($pos = stripos($texte, '<body>'))
136
+    ) {
137
+        $pos = 0;
138
+    }
139
+
140
+    if (!str_contains(substr($texte, 0, $pos), '<!-- insert_head -->')) {
141
+        $insert = "\n" . pipeline('insert_head', '<!-- f_insert_head -->') . "\n";
142
+        $texte = substr_replace($texte, $insert, $pos, 0);
143
+    }
144
+
145
+    return $texte;
146 146
 }
147 147
 
148 148
 
@@ -158,34 +158,34 @@  discard block
 block discarded – undo
158 158
  * @return string         Contenu de la page envoyée au navigateur
159 159
  **/
160 160
 function f_admin($texte) {
161
-	if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && $GLOBALS['html']) {
162
-		include_spip('inc/filtres'); // pour http_img_pack
163
-		$x = "<div class='spip-previsu' "
164
-			. http_style_background('preview-32.png', '', 32)
165
-			. '>'
166
-			. _T('previsualisation')
167
-			. '</div>';
168
-		if (!$pos = stripos($texte, '</body>')) {
169
-			$pos = strlen($texte);
170
-		}
171
-		$texte = substr_replace($texte, $x, $pos, 0);
172
-		// pas de preview en fenetre enfant
173
-		$x = "<script type='text/javascript'>const frameEl = window.frameElement;if (frameEl) {frameEl.sandbox='sandbox';window.location.href='" . addslashes((string) $GLOBALS['meta']['adresse_site']) . "';}</script>";
174
-		if ((!$pos = stripos($texte, '<head')) || (!$pos = strpos($texte, '>', $pos))) {
175
-			$pos = -1;
176
-		}
177
-		$texte = substr_replace($texte, $x, $pos + 1, 0);
178
-	}
179
-
180
-	if (isset($GLOBALS['affiche_boutons_admin']) && $GLOBALS['affiche_boutons_admin']) {
181
-		include_spip('public/admin');
182
-		$texte = affiche_boutons_admin($texte);
183
-	}
184
-	if (_request('var_mode') == 'noajax') {
185
-		$texte = preg_replace(',(class=[\'"][^\'"]*)ajax([^\'"]*[\'"]),Uims', "\\1\\2", $texte);
186
-	}
187
-
188
-	return $texte;
161
+    if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && $GLOBALS['html']) {
162
+        include_spip('inc/filtres'); // pour http_img_pack
163
+        $x = "<div class='spip-previsu' "
164
+            . http_style_background('preview-32.png', '', 32)
165
+            . '>'
166
+            . _T('previsualisation')
167
+            . '</div>';
168
+        if (!$pos = stripos($texte, '</body>')) {
169
+            $pos = strlen($texte);
170
+        }
171
+        $texte = substr_replace($texte, $x, $pos, 0);
172
+        // pas de preview en fenetre enfant
173
+        $x = "<script type='text/javascript'>const frameEl = window.frameElement;if (frameEl) {frameEl.sandbox='sandbox';window.location.href='" . addslashes((string) $GLOBALS['meta']['adresse_site']) . "';}</script>";
174
+        if ((!$pos = stripos($texte, '<head')) || (!$pos = strpos($texte, '>', $pos))) {
175
+            $pos = -1;
176
+        }
177
+        $texte = substr_replace($texte, $x, $pos + 1, 0);
178
+    }
179
+
180
+    if (isset($GLOBALS['affiche_boutons_admin']) && $GLOBALS['affiche_boutons_admin']) {
181
+        include_spip('public/admin');
182
+        $texte = affiche_boutons_admin($texte);
183
+    }
184
+    if (_request('var_mode') == 'noajax') {
185
+        $texte = preg_replace(',(class=[\'"][^\'"]*)ajax([^\'"]*[\'"]),Uims', "\\1\\2", $texte);
186
+    }
187
+
188
+    return $texte;
189 189
 }
190 190
 
191 191
 /**
@@ -203,11 +203,11 @@  discard block
 block discarded – undo
203 203
  * @return array $flux  Description et contenu de l'inclusion
204 204
  **/
205 205
 function f_recuperer_fond($flux) {
206
-	if (!test_espace_prive()) {
207
-		return $flux;
208
-	}
206
+    if (!test_espace_prive()) {
207
+        return $flux;
208
+    }
209 209
 
210
-	return f_afficher_blocs_ecrire($flux);
210
+    return f_afficher_blocs_ecrire($flux);
211 211
 }
212 212
 
213 213
 /**
@@ -221,30 +221,30 @@  discard block
 block discarded – undo
221 221
  * @return string         Contenu de la page envoyée au navigateur
222 222
  */
223 223
 function f_queue($texte) {
224
-	// eviter une inclusion si rien a faire
225
-	if (
226
-		_request('action') == 'cron'
227
-		|| queue_sleep_time_to_next_job() > 0
228
-		|| defined('_DEBUG_BLOCK_QUEUE')
229
-	) {
230
-		return $texte;
231
-	}
232
-
233
-	include_spip('inc/queue');
234
-	$code = queue_affichage_cron();
235
-
236
-	// si rien a afficher
237
-	// ou si on est pas dans une page html, on ne sait rien faire de mieux
238
-	if (!$code || !isset($GLOBALS['html']) || !$GLOBALS['html']) {
239
-		return $texte;
240
-	}
241
-
242
-	// inserer avant le </body> fermant si on peut, a la fin de la page sinon
243
-	if (($p = strpos($texte, '</body>')) !== false) {
244
-		$texte = substr($texte, 0, $p) . $code . substr($texte, $p);
245
-	} else {
246
-		$texte .= $code;
247
-	}
248
-
249
-	return $texte;
224
+    // eviter une inclusion si rien a faire
225
+    if (
226
+        _request('action') == 'cron'
227
+        || queue_sleep_time_to_next_job() > 0
228
+        || defined('_DEBUG_BLOCK_QUEUE')
229
+    ) {
230
+        return $texte;
231
+    }
232
+
233
+    include_spip('inc/queue');
234
+    $code = queue_affichage_cron();
235
+
236
+    // si rien a afficher
237
+    // ou si on est pas dans une page html, on ne sait rien faire de mieux
238
+    if (!$code || !isset($GLOBALS['html']) || !$GLOBALS['html']) {
239
+        return $texte;
240
+    }
241
+
242
+    // inserer avant le </body> fermant si on peut, a la fin de la page sinon
243
+    if (($p = strpos($texte, '</body>')) !== false) {
244
+        $texte = substr($texte, 0, $p) . $code . substr($texte, $p);
245
+    } else {
246
+        $texte .= $code;
247
+    }
248
+
249
+    return $texte;
250 250
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -63,7 +63,7 @@  discard block
 block discarded – undo
63 63
 		}
64 64
 	}
65 65
 
66
-	return $x . $texte;
66
+	return $x.$texte;
67 67
 }
68 68
 
69 69
 /**
@@ -138,7 +138,7 @@  discard block
 block discarded – undo
138 138
 	}
139 139
 
140 140
 	if (!str_contains(substr($texte, 0, $pos), '<!-- insert_head -->')) {
141
-		$insert = "\n" . pipeline('insert_head', '<!-- f_insert_head -->') . "\n";
141
+		$insert = "\n".pipeline('insert_head', '<!-- f_insert_head -->')."\n";
142 142
 		$texte = substr_replace($texte, $insert, $pos, 0);
143 143
 	}
144 144
 
@@ -170,7 +170,7 @@  discard block
 block discarded – undo
170 170
 		}
171 171
 		$texte = substr_replace($texte, $x, $pos, 0);
172 172
 		// pas de preview en fenetre enfant
173
-		$x = "<script type='text/javascript'>const frameEl = window.frameElement;if (frameEl) {frameEl.sandbox='sandbox';window.location.href='" . addslashes((string) $GLOBALS['meta']['adresse_site']) . "';}</script>";
173
+		$x = "<script type='text/javascript'>const frameEl = window.frameElement;if (frameEl) {frameEl.sandbox='sandbox';window.location.href='".addslashes((string) $GLOBALS['meta']['adresse_site'])."';}</script>";
174 174
 		if ((!$pos = stripos($texte, '<head')) || (!$pos = strpos($texte, '>', $pos))) {
175 175
 			$pos = -1;
176 176
 		}
@@ -241,7 +241,7 @@  discard block
 block discarded – undo
241 241
 
242 242
 	// inserer avant le </body> fermant si on peut, a la fin de la page sinon
243 243
 	if (($p = strpos($texte, '</body>')) !== false) {
244
-		$texte = substr($texte, 0, $p) . $code . substr($texte, $p);
244
+		$texte = substr($texte, 0, $p).$code.substr($texte, $p);
245 245
 	} else {
246 246
 		$texte .= $code;
247 247
 	}
Please login to merge, or discard this patch.