[PLUGINS] ~formidable 1.3.6 --> 1.9.1
authorLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Wed, 12 Mar 2014 09:05:19 +0000 (10:05 +0100)
committerLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Wed, 12 Mar 2014 09:05:19 +0000 (10:05 +0100)
142 files changed:
www/plugins/facteur/classes/facteur.php
www/plugins/facteur/emails/texte.html
www/plugins/facteur/facteur_fonctions.php
www/plugins/facteur/facteur_pipelines.php [new file with mode: 0644]
www/plugins/facteur/inc/envoyer_mail.php
www/plugins/facteur/lang/facteur.xml
www/plugins/facteur/lang/facteur_de.php
www/plugins/facteur/lang/facteur_en.php
www/plugins/facteur/lang/facteur_es.php
www/plugins/facteur/lang/facteur_fa.php [new file with mode: 0644]
www/plugins/facteur/lang/facteur_fr.php
www/plugins/facteur/lang/facteur_fr_tu.php [new file with mode: 0644]
www/plugins/facteur/lang/facteur_nl.php [new file with mode: 0644]
www/plugins/facteur/lang/facteur_sk.php
www/plugins/facteur/lang/paquet-facteur.xml
www/plugins/facteur/lang/paquet-facteur_de.php [new file with mode: 0755]
www/plugins/facteur/lang/paquet-facteur_fr.php
www/plugins/facteur/lang/paquet-facteur_fr_tu.php [new file with mode: 0644]
www/plugins/facteur/lang/paquet-facteur_nl.php [new file with mode: 0644]
www/plugins/facteur/lang/paquet-facteur_ru.php [new file with mode: 0644]
www/plugins/facteur/lib/markdownify/LICENSE_LGPL.txt [new file with mode: 0644]
www/plugins/facteur/lib/markdownify/markdownify.php [new file with mode: 0644]
www/plugins/facteur/lib/markdownify/markdownify_extra.php [new file with mode: 0644]
www/plugins/facteur/lib/markdownify/parsehtml/parsehtml.php [new file with mode: 0644]
www/plugins/facteur/paquet.xml
www/plugins/facteur/phpmailer-php5/class.phpmailer.php
www/plugins/facteur/svn.revision
www/plugins/formidable_1_0/action/editer_formulaire.php
www/plugins/formidable_1_0/action/exporter_analyse_reponses.php
www/plugins/formidable_1_0/action/exporter_formulaires_reponses.php
www/plugins/formidable_1_0/action/vider_formulaire.php [new file with mode: 0644]
www/plugins/formidable_1_0/base/formidable_tables.php
www/plugins/formidable_1_0/formidable_administrations.php
www/plugins/formidable_1_0/formidable_autorisations.php
www/plugins/formidable_1_0/formidable_pipelines.php
www/plugins/formidable_1_0/formulaires/configurer_formidable_analyse.html
www/plugins/formidable_1_0/formulaires/formidable.html
www/plugins/formidable_1_0/formulaires/formidable.php
www/plugins/formidable_1_0/formulaires/importer_formulaire.html
www/plugins/formidable_1_0/images/formulaire-reponses-supprimer-24.png [new file with mode: 0644]
www/plugins/formidable_1_0/inc/formidable.php
www/plugins/formidable_1_0/lang/formidable.xml
www/plugins/formidable_1_0/lang/formidable_de.php
www/plugins/formidable_1_0/lang/formidable_en.php
www/plugins/formidable_1_0/lang/formidable_es.php
www/plugins/formidable_1_0/lang/formidable_fr.php
www/plugins/formidable_1_0/lang/formidable_it.php
www/plugins/formidable_1_0/lang/formidable_sk.php
www/plugins/formidable_1_0/lang/paquet-formidable.xml [new file with mode: 0644]
www/plugins/formidable_1_0/lang/paquet-formidable_fr.php
www/plugins/formidable_1_0/modeles/formulaire_analyse.html
www/plugins/formidable_1_0/paquet.xml
www/plugins/formidable_1_0/prive/squelettes/contenu/formulaire_edit.html
www/plugins/formidable_1_0/prive/squelettes/contenu/formulaires.html
www/plugins/formidable_1_0/prive/squelettes/extra/formulaire.html
www/plugins/formidable_1_0/prive/squelettes/extra/formulaire_edit.html
www/plugins/formidable_1_0/prive/squelettes/extra/formulaires_reponses.html
www/plugins/formidable_1_0/prive/squelettes/hierarchie/formulaire.html
www/plugins/formidable_1_0/prive/squelettes/hierarchie/formulaire_edit.html
www/plugins/formidable_1_0/prive/squelettes/navigation/formulaire.html
www/plugins/formidable_1_0/prive/squelettes/navigation/formulaires.html
www/plugins/formidable_1_0/saisies-analyses/selection.html
www/plugins/formidable_1_0/svn.revision
www/plugins/formidable_1_0/todo.txt
www/plugins/formidable_1_0/traiter/email.php
www/plugins/formidable_1_0/traiter/email.yaml
www/plugins/formidable_1_0/traiter/enregistrement.php
www/plugins/formidable_1_0/traiter/enregistrement.yaml
www/plugins/saisies/formulaires/construire_formulaire.html
www/plugins/saisies/inc/saisies.php
www/plugins/saisies/inc/saisies_afficher.php
www/plugins/saisies/inc/saisies_lister.php
www/plugins/saisies/inclure/generer_saisies.html
www/plugins/saisies/javascript/saisies.js
www/plugins/saisies/lang/paquet-saisies.xml
www/plugins/saisies/lang/paquet-saisies_ar.php [new file with mode: 0644]
www/plugins/saisies/lang/paquet-saisies_fr.php
www/plugins/saisies/lang/paquet-saisies_fr_tu.php [new file with mode: 0644]
www/plugins/saisies/lang/paquet-saisies_nl.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies.xml
www/plugins/saisies/lang/saisies_ca.php
www/plugins/saisies/lang/saisies_de.php
www/plugins/saisies/lang/saisies_en.php
www/plugins/saisies/lang/saisies_es.php
www/plugins/saisies/lang/saisies_fa.php
www/plugins/saisies/lang/saisies_fr.php
www/plugins/saisies/lang/saisies_fr_tu.php
www/plugins/saisies/lang/saisies_it.php
www/plugins/saisies/lang/saisies_nl.php [new file with mode: 0644]
www/plugins/saisies/lang/saisies_ru.php
www/plugins/saisies/lang/saisies_sk.php
www/plugins/saisies/paquet.xml
www/plugins/saisies/plugin.xml
www/plugins/saisies/saisies-vues/checkbox.html
www/plugins/saisies/saisies-vues/mot.html [new file with mode: 0644]
www/plugins/saisies/saisies-vues/oui_non.html
www/plugins/saisies/saisies-vues/selection.html
www/plugins/saisies/saisies/_base.html
www/plugins/saisies/saisies/articles_originaux.html
www/plugins/saisies/saisies/auteurs.html
www/plugins/saisies/saisies/auteurs.yaml
www/plugins/saisies/saisies/case.html
www/plugins/saisies/saisies/case.yaml
www/plugins/saisies/saisies/checkbox.html
www/plugins/saisies/saisies/checkbox.yaml
www/plugins/saisies/saisies/choisir_objet.html
www/plugins/saisies/saisies/date.yaml
www/plugins/saisies/saisies/date_jour_mois_annee.html
www/plugins/saisies/saisies/destinataires.html
www/plugins/saisies/saisies/destinataires.yaml
www/plugins/saisies/saisies/explication.yaml
www/plugins/saisies/saisies/fieldset.yaml
www/plugins/saisies/saisies/groupe_mots.html
www/plugins/saisies/saisies/input.html
www/plugins/saisies/saisies/input.yaml
www/plugins/saisies/saisies/mot.html
www/plugins/saisies/saisies/mot.yaml [new file with mode: 0644]
www/plugins/saisies/saisies/oui_non.html
www/plugins/saisies/saisies/oui_non.yaml
www/plugins/saisies/saisies/pays.html
www/plugins/saisies/saisies/police.html
www/plugins/saisies/saisies/position_construire_formulaire.html
www/plugins/saisies/saisies/radio.html
www/plugins/saisies/saisies/radio.yaml
www/plugins/saisies/saisies/secteur.html
www/plugins/saisies/saisies/selecteur_article.yaml
www/plugins/saisies/saisies/selecteur_document.html
www/plugins/saisies/saisies/selecteur_langue.html
www/plugins/saisies/saisies/selecteur_rubrique.yaml
www/plugins/saisies/saisies/selecteur_rubrique_article.yaml
www/plugins/saisies/saisies/selecteur_site.html
www/plugins/saisies/saisies/selection.html
www/plugins/saisies/saisies/selection.yaml
www/plugins/saisies/saisies/selection_multiple.html
www/plugins/saisies/saisies/selection_multiple.yaml
www/plugins/saisies/saisies/selection_par_groupe.html
www/plugins/saisies/saisies/statuts_auteurs.html
www/plugins/saisies/saisies/textarea.html
www/plugins/saisies/saisies/textarea.yaml
www/plugins/saisies/saisies/true_false.html
www/plugins/saisies/saisies_pipelines.php
www/plugins/saisies/svn.revision

index ca3edab..daedf1e 100755 (executable)
@@ -89,13 +89,15 @@ class Facteur extends PHPMailer {
                        $this->AddCustomHeader("Errors-To: ".$this->Sender);\r
                }\r
 \r
-               if (!empty($options['cc'])) {\r
-                       $this->AddCC( $options['cc'] );\r
-               }\r
-               if (!empty($options['bcc'])) {\r
-                       $this->AddBCC( $options['bcc'] );\r
+               if (!defined('_TEST_EMAIL_DEST')){\r
+                       if (!empty($options['cc'])) {\r
+                               $this->AddCC( $options['cc'] );\r
+                       }\r
+                       if (!empty($options['bcc'])) {\r
+                               $this->AddBCC( $options['bcc'] );\r
+                       }\r
                }\r
-               \r
+\r
                if (isset($options['smtp']) AND $options['smtp'] == 'oui') {\r
                        $this->Mailer   = 'smtp';\r
                        $this->Host     = $options['smtp_host'];\r
@@ -141,94 +143,15 @@ class Facteur extends PHPMailer {
        }\r
        \r
        /*\r
-        * Transforme du HTML en texte brut, mais proprement, c'est-à-dire en essayant\r
-        * de garder les titrages, les listes, etc\r
+        * Transforme du HTML en texte brut, mais proprement\r
+        * utilise le filtre facteur_mail_html2text\r
+        * @uses facteur_mail_html2text()\r
         *\r
         * @param string $html Le HTML à transformer\r
         * @return string Retourne un texte brut formaté correctement\r
         */\r
        function html2text($html){\r
-               // On remplace tous les sauts de lignes par un espace\r
-               $html = str_replace("\n", ' ', $html);\r
-               \r
-               // Supprimer tous les liens internes\r
-               $texte = preg_replace("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims", "\\2", $html);\r
-       \r
-               // Supprime feuille style\r
-               $texte = preg_replace(";<style[^>]*>[^<]*</style>;i", "", $texte);\r
-       \r
-               // Remplace tous les liens      \r
-               $texte = preg_replace("/\<a[^>]*href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims", "\\2 (\\1)", $texte);\r
-       \r
-               // Les titres\r
-               $texte = preg_replace(";<h1[^>]*>;i", "\n= ", $texte);\r
-               $texte = str_replace("</h1>", " =\n\n", $texte);\r
-               $texte = preg_replace(";<h2[^>]*>;i", "\n== ", $texte);\r
-               $texte = str_replace("</h2>", " ==\n\n", $texte);\r
-               $texte = preg_replace(";<h3[^>]*>;i", "\n=== ", $texte);\r
-               $texte = str_replace("</h3>", " ===\n\n", $texte);\r
-               \r
-               // Une fin de liste\r
-               $texte = preg_replace(";</(u|o)l>;i", "\n\n", $texte);\r
-               \r
-               // Une saut de ligne *après* le paragraphe\r
-               $texte = preg_replace(";<p[^>]*>;i", "\n", $texte);\r
-               $texte = preg_replace(";</p>;i", "\n\n", $texte);\r
-               // Les sauts de ligne interne\r
-               $texte = preg_replace(";<br[^>]*>;i", "\n", $texte);\r
-       \r
-               //$texte = str_replace('<br /><img class=\'spip_puce\' src=\'puce.gif\' alt=\'-\' border=\'0\'>', "\n".'-', $texte);\r
-               $texte = preg_replace (';<li[^>]*>;i', "\n".'- ', $texte);\r
-       \r
-       \r
-               // accentuation du gras\r
-               // <b>texte</b> -> **texte**\r
-               $texte = preg_replace (';<b[^>]*>;i','**' ,$texte);\r
-               $texte = str_replace ('</b>','**' ,$texte);\r
-       \r
-               // accentuation du gras\r
-               // <strong>texte</strong> -> **texte**\r
-               $texte = preg_replace (';<strong[^>]*>;i','**' ,$texte);\r
-               $texte = str_replace ('</strong>','**' ,$texte);\r
-       \r
-       \r
-               // accentuation de l'italique\r
-               // <em>texte</em> -> *texte*\r
-               $texte = preg_replace (';<em[^>]*>;i','/' ,$texte);\r
-               $texte = str_replace ('</em>','*' ,$texte);\r
-               \r
-               // accentuation de l'italique\r
-               // <i>texte</i> -> *texte*\r
-               $texte = preg_replace (';<i[^>]*>;i','/' ,$texte);\r
-               $texte = str_replace ('</i>','*' ,$texte);\r
-       \r
-               $texte = str_replace('&oelig;', 'oe', $texte);\r
-               $texte = str_replace("&nbsp;", " ", $texte);\r
-               $texte = filtrer_entites($texte);\r
-       \r
-               // On supprime toutes les balises restantes\r
-               $texte = supprimer_tags($texte);\r
-       \r
-               $texte = str_replace("\x0B", "", $texte); \r
-               $texte = str_replace("\t", "", $texte) ;\r
-               $texte = preg_replace(";[ ]{3,};", "", $texte);\r
-       \r
-               // espace en debut de ligne\r
-               $texte = preg_replace("/(\r\n|\n|\r)[ ]+/", "\n", $texte);\r
-       \r
-               //marche po\r
-               // Bring down number of empty lines to 4 max\r
-               $texte = preg_replace("/(\r\n|\n|\r){3,}/m", "\n\n", $texte);\r
-       \r
-               //saut de lignes en debut de texte\r
-               $texte = preg_replace("/^(\r\n|\n|\r)*/", "\n\n", $texte);\r
-               //saut de lignes en debut ou fin de texte\r
-               $texte = preg_replace("/(\r\n|\n|\r)*$/", "\n\n", $texte);\r
-       \r
-               // Faire des lignes de 75 caracteres maximum\r
-               //$texte = wordwrap($texte);\r
-       \r
-               return $texte;\r
+               return facteur_mail_html2text($html);\r
        }\r
        \r
        /**\r
index cb7fccf..e8ed065 100644 (file)
@@ -89,7 +89,7 @@
                                                                                                                style="color:#A39F9A !important;font-family: Verdana, Geneva, sans-serif; !important;font-size:90% !important;font-weight:normal !important;font-style:normal !important;text-decoration:none !important;vertical-align:top !important;text-align:left !important;">
                                                                                                        <br/>
                                                                                                        <br/>
-                                                                                                       &mdash; Envoyé par <a href="#URL_SITE_SPIP/">#NOM_SITE_SPIP</a>
+                                                                                                       &mdash; #SET{site,<a href="#URL_SITE_SPIP/">#NOM_SITE_SPIP</a>}<:facteur:email_envoye_par{site=#GET{site}}:>
                                                                                                        <br/>
                                                                                                </td>
                                                                                        </tr>
index 3abf19a..9c09ca4 100755 (executable)
@@ -286,4 +286,102 @@ function facteur_nl2br_si_pas_autobr($texte){
        return (_AUTOBR?$texte:nl2br($texte));
 }
 
+/**
+ * Transformer un mail HTML en mail Texte proprement :
+ * - les tableaux de mise en page sont utilisés pour structurer le mail texte
+ * - le reste du HTML est markdownifie car c'est un format texte lisible et conventionnel
+ *
+ * @param string $html
+ * @return string
+ */
+function facteur_mail_html2text($html){
+       // nettoyer les balises de mise en page html
+       $html = preg_replace(",</(td|th)>,Uims","<br/>",$html);
+       $html = preg_replace(",</(table)>,Uims","@@@hr@@@",$html);
+       $html = preg_replace(",</?(html|body|table|td|th|tbody|thead|center|article|section|span)[^>]*>,Uims","\n\n",$html);
+
+       // commentaires html et conditionnels
+       $html = preg_replace(",<!--.*-->,Uims","\n",$html);
+       $html = preg_replace(",<!\[.*\]>,Uims","\n",$html);
+
+       $html = preg_replace(",<(/?)(div|tr|caption)([^>]*>),Uims","<\\1p>",$html);
+       $html = preg_replace(",(<p>\s*)+,ims","<p>",$html);
+       $html = preg_replace(",<br/?>\s*</p>,ims","</p>",$html);
+       $html = preg_replace(",</p>\s*<br/?>,ims","</p>",$html);
+       $html = preg_replace(",(</p>\s*(@@@hr@@@)?\s*)+,ims","</p>\\2",$html);
+       $html = preg_replace(",(<p>\s*</p>),ims","",$html);
+
+       // succession @@@hr@@@<hr> et <hr>@@@hr@@@
+       $html = preg_replace(",@@@hr@@@\s*(<[^>]*>\s*)?<hr[^>]*>,ims","@@@hr@@@\n",$html);
+       $html = preg_replace(",<hr[^>]*>\s*(<[^>]*>\s*)?@@@hr@@@,ims","\n@@@hr@@@",$html);
+
+       $html = preg_replace(",<textarea[^>]*spip_cadre[^>]*>(.*)</textarea>,Uims","<code>\n\\1\n</code>",$html);
+
+       // vider le contenu de qqunes :
+       $html = preg_replace(",<head[^>]*>.*</head>,Uims","\n",$html);
+
+       // Liens :
+       // Nettoyage des liens des notes de bas de page
+       $html = preg_replace("@<a href=\"#n(b|h)[0-9]+-[0-9]+\" name=\"n(b|h)[0-9]+-[0-9]+\" class=\"spip_note\">([0-9]+)</a>@", "\\3", $html);
+       // Supprimer tous les liens internes
+       $html = preg_replace("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims","\\2", $html);
+       // Remplace tous les liens
+       preg_match_all("/\<a href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims", $html,$matches,PREG_SET_ORDER);
+       $prelinks = $postlinks = array();
+       foreach ($matches as $k => $match){
+               $link = "@@@link$k@@@";
+               $url = str_replace("&amp;","&",$match[1]);
+               if ($match[2]==$match[1] OR $match[2]==$url){
+                       // si le texte est l'url :
+                       $prelinks[$match[0]] = "$link";
+               }
+               else {
+                       // texte + url
+                       $prelinks[$match[0]] = $match[2] . " ($link)";
+               }
+               $postlinks[$link] = $url;
+       }
+       $html = str_replace(array_keys($prelinks), array_values($prelinks),$html);
+
+       // les images par leur alt ?
+       // au moins les puces
+       $html = preg_replace(',<img\s[^>]*alt="-"[^>]*>,Uims','-',$html);
+       // les autres
+       $html = preg_replace(',<img\s[^>]*alt=[\'"]([^\'"]*)[\'"][^>]*>,Uims',"\\1",$html);
+       // on vire celles sans alt
+       $html = preg_replace(",</?(img)[^>]*>,Uims","\n",$html);
+
+       // espaces
+       $html = str_replace("&nbsp;"," ",$html);
+       $html = preg_replace(",<p>\s+,ims","<p>",$html);
+
+       #return $html;
+       include_spip("lib/markdownify/markdownify");
+       $parser = new Markdownify('inline',false,false);
+       $texte = $parser->parseString($html);
+
+       $texte = str_replace(array_keys($postlinks), array_values($postlinks),$texte);
+
+
+       // trim et sauts de ligne en trop ou pas assez
+       $texte = trim($texte);
+       $texte = str_replace("<br />\n","\n",$texte);
+       $texte = preg_replace(",(@@@hr@@@\s*)+\Z,ims","",$texte);
+       $texte = preg_replace(",(@@@hr@@@\s*\n)+,ims","\n\n\n".str_pad("-",75,"-")."\n\n\n",$texte);
+       $texte = preg_replace(",(\n#+\s),ims","\n\n\\1",$texte);
+       $texte = preg_replace(",(\n\s*)(\n\s*)+(\n)+,ims","\n\n\n",$texte);
+
+
+       // <p> et </p> restants
+       $texte = str_replace(array("<p>","</p>"),array("",""),$texte);
+
+       // entites restantes ? (dans du code...)
+       include_spip('inc/charsets');
+       $texte = unicode2charset($texte);
+       $texte = str_replace(array('&#039;', '&#034;'),array("'",'"'), $texte);
+
+
+       // Faire des lignes de 75 caracteres maximum
+       return trim(wordwrap($texte));
+}
 ?>
diff --git a/www/plugins/facteur/facteur_pipelines.php b/www/plugins/facteur/facteur_pipelines.php
new file mode 100644 (file)
index 0000000..2bdbdce
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Plugin Facteur
+ * (c) 2009-2013 Collectif SPIP
+ * Distribue sous licence GPL
+ * 
+ * @package SPIP\Facteur\Pipelines
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Insertion dans le pipeline recuperer_fond (SPIP)
+ * 
+ * On indique dans le formulaire de configuration de l'identité du site
+ * que facteur surchargera l'email configuré ici pour envoyer les emails
+ * 
+ * @param array $flux
+ *             Le contexte du pipeline
+ * @return array $flux
+ *             Le contexte du pipeline modifé
+ */
+function facteur_recuperer_fond($flux){
+       if(($flux['args']['fond'] == 'formulaires/configurer_identite')
+               && (isset($GLOBALS['meta']['facteur_adresse_envoi']) && $GLOBALS['meta']['facteur_adresse_envoi'] == 'oui')
+               && (isset($GLOBALS['meta']['facteur_adresse_envoi_email']) && strlen($GLOBALS['meta']['facteur_adresse_envoi_email']) > 0)){
+               $ajout = '<p class="notice">'._T('facteur:message_identite_email').'</p>';
+               $flux['data'] = preg_replace(",(<li [^>]*class=[\"']editer editer_email_webmaster.*>)(.*<label),Uims","\\1".$ajout."\\2",$flux['data'],1);
+       }
+       return $flux;
+}
+
+?>
\ No newline at end of file
index ef29058..261c7c1 100644 (file)
@@ -63,7 +63,39 @@ function inc_envoyer_mail($destinataire, $sujet, $corps, $from = "", $headers =
                        $message_html   = $corps;\r
                }\r
                else {\r
-                       $message_texte  = nettoyer_caracteres_mail($corps);\r
+                       // Autodetection : tester si le mail est en HTML\r
+                       if (strpos($headers,"Content-Type:")===false\r
+                               AND strpos($corps,"<")!==false // eviter les tests suivants si possible\r
+                               AND $ttrim = trim($corps)\r
+                               AND substr($ttrim,0,1)=="<"\r
+                         AND substr($ttrim,-1,1)==">"\r
+                         AND stripos($ttrim,"</html>")!==false){\r
+\r
+                               if(!strlen($sujet)){\r
+                                       // dans ce cas on ruse un peu : extraire le sujet du title\r
+                                       if (preg_match(",<title>(.*)</title>,Uims",$corps,$m))\r
+                                               $sujet = $m[1];\r
+                                       else {\r
+                                               // fallback, on prend le body si on le trouve\r
+                                               if (preg_match(",<body[^>]*>(.*)</body>,Uims",$corps,$m))\r
+                                                       $ttrim = $m[1];\r
+\r
+                                               // et on extrait la premiere ligne de vrai texte...\r
+                                               // nettoyer le html et les retours chariots\r
+                                               $ttrim = textebrut($ttrim);\r
+                                               $ttrim = str_replace("\r\n", "\r", $ttrim);\r
+                                               $ttrim = str_replace("\r", "\n", $ttrim);\r
+                                               // decouper\r
+                                               $ttrim = explode("\n",trim($ttrim));\r
+                                               // extraire la premiere ligne de texte brut\r
+                                               $sujet = array_shift($ttrim);\r
+                                       }\r
+                               }\r
+                               $message_html   = $corps;\r
+                       }\r
+                       // c'est vraiment un message texte\r
+                       else\r
+                               $message_texte  = nettoyer_caracteres_mail($corps);\r
                }\r
                $headers = array_map('trim',explode("\n",$headers));\r
        }\r
@@ -74,6 +106,10 @@ function inc_envoyer_mail($destinataire, $sujet, $corps, $from = "", $headers =
        if ($message_texte AND ! $message_html){\r
                $message_html = recuperer_fond("emails/texte",array('texte'=>$message_texte,'sujet'=>$sujet));\r
        }\r
+       // si le mail est en HTML sans alternative, la generer\r
+       if ($message_html AND !$message_texte){\r
+               $message_texte = facteur_mail_html2text($message_html);\r
+       }\r
 \r
        // mode TEST : forcer l'email\r
        if (defined('_TEST_EMAIL_DEST')) {\r
index dd30a59..ceab0c3 100644 (file)
@@ -1,13 +1,31 @@
 <traduction module="facteur" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/facteur/trunk/lang/" reference="fr">
-       <langue code="de" />
-       <langue code="en" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=en">
+       <langue code="de" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=de" total="50" traduits="50" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Hanjo" lien="http://trad.spip.net/auteur/hanjo" />
+               <traducteur nom="klaus++" lien="http://trad.spip.net/auteur/klaus" />
+               <traducteur nom="Torsten Willmann" lien="http://trad.spip.net/auteur/torsten-willmann" />
+       </langue>
+       <langue code="en" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=en" total="50" traduits="50" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Benitron" lien="http://trad.spip.net/auteur/benitron" />
+               <traducteur nom="Hanjo" lien="http://trad.spip.net/auteur/hanjo" />
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
                <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
        </langue>
-       <langue code="es" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=es">
-               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       <langue code="es" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=es" total="50" traduits="50" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="dani" lien="http://trad.spip.net/auteur/dani" />
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel-s-bujaldon" />
+       </langue>
+       <langue code="fa" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=fa" total="50" traduits="50" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Davood Hossein" lien="http://trad.spip.net/auteur/davood-hossein" />
+       </langue>
+       <langue code="fr" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=fr" total="50" traduits="50" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+       </langue>
+       <langue code="fr_tu" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=fr_tu" total="50" traduits="50" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Cerf" lien="http://trad.spip.net/auteur/cerf" />
+       </langue>
+       <langue code="nl" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=nl" total="50" traduits="50" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Hanjo" lien="http://trad.spip.net/auteur/hanjo" />
        </langue>
-       <langue code="fr" />
-       <langue code="sk" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=sk">
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/facteur?lang_cible=sk" total="50" traduits="50" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
                <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
        </langue>
 </traduction>
index 47bd055..21158e7 100644 (file)
@@ -7,12 +7,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
-       // Z
-       'Z' => 'ZZzZZzzz',
-
        // C
-       'config_info_enregistree' => 'Die Konfiguration des Briedträgers wurde gespeichert',
-       'configuration_adresse_envoi' => 'Absendeadresse einstellen',
+       'config_info_enregistree' => 'Die Konfiguration des Briefträgers wurde gespeichert.',
+       'configuration_adresse_envoi' => 'Absenderadresse einstellen',
        'configuration_facteur' => 'Briefträger',
        'configuration_mailer' => 'Konfiguration des Mailers',
        'configuration_smtp' => 'Auswahl der Versandmethode',
@@ -20,27 +17,27 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'corps_email_de_test' => 'Das ist ein Versandtest mit Sondärzeichen: Bär Größe Maß accentué',
 
        // E
-       'email_test_envoye' => 'Die Testmail wurde fehlerfrei versand. Falls sie nicht richtig ankommt,
-                      bearbeiten sie ihre Serverkonfiguration oder kontaktieren sie den Administrator.',
+       'email_envoye_par' => 'Absender @site@',
+       'email_test_envoye' => 'Die Testmail wurde fehlerfrei verschickt. Falls sie nicht richtig ankommt, bearbeiten sie ihre Serverkonfiguration oder kontaktieren sie den Administrator.',
        'erreur' => 'Fehler',
-       'erreur_dans_log' => ' : consultez le fichier log pour plus de détails', # NEW
-       'erreur_generale' => 'Mehrere Konfigurationsfehler. Bitte Inhalt des Formulars korrigieren.',
-       'erreur_invalid_host' => 'Servername inkorrekt',
-       'erreur_invalid_port' => 'Portnummer inkorrekt',
+       'erreur_dans_log' => ' : mehr Details in der Logdatei',
+       'erreur_generale' => 'Konfigurationsfehler. Bitte Inhalt des Formulars korrigieren.',
+       'erreur_invalid_host' => 'falscher Servername',
+       'erreur_invalid_port' => 'falsche Portnummer',
 
        // F
        'facteur_adresse_envoi_email' => 'E-Mail :',
        'facteur_adresse_envoi_nom' => 'Name:',
-       'facteur_bcc' => 'Copie Cachée (BCC) :', # NEW
-       'facteur_cc' => 'Copie (CC) :', # NEW
-       'facteur_copies' => 'Copies :', # NEW
-       'facteur_copies_descriptif' => 'Un email sera envoyé en copie aux adresses définies. Une seule adresse en copie et/ou une seule adresse en copie cachée.', # NEW
+       'facteur_bcc' => 'Blindkopie (BCC) :',
+       'facteur_cc' => 'Kopie (CC) :',
+       'facteur_copies' => 'Kopien:',
+       'facteur_copies_descriptif' => 'Eine Kopie der E-Mails wird an die angegebenen Adressen geschickt. Geben sie eine Adresse als Empfänger der Kopie bzw. Blindkopie an.',
        'facteur_filtre_accents' => 'Sonderzeichen in HTML-Entitäten umwandeln (z.B. für Hotmail).',
-       'facteur_filtre_css' => 'Stile zwischen <head> und </head> zu "inline" Stilen umwandeln, sinnvoll für Webmail die interne Stile externen vorzieht.',
+       'facteur_filtre_css' => 'Stile zwischen <head> und </head> zu "inline" Stilen umwandeln, sinnvoll für Webmail die inline-Stile externen vorzieht.',
        'facteur_filtre_images' => 'Verlinkte Bilder in E-Mail einbetten',
        'facteur_filtre_iso_8859' => 'Nach ISO-8859-1 umwandeln',
        'facteur_filtres' => 'Filter',
-       'facteur_filtres_descriptif' => 'Beim Versand können mehrere Filter eingesetzt werden.',
+       'facteur_filtres_descriptif' => 'Beim Versand können die Mails durch mehrere Filter behandelt werden.',
        'facteur_smtp_auth' => 'Autorisierung erforderlich:',
        'facteur_smtp_auth_non' => 'nein',
        'facteur_smtp_auth_oui' => 'ja',
@@ -55,6 +52,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'facteur_smtp_sender_descriptif' => 'Legt im Kopf der Mail die Empfängeradresse für Fehlermeldungen fest (bzw. den Return-Path), bestimmt ebenfalls die Absenderadresse bei Versand per SMTP.',
        'facteur_smtp_username' => 'Benutzername:',
 
+       // M
+       'message_identite_email' => 'Die Konfiguration des Plugins Briefträger (facteur) überschreibt diese Adresse für den Mailversand.',
+
        // N
        'note_test_configuration' => 'Eine Mail wird an die Absendeadresse geschickt (oder an den Webmaster).',
 
index 2358b1f..3c9c75a 100755 (executable)
@@ -7,19 +7,17 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
-       // Z
-       'Z' => 'ZZzZZzzz',
-
        // C
-       'config_info_enregistree' => 'Postman\'s configuration is now saved',
-       'configuration_adresse_envoi' => 'Sender\'s address configuration',
+       'config_info_enregistree' => 'Postmans configuration is now saved',
+       'configuration_adresse_envoi' => 'Senders address configuration',
        'configuration_facteur' => 'Postman',
-       'configuration_mailer' => 'Mailer\'s configuration',
+       'configuration_mailer' => 'Mailers configuration',
        'configuration_smtp' => 'Choose your mailer',
-       'configuration_smtp_descriptif' => 'If you\'re not sure about the settings, leave them set to "PHP mail".',
+       'configuration_smtp_descriptif' => 'If youre not sure about the settings, leave them set to "PHP mail".',
        'corps_email_de_test' => 'This is a test email',
 
        // E
+       'email_envoye_par' => 'Sent by @site@',
        'email_test_envoye' => 'The test email was successfully sent. If you do not receive it correctly, check the configuration of your server or contact a server administrator.',
        'erreur' => 'Error',
        'erreur_dans_log' => ': check the log file for more details',
@@ -51,9 +49,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'facteur_smtp_secure_ssl' => 'SSL',
        'facteur_smtp_secure_tls' => 'TLS',
        'facteur_smtp_sender' => 'Return-Path (optional)',
-       'facteur_smtp_sender_descriptif' => 'Define the Return-Path in the mail header, useful for error feedback, also in SMTP mode it defines the sender\'s email.',
+       'facteur_smtp_sender_descriptif' => 'Define the Return-Path in the mail header, useful for error feedback, also in SMTP mode it defines the senders email.',
        'facteur_smtp_username' => 'Username:',
 
+       // M
+       'message_identite_email' => 'The configuration of the plugin "factor" preset this email address for sending emails.',
+
        // N
        'note_test_configuration' => 'A test email will be sent to the "sender".',
 
@@ -66,7 +67,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // U
        'utiliser_mail' => 'Use mail function from PHP',
-       'utiliser_reglages_site' => 'Use the site\'s settings: the email address is the webmaster\'s one and the name of the website is the name of the sender',
+       'utiliser_reglages_site' => 'Use the site’s settings: the email address is the webmaster’s one and the name of the website is the name of the sender',
        'utiliser_smtp' => 'Use SMTP',
 
        // V
index 4f7f936..3cef7c9 100644 (file)
@@ -7,22 +7,20 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
-       // Z
-       'Z' => 'ZZzZZzzz',
-
        // C
-       'config_info_enregistree' => 'La configuración del factor se ha registrado correctamente',
+       'config_info_enregistree' => 'La configuración del cartero fue guardada correctamente',
        'configuration_adresse_envoi' => 'Configuración de la dirección de envío',
-       'configuration_facteur' => 'Factor',
+       'configuration_facteur' => 'Cartero',
        'configuration_mailer' => 'Configuración del "mailer"',
        'configuration_smtp' => 'Elección del método de envío del correo electrónico',
-       'configuration_smtp_descriptif' => 'Si no está seguro, elija la función de correo electrónico de PHP.',
+       'configuration_smtp_descriptif' => 'Si no estás seguro, elige la función de correo electrónico de PHP.',
        'corps_email_de_test' => 'Éste es un mensaje de prueba acentuado',
 
        // E
-       'email_test_envoye' => 'El correo electrónico de prueba se ha enviado correctamente. Si lo recibe, verifique la configuración de su servidor o contacte con un administrador del servicio. ',
+       'email_envoye_par' => 'Enviado por @site@',
+       'email_test_envoye' => 'El correo electrónico de prueba se ha enviado correctamente. Si no lo recibes, verifica la configuración de tu servidor o contacta a un administrador del servicio. ',
        'erreur' => 'Error',
-       'erreur_dans_log' => ': consulte el archivo de registro para obtener más detalles',
+       'erreur_dans_log' => ': consulta el archivo de registro (log) para más detalles',
        'erreur_generale' => 'Hay uno o más errores de configuración. Por favor, compruebe el contenido del formulario. ',
        'erreur_invalid_host' => 'Este nombre de host es incorrecto',
        'erreur_invalid_port' => 'Este número de puerto es incorrecto',
@@ -39,8 +37,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'facteur_filtre_images' => 'Incorporar las imágenes de referencia en los correos electrónicos',
        'facteur_filtre_iso_8859' => 'Convertir en ISO-8859-1',
        'facteur_filtres' => 'Filtros',
-       'facteur_filtres_descriptif' => 'Los filtros pueden aplicarse en los correos electrónicos en el momento del envío.',
-       'facteur_smtp_auth' => 'Requiere autentificación:',
+       'facteur_filtres_descriptif' => 'Filtros pueden aplicarse a los correos electrónicos al ser enviados.',
+       'facteur_smtp_auth' => 'Requiere autenticación:',
        'facteur_smtp_auth_non' => 'no',
        'facteur_smtp_auth_oui' => 'sí',
        'facteur_smtp_host' => 'Host:',
@@ -54,6 +52,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'facteur_smtp_sender_descriptif' => 'Indica en el encabezado del correo electrónico la dirección de correo electrónico de rebote de errores (o "Return-Path"), y en caso de un envío a través del método SMTP indica, también, la dirección del remitente.',
        'facteur_smtp_username' => 'Nombre de usuario:',
 
+       // M
+       'message_identite_email' => 'La configuración del plugin "cartero" sobrecarga esta dirección de correo para el envío de correos.',
+
        // N
        'note_test_configuration' => 'Un correo electrónico se enviará a la dirección de envío definida (o aquélla del webmaster).',
 
@@ -61,7 +62,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'personnaliser' => 'Personalizar esta configuración',
 
        // T
-       'tester' => 'Testar',
+       'tester' => 'Probar',
        'tester_la_configuration' => 'Testar la configuración',
 
        // U
diff --git a/www/plugins/facteur/lang/facteur_fa.php b/www/plugins/facteur/lang/facteur_fa.php
new file mode 100644 (file)
index 0000000..45866b6
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/facteur?lang_cible=fa
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'config_info_enregistree' => 'پيكربندي پستجي ثبت شده است.',
+       'configuration_adresse_envoi' => 'پيكربندي نشاني نامه ',
+       'configuration_facteur' => 'پستچي',
+       'configuration_mailer' => 'پيكربندي نامه‌ رسان',
+       'configuration_smtp' => 'انتخاب روش ارسال نامه',
+       'configuration_smtp_descriptif' => 'اگر در مورد تنظيمات مطمئن نيستيد، بگذاريد «پي.اچ.پي ميل» تنظيم كند. ',
+       'corps_email_de_test' => 'اين يك ايميل آزمايشي است.',
+
+       // E
+       'email_envoye_par' => 'ارسال شده توسط @site@',
+       'email_test_envoye' => 'ايميل آزمايشي با موفقيت ارسال شد. اگر آن را درست دريافت نكرده‌ايد، پيكربندي سرور خود را تعديل كنيد، يا با ادمين سرور تماس بگيريد. ',
+       'erreur' => 'خطا',
+       'erreur_dans_log' => 'براي جزئيات بيشتر فايل لاگ را چك كنيد:',
+       'erreur_generale' => 'يك يا چند خطار در پيكربندي وجود دارد. لطفاض محتويات فرم را چك كنيد.',
+       'erreur_invalid_host' => 'نام اين هاست معتبر نيست',
+       'erreur_invalid_port' => 'شماره اين پورت درست نيست.',
+
+       // F
+       'facteur_adresse_envoi_email' => 'ايميل: ',
+       'facteur_adresse_envoi_nom' => 'نام:‌',
+       'facteur_bcc' => 'كپي مخفي (بي.سي.سي): ',
+       'facteur_cc' => 'كپي غيرمخفي (سي.سي): ',
+       'facteur_copies' => 'كپي‌ها:‌',
+       'facteur_copies_descriptif' => 'يك ايميل به نشاني مشخص شده ارسال خواهد شد. يك كپي غير مخفي و/يا يك كپي مخفي.',
+       'facteur_filtre_accents' => 'تبديل اكسان‌ها به اچ.تي.ام.ال (براي هاتميل مفيد است)',
+       'facteur_filtre_css' => 'تبديل استايل‌هاي مطالب بين <head> و </head> به استايل‌هاي  درخط، مفيد براي وب‌ميل‌ها، زيرا استايل‌هاي درخط بر استايل‌هاي بيروني اولويت مي‌يابند.',
+       'facteur_filtre_images' => 'گنجاندن تصويرهاي ارسالي در داخل ايميل‌ها',
+       'facteur_filtre_iso_8859' => 'تبديل به  ISO-8859-1',
+       'facteur_filtres' => 'فيلترها',
+       'facteur_filtres_descriptif' => 'فيلتر‌ها مي‌توانند پيش از ارسال ايميل‌ها مورد استفاده قرار بگيرند. ',
+       'facteur_smtp_auth' => 'مستلزم تأييد است: ',
+       'facteur_smtp_auth_non' => 'نه',
+       'facteur_smtp_auth_oui' => 'بله',
+       'facteur_smtp_host' => 'هاست: ',
+       'facteur_smtp_password' => 'گذر واژه:',
+       'facteur_smtp_port' => 'پورت:‌',
+       'facteur_smtp_secure' => 'ارتباط امن:‌',
+       'facteur_smtp_secure_non' => 'نه',
+       'facteur_smtp_secure_ssl' => 'اس.اس.ال',
+       'facteur_smtp_secure_tls' => 'تي.ال.اس',
+       'facteur_smtp_sender' => 'برگشت خطاها (دلبخواه)',
+       'facteur_smtp_sender_descriptif' => 'تعيين مسير برگشت در بالاي ايميل مفيد براي خطاي فيدبك، همچنين در حالت اس.ام.تي.پي (پروتكل انتقال ساده نامه) فرستنده نامه را مشخص مي‌كمند. ',
+       'facteur_smtp_username' => 'نام كاربر:‌',
+
+       // M
+       'message_identite_email' => 'پيكربندي پلاگين «پستچي» نشاني اين ايميل را براي ارسال ايميل‌ها تنظيم مي‌كند',
+
+       // N
+       'note_test_configuration' => 'يك ايميل به نشاني مرسوله تعيين شده (يا به نشاني وب مستر) ارسال خواهد شد',
+
+       // P
+       'personnaliser' => 'شخصي سازي اين تنظيمات ',
+
+       // T
+       'tester' => 'آزمايش كردن',
+       'tester_la_configuration' => 'آزمايش پيكربندي ',
+
+       // U
+       'utiliser_mail' => 'ار كاركرد نامه پي.اچ.پي استفاده كنيد',
+       'utiliser_reglages_site' => 'استفاده از تنظيمات سايت اسپيپ: نام وب سايت نام فرستنده خواهد بود و نشاني ايميل نشاني ايميل وب مستر خواهد بود. ',
+       'utiliser_smtp' => 'از اس.ام.تي.پي (پروتكل ارسال ساده نامه)‌ اسفتاده كنيد',
+
+       // V
+       'valider' => 'معتبر كردن',
+       'version_html' => 'نسخه اچ.تي.ام.ال',
+       'version_texte' => 'نسخه متني.'
+);
+
+?>
index c085653..5610ec6 100755 (executable)
@@ -5,55 +5,56 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
-       // Z
-       'Z' => 'ZZzZZzzz',
-
        // C
        'config_info_enregistree' => 'La configuration du facteur a bien été enregistrée',
-       'configuration_adresse_envoi' => 'Configuration de l\'adresse d\'envoi',
+       'configuration_adresse_envoi' => 'Configuration de l’adresse d’envoi',
        'configuration_facteur' => 'Facteur',
        'configuration_mailer' => 'Configuration du mailer',
-       'configuration_smtp' => 'Choix de la méthode d\'envoi de mail',
-       'configuration_smtp_descriptif' => 'Si vous n\'êtes pas sûrs, choisissez la fonction mail de PHP.',
+       'configuration_smtp' => 'Choix de la méthode denvoi de mail',
+       'configuration_smtp_descriptif' => 'Si vous nêtes pas sûrs, choisissez la fonction mail de PHP.',
        'corps_email_de_test' => 'Ceci est un email de test accentué',
 
        // E
-       'email_test_envoye' => 'L\'email de test a correctement été envoyé. Si vous ne le recevez pas correctement, vérifiez la configuration de votre serveur ou contactez un administrateur du serveur.',
+       'email_envoye_par' => 'Envoyé par @site@',
+       'email_test_envoye' => 'L’email de test a correctement été envoyé. Si vous ne le recevez pas correctement, vérifiez la configuration de votre serveur ou contactez un administrateur du serveur.',
        'erreur' => 'Erreur',
-       'erreur_dans_log' => ' : consultez le fichier log pour plus de détails',
+       'erreur_dans_log' => ' : consultez le fichier log pour plus de détails',
        'erreur_generale' => 'Il y a une ou plusieurs erreurs de configuration. Veuillez vérifier le contenu du formulaire.',
-       'erreur_invalid_host' => 'Ce nom d\'hôte n\'est pas correct',
-       'erreur_invalid_port' => 'Ce numéro de port n\'est pas correct',
+       'erreur_invalid_host' => 'Ce nom d’hôte n’est pas correct',
+       'erreur_invalid_port' => 'Ce numéro de port nest pas correct',
 
        // F
-       'facteur_adresse_envoi_email' => 'Email :',
-       'facteur_adresse_envoi_nom' => 'Nom :',
-       'facteur_bcc' => 'Copie Cachée (BCC) :',
-       'facteur_cc' => 'Copie (CC) :',
-       'facteur_copies' => 'Copies :',
+       'facteur_adresse_envoi_email' => 'Email :',
+       'facteur_adresse_envoi_nom' => 'Nom :',
+       'facteur_bcc' => 'Copie Cachée (BCC) :',
+       'facteur_cc' => 'Copie (CC) :',
+       'facteur_copies' => 'Copies :',
        'facteur_copies_descriptif' => 'Un email sera envoyé en copie aux adresses définies. Une seule adresse en copie et/ou une seule adresse en copie cachée.',
        'facteur_filtre_accents' => 'Transformer les accents en leur entités html (utile pour Hotmail notamment).',
        'facteur_filtre_css' => 'Transformer les styles contenus entre <head> et </head> en des styles "en ligne", utile pour les webmails car les styles en ligne ont la priorité sur les styles externes.',
        'facteur_filtre_images' => 'Embarquer les images référencées dans les emails',
        'facteur_filtre_iso_8859' => 'Convertir en ISO-8859-1',
        'facteur_filtres' => 'Filtres',
-       'facteur_filtres_descriptif' => 'Des filtres peuvent être appliqués aux emails au moment de l\'envoi.',
-       'facteur_smtp_auth' => 'Requiert une authentification :',
+       'facteur_filtres_descriptif' => 'Des filtres peuvent être appliqués aux emails au moment de lenvoi.',
+       'facteur_smtp_auth' => 'Requiert une authentification :',
        'facteur_smtp_auth_non' => 'non',
        'facteur_smtp_auth_oui' => 'oui',
-       'facteur_smtp_host' => 'Hôte :',
-       'facteur_smtp_password' => 'Mot de passe :',
-       'facteur_smtp_port' => 'Port :',
-       'facteur_smtp_secure' => 'Connexion sécurisée :',
+       'facteur_smtp_host' => 'Hôte :',
+       'facteur_smtp_password' => 'Mot de passe :',
+       'facteur_smtp_port' => 'Port :',
+       'facteur_smtp_secure' => 'Connexion sécurisée :',
        'facteur_smtp_secure_non' => 'non',
        'facteur_smtp_secure_ssl' => 'SSL',
        'facteur_smtp_secure_tls' => 'TLS',
        'facteur_smtp_sender' => 'Retour des erreurs (optionnel)',
-       'facteur_smtp_sender_descriptif' => 'Définit dans l\'entête du mail l\'adresse email de retour des erreurs (ou Return-Path), et lors d\'un envoi via la méthode SMTP cela définit aussi l\'adresse de l\'envoyeur.',
-       'facteur_smtp_username' => 'Nom d\'utilisateur :',
+       'facteur_smtp_sender_descriptif' => 'Définit dans l’entête du mail l’adresse email de retour des erreurs (ou Return-Path), et lors d’un envoi via la méthode SMTP cela définit aussi l’adresse de l’envoyeur.',
+       'facteur_smtp_username' => 'Nom d’utilisateur :',
+
+       // M
+       'message_identite_email' => 'La configuration du plugin "facteur" surcharge cette adresse email pour l’envoi de courriels.',
 
        // N
-       'note_test_configuration' => 'Un email sera envoyé à l\'adresse d\'envoi définie (ou celle du webmaster).',
+       'note_test_configuration' => 'Un email sera envoyé à l’adresse d’envoi définie (ou celle du webmaster).',
 
        // P
        'personnaliser' => 'Personnaliser ces réglages',
@@ -64,7 +65,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // U
        'utiliser_mail' => 'Utiliser la fonction mail de PHP',
-       'utiliser_reglages_site' => 'Utiliser les réglages du site SPIP : le nom affiché sera le nom du site SPIP et l\'adresse email sera celle du webmaster',
+       'utiliser_reglages_site' => 'Utiliser les réglages du site SPIP : le nom affiché sera le nom du site SPIP et l’adresse email sera celle du webmaster',
        'utiliser_smtp' => 'Utiliser SMTP',
 
        // V
diff --git a/www/plugins/facteur/lang/facteur_fr_tu.php b/www/plugins/facteur/lang/facteur_fr_tu.php
new file mode 100644 (file)
index 0000000..eae3378
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/facteur?lang_cible=fr_tu
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'config_info_enregistree' => 'La configuration du facteur a bien été enregistrée',
+       'configuration_adresse_envoi' => 'Configuration de l’adresse d’envoi',
+       'configuration_facteur' => 'Facteur',
+       'configuration_mailer' => 'Configuration du mailer',
+       'configuration_smtp' => 'Choix de la méthode d’envoi de mail',
+       'configuration_smtp_descriptif' => 'Si tu n’es pas sûr, choisis la fonction mail de PHP.',
+       'corps_email_de_test' => 'Ceci est un email de test accentué',
+
+       // E
+       'email_envoye_par' => 'Envoyé par @site@',
+       'email_test_envoye' => 'L’email de test a correctement été envoyé. Si tu ne le reçois pas correctement, vérifie la configuration de ton serveur ou contacte un administrateur du serveur.',
+       'erreur' => 'Erreur',
+       'erreur_dans_log' => ' : consulte le fichier log pour plus de détails',
+       'erreur_generale' => 'Il y a une ou plusieurs erreurs de configuration. Vérifie le contenu du formulaire.',
+       'erreur_invalid_host' => 'Ce nom d’hôte n’est pas correct',
+       'erreur_invalid_port' => 'Ce numéro de port n’est pas correct',
+
+       // F
+       'facteur_adresse_envoi_email' => 'Email :',
+       'facteur_adresse_envoi_nom' => 'Nom :',
+       'facteur_bcc' => 'Copie Cachée (BCC) :',
+       'facteur_cc' => 'Copie (CC) :',
+       'facteur_copies' => 'Copies :',
+       'facteur_copies_descriptif' => 'Un email sera envoyé en copie aux adresses définies. Une seule adresse en copie et/ou une seule adresse en copie cachée.',
+       'facteur_filtre_accents' => 'Transformer les accents en leur entités html (utile pour Hotmail notamment).',
+       'facteur_filtre_css' => 'Transformer les styles contenus entre <head> et </head> en des styles "en ligne", utile pour les webmails car les styles en ligne ont la priorité sur les styles externes.',
+       'facteur_filtre_images' => 'Embarquer les images référencées dans les emails',
+       'facteur_filtre_iso_8859' => 'Convertir en ISO-8859-1',
+       'facteur_filtres' => 'Filtres',
+       'facteur_filtres_descriptif' => 'Des filtres peuvent être appliqués aux emails au moment de l’envoi.',
+       'facteur_smtp_auth' => 'Requiert une authentification :',
+       'facteur_smtp_auth_non' => 'non',
+       'facteur_smtp_auth_oui' => 'oui',
+       'facteur_smtp_host' => 'Hôte :',
+       'facteur_smtp_password' => 'Mot de passe :',
+       'facteur_smtp_port' => 'Port :',
+       'facteur_smtp_secure' => 'Connexion sécurisée :',
+       'facteur_smtp_secure_non' => 'non',
+       'facteur_smtp_secure_ssl' => 'SSL',
+       'facteur_smtp_secure_tls' => 'TLS',
+       'facteur_smtp_sender' => 'Retour des erreurs (optionnel)',
+       'facteur_smtp_sender_descriptif' => 'Définit dans l’entête du mail l’adresse email de retour des erreurs (ou Return-Path), et lors d’un envoi via la méthode SMTP cela définit aussi l’adresse de l’envoyeur.',
+       'facteur_smtp_username' => 'Nom d’utilisateur :',
+
+       // M
+       'message_identite_email' => 'La configuration du plugin "facteur" surcharge cette adresse email pour l’envoi de courriels.',
+
+       // N
+       'note_test_configuration' => 'Un email sera envoyé à l’adresse d’envoi définie (ou celle du webmaster).',
+
+       // P
+       'personnaliser' => 'Personnaliser ces réglages',
+
+       // T
+       'tester' => 'Tester',
+       'tester_la_configuration' => 'Tester la configuration',
+
+       // U
+       'utiliser_mail' => 'Utiliser la fonction mail de PHP',
+       'utiliser_reglages_site' => 'Utiliser les réglages du site SPIP : le nom affiché sera le nom du site SPIP et l’adresse email sera celle du webmaster',
+       'utiliser_smtp' => 'Utiliser SMTP',
+
+       // V
+       'valider' => 'Valider',
+       'version_html' => 'Version HTML.',
+       'version_texte' => 'Version texte.'
+);
+
+?>
diff --git a/www/plugins/facteur/lang/facteur_nl.php b/www/plugins/facteur/lang/facteur_nl.php
new file mode 100644 (file)
index 0000000..1d2c130
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/facteur?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'config_info_enregistree' => 'De configuratie is opgeslagen',
+       'configuration_adresse_envoi' => 'Configuratie van het verzendadres',
+       'configuration_facteur' => 'Postbode',
+       'configuration_mailer' => 'Configuratie van de mailer',
+       'configuration_smtp' => 'Verzendwijze',
+       'configuration_smtp_descriptif' => 'Kies, wanneer je twijfelt voor de functie PHP mail.',
+       'corps_email_de_test' => 'Dit is een geaccentueerd testbericht',
+
+       // E
+       'email_envoye_par' => 'Verzonden door @site@',
+       'email_test_envoye' => 'Het testbericht is verzonden. Ontvang je het niet juist, controleer dan de configuratie van de server.',
+       'erreur' => 'Fout',
+       'erreur_dans_log' => ': meer details in het logbestand',
+       'erreur_generale' => 'Een of meerdere fouten in de configuratie. Controleer de inhoud van dit formulier.',
+       'erreur_invalid_host' => 'Deze hostnaam is onjuist',
+       'erreur_invalid_port' => 'Dit poortnummer is onjuist',
+
+       // F
+       'facteur_adresse_envoi_email' => 'Email:',
+       'facteur_adresse_envoi_nom' => 'Naam:',
+       'facteur_bcc' => 'Verborgen (BCC) :',
+       'facteur_cc' => 'Kopie (CC) :',
+       'facteur_copies' => 'Kopieën:',
+       'facteur_copies_descriptif' => 'Deze adressen worden in kopie van de email gezet. Niet meer dan één adres in kopie en/of in verborgen kopie.',
+       'facteur_filtre_accents' => 'Zet tekens met accenten om in hun html-code (met name voor Hotmail).',
+       'facteur_filtre_css' => 'Zet de stijlen binnen &lt;head&gt; en &lt;/head&gt; om in "inline" stijlen, wat zinvol is voor webmails.',
+       'facteur_filtre_images' => 'Voeg afbeeldingen in',
+       'facteur_filtre_iso_8859' => 'Omzetten in ISO-8859-1',
+       'facteur_filtres' => 'Filters',
+       'facteur_filtres_descriptif' => 'Bij het verzenden kunnen bepaalde filters worden toegepast.',
+       'facteur_smtp_auth' => 'Vereist authentificatie:',
+       'facteur_smtp_auth_non' => 'nee',
+       'facteur_smtp_auth_oui' => 'ja',
+       'facteur_smtp_host' => 'Host:',
+       'facteur_smtp_password' => 'Wachtwoord:',
+       'facteur_smtp_port' => 'Poort:',
+       'facteur_smtp_secure' => 'Beveiligde verbinding:',
+       'facteur_smtp_secure_non' => 'nee',
+       'facteur_smtp_secure_ssl' => 'SSL',
+       'facteur_smtp_secure_tls' => 'TLS',
+       'facteur_smtp_sender' => 'Return-Path (optioneel)',
+       'facteur_smtp_sender_descriptif' => 'Geef het Return-Path voor de mail aan, bv voor feedback. In SMTP bepaalt het het emailadres van de verzender.',
+       'facteur_smtp_username' => 'Naam van de gebruiker:',
+
+       // M
+       'message_identite_email' => 'De configuratie van plugin "facteur" laadt dit e-mailadres voor het verzenden van mails.',
+
+       // N
+       'note_test_configuration' => 'Een mail wordt naar het aangegeven adres (of naar de webmaster) verzonden.',
+
+       // P
+       'personnaliser' => 'Personaliseren',
+
+       // T
+       'tester' => 'Testen',
+       'tester_la_configuration' => 'Configuratietest',
+
+       // U
+       'utiliser_mail' => 'Gebruik de PHP mail functie',
+       'utiliser_reglages_site' => 'Gebruik de instellingen van SPIP: de getoonde naam is die van de site en het adres dat van de webmaster',
+       'utiliser_smtp' => 'Gebruik SMTP',
+
+       // V
+       'valider' => 'Bevestigen',
+       'version_html' => 'HTML-versie.',
+       'version_texte' => 'Tekstversie.'
+);
+
+?>
index b292859..3e35b13 100644 (file)
@@ -7,9 +7,6 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
-       // Z
-       'Z' => 'ZZzZZzzz',
-
        // C
        'config_info_enregistree' => 'Nastavenia Poštára sa uložili správne',
        'configuration_adresse_envoi' => 'Nastavenie adresy odosielateľa',
@@ -20,6 +17,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'corps_email_de_test' => 'Toto je testovací e-mail s diakritikou',
 
        // E
+       'email_envoye_par' => 'Odoslané z @site@',
        'email_test_envoye' => 'Testovací e-mail bol úspešne odoslaný. Ak ho nedostanete, skontrolujte nastavenia svojho servera alebo sa obráťte na administrátora servera.',
        'erreur' => 'Chyba',
        'erreur_dans_log' => ' : viac podrobností nájdete v súbore log',
@@ -54,6 +52,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'facteur_smtp_sender_descriptif' => 'Zadané v hlavičke návratnej e-mailovej adresy pri chybe (alebo Return-Path) a pri jej odoslaní metódou SMTP je aj adresou odosielateľa.',
        'facteur_smtp_username' => 'Používateľské meno:',
 
+       // M
+       'message_identite_email' => 'Nastavenia zásuvného modulu "Poštár" predvolili túto e-mailovú adresu na posielanie e-mailov.',
+
        // N
        'note_test_configuration' => 'E-mail bude odoslaný na uvedenú adresu (alebo webmasterovi).',
 
index 17c6723..0902008 100644 (file)
@@ -1,10 +1,23 @@
 <traduction module="paquet-facteur" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/facteur/trunk/lang/" reference="fr">
-       <langue code="en" />
-       <langue code="es" url="http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=es">
-               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       <langue code="de" url="http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=de" total="3" traduits="3" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
        </langue>
-       <langue code="fr" />
-       <langue code="sk" url="http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=sk">
+       <langue code="en" url="http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=en" total="3" traduits="3" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+       </langue>
+       <langue code="es" url="http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=es" total="3" traduits="3" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel-s-bujaldon" />
+       </langue>
+       <langue code="fr" url="http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=fr" total="3" traduits="3" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+       </langue>
+       <langue code="fr_tu" url="http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=fr_tu" total="3" traduits="3" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Cerf" lien="http://trad.spip.net/auteur/cerf" />
+       </langue>
+       <langue code="nl" url="http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=nl" total="3" traduits="3" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Hanjo" lien="http://trad.spip.net/auteur/hanjo" />
+       </langue>
+       <langue code="ru" url="http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=ru" total="3" traduits="3" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Serge Markitanenko" lien="http://trad.spip.net/auteur/serge-markitanenko" />
+       </langue>
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=sk" total="3" traduits="3" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
                <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
        </langue>
 </traduction>
diff --git a/www/plugins/facteur/lang/paquet-facteur_de.php b/www/plugins/facteur/lang/paquet-facteur_de.php
new file mode 100755 (executable)
index 0000000..1ccd077
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // F
+       'facteur_description' => 'Der Briefträger befördert Emails im HTML-Format, im Nur-Text-Format oder in beiden, egal ob per SMTP oder nicht.',
+       'facteur_nom' => 'Briefräger',
+       'facteur_slogan' => 'Er befördert ihre Emails'
+);
+
+?>
index 332b6a3..72225ac 100644 (file)
@@ -6,7 +6,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // F
-       'facteur_description' => 'Facteur s\'occupe de la distribution des courriels au format HTML, texte ou mixte ; via SMTP ou non',
+       'facteur_description' => 'Facteur s’occupe de la distribution des courriels au format HTML, texte ou mixte ; via SMTP ou non',
        'facteur_nom' => 'Facteur',
        'facteur_slogan' => 'Il distribue vos courriels'
 );
diff --git a/www/plugins/facteur/lang/paquet-facteur_fr_tu.php b/www/plugins/facteur/lang/paquet-facteur_fr_tu.php
new file mode 100644 (file)
index 0000000..5e1b76a
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=fr_tu
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // F
+       'facteur_description' => 'Facteur s’occupe de la distribution des courriels au format HTML, texte ou mixte ; via SMTP ou non',
+       'facteur_nom' => 'Facteur',
+       'facteur_slogan' => 'Il distribue tes courriels'
+);
+
+?>
diff --git a/www/plugins/facteur/lang/paquet-facteur_nl.php b/www/plugins/facteur/lang/paquet-facteur_nl.php
new file mode 100644 (file)
index 0000000..724cb17
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // F
+       'facteur_description' => 'Postbode (Facteur) houdt zich bezig met de distributie van email in HTML, tekst of gemengd formaat; al dan niet via SMTP',
+       'facteur_nom' => 'Postbode',
+       'facteur_slogan' => 'Hij verzendt uw mail'
+);
+
+?>
diff --git a/www/plugins/facteur/lang/paquet-facteur_ru.php b/www/plugins/facteur/lang/paquet-facteur_ru.php
new file mode 100644 (file)
index 0000000..3c675e7
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-facteur?lang_cible=ru
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // F
+       'facteur_description' => 'Плагин отправляет письма в текстовом, HTML или смешанном формате; при помощи SMTP или функции mail',
+       'facteur_nom' => 'Почтальон (Facteur)',
+       'facteur_slogan' => 'Он отправляет письма'
+);
+
+?>
diff --git a/www/plugins/facteur/lib/markdownify/LICENSE_LGPL.txt b/www/plugins/facteur/lib/markdownify/LICENSE_LGPL.txt
new file mode 100644 (file)
index 0000000..5ab7695
--- /dev/null
@@ -0,0 +1,504 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                      Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+\f
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+\f
+                 GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+\f
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                           NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/www/plugins/facteur/lib/markdownify/markdownify.php b/www/plugins/facteur/lib/markdownify/markdownify.php
new file mode 100644 (file)
index 0000000..6dd29f8
--- /dev/null
@@ -0,0 +1,1192 @@
+<?php
+/**
+ * Markdownify converts HTML Markup to [Markdown][1] (by [John Gruber][2]. It
+ * also supports [Markdown Extra][3] by [Michel Fortin][4] via Markdownify_Extra.
+ *
+ * It all started as `html2text.php` - a port of [Aaron Swartz'][5] [`html2text.py`][6] - but
+ * got a long way since. This is far more than a mere port now!
+ * Starting with version 2.0.0 this is a complete rewrite and cannot be
+ * compared to Aaron Swatz' `html2text.py` anylonger. I'm now using a HTML parser
+ * (see `parsehtml.php` which I also wrote) which makes most of the evil
+ * RegEx magic go away and additionally it gives a much cleaner class
+ * structure. Also notably is the fact that I now try to prevent regressions by
+ * utilizing testcases of Michel Fortin's [MDTest][7].
+ *
+ * [1]: http://daringfireball.com/projects/markdown
+ * [2]: http://daringfireball.com/
+ * [3]: http://www.michelf.com/projects/php-markdown/extra/
+ * [4]: http://www.michelf.com/
+ * [5]: http://www.aaronsw.com/
+ * [6]: http://www.aaronsw.com/2002/html2text/
+ * [7]: http://article.gmane.org/gmane.text.markdown.general/2540
+ *
+ * @version 2.0.0 alpha
+ * @author Milian Wolff (<mail@milianw.de>, <http://milianw.de>)
+ * @license LGPL, see LICENSE_LGPL.txt and the summary below
+ * @copyright (C) 2007  Milian Wolff
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/**
+ * HTML Parser, see http://sf.net/projects/parseHTML
+ */
+require_once dirname(__FILE__) . '/parsehtml/parsehtml.php';
+
+/**
+ * default configuration
+ */
+define('MDFY_LINKS_EACH_PARAGRAPH', false);
+define('MDFY_BODYWIDTH', false);
+define('MDFY_KEEPHTML', true);
+
+/**
+ * HTML to Markdown converter class
+ */
+class Markdownify {
+  /**
+   * html parser object
+   *
+   * @var parseHTML
+   */
+  var $parser;
+  /**
+   * markdown output
+   *
+   * @var string
+   */
+  var $output;
+  /**
+   * stack with tags which where not converted to html
+   *
+   * @var array<string>
+   */
+  var $notConverted = array();
+  /**
+   * skip conversion to markdown
+   *
+   * @var bool
+   */
+  var $skipConversion = false;
+  /* options */
+  /**
+   * keep html tags which cannot be converted to markdown
+   *
+   * @var bool
+   */
+  var $keepHTML = false;
+  /**
+   * wrap output, set to 0 to skip wrapping
+   *
+   * @var int
+   */
+  var $bodyWidth = 0;
+  /**
+   * minimum body width
+   *
+   * @var int
+   */
+  var $minBodyWidth = 25;
+  /**
+   * display links after each paragraph
+   *
+   * @var bool
+   */
+  var $linksAfterEachParagraph = false;
+  /**
+   * constructor, set options, setup parser
+   *
+   * @param bool $linksAfterEachParagraph wether or not to flush stacked links after each paragraph
+   *             defaults to false
+   * @param int $bodyWidth wether or not to wrap the output to the given width
+   *             defaults to false
+   * @param bool $keepHTML wether to keep non markdownable HTML or to discard it
+   *             defaults to true (HTML will be kept)
+   * @return void
+   */
+  function Markdownify($linksAfterEachParagraph = MDFY_LINKS_EACH_PARAGRAPH, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML) {
+    $this->linksAfterEachParagraph = $linksAfterEachParagraph;
+    $this->keepHTML = $keepHTML;
+
+    if ($bodyWidth > $this->minBodyWidth) {
+      $this->bodyWidth = intval($bodyWidth);
+    } else {
+      $this->bodyWidth = false;
+    }
+
+    $this->parser = new parseHTML;
+    $this->parser->noTagsInCode = true;
+
+    # we don't have to do this every time
+    $search = array();
+    $replace = array();
+    foreach ($this->escapeInText as $s => $r) {
+      array_push($search, '#(?<!\\\)'.$s.'#U');
+      array_push($replace, $r);
+    }
+    $this->escapeInText = array(
+      'search' => $search,
+      'replace' => $replace
+    );
+  }
+  /**
+   * parse a HTML string
+   *
+   * @param string $html
+   * @return string markdown formatted
+   */
+  function parseString($html) {
+    $this->parser->html = $html;
+    $this->parse();
+    return $this->output;
+  }
+  /**
+   * tags with elements which can be handled by markdown
+   *
+   * @var array<string>
+   */
+  var $isMarkdownable = array(
+    'p' => array(),
+    'ul' => array(),
+    'ol' => array(),
+    'li' => array(),
+    'br' => array(),
+    'blockquote' => array(),
+    'code' => array(),
+    'pre' => array(),
+    'a' => array(
+      'href' => 'required',
+      'title' => 'optional',
+    ),
+    'strong' => array(),
+    'b' => array(),
+    'em' => array(),
+    'i' => array(),
+    'img' => array(
+      'src' => 'required',
+      'alt' => 'optional',
+      'title' => 'optional',
+    ),
+    'h1' => array(),
+    'h2' => array(),
+    'h3' => array(),
+    'h4' => array(),
+    'h5' => array(),
+    'h6' => array(),
+    'hr' => array(),
+  );
+  /**
+   * html tags to be ignored (contents will be parsed)
+   *
+   * @var array<string>
+   */
+  var $ignore = array(
+    'html',
+    'body',
+  );
+  /**
+   * html tags to be dropped (contents will not be parsed!)
+   *
+   * @var array<string>
+   */
+  var $drop = array(
+    'script',
+    'head',
+    'style',
+    'form',
+    'area',
+    'object',
+    'param',
+    'iframe',
+  );
+  /**
+   * Markdown indents which could be wrapped
+   * @note: use strings in regex format
+   *
+   * @var array<string>
+   */
+  var $wrappableIndents = array(
+    '\*   ', # ul
+    '\d.  ', # ol
+    '\d\d. ', # ol
+    '> ', # blockquote
+    '', # p
+  );
+  /**
+   * list of chars which have to be escaped in normal text
+   * @note: use strings in regex format
+   *
+   * @var array
+   *
+   * TODO: what's with block chars / sequences at the beginning of a block?
+   */
+  var $escapeInText = array(
+    '([-*_])([ ]{0,2}\1){2,}' => '\\\\$0|', # hr
+    '\*\*([^*\s]+)\*\*' => '\*\*$1\*\*', # strong
+    '\*([^*\s]+)\*' => '\*$1\*', # em
+    '__(?! |_)(.+)(?!<_| )__' => '\_\_$1\_\_', # em
+    '_(?! |_)(.+)(?!<_| )_' => '\_$1\_', # em
+    '`(.+)`' => '\`$1\`', # code
+    '\[(.+)\](\s*\()' => '\[$1\]$2', # links: [text] (url) => [text\] (url)
+    '\[(.+)\](\s*)\[(.*)\]' => '\[$1\]$2\[$3\]', # links: [text][id] => [text\][id\]
+  );
+  /**
+   * wether last processed node was a block tag or not
+   *
+   * @var bool
+   */
+  var $lastWasBlockTag = false;
+  /**
+   * name of last closed tag
+   *
+   * @var string
+   */
+  var $lastClosedTag = '';
+  /**
+   * iterate through the nodes and decide what we
+   * shall do with the current node
+   *
+   * @param void
+   * @return void
+   */
+  function parse() {
+    $this->output = '';
+    # drop tags
+    $this->parser->html = preg_replace('#<('.implode('|', $this->drop).')[^>]*>.*</\\1>#sU', '', $this->parser->html);
+    while ($this->parser->nextNode()) {
+      switch ($this->parser->nodeType) {
+        case 'doctype':
+          break;
+        case 'pi':
+        case 'comment':
+          if ($this->keepHTML) {
+            $this->flushLinebreaks();
+            $this->out($this->parser->node);
+            $this->setLineBreaks(2);
+          }
+          # else drop
+          break;
+        case 'text':
+          $this->handleText();
+          break;
+        case 'tag':
+          if (in_array($this->parser->tagName, $this->ignore)) {
+            break;
+          }
+          if ($this->parser->isStartTag) {
+            $this->flushLinebreaks();
+          }
+          if ($this->skipConversion) {
+            $this->isMarkdownable(); # update notConverted
+            $this->handleTagToText();
+            continue;
+          }
+          if (!$this->parser->keepWhitespace && $this->parser->isBlockElement && $this->parser->isStartTag) {
+            $this->parser->html = ltrim($this->parser->html);
+          }
+          if ($this->isMarkdownable()) {
+            if ($this->parser->isBlockElement && $this->parser->isStartTag && !$this->lastWasBlockTag && !empty($this->output)) {
+              if (!empty($this->buffer)) {
+                $str =& $this->buffer[count($this->buffer) -1];
+              } else {
+                $str =& $this->output;
+              }
+              if (substr($str, -strlen($this->indent)-1) != "\n".$this->indent) {
+                $str .= "\n".$this->indent;
+              }
+            }
+            $func = 'handleTag_'.$this->parser->tagName;
+            $this->$func();
+            if ($this->linksAfterEachParagraph && $this->parser->isBlockElement && !$this->parser->isStartTag && empty($this->parser->openTags)) {
+              $this->flushStacked();
+            }
+            if (!$this->parser->isStartTag) {
+              $this->lastClosedTag = $this->parser->tagName;
+            }
+          } else {
+            $this->handleTagToText();
+            $this->lastClosedTag = '';
+          }
+          break;
+        default:
+          trigger_error('invalid node type', E_USER_ERROR);
+          break;
+      }
+      $this->lastWasBlockTag = $this->parser->nodeType == 'tag' && $this->parser->isStartTag && $this->parser->isBlockElement;
+    }
+    if (!empty($this->buffer)) {
+      trigger_error('buffer was not flushed, this is a bug. please report!', E_USER_WARNING);
+      while (!empty($this->buffer)) {
+        $this->out($this->unbuffer());
+      }
+    }
+    ### cleanup
+    $this->output = rtrim(str_replace('&amp;', '&', str_replace('&lt;', '<', str_replace('&gt;', '>', $this->output))));
+    # end parsing, flush stacked tags
+    $this->flushStacked();
+    $this->stack = array();
+  }
+  /**
+   * check if current tag can be converted to Markdown
+   *
+   * @param void
+   * @return bool
+   */
+  function isMarkdownable() {
+    if (!isset($this->isMarkdownable[$this->parser->tagName])) {
+      # simply not markdownable
+      return false;
+    }
+    if ($this->parser->isStartTag) {
+      $return = true;
+      if ($this->keepHTML) {
+        $diff = array_diff(array_keys($this->parser->tagAttributes), array_keys($this->isMarkdownable[$this->parser->tagName]));
+        if (!empty($diff)) {
+          # non markdownable attributes given
+          $return = false;
+        }
+      }
+      if ($return) {
+        foreach ($this->isMarkdownable[$this->parser->tagName] as $attr => $type) {
+          if ($type == 'required' && !isset($this->parser->tagAttributes[$attr])) {
+            # required markdown attribute not given
+            $return = false;
+            break;
+          }
+        }
+      }
+      if (!$return) {
+        array_push($this->notConverted, $this->parser->tagName.'::'.implode('/', $this->parser->openTags));
+      }
+      return $return;
+    } else {
+      if (!empty($this->notConverted) && end($this->notConverted) === $this->parser->tagName.'::'.implode('/', $this->parser->openTags)) {
+        array_pop($this->notConverted);
+        return false;
+      }
+      return true;
+    }
+  }
+  /**
+   * output all stacked tags
+   *
+   * @param void
+   * @return void
+   */
+  function flushStacked() {
+    # links
+    foreach ($this->stack as $tag => $a) {
+      if (!empty($a)) {
+        call_user_func(array(&$this, 'flushStacked_'.$tag));
+      }
+    }
+  }
+  /**
+   * output link references (e.g. [1]: http://example.com "title");
+   *
+   * @param void
+   * @return void
+   */
+  function flushStacked_a() {
+    $out = false;
+    foreach ($this->stack['a'] as $k => $tag) {
+      if (!isset($tag['unstacked'])) {
+        if (!$out) {
+          $out = true;
+          $this->out("\n\n", true);
+        } else {
+          $this->out("\n", true);
+        }
+        $this->out(' ['.$tag['linkID'].']: '.$tag['href'].(isset($tag['title']) ? ' "'.$tag['title'].'"' : ''), true);
+        $tag['unstacked'] = true;
+        $this->stack['a'][$k] = $tag;
+      }
+    }
+  }
+  /**
+   * flush enqued linebreaks
+   *
+   * @param void
+   * @return void
+   */
+  function flushLinebreaks() {
+    if ($this->lineBreaks && !empty($this->output)) {
+      $this->out(str_repeat("\n".$this->indent, $this->lineBreaks), true);
+    }
+    $this->lineBreaks = 0;
+  }
+  /**
+   * handle non Markdownable tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTagToText() {
+    if (!$this->keepHTML) {
+      if (!$this->parser->isStartTag && $this->parser->isBlockElement) {
+        $this->setLineBreaks(2);
+      }
+    } else {
+      # dont convert to markdown inside this tag
+      /** TODO: markdown extra **/
+      if (!$this->parser->isEmptyTag) {
+        if ($this->parser->isStartTag) {
+          if (!$this->skipConversion) {
+            $this->skipConversion = $this->parser->tagName.'::'.implode('/', $this->parser->openTags);
+          }
+        } else {
+          if ($this->skipConversion == $this->parser->tagName.'::'.implode('/', $this->parser->openTags)) {
+            $this->skipConversion = false;
+          }
+        }
+      }
+
+      if ($this->parser->isBlockElement) {
+        if ($this->parser->isStartTag) {
+          if (in_array($this->parent(), array('ins', 'del'))) {
+            # looks like ins or del are block elements now
+            $this->out("\n", true);
+            $this->indent('  ');
+          }
+          if ($this->parser->tagName != 'pre') {
+            $this->out($this->parser->node."\n".$this->indent);
+            if (!$this->parser->isEmptyTag) {
+              $this->indent('  ');
+            } else {
+              $this->setLineBreaks(1);
+            }
+            $this->parser->html = ltrim($this->parser->html);
+          } else {
+            # don't indent inside <pre> tags
+            $this->out($this->parser->node);
+            static $indent;
+            $indent =  $this->indent;
+            $this->indent = '';
+          }
+        } else {
+          if (!$this->parser->keepWhitespace) {
+            $this->output = rtrim($this->output);
+          }
+          if ($this->parser->tagName != 'pre') {
+            $this->indent('  ');
+            $this->out("\n".$this->indent.$this->parser->node);
+          } else {
+            # reset indentation
+            $this->out($this->parser->node);
+            static $indent;
+            $this->indent = $indent;
+          }
+
+          if (in_array($this->parent(), array('ins', 'del'))) {
+            # ins or del was block element
+            $this->out("\n");
+            $this->indent('  ');
+          }
+          if ($this->parser->tagName == 'li') {
+            $this->setLineBreaks(1);
+          } else {
+            $this->setLineBreaks(2);
+          }
+        }
+      } else {
+        $this->out($this->parser->node);
+      }
+      if (in_array($this->parser->tagName, array('code', 'pre'))) {
+        if ($this->parser->isStartTag) {
+          $this->buffer();
+        } else {
+          # add stuff so cleanup just reverses this
+          $this->out(str_replace('&lt;', '&amp;lt;', str_replace('&gt;', '&amp;gt;', $this->unbuffer())));
+        }
+      }
+    }
+  }
+  /**
+   * handle plain text
+   *
+   * @param void
+   * @return void
+   */
+  function handleText() {
+    if ($this->hasParent('pre') && strpos($this->parser->node, "\n") !== false) {
+      $this->parser->node = str_replace("\n", "\n".$this->indent, $this->parser->node);
+    }
+    if (!$this->hasParent('code') && !$this->hasParent('pre')) {
+      # entity decode
+      $this->parser->node = $this->decode($this->parser->node);
+      if (!$this->skipConversion) {
+        # escape some chars in normal Text
+        $this->parser->node = preg_replace($this->escapeInText['search'], $this->escapeInText['replace'], $this->parser->node);
+      }
+    } else {
+      $this->parser->node = str_replace(array('&quot;', '&apos'), array('"', '\''), $this->parser->node);
+    }
+    $this->out($this->parser->node);
+    $this->lastClosedTag = '';
+  }
+  /**
+   * handle <em> and <i> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_em() {
+    $this->out('*', true);
+  }
+  function handleTag_i() {
+    $this->handleTag_em();
+  }
+  /**
+   * handle <strong> and <b> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_strong() {
+    $this->out('**', true);
+  }
+  function handleTag_b() {
+    $this->handleTag_strong();
+  }
+  /**
+   * handle <h1> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_h1() {
+    $this->handleHeader(1);
+  }
+  /**
+   * handle <h2> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_h2() {
+    $this->handleHeader(2);
+  }
+  /**
+   * handle <h3> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_h3() {
+    $this->handleHeader(3);
+  }
+  /**
+   * handle <h4> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_h4() {
+    $this->handleHeader(4);
+  }
+  /**
+   * handle <h5> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_h5() {
+    $this->handleHeader(5);
+  }
+  /**
+   * handle <h6> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_h6() {
+    $this->handleHeader(6);
+  }
+  /**
+   * number of line breaks before next inline output
+   */
+  var $lineBreaks = 0;
+  /**
+   * handle header tags (<h1> - <h6>)
+   *
+   * @param int $level 1-6
+   * @return void
+   */
+  function handleHeader($level) {
+    if ($this->parser->isStartTag) {
+      $this->out(str_repeat('#', $level).' ', true);
+    } else {
+      $this->setLineBreaks(2);
+    }
+  }
+  /**
+   * handle <p> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_p() {
+    if (!$this->parser->isStartTag) {
+      $this->setLineBreaks(2);
+    }
+  }
+  /**
+   * handle <a> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_a() {
+    if ($this->parser->isStartTag) {
+      $this->buffer();
+      if (isset($this->parser->tagAttributes['title'])) {
+        $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
+      } else {
+        $this->parser->tagAttributes['title'] = null;
+      }
+      $this->parser->tagAttributes['href'] = $this->decode(trim($this->parser->tagAttributes['href']));
+      $this->stack();
+    } else {
+      $tag = $this->unstack();
+      $buffer = $this->unbuffer();
+
+      if (empty($tag['href']) && empty($tag['title'])) {
+        # empty links... testcase mania, who would possibly do anything like that?!
+        $this->out('['.$buffer.']()', true);
+        return;
+      }
+
+      if ($buffer == $tag['href'] && empty($tag['title'])) {
+        # <http://example.com>
+        $this->out('<'.$buffer.'>', true);
+        return;
+      }
+
+      $bufferDecoded = $this->decode(trim($buffer));
+      if (substr($tag['href'], 0, 7) == 'mailto:' && 'mailto:'.$bufferDecoded == $tag['href']) {
+        if (is_null($tag['title'])) {
+          # <mail@example.com>
+          $this->out('<'.$bufferDecoded.'>', true);
+          return;
+        }
+        # [mail@example.com][1]
+        # ...
+        #  [1]: mailto:mail@example.com Title
+        $tag['href'] = 'mailto:'.$bufferDecoded;
+      }
+           if ($this->linksAfterEachParagraph!=='inline'){
+             # [This link][id]
+             foreach ($this->stack['a'] as $tag2) {
+               if ($tag2['href'] == $tag['href'] && $tag2['title'] === $tag['title']) {
+                 $tag['linkID'] = $tag2['linkID'];
+                 break;
+               }
+             }
+             if (!isset($tag['linkID'])) {
+               $tag['linkID'] = count($this->stack['a']) + 1;
+               array_push($this->stack['a'], $tag);
+             }
+
+             $this->out('['.trim($buffer).']['.$tag['linkID'].']', true);
+           }
+           else {
+                   # [This link|title](url)
+                   if ($tag['title'])
+                           $buffer.="|".$tag['title'];
+                   $this->out('['.trim($buffer).']('.$tag['href'].')', true);
+           }
+    }
+  }
+  /**
+   * handle <img /> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_img() {
+    if (!$this->parser->isStartTag) {
+      return; # just to be sure this is really an empty tag...
+    }
+
+    if (isset($this->parser->tagAttributes['title'])) {
+      $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
+    } else {
+      $this->parser->tagAttributes['title'] = null;
+    }
+    if (isset($this->parser->tagAttributes['alt'])) {
+      $this->parser->tagAttributes['alt'] = $this->decode($this->parser->tagAttributes['alt']);
+    } else {
+      $this->parser->tagAttributes['alt'] = null;
+    }
+
+    if (empty($this->parser->tagAttributes['src'])) {
+      # support for "empty" images... dunno if this is really needed
+      # but there are some testcases which do that...
+      if (!empty($this->parser->tagAttributes['title'])) {
+        $this->parser->tagAttributes['title'] = ' '.$this->parser->tagAttributes['title'].' ';
+      }
+      $this->out('!['.$this->parser->tagAttributes['alt'].']('.$this->parser->tagAttributes['title'].')', true);
+      return;
+    } else {
+      $this->parser->tagAttributes['src'] = $this->decode($this->parser->tagAttributes['src']);
+    }
+
+    # [This link][id]
+    $link_id = false;
+    if (!empty($this->stack['a'])) {
+      foreach ($this->stack['a'] as $tag) {
+        if ($tag['href'] == $this->parser->tagAttributes['src']
+            && $tag['title'] === $this->parser->tagAttributes['title']) {
+          $link_id = $tag['linkID'];
+          break;
+        }
+      }
+    } else {
+      $this->stack['a'] = array();
+    }
+    if (!$link_id) {
+      $link_id = count($this->stack['a']) + 1;
+      $tag = array(
+        'href' => $this->parser->tagAttributes['src'],
+        'linkID' => $link_id,
+        'title' => $this->parser->tagAttributes['title']
+      );
+      array_push($this->stack['a'], $tag);
+    }
+
+    $this->out('!['.$this->parser->tagAttributes['alt'].']['.$link_id.']', true);
+  }
+  /**
+   * handle <code> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_code() {
+    if ($this->hasParent('pre')) {
+      # ignore code blocks inside <pre>
+      return;
+    }
+    if ($this->parser->isStartTag) {
+      $this->buffer();
+    } else {
+      $buffer = $this->unbuffer();
+      # use as many backticks as needed
+      preg_match_all('#`+#', $buffer, $matches);
+      if (!empty($matches[0])) {
+        rsort($matches[0]);
+
+        $ticks = '`';
+        while (true) {
+          if (!in_array($ticks, $matches[0])) {
+            break;
+          }
+          $ticks .= '`';
+        }
+      } else {
+        $ticks = '`';
+      }
+      if ($buffer[0] == '`' || substr($buffer, -1) == '`') {
+        $buffer = ' '.$buffer.' ';
+      }
+      $this->out($ticks.$buffer.$ticks, true);
+    }
+  }
+  /**
+   * handle <pre> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_pre() {
+    if ($this->keepHTML && $this->parser->isStartTag) {
+      # check if a simple <code> follows
+      if (!preg_match('#^\s*<code\s*>#Us', $this->parser->html)) {
+        # this is no standard markdown code block
+        $this->handleTagToText();
+        return;
+      }
+    }
+    $this->indent('    ');
+    if (!$this->parser->isStartTag) {
+      $this->setLineBreaks(2);
+    } else {
+      $this->parser->html = ltrim($this->parser->html);
+    }
+  }
+  /**
+   * handle <blockquote> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_blockquote() {
+    $this->indent('> ');
+  }
+  /**
+   * handle <ul> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_ul() {
+    if ($this->parser->isStartTag) {
+      $this->stack();
+      if (!$this->keepHTML && $this->lastClosedTag == $this->parser->tagName) {
+        $this->out("\n".$this->indent.'<!-- -->'."\n".$this->indent."\n".$this->indent);
+      }
+    } else {
+      $this->unstack();
+      if ($this->parent() != 'li' || preg_match('#^\s*(</li\s*>\s*<li\s*>\s*)?<(p|blockquote)\s*>#sU', $this->parser->html)) {
+        # dont make Markdown add unneeded paragraphs
+        $this->setLineBreaks(2);
+      }
+    }
+  }
+  /**
+   * handle <ul> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_ol() {
+    # same as above
+    $this->parser->tagAttributes['num'] = 0;
+    $this->handleTag_ul();
+  }
+  /**
+   * handle <li> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_li() {
+    if ($this->parent() == 'ol') {
+      $parent =& $this->getStacked('ol');
+      if ($this->parser->isStartTag) {
+        $parent['num']++;
+        $this->out($parent['num'].'.'.str_repeat(' ', 3 - strlen($parent['num'])), true);
+      }
+      $this->indent('    ', false);
+    } else {
+      if ($this->parser->isStartTag) {
+        $this->out('*   ', true);
+      }
+      $this->indent('    ', false);
+    }
+    if (!$this->parser->isStartTag) {
+      $this->setLineBreaks(1);
+    }
+  }
+  /**
+   * handle <hr /> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_hr() {
+    if (!$this->parser->isStartTag) {
+      return; # just to be sure this really is an empty tag
+    }
+    $this->out('* * *', true);
+    $this->setLineBreaks(2);
+  }
+  /**
+   * handle <br /> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_br() {
+    $this->out("  \n".$this->indent, true);
+    $this->parser->html = ltrim($this->parser->html);
+  }
+  /**
+   * node stack, e.g. for <a> and <abbr> tags
+   *
+   * @var array<array>
+   */
+  var $stack = array();
+  /**
+   * add current node to the stack
+   * this only stores the attributes
+   *
+   * @param void
+   * @return void
+   */
+  function stack() {
+    if (!isset($this->stack[$this->parser->tagName])) {
+      $this->stack[$this->parser->tagName] = array();
+    }
+    array_push($this->stack[$this->parser->tagName], $this->parser->tagAttributes);
+  }
+  /**
+   * remove current tag from stack
+   *
+   * @param void
+   * @return array
+   */
+  function unstack() {
+    if (!isset($this->stack[$this->parser->tagName]) || !is_array($this->stack[$this->parser->tagName])) {
+      trigger_error('Trying to unstack from empty stack. This must not happen.', E_USER_ERROR);
+    }
+    return array_pop($this->stack[$this->parser->tagName]);
+  }
+  /**
+   * get last stacked element of type $tagName
+   *
+   * @param string $tagName
+   * @return array
+   */
+  function & getStacked($tagName) {
+    // no end() so it can be referenced
+    return $this->stack[$tagName][count($this->stack[$tagName])-1];
+  }
+  /**
+   * set number of line breaks before next start tag
+   *
+   * @param int $number
+   * @return void
+   */
+  function setLineBreaks($number) {
+    if ($this->lineBreaks < $number) {
+      $this->lineBreaks = $number;
+    }
+  }
+  /**
+   * stores current buffers
+   *
+   * @var array<string>
+   */
+  var $buffer = array();
+  /**
+   * buffer next parser output until unbuffer() is called
+   *
+   * @param void
+   * @return void
+   */
+  function buffer() {
+    array_push($this->buffer, '');
+  }
+  /**
+   * end current buffer and return buffered output
+   *
+   * @param void
+   * @return string
+   */
+  function unbuffer() {
+    return array_pop($this->buffer);
+  }
+  /**
+   * append string to the correct var, either
+   * directly to $this->output or to the current
+   * buffers
+   *
+   * @param string $put
+   * @return void
+   */
+  function out($put, $nowrap = false) {
+    if (empty($put)) {
+      return;
+    }
+    if (!empty($this->buffer)) {
+      $this->buffer[count($this->buffer) - 1] .= $put;
+    } else {
+      if ($this->bodyWidth && !$this->parser->keepWhitespace) { # wrap lines
+        // get last line
+        $pos = strrpos($this->output, "\n");
+        if ($pos === false) {
+          $line = $this->output;
+        } else {
+          $line = substr($this->output, $pos);
+        }
+
+        if ($nowrap) {
+          if ($put[0] != "\n" && $this->strlen($line) + $this->strlen($put) > $this->bodyWidth) {
+            $this->output .= "\n".$this->indent.$put;
+          } else {
+            $this->output .= $put;
+          }
+          return;
+        } else {
+          $put .= "\n"; # make sure we get all lines in the while below
+          $lineLen = $this->strlen($line);
+          while ($pos = strpos($put, "\n")) {
+            $putLine = substr($put, 0, $pos+1);
+            $put = substr($put, $pos+1);
+            $putLen = $this->strlen($putLine);
+            if ($lineLen + $putLen < $this->bodyWidth) {
+              $this->output .= $putLine;
+              $lineLen = $putLen;
+            } else {
+              $split = preg_split('#^(.{0,'.($this->bodyWidth - $lineLen).'})\b#', $putLine, 2, PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_DELIM_CAPTURE);
+              $this->output .= rtrim($split[1][0])."\n".$this->indent.$this->wordwrap(ltrim($split[2][0]), $this->bodyWidth, "\n".$this->indent, false);
+            }
+          }
+          $this->output = substr($this->output, 0, -1);
+          return;
+        }
+      } else {
+        $this->output .= $put;
+      }
+    }
+  }
+  /**
+   * current indentation
+   *
+   * @var string
+   */
+  var $indent = '';
+  /**
+   * indent next output (start tag) or unindent (end tag)
+   *
+   * @param string $str indentation
+   * @param bool $output add indendation to output
+   * @return void
+   */
+  function indent($str, $output = true) {
+    if ($this->parser->isStartTag) {
+      $this->indent .= $str;
+      if ($output) {
+        $this->out($str, true);
+      }
+    } else {
+      $this->indent = substr($this->indent, 0, -strlen($str));
+    }
+  }
+  /**
+   * decode email addresses
+   *
+   * @author derernst@gmx.ch <http://www.php.net/manual/en/function.html-entity-decode.php#68536>
+   * @author Milian Wolff <http://milianw.de>
+   */
+  function decode($text, $quote_style = ENT_QUOTES) {
+    if (version_compare(PHP_VERSION, '5', '>=')) {
+      # UTF-8 is only supported in PHP 5.x.x and above
+      $text = html_entity_decode($text, $quote_style, 'UTF-8');
+    } else {
+      if (function_exists('html_entity_decode')) {
+        $text = html_entity_decode($text, $quote_style, 'ISO-8859-1');
+      } else {
+        static $trans_tbl;
+        if (!isset($trans_tbl)) {
+          $trans_tbl = array_flip(get_html_translation_table(HTML_ENTITIES, $quote_style));
+        }
+        $text = strtr($text, $trans_tbl);
+      }
+      $text = preg_replace_callback('~&#x([0-9a-f]+);~i', array(&$this, '_decode_hex'), $text);
+      $text = preg_replace_callback('~&#(\d{2,5});~', array(&$this, '_decode_numeric'), $text);
+    }
+    return $text;
+  }
+  /**
+   * callback for decode() which converts a hexadecimal entity to UTF-8
+   *
+   * @param array $matches
+   * @return string UTF-8 encoded
+   */
+  function _decode_hex($matches) {
+    return $this->unichr(hexdec($matches[1]));
+  }
+  /**
+   * callback for decode() which converts a numerical entity to UTF-8
+   *
+   * @param array $matches
+   * @return string UTF-8 encoded
+   */
+  function _decode_numeric($matches) {
+    return $this->unichr($matches[1]);
+  }
+  /**
+   * UTF-8 chr() which supports numeric entities
+   *
+   * @author grey - greywyvern - com <http://www.php.net/manual/en/function.chr.php#55978>
+   * @param array $matches
+   * @return string UTF-8 encoded
+   */
+  function unichr($dec) {
+    if ($dec < 128) {
+      $utf = chr($dec);
+    } else if ($dec < 2048) {
+      $utf = chr(192 + (($dec - ($dec % 64)) / 64));
+      $utf .= chr(128 + ($dec % 64));
+    } else {
+      $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
+      $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
+      $utf .= chr(128 + ($dec % 64));
+    }
+    return $utf;
+  }
+  /**
+   * UTF-8 strlen()
+   *
+   * @param string $str
+   * @return int
+   *
+   * @author dtorop 932 at hotmail dot com <http://www.php.net/manual/en/function.strlen.php#37975>
+   * @author Milian Wolff <http://milianw.de>
+   */
+  function strlen($str) {
+    if (function_exists('mb_strlen')) {
+      return mb_strlen($str, 'UTF-8');
+    } else {
+      return preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
+    }
+  }
+  /**
+  * wordwrap for utf8 encoded strings
+  *
+  * @param string $str
+  * @param integer $len
+  * @param string $what
+  * @return string
+  */
+  function wordwrap($str, $width, $break, $cut = false){
+    if (!$cut) {
+      $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){1,'.$width.'}\b#';
+    } else {
+      $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.'}#';
+    }
+    $return = '';
+    while (preg_match($regexp, $str, $matches)) {
+      $string = $matches[0];
+      $str = ltrim(substr($str, strlen($string)));
+      if (!$cut && isset($str[0]) && in_array($str[0], array('.', '!', ';', ':', '?', ','))) {
+        $string .= $str[0];
+        $str = ltrim(substr($str, 1));
+      }
+      $return .= $string.$break;
+    }
+    return $return.ltrim($str);
+  }
+  /**
+   * check if current node has a $tagName as parent (somewhere, not only the direct parent)
+   *
+   * @param string $tagName
+   * @return bool
+   */
+  function hasParent($tagName) {
+    return in_array($tagName, $this->parser->openTags);
+  }
+  /**
+   * get tagName of direct parent tag
+   *
+   * @param void
+   * @return string $tagName
+   */
+  function parent() {
+    return end($this->parser->openTags);
+  }
+}
\ No newline at end of file
diff --git a/www/plugins/facteur/lib/markdownify/markdownify_extra.php b/www/plugins/facteur/lib/markdownify/markdownify_extra.php
new file mode 100644 (file)
index 0000000..3305f09
--- /dev/null
@@ -0,0 +1,489 @@
+<?php
+/**
+ * Class to convert HTML to Markdown with PHP Markdown Extra syntax support.
+ *
+ * @version 1.0.0 alpha
+ * @author Milian Wolff (<mail@milianw.de>, <http://milianw.de>)
+ * @license LGPL, see LICENSE_LGPL.txt and the summary below
+ * @copyright (C) 2007  Milian Wolff
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/**
+ * standard Markdownify class
+ */
+require_once dirname(__FILE__) . '/markdownify.php';
+
+class Markdownify_Extra extends Markdownify {
+  /**
+   * table data, including rows with content and the maximum width of each col
+   *
+   * @var array
+   */
+  var $table = array();
+  /**
+   * current col
+   *
+   * @var int
+   */
+  var $col = -1;
+  /**
+   * current row
+   *
+   * @var int
+   */
+  var $row = 0;
+  /**
+   * constructor, see Markdownify::Markdownify() for more information
+   */
+  function Markdownify_Extra($linksAfterEachParagraph = MDFY_LINKS_EACH_PARAGRAPH, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML) {
+    parent::Markdownify($linksAfterEachParagraph, $bodyWidth, $keepHTML);
+
+    ### new markdownable tags & attributes
+    # header ids: # foo {bar}
+    $this->isMarkdownable['h1']['id'] = 'optional';
+    $this->isMarkdownable['h2']['id'] = 'optional';
+    $this->isMarkdownable['h3']['id'] = 'optional';
+    $this->isMarkdownable['h4']['id'] = 'optional';
+    $this->isMarkdownable['h5']['id'] = 'optional';
+    $this->isMarkdownable['h6']['id'] = 'optional';
+    # tables
+    $this->isMarkdownable['table'] = array();
+    $this->isMarkdownable['th'] = array(
+      'align' => 'optional',
+    );
+    $this->isMarkdownable['td'] = array(
+      'align' => 'optional',
+    );
+    $this->isMarkdownable['tr'] = array();
+    array_push($this->ignore, 'thead');
+    array_push($this->ignore, 'tbody');
+    array_push($this->ignore, 'tfoot');
+    # definition lists
+    $this->isMarkdownable['dl'] = array();
+    $this->isMarkdownable['dd'] = array();
+    $this->isMarkdownable['dt'] = array();
+    # footnotes
+    $this->isMarkdownable['fnref'] = array(
+      'target' => 'required',
+    );
+    $this->isMarkdownable['footnotes'] = array();
+    $this->isMarkdownable['fn'] = array(
+      'name' => 'required',
+    );
+    $this->parser->blockElements['fnref'] = false;
+    $this->parser->blockElements['fn'] = true;
+    $this->parser->blockElements['footnotes'] = true;
+    # abbr
+    $this->isMarkdownable['abbr'] = array(
+      'title' => 'required',
+    );
+    # build RegEx lookahead to decide wether table can pe parsed or not
+    $inlineTags = array_keys($this->parser->blockElements, false);
+    $colContents = '(?:[^<]|<(?:'.implode('|', $inlineTags).'|[^a-z]))+';
+    $this->tableLookaheadHeader = '{
+    ^\s*(?:<thead\s*>)?\s*                               # open optional thead
+      <tr\s*>\s*(?:                                    # start required row with headers
+        <th(?:\s+align=("|\')(?:left|center|right)\1)?\s*>   # header with optional align
+        \s*'.$colContents.'\s*                       # contents
+        </th>\s*                                     # close header
+      )+</tr>                                          # close row with headers
+    \s*(?:</thead>)?                                     # close optional thead
+    }sxi';
+    $this->tdSubstitute = '\s*'.$colContents.'\s*        # contents
+          </td>\s*';
+    $this->tableLookaheadBody = '{
+      \s*(?:<tbody\s*>)?\s*                            # open optional tbody
+        (?:<tr\s*>\s*                                # start row
+          %s                                       # cols to be substituted
+        </tr>)+                                      # close row
+      \s*(?:</tbody>)?                                 # close optional tbody
+    \s*</table>                                          # close table
+    }sxi';
+  }
+  /**
+   * handle header tags (<h1> - <h6>)
+   *
+   * @param int $level 1-6
+   * @return void
+   */
+  function handleHeader($level) {
+    static $id = null;
+    if ($this->parser->isStartTag) {
+      if (isset($this->parser->tagAttributes['id'])) {
+        $id = $this->parser->tagAttributes['id'];
+      }
+    } else {
+      if (!is_null($id)) {
+        $this->out(' {#'.$id.'}');
+        $id = null;
+      }
+    }
+    parent::handleHeader($level);
+  }
+  /**
+   * handle <abbr> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_abbr() {
+    if ($this->parser->isStartTag) {
+      $this->stack();
+      $this->buffer();
+    } else {
+      $tag = $this->unstack();
+      $tag['text'] = $this->unbuffer();
+      $add = true;
+      foreach ($this->stack['abbr'] as $stacked) {
+        if ($stacked['text'] == $tag['text']) {
+          /** TODO: differing abbr definitions, i.e. different titles for same text **/
+          $add = false;
+          break;
+        }
+      }
+      $this->out($tag['text']);
+      if ($add) {
+        array_push($this->stack['abbr'], $tag);
+      }
+    }
+  }
+  /**
+   * flush stacked abbr tags
+   *
+   * @param void
+   * @return void
+   */
+  function flushStacked_abbr() {
+    $out = array();
+    foreach ($this->stack['abbr'] as $k => $tag) {
+      if (!isset($tag['unstacked'])) {
+        array_push($out, ' *['.$tag['text'].']: '.$tag['title']);
+        $tag['unstacked'] = true;
+        $this->stack['abbr'][$k] = $tag;
+      }
+    }
+    if (!empty($out)) {
+      $this->out("\n\n".implode("\n", $out));
+    }
+  }
+  /**
+   * handle <table> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_table() {
+    if ($this->parser->isStartTag) {
+      # check if upcoming table can be converted
+      if ($this->keepHTML) {
+        if (preg_match($this->tableLookaheadHeader, $this->parser->html, $matches)) {
+          # header seems good, now check body
+          # get align & number of cols
+          preg_match_all('#<th(?:\s+align=("|\')(left|right|center)\1)?\s*>#si', $matches[0], $cols);
+          $regEx = '';
+          $i = 1;
+          $aligns = array();
+          foreach ($cols[2] as $align) {
+            $align = strtolower($align);
+            array_push($aligns, $align);
+            if (empty($align)) {
+              $align = 'left'; # default value
+            }
+            $td = '\s+align=("|\')'.$align.'\\'.$i;
+            $i++;
+            if ($align == 'left') {
+              # look for empty align or left
+              $td = '(?:'.$td.')?';
+            }
+            $td = '<td'.$td.'\s*>';
+            $regEx .= $td.$this->tdSubstitute;
+          }
+          $regEx = sprintf($this->tableLookaheadBody, $regEx);
+          if (preg_match($regEx, $this->parser->html, $matches, null, strlen($matches[0]))) {
+            # this is a markdownable table tag!
+            $this->table = array(
+              'rows' => array(),
+              'col_widths' => array(),
+              'aligns' => $aligns,
+            );
+            $this->row = 0;
+          } else {
+            # non markdownable table
+            $this->handleTagToText();
+          }
+        } else {
+          # non markdownable table
+          $this->handleTagToText();
+        }
+      } else {
+        $this->table = array(
+          'rows' => array(),
+          'col_widths' => array(),
+          'aligns' => array(),
+        );
+        $this->row = 0;
+      }
+    } else {
+      # finally build the table in Markdown Extra syntax
+      $separator = array();
+      # seperator with correct align identifikators
+      foreach($this->table['aligns'] as $col => $align) {
+        if (!$this->keepHTML && !isset($this->table['col_widths'][$col])) {
+          break;
+        }
+        $left = ' ';
+        $right = ' ';
+        switch ($align) {
+          case 'left':
+            $left = ':';
+            break;
+          case 'center':
+            $right = ':';
+            $left = ':';
+          case 'right':
+            $right = ':';
+            break;
+        }
+        array_push($separator, $left.str_repeat('-', $this->table['col_widths'][$col]).$right);
+      }
+      $separator = '|'.implode('|', $separator).'|';
+
+      $rows = array();
+      # add padding
+      array_walk_recursive($this->table['rows'], array(&$this, 'alignTdContent'));
+      $header = array_shift($this->table['rows']);
+      array_push($rows, '| '.implode(' | ', $header).' |');
+      array_push($rows, $separator);
+      foreach ($this->table['rows'] as $row) {
+        array_push($rows, '| '.implode(' | ', $row).' |');
+      }
+      $this->out(implode("\n".$this->indent, $rows));
+      $this->table = array();
+      $this->setLineBreaks(2);
+    }
+  }
+  /**
+   * properly pad content so it is aligned as whished
+   * should be used with array_walk_recursive on $this->table['rows']
+   *
+   * @param string &$content
+   * @param int $col
+   * @return void
+   */
+  function alignTdContent(&$content, $col) {
+    switch ($this->table['aligns'][$col]) {
+      default:
+      case 'left':
+        $content .= str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content));
+        break;
+      case 'right':
+        $content = str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content)).$content;
+        break;
+      case 'center':
+        $paddingNeeded = $this->table['col_widths'][$col] - $this->strlen($content);
+        $left = floor($paddingNeeded / 2);
+        $right = $paddingNeeded - $left;
+        $content = str_repeat(' ', $left).$content.str_repeat(' ', $right);
+        break;
+    }
+  }
+  /**
+   * handle <tr> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_tr() {
+    if ($this->parser->isStartTag) {
+      $this->col = -1;
+    } else {
+      $this->row++;
+    }
+  }
+  /**
+   * handle <td> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_td() {
+    if ($this->parser->isStartTag) {
+      $this->col++;
+      if (!isset($this->table['col_widths'][$this->col])) {
+        $this->table['col_widths'][$this->col] = 0;
+      }
+      $this->buffer();
+    } else {
+      $buffer = trim($this->unbuffer());
+      $this->table['col_widths'][$this->col] = max($this->table['col_widths'][$this->col], $this->strlen($buffer));
+      $this->table['rows'][$this->row][$this->col] = $buffer;
+    }
+  }
+  /**
+   * handle <th> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_th() {
+    if (!$this->keepHTML && !isset($this->table['rows'][1]) && !isset($this->table['aligns'][$this->col+1])) {
+      if (isset($this->parser->tagAttributes['align'])) {
+        $this->table['aligns'][$this->col+1] = $this->parser->tagAttributes['align'];
+      } else {
+        $this->table['aligns'][$this->col+1] = '';
+      }
+    }
+    $this->handleTag_td();
+  }
+  /**
+   * handle <dl> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_dl() {
+    if (!$this->parser->isStartTag) {
+      $this->setLineBreaks(2);
+    }
+  }
+  /**
+   * handle <dt> tags
+   *
+   * @param void
+   * @return void
+   **/
+  function handleTag_dt() {
+    if (!$this->parser->isStartTag) {
+      $this->setLineBreaks(1);
+    }
+  }
+  /**
+   * handle <dd> tags
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_dd() {
+    if ($this->parser->isStartTag) {
+      if (substr(ltrim($this->parser->html), 0, 3) == '<p>') {
+        # next comes a paragraph, so we'll need an extra line
+        $this->out("\n".$this->indent);
+      } elseif (substr($this->output, -2) == "\n\n") {
+        $this->output = substr($this->output, 0, -1);
+      }
+      $this->out(':   ');
+      $this->indent('    ', false);
+    } else {
+      # lookahead for next dt
+      if (substr(ltrim($this->parser->html), 0, 4) == '<dt>') {
+        $this->setLineBreaks(2);
+      } else {
+        $this->setLineBreaks(1);
+      }
+      $this->indent('    ');
+    }
+  }
+  /**
+   * handle <fnref /> tags (custom footnote references, see markdownify_extra::parseString())
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_fnref() {
+    $this->out('[^'.$this->parser->tagAttributes['target'].']');
+  }
+  /**
+   * handle <fn> tags (custom footnotes, see markdownify_extra::parseString()
+   * and markdownify_extra::_makeFootnotes())
+   *
+   * @param void
+   * @return void
+   */
+  function handleTag_fn() {
+    if ($this->parser->isStartTag) {
+      $this->out('[^'.$this->parser->tagAttributes['name'].']:');
+      $this->setLineBreaks(1);
+    } else {
+      $this->setLineBreaks(2);
+    }
+    $this->indent('    ');
+  }
+  /**
+   * handle <footnotes> tag (custom footnotes, see markdownify_extra::parseString()
+   *  and markdownify_extra::_makeFootnotes())
+   *
+   *  @param void
+   *  @return void
+   */
+  function handleTag_footnotes() {
+    if (!$this->parser->isStartTag) {
+      $this->setLineBreaks(2);
+    }
+  }
+  /**
+   * parse a HTML string, clean up footnotes prior
+   *
+   * @param string $HTML input
+   * @return string Markdown formatted output
+   */
+  function parseString($html) {
+    /** TODO: custom markdown-extra options, e.g. titles & classes **/
+    # <sup id="fnref:..."><a href"#fn..." rel="footnote">...</a></sup>
+    # => <fnref target="..." />
+    $html = preg_replace('@<sup id="fnref:([^"]+)">\s*<a href="#fn:\1" rel="footnote">\s*\d+\s*</a>\s*</sup>@Us', '<fnref target="$1" />', $html);
+    # <div class="footnotes">
+    # <hr />
+    # <ol>
+    #
+    # <li id="fn:...">...</li>
+    # ...
+    #
+    # </ol>
+    # </div>
+    # =>
+    # <footnotes>
+    #   <fn name="...">...</fn>
+    #   ...
+    # </footnotes>
+    $html = preg_replace_callback('#<div class="footnotes">\s*<hr />\s*<ol>\s*(.+)\s*</ol>\s*</div>#Us', array(&$this, '_makeFootnotes'), $html);
+    return parent::parseString($html);
+  }
+  /**
+   * replace HTML representation of footnotes with something more easily parsable
+   *
+   * @note this is a callback to be used in parseString()
+   *
+   * @param array $matches
+   * @return string
+   */
+  function _makeFootnotes($matches) {
+    # <li id="fn:1">
+    #   ...
+    #   <a href="#fnref:block" rev="footnote">&#8617;</a></p>
+    # </li>
+    # => <fn name="1">...</fn>
+    # remove footnote link
+    $fns = preg_replace('@\s*(&#160;\s*)?<a href="#fnref:[^"]+" rev="footnote"[^>]*>&#8617;</a>\s*@s', '', $matches[1]);
+    # remove empty paragraph
+    $fns = preg_replace('@<p>\s*</p>@s', '', $fns);
+    # <li id="fn:1">...</li> -> <footnote nr="1">...</footnote>
+    $fns = str_replace('<li id="fn:', '<fn name="', $fns);
+
+    $fns = '<footnotes>'.$fns.'</footnotes>';
+    return preg_replace('#</li>\s*(?=(?:<fn|</footnotes>))#s', '</fn>$1', $fns);
+  }
+}
\ No newline at end of file
diff --git a/www/plugins/facteur/lib/markdownify/parsehtml/parsehtml.php b/www/plugins/facteur/lib/markdownify/parsehtml/parsehtml.php
new file mode 100644 (file)
index 0000000..1a8ecac
--- /dev/null
@@ -0,0 +1,618 @@
+<?php
+/**
+ * parseHTML is a HTML parser which works with PHP 4 and above.
+ * It tries to handle invalid HTML to some degree.
+ *
+ * @version 1.0 beta
+ * @author Milian Wolff (mail@milianw.de, http://milianw.de)
+ * @license LGPL, see LICENSE_LGPL.txt and the summary below
+ * @copyright (C) 2007  Milian Wolff
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+class parseHTML {
+  /**
+   * tags which are always empty (<br /> etc.)
+   *
+   * @var array<string>
+   */
+  var $emptyTags = array(
+    'br',
+    'hr',
+    'input',
+    'img',
+    'area',
+    'link',
+    'meta',
+    'param',
+  );
+  /**
+   * tags with preformatted text
+   * whitespaces wont be touched in them
+   *
+   * @var array<string>
+   */
+  var $preformattedTags = array(
+    'script',
+    'style',
+    'pre',
+    'code',
+  );
+  /**
+   * supress HTML tags inside preformatted tags (see above)
+   *
+   * @var bool
+   */
+  var $noTagsInCode = false;
+  /**
+   * html to be parsed
+   *
+   * @var string
+   */
+  var $html = '';
+  /**
+   * node type:
+   *
+   * - tag (see isStartTag)
+   * - text (includes cdata)
+   * - comment
+   * - doctype
+   * - pi (processing instruction)
+   *
+   * @var string
+   */
+  var $nodeType = '';
+  /**
+   * current node content, i.e. either a
+   * simple string (text node), or something like
+   * <tag attrib="value"...>
+   *
+   * @var string
+   */
+  var $node = '';
+  /**
+   * wether current node is an opening tag (<a>) or not (</a>)
+   * set to NULL if current node is not a tag
+   * NOTE: empty tags (<br />) set this to true as well!
+   *
+   * @var bool | null
+   */
+  var $isStartTag = null;
+  /**
+   * wether current node is an empty tag (<br />) or not (<a></a>)
+   *
+   * @var bool | null
+   */
+  var $isEmptyTag = null;
+  /**
+   * tag name
+   *
+   * @var string | null
+   */
+  var $tagName = '';
+  /**
+   * attributes of current tag
+   *
+   * @var array (attribName=>value) | null
+   */
+  var $tagAttributes = null;
+  /**
+   * wether the current tag is a block element
+   *
+   * @var bool | null
+   */
+  var $isBlockElement = null;
+
+  /**
+   * keep whitespace
+   *
+   * @var int
+   */
+  var $keepWhitespace = 0;
+  /**
+   * list of open tags
+   * count this to get current depth
+   *
+   * @var array
+   */
+  var $openTags = array();
+  /**
+   * list of block elements
+   *
+   * @var array
+   * TODO: what shall we do with <del> and <ins> ?!
+   */
+  var $blockElements = array (
+    # tag name => <bool> is block
+    # block elements
+    'address' => true,
+    'blockquote' => true,
+    'center' => true,
+    'del' => true,
+    'dir' => true,
+    'div' => true,
+    'dl' => true,
+    'fieldset' => true,
+    'form' => true,
+    'h1' => true,
+    'h2' => true,
+    'h3' => true,
+    'h4' => true,
+    'h5' => true,
+    'h6' => true,
+    'hr' => true,
+    'ins' => true,
+    'isindex' => true,
+    'menu' => true,
+    'noframes' => true,
+    'noscript' => true,
+    'ol' => true,
+    'p' => true,
+    'pre' => true,
+    'table' => true,
+    'ul' => true,
+    # set table elements and list items to block as well
+    'thead' => true,
+    'tbody' => true,
+    'tfoot' => true,
+    'td' => true,
+    'tr' => true,
+    'th' => true,
+    'li' => true,
+    'dd' => true,
+    'dt' => true,
+    # header items and html / body as well
+    'html' => true,
+    'body' => true,
+    'head' => true,
+    'meta' => true,
+    'link' => true,
+    'style' => true,
+    'title' => true,
+    # unfancy media tags, when indented should be rendered as block
+    'map' => true,
+    'object' => true,
+    'param' => true,
+    'embed' => true,
+    'area' => true,
+    # inline elements
+    'a' => false,
+    'abbr' => false,
+    'acronym' => false,
+    'applet' => false,
+    'b' => false,
+    'basefont' => false,
+    'bdo' => false,
+    'big' => false,
+    'br' => false,
+    'button' => false,
+    'cite' => false,
+    'code' => false,
+    'del' => false,
+    'dfn' => false,
+    'em' => false,
+    'font' => false,
+    'i' => false,
+    'img' => false,
+    'ins' => false,
+    'input' => false,
+    'iframe' => false,
+    'kbd' => false,
+    'label' => false,
+    'q' => false,
+    'samp' => false,
+    'script' => false,
+    'select' => false,
+    'small' => false,
+    'span' => false,
+    'strong' => false,
+    'sub' => false,
+    'sup' => false,
+    'textarea' => false,
+    'tt' => false,
+    'var' => false,
+  );
+  /**
+   * get next node, set $this->html prior!
+   *
+   * @param void
+   * @return bool
+   */
+  function nextNode() {
+    if (empty($this->html)) {
+      # we are done with parsing the html string
+      return false;
+    }
+    static $skipWhitespace = true;
+    if ($this->isStartTag && !$this->isEmptyTag) {
+      array_push($this->openTags, $this->tagName);
+      if (in_array($this->tagName, $this->preformattedTags)) {
+        # dont truncate whitespaces for <code> or <pre> contents
+        $this->keepWhitespace++;
+      }
+    }
+
+    if ($this->html[0] == '<') {
+      $token = substr($this->html, 0, 9);
+      if (substr($token, 0, 2) == '<?') {
+        # xml prolog or other pi's
+        /** TODO **/
+        #trigger_error('this might need some work', E_USER_NOTICE);
+        $pos = strpos($this->html, '>');
+        $this->setNode('pi', $pos + 1);
+        return true;
+      }
+      if (substr($token, 0, 4) == '<!--') {
+        # comment
+        $pos = strpos($this->html, '-->');
+        if ($pos === false) {
+          # could not find a closing -->, use next gt instead
+          # this is firefox' behaviour
+          $pos = strpos($this->html, '>') + 1;
+        } else {
+          $pos += 3;
+        }
+        $this->setNode('comment', $pos);
+
+        $skipWhitespace = true;
+        return true;
+      }
+      if ($token == '<!DOCTYPE') {
+        # doctype
+        $this->setNode('doctype', strpos($this->html, '>')+1);
+
+        $skipWhitespace = true;
+        return true;
+      }
+      if ($token == '<![CDATA[') {
+        # cdata, use text node
+
+        # remove leading <![CDATA[
+        $this->html = substr($this->html, 9);
+
+        $this->setNode('text', strpos($this->html, ']]>')+3);
+
+        # remove trailing ]]> and trim
+        $this->node = substr($this->node, 0, -3);
+        $this->handleWhitespaces();
+
+        $skipWhitespace = true;
+        return true;
+      }
+      if ($this->parseTag()) {
+        # seems to be a tag
+        # handle whitespaces
+        if ($this->isBlockElement) {
+          $skipWhitespace = true;
+        } else {
+          $skipWhitespace = false;
+        }
+        return true;
+      }
+    }
+    if ($this->keepWhitespace) {
+      $skipWhitespace = false;
+    }
+    # when we get here it seems to be a text node
+    $pos = strpos($this->html, '<');
+    if ($pos === false) {
+      $pos = strlen($this->html);
+    }
+    $this->setNode('text', $pos);
+    $this->handleWhitespaces();
+    if ($skipWhitespace && $this->node == ' ') {
+      return $this->nextNode();
+    }
+    $skipWhitespace = false;
+    return true;
+  }
+  /**
+   * parse tag, set tag name and attributes, see if it's a closing tag and so forth...
+   *
+   * @param void
+   * @return bool
+   */
+  function parseTag() {
+    static $a_ord, $z_ord, $special_ords;
+    if (!isset($a_ord)) {
+      $a_ord = ord('a');
+      $z_ord = ord('z');
+      $special_ords = array(
+        ord(':'), // for xml:lang
+        ord('-'), // for http-equiv
+      );
+    }
+
+    $tagName = '';
+
+    $pos = 1;
+    $isStartTag = $this->html[$pos] != '/';
+    if (!$isStartTag) {
+      $pos++;
+    }
+    # get tagName
+    while (isset($this->html[$pos])) {
+      $pos_ord = ord(strtolower($this->html[$pos]));
+      if (($pos_ord >= $a_ord && $pos_ord <= $z_ord) || (!empty($tagName) && is_numeric($this->html[$pos]))) {
+        $tagName .= $this->html[$pos];
+        $pos++;
+      } else {
+        $pos--;
+        break;
+      }
+    }
+
+    $tagName = strtolower($tagName);
+    if (empty($tagName) || !isset($this->blockElements[$tagName])) {
+      # something went wrong => invalid tag
+      $this->invalidTag();
+      return false;
+    }
+    if ($this->noTagsInCode && end($this->openTags) == 'code' && !($tagName == 'code' && !$isStartTag)) {
+      # we supress all HTML tags inside code tags
+      $this->invalidTag();
+      return false;
+    }
+
+    # get tag attributes
+    /** TODO: in html 4 attributes do not need to be quoted **/
+    $isEmptyTag = false;
+    $attributes = array();
+    $currAttrib = '';
+    while (isset($this->html[$pos+1])) {
+      $pos++;
+      # close tag
+      if ($this->html[$pos] == '>' || $this->html[$pos].$this->html[$pos+1] == '/>') {
+        if ($this->html[$pos] == '/') {
+          $isEmptyTag = true;
+          $pos++;
+        }
+        break;
+      }
+
+      $pos_ord = ord(strtolower($this->html[$pos]));
+      if ( ($pos_ord >= $a_ord && $pos_ord <= $z_ord) || in_array($pos_ord, $special_ords)) {
+        # attribute name
+        $currAttrib .= $this->html[$pos];
+      } elseif (in_array($this->html[$pos], array(' ', "\t", "\n"))) {
+        # drop whitespace
+      } elseif (in_array($this->html[$pos].$this->html[$pos+1], array('="', "='"))) {
+        # get attribute value
+        $pos++;
+        $await = $this->html[$pos]; # single or double quote
+        $pos++;
+        $value = '';
+        while (isset($this->html[$pos]) && $this->html[$pos] != $await) {
+          $value .= $this->html[$pos];
+          $pos++;
+        }
+        $attributes[$currAttrib] = $value;
+        $currAttrib = '';
+      } else {
+        $this->invalidTag();
+        return false;
+      }
+    }
+    if ($this->html[$pos] != '>') {
+      $this->invalidTag();
+      return false;
+    }
+
+    if (!empty($currAttrib)) {
+      # html 4 allows something like <option selected> instead of <option selected="selected">
+      $attributes[$currAttrib] = $currAttrib;
+    }
+    if (!$isStartTag) {
+      if (!empty($attributes) || $tagName != end($this->openTags)) {
+        # end tags must not contain any attributes
+        # or maybe we did not expect a different tag to be closed
+        $this->invalidTag();
+        return false;
+      }
+      array_pop($this->openTags);
+      if (in_array($tagName, $this->preformattedTags)) {
+        $this->keepWhitespace--;
+      }
+    }
+    $pos++;
+    $this->node = substr($this->html, 0, $pos);
+    $this->html = substr($this->html, $pos);
+    $this->tagName = $tagName;
+    $this->tagAttributes = $attributes;
+    $this->isStartTag = $isStartTag;
+    $this->isEmptyTag = $isEmptyTag || in_array($tagName, $this->emptyTags);
+    if ($this->isEmptyTag) {
+      # might be not well formed
+      $this->node = preg_replace('# */? *>$#', ' />', $this->node);
+    }
+    $this->nodeType = 'tag';
+    $this->isBlockElement = $this->blockElements[$tagName];
+    return true;
+  }
+  /**
+   * handle invalid tags
+   *
+   * @param void
+   * @return void
+   */
+  function invalidTag() {
+    $this->html = substr_replace($this->html, '&lt;', 0, 1);
+  }
+  /**
+   * update all vars and make $this->html shorter
+   *
+   * @param string $type see description for $this->nodeType
+   * @param int $pos to which position shall we cut?
+   * @return void
+   */
+  function setNode($type, $pos) {
+    if ($this->nodeType == 'tag') {
+      # set tag specific vars to null
+      # $type == tag should not be called here
+      # see this::parseTag() for more
+      $this->tagName = null;
+      $this->tagAttributes = null;
+      $this->isStartTag = null;
+      $this->isEmptyTag = null;
+      $this->isBlockElement = null;
+
+    }
+    $this->nodeType = $type;
+    $this->node = substr($this->html, 0, $pos);
+    $this->html = substr($this->html, $pos);
+  }
+  /**
+   * check if $this->html begins with $str
+   *
+   * @param string $str
+   * @return bool
+   */
+  function match($str) {
+    return substr($this->html, 0, strlen($str)) == $str;
+  }
+  /**
+   * truncate whitespaces
+   *
+   * @param void
+   * @return void
+   */
+  function handleWhitespaces() {
+    if ($this->keepWhitespace) {
+      # <pre> or <code> before...
+      return;
+    }
+    # truncate multiple whitespaces to a single one
+    $this->node = preg_replace('#\s+#s', ' ', $this->node);
+  }
+  /**
+   * normalize self::node
+   *
+   * @param void
+   * @return void
+   */
+  function normalizeNode() {
+    $this->node = '<';
+    if (!$this->isStartTag) {
+      $this->node .= '/'.$this->tagName.'>';
+      return;
+    }
+    $this->node .= $this->tagName;
+    foreach ($this->tagAttributes as $name => $value) {
+      $this->node .= ' '.$name.'="'.str_replace('"', '&quot;', $value).'"';
+    }
+    if ($this->isEmptyTag) {
+      $this->node .= ' /';
+    }
+    $this->node .= '>';
+  }
+}
+
+/**
+ * indent a HTML string properly
+ *
+ * @param string $html
+ * @param string $indent optional
+ * @return string
+ */
+function indentHTML($html, $indent = "  ", $noTagsInCode = false) {
+  $parser = new parseHTML;
+  $parser->noTagsInCode = $noTagsInCode;
+  $parser->html = $html;
+  $html = '';
+  $last = true; # last tag was block elem
+  $indent_a = array();
+  while($parser->nextNode()) {
+    if ($parser->nodeType == 'tag') {
+      $parser->normalizeNode();
+    }
+    if ($parser->nodeType == 'tag' && $parser->isBlockElement) {
+      $isPreOrCode = in_array($parser->tagName, array('code', 'pre'));
+      if (!$parser->keepWhitespace && !$last && !$isPreOrCode) {
+        $html = rtrim($html)."\n";
+      }
+      if ($parser->isStartTag) {
+        $html .= implode($indent_a);
+        if (!$parser->isEmptyTag) {
+          array_push($indent_a, $indent);
+        }
+      } else {
+        array_pop($indent_a);
+        if (!$isPreOrCode) {
+          $html .= implode($indent_a);
+        }
+      }
+      $html .= $parser->node;
+      if (!$parser->keepWhitespace && !($isPreOrCode && $parser->isStartTag)) {
+        $html .= "\n";
+      }
+      $last = true;
+    } else {
+      if ($parser->nodeType == 'tag' && $parser->tagName == 'br') {
+        $html .= $parser->node."\n";
+        $last = true;
+        continue;
+      } elseif ($last && !$parser->keepWhitespace) {
+        $html .= implode($indent_a);
+        $parser->node = ltrim($parser->node);
+      }
+      $html .= $parser->node;
+
+      if (in_array($parser->nodeType, array('comment', 'pi', 'doctype'))) {
+        $html .= "\n";
+      } else {
+        $last = false;
+      }
+    }
+  }
+  return $html;
+}
+/*
+# testcase / example
+error_reporting(E_ALL);
+
+$html = '<p>Simple block on one line:</p>
+
+<div>foo</div>
+
+<p>And nested without indentation:</p>
+
+<div>
+<div>
+<div>
+foo
+</div>
+<div style=">"/>
+</div>
+<div>bar</div>
+</div>
+
+<p>And with attributes:</p>
+
+<div>
+    <div id="foo">
+    </div>
+</div>
+
+<p>This was broken in 1.0.2b7:</p>
+
+<div class="inlinepage">
+<div class="toggleableend">
+foo
+</div>
+</div>';
+#$html = '<a href="asdfasdf"       title=\'asdf\' foo="bar">asdf</a>';
+echo indentHTML($html);
+die();
+*/
index bf76ce6..7c442cc 100644 (file)
@@ -1,7 +1,7 @@
 <paquet\r
        prefix="facteur"\r
        categorie="communication"\r
-       version="2.4.5"\r
+       version="3.0.7"\r
        etat="stable"\r
        compatibilite="[3.0.0;3.0.*]"\r
        logo="prive/themes/spip/images/facteur-32.png"\r
@@ -16,6 +16,7 @@
        \r
        <pipeline nom="facteur_pre_envoi" action="" />\r
        <pipeline nom="ieconfig_metas" inclure="facteur_ieconfig_metas.php" />\r
+       <pipeline nom="recuperer_fond" inclure="facteur_pipelines.php" />\r
        \r
        <menu nom="configurer_facteur" titre="facteur:configuration_facteur" parent="menu_configuration" icone="images/facteur-16.png" />\r
 </paquet>\r
index 9cdd0f3..65baf42 100755 (executable)
@@ -1158,7 +1158,7 @@ class PHPMailer {
     switch($this->message_type) {
       case 'plain':
         $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
-        $result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet);
+        $result .= sprintf("Content-Type: %s; charset=%s", $this->ContentType, $this->CharSet);
         break;
       case 'attachments':
       case 'alt_attachments':
@@ -1272,7 +1272,7 @@ class PHPMailer {
       $encoding = $this->Encoding;
     }
     $result .= $this->TextLine('--' . $boundary);
-    $result .= sprintf("Content-Type: %s; charset = \"%s\"", $contentType, $charSet);
+    $result .= sprintf("Content-Type: %s; charset=%s", $contentType, $charSet);
     $result .= $this->LE;
     $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding);
     $result .= $this->LE;
@@ -2024,7 +2024,7 @@ class PHPMailer {
     $this->Body = $message;
     $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message)));
     if (!empty($textMsg) && empty($this->AltBody)) {
-      $this->AltBody = html_entity_decode($textMsg);
+      $this->AltBody = html_entity_decode($textMsg,ENT_COMPAT | ENT_HTML401, strtoupper($this->CharSet));
     }
     if (empty($this->AltBody)) {
       $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . "\n\n";
@@ -2317,4 +2317,4 @@ class phpmailerException extends Exception {
     return $errorMsg;
   }
 }
-?>
\ No newline at end of file
+?>
index 9140772..70c899c 100644 (file)
@@ -1,10 +1,10 @@
 <svn_revision>
 <text_version>
-Origine: file:///home/svn/repository/spip-zone/_plugins_/facteur/branches/v2
-Revision: 70525
-Dernier commit: 2013-03-08 18:00:06 +0100 
+Origine: file:///home/svn/repository/spip-zone/_plugins_/facteur/trunk
+Revision: 80884
+Dernier commit: 2014-02-19 06:02:06 +0100 
 </text_version>
-<origine>file:///home/svn/repository/spip-zone/_plugins_/facteur/branches/v2</origine>
-<revision>70525</revision>
-<commit>2013-03-08 18:00:06 +0100 </commit>
+<origine>file:///home/svn/repository/spip-zone/_plugins_/facteur/trunk</origine>
+<revision>80884</revision>
+<commit>2014-02-19 06:02:06 +0100 </commit>
 </svn_revision>
\ No newline at end of file
index 2254bf8..2544459 100644 (file)
@@ -48,7 +48,7 @@ function insert_formulaire() {
                        'data' => $champs
                )
        );
-       $id_formulaire = sql_insertq("spip_formulaires");
+       $id_formulaire = sql_insertq("spip_formulaires", array('date_creation' => date('Y-m-d H:i:s')));
 
        return $id_formulaire;
 }
@@ -68,7 +68,7 @@ function formulaire_set($id_formulaire, $set=null) {
        $champs = saisies_lister_champs($GLOBALS['formulaires']['editer_formulaire']);
        foreach ($champs as $champ)
                $c[$champ] = _request($champ,$set);
-       
+
        include_spip('inc/modifier');
        revision_formulaire($id_formulaire, $c);
 
index 5175de8..a4e7e92 100755 (executable)
@@ -25,9 +25,14 @@ function action_exporter_analyse_reponses_dist($arg=null) {
                include_spip('classes/facteur');
                include_spip('inc/filtres');
         $reponses_completes = array();
-
+        
         $saisies = saisies_lister_par_nom(unserialize($formulaire['saisies']), false);
-
+        
+        // exclure les champs non analysés
+        $traitement = unserialize($formulaire['traitements']);
+        foreach (explode("|",$traitement['enregistrement']['analyse_exclure_champs']) as $exclure){
+            unset($saisies[$exclure]);
+        }
                $res = sql_select(
             array('nom, valeur'),
 
@@ -94,7 +99,7 @@ function action_exporter_analyse_reponses_dist($arg=null) {
         }
 
                if ($reponses_completes and $exporter_csv = charger_fonction('exporter_csv', 'inc/', true)){
-                       echo $exporter_csv('analyses-formulaire-'.$formulaire['identifiant'], $reponses_completes);
+                       $exporter_csv('analyses-formulaire-'.$formulaire['identifiant'], $reponses_completes);
                        exit();
                }
        }
index 4105d4f..2330710 100644 (file)
@@ -76,7 +76,7 @@ function action_exporter_formulaires_reponses_dist($arg=null) {
                }
                
                if ($reponses_completes and $exporter_csv = charger_fonction('exporter_csv', 'inc/', true)){
-                       echo $exporter_csv('reponses-formulaire-'.$formulaire['identifiant'], $reponses_completes);
+                       $exporter_csv('reponses-formulaire-'.$formulaire['identifiant'], $reponses_completes);
                        exit();
                }
        }
diff --git a/www/plugins/formidable_1_0/action/vider_formulaire.php b/www/plugins/formidable_1_0/action/vider_formulaire.php
new file mode 100644 (file)
index 0000000..41de12a
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/*
+ * Action de suppression des réponses à un formulaire
+ * @param int $arg
+ * @return unknown_type
+ */
+function action_vider_formulaire_dist($arg=null) {
+       if (is_null($arg)){
+               $securiser_action = charger_fonction('securiser_action', 'inc');
+               $arg = $securiser_action();
+       }
+
+       // si id_formulaires_reponse n'est pas un nombre, on ne fait rien
+       if ($id_formulaire = intval($arg)) {
+               // On supprime les réponse (statut => poubelle
+               $ok = sql_update(
+                       'spip_formulaires_reponses',
+                       array('statut' => sql_quote('poubelle')),
+                       'id_formulaire = '.$id_formulaire
+               );
+       }
+       
+       if ($ok) {
+               /* on n'a plus de réponses à montrer, retour vers la page du formulaire */
+               if (!$redirect = _request('redirect'))
+                       $redirect = parametre_url(generer_url_ecrire('formulaire'), 'id_formulaire', $id_formulaire);
+               
+               include_spip('inc/headers');
+               redirige_par_entete(str_replace("&amp;","&",urldecode($redirect)));
+       }
+}
+
+?>
index 4d5f433..c01c6b0 100644 (file)
@@ -45,8 +45,9 @@ function formidable_declarer_tables_objets_sql($tables) {
        $tables['spip_formulaires'] = array(
                'type'=>'formulaire',
                'titre' => "titre, '' AS lang",
-               'date' => '',
+               'date' => 'date_creation',
                'principale' => 'oui',
+               'texte_modifier' => 'formidable:editer_modifier_formulaire',
                
                'field' => array(
                        "id_formulaire" => "bigint(21) NOT NULL",
@@ -54,10 +55,11 @@ function formidable_declarer_tables_objets_sql($tables) {
                        "titre" => "text NOT NULL default ''",
                        "descriptif" => "text",
                        "message_retour" => "text NOT NULL default ''",
-                       "saisies" => "text NOT NULL default ''",
+                       "saisies" => "longtext NOT NULL default ''",
                        "traitements" => "text NOT NULL default ''",
                        "public" => "enum('non', 'oui') DEFAULT 'non' NOT NULL",
                        "statut" => "varchar(10) NOT NULL default ''",
+                       "date_creation" => "datetime NOT NULL DEFAULT '0000-00-00 00:00:00'",
                        "maj" => "timestamp",
                        "apres" => "varchar(12) NOT NULL default ''",
                        "url_redirect" => "varchar(255)"
index d273617..bb0b629 100644 (file)
@@ -37,6 +37,12 @@ function formidable_upgrade($nom_meta_base_version, $version_cible){
        $maj['0.5.0'] = array(array('maj_tables',array('spip_formulaires')));
        // Modif du type du message de retour pour pouvoir mettre plus de chose
        $maj['0.5.1'] = array(array('sql_alter','TABLE spip_formulaires CHANGE message_retour message_retour text NOT NULL default ""'));
+       // Passer le champ saisies en longtext pour permettre d'y stocker des formulaires longs
+       $maj['0.5.2'] = array(array('sql_alter','TABLE spip_formulaires CHANGE saisies saisies longtext NOT NULL default ""'));
+       // Ajouter un champ date de création
+       $maj['0.5.3'] = array(array('sql_alter','TABLE spip_formulaires ADD date_crea datetime NOT NULL DEFAULT "0000-00-00 00:00:00"'));
+       // Renommer la date de création (pas d'abbréviations dans les noms)
+       $maj['0.5.5'] = array(array('sql_alter','TABLE spip_formulaires CHANGE date_crea date_creation datetime NOT NULL DEFAULT "0000-00-00 00:00:00"'));
 
        include_spip('base/upgrade');
        maj_plugin($nom_meta_base_version, $version_cible, $maj);
index 411ee3f..91b3ed6 100644 (file)
@@ -36,6 +36,28 @@ function formidable_autoriser_par_auteur($id, $id_auteur = 0) {
                $autorisations = objet_trouver_liens(array('formulaire'=>$id),array('auteur'=>$id_auteur));
                $retour = count($autorisations) > 0;
        }
+
+       return $retour;
+}
+
+/**
+ * Réponses à un formulaire éditable par un auteur
+ *
+ * Est-on en présence d'un auteur qui tente de modifier les réponses d'un formulaire
+ * et que Formidable est configuré pour prendre en compte les auteurs
+ * et que les auteurs sont en droit de modifier les réponses de leurs formulaires ?
+ *
+ * @param  array  $qui   Description de l'auteur demandant l'autorisation
+ * @return bool  true s'il a le droit, false sinon
+ *
+*/
+function formidable_auteur_admin_reponse($qui) {
+       // L'auteur peut-il administrer les réponses ?
+       $admin_reponses_auteur = lire_config('formidable/analyse/admin_reponses_auteur');
+       $auteurs = lire_config('formidable/analyse/auteur');
+       $is_admin = (isset($qui['statut']) and $qui['statut'] == '0minirezo');
+       $retour = ($is_admin or (($auteurs == 'on') and ($admin_reponses_auteur == 'on')));
+
        return $retour;
 }
 
@@ -178,9 +200,8 @@ function autoriser_formulaire_modifier_dist($faire, $type, $id, $qui, $opt) {
  * @param  array  $opt   Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
 **/
-function autoriser_formulaires_reponse_instituer_dist($faire, $type, $id, $qui, $opt){
-    if (isset($qui['statut']) and $qui['statut'] <= '0minirezo' and !$qui['restreint']) return true;
-    else return false;
+function autoriser_formulairesreponse_instituer_dist($faire, $type, $id, $qui, $opt){
+       return formidable_auteur_admin_reponse($qui);
 }
 
 /**
@@ -199,10 +220,33 @@ function autoriser_formulairesreponse_voir_dist($faire, $type, $id, $qui, $opt){
        return autoriser_formulaire_editer_dist($faire, $type, $id, $qui, $opt);
 }
 
+/**
+ * Autorisation de modifier une réponse d'un formulaire formidable
+ *
+ * suivant la config, un administrateur ou l'auteur du formulaire peuvent
+ * voir les résultats
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type  Type d'objet sur lequel appliquer l'action
+ * @param  int    $id    Identifiant de l'objet
+ * @param  array  $qui   Description de l'auteur demandant l'autorisation
+ * @param  array  $opt   Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+**/
+function autoriser_formulairesreponse_modifier_dist($faire, $type, $id, $qui, $opt){
+    if ($id_formulaire = intval(sql_getfetsel(
+                       'id_formulaire', 'spip_formulaires_reponses', "id_formulaires_reponse=$id"))) {
+
+               $retour = (autoriser_formulaire_editer_dist($faire, $type, $id_formulaire, $qui, $opt)
+                               and formidable_auteur_admin_reponse($qui));
+       }
+       return $retour;
+}
+
 /**
  * Autorisation de supprimer une réponse d'un formulaire formidable
  *
- * Il faut pouvoir éditer un formulaire pour pouvoir en supprimer des réponses
+ * Il faut pouvoir modifier les réponses d'un formulaire pour pouvoir les en supprimer
  *
  * @param  string $faire Action demandée
  * @param  string $type  Type d'objet sur lequel appliquer l'action
@@ -211,12 +255,9 @@ function autoriser_formulairesreponse_voir_dist($faire, $type, $id, $qui, $opt){
  * @param  array  $opt   Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
 **/
-function autoriser_formulairesreponse_supprimer_dist($faire, $type, $id, $qui, $opt){
-    // On récupère l'id du formulaire
-    if ($id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires_reponses', $id)))
-        return autoriser('editer', 'formulaire', $id_formulaire);
-    else
-        return false;
+function autoriser_formulairesreponse_supprimer_dist($faire, $type, $id, $qui, $opt) {
+       $retour = autoriser_formulairesreponse_modifier_dist($faire, $type, $id, $qui, $opt);
+       return $retour;
 }
 
 ?>
index 902224b..d46418a 100644 (file)
@@ -29,7 +29,31 @@ function formidable_optimiser_base_disparus($flux){
        
        // On génère la suppression
        $flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaires_reponse', $res);
+       
+               //
+       // CNIL -- Informatique et libertes
+       //
+       // masquer le numero IP des vieilles réponses
+       //
+       ## date de reference = 4 mois
+       ## definir a 0 pour desactiver
+       ## même constante que pour les forums
+       if (!defined('_CNIL_PERIODE')) {
+               define('_CNIL_PERIODE', 3600*24*31*4);
+       }
+       
+       if (_CNIL_PERIODE) {
+               $critere_cnil = 'date<"'.date('Y-m-d', time()-_CNIL_PERIODE).'"'
+                       . ' AND statut != "spam"'
+                       . ' AND (ip LIKE "%.%" OR ip LIKE "%:%")'; # ipv4 ou ipv6
+               $c = sql_countsel('spip_formulaires_reponses', $critere_cnil);
+               if ($c>0) {
+                       spip_log("CNIL: masquer IP de $c réponses anciennes à formidable");
+                       sql_update('spip_formulaires_reponses', array('ip' => 'MD5(ip)'), $critere_cnil);
+               }
+       }
+       
        return $flux;
 }
 
-?>
+?>
\ No newline at end of file
index f93413b..36deadc 100644 (file)
                        label=<:formidable:traiter_enregistrement_option_auteur:>,
                        explication=<:formidable:traiter_enregistrement_option_auteur_explication:>
                        })]
+               [(#SAISIE{oui_non,admin_reponses_auteur,
+                       label=<:formidable:admin_reponses_auteur:>,
+                       explication=<:formidable:admin_reponses_auteur_explication:>
+                       })]
                <input type="hidden" name="_meta_casier" value="formidable/analyse" />
                <p class="boutons"><span class="image_loading">&nbsp;</span><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
        </div>
        </form>
+       <script type="text/javascript">
+               $(function(){
+                       if ($('#champ_auteur_non').prop('checked')) {
+                               $('.editer_admin_reponses_auteur').hide();
+                       }
+                       $('.editer_auteur input[name="auteur"]').change(function() {
+                               if ($(this).val() == 'on') $('.editer_admin_reponses_auteur').show(100);
+                               else $('.editer_admin_reponses_auteur').hide(100);
+                       });
+               });
+       </script>
 </div>
index 9727ab5..e1f5afe 100644 (file)
@@ -8,8 +8,8 @@
        [(#GET{anonymiser}|=={on}|oui)<h3><:formidable:formulaire_anonyme_explication:></h3>]\r
 </BOUCLE_formulaire>\r
 <div class="formulaire_spip formulaire_#ENV{form}[ formulaire_#ENV{form}-(#ENV{id,nouveau})]">\r
-    [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]\r
-    [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]\r
+    [<div class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok}|propre)</div>]\r
+    [<div class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur}|propre)</div>]\r
 \r
     [(#ENV{editable}|oui)\r
     <form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>\r
@@ -40,6 +40,9 @@
         ]\r
         [(#ENV{formidable_afficher_apres}|=={rien}|oui)\r
         ]\r
+        [(#ENV{formidable_afficher_apres}|=={stats}|oui)\r
+            #MODELE{formulaire_analyse,id_formulaire=#ENV{id}}\r
+        ]\r
     ]\r
     <br />\r
 </div>\r
index 4198c46..905b4bf 100644 (file)
@@ -43,15 +43,17 @@ function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_fo
 
     // On cherche si le formulaire existe
     if ($formulaire = sql_fetsel('*', 'spip_formulaires', $where)) {
-        // on ajoute un point d'entrée avec les infos de ce formulaire
+        // On ajoute un point d'entrée avec les infos de ce formulaire
         // pour d'eventuels plugins qui en ont l'utilité
-        $contexte += array('_formidable' => $formulaire);
+        $contexte['_formidable'] = $formulaire;
+        
         // Est-ce que la personne a le droit de répondre ?
         if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire'=>$formulaire))){
             $saisies = unserialize($formulaire['saisies']);
             $traitements = unserialize($formulaire['traitements']);
-            // On déclare les champs
-            $contexte += array_fill_keys(saisies_lister_champs($saisies), '');
+            
+            // On déclare les champs avec les valeurs par défaut
+            $contexte = array_merge(saisies_lister_valeurs_defaut($saisies), $contexte);
             $contexte['mechantrobot'] = '';
             // On ajoute le formulaire complet
             $contexte['_saisies'] = $saisies;
@@ -72,7 +74,7 @@ function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_fo
                     }
                 }
 
-                // On regarde si maintenant on a un tableau
+                // Si on a un tableau, alors on écrase avec les valeurs données depuis l'appel
                 if ($valeurs and is_array($valeurs)){
                     $contexte = array_merge($contexte, $valeurs);
                 }
@@ -91,13 +93,15 @@ function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_fo
             } else {
 
                 // calcul des paramètres d'anonymisation
+                               $options = isset($traitements['enregistrement']) ? $traitements['enregistrement'] : null;
+
                 $anonymisation = (isset($options['anonymiser']) && $options['anonymiser'] == true)
                     ? isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : ''
                     : '';
 
                 // Si multiple = non mais que c'est modifiable, alors on va chercher
                 // la dernière réponse si elle existe
-                if ($options = $traitements['enregistrement']
+                if ($options
                     and !$options['multiple']
                     and $options['modifiable']
                     and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options['identification'], $anonymisation)
@@ -205,8 +209,7 @@ function formulaires_formidable_verifier($id_formulaire, $valeurs=array(), $id_f
  *     Tableau des erreurs
 **/
 function formulaires_formidable_traiter($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){
-    $retours = array();
-
+       $retours = array();
     $id_formulaire = intval(_request('id_formulaire'));
     $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire);
     $traitements = unserialize($formulaire['traitements']);
index 0d71a5f..139193d 100644 (file)
@@ -1,4 +1,5 @@
 <div class="formulaire_spip formulaire_#ENV{form}[ formulaire_#ENV{form}-(#ENV{id})]">
+       <h3 class="titrem"><:formidable:importer_formulaire:></h3>
        [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
        [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
        
diff --git a/www/plugins/formidable_1_0/images/formulaire-reponses-supprimer-24.png b/www/plugins/formidable_1_0/images/formulaire-reponses-supprimer-24.png
new file mode 100644 (file)
index 0000000..f491594
Binary files /dev/null and b/www/plugins/formidable_1_0/images/formulaire-reponses-supprimer-24.png differ
index d50971f..fceec6c 100644 (file)
@@ -222,6 +222,7 @@ function analyser_saisie($saisie) {
         case 'radio' :
         case 'selection' :
         case 'selection_multiple' :
+        case 'choix_couleur':
         case 'checkbox' :
             $stats = array();
             foreach($saisie['valeurs'] as $valeur) {
@@ -238,7 +239,7 @@ function analyser_saisie($saisie) {
                 }
             }
             $datas = is_string($saisie['datas'])
-                ? saisies_chaine2tableau($saisie['datas'])
+                ? saisies_chaine2tableau(saisies_aplatir_chaine($saisie['datas']))
                 : $saisie['datas'];
             foreach($datas as $key => $val) {
                 $nb = (isset($stats["choix-$key"]))
@@ -297,7 +298,7 @@ function analyser_saisie($saisie) {
  * Si c'est une chaîne, tente de la désérialiser, sinon
  * retourne la chaîne.
  *
- * @filtre tenter_unserialize
+ * @filtre
  *
  * @param string|array $texte
  *     Le texte (possiblement sérializé) ou un tableau
index 6b0c94e..2194e55 100644 (file)
@@ -1,23 +1,22 @@
 <traduction module="formidable" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/formidable/trunk/lang/" reference="fr">
-       <langue code="de" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=de">
+       <langue code="de" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=de" total="146" traduits="99" relire="0" modifs="2" nouveaux="45" pourcent="67.81">
                <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
        </langue>
-       <langue code="en" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=en">
+       <langue code="en" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=en" total="146" traduits="138" relire="0" modifs="0" nouveaux="8" pourcent="94.52">
                <traducteur nom="Benitron" lien="http://trad.spip.net/auteur/benitron" />
                <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
                <traducteur nom="Paolo" lien="http://trad.spip.net/auteur/paolo" />
                <traducteur nom="twelf" lien="http://trad.spip.net/auteur/twelf" />
        </langue>
-       <langue code="es" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=es">
+       <langue code="es" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=es" total="146" traduits="135" relire="0" modifs="0" nouveaux="11" pourcent="92.47">
                <traducteur nom="tin" lien="http://trad.spip.net/auteur/tin" />
        </langue>
-       <langue code="fr" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=fr">
-               <traducteur nom="Salvatore" lien="http://trad.spip.net/auteur/salvatore" />
+       <langue code="fr" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=fr" total="146" traduits="146" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
        </langue>
-       <langue code="it" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=it">
+       <langue code="it" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=it" total="146" traduits="116" relire="0" modifs="1" nouveaux="29" pourcent="79.45">
                <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
        </langue>
-       <langue code="sk" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=sk">
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/formidable?lang_cible=sk" total="146" traduits="138" relire="0" modifs="0" nouveaux="8" pourcent="94.52">
                <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
                <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
        </langue>
index d1e6a7a..0a1ad91 100644 (file)
@@ -11,40 +11,22 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'analyse_avec_reponse' => 'Ausgefüllte Antworten',
        'analyse_exporter' => 'Analyse exportieren',
        'analyse_longueur_moyenne' => 'Durchschnittliche Anzahl Worte',
-       'analyse_nb_reponses_total' => '@nb@ personnes ont répondu à ce formulaire.', # NEW
        'analyse_sans_reponse' => 'Leere Antworten',
-       'analyse_une_reponse_total' => 'Une personne a répondu à ce formulaire.', # NEW
-       'analyse_zero_reponse_total' => 'Aucune personne n\'a répondu à ce formulaire.', # NEW
-       'aucun_traitement' => 'Aucun traitement', # NEW
 
        // B
        'bouton_formulaires' => 'Formulare',
 
        // C
-       'cfg_analyse_classe_explication' => 'Vous pouvez indiquer des classes CSS qui seront ajoutées
-               sur le conteneur de chaque graphique, tel que <code>gray</code>,<code>blue</code>,
-               <code>orange</code>, <code>green</code> ou tout ce qui vous plairait !', # NEW
-       'cfg_analyse_classe_label' => 'Classe CSS de la barre de progression', # NEW
-       'cfg_titre_page_configurer_formidable' => 'Configurer Formidable', # NEW
-       'cfg_titre_parametrages_analyse' => 'Paramétrages de l\'analyse des réponses', # NEW
        'champs' => 'Felder',
 
        // E
        'echanger_formulaire_forms_importer' => 'Forms & Tables (.xml)',
        'echanger_formulaire_wcs_importer' => 'W.C.S. (.wcs)',
        'echanger_formulaire_yaml_importer' => 'Formidable (.yaml)',
-       'editer_apres_choix_formulaire' => 'Le formulaire, à nouveau', # NEW
-       'editer_apres_choix_redirige' => 'Rediriger vers une nouvelle adresse', # NEW
-       'editer_apres_choix_rien' => 'Rien du tout', # NEW
-       'editer_apres_choix_stats' => 'Les statistiques des réponses', # NEW
-       'editer_apres_choix_valeurs' => 'Les valeurs saisies', # NEW
-       'editer_apres_explication' => 'Après validation, afficher à la place du formulaire :', # NEW
-       'editer_apres_label' => 'Afficher ensuite', # NEW
        'editer_descriptif' => 'Beschreibung',
        'editer_descriptif_explication' => 'Eine Beschreibung des Formulars für das Backend.',
        'editer_identifiant' => 'Bezeichnung',
        'editer_identifiant_explication' => 'Gegen sie eine Bezeichnung an, mit dem sie das Formular ansprechen können.',
-       'editer_menu_auteurs' => 'Configurer les auteurs', # NEW
        'editer_menu_champs' => 'Felder konfigurieren',
        'editer_menu_formulaire' => 'Formular konfigurieren',
        'editer_menu_traitements' => 'Verarbeitung konfigurieren',
@@ -52,8 +34,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'editer_message_ok_explication' => 'Sie können die Nachricht festlegen, die nach dem Absenden des Formulars angezeigt wird.',
        'editer_modifier_formulaire' => 'Formular ändern',
        'editer_nouveau' => 'Neues Formular',
-       'editer_redirige_url' => 'Adresse de redirection après validation', # NEW
-       'editer_redirige_url_explication' => 'Laissez vide si vous souhaitez rester sur la même page', # NEW
        'editer_titre' => 'Titel',
        'erreur_autorisation' => 'Sie sind nicht berechtigt, die Formulare der Website zu ändern.',
        'erreur_base' => 'Beim Speichern ist ein technischer Fehler aufgetreten.',
@@ -76,29 +56,16 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'formulaires_tous' => 'Alle Formulare',
 
        // I
-       'identification_par_cookie' => 'Par cookie', # NEW
-       'identification_par_id_auteur' => 'Par l\'identifiant (id_auteur) de la personne authentifiée', # NEW
        'importer_formulaire' => 'Formular importieren',
        'importer_formulaire_fichier_label' => 'Dateien importeieren',
        'importer_formulaire_format_label' => 'Format der Datei',
 
-       // M
-       'modele_label_formulaire_formidable' => 'Quel formulaire ?', # NEW
-       'modele_nom_formulaire' => 'un formulaire', # NEW
-
-       // N
-       'noisette_label_afficher_titre_formulaire' => 'Afficher le titre du formulaire ?', # NEW
-       'noisette_label_identifiant' => 'Formulaire à afficher :', # NEW
-       'noisette_nom_noisette_formulaire' => 'Formulaire', # NEW
-
        // R
-       'reponse_aucune' => 'Aucune réponse', # NEW
        'reponse_intro' => '@auteur@ hat auf das Formular geantwortet @formulaire@',
        'reponse_numero' => 'Antwort Nummer:',
        'reponse_statut' => 'Diese Antwort ist:',
        'reponse_supprimer' => 'Diese Antwort löschen',
        'reponse_supprimer_confirmation' => 'Wollen sie diese Antwor wirklich löschen?',
-       'reponse_une' => '1 réponse', # NEW
        'reponses_analyse' => 'Analyse der Antworten',
        'reponses_anonyme' => 'Anonym',
        'reponses_auteur' => 'Nutzer',
@@ -107,7 +74,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'reponses_liste' => 'Liste der Antworten',
        'reponses_liste_prop' => 'Nicht freigegebene Antworten',
        'reponses_liste_publie' => 'Alle freigegebenen Antworten',
-       'reponses_nb' => '@nb@ réponses', # NEW
        'reponses_voir_detail' => 'Antwort anzeigen',
        'retour_aucun_traitement' => 'Ihre Antwort wurde gesendet, jedoch wurde keine Verarbeitungsoption für das Formular festgelegt. Deshalb geschieht mit den Daten aus diesem Formular überhaupt nichts. :)',
 
@@ -115,8 +81,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'sans_reponses' => 'Unbeantwortet',
 
        // T
-       'titre_cadre_raccourcis' => 'Raccourcis', # NEW
-       'traitements_actives' => 'Traitements activés', # NEW
        'traitements_aide_memoire' => 'Merkzettel:',
        'traitements_avertissement_creation' => 'Die Änderungen der Felder des Formulars wurden erfolgreich gespeichert. Jetzt können sie festlege, welche Verarbeitungsschritte nach dem Senden des Formulars ausgef',
        'traitements_avertissement_modification' => 'Die Änderungen der Felder des Formulars wurden erfolgreich gespeichert. <strong>Manche Verarbeitungsoptionen müssen entsprechend neu konfiguriert werden.</strong>',
@@ -138,8 +102,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'traiter_email_option_sujet_accuse_label' => 'Betreff der Empfangsbestätigung',
        'traiter_email_option_sujet_explication' => 'Definieren sie den Betreff mit Hilf der @raccourcis@. Wenn sie das Feld freilassen, wird der Inhalt automatisch erstellt.',
        'traiter_email_option_sujet_label' => 'Betreff der Nachricht',
-       'traiter_email_option_vrai_envoyeur_explication' => 'Certains serveurs SMTP ne permettent pas d\'utiliser un courriel arbitraire pour le champ "From". Pour cette raison Formidable insère par défaut le courriel de l\'envoyeur dans le champ "Reply-To". Cocher ici pour insèrer le courriel dans le champ "From".', # NEW
-       'traiter_email_option_vrai_envoyeur_label' => 'Insérer le courriel de l\'envoyeur dans le champ "From"', # NEW
        'traiter_email_page' => '<a href="@url@">Aus der Seite</a>.',
        'traiter_email_sujet' => '@nom@ hat ihnen geschrieben.',
        'traiter_email_sujet_accuse' => 'Danke für ihre Antwort.',
@@ -148,16 +110,11 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'traiter_enregistrement_description' => 'Einträge in das Formular in der Datenbank speichern',
        'traiter_enregistrement_erreur_base' => 'Beim Speichern in der Datenbank ist ein Fehler aufgetreten',
        'traiter_enregistrement_erreur_deja_repondu' => 'Sie haben dieses Formular bereits ausgefüllt.',
-       'traiter_enregistrement_erreur_edition_reponse_inexistante' => 'La réponse à éditer est introuvable.', # NEW
        'traiter_enregistrement_option_anonymiser_explication' => 'Stellen die Ergebnisse der anonymen Form (nicht halten Trace-Kennung der Befragten).', # MODIF
        'traiter_enregistrement_option_anonymiser_label' => 'Anonymisierter Form',
        'traiter_enregistrement_option_anonymiser_variable_explication' => 'Welches System Variable verwendet, um einen einzelnen Wert für jeden Autor ohne Offenlegung seiner Identität zu berechnen.',
        'traiter_enregistrement_option_anonymiser_variable_label' => 'Variable aus dem anonymisierter Form.',
-       'traiter_enregistrement_option_auteur' => 'Utiliser les auteurs pour les formulaires', # NEW
-       'traiter_enregistrement_option_auteur_explication' => 'Attribuer un ou plusieurs auteurs à un formulaire. Si cette option est activée, seuls les auteurs d\'un formulaire pourront accéder à leurs données.', # NEW
        'traiter_enregistrement_option_choix_select_label' => 'Wählen eine Variable von denen zur Verfügung.',
-       'traiter_enregistrement_option_identification_explication' => 'Si les réponses sont modifiables, quel procédé utiliser en priorité pour connaitre la réponse à modifier ?', # NEW
-       'traiter_enregistrement_option_identification_label' => 'Identification', # NEW
        'traiter_enregistrement_option_moderation_label' => 'Moderation',
        'traiter_enregistrement_option_modifiable_explication' => 'Sollen die Besucher ihre Antworten nachträglich &aauml;ndern können?',
        'traiter_enregistrement_option_modifiable_label' => 'Antworten editierbar',
index a2f393e..bee8472 100644 (file)
@@ -62,10 +62,10 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'erreur_importer_forms' => 'Error while importing the Forms&Tables form',
        'erreur_importer_wcs' => 'Error while importing the W.C.S form',
        'erreur_importer_yaml' => 'Error while importing the YAML file',
-       'erreur_inexistant' => 'This form doesn\'t exist.',
+       'erreur_inexistant' => 'This form doesnt exist.',
 
        // F
-       'formulaire_anonyme_explication' => 'This form is anonymous; meaning that the user\'s identity won\'t be recorded.',
+       'formulaire_anonyme_explication' => 'This form is anonymous; meaning that the user’s identity won’t be recorded.',
        'formulaires_aucun' => 'There is no form for now',
        'formulaires_dupliquer' => 'Duplicate the form',
        'formulaires_dupliquer_copie' => '(copy)',
@@ -149,12 +149,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'traiter_enregistrement_erreur_base' => 'An error occurred while writing to the database',
        'traiter_enregistrement_erreur_deja_repondu' => 'You have already filled in this form.',
        'traiter_enregistrement_erreur_edition_reponse_inexistante' => 'The answer to edit can not be found.',
-       'traiter_enregistrement_option_anonymiser_explication' => 'Make the form results anonymous (don\'t keep any tracks of user who have answered).',
+       'traiter_enregistrement_option_anonymiser_explication' => 'Make the form results anonymous (dont keep any tracks of user who have answered).',
        'traiter_enregistrement_option_anonymiser_label' => 'Anonymize form',
        'traiter_enregistrement_option_anonymiser_variable_explication' => 'What system variable used to calculate a single value for each author without revealing his identity.',
        'traiter_enregistrement_option_anonymiser_variable_label' => 'Variable from witch the form will be anonymized',
        'traiter_enregistrement_option_auteur' => 'Link authors to the forms',
-       'traiter_enregistrement_option_auteur_explication' => 'Bind one or more authors to a form. If activated, this option prevents anyone except the author(s) to access form\'s configuration or results.',
+       'traiter_enregistrement_option_auteur_explication' => 'Bind one or more authors to a form. If activated, this option prevents anyone except the author(s) to access forms configuration or results.',
        'traiter_enregistrement_option_choix_select_label' => 'Select a variable from the available',
        'traiter_enregistrement_option_identification_explication' => 'If the answers can be changed, which method is used first to know the answer to modify ?',
        'traiter_enregistrement_option_identification_label' => 'Identification',
index 9e3e336..ff542c6 100644 (file)
@@ -43,7 +43,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'editer_descriptif_explication' => 'Una explicación del formulario para la zona privada.',
        'editer_identifiant' => 'Nombre de usuario',
        'editer_identifiant_explication' => 'Da un único identificador textual que permita llamar al formulario de manera más sencilla',
-       'editer_menu_auteurs' => 'Configurer les auteurs', # NEW
        'editer_menu_champs' => 'Configurar los campos',
        'editer_menu_formulaire' => 'Configurar el formulario',
        'editer_menu_traitements' => 'Configurar los tratamientos',
@@ -152,8 +151,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'traiter_enregistrement_option_anonymiser_label' => 'Anonimizar el formulario',
        'traiter_enregistrement_option_anonymiser_variable_explication' => '¿Qué variable de sistema utilizará para calcular un valor único para cada autor sin revelar su identidad ?',
        'traiter_enregistrement_option_anonymiser_variable_label' => 'Variable del formulario que anonimiza',
-       'traiter_enregistrement_option_auteur' => 'Utiliser les auteurs pour les formulaires', # NEW
-       'traiter_enregistrement_option_auteur_explication' => 'Attribuer un ou plusieurs auteurs à un formulaire. Si cette option est activée, seuls les auteurs d\'un formulaire pourront accéder à leurs données.', # NEW
        'traiter_enregistrement_option_choix_select_label' => 'Seleccione una variable de las disponibles',
        'traiter_enregistrement_option_identification_explication' => '¿Si las respuestas se pueden modificar, cuál es el método para usar en primer lugar para conocer la respuesta a modificar?',
        'traiter_enregistrement_option_identification_label' => 'Identificación',
index 25b1f92..528f75c 100644 (file)
@@ -6,13 +6,17 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // A
+       'admin_reponses_auteur' => 'Autoriser les auteurs des formulaires à modifier les réponses',
+       'admin_reponses_auteur_explication' => 'Seul les administrateurs peuvent normalement modifier les réponses apportées à un formulaire (à la poubelle, publiée, proposé à l’évaluation). Cette option permet à un auteur d’un formulaire d’en modifier le statut (au risque de fausser d’éventuelles statistiques).',
        'analyse_avec_reponse' => 'Réponses non-vide',
-       'analyse_exporter' => 'Exporter l\'analyse',
+       'analyse_exclure_champs_explication' => 'Mettre le nom des champs à exclure dans l’analyse, séparé par des <code>|</code>. Ne pas mettre les <code>@</code>.',
+       'analyse_exclure_champs_label' => 'Champs à exclure',
+       'analyse_exporter' => 'Exporter l’analyse',
        'analyse_longueur_moyenne' => 'Longueur moyenne en nombre de mots',
        'analyse_nb_reponses_total' => '@nb@ personnes ont répondu à ce formulaire.',
        'analyse_sans_reponse' => 'Laissés blanc',
        'analyse_une_reponse_total' => 'Une personne a répondu à ce formulaire.',
-       'analyse_zero_reponse_total' => 'Aucune personne n\'a répondu à ce formulaire.',
+       'analyse_zero_reponse_total' => 'Aucune personne na répondu à ce formulaire.',
        'aucun_traitement' => 'Aucun traitement',
 
        // B
@@ -21,10 +25,10 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        // C
        'cfg_analyse_classe_explication' => 'Vous pouvez indiquer des classes CSS qui seront ajoutées
                sur le conteneur de chaque graphique, tel que <code>gray</code>,<code>blue</code>,
-               <code>orange</code>, <code>green</code> ou tout ce qui vous plairait !',
+               <code>orange</code>, <code>green</code> ou tout ce qui vous plairait !',
        'cfg_analyse_classe_label' => 'Classe CSS de la barre de progression',
        'cfg_titre_page_configurer_formidable' => 'Configurer Formidable',
-       'cfg_titre_parametrages_analyse' => 'Paramétrages de l\'analyse des réponses',
+       'cfg_titre_parametrages_analyse' => 'Paramétrages de lanalyse des réponses',
        'champs' => 'Champs',
 
        // E
@@ -36,46 +40,46 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'editer_apres_choix_rien' => 'Rien du tout',
        'editer_apres_choix_stats' => 'Les statistiques des réponses',
        'editer_apres_choix_valeurs' => 'Les valeurs saisies',
-       'editer_apres_explication' => 'Après validation, afficher à la place du formulaire :',
+       'editer_apres_explication' => 'Après validation, afficher à la place du formulaire :',
        'editer_apres_label' => 'Afficher ensuite',
        'editer_descriptif' => 'Descriptif',
-       'editer_descriptif_explication' => 'Une explication du formulaire destinée à l\'espace privé.',
+       'editer_descriptif_explication' => 'Une explication du formulaire destinée à lespace privé.',
        'editer_identifiant' => 'Identifiant',
-       'editer_identifiant_explication' => 'Donnez un identifiant textuel unique qui vous permettra d\'appeler plus facilement le formulaire.',
+       'editer_identifiant_explication' => 'Donnez un identifiant textuel unique qui vous permettra dappeler plus facilement le formulaire.',
        'editer_menu_auteurs' => 'Configurer les auteurs',
        'editer_menu_champs' => 'Configurer les champs',
        'editer_menu_formulaire' => 'Configurer le formulaire',
        'editer_menu_traitements' => 'Configurer les traitements',
        'editer_message_ok' => 'Message de retour',
-       'editer_message_ok_explication' => 'Vous pouvez personnaliser le message qui sera affiché à l\'utilisateur après l\'envoi d\'un formulaire valide.',
+       'editer_message_ok_explication' => 'Vous pouvez personnaliser le message qui sera affiché à l’utilisateur après l’envoi d’un formulaire valide.',
        'editer_modifier_formulaire' => 'Modifier le formulaire',
        'editer_nouveau' => 'Nouveau formulaire',
        'editer_redirige_url' => 'Adresse de redirection après validation',
        'editer_redirige_url_explication' => 'Laissez vide si vous souhaitez rester sur la même page',
        'editer_titre' => 'Titre',
-       'erreur_autorisation' => 'Vous n\'avez pas le droit d\'éditer les formulaires du site.',
-       'erreur_base' => 'Une erreur technique est survenue durant l\'enregistrement.',
+       'erreur_autorisation' => 'Vous n’avez pas le droit d’éditer les formulaires du site.',
+       'erreur_base' => 'Une erreur technique est survenue durant lenregistrement.',
        'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier votre envoi.',
        'erreur_identifiant' => 'Cet identifiant est déjà utilisé.',
-       'erreur_importer_forms' => 'Erreur durant l\'importation du formulaire Forms&Tables',
-       'erreur_importer_wcs' => 'Erreur durant l\'importation du formulaire W.C.S',
-       'erreur_importer_yaml' => 'Erreur durant l\'importation du fichier YAML',
-       'erreur_inexistant' => 'Le formulaire n\'existe pas.',
+       'erreur_importer_forms' => 'Erreur durant limportation du formulaire Forms&Tables',
+       'erreur_importer_wcs' => 'Erreur durant limportation du formulaire W.C.S',
+       'erreur_importer_yaml' => 'Erreur durant limportation du fichier YAML',
+       'erreur_inexistant' => 'Le formulaire nexiste pas.',
 
        // F
-       'formulaire_anonyme_explication' => 'Ce formulaire est anonyme, c\'est à dire que l\'identité de l\'utilisateur n\'est pas enregistrée.',
-       'formulaires_aucun' => 'Il n\'y a pour l\'instant aucun formulaire.',
+       'formulaire_anonyme_explication' => 'Ce formulaire est anonyme, c’est à dire que l’identité de l’utilisateur n’est pas enregistrée.',
+       'formulaires_aucun' => 'Il n’y a pour l’instant aucun formulaire.',
        'formulaires_dupliquer' => 'Dupliquer le formulaire',
        'formulaires_dupliquer_copie' => '(copie)',
        'formulaires_introduction' => 'Créez et configurez ici les formulaires de votre site.',
        'formulaires_nouveau' => 'Créer un nouveau formulaire',
        'formulaires_supprimer' => 'Supprimer le formulaire',
-       'formulaires_supprimer_confirmation' => 'Attention, cela supprimera aussi tous les résultats. Êtes-vous sûr de vouloir supprimer ce formulaire ?',
+       'formulaires_supprimer_confirmation' => 'Attention, cela supprimera aussi tous les résultats. Êtes-vous sûr de vouloir supprimer ce formulaire ?',
        'formulaires_tous' => 'Tous les formulaires',
 
        // I
        'identification_par_cookie' => 'Par cookie',
-       'identification_par_id_auteur' => 'Par l\'identifiant (id_auteur) de la personne authentifiée',
+       'identification_par_id_auteur' => 'Par lidentifiant (id_auteur) de la personne authentifiée',
        'importer_formulaire' => 'Importer un formulaire',
        'importer_formulaire_fichier_label' => 'Fichier à importer',
        'importer_formulaire_format_label' => 'Format du fichier',
@@ -92,10 +96,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        // R
        'reponse_aucune' => 'Aucune réponse',
        'reponse_intro' => '@auteur@ a répondu au formulaire @formulaire@',
-       'reponse_numero' => 'Réponse numéro :',
-       'reponse_statut' => 'Cette réponse est :',
+       'reponse_numero' => 'Réponse numéro :',
+       'reponse_statut' => 'Cette réponse est :',
        'reponse_supprimer' => 'Supprimer cette réponse',
-       'reponse_supprimer_confirmation' => 'Êtes-vous sûr de vouloir supprimer cette réponse ?',
+       'reponse_supprimer_confirmation' => 'Êtes-vous sûr de vouloir supprimer cette réponse ?',
+       'reponses_supprimer' => 'Supprimer toutes les réponses à ce formulaire',
+       'reponses_supprimer_confirmation' => 'Êtes-vous sûr de vouloir supprimer toutes les réponses à ce formulaire ?',
        'reponse_une' => '1 réponse',
        'reponses_analyse' => 'Analyse des réponses',
        'reponses_anonyme' => 'Anonyme',
@@ -107,7 +113,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'reponses_liste_publie' => 'Toutes les réponses validées',
        'reponses_nb' => '@nb@ réponses',
        'reponses_voir_detail' => 'Voir la réponse',
-       'retour_aucun_traitement' => 'Votre réponse a bien été envoyée, mais aucun traitement n\'a été défini pour ce formulaire. Il ne fait donc rien. :)',
+       'retour_aucun_traitement' => 'Votre réponse a bien été envoyée, mais aucun traitement n’a été défini pour ce formulaire. Il ne fait donc rien. :)',
 
        // S
        'sans_reponses' => 'Sans réponse',
@@ -115,57 +121,61 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        // T
        'titre_cadre_raccourcis' => 'Raccourcis',
        'traitements_actives' => 'Traitements activés',
-       'traitements_aide_memoire' => 'Aide mémoire :',
-       'traitements_avertissement_creation' => 'Les modifications sur les champs du formulaire ont été enregistrées avec succès. Vous pouvez maintenant définir quels traitements seront effectués lors de l\'utilisation du formulaire.',
+       'traitements_aide_memoire' => 'Aide mémoire :',
+       'traitements_avertissement_creation' => 'Les modifications sur les champs du formulaire ont été enregistrées avec succès. Vous pouvez maintenant définir quels traitements seront effectués lors de lutilisation du formulaire.',
        'traitements_avertissement_modification' => 'Les modifications sur les champs du formulaire ont été enregistrées avec succès. <strong>Certains traitements doivent peut-être être reconfigurés en conséquence.</strong>',
        'traitements_champ_aucun' => 'Aucun',
        'traiter_email_description' => 'Poste le résultat du formulaire par courriel à une liste de destinataires.',
        'traiter_email_horodatage' => 'Formulaire "@formulaire@" posté le @date@ à @heure@.',
-       'traiter_email_message_erreur' => 'Une erreur est survenue lors de l\'envoi du courriel.',
+       'traiter_email_message_erreur' => 'Une erreur est survenue lors de lenvoi du courriel.',
        'traiter_email_message_ok' => 'Votre message a bien été envoyé par courriel.',
        'traiter_email_option_activer_accuse_label' => 'Accusé de réception',
-       'traiter_email_option_activer_accuse_label_case' => 'Envoyer aussi un courriel à l\'adresse de l\'envoyeur avec un message de confirmation.',
+       'traiter_email_option_activer_accuse_label_case' => 'Envoyer aussi un courriel à l’adresse de l’envoyeur avec un message de confirmation.',
+       'traiter_email_option_destinataires_champ_form_explication' => 'Si un de vos champ est une adresse email et que vous souhaitez envoyer le formulaire à cette adresse, sélectionnez le champ.',
+       'traiter_email_option_destinataires_champ_form_label' => 'Destinaire présent dans un des champ des formulaires',
        'traiter_email_option_destinataires_explication' => 'Choisissez le champ qui correspondra aux destinataires du message.',
        'traiter_email_option_destinataires_label' => 'Destinataires',
-       'traiter_email_option_destinataires_plus_explication' => 'Une liste d\'adresses séparées par des virgules.',
+       'traiter_email_option_destinataires_plus_explication' => 'Une liste dadresses séparées par des virgules.',
        'traiter_email_option_destinataires_plus_label' => 'Destinataires supplémentaires',
-       'traiter_email_option_envoyeur_courriel_explication' => 'Choisissez le champ qui contiendra le courriel de l\'envoyeur.',
-       'traiter_email_option_envoyeur_courriel_label' => 'Courriel de l\'envoyeur',
-       'traiter_email_option_envoyeur_nom_explication' => 'Construisez ce nom à l\'aide des @raccourcis@ (cf. l\'aide mémoire). Si vous ne mettez rien, ce sera le nom du site.',
-       'traiter_email_option_envoyeur_nom_label' => 'Nom de l\'envoyeur',
-       'traiter_email_option_sujet_accuse_label' => 'Sujet de l\'accusé de réception',
-       'traiter_email_option_sujet_explication' => 'Construisez le sujet à l\'aide des @raccourcis@. Si vous ne mettez rien, le sujet sera construit automatiquement.',
+       'traiter_email_option_envoyeur_courriel_explication' => 'Choisissez le champ qui contiendra le courriel de lenvoyeur.',
+       'traiter_email_option_envoyeur_courriel_label' => 'Courriel de lenvoyeur',
+       'traiter_email_option_envoyeur_nom_explication' => 'Construisez ce nom à l’aide des @raccourcis@ (cf. l’aide mémoire). Si vous ne mettez rien, ce sera le nom du site.',
+       'traiter_email_option_envoyeur_nom_label' => 'Nom de lenvoyeur',
+       'traiter_email_option_sujet_accuse_label' => 'Sujet de laccusé de réception',
+       'traiter_email_option_sujet_explication' => 'Construisez le sujet à laide des @raccourcis@. Si vous ne mettez rien, le sujet sera construit automatiquement.',
        'traiter_email_option_sujet_label' => 'Sujet du message',
-       'traiter_email_option_vrai_envoyeur_explication' => 'Certains serveurs SMTP ne permettent pas d\'utiliser un courriel arbitraire pour le champ "From". Pour cette raison Formidable insère par défaut le courriel de l\'envoyeur dans le champ "Reply-To". Cocher ici pour insèrer le courriel dans le champ "From".',
-       'traiter_email_option_vrai_envoyeur_label' => 'Insérer le courriel de l\'envoyeur dans le champ "From"',
+       'traiter_email_option_vrai_envoyeur_explication' => 'Certains serveurs SMTP ne permettent pas d’utiliser un courriel arbitraire pour le champ "From". Pour cette raison Formidable insère par défaut le courriel de l’envoyeur dans le champ "Reply-To". Cocher ici pour insèrer le courriel dans le champ "From".',
+       'traiter_email_option_vrai_envoyeur_label' => 'Insérer le courriel de lenvoyeur dans le champ "From"',
        'traiter_email_page' => '<a href="@url@">Depuis cette page</a>.',
        'traiter_email_sujet' => '@nom@ vous a écrit.',
        'traiter_email_sujet_accuse' => 'Merci de votre réponse.',
        'traiter_email_titre' => 'Envoyer par courriel',
        'traiter_email_url_enregistrement' => 'Vous pouvez gérer les réponses <a href="@url@">sur cette page</a>.',
        'traiter_enregistrement_description' => 'Enregistre les résultats du formulaire dans la base de données',
-       'traiter_enregistrement_erreur_base' => 'Une erreur technique est survenue durant l\'enregistrement en base de données',
+       'traiter_enregistrement_erreur_base' => 'Une erreur technique est survenue durant lenregistrement en base de données',
        'traiter_enregistrement_erreur_deja_repondu' => 'Vous avez déjà répondu à ce formulaire.',
        'traiter_enregistrement_erreur_edition_reponse_inexistante' => 'La réponse à éditer est introuvable.',
-       'traiter_enregistrement_option_anonymiser_explication' => 'Rendre les résultats du formulaire anonymes (ne pas garder de traces de l\'identifiant des personnes ayant répondu).',
+       'traiter_enregistrement_message_ok' => 'Merci. Vos réponses ont bien été enregistrées',
+       'traiter_enregistrement_option_anonymiser_explication' => 'Rendre les résultats du formulaire anonymes (ne pas garder de traces de l’identifiant des personnes ayant répondu).',
        'traiter_enregistrement_option_anonymiser_label' => 'Anonymiser le formulaire',
        'traiter_enregistrement_option_anonymiser_variable_explication' => 'Quelle variable système utiliser pour calculer une valeur unique pour chaque auteur sans pour autant révéler son identité.',
        'traiter_enregistrement_option_anonymiser_variable_label' => 'Variable à partir de laquelle anonymiser le formulaire',
        'traiter_enregistrement_option_auteur' => 'Utiliser les auteurs pour les formulaires',
-       'traiter_enregistrement_option_auteur_explication' => 'Attribuer un ou plusieurs auteurs à un formulaire. Si cette option est activée, seuls les auteurs d\'un formulaire pourront accéder à leurs données.',
+       'traiter_enregistrement_option_auteur_explication' => 'Attribuer un ou plusieurs auteurs à un formulaire. Si cette option est activée, seuls les auteurs dun formulaire pourront accéder à leurs données.',
        'traiter_enregistrement_option_choix_select_label' => 'Choisir une variable parmi celles proposées',
-       'traiter_enregistrement_option_identification_explication' => 'Si les réponses sont modifiables, quel procédé utiliser en priorité pour connaitre la réponse à modifier ?',
+       'traiter_enregistrement_option_identification_explication' => 'Si les réponses sont modifiables, quel procédé utiliser en priorité pour connaitre la réponse à modifier ?',
        'traiter_enregistrement_option_identification_label' => 'Identification',
+       'traiter_enregistrement_option_ip_label' => 'Enregistrer les IPs (masqués à intervalle régulière)',
        'traiter_enregistrement_option_moderation_label' => 'Modération',
-       'traiter_enregistrement_option_modifiable_explication' => 'Les visiteurs pourront-ils modifier leurs réponses après coup ?',
+       'traiter_enregistrement_option_modifiable_explication' => 'Les visiteurs pourront-ils modifier leurs réponses après coup ?',
        'traiter_enregistrement_option_modifiable_label' => 'Réponses modifiables',
-       'traiter_enregistrement_option_multiple_explication' => 'Une même personne peut-elle répondre plusieurs fois au formulaire ?',
+       'traiter_enregistrement_option_multiple_explication' => 'Une même personne peut-elle répondre plusieurs fois au formulaire ?',
        'traiter_enregistrement_option_multiple_label' => 'Réponses multiples',
        'traiter_enregistrement_titre' => 'Enregistrer les résultats',
 
        // V
        'voir_exporter' => 'Exporter le formulaire',
-       'voir_numero' => 'Formulaire numéro :',
+       'voir_numero' => 'Formulaire numéro :',
        'voir_reponses' => 'Voir les réponses',
        'voir_traitements' => 'Traitements'
 );
index 476b826..3bda8f1 100644 (file)
@@ -9,24 +9,14 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // A
        'analyse_avec_reponse' => 'Risposte non vuote',
-       'analyse_exporter' => 'Esporta l\'analisi',
+       'analyse_exporter' => 'Esporta lanalisi',
        'analyse_longueur_moyenne' => 'Lunghezza media in numero di parole',
-       'analyse_nb_reponses_total' => '@nb@ personnes ont répondu à ce formulaire.', # NEW
        'analyse_sans_reponse' => 'Risposte vuote',
-       'analyse_une_reponse_total' => 'Une personne a répondu à ce formulaire.', # NEW
-       'analyse_zero_reponse_total' => 'Aucune personne n\'a répondu à ce formulaire.', # NEW
-       'aucun_traitement' => 'Aucun traitement', # NEW
 
        // B
        'bouton_formulaires' => 'Moduli',
 
        // C
-       'cfg_analyse_classe_explication' => 'Vous pouvez indiquer des classes CSS qui seront ajoutées
-               sur le conteneur de chaque graphique, tel que <code>gray</code>,<code>blue</code>,
-               <code>orange</code>, <code>green</code> ou tout ce qui vous plairait !', # NEW
-       'cfg_analyse_classe_label' => 'Classe CSS de la barre de progression', # NEW
-       'cfg_titre_page_configurer_formidable' => 'Configurer Formidable', # NEW
-       'cfg_titre_parametrages_analyse' => 'Paramétrages de l\'analyse des réponses', # NEW
        'champs' => 'Campi',
 
        // E
@@ -36,7 +26,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'editer_apres_choix_formulaire' => 'Il modulo, nuovamente',
        'editer_apres_choix_redirige' => 'Redirigi verso un nuovo indirizzo',
        'editer_apres_choix_rien' => 'Assolutamente niente',
-       'editer_apres_choix_stats' => 'Les statistiques des réponses', # NEW
        'editer_apres_choix_valeurs' => 'I valori immessi',
        'editer_apres_explication' => 'Dopo la validazione, mostra al posto del modulo:',
        'editer_apres_label' => 'Mostra di seguito',
@@ -44,12 +33,11 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'editer_descriptif_explication' => 'Una spiegazione del modulo destinata allo spazio redazionale.',
        'editer_identifiant' => 'Identificativo',
        'editer_identifiant_explication' => 'Fornisci un identificativo testuale unico che ti permetterà di richiamare più facilmente il modulo.',
-       'editer_menu_auteurs' => 'Configurer les auteurs', # NEW
        'editer_menu_champs' => 'Configura i campi',
        'editer_menu_formulaire' => 'Configura il modulo',
        'editer_menu_traitements' => 'Configura i trattamenti',
        'editer_message_ok' => 'Messaggio di risposta',
-       'editer_message_ok_explication' => 'Puoi personalizzare il messaggio che sarà mostrato all\'utente dopo l\'invio di un modulo valido.',
+       'editer_message_ok_explication' => 'Puoi personalizzare il messaggio che sarà mostrato all’utente dopo l’invio di un modulo valido.',
        'editer_modifier_formulaire' => 'Modifica il modulo',
        'editer_nouveau' => 'Nuovo modulo',
        'editer_redirige_url' => 'Indirizzo di redirezione dopo la validazione',
@@ -59,13 +47,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'erreur_base' => 'Un problema tecnico si è verificato rurante il salvataggio.',
        'erreur_generique' => 'Ci sono degli errori nei campi di seguito, si prega di verificare i dati.',
        'erreur_identifiant' => 'Questo identificativo è già utilizzato.',
-       'erreur_importer_forms' => 'Errore durante l\'importazione del modulo Forms&Tables',
-       'erreur_importer_wcs' => 'Errore durante l\'importazione del modulo W.C.S',
-       'erreur_importer_yaml' => 'Errore durante l\'importazione del modulo YAML',
+       'erreur_importer_forms' => 'Errore durante limportazione del modulo Forms&Tables',
+       'erreur_importer_wcs' => 'Errore durante limportazione del modulo W.C.S',
+       'erreur_importer_yaml' => 'Errore durante limportazione del modulo YAML',
        'erreur_inexistant' => 'Il modulo non esiste.',
 
        // F
-       'formulaire_anonyme_explication' => 'Ce formulaire est anonyme ; c\'est à dire que l\'identité de l\'utilisateur n\'est pas enregistrée.', # NEW
        'formulaires_aucun' => 'Al momento non è presente alcun modulo.',
        'formulaires_dupliquer' => 'Duplica il modulo',
        'formulaires_dupliquer_copie' => '(copia)',
@@ -77,7 +64,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // I
        'identification_par_cookie' => 'Con i cookie',
-       'identification_par_id_auteur' => 'con l\'identificativo (id_auteur) dell\'utente autentificato',
+       'identification_par_id_auteur' => 'con l’identificativo (id_auteur) dell’utente autentificato',
        'importer_formulaire' => 'Importa un modulo',
        'importer_formulaire_fichier_label' => 'File da importare',
        'importer_formulaire_format_label' => 'Formato del file',
@@ -92,13 +79,11 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'noisette_nom_noisette_formulaire' => 'Modulo',
 
        // R
-       'reponse_aucune' => 'Aucune réponse', # NEW
        'reponse_intro' => '@auteur@ ha risposto al modulo @formulaire@',
        'reponse_numero' => 'Risposta numero:',
        'reponse_statut' => 'Questa risposta è:',
        'reponse_supprimer' => 'Elimina questa risposta',
        'reponse_supprimer_confirmation' => 'Sei sicuro di voler eliminare questa risposta?',
-       'reponse_une' => '1 réponse', # NEW
        'reponses_analyse' => 'Analisi delle risposte',
        'reponses_anonyme' => 'Anonimo',
        'reponses_auteur' => 'Utente',
@@ -107,7 +92,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'reponses_liste' => 'Elenco delle risposte',
        'reponses_liste_prop' => 'Risposte in attesa di validazione',
        'reponses_liste_publie' => 'Tutte le risposte valide',
-       'reponses_nb' => '@nb@ réponses', # NEW
        'reponses_voir_detail' => 'Vedi la risposta',
        'retour_aucun_traitement' => 'La risposta è stata correttamente inviata. Grazie :)',
 
@@ -115,31 +99,27 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'sans_reponses' => 'Senza risposta',
 
        // T
-       'titre_cadre_raccourcis' => 'Raccourcis', # NEW
-       'traitements_actives' => 'Traitements activés', # NEW
        'traitements_aide_memoire' => 'Promemoria:',
-       'traitements_avertissement_creation' => 'Le modifiche ai campi del modulo sono state registrate con successo. Ora puoi definire quali trattamenti saranno effettuati all\'atto dell\'invio del modulo.',
+       'traitements_avertissement_creation' => 'Le modifiche ai campi del modulo sono state registrate con successo. Ora puoi definire quali trattamenti saranno effettuati all’atto dell’invio del modulo.',
        'traitements_avertissement_modification' => 'La modifiche ai campi del modulo sono state registrate con successo. <strong>Alcuni trattamenti devono forse essere riconfigurati di conseguenza.</strong>',
        'traitements_champ_aucun' => 'Nessuno',
        'traiter_email_description' => 'Invia il risultato del modulo per posta a un elenco di destinatari.',
        'traiter_email_horodatage' => 'Modulo "@formulaire@" inviato il @date@ alle @heure@.',
-       'traiter_email_message_erreur' => 'Si è verificato un errore all\'atto dell\'invio dell\'email.',
+       'traiter_email_message_erreur' => 'Si è verificato un errore all’atto dell’invio dell’email.',
        'traiter_email_message_ok' => 'Il tuo messaggio è stato inviato per posta elettronica.',
        'traiter_email_option_activer_accuse_label' => 'Conferma di ricezione',
-       'traiter_email_option_activer_accuse_label_case' => 'Invia anche una email all\'indirizzo del mittente con un messaggio di conferma.',
+       'traiter_email_option_activer_accuse_label_case' => 'Invia anche una email allindirizzo del mittente con un messaggio di conferma.',
        'traiter_email_option_destinataires_explication' => 'Scegli il campo che corrisponde al destinatario del messaggio.',
        'traiter_email_option_destinataires_label' => 'Destinatari',
        'traiter_email_option_destinataires_plus_explication' => 'Un elenco di indirizzi separati da virgole.',
        'traiter_email_option_destinataires_plus_label' => 'Destinatari supplementari',
-       'traiter_email_option_envoyeur_courriel_explication' => 'Scegli il campo che contiene l\'indirizzo dell\'utente.',
+       'traiter_email_option_envoyeur_courriel_explication' => 'Scegli il campo che contiene l’indirizzo dell’utente.',
        'traiter_email_option_envoyeur_courriel_label' => 'Indirizzo del mittente',
-       'traiter_email_option_envoyeur_nom_explication' => 'Costruisci questo nome grazie all\'aiuto dei @segnaposto@ (vedi il promemoria). Se non inserisci nulla, verrà inserito il nome del sito.',
+       'traiter_email_option_envoyeur_nom_explication' => 'Costruisci questo nome grazie allaiuto dei @segnaposto@ (vedi il promemoria). Se non inserisci nulla, verrà inserito il nome del sito.',
        'traiter_email_option_envoyeur_nom_label' => 'Nome del mittente',
        'traiter_email_option_sujet_accuse_label' => 'Oggetto della conferma di ricezione',
-       'traiter_email_option_sujet_explication' => 'Costruisci l\'oggetto grazie all\'aiuto dei @segnaposto@. Se non inserisci nulla, l\'oggetto verrà generato automaticamente.',
+       'traiter_email_option_sujet_explication' => 'Costruisci l’oggetto grazie all’aiuto dei @segnaposto@. Se non inserisci nulla, l’oggetto verrà generato automaticamente.',
        'traiter_email_option_sujet_label' => 'Oggetto del messaggio',
-       'traiter_email_option_vrai_envoyeur_explication' => 'Certains serveurs SMTP ne permettent pas d\'utiliser un courriel arbitraire pour le champ "From". Pour cette raison Formidable insère par défaut le courriel de l\'envoyeur dans le champ "Reply-To". Cocher ici pour insèrer le courriel dans le champ "From".', # NEW
-       'traiter_email_option_vrai_envoyeur_label' => 'Insérer le courriel de l\'envoyeur dans le champ "From"', # NEW
        'traiter_email_page' => '<a href="@url@">Da questa pagina</a>.',
        'traiter_email_sujet' => '@nom@ ti ha scritto.',
        'traiter_email_sujet_accuse' => 'Grazie per aver risposto.',
@@ -153,9 +133,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'traiter_enregistrement_option_anonymiser_label' => 'Modo anonimo',
        'traiter_enregistrement_option_anonymiser_variable_explication' => 'Quale variabile di sistema utilizzato per calcolare un singolo valore per ogni autore, senza rivelare la propria identità.',
        'traiter_enregistrement_option_anonymiser_variable_label' => 'Variabile da cui la forma anonima',
-       'traiter_enregistrement_option_auteur' => 'Utiliser les auteurs pour les formulaires', # NEW
-       'traiter_enregistrement_option_auteur_explication' => 'Attribuer un ou plusieurs auteurs à un formulaire. Si cette option est activée, seuls les auteurs d\'un formulaire pourront accéder à leurs données.', # NEW
-       'traiter_enregistrement_option_choix_select_label' => 'Choisir une variable parmi celles proposées', # NEW
        'traiter_enregistrement_option_identification_explication' => 'Se le risposte sono modificabili, quale procedura si dovrà utilizzare in priorità per individuare la risposta da modificare?',
        'traiter_enregistrement_option_identification_label' => 'Identificazione',
        'traiter_enregistrement_option_moderation_label' => 'Moderazione',
index e7997a7..33edb66 100644 (file)
@@ -27,7 +27,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'cfg_analyse_classe_label' => 'Trieda CSS stĺpca dokončenia úkonu',
        'cfg_titre_page_configurer_formidable' => 'Nastaviť Formidable',
        'cfg_titre_parametrages_analyse' => 'Nastavenia analýzy odpovedí',
-       'champs' => 'Pol\'a',
+       'champs' => 'Pola',
 
        // E
        'echanger_formulaire_forms_importer' => 'formuláre Forms & Tables (.xml)',
@@ -40,11 +40,11 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'editer_apres_choix_valeurs' => 'Zadané hodnoty',
        'editer_apres_explication' => 'Po potvrdení namiesto formulára zobraziť:',
        'editer_apres_label' => 'Zobraziť potom',
-       'editer_descriptif' => 'Popis',
+       'editer_descriptif' => 'Opis',
        'editer_descriptif_explication' => 'Vysvetlivka formulára pre súkromnú zónu.',
        'editer_identifiant' => 'Identifikátor',
        'editer_identifiant_explication' => 'Zadajte jedinečný textový identifikátor, ktorý vám umožní rýchlo vyvolať formulár.',
-       'editer_menu_auteurs' => 'Configurer les auteurs', # NEW
+       'editer_menu_auteurs' => 'Nastaviť autorov',
        'editer_menu_champs' => 'Nastaviť polia',
        'editer_menu_formulaire' => 'Nastaviť formulár',
        'editer_menu_traitements' => 'Nastaviť funkcie',
@@ -65,7 +65,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'erreur_inexistant' => 'Formulár neexistuje.',
 
        // F
-       'formulaire_anonyme_explication' => 'Ce formulaire est anonyme ; c\'est à dire que l\'identité de l\'utilisateur n\'est pas enregistrée.', # NEW
+       'formulaire_anonyme_explication' => 'Tento formulár je anonymný, tzn., že záznamy o identite používateľov sa neukladajú.',
        'formulaires_aucun' => 'Momentálne tu nie je žiaden formulár.',
        'formulaires_dupliquer' => 'Skopírovať formulár',
        'formulaires_dupliquer_copie' => '(kópia)',
@@ -149,12 +149,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'traiter_enregistrement_erreur_base' => 'Počas ukladania do databázy sa vyskytla technická chyba',
        'traiter_enregistrement_erreur_deja_repondu' => 'Tento formulár ste už vyplnili.',
        'traiter_enregistrement_erreur_edition_reponse_inexistante' => 'Odpoveď, ktorú chcete upraviť, sa nedá nájsť.',
-       'traiter_enregistrement_option_anonymiser_explication' => 'Urobte výsledky anonymnej forme (nevedú trasovanie identifikátor respondentov).', # MODIF
+       'traiter_enregistrement_option_anonymiser_explication' => 'Vypísať výsledky anonymného formulára(nenechávať si záznamy identifikujúce respondentov).',
        'traiter_enregistrement_option_anonymiser_label' => 'Anonymizované podobe',
        'traiter_enregistrement_option_anonymiser_variable_explication' => 'Čo systémová premenná slúži na výpočet jednej hodnoty pre každého autora, bez toho, aby odhalil svoju identitu.',
        'traiter_enregistrement_option_anonymiser_variable_label' => 'Premenná, z ktorých anonymizujú formulár',
-       'traiter_enregistrement_option_auteur' => 'Utiliser les auteurs pour les formulaires', # NEW
-       'traiter_enregistrement_option_auteur_explication' => 'Attribuer un ou plusieurs auteurs à un formulaire. Si cette option est activée, seuls les auteurs d\'un formulaire pourront accéder à leurs données.', # NEW
+       'traiter_enregistrement_option_auteur' => 'Použiť mená autorov vo formulároch',
+       'traiter_enregistrement_option_auteur_explication' => 'K formuláru priradiť jedného autora alebo viacerých. Ak aktivujete túto možnosť, k údajom formulára budú mať prístup len autori formulára.',
        'traiter_enregistrement_option_choix_select_label' => 'Vyberte premennú, ktorá z dostupnej',
        'traiter_enregistrement_option_identification_explication' => 'Ak sa odpovede dajú upraviť, aký spôsob sa použije ako prvý, aby sa zistilo, či sa odpoveď menila?',
        'traiter_enregistrement_option_identification_label' => 'Identifikácia',
diff --git a/www/plugins/formidable_1_0/lang/paquet-formidable.xml b/www/plugins/formidable_1_0/lang/paquet-formidable.xml
new file mode 100644 (file)
index 0000000..d368f2e
--- /dev/null
@@ -0,0 +1,4 @@
+<traduction module="paquet-formidable" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/formidable/trunk/lang/" reference="fr">
+       <langue code="fr" url="http://trad.spip.net/tradlang_module/paquet-formidable?lang_cible=fr" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+       </langue>
+</traduction>
index 9728239..3647950 100644 (file)
@@ -1,19 +1,13 @@
 <?php
-
-// Ceci est un fichier langue de SPIP -- This is a SPIP language file
-
-///  Fichier produit par PlugOnet
-// Module: paquet-formidable
-// Langue: fr
-// Date: 05-09-2012 18:51:15
-// Items: 2
-
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/formidable/trunk/lang/
 if (!defined('_ECRIRE_INC_VERSION')) return;
 
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
-// F
+       // F
        'formidable_description' => 'Création de formulaires avec une interface graphique et configuration des traitements associés (envoyer par courriel, enregistrer les réponses, etc).',
-       'formidable_slogan' => 'Générateur de formulaires',
+       'formidable_slogan' => 'Générateur de formulaires'
 );
-?>
\ No newline at end of file
+
+?>
index fb8050e..95c9390 100644 (file)
@@ -1,10 +1,11 @@
 <BOUCLE_formulaire(FORMULAIRES){id_formulaire}>
+#SET{exclure_champs,#TRAITEMENTS|unserialize|table_valeur{enregistrement}|table_valeur{analyse_exclure_champs}|explode{|}}
 <div class='formidable_analyse'>
-[(#REM) On fait un tableau qui contient toutes les réponses, classées par champ ]
+[(#REM) On fait un tableau qui contient toutes les réponses, classées par champ, sauf pour les champs qui sont à ne pas prendre en compte ]
 #SET{valeurs,#ARRAY}
 #SET{reponses_total,0}
 <BOUCLE_reponses(FORMULAIRES_REPONSES){id_formulaire}>
-<BOUCLE_champs(FORMULAIRES_REPONSES_CHAMPS){id_formulaires_reponse}{nom ?= #ENV{nom}}>
+<BOUCLE_champs(FORMULAIRES_REPONSES_CHAMPS){id_formulaires_reponse}{nom ?= #ENV{nom}}{!nom IN #GET{exclure_champs}}>
 #SET_MERGE{liste_valeurs, #GET{valeurs}|table_valeur{#NOM}|sinon{#ARRAY}, #ARRAY{0,#VALEUR|tenter_unserialize}}
 #SET_MERGE{valeurs, #ARRAY{#NOM,#GET{liste_valeurs}}}
 </BOUCLE_champs>
@@ -20,7 +21,9 @@
 <BOUCLE_saisies(POUR){tableau #SAISIES|unserialize|saisies_lister_par_nom}>
 [(#VAL{saisie}|array_key_exists{#VALEUR}|oui)
   [(#CLE|=={#ENV{nom,#CLE}}|oui)
-       [(#VALEUR|formidable_analyser_saisie{#GET{valeurs}, #GET{reponses_total}})]
+       [(#CLE|in_array{#GET{exclure_champs}}|non)
+        [(#VALEUR|formidable_analyser_saisie{#GET{valeurs}, #GET{reponses_total}})]
+    ]
   ]
 ]
 </BOUCLE_saisies>
index 9dabcf1..5fbe62c 100644 (file)
@@ -1,12 +1,12 @@
 <paquet
        prefix="formidable"
        categorie="communication"
-       version="1.3.6"
-       etat="dev"
-       compatibilite="[3.0.0-dev;3.0.99]"
+       version="1.9.1"
+       etat="stable"
+       compatibilite="[3.0.0;3.0.*]"
        logo="images/formidable-64.png"
-       schema="0.5.1"
-       documentation="http://www.spip-contrib.net/Formidable-le-generateur-de"
+       schema="0.5.5"
+       documentation="http://contrib.spip.net/Formidable-le-generateur-de-formulaires"
 >
 
        <nom>Formidable</nom>
        <pipeline nom="optimiser_base_disparus" inclure="formidable_pipelines.php" />
 
        <necessite nom="spip_bonux" compatibilite="[1.9.3;[" />
-       <necessite nom="saisies" compatibilite="[1.10.1;[" />
+       <necessite nom="saisies" compatibilite="[1.34.2;[" />
        <necessite nom="verifier" compatibilite="[0.1;[" />
        <necessite nom="yaml" compatibilite="[1.1;[" />
-       <necessite nom="facteur" compatibilite="[1.5.3;[" />
+       <necessite nom="facteur" compatibilite="[3.0.3;[" />
 
        <menu nom="formulaires" titre="formidable:bouton_formulaires" parent="menu_edition" icone="images/formulaire-16.png" />
-</paquet>
+</paquet>
\ No newline at end of file
index 75a6ddb..853f790 100644 (file)
@@ -1,5 +1,8 @@
-<BOUCLE_autoriser(CONDITION){si #AUTORISER{editer, formulaire, #VAL{id_formulaire}|_request|sinon{0}}}>
-[(#BOITE_OUVRIR{'','info'})]
+#SET{objet,formulaire}
+#SET{id_objet,#VAL{id_formulaire}|_request|intval}
+<BOUCLE_autoriser(CONDITION){si #AUTORISER{editer, formulaire, #GET{id_objet}}}>
+#SET{redirect,#ENV{redirect}|sinon{#ENV{lier_trad,#GET{id_objet}}|?{#ENV{lier_trad,#GET{id_objet}}|generer_url_entite{#GET{objet}},#GET{id_rubrique}|?{#GET{id_rubrique}|generer_url_entite{rubrique},#URL_ECRIRE{rubriques}}}}}
+       
 <script type="text/javascript">/*<![CDATA[*/
 if (window.jQuery){
 function debloquer_prive(){ jQuery('input[required], textarea[required], select[required]').removeAttr('required'); }
@@ -7,29 +10,26 @@ jQuery('document').ready(debloquer_prive);
 onAjaxLoad(debloquer_prive);
 }
 /*]]>*/</script>
-               <BOUCLE_formulaire(FORMULAIRES){id_formulaire=#VAL{id_formulaire}|_request}>
-                       [(#URL_ECRIRE{formulaire}|parametre_url{id_formulaire,#ID_FORMULAIRE}|icone_verticale{<:retour:>,formulaire,formulaire-24,left})]
-
-                       <h4><:formidable:editer_modifier_formulaire:></h4>
-                       <h1>#TITRE</h1>
-                       
+<div class='cadre-formulaire-editer'>
+<div class="entete-formulaire">
+       [(#GET{id_objet}|oui)
+       [(#GET{redirect}|icone_verticale{[(#GET{objet}|objet_info{texte_retour}|_T)],#GET{objet}|objet_info{icone_objet},'',left retour[(#ENV{retourajax,''}|oui)ajax preload]})]
+       ]
+       [
+               [(#GET{objet}|objet_info{#GET{id_objet}|?{texte_modifier,texte_creer}}|_T)]
+               <h1>(#ENV{titre,#INFO_TITRE{#GET{objet},#GET{id_objet}}|sinon{#ENV{nouveau}|=={oui}|?{<:formidable:editer_nouveau:>,#VAL{id_menu}|_request}}})</h1>
+       ]
+</div>
+               #SET{configurer,formulaire}
+               <BOUCLE_formulaire(FORMULAIRES){id_formulaire=#GET{id_objet}}>
                        #SET{configurer,#ENV{configurer}|in_array{#ARRAY{0,formulaire,1,champs,2,traitements,3,auteurs}}|?{#ENV{configurer},champs}}
                </BOUCLE_formulaire>
-               [(#URL_ECRIRE{formulaires}|icone_verticale{<:retour:>,formulaire,formulaire-24,left})]
-                       
-                       <:formidable:editer_modifier_formulaire:>
-                       <h1>
-                               [(#ENV{nouveau}|=={oui}|?{<:formidable:editer_nouveau:>,#VAL{id_menu}|_request})]
-                       </h1>
-                       
-                       #SET{configurer,formulaire}
-               <//B_formulaire>
        
        [(#GET{configurer}|=={formulaire}|oui)
-               #FORMULAIRE_EDITER_FORMULAIRE{#VAL{id_formulaire}|_request|sinon{0}, #VAL{nouveau}|_request|sinon{''}}
+               #FORMULAIRE_EDITER_FORMULAIRE{#GET{id_objet}, #VAL{nouveau}|_request|sinon{''}}
        ]
        [(#GET{configurer}|=={auteurs}|oui)
-               #FORMULAIRE_EDITER_LIENS{formulaires,#VAL{id_formulaire}|_request|sinon{0},auteurs}
+               #FORMULAIRE_EDITER_LIENS{formulaires,#GET{id_objet},auteurs}
        ]
        [(#GET{configurer}|=={champs}|oui)
                #FORMULAIRE_EDITER_FORMULAIRE_CHAMPS{#ENV{id_formulaire}}
@@ -37,5 +37,5 @@ onAjaxLoad(debloquer_prive);
        [(#GET{configurer}|=={traitements}|oui)
                #FORMULAIRE_EDITER_FORMULAIRE_TRAITEMENTS{#ENV{id_formulaire}}
        ]
-#BOITE_FERMER
+</div>
 </BOUCLE_autoriser>
index f655ed3..04868ae 100644 (file)
@@ -1,13 +1,10 @@
-[(#BOITE_OUVRIR{
-       <h1><:formidable:bouton_formulaires:></h1>
-       <p><:formidable:formulaires_introduction:></p>
-})]
-#BOITE_FERMER
+<h1 class="grostitre"><:formidable:bouton_formulaires:></h1>
+<p><:formidable:formulaires_introduction:></p>
 
 <INCLURE{fond=prive/objets/liste/formulaires, titre=<:formulaire:titre_formulaires:>, ajax} />
 
 [(#AUTORISER{editer, formulaire}|oui)
 [(#URL_ECRIRE{formulaire_edit}
        |parametre_url{nouveau,oui}
-       |icone_verticale{<:formulaire:icone_creer_formulaire:>,formulaire,formulaire-nouveau-48,center})]
+       |icone_verticale{<:formulaire:icone_creer_formulaire:>,formulaire,formulaire-nouveau-48,right})]
 ]
index 4407c02..ba5812c 100644 (file)
@@ -1,6 +1,6 @@
 <BOUCLE_formulaire(FORMULAIRES){id_formulaire}>
 <!--#extra-->
-[(#BOITE_OUVRIR{<:formidable:titre_cadre_raccourcis:>,'simple','section'})]
+[(#BOITE_OUVRIR{<:formidable:titre_cadre_raccourcis:>,'raccourcis'})]
        [(#AUTORISER{editer, formulaire}|oui)
        [(#URL_ACTION_AUTEUR{dupliquer_formulaire, #ID_FORMULAIRE}|icone_horizontale{<:formidable:formulaires_dupliquer:>,formulaire,formulaire-dupliquer-24})]
        ]
@@ -10,7 +10,7 @@
        ]
 #BOITE_FERMER
 
-[(#BOITE_OUVRIR{<:formidable:voir_exporter:>,'simple','section'})]
+[(#BOITE_OUVRIR{<:formidable:voir_exporter:>,'raccourcis'})]
        <BOUCLE_exports(POUR){tableau #VAL|echanges_formulaire_lister_disponibles|table_valeur{exporter}}>
        [(#URL_ACTION_AUTEUR{exporter_formulaire,#ID_FORMULAIRE-#CLE}|icone_horizontale{#CLE,formulaire,formulaire-exporter-24})]
        </BOUCLE_exports>
index 959b0eb..f08b98b 100644 (file)
@@ -1,6 +1,6 @@
 <BOUCLE_formulaire(FORMULAIRES) {id_formulaire}>
 <!--#extra-->
-[(#ENV{configurer}|=={traitements}|oui)
+[(#ENV{configurer}|in_array{#LISTE{traitements,champs}}|oui)
 [(#BOITE_OUVRIR{'','info'})]
        #INCLURE{fond=modeles/formulaire_aide_memoire, id_formulaire=#ID_FORMULAIRE}
 #BOITE_FERMER
index eece13c..52a9655 100644 (file)
@@ -1,8 +1,16 @@
 <BOUCLE_formulaire(FORMULAIRES){id_formulaire}>
-<BOUCLE_autoriser(CONDITION){si #AUTORISER{voir, formulaires_reponse}}>
-[(#BOITE_OUVRIR{<:formidable:titre_cadre_raccourcis:>,'info'})]
+[(#SET{ouvre_boite,[(#AUTORISER{voir, formulaires_reponse, #ID_FORMULAIRE}|ou{#AUTORISER{modifier, formulaires_reponse, #ID_FORMULAIRE}})]})]
+[(#GET{ouvre_boite}|oui)[(#BOITE_OUVRIR{<:formidable:titre_cadre_raccourcis:>,'info'})]]
+
+<BOUCLE_autoriser_1(CONDITION){si #AUTORISER{voir, formulaires_reponse}}>
 [(#URL_ACTION_AUTEUR{exporter_formulaires_reponses,#ID_FORMULAIRE}
        |icone_horizontale{<:formidable:reponses_exporter:>,formulaire,formulaire-reponses-exporter-24,center})]
-#BOITE_FERMER
-</BOUCLE_autoriser>
+</BOUCLE_autoriser_1>
+
+<BOUCLE_autoriser_2(CONDITION){si #AUTORISER{editer, formulaires,#ID_FORMULAIRE}}>
+[(#URL_ACTION_AUTEUR{vider_formulaire,#ID_FORMULAIRE}
+       |icone_horizontale{<:formidable:reponses_supprimer:>,formulaire,formulaire-reponses-supprimer-24,'',onclick="return confirm('<:formidable:reponses_supprimer_confirmation:>');"})]
+</BOUCLE_autoriser_2>
+
+[(#GET{ouvre_boite}|oui)#BOITE_FERMER]
 </BOUCLE_formulaire>
index 2b7798d..a89f8d8 100644 (file)
@@ -1,5 +1,3 @@
 <!-- hierarchie -->
-<BOUCLE_formulaire(FORMULAIRES){id_formulaire}>
 <a href="#URL_ECRIRE{formulaires}"><:formulaire:titre_formulaires:></a> &gt;
-<strong class="on">#TITRE</strong>
-</BOUCLE_formulaire>
+<strong class="on">[(#INFO_TITRE{formulaire,#ID_FORMULAIRE}|sinon{<:formidable:editer_nouveau:>})]</strong>
index a41dfd9..a89f8d8 100644 (file)
@@ -1,5 +1,3 @@
-<BOUCLE_formulaire(FORMULAIRES){id_formulaire}>
+<!-- hierarchie -->
 <a href="#URL_ECRIRE{formulaires}"><:formulaire:titre_formulaires:></a> &gt;
-<a href="[(#URL_ECRIRE{formulaire}|parametre_url{id_formulaire,#ID_FORMULAIRE})]">#TITRE</a> &gt;
-<strong class="on"><:formulaire:modifier_formulaire:></strong>
-</BOUCLE_formulaire>
+<strong class="on">[(#INFO_TITRE{formulaire,#ID_FORMULAIRE}|sinon{<:formidable:editer_nouveau:>})]</strong>
index f629fc3..33b3600 100644 (file)
@@ -31,7 +31,7 @@
 
 ]
 
-<BOUCLE_resultats(FORMULAIRES_REPONSES){id_formulaire}{tous}>
+<BOUCLE_resultats(FORMULAIRES_REPONSES){id_formulaire} {statut!=poubelle} >
 </BOUCLE_resultats>
 
 [(#AUTORISER{voir,formulaires_reponse,#ID_FORMULAIRE}|oui)
index 0ccb362..ed1bb7c 100644 (file)
@@ -1,5 +1,3 @@
 [(#AUTORISER{editer, formulaire}|oui)
-[(#BOITE_OUVRIR{<:formidable:importer_formulaire:>,'info'})]
        #FORMULAIRE_IMPORTER_FORMULAIRE
-#BOITE_FERMER
 ]
index 54589d3..c1b175d 100644 (file)
@@ -7,7 +7,7 @@
 
 [(#REM) datas peut être une chaine qu'on sait décomposer ]
 #SET{datas, #ENV{datas}}
-#SET{datas, #GET{datas}|is_string|?{(#GET{datas}|saisies_chaine2tableau), #GET{datas}}}
+#SET{datas, #GET{datas}|is_string|?{(#GET{datas}|saisies_aplatir_chaine|saisies_chaine2tableau), #GET{datas}}}
 
 <BOUCLE_datas(POUR){tableau #GET{datas}}>
 <tr class="tr_liste">
index b2c9bab..0fb1cbf 100644 (file)
@@ -1,10 +1,10 @@
 <svn_revision>
 <text_version>
-Origine: file:///home/svn/repository/spip-zone/_plugins_/formidable/trunk
-Revision: 73827
-Dernier commit: 2013-06-24 13:00:08 +0200 
+Origine: file:///home/svn/repository/spip-zone/_plugins_/formidable/branches/v1
+Revision: 81164
+Dernier commit: 2014-03-03 23:00:07 +0100 
 </text_version>
-<origine>file:///home/svn/repository/spip-zone/_plugins_/formidable/trunk</origine>
-<revision>73827</revision>
-<commit>2013-06-24 13:00:08 +0200 </commit>
+<origine>file:///home/svn/repository/spip-zone/_plugins_/formidable/branches/v1</origine>
+<revision>81164</revision>
+<commit>2014-03-03 23:00:07 +0100 </commit>
 </svn_revision>
\ No newline at end of file
index c857bbe..4092e6d 100644 (file)
@@ -3,7 +3,6 @@
 ---------
 + Ajouter des liens "réponse précédente/suivante" dans la visualisation d'une réponse
 + Afficher une boite listant les formulaires disponibles dans l'édition d'un article
-+ Afficher des saisies en javascript suivant des conditions
 + Utiliser le plugin CVT multi-pages de Cédric
 + Afficher des pages suivant des conditions (scénarios)
 + Pouvoir attacher des fichiers (et donc les envoyer par mail et les enregistrer en base comme document)
index c7a60e4..aa18eb1 100644 (file)
@@ -29,7 +29,12 @@ function traiter_email_dist($args, $retours){
        }
        if (!$destinataires)
                $destinataires = array();
+       if ($options['champ_courriel_destinataire_form']) {
+               $courriel_champ_form = _request($options['champ_courriel_destinataire_form']);
+               $destinataires[] = $courriel_champ_form;
+       }
        
+
        // On ajoute les destinataires en plus
        if ($options['destinataires_plus']){
                $destinataires_plus = explode(',', $options['destinataires_plus']);
@@ -69,7 +74,7 @@ function traiter_email_dist($args, $retours){
                        }
                        $nom_envoyeur = trim(_L($options['champ_nom'], $a_remplacer));
                }
-               if (!$nom_envoyeur) $nom_envoyeur = $GLOBALS['meta']['nom_site'];
+               if (!$nom_envoyeur) $nom_envoyeur = $nom_site_spip;
                
                // On récupère le sujet s'il existe sinon on le construit
                if ($options['champ_sujet']){
@@ -105,14 +110,14 @@ function traiter_email_dist($args, $retours){
                );
                
                // On génère le texte brut
-               include_spip('classes/facteur');
-               $texte = Facteur::html2text($html);
+               include_spip('facteur_fonctions');
+               $texte = facteur_mail_html2text($html);
                
                // On utilise la forme avancé de Facteur
                $corps = array(
                        'html' => $html,
                        'texte' => $texte,
-                       'nom_envoyeur' => $nom_envoyeur
+                       'nom_envoyeur' => filtrer_entites($nom_envoyeur),
                );
                // Si l'utilisateur n'a pas indiqué autrement, on met le courriel de l'envoyeur dans
                // Reply-To et on laisse le from par defaut de Facteur car sinon ca bloque sur les
@@ -168,22 +173,22 @@ function traiter_email_dist($args, $retours){
                        );
                        
                        // On génère le texte brut
-                       $texte = Facteur::html2text($html_accuse);
+                       $texte = facteur_mail_html2text($html_accuse);
                        
                        $corps = array(
                                'html' => $html_accuse,
                                'texte' => $texte,
-                               'nom_envoyeur' => $nom_site_spip
+                               'nom_envoyeur' => filtrer_entites($nom_site_spip),
                        );
 
                        $ok = $envoyer_mail($courriel_envoyeur, $sujet_accuse, $corps, $courriel_from, "X-Originating-IP: ".$GLOBALS['ip']);
                }
                
                if ($ok){
-                       $retours['message_ok'] .= "\n<br/>"._T('formidable:traiter_email_message_ok');
+                       $retours['message_ok'] .= "\n"._T('formidable:traiter_email_message_ok');
                }
                else{
-                       $retours['message_erreur'] .= "\n<br/>"._T('formidable:traiter_email_message_erreur');
+                       $retours['message_erreur'] .= "\n"._T('formidable:traiter_email_message_erreur');
                }
        }
        
index 4f5b4d7..d2510ac 100644 (file)
@@ -10,6 +10,13 @@ options:
       explication: '<:formidable:traiter_email_option_destinataires_explication:>'
       forcer_type: [destinataires,hidden]
       env: true
+  -
+    saisie: 'champ'
+    options:
+      nom: 'champ_courriel_destinataire_form'
+      label: '<:formidable:traiter_email_option_destinataires_champ_form_label:>'
+      explication: '<:formidable:traiter_email_option_destinataires_champ_form_explication:>'
+      env: true
   -
     saisie: 'input'
     options:
index 8277067..6496789 100644 (file)
@@ -50,7 +50,7 @@ function traiter_enregistrement_dist($args, $retours){
                 'id_formulaire' => $id_formulaire,
                 'id_auteur' => $id_auteur,
                 'cookie' => $cookie,
-                'ip' => $GLOBALS['ip'],
+                'ip' => $args['options']['ip'] == 'on' ? $GLOBALS['ip'] : '',
                 'date' => 'NOW()',
                 'statut' => $statut
             )
@@ -100,8 +100,8 @@ function traiter_enregistrement_dist($args, $retours){
                 $insertions
             );
         }
+        $retours['message_ok'] .= "\n"._T('formidable:traiter_enregistrement_message_ok');
     }
-
     return $retours;
 }
 
index 41c9ced..4cbf1c1 100644 (file)
@@ -44,6 +44,12 @@ options:
         remote_user: "Variable serveur : REMOTE_USER"
         php_auth_user: "Variable serveur : PHP_AUTH_USER"
       defaut: ''
+  -
+    saisie: 'oui_non'
+    options:
+      nom: 'ip'
+      label: '<:formidable:traiter_enregistrement_option_ip_label:>'
+      defaut: 'on'
   -
     saisie: 'radio'
     options:
@@ -53,3 +59,10 @@ options:
         posteriori: '<:forum:bouton_radio_modere_posteriori:>'
         priori: '<:forum:bouton_radio_modere_priori:>'
       defaut: 'posteriori'
+  -
+    saisie: 'textarea'
+    options:
+      nom: 'analyse_exclure_champs'
+      label: '<:formidable:analyse_exclure_champs_label:>'
+      explication: '<:formidable:analyse_exclure_champs_explication:>'
+      rows: 4
\ No newline at end of file
index 9fda49d..123ab32 100644 (file)
@@ -1,9 +1,9 @@
 [(#ENV{erreurs}|table_valeur{positionner}|oui)
        <a name="ajax_ancre" href="[(#ENV{erreurs}|table_valeur{positionner})]"></a>
 ]
-<div class="formulaire_spip formulaire_editer formulaire_#ENV{form}">
+<div class="formulaire_spip formulaire_editer formulaire_#ENV{form}[ (#ENV{formulaire_modifie}|oui) modifie]">
        [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
-       <p id="message_attention" class="reponse_formulaire reponse_formulaire_ok[ (#ENV{formulaire_modifie}|non) invisible]">#ENV*{_message_attention}</p>
+       <p id="message_attention" class="message_reinitialiser reponse_formulaire reponse_formulaire_ok">#ENV*{_message_attention}</p>
        [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
        
        <BOUCLE_editable(CONDITION){si #ENV{editable}|oui}>
@@ -15,7 +15,7 @@
 
                <ul id="deplacable">
                        
-                       <li id="reinitialiser" class="actions_formulaire[ (#ENV{formulaire_modifie}|non) invisible]">
+                       <li id="reinitialiser" class="actions_formulaire">
                                <button type="submit" class="submit" name="reinitialiser" value="oui" onclick="return confirm('<:saisies:construire_reinitialiser_confirmer:>')">
                                        <img src="#CHEMIN{images/formulaire-reinitialiser-24.png}" alt="" />
                                        <:saisies:construire_reinitialiser:>
@@ -33,7 +33,7 @@
                        <B_saisies_disponibles>
                        <li class="editer haut saisies_disponibles" id="attrapable">
                                <label><:saisies:construire_ajouter_champ:></label>
-                               <BOUCLE_saisies_disponibles(POUR){tableau #ENV{_saisies_disponibles}}>
+                               <BOUCLE_saisies_disponibles(POUR){tableau #ENV{_saisies_disponibles}}{par cle}>
                                <button type="submit" name="ajouter_saisie" value="#CLE" class="submit ajouter_saisie"[ title="(#VALEUR|table_valeur{description})"] [style="background-image:url((#VALEUR|table_valeur{icone}|sinon{#CHEMIN{images/formulaire-saisie-defaut.png}}))"]>
                                        <span>[(#VALEUR|table_valeur{titre})]</span>
                                </button>
                <span class='image_loading'></span>
        </div></form>
 
+       <style>
+               .message_reinitialiser,#reinitialiser {display: none}
+               .modifie .message_reinitialiser,.modifie #reinitialiser {display: block}
+       </style>
        <script type="text/javascript">
                jQuery(function(){
                        jQuery('.formulaire_construire_formulaire li.configurable')
                                $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.core.js}", function(){
                                $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.widget.js}", function(){
                                $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.mouse.js}", function(){
-                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.sortable.js}", function(){
-                                       if ($.fn.sortable) {
-                                               jQuery( "#deplacable, #deplacable ul" ).sortable({
-                                                       revert: true,
-                                                       containment: '#deplacable',
-                                                       connectWith: "#deplacable, #deplacable ul",
-                                                       placeholder: "ui-state-highlight",
-                                                       handle: '>.actions .deplacer_saisie',
-                                                       start: function(event, ui) {
-                                                               jQuery('.ui-state-highlight')
-                                                                       .css('height', ui.item.css('height'))
-                                                                       .css('height', '+=20px');
-                                                       },
-                                                       update: function(event, ui) {
-                                                               id = ui.item.data('id');
-                                                               ou = ui.item.next().data('id');
-                                                               // avant le suivant
-                                                               if (!ou) {
-                                                                       // sinon dans le parent
-                                                                       ou = ui.item.closest('.fieldset').data('id');
-                                                                       if (ou) {
-                                                                               ou = '[(#VAL{91}|chr)]' + ou + '[(#VAL{93}|chr)]';
+                                       $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.sortable.js}", function(){
+                                               if ($.fn.sortable) {
+                                                       jQuery( "#deplacable, #deplacable ul" ).sortable({
+                                                               revert: true,
+                                                               containment: '#deplacable',
+                                                               connectWith: "#deplacable, #deplacable ul",
+                                                               placeholder: "ui-state-highlight",
+                                                               handle: '>.actions .deplacer_saisie',
+                                                               start: function(event, ui) {
+                                                                       jQuery('.ui-state-highlight')
+                                                                               .css('height', ui.item.css('height'))
+                                                                               .css('height', '+=20px');
+                                                               },
+                                                               update: function(event, ui) {
+                                                                       id = ui.item.data('id');
+                                                                       ou = ui.item.next().data('id');
+                                                                       // avant le suivant
+                                                                       if (!ou) {
+                                                                               // sinon dans le parent
+                                                                               ou = ui.item.closest('.fieldset').data('id');
+                                                                               if (ou) {
+                                                                                       ou = '[(#VAL{91}|chr)]' + ou + '[(#VAL{93}|chr)]';
+                                                                               }
                                                                        }
+                                                                       url = "#URL_ECRIRE";
+                                                                       $.get(url, {
+                                                                               session: '#ENV{_identifiant_session}',
+                                                                               action: 'deplacer_saisie',
+                                                                               saisie: id,
+                                                                               ou: ou
+                                                                       }, function() {
+                                                                               //jQuery('input.vide').submit();
+                                                                               jQuery('.formulaire_#ENV{form}').addClass('modifie').trigger('modifsaisies');
+                                                                       });
                                                                }
-                                                               url = "#URL_ECRIRE";
-                                                               $.get(url, {
-                                                                       session: '#ENV{_identifiant_session}',
-                                                                       action: 'deplacer_saisie',
-                                                                       saisie: id,
-                                                                       ou: ou
-                                                               }, function() {
-                                                                       //jQuery('input.vide').submit();
-                                                                       jQuery('#reinitialiser').removeClass('invisible');
-                                                                       jQuery('#message_attention').removeClass('invisible');
-                                                               });
-                                                       }
-                                               });
-                                       }
-                               });});});});
-                               
-                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.core.js}", function(){
-                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.widget.js}", function(){
-                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.mouse.js}", function(){
-                               $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.draggable.js}", function(){
-                                       if ($.fn.draggable) {
-                                               jQuery( "#attrapable" ).draggable({
-                                                       connectToSortable: "#deplacable, #deplacable ul",
-                                                       helper: "clone"
-                                               });
-                                       }
-                               });});});});
+                                                       });
+                                               }
+                                       });
+                                                       /*
+                                       $.getScript("#CHEMIN{#ENV{_chemin_ui}jquery.ui.draggable.js}", function(){
+                                               if ($.fn.draggable) {
+                                                       jQuery( "#attrapable" ).draggable({
+                                                               connectToSortable: "#deplacable, #deplacable ul",
+                                                               helper: "clone"
+                                                       });
+                                               }
+                                       });
+                                                       */
+                               });});});
                        ]
                });
                
index 4a713a5..c2e87f3 100644 (file)
@@ -245,32 +245,85 @@ function saisies_verifier($formulaire, $saisies_masquees_nulles=true){
        return $erreurs;\r
 }\r
 \r
+/*\r
+ * Applatie une description tabulaire\r
+ * @param string $tab, le tableau à aplatir\r
+ * @return $nouveau_tab\r
+ */\r
+function saisies_aplatir_tableau($tab){\r
+    $nouveau_tab = array();\r
+    foreach($tab as $entree=>$contenu){\r
+        if (is_array($contenu)){\r
+            foreach ($contenu as $cle => $valeur){\r
+                $nouveau_tab[$cle] = $valeur;\r
+                }\r
+            }\r
+        else{\r
+            $nouveau_tab[$entree] = $contenu;\r
+            }\r
+        }\r
+    return $nouveau_tab;\r
+}\r
+\r
+/*\r
+ * Applatie une description chaînée, en supprimant les sous-groupes.\r
+ * @param string $chaine, la chaîne à aplatir\r
+ * @return $chaine\r
+ */\r
+function saisies_aplatir_chaine($chaine){\r
+    return trim(preg_replace("#(?:^|\n)(\*(?:.*)|/\*)\n#i","\n",$chaine));\r
+    }\r
 /*\r
  * Transforme une chaine en tableau avec comme principe :\r
  * - une ligne devient une case\r
  * - si la ligne est de la forme truc|bidule alors truc est la clé et bidule la valeur\r
- *\r
+ * - si la ligne commence par * alors on commence un sous-tableau\r
+ * - si la ligne est égale à /*, alors on fini le sous-tableau\r
  * @param string $chaine Une chaine à transformer\r
  * @return array Retourne un tableau PHP\r
  */\r
 function saisies_chaine2tableau($chaine, $separateur="\n"){\r
        if ($chaine and is_string($chaine)){\r
                $tableau = array();\r
+               $soustab = False;\r
                // On découpe d'abord en lignes\r
                $lignes = explode($separateur, $chaine);\r
                foreach ($lignes as $i=>$ligne){\r
                        $ligne = trim(trim($ligne), '|');\r
                        // Si ce n'est pas une ligne sans rien\r
                        if ($ligne !== ''){\r
-                               // Si on trouve un découpage dans la ligne on fait cle|valeur\r
-                               if (strpos($ligne, '|') !== false){\r
-                                       list($cle,$valeur) = explode('|', $ligne, 2);\r
-                                       // permettre les traductions de valeurs au passage\r
-                                       $tableau[$cle] = _T_ou_typo($valeur, 'multi');\r
+                               // si ca commence par * c'est qu'on va faire un sous tableau\r
+                               if (strpos($ligne,"*")===0){\r
+                                       $soustab=True;\r
+                                       $soustab_cle    = _T_ou_typo(substr($ligne,1), 'multi');\r
+                                       if (!isset($tableau[$soustab_cle])){\r
+                                               $tableau[$soustab_cle] = array();\r
+                                       }\r
+                               }\r
+                               elseif ($ligne=="/*"){//si on finit sous tableau\r
+                                       $soustab=False;\r
                                }\r
+                               else{//sinon c'est une entrée normale\r
+                               // Si on trouve un découpage dans la ligne on fait cle|valeur\r
+                                       if (strpos($ligne, '|') !== false){\r
+                                               list($cle,$valeur) = explode('|', $ligne, 2);\r
+                                               // permettre les traductions de valeurs au passage\r
+                                               if ($soustab == True){\r
+                                                       $tableau[$soustab_cle][$cle] = _T_ou_typo($valeur, 'multi');\r
+                                                       }\r
+                                               else{\r
+                                                       $tableau[$cle] = _T_ou_typo($valeur, 'multi');\r
+                                                       }\r
+                                       }\r
                                // Sinon on génère la clé\r
-                               else{\r
-                                       $tableau[$i] = $ligne;\r
+                                       else{\r
+                                               if ($soustab == True){\r
+                                                       $tableau[$soustab_cle][$i] = _T_ou_typo($ligne,'multi');\r
+                                                       }\r
+                                               else{\r
+                                                       $tableau[$i] = _T_ou_typo($ligne,'multi');\r
+                                                       }\r
+                                       }\r
                                }\r
                        }\r
                }\r
@@ -289,14 +342,28 @@ function saisies_chaine2tableau($chaine, $separateur="\n"){
  * Transforme un tableau en chaine de caractères avec comme principe :\r
  * - une case de vient une ligne de la chaine\r
  * - chaque ligne est générée avec la forme cle|valeur\r
+ * - si une entrée du tableau est elle même un tableau, on met une ligne de la forme *clef\r
+ * - pour marquer que l'on quitte un sous-tableau, on met une ligne commencant par /*, sauf si on bascule dans un autre sous-tableau.\r
  */\r
 function saisies_tableau2chaine($tableau){\r
        if ($tableau and is_array($tableau)){\r
                $chaine = '';\r
-       \r
+               $avant_est_tableau = False;\r
                foreach($tableau as $cle=>$valeur){\r
-                       $ligne = trim("$cle|$valeur");\r
-                       $chaine .= "$ligne\n";\r
+                       if (is_array($valeur)){\r
+                               $avant_est_tableau = True;\r
+                               $ligne=trim("*$cle");\r
+                               $chaine .= "$ligne\n";\r
+                               $chaine .= saisies_tableau2chaine($valeur)."\n";\r
+                               }\r
+                       else{   \r
+                               if ($avant_est_tableau == True){\r
+                                               $avant_est_tableau = False;\r
+                                               $chaine.="/*\n";\r
+                                       }\r
+                               $ligne = trim("$cle|$valeur");\r
+                               $chaine .= "$ligne\n";\r
+                       }\r
                }\r
                $chaine = trim($chaine);\r
        \r
@@ -403,4 +470,20 @@ function saisies_afficher_si($saisies) {
        return false;\r
 }\r
 \r
+\r
+/*\r
+ * Le tableau de saisies a-t-il une option afficher_si_remplissage ?\r
+ *\r
+ * @param array $saisies Un tableau de saisies\r
+ * @return boolean\r
+ */\r
+function saisies_afficher_si_remplissage($saisies) {\r
+       $saisies = saisies_lister_par_nom($saisies,true);\r
+       // Dès qu'il y a au moins une option afficher_si_remplissage, on l'active\r
+       foreach ($saisies as $saisie) {\r
+               if (isset($saisie['options']['afficher_si_remplissage']))\r
+                       return true;\r
+       }\r
+       return false;\r
+}\r
 ?>\r
index eb02b78..1c41d35 100644 (file)
@@ -278,7 +278,7 @@ function saisies_generer_vue($saisie, $env=array(), $env_obligatoire=array()){
 \r
 /**\r
  * Génère, à partir d'un tableau de saisie le code javascript ajouté à la fin de #GENERER_SAISIES\r
- * pour produire un affichage conditionnel des saisies ayant une option afficher_si.\r
+ * pour produire un affichage conditionnel des saisies ayant une option afficher_si ou afficher_si_remplissage.\r
  *\r
  * @param array $saisies\r
  *     Tableau de descriptions des saisies\r
@@ -292,13 +292,13 @@ function saisies_generer_js_afficher_si($saisies,$id_form){
        $saisies = saisies_lister_par_nom($saisies,true);\r
        $code = '';\r
        $code .= '(function($){';\r
-       $code .= '$(document).ready(function(){';\r
+       $code .= '$(document).ready(function(){chargement=true;';\r
                $code .= 'verifier_saisies_'.$id_form.' = function(form){';\r
                                foreach ($saisies as $saisie) {\r
                                        // on utilise comme selecteur l'identifiant de saisie en priorite s'il est connu\r
                                        // parce que li_class = 'tableau[nom][option]' ne fonctionne evidement pas\r
                                        // lorsque le name est un tableau\r
-                                       if (isset($saisie['options']['afficher_si'])) {\r
+                                       if (isset($saisie['options']['afficher_si']) or isset($saisie['options']['afficher_si_remplissage'])) {\r
                                                $i++;\r
                                                // retrouver la classe css probable\r
                                                switch ($saisie['saisie']) {\r
@@ -311,7 +311,7 @@ function saisies_generer_js_afficher_si($saisies,$id_form){
                                                        default:\r
                                                                $class_li = 'editer_'.$saisie['options']['nom'];\r
                                                }\r
-                                               $condition = $saisie['options']['afficher_si'];\r
+                                               $condition = $saisie['options']['afficher_si']."\n".$saisie['options']['afficher_si_remplissage'];\r
                                                // retrouver l'identifiant\r
                                                $identifiant = '';\r
                                                if (isset($saisie['identifiant']) and $saisie['identifiant']) {\r
@@ -352,13 +352,13 @@ function saisies_generer_js_afficher_si($saisies,$id_form){
                                                        $sel = "li.$class_li";\r
                                                }\r
                                                $code .= 'if ('.$condition.') {$(form).find("'.$sel.'").show(400);} ';\r
-                                               $code .= 'else {$(form).find("'.$sel.'").hide(400).css("display", "none");} ';\r
+                                               $code .= 'else {if (chargement==true) {$(form).find("'.$sel.'").hide(400).css("display","none");} else {$(form).find("'.$sel.'").hide(400);};} ';\r
                                        }\r
                                }\r
                $code .= '};';\r
                $code .= '$("li#afficher_si_'.$id_form.'").parents("form").each(function(){verifier_saisies_'.$id_form.'(this);});';\r
                $code .= '$("li#afficher_si_'.$id_form.'").parents("form").change(function(){verifier_saisies_'.$id_form.'(this);});';\r
-       $code .= '});';\r
+       $code .= 'chargement=false;})';\r
        $code .= '})(jQuery);';\r
        return $i>0 ? $code : '';\r
 }\r
index f924bd1..76892f7 100644 (file)
@@ -13,7 +13,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
  */
 function saisies_lister_par_identifiant($contenu, $avec_conteneur=true){
        $saisies = array();
-       
+
        if (is_array($contenu)){
                foreach ($contenu as $ligne){
                        if (is_array($ligne)) {
@@ -285,17 +285,20 @@ function saisies_lister_disponibles_sql() {
  * @return array Un tableau contenant le YAML décodé
  */
 function saisies_charger_infos($type_saisie){
-       include_spip('inc/yaml');
-       $fichier = find_in_path("saisies/$type_saisie.yaml");
-       $saisie = yaml_decode_file($fichier);
-       if (is_array($saisie)){
-               $saisie['titre'] = (isset($saisie['titre']) AND $saisie['titre'])
-                       ? _T_ou_typo($saisie['titre']) : $type_saisie;
-               $saisie['description'] = (isset($saisie['description']) AND $saisie['description'])
-                       ? _T_ou_typo($saisie['description']) : '';
-               $saisie['icone'] = (isset($saisie['icone']) AND $saisie['icone'])
-                       ? find_in_path($saisie['icone']) : '';
-       }
+       if(defined('_DIR_PLUGIN_YAML')){
+               include_spip('inc/yaml');
+               $fichier = find_in_path("saisies/$type_saisie.yaml");
+               $saisie = yaml_decode_file($fichier);
+               if (is_array($saisie)){
+                       $saisie['titre'] = (isset($saisie['titre']) AND $saisie['titre'])
+                               ? _T_ou_typo($saisie['titre']) : $type_saisie;
+                       $saisie['description'] = (isset($saisie['description']) AND $saisie['description'])
+                               ? _T_ou_typo($saisie['description']) : '';
+                       $saisie['icone'] = (isset($saisie['icone']) AND $saisie['icone'])
+                               ? find_in_path($saisie['icone']) : '';
+               }
+       }else
+               $saisie = array();
        return $saisie;
 }
 
index 5380e0f..9acd758 100644 (file)
@@ -42,5 +42,5 @@
 ]
 </BOUCLE_contenu>
 
-[(#REM) Ajout du script js pour l'option si des saisies ]
-[(#ENV{from_fieldset}|non|et{#ENV{saisies}|saisies_afficher_si}) #INCLURE{fond=inclure/js_afficher_si,env}]
+[(#REM) Ajout du script js pour les options si des saisies ]
+[(#ENV{from_fieldset}|non|et{#ENV{saisies}|saisies_afficher_si|ou{#ENV{saisies}|saisies_afficher_si_remplissage}}) #INCLURE{fond=inclure/js_afficher_si,env}]
index 4a588ee..9cdd288 100644 (file)
@@ -1,15 +1,15 @@
-$(function(){
+jQuery(function(){
        saisies_fieldset_pliable();
        onAjaxLoad(saisies_fieldset_pliable);
 });
 
 function saisies_fieldset_pliable(){
        // On cherche les groupes de champs pliables
-       $('li.fieldset.pliable')
+       jQuery('li.fieldset.pliable')
                .each(function(){
-                       var li = $(this);
-                       var ul = $(this).find('> fieldset > ul');
-                       var legend = $(this).find('> fieldset > .legend');
+                       var li = jQuery(this);
+                       var ul = jQuery(this).find('> fieldset > ul');
+                       var legend = jQuery(this).find('> fieldset > .legend');
                        
                        // S'il est déjà plié on cache le contenu
                        if (li.is('.plie'))
index 48b9aa8..bcdac9f 100644 (file)
@@ -1,16 +1,27 @@
 <traduction module="paquet-saisies" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/saisies/lang/" reference="fr">
-       <langue code="de" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=de">
+       <langue code="ar" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=ar" total="4" traduits="4" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="George" lien="http://trad.spip.net/auteur/جورج-قندلفت" />
+       </langue>
+       <langue code="de" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=de" total="4" traduits="4" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
                <traducteur nom="klaus++" lien="http://trad.spip.net/auteur/klaus" />
        </langue>
-       <langue code="en" />
-       <langue code="es" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=es">
-               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       <langue code="en" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=en" total="4" traduits="4" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+       </langue>
+       <langue code="es" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=es" total="4" traduits="4" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel-s-bujaldon" />
+       </langue>
+       <langue code="fr" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=fr" total="4" traduits="4" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+       </langue>
+       <langue code="fr_tu" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=fr_tu" total="4" traduits="4" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Cerf" lien="http://trad.spip.net/auteur/cerf" />
+       </langue>
+       <langue code="nl" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=nl" total="4" traduits="4" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="Hanjo" lien="http://trad.spip.net/auteur/hanjo" />
        </langue>
-       <langue code="fr" />
-       <langue code="ru" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=ru">
+       <langue code="ru" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=ru" total="4" traduits="4" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
                <traducteur nom="Serge Markitanenko" lien="http://trad.spip.net/auteur/serge-markitanenko" />
        </langue>
-       <langue code="sk" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=sk">
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=sk" total="4" traduits="4" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
                <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
        </langue>
 </traduction>
diff --git a/www/plugins/saisies/lang/paquet-saisies_ar.php b/www/plugins/saisies/lang/paquet-saisies_ar.php
new file mode 100644 (file)
index 0000000..bab403a
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=ar
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // S
+       'saisies_description' => 'يسهّل هذا الملحق إنشاء حقول للاستمارات من خلال توفيره علامة SAISIE#. تتوافق علامات HTML الناتجة مع تسمية الاستمارات 
+               المقترحة في SPIP بإصداراته الأحدث من ٢.٠ ومع ملحق الاعدادات CFG.',
+       'saisies_nom' => 'إدخال للاستمارات',
+       'saisies_slogan' => 'إنشاء حقول استمارات بسهولة',
+       'saisies_titre' => 'إدخال للاستمارات'
+);
+
+?>
index 2edcbf9..8a2c065 100644 (file)
@@ -6,7 +6,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // S
-       'saisies_description' => 'Ce plugin permet de faciliter l\'écriture de champs de formulaires en proposant une
+       'saisies_description' => 'Ce plugin permet de faciliter lécriture de champs de formulaires en proposant une
                balise #SAISIE. Le HTML généré est compatible avec la nomenclature des formulaires
                proposée par SPIP > 2.0 et avec le plugin de configuration CFG.',
        'saisies_nom' => 'Saisies pour formulaires',
diff --git a/www/plugins/saisies/lang/paquet-saisies_fr_tu.php b/www/plugins/saisies/lang/paquet-saisies_fr_tu.php
new file mode 100644 (file)
index 0000000..f0dc892
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=fr_tu
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // S
+       'saisies_description' => 'Ce plugin permet de faciliter l’écriture de champs de formulaires en proposant une
+               balise #SAISIE. Le HTML généré est compatible avec la nomenclature des formulaires
+               proposée par SPIP > 2.0 et avec le plugin de configuration CFG.',
+       'saisies_nom' => 'Saisies pour formulaires',
+       'saisies_slogan' => 'Écrire facilement des champs de formulaires.',
+       'saisies_titre' => 'Saisies pour formulaires'
+);
+
+?>
diff --git a/www/plugins/saisies/lang/paquet-saisies_nl.php b/www/plugins/saisies/lang/paquet-saisies_nl.php
new file mode 100644 (file)
index 0000000..13b832b
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-saisies?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // S
+       'saisies_description' => 'Deze plugin vereenvoudigt het maken van formuliervelden danzij een code #SAISIE. De gegenereerde HTML is compatibel met die van SPIP formulieren vanaf versie 2.0 en met de configuratie plugin CFG.',
+       'saisies_nom' => 'Saisies (Invoer) voor formulieren',
+       'saisies_slogan' => 'Eenvoudig formuliervelden maken.',
+       'saisies_titre' => 'Invoer voor formulieren'
+);
+
+?>
index 5fb936b..9b2e3e1 100644 (file)
@@ -1,28 +1,39 @@
 <traduction module="saisies" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/saisies/lang/" reference="fr">
-       <langue code="ca" />
-       <langue code="de" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=de">
+       <langue code="ca" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=ca" total="162" traduits="85" relire="0" modifs="9" nouveaux="68" pourcent="52.47">
+       </langue>
+       <langue code="de" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=de" total="162" traduits="142" relire="0" modifs="3" nouveaux="17" pourcent="87.65">
                <traducteur nom="klaus++" lien="http://trad.spip.net/auteur/klaus" />
        </langue>
-       <langue code="en" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=en">
+       <langue code="en" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=en" total="162" traduits="159" relire="0" modifs="0" nouveaux="3" pourcent="98.15">
+               <traducteur nom="Hanjo" lien="http://trad.spip.net/auteur/hanjo" />
                <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
                <traducteur nom="Paolo" lien="http://trad.spip.net/auteur/paolo" />
        </langue>
-       <langue code="es" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=es">
-               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       <langue code="es" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=es" total="162" traduits="162" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+               <traducteur nom="kent1" lien="http://trad.spip.net/auteur/kent1" />
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel-s-bujaldon" />
+               <traducteur nom="severo" lien="http://trad.spip.net/auteur/severo" />
        </langue>
-       <langue code="fa" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=fa">
+       <langue code="fa" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=fa" total="162" traduits="107" relire="0" modifs="3" nouveaux="52" pourcent="66.05">
                <traducteur nom="Davood Hossein" lien="http://trad.spip.net/auteur/davood-hossein" />
        </langue>
-       <langue code="fr" />
-       <langue code="fr_tu" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=fr_tu">
+       <langue code="fr" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=fr" total="162" traduits="162" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+       </langue>
+       <langue code="fr_tu" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=fr_tu" total="162" traduits="159" relire="0" modifs="0" nouveaux="3" pourcent="98.15">
                <traducteur nom="beatnick" lien="http://trad.spip.net/auteur/beatnick" />
+               <traducteur nom="Cerf" lien="http://trad.spip.net/auteur/cerf" />
+       </langue>
+       <langue code="it" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=it" total="162" traduits="139" relire="0" modifs="3" nouveaux="20" pourcent="85.80">
+       </langue>
+       <langue code="nl" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=nl" total="162" traduits="159" relire="0" modifs="0" nouveaux="3" pourcent="98.15">
+               <traducteur nom="Hanjo" lien="http://trad.spip.net/auteur/hanjo" />
+               <traducteur nom="mpossoz" lien="http://trad.spip.net/auteur/mpossoz" />
        </langue>
-       <langue code="it" />
-       <langue code="ru" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=ru">
+       <langue code="ru" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=ru" total="162" traduits="109" relire="0" modifs="36" nouveaux="17" pourcent="67.28">
                <traducteur nom="nazar" lien="http://trad.spip.net/auteur/nazar" />
                <traducteur nom="Serge Markitanenko" lien="http://trad.spip.net/auteur/serge-markitanenko" />
        </langue>
-       <langue code="sk" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=sk">
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/saisies?lang_cible=sk" total="162" traduits="162" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
                <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
        </langue>
 </traduction>
index 9579db8..829f1d5 100644 (file)
@@ -8,103 +8,53 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // B
-       'bouton_parcourir_docs_article' => 'Fullejar l\'article',
+       'bouton_parcourir_docs_article' => 'Fullejar larticle',
        'bouton_parcourir_docs_breve' => 'Fullejar la breu',
        'bouton_parcourir_docs_rubrique' => 'Fullejar la secció',
        'bouton_parcourir_mediatheque' => 'Fullejar la mediateca',
 
-       // C
-       'construire_action_annuler' => 'Annuler', # NEW
-       'construire_action_configurer' => 'Configurer', # NEW
-       'construire_action_deplacer' => 'Déplacer', # NEW
-       'construire_action_dupliquer' => 'Dupliquer', # NEW
-       'construire_action_dupliquer_copie' => '(copie)', # NEW
-       'construire_action_supprimer' => 'Supprimer', # NEW
-       'construire_ajouter_champ' => 'Ajouter un champ', # NEW
-       'construire_attention_enregistrer' => 'N\'oubliez pas d\'enregistrer vos modifications !', # NEW
-       'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Vous avez la possibilité de le réinitialiser à son état avant vos modifications.', # NEW
-       'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l\'enregistrement de cette nouvelle version du formulaire.', # NEW
-       'construire_aucun_champs' => 'Il n\'y a pour l\'instant aucun champ dans ce formulaire.', # NEW
-       'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?', # NEW
-       'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.', # NEW
-       'construire_position_explication' => 'Indiquez devant quel autre champ sera placé celui-ci.', # NEW
-       'construire_position_fin_formulaire' => 'À la fin du formulaire', # NEW
-       'construire_position_fin_groupe' => 'À la fin du groupe @groupe@', # NEW
-       'construire_position_label' => 'Position du champ', # NEW
-       'construire_reinitialiser' => 'Réinitialiser le formulaire', # NEW
-       'construire_reinitialiser_confirmer' => 'Vous allez perdre toutes vos modifications. Êtes-vous sûr de vouloir revenir au formulaire initial ?', # NEW
-       'construire_verifications_aucune' => 'Aucune', # NEW
-       'construire_verifications_label' => 'Type de vérification à effectuer', # NEW
-
-       // E
-       'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier vos saisies', # NEW
-       'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.', # NEW
-
-       // I
-       'info_configurer_saisies' => 'Page de test des Saisies', # NEW
-
        // L
        'label_annee' => 'Any',
        'label_jour' => 'Dia',
        'label_mois' => 'Mes',
 
        // O
-       'option_aff_art_interface_explication' => 'Afficher uniquement les articles de la langue de l\'utilisateur', # NEW
-       'option_aff_art_interface_label' => 'Affichage multilingue', # NEW
-       'option_aff_langue_explication' => 'Affiche la langue de l\'article ou rubrique sélectionné devant le titre', # NEW
-       'option_aff_langue_label' => 'Afficher la langue', # NEW
-       'option_aff_rub_interface_explication' => 'Afficher uniquement les rubriques de la langue de l\'utilisateur', # NEW
-       'option_aff_rub_interface_label' => 'Affichage multilingue', # NEW
-       'option_attention_explication' => 'Un missatge més important que l\'explicació.',
+       'option_attention_explication' => 'Un missatge més important que l’explicació.',
        'option_attention_label' => 'Advertència',
-       'option_autocomplete_defaut' => 'Laisser par défaut', # NEW
-       'option_autocomplete_explication' => 'Au chargement de la page, votre navigateur peut pré-remplir le champ en fonction de son historique', # NEW
-       'option_autocomplete_label' => 'Pré-remplissage du champ', # NEW
-       'option_autocomplete_off' => 'Désactiver', # NEW
-       'option_autocomplete_on' => 'Activer', # NEW
        'option_cacher_option_intro_label' => 'Amagar la primera elecció buida',
-       'option_choix_destinataires_explication' => 'Un o diversos autors, d\'entre els quals hi ha l\'usuari, podrà fer la seva tria. Si no hi ha res seleccionat, és l\'autor que ha instal·lat el lloc el que serà escollit.',
+       'option_choix_destinataires_explication' => 'Un o diversos autors, d’entre els quals hi ha l’usuari, podrà fer la seva tria. Si no hi ha res seleccionat, és l’autor que ha instal·lat el lloc el que serà escollit.',
        'option_choix_destinataires_label' => 'Possibles destinataris',
        'option_class_label' => 'Classes CSS suplementàries',
-       'option_cols_explication' => 'Amplada del bloc en número de caràcters. Aquesta opció no s\'aplica sempre ja que els estils CSS del vostre lloc el poden anul·lar.', # MODIF
+       'option_cols_explication' => 'Amplada del bloc en número de caràcters. Aquesta opció no saplica sempre ja que els estils CSS del vostre lloc el poden anul·lar.', # MODIF
        'option_cols_label' => 'Amplada',
-       'option_datas_explication' => 'Heu d\'especificar una opció per línia en la forma "cle|Label du choix"',
-       'option_datas_label' => 'Llista d\'eleccions possibles',
+       'option_datas_explication' => 'Heu d’especificar una opció per línia en la forma "cle|Label du choix"', # MODIF
+       'option_datas_label' => 'Llista deleccions possibles',
        'option_defaut_label' => 'Valor per defecte',
-       'option_disable_avec_post_explication' => 'Idèntic que l\'opció anterior però tanmateix envia el valor dins d\'un camps amagat.',
+       'option_disable_avec_post_explication' => 'Idèntic que l’opció anterior però tanmateix envia el valor dins d’un camps amagat.',
        'option_disable_avec_post_label' => 'Desactivar però enviar',
        'option_disable_explication' => 'El camp no pot obtenir el focus.',
        'option_disable_label' => 'Desactivar el camp',
-       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d\'erreur affiché pour indiquer l\'obligation (sinon laisser vide).', # NEW
-       'option_erreur_obligatoire_label' => 'Message d\'obligation', # NEW
-       'option_explication_explication' => 'Si és necessari, una frase curta descriu l\'objecte del camp.',
+       'option_explication_explication' => 'Si és necessari, una frase curta descriu l’objecte del camp.',
        'option_explication_label' => 'Explicació',
        'option_groupe_affichage' => 'Visualització',
        'option_groupe_description' => 'Descripció',
        'option_groupe_utilisation' => 'Utilització',
        'option_groupe_validation' => 'Validació',
-       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
-       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
-       'option_horaire_label' => 'Horaire', # NEW
-       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
-       'option_info_obligatoire_explication' => 'Podeu, per defecte, modificar la indicació d\'obligació: <i>[Obligatoire]</i>.',
-       'option_info_obligatoire_label' => 'Indicació d\'obligació',
-       'option_inserer_barre_choix_edition' => 'barra d\'edició completa',
+       'option_info_obligatoire_explication' => 'Podeu, per defecte, modificar la indicació d’obligació: <i>[Obligatoire]</i>.',
+       'option_info_obligatoire_label' => 'Indicació d’obligació',
+       'option_inserer_barre_choix_edition' => 'barra d’edició completa',
        'option_inserer_barre_choix_forum' => 'barra dels fòrums',
-       'option_inserer_barre_explication' => 'Insereix una barra d\'eines del portaplomes si aquest està activat.',
-       'option_inserer_barre_label' => 'Inserir una barra d\'eines',
+       'option_inserer_barre_explication' => 'Insereix una barra deines del portaplomes si aquest està activat.',
+       'option_inserer_barre_label' => 'Inserir una barra deines',
        'option_label_case_label' => 'Etiqueta situada al costat de la casella',
        'option_label_explication' => 'El títol que es mostrarà.',
        'option_label_label' => 'Etiqueta',
-       'option_maxlength_explication' => 'L\'usuari no podrà escriure més caràcters que aquest nombre.',
+       'option_maxlength_explication' => 'Lusuari no podrà escriure més caràcters que aquest nombre.',
        'option_maxlength_label' => 'Número màxim de caràcters',
-       'option_multiple_explication' => 'L\'utilisateur pourra sélectionner plusieurs valeurs', # NEW
-       'option_multiple_label' => 'Sélection multiple', # NEW
        'option_nom_explication' => 'Un nom informàtic que identificarà el camp. Ha de contenir només caràcters alfanumèrics minúsculs o el caràcter "_".', # MODIF
        'option_nom_label' => 'Nom del camp',
        'option_obligatoire_label' => 'Camp obligatori',
        'option_option_intro_label' => 'Etiqueta de la primera elecció buida',
-       'option_option_statut_label' => 'Afficher les statuts', # NEW
        'option_pliable_label' => 'Plegable',
        'option_pliable_label_case' => 'El grup de camps es podrà replegar.',
        'option_plie_label' => 'Ja plegat',
@@ -117,32 +67,28 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_rows_label' => 'Número de línies',
        'option_size_explication' => 'Amplada del camp en número de caràcters. Aquesta opció no es pot aplicar sempre ja que els estils CSS del vostre lloc el poden anul·lar. ',
        'option_size_label' => 'Mida del camp',
-       'option_type_choix_plusieurs' => 'Permetrà a l\'usuari escollir <strong>diversos</strong> destinataris.', # MODIF
-       'option_type_choix_tous' => 'Posar <strong>tots</strong> aquests autors com a destinataris. L\'usuari no tindrà cap tria.',
-       'option_type_choix_un' => 'Permetre a l\'usuari escollir <strong>un únic</strong> destinatari.', # MODIF
+       'option_type_choix_plusieurs' => 'Permetrà a lusuari escollir <strong>diversos</strong> destinataris.', # MODIF
+       'option_type_choix_tous' => 'Posar <strong>tots</strong> aquests autors com a destinataris. Lusuari no tindrà cap tria.',
+       'option_type_choix_un' => 'Permetre a lusuari escollir <strong>un únic</strong> destinatari.', # MODIF
        'option_type_explication' => 'En mode "amagat", el contingut del camp no serà visible.',
        'option_type_label' => 'Tipus del camp',
-       'option_type_password' => 'Amagat',
+       'option_type_password' => 'Amagat', # MODIF
        'option_type_text' => 'Normal',
 
        // S
-       'saisie_auteurs_explication' => 'Permet de sélectionner un ou plusieurs auteurs', # NEW
-       'saisie_auteurs_titre' => 'Auteurs', # NEW
        'saisie_case_explication' => 'Permet activar o desactivar alguna cosa.',
        'saisie_case_titre' => 'Casella única',
        'saisie_checkbox_explication' => 'Permet escollir diverses opcions amb caselles.',
        'saisie_checkbox_titre' => 'Caselles a marcar', # MODIF
-       'saisie_date_explication' => 'Permet de saisir une date ? l\'aide d\'un calendrier', # NEW
-       'saisie_date_titre' => 'Date', # NEW
        'saisie_destinataires_explication' => 'Permet escollir un o diversos destinataris entre els autors seleccionats prèviament.',
        'saisie_destinataires_titre' => 'Destinataris',
        'saisie_explication_explication' => 'Un text explicatiu general.',
        'saisie_explication_titre' => 'Explicació',
        'saisie_fieldset_explication' => 'Un quadre que podrà englobar diversos camps.',
        'saisie_fieldset_titre' => 'Grup de camps',
-       'saisie_file_explication' => 'Enviament d\'un arxiu ',
+       'saisie_file_explication' => 'Enviament dun arxiu ',
        'saisie_file_titre' => 'Arxiu',
-       'saisie_hidden_explication' => 'Un camp omplert prèviament que l\'usuari no podrà veure.',
+       'saisie_hidden_explication' => 'Un camp omplert prèviament que lusuari no podrà veure.',
        'saisie_hidden_titre' => 'Camp amagat',
        'saisie_input_explication' => 'Una simple línia de text, que podrà ser visible o estar amagada (contrasenya).',
        'saisie_input_titre' => 'Línia de text',
@@ -153,12 +99,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_radio_defaut_choix3' => 'Tres',
        'saisie_radio_explication' => 'Permet escollir una opció entre les diverses disponibles.',
        'saisie_radio_titre' => 'Botons ràdios',
-       'saisie_selecteur_article' => 'Affiche un navigateur de sélection d\'article', # NEW
-       'saisie_selecteur_article_titre' => 'Sélecteur d\'article', # NEW
-       'saisie_selecteur_rubrique' => 'Affiche un navigateur de sélection de rubrique', # NEW
-       'saisie_selecteur_rubrique_article' => 'Affiche un navigateur de sélection d\'article ou de rubrique', # NEW
-       'saisie_selecteur_rubrique_article_titre' => 'Sélecteur d\'article ou rubrique', # NEW
-       'saisie_selecteur_rubrique_titre' => 'Sélecteur de rubrique', # NEW
        'saisie_selection_explication' => 'Escollir una opció en una llista desplegable.', # MODIF
        'saisie_selection_multiple_explication' => 'Permet escollir diverses opcions amb una llista.',
        'saisie_selection_multiple_titre' => 'Selecció múltiple',
@@ -168,7 +108,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // T
        'tous_visiteurs' => 'Tots els visitants (fins i tot els no registrats)',
-       'tout_selectionner' => 'Tout sélectionner', # NEW
 
        // V
        'vue_sans_reponse' => '<i>Sense resposta</i>', # MODIF
index c55a121..10a80af 100644 (file)
@@ -68,7 +68,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_class_label' => 'Zusätzliche CSS-Klassen',
        'option_cols_explication' => 'Breite des Blocks in Zeichen. Diese Option kann durch ihre CSS-Stile unwirksam grmacht werden.',
        'option_cols_label' => 'Breite',
-       'option_datas_explication' => 'Sie müssen in jeder Zeile eine Option im Format "Schlüssel|Bezeichnung" angeben.',
+       'option_datas_explication' => 'Sie müssen in jeder Zeile eine Option im Format "Schlüssel|Bezeichnung" angeben.', # MODIF
        'option_datas_label' => 'Mögliche Angaben',
        'option_defaut_label' => 'Standardwert',
        'option_disable_avec_post_explication' => 'Identisch mit voriger Option, jedoch wird der Wert in ein verstecktes Feld eingefügt.',
@@ -83,10 +83,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_groupe_description' => 'Beschreibung',
        'option_groupe_utilisation' => 'Verwendung',
        'option_groupe_validation' => 'Bestätigung',
-       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
-       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
-       'option_horaire_label' => 'Horaire', # NEW
-       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
        'option_info_obligatoire_explication' => 'Sie können die Standardbezeichnung für Pflichtfelder ändern:<i>[Pflichtfeld]</i>.',
        'option_info_obligatoire_label' => 'Pflichtfeld-Anzeige',
        'option_inserer_barre_choix_edition' => 'Vollständige Symbolleiste "Bearbeiten"',
@@ -119,10 +115,10 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_size_label' => 'Feldgröße',
        'option_type_choix_plusieurs' => 'Auswahl <strong>mehrerer</strong> Empfänger erlauben',
        'option_type_choix_tous' => '<strong>Alle</strong> diese Autoren als Empfänger hinzufügen. Der Besucher kann keine Auswahl treffen.',
-       'option_type_choix_un' => 'Der Besucher kann nur <strong>einen einzigen</strong> Empfänger auswählen.',
+       'option_type_choix_un' => 'Der Besucher kann nur <strong>einen einzigen</strong> Empfänger auswählen.', # MODIF
        'option_type_explication' => 'Im "versteckten" Modus wird der Inhalt dieses Felds nicht angezeigt.',
        'option_type_label' => 'Feldtyp',
-       'option_type_password' => 'Versteckt',
+       'option_type_password' => 'Versteckt', # MODIF
        'option_type_text' => 'Normal',
 
        // S
index dddd5e0..2439a01 100644 (file)
@@ -49,12 +49,16 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'label_mois' => 'Month',
 
        // O
-       'option_aff_art_interface_explication' => 'Display only the articles in the user\'s language',
+       'option_aff_art_interface_explication' => 'Display only the articles in the users language',
        'option_aff_art_interface_label' => 'Multilingual display',
        'option_aff_langue_explication' => 'Display the selected language of the article or section before the title',
        'option_aff_langue_label' => 'Display the language',
-       'option_aff_rub_interface_explication' => 'Display only the sections in the user\'s language',
+       'option_aff_rub_interface_explication' => 'Display only the sections in the users language',
        'option_aff_rub_interface_label' => 'Multilingual display',
+       'option_afficher_si_explication' => 'Indicate the display conditions of this field in function of the value of other fields. The identifier of the other fields has to be entered between <code>@</code>. <br />Example <code>@selection_1@=="Toto"</code> conditions the display of the field only when field <code>selection_1</code> has a value of <code>Toto</code>.',
+       'option_afficher_si_label' => 'Conditional display',
+       'option_afficher_si_remplissage_explication' => 'Other than the previous option, this one is only displayed while the form is being entered and not when the result is displayed. Its  syntax is the same.',
+       'option_afficher_si_remplissage_label' => 'Conditional display when being filled',
        'option_attention_explication' => 'A message more important than the explanation.',
        'option_attention_label' => 'Warning',
        'option_autocomplete_defaut' => 'Leave the default',
@@ -63,6 +67,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_autocomplete_off' => 'Disable',
        'option_autocomplete_on' => 'Enable',
        'option_cacher_option_intro_label' => 'Hide the first empty choice',
+       'option_choix_alternatif_label' => 'Allow to propose an alternative choice',
+       'option_choix_alternatif_label_defaut' => 'Other choice',
+       'option_choix_alternatif_label_label' => 'Label for this alternative choice',
        'option_choix_destinataires_explication' => 'One or several authors among which the user can make his choice. If nothing selected, it will be the author who installed the site to be chosen.',
        'option_choix_destinataires_label' => 'Possible recipients',
        'option_class_label' => 'Additional CSS Classes',
@@ -70,6 +77,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_cols_label' => 'Width',
        'option_datas_explication' => 'You need to specify a choice for each row in the form of "key|label of the choice"',
        'option_datas_label' => 'List of the available choices',
+       'option_datas_sous_groupe_explication' => 'You can indicate a choice by line using the format "key|Label" of the choice. <br />You can indicate the start of a subgroup using the format "*Title of the subgroup". To end a subgroup you can start another one, or put a line containing "/*".',
        'option_defaut_label' => 'Default value',
        'option_disable_avec_post_explication' => 'Same as previous option position but still post value in a hidden field.',
        'option_disable_avec_post_label' => 'Disabled but posted.',
@@ -103,6 +111,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_nom_explication' => 'A computer ID name that identifies the field. It may only contain lowercase alphanumeric characters or the underscore character "_".',
        'option_nom_label' => 'Field name',
        'option_obligatoire_label' => 'Required field',
+       'option_option_destinataire_intro_label' => 'Label of first choice empty (in list format)',
        'option_option_intro_label' => 'Label for the first empty choice',
        'option_option_statut_label' => 'Show the status',
        'option_pliable_label' => 'Expandable',
@@ -119,10 +128,11 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_size_label' => 'Field size',
        'option_type_choix_plusieurs' => 'Allow the user to choose <strong>several</ strong> message recipients.',
        'option_type_choix_tous' => 'Make <strong>all</ strong> these authors as recipients. The user will not have choice.',
-       'option_type_choix_un' => 'Allow the user to choose <strong>only one</strong> message recipient.',
+       'option_type_choix_un' => 'Allow the user to choose <strong>only one</strong> message recipient (as a dropdown list).',
+       'option_type_choix_un_radio' => 'Allow the user to select <strong>one single</strong> addressee (in checklist format).',
        'option_type_explication' => 'In "disguised" mode, the field contents as typed will be replaced with asterisks.',
        'option_type_label' => 'Field type',
-       'option_type_password' => 'Disguised',
+       'option_type_password' => 'Text, hidden during input (eg. password)',
        'option_type_text' => 'Normal',
 
        // S
index 3e099c5..c37fa17 100644 (file)
@@ -11,7 +11,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'bouton_parcourir_docs_article' => 'Buscar artículo',
        'bouton_parcourir_docs_breve' => 'Buscar breve',
        'bouton_parcourir_docs_rubrique' => 'Buscar la sección',
-       'bouton_parcourir_mediatheque' => 'Buscar mediateca',
+       'bouton_parcourir_mediatheque' => 'Examinar mediateca',
 
        // C
        'construire_action_annuler' => 'Anular',
@@ -27,7 +27,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'construire_aucun_champs' => 'Actualmente no existen campos en este formulario. ',
        'construire_confirmer_supprimer_champ' => '¿Desea eliminar realmente este campo?',
        'construire_info_nb_champs_masques' => '@nb@ campo(s) oculto(s) el tiempo de configurar el grupo.',
-       'construire_position_explication' => 'Indique delante de qué otro campo se cololocará.',
+       'construire_position_explication' => 'Indique delante de qué otro campo se colocará.',
        'construire_position_fin_formulaire' => 'Al final del formulario',
        'construire_position_fin_groupe' => 'Al final del grupo @groupe@',
        'construire_position_label' => 'Posición del campo',
@@ -51,27 +51,35 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        // O
        'option_aff_art_interface_explication' => 'Mostrar sólo los artículos en el idioma del usuario',
        'option_aff_art_interface_label' => 'Aparencia multilingüe',
-       'option_aff_langue_explication' => 'Muestra el idioma del artículo o de la sección enfrente de su título',
+       'option_aff_langue_explication' => 'Muestra el idioma del artículo o de la sección delante del título',
        'option_aff_langue_label' => 'Mostrar el idioma',
        'option_aff_rub_interface_explication' => 'Mostrar sólo las secciones en el idioma del usuario',
-       'option_aff_rub_interface_label' => 'Aparencia multilingüe',
+       'option_aff_rub_interface_label' => 'Apariencia multilingüe',
+       'option_afficher_si_explication' => 'Indique las condiciones para mostrar el campo en función del valor de los otros campos. El identificador de los otros campos debe ser indicarse entre <code>@</code>. <br />Ejemplo <code>@selection_1@=="Toto"</code> condiciona la visualización del campo a que el campo <code>selection_1</code> tenga por valor <code>Toto</code>.',
+       'option_afficher_si_label' => 'Visualización condicional',
+       'option_afficher_si_remplissage_explication' => 'Contrariamente a la opción anterior, ésta condiciona la visualización sólo al rellenar el formulario, no al mostrar los resultados. La sintaxis es la misma.',
+       'option_afficher_si_remplissage_label' => 'presentación condicional durante el rellenado',
        'option_attention_explication' => 'Un mensaje más importante que la explicación.',
        'option_attention_label' => 'Aviso',
        'option_autocomplete_defaut' => 'Dejar por defecto',
-       'option_autocomplete_explication' => 'Al cargar la página, su navegador puede rellenar el campo en función de sus historial',
+       'option_autocomplete_explication' => 'Al cargar la página, su navegador puede rellenar el campo en función de su historial',
        'option_autocomplete_label' => 'Pre-relleno del campo',
        'option_autocomplete_off' => 'Desactivar',
        'option_autocomplete_on' => 'Activar',
        'option_cacher_option_intro_label' => 'Esconder la primera opción vacía',
-       'option_choix_destinataires_explication' => 'Una lista de autoras o autores de SPIP. Se podrán elegir los destinatorios dentro de esta lista. Si no se selecciona nadie, la elección será la persona que instaló el sitio.',
-       'option_choix_destinataires_label' => 'Destinaciones posibles',
+       'option_choix_alternatif_label' => 'Permitir proponer una elección alternativa',
+       'option_choix_alternatif_label_defaut' => 'Otra elección',
+       'option_choix_alternatif_label_label' => 'Etiqueta de esta elección alternativa',
+       'option_choix_destinataires_explication' => 'Uno o varios autores entre los cuales el autor podrá elegir. Si no se selecciona nada, será el autor que ha instalado el sitio el elegido. ',
+       'option_choix_destinataires_label' => 'Destinatarios posibles',
        'option_class_label' => 'Clases CSS adicionales',
-       'option_cols_explication' => 'Ancho del bloque (en número de carácteres). Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS de tu sitio.',
+       'option_cols_explication' => 'Ancho del bloque (en número de caracteres). Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS de tu sitio.',
        'option_cols_label' => 'Ancho',
-       'option_datas_explication' => 'Tiene que dar una opción por línea bajo la forma "clave|Etiqueta de la opción"',
+       'option_datas_explication' => 'Debe indicar una opción por línea bajo la forma "clave|Etiqueta de la opción"',
        'option_datas_label' => 'Lista de opciones posibles',
+       'option_datas_sous_groupe_explication' => 'Debe indicar una opción por línea bajo la forma "clave|Etiqueta" de la opción". <br />Puede indicar el inicio de un subgrupo bajo la forma "*Título del subgrupo". Para terminar un subgrupo puede iniciar otro, o bien colocar una línea que contenga "/*".',
        'option_defaut_label' => 'Valor por defecto',
-       'option_disable_avec_post_explication' => 'Como la opción anterior, pero igual envía el valor en un campo escondido.',
+       'option_disable_avec_post_explication' => 'Como la opción anterior, pero publica el valor en un campo escondido.',
        'option_disable_avec_post_label' => 'Deactivar pero enviar',
        'option_disable_explication' => 'El campo ya no puede obtener el foco.',
        'option_disable_label' => 'Deactivar el campo',
@@ -79,7 +87,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_erreur_obligatoire_label' => 'Mensaje de obligación',
        'option_explication_explication' => 'Si hace falta, una frase corta que describe el campo',
        'option_explication_label' => 'Explicación',
-       'option_groupe_affichage' => 'Aparencia',
+       'option_groupe_affichage' => 'Apariencia',
        'option_groupe_description' => 'Descripción',
        'option_groupe_utilisation' => 'Uso',
        'option_groupe_validation' => 'Validación',
@@ -87,23 +95,25 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_heure_pas_label' => 'Intervalo de minutos en el menú de ayuda a la entrada',
        'option_horaire_label' => 'Horario',
        'option_horaire_label_case' => 'Permite introducir también la hora',
-       'option_info_obligatoire_explication' => 'Puede modificar la indicación de campo obligatoria: <i>[Obligatorio</i>.',
+       'option_id_groupe_label' => 'Grupo de palabras-claves',
+       'option_info_obligatoire_explication' => 'Puede modificar la indicación de campo obligatoria por defecto: <i>[Obligatorio</i>.',
        'option_info_obligatoire_label' => 'Indicación de campo obligatorio',
        'option_inserer_barre_choix_edition' => 'Barra de edición completa',
        'option_inserer_barre_choix_forum' => 'barra de los foros',
-       'option_inserer_barre_explication' => 'Integra una barra tipográfica si ésta es activa.',
-       'option_inserer_barre_label' => 'Integrar una barra de herramientas',
-       'option_label_case_label' => 'Etiqueta posicionada al lado de la checkbox',
-       'option_label_explication' => 'El título que se enseñará',
+       'option_inserer_barre_explication' => 'Insertar una barra tipográfica si ésta está activada.',
+       'option_inserer_barre_label' => 'Insertar una barra de herramientas',
+       'option_label_case_label' => 'Etiqueta posicionada al lado de la casilla',
+       'option_label_explication' => 'El título que se mostrará.',
        'option_label_label' => 'Etiqueta',
-       'option_maxlength_explication' => 'El campo no podrá contener más carácteres que este número.',
-       'option_maxlength_label' => 'Número máximo de carácteres',
+       'option_maxlength_explication' => 'El campo no podrá contener más caracteres que este número.',
+       'option_maxlength_label' => 'Número máximo de caracteres',
        'option_multiple_explication' => 'Se podrán seleccionar varias opciones',
        'option_multiple_label' => 'Selección múltiple',
-       'option_nom_explication' => 'Un nombre informático que identificará el campo. Sólo puede contener carácteres alfanuméricos minúsculos o el carácter "_".',
+       'option_nom_explication' => 'Un nombre informático que identificará el campo. Sólo puede contener caracteres alfanuméricos minúsculos o el carácter "_".',
        'option_nom_label' => 'Nombre del campo',
        'option_obligatoire_label' => 'Campo obligatorio',
-       'option_option_intro_label' => 'Label de la primera opción vacía',
+       'option_option_destinataire_intro_label' => 'Etiqueta de la primera opción vacía (cuando esté en forma de lista)',
+       'option_option_intro_label' => 'Etiqueta de la primera opción vacía',
        'option_option_statut_label' => 'Mostrar el estatus',
        'option_pliable_label' => 'Desplegable',
        'option_pliable_label_case' => 'El grupo de campos se podrá contraer y desplegar.',
@@ -115,27 +125,28 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_readonly_label' => 'Sólo lectura',
        'option_rows_explication' => 'Altura del bloque en número de líneas. Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS de su sitio.',
        'option_rows_label' => 'Número de líneas',
-       'option_size_explication' => 'Ancho del campo (número de carácteres). Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS de su sitio.',
+       'option_size_explication' => 'Ancho del campo (número de caracteres). Esta opción no se aplica siempre, porque puede ser cancelada por los estilos CSS del sitio.',
        'option_size_label' => 'Tamaño del campo',
-       'option_type_choix_plusieurs' => 'Permitirle al usuario elegir <strong>varias</strong> personas destinatorias.',
-       'option_type_choix_tous' => 'Poner a <strong>todos/as</strong> estas autoras como destinatorias. El usuario no tendrá ninguna opción.',
-       'option_type_choix_un' => 'Permitirle al usuario elegir <strong>sólo una</strong> persona destinatoria.',
+       'option_type_choix_plusieurs' => 'Permitirle al usuario elegir <strong>varias</strong> personas destinatarias.',
+       'option_type_choix_tous' => 'Poner a <strong>todos</strong> estos autores como destinatarios. El usuario no tendrá ninguna opción.',
+       'option_type_choix_un' => 'Permitir al usuario elegir <strong>sólo una</strong> persona destinataria (en forma de lista desplegable).',
+       'option_type_choix_un_radio' => 'Permitir al usuario elegir <strong>sólo una</strong> persona destinataria (en forma de lista de viñetas).',
        'option_type_explication' => 'En modo "escondido", el contenido del campo no será visible.',
        'option_type_label' => 'Tipo del campo',
-       'option_type_password' => 'Escondido',
+       'option_type_password' => 'Texto escondido mientras tecleando (por ej. contraseña)',
        'option_type_text' => 'Normal',
 
        // S
        'saisie_auteurs_explication' => 'Permite seleccionar uno o más autores',
        'saisie_auteurs_titre' => 'Autores',
-       'saisie_case_explication' => 'Permite activar o deactivar algo.',
-       'saisie_case_titre' => 'Checkbox único',
-       'saisie_checkbox_explication' => 'Permite elegir varias opciones con checkboxes',
-       'saisie_checkbox_titre' => 'Checkboxes',
+       'saisie_case_explication' => 'Permite activar o desactivar algo.',
+       'saisie_case_titre' => 'Casilla única',
+       'saisie_checkbox_explication' => 'Permite elegir varias opciones con las casillas a marcar.',
+       'saisie_checkbox_titre' => 'Casillas a marcar',
        'saisie_date_explication' => '¿Permitir introducir una fecha? Ayuda de calendario',
        'saisie_date_titre' => 'Fecha',
-       'saisie_destinataires_explication' => 'Permite elegir una o varias personas destinatorias dentro de las autoras seleccionadas.',
-       'saisie_destinataires_titre' => 'Personas destinatorias',
+       'saisie_destinataires_explication' => 'Permite elegir una o varias personas destinatarias entre las autoras preseleccionadas.',
+       'saisie_destinataires_titre' => 'Personas destinatarias',
        'saisie_explication_explication' => 'Una explicación general.',
        'saisie_explication_titre' => 'Explicación',
        'saisie_fieldset_explication' => 'Un marco que podrá englobar varios campos.',
@@ -146,7 +157,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_hidden_titre' => 'Campo escondido',
        'saisie_input_explication' => 'Una sola línea de texto, que puede ser visible u ocultada (contraseña).',
        'saisie_input_titre' => 'Línea de texto',
-       'saisie_oui_non_explication' => 'Sí o no. ¿Está claro? :)',
+       'saisie_mot_explication' => 'Una o varias palabras-claves de un grupo de palabras',
+       'saisie_mot_titre' => 'Palabra-clave',
+       'saisie_oui_non_explication' => 'Sí o no, ¿está claro? :)',
        'saisie_oui_non_titre' => 'Sí o no',
        'saisie_radio_defaut_choix1' => 'Uno',
        'saisie_radio_defaut_choix2' => 'Dos',
@@ -161,7 +174,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_selecteur_rubrique_titre' => 'Selector de sección',
        'saisie_selection_explication' => 'Elegir una opción dentro de una lista desplegable.',
        'saisie_selection_multiple_explication' => 'Permite elegir varias opciones con una lista.',
-       'saisie_selection_multiple_titre' => 'Selección multiple',
+       'saisie_selection_multiple_titre' => 'Selección múltiple',
        'saisie_selection_titre' => 'Lista desplegable',
        'saisie_textarea_explication' => 'Un campo de texto sobre varias líneas.',
        'saisie_textarea_titre' => 'Bloque de texto',
index e9de88d..5f3a866 100644 (file)
@@ -13,36 +13,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'bouton_parcourir_docs_rubrique' => 'مرور بخش',
        'bouton_parcourir_mediatheque' => 'مرور كتابخانه چندرسانه‌اي',
 
-       // C
-       'construire_action_annuler' => 'Annuler', # NEW
-       'construire_action_configurer' => 'Configurer', # NEW
-       'construire_action_deplacer' => 'Déplacer', # NEW
-       'construire_action_dupliquer' => 'Dupliquer', # NEW
-       'construire_action_dupliquer_copie' => '(copie)', # NEW
-       'construire_action_supprimer' => 'Supprimer', # NEW
-       'construire_ajouter_champ' => 'Ajouter un champ', # NEW
-       'construire_attention_enregistrer' => 'N\'oubliez pas d\'enregistrer vos modifications !', # NEW
-       'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Vous avez la possibilité de le réinitialiser à son état avant vos modifications.', # NEW
-       'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l\'enregistrement de cette nouvelle version du formulaire.', # NEW
-       'construire_aucun_champs' => 'Il n\'y a pour l\'instant aucun champ dans ce formulaire.', # NEW
-       'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?', # NEW
-       'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.', # NEW
-       'construire_position_explication' => 'Indiquez devant quel autre champ sera placé celui-ci.', # NEW
-       'construire_position_fin_formulaire' => 'À la fin du formulaire', # NEW
-       'construire_position_fin_groupe' => 'À la fin du groupe @groupe@', # NEW
-       'construire_position_label' => 'Position du champ', # NEW
-       'construire_reinitialiser' => 'Réinitialiser le formulaire', # NEW
-       'construire_reinitialiser_confirmer' => 'Vous allez perdre toutes vos modifications. Êtes-vous sûr de vouloir revenir au formulaire initial ?', # NEW
-       'construire_verifications_aucune' => 'Aucune', # NEW
-       'construire_verifications_label' => 'Type de vérification à effectuer', # NEW
-
-       // E
-       'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier vos saisies', # NEW
-       'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.', # NEW
-
-       // I
-       'info_configurer_saisies' => 'Page de test des Saisies', # NEW
-
        // L
        'label_annee' => 'سال',
        'label_jour' => 'روز',
@@ -57,36 +27,25 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_aff_rub_interface_label' => 'نمايش چندزبانه',
        'option_attention_explication' => 'پيامي مهم‌تر از توضيح.',
        'option_attention_label' => 'هشدار',
-       'option_autocomplete_defaut' => 'Laisser par défaut', # NEW
-       'option_autocomplete_explication' => 'Au chargement de la page, votre navigateur peut pré-remplir le champ en fonction de son historique', # NEW
-       'option_autocomplete_label' => 'Pré-remplissage du champ', # NEW
-       'option_autocomplete_off' => 'Désactiver', # NEW
-       'option_autocomplete_on' => 'Activer', # NEW
        'option_cacher_option_intro_label' => 'پنهان‌سازي نخستين انتخاب خالي ',
-       'option_choix_destinataires_explication' => 'يك يا چند نويسنده كه كاربر مي‌تواند از ميانشان انتخاب كند. اگر كسي انتخاب نشود،‌ نويسنده‌اي كه سايت را نصب كرده انتخاب خواهد شد.<NEW>Un ou plusieurs auteurs parmis lesquels l\'utilisateur pourra faire son choix. Si rien n\'est sélectionné, c\'est l\'auteur qui a installé le site qui sera choisi.',
+       'option_choix_destinataires_explication' => 'يك يا چند نويسنده كه كاربر مي‌تواند از ميانشان انتخاب كند. اگر كسي انتخاب نشود،‌ نويسنده‌اي كه سايت را نصب كرده انتخاب خواهد شد.<NEW>Un ou plusieurs auteurs parmis lesquels l’utilisateur pourra faire son choix. Si rien n’est sélectionné, c’est l’auteur qui a installé le site qui sera choisi.',
        'option_choix_destinataires_label' => '<دريافت‌ كنندگان محتمل',
        'option_class_label' => 'كلاس‌هاي سي.اس.اس اضافي ',
        'option_cols_explication' => 'پهناي بلوك به تعداد كارآكترها. اين گزينه هميشه كاربرد ندارد چرا كه شيوه‌هاي سي.اس.اس سايت شما مي‌تواند آن را منتفي سازد.',
        'option_cols_label' => 'پهنا',
-       'option_datas_explication' => 'لازم است براي هر رديف يك گزينه در قالب «گزينه‌ي كليد|برچسبِ» انتخاب كنيد.',
+       'option_datas_explication' => 'لازم است براي هر رديف يك گزينه در قالب «گزينه‌ي كليد|برچسبِ» انتخاب كنيد.', # MODIF
        'option_datas_label' => 'فهرست گزينه‌هاي ممكن ',
        'option_defaut_label' => 'مقدار پيش‌ گزيده',
        'option_disable_avec_post_explication' => 'همانند وضعيت گزينه‌ي قبلي اما هنوز مقدار در ميدان مخفي پست شود.',
        'option_disable_avec_post_label' => 'غيرفعال اما پست شده',
        'option_disable_explication' => 'ميدان نمي‌‌تواند تمركز بيشتري بگيرد.',
        'option_disable_label' => 'غيرفعال سازي ميدن',
-       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d\'erreur affiché pour indiquer l\'obligation (sinon laisser vide).', # NEW
-       'option_erreur_obligatoire_label' => 'Message d\'obligation', # NEW
        'option_explication_explication' => 'در هنگام نياز، يك عبارت كوتاه موضوع ميدان را بيان كند.',
        'option_explication_label' => 'توضيح',
        'option_groupe_affichage' => 'نمايش ',
        'option_groupe_description' => 'توصيف',
        'option_groupe_utilisation' => 'كاربرد',
        'option_groupe_validation' => 'ارزش‌گذاري',
-       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
-       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
-       'option_horaire_label' => 'Horaire', # NEW
-       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
        'option_info_obligatoire_explication' => 'مي‌توانيد كاربرد پيش‌ گزيده‌ي الزامي را اصلاح كنيد: <i>[Obligatoire]</i>.',
        'option_info_obligatoire_label' => 'نشان الزام',
        'option_inserer_barre_choix_edition' => 'ميل‌ابزار ويرايش كامل ',
@@ -104,7 +63,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_nom_label' => 'اسم ميدان',
        'option_obligatoire_label' => 'ميدان الزامي',
        'option_option_intro_label' => 'برچسب نخستين گزينه‌ي خالي ',
-       'option_option_statut_label' => 'Afficher les statuts', # NEW
        'option_pliable_label' => 'گسترشي ',
        'option_pliable_label_case' => 'گروه‌ ميدان‌هاي چين خور.',
        'option_plie_label' => 'چين خورده',
@@ -119,15 +77,13 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_size_label' => 'اندازه‌ي ميدان',
        'option_type_choix_plusieurs' => 'اجازه به كاربر در انتخاب <strong> چند</strong> دريافت كننده‌ي ايميل.',
        'option_type_choix_tous' => '<strong>تمام</strong> مؤلفان دريافت‌كننده شوند. كاربر گزينه‌اي نخواهد داشت.',
-       'option_type_choix_un' => 'اجازه به كاربر براي گزينش <strong> فقط يك </strong> دريافت‌كننده ',
+       'option_type_choix_un' => 'اجازه به كاربر براي گزينش <strong> فقط يك </strong> دريافت‌كننده ', # MODIF
        'option_type_explication' => 'در حالت «پوشيده»، محتواي ميدان قابل رؤيت نخواهد بود. ',
        'option_type_label' => 'نوع ميدان',
-       'option_type_password' => 'پوشيده',
+       'option_type_password' => 'پوشيده', # MODIF
        'option_type_text' => 'عادي',
 
        // S
-       'saisie_auteurs_explication' => 'Permet de sélectionner un ou plusieurs auteurs', # NEW
-       'saisie_auteurs_titre' => 'Auteurs', # NEW
        'saisie_case_explication' => 'فعال يا غيرفعال‌سازي يك گزينه‌ي مشخص.',
        'saisie_case_titre' => 'تك چك‌ باكش',
        'saisie_checkbox_explication' => 'اجازه‌ي گزينش چك‌ باكس چندگزينه‌اي.',
@@ -168,7 +124,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // T
        'tous_visiteurs' => 'تمام بازديدكنندگان (حتي ثبت ‌نام ناشدگان)',
-       'tout_selectionner' => 'Tout sélectionner', # NEW
 
        // V
        'vue_sans_reponse' => '<i>بي‌ پاسخ</i>',
index f6e55a2..567369d 100644 (file)
@@ -6,7 +6,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // B
-       'bouton_parcourir_docs_article' => 'Parcourir l\'article',
+       'bouton_parcourir_docs_article' => 'Parcourir larticle',
        'bouton_parcourir_docs_breve' => 'Parcourir la brève',
        'bouton_parcourir_docs_rubrique' => 'Parcourir la rubrique',
        'bouton_parcourir_mediatheque' => 'Parcourir la médiathèque',
@@ -19,18 +19,18 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'construire_action_dupliquer_copie' => '(copie)',
        'construire_action_supprimer' => 'Supprimer',
        'construire_ajouter_champ' => 'Ajouter un champ',
-       'construire_attention_enregistrer' => 'N\'oubliez pas d\'enregistrer vos modifications !',
+       'construire_attention_enregistrer' => 'N’oubliez pas d’enregistrer vos modifications !',
        'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Vous avez la possibilité de le réinitialiser à son état avant vos modifications.',
-       'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l\'enregistrement de cette nouvelle version du formulaire.',
-       'construire_aucun_champs' => 'Il n\'y a pour l\'instant aucun champ dans ce formulaire.',
-       'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?',
+       'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer lenregistrement de cette nouvelle version du formulaire.',
+       'construire_aucun_champs' => 'Il n’y a pour l’instant aucun champ dans ce formulaire.',
+       'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?',
        'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.',
        'construire_position_explication' => 'Indiquez devant quel autre champ sera placé celui-ci.',
        'construire_position_fin_formulaire' => 'À la fin du formulaire',
        'construire_position_fin_groupe' => 'À la fin du groupe @groupe@',
        'construire_position_label' => 'Position du champ',
        'construire_reinitialiser' => 'Réinitialiser le formulaire',
-       'construire_reinitialiser_confirmer' => 'Vous allez perdre toutes vos modifications. Êtes-vous sûr de vouloir revenir au formulaire initial ?',
+       'construire_reinitialiser_confirmer' => 'Vous allez perdre toutes vos modifications. Êtes-vous sûr de vouloir revenir au formulaire initial ?',
        'construire_verifications_aucune' => 'Aucune',
        'construire_verifications_label' => 'Type de vérification à effectuer',
 
@@ -47,13 +47,17 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'label_mois' => 'Mois',
 
        // O
-       'option_aff_art_interface_explication' => 'Afficher uniquement les articles de la langue de l\'utilisateur',
+       'option_aff_art_interface_explication' => 'Afficher uniquement les articles de la langue de lutilisateur',
        'option_aff_art_interface_label' => 'Affichage multilingue',
-       'option_aff_langue_explication' => 'Affiche la langue de l\'article ou rubrique sélectionné devant le titre',
+       'option_aff_langue_explication' => 'Affiche la langue de larticle ou rubrique sélectionné devant le titre',
        'option_aff_langue_label' => 'Afficher la langue',
-       'option_aff_rub_interface_explication' => 'Afficher uniquement les rubriques de la langue de l\'utilisateur',
+       'option_aff_rub_interface_explication' => 'Afficher uniquement les rubriques de la langue de lutilisateur',
        'option_aff_rub_interface_label' => 'Affichage multilingue',
-       'option_attention_explication' => 'Un message plus important que l\'explication.',
+       'option_afficher_si_explication' => 'Indiquez les conditions pour afficher le champ en fonction de la valeur des autres champs. L’identifiant des autres champs doit être mis entre <code>@</code>. <br />Exemple <code>@selection_1@=="Toto"</code> conditionne l’affichage du champ à ce que le champ <code>selection_1</code> ait pour valeur <code>Toto</code>.',
+       'option_afficher_si_label' => 'Affichage conditionnel',
+       'option_afficher_si_remplissage_explication' => 'Contrairement à la précédente option, celle-ci ne conditionne l’affichage que lors du remplissage du formulaire, pas lors de l’affichage des résultats. Sa syntaxe est la même.',
+       'option_afficher_si_remplissage_label' => 'Affichage conditionnel lors du remplissage',
+       'option_attention_explication' => 'Un message plus important que l’explication.',
        'option_attention_label' => 'Avertissement',
        'option_autocomplete_defaut' => 'Laisser par défaut',
        'option_autocomplete_explication' => 'Au chargement de la page, votre navigateur peut pré-remplir le champ en fonction de son historique',
@@ -61,21 +65,25 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_autocomplete_off' => 'Désactiver',
        'option_autocomplete_on' => 'Activer',
        'option_cacher_option_intro_label' => 'Cacher le premier choix vide',
-       'option_choix_destinataires_explication' => 'Un ou plusieurs auteurs parmis lesquels l\'utilisateur pourra faire son choix. Si rien n\'est sélectionné, c\'est l\'auteur qui a installé le site qui sera choisi.',
+       'option_choix_alternatif_label' => 'Permettre de proposer un choix alternatif',
+       'option_choix_alternatif_label_defaut' => 'Autre choix',
+       'option_choix_alternatif_label_label' => 'Label de ce choix alternatif',
+       'option_choix_destinataires_explication' => 'Un ou plusieurs auteurs parmis lesquels l’utilisateur pourra faire son choix. Si rien n’est sélectionné, c’est l’auteur qui a installé le site qui sera choisi.',
        'option_choix_destinataires_label' => 'Destinataires possibles',
        'option_class_label' => 'Classes CSS supplémentaires',
-       'option_cols_explication' => 'Largeur du bloc en nombre de caractères. Cette option n\'est pas toujours appliquée car les styles CSS de votre site peuvent l\'annuler.',
+       'option_cols_explication' => 'Largeur du bloc en nombre de caractères. Cette option n’est pas toujours appliquée car les styles CSS de votre site peuvent l’annuler.',
        'option_cols_label' => 'Largeur',
        'option_datas_explication' => 'Vous devez indiquez un choix par ligne sous la forme "cle|Label du choix"',
        'option_datas_label' => 'Liste des choix possibles',
+       'option_datas_sous_groupe_explication' => 'Vous devez indiquez un choix par ligne sous la forme "cle|Label" du choix. <br />Vous pouvez indiquer le début d’un sous-groupe sous la forme "*Titre du sous-groupe". Pour finir un sous-groupe vous pouvez en entamez un autre, ou bien mettre une ligne contenant unique "/*".',
        'option_defaut_label' => 'Valeur par défaut',
-       'option_disable_avec_post_explication' => 'Identique à l\'option précédente mais poste quand même la valeur dans un champ caché.',
+       'option_disable_avec_post_explication' => 'Identique à loption précédente mais poste quand même la valeur dans un champ caché.',
        'option_disable_avec_post_label' => 'Désactiver mais poster',
        'option_disable_explication' => 'Le champ ne peut plus obtenir le focus.',
        'option_disable_label' => 'Désactiver le champ',
-       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d\'erreur affiché pour indiquer l\'obligation (sinon laisser vide).',
-       'option_erreur_obligatoire_label' => 'Message d\'obligation',
-       'option_explication_explication' => 'Si besoin, une courte phrase décrivant l\'objet du champ.',
+       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d’erreur affiché pour indiquer l’obligation (sinon laisser vide).',
+       'option_erreur_obligatoire_label' => 'Message dobligation',
+       'option_explication_explication' => 'Si besoin, une courte phrase décrivant lobjet du champ.',
        'option_explication_label' => 'Explication',
        'option_groupe_affichage' => 'Affichage',
        'option_groupe_description' => 'Description',
@@ -85,52 +93,55 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie',
        'option_horaire_label' => 'Horaire',
        'option_horaire_label_case' => 'Permettre de saisir aussi l’horaire',
-       'option_info_obligatoire_explication' => 'Vous pouvez modifier l\'indication d\'obligation par défaut : <i>[Obligatoire]</i>.',
-       'option_info_obligatoire_label' => 'Indication d\'obligation',
-       'option_inserer_barre_choix_edition' => 'barre d\'édition complète',
+       'option_id_groupe_label' => 'Groupe de mots',
+       'option_info_obligatoire_explication' => 'Vous pouvez modifier l’indication d’obligation par défaut : <i>[Obligatoire]</i>.',
+       'option_info_obligatoire_label' => 'Indication d’obligation',
+       'option_inserer_barre_choix_edition' => 'barre d’édition complète',
        'option_inserer_barre_choix_forum' => 'barre des forums',
-       'option_inserer_barre_explication' => 'Insère une barre d\'outils du porte-plume si ce dernier est activé.',
-       'option_inserer_barre_label' => 'Insérer une barre d\'outils',
+       'option_inserer_barre_explication' => 'Insère une barre doutils du porte-plume si ce dernier est activé.',
+       'option_inserer_barre_label' => 'Insérer une barre doutils',
        'option_label_case_label' => 'Label placé à côté de la case',
        'option_label_explication' => 'Le titre qui sera affiché.',
        'option_label_label' => 'Label',
-       'option_maxlength_explication' => 'L\'utilisateur ne pourra pas taper plus de caractères que ce nombre.',
+       'option_maxlength_explication' => 'Lutilisateur ne pourra pas taper plus de caractères que ce nombre.',
        'option_maxlength_label' => 'Nombre de caractères maximum',
-       'option_multiple_explication' => 'L\'utilisateur pourra sélectionner plusieurs valeurs',
+       'option_multiple_explication' => 'Lutilisateur pourra sélectionner plusieurs valeurs',
        'option_multiple_label' => 'Sélection multiple',
        'option_nom_explication' => 'Un nom informatique qui identifiera le champ. Il ne doit contenir que des caractères alpha-numériques minuscules ou le caractère "_".',
        'option_nom_label' => 'Nom du champ',
        'option_obligatoire_label' => 'Champ obligatoire',
+       'option_option_destinataire_intro_label' => 'Label du premier choix vide (lorsque sous forme de liste)',
        'option_option_intro_label' => 'Label du premier choix vide',
        'option_option_statut_label' => 'Afficher les statuts',
        'option_pliable_label' => 'Pliable',
        'option_pliable_label_case' => 'Le groupe de champs pourra être replié.',
        'option_plie_label' => 'Déjà plié',
-       'option_plie_label_case' => 'Si le groupe de champs est pliable, il sera déjà plié à l\'affichage du formulaire.',
+       'option_plie_label_case' => 'Si le groupe de champs est pliable, il sera déjà plié à laffichage du formulaire.',
        'option_previsualisation_explication' => 'Si le porte-plume est activé, ajoute un onglet pour prévisualiser le rendu du texte saisi.',
        'option_previsualisation_label' => 'Activer la prévisualisation',
        'option_readonly_explication' => 'Le champ peut être lu, sélectionné, mais pas modifié.',
        'option_readonly_label' => 'Lecture seule',
-       'option_rows_explication' => 'Hauteur du bloc en nombre de ligne. Cette option n\'est pas toujours appliquée car les styles CSS de votre site peuvent l\'annuler.',
+       'option_rows_explication' => 'Hauteur du bloc en nombre de ligne. Cette option n’est pas toujours appliquée car les styles CSS de votre site peuvent l’annuler.',
        'option_rows_label' => 'Nombre de lignes',
-       'option_size_explication' => 'Largeur du champ en nombre de caractères. Cette option n\'est pas toujours appliquée car les styles CSS de votre site peuvent l\'annuler.',
+       'option_size_explication' => 'Largeur du champ en nombre de caractères. Cette option n’est pas toujours appliquée car les styles CSS de votre site peuvent l’annuler.',
        'option_size_label' => 'Taille du champ',
-       'option_type_choix_plusieurs' => 'Permettre à l\'utilisateur de choisir <strong>plusieurs</strong> destinataires.',
-       'option_type_choix_tous' => 'Mettre <strong>tous</strong> ces auteurs en destinataires. L\'utilisateur n\'aura aucun choix.',
-       'option_type_choix_un' => 'Permettre à l\'utilisateur de choisir <strong>un seul</strong> destinataire.',
+       'option_type_choix_plusieurs' => 'Permettre à l’utilisateur de choisir <strong>plusieurs</strong> destinataires.',
+       'option_type_choix_tous' => 'Mettre <strong>tous</strong> ces auteurs en destinataires. L’utilisateur n’aura aucun choix.',
+       'option_type_choix_un' => 'Permettre à l’utilisateur de choisir <strong>un seul</strong> destinataire (sous forme de liste déroulante).',
+       'option_type_choix_un_radio' => 'Permettre à l’utilisateur de choisir <strong>un seul</strong> destinataire (sous forme de liste à puce).',
        'option_type_explication' => 'En mode "masqué", le contenu du champ ne sera pas visible.',
        'option_type_label' => 'Type du champ',
-       'option_type_password' => 'Masqué',
+       'option_type_password' => 'Texte masqué lors de la saisie (ex : mot de passe)',
        'option_type_text' => 'Normal',
 
        // S
        'saisie_auteurs_explication' => 'Permet de sélectionner un ou plusieurs auteurs',
        'saisie_auteurs_titre' => 'Auteurs',
-       'saisie_case_explication' => 'Permet d\'activer ou de désactiver quelque chose.',
+       'saisie_case_explication' => 'Permet dactiver ou de désactiver quelque chose.',
        'saisie_case_titre' => 'Case unique',
        'saisie_checkbox_explication' => 'Permet de choisir plusieurs options avec des cases.',
        'saisie_checkbox_titre' => 'Cases à cocher',
-       'saisie_date_explication' => 'Permet de saisir une date ? l\'aide d\'un calendrier',
+       'saisie_date_explication' => 'Permet de saisir une date ? l’aide d’un calendrier',
        'saisie_date_titre' => 'Date',
        'saisie_destinataires_explication' => 'Permet de choisir un ou plusieurs destinataires parmis des auteurs pré-sélectionné.',
        'saisie_destinataires_titre' => 'Destinataires',
@@ -138,24 +149,26 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_explication_titre' => 'Explication',
        'saisie_fieldset_explication' => 'Un cadre qui pourra englober plusieurs champs.',
        'saisie_fieldset_titre' => 'Groupe de champs',
-       'saisie_file_explication' => 'Envoi d\'un fichier',
+       'saisie_file_explication' => 'Envoi dun fichier',
        'saisie_file_titre' => 'Fichier',
-       'saisie_hidden_explication' => 'Un champ pré-rempli que l\'utilisateur ne pourra pas voir.',
+       'saisie_hidden_explication' => 'Un champ pré-rempli que lutilisateur ne pourra pas voir.',
        'saisie_hidden_titre' => 'Champ caché',
        'saisie_input_explication' => 'Une simple ligne de texte, pouvant être visible ou masquée (mot de passe).',
        'saisie_input_titre' => 'Ligne de texte',
-       'saisie_oui_non_explication' => 'Oui ou non, c\'est clair ? :)',
+       'saisie_mot_explication' => 'Un ou plusieurs mots-clés d’un groupe de mot',
+       'saisie_mot_titre' => 'Mot-clé',
+       'saisie_oui_non_explication' => 'Oui ou non, c’est clair ? :)',
        'saisie_oui_non_titre' => 'Oui ou non',
        'saisie_radio_defaut_choix1' => 'Un',
        'saisie_radio_defaut_choix2' => 'Deux',
        'saisie_radio_defaut_choix3' => 'Trois',
        'saisie_radio_explication' => 'Permet de choisir une option parmis plusieurs disponibles.',
        'saisie_radio_titre' => 'Boutons radios',
-       'saisie_selecteur_article' => 'Affiche un navigateur de sélection d\'article',
-       'saisie_selecteur_article_titre' => 'Sélecteur d\'article',
+       'saisie_selecteur_article' => 'Affiche un navigateur de sélection darticle',
+       'saisie_selecteur_article_titre' => 'Sélecteur darticle',
        'saisie_selecteur_rubrique' => 'Affiche un navigateur de sélection de rubrique',
-       'saisie_selecteur_rubrique_article' => 'Affiche un navigateur de sélection d\'article ou de rubrique',
-       'saisie_selecteur_rubrique_article_titre' => 'Sélecteur d\'article ou rubrique',
+       'saisie_selecteur_rubrique_article' => 'Affiche un navigateur de sélection darticle ou de rubrique',
+       'saisie_selecteur_rubrique_article_titre' => 'Sélecteur darticle ou rubrique',
        'saisie_selecteur_rubrique_titre' => 'Sélecteur de rubrique',
        'saisie_selection_explication' => 'Choisir une option dans une liste déroulante.',
        'saisie_selection_multiple_explication' => 'Permet de choisir plusieurs options avec une liste.',
index 9380d49..1dbdbc1 100644 (file)
@@ -8,40 +8,40 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // B
-       'bouton_parcourir_docs_article' => 'Parcourir l\'article',
+       'bouton_parcourir_docs_article' => 'Parcourir larticle',
        'bouton_parcourir_docs_breve' => 'Parcourir la brève',
        'bouton_parcourir_docs_rubrique' => 'Parcourir la rubrique',
        'bouton_parcourir_mediatheque' => 'Parcourir la médiathèque',
 
        // C
-       'construire_action_annuler' => 'Annuler', # NEW
-       'construire_action_configurer' => 'Configurer', # NEW
-       'construire_action_deplacer' => 'Déplacer', # NEW
-       'construire_action_dupliquer' => 'Dupliquer', # NEW
-       'construire_action_dupliquer_copie' => '(copie)', # NEW
-       'construire_action_supprimer' => 'Supprimer', # NEW
-       'construire_ajouter_champ' => 'Ajouter un champ', # NEW
-       'construire_attention_enregistrer' => 'N\'oubliez pas d\'enregistrer vos modifications !', # NEW
-       'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Vous avez la possibilité de le réinitialiser à son état avant vos modifications.', # NEW
-       'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l\'enregistrement de cette nouvelle version du formulaire.', # NEW
-       'construire_aucun_champs' => 'Il n\'y a pour l\'instant aucun champ dans ce formulaire.', # NEW
-       'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?', # NEW
-       'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.', # NEW
-       'construire_position_explication' => 'Indiquez devant quel autre champ sera placé celui-ci.', # NEW
-       'construire_position_fin_formulaire' => 'À la fin du formulaire', # NEW
-       'construire_position_fin_groupe' => 'À la fin du groupe @groupe@', # NEW
-       'construire_position_label' => 'Position du champ', # NEW
-       'construire_reinitialiser' => 'Réinitialiser le formulaire', # NEW
-       'construire_reinitialiser_confirmer' => 'Vous allez perdre toutes vos modifications. Êtes-vous sûr de vouloir revenir au formulaire initial ?', # NEW
-       'construire_verifications_aucune' => 'Aucune', # NEW
-       'construire_verifications_label' => 'Type de vérification à effectuer', # NEW
+       'construire_action_annuler' => 'Annuler',
+       'construire_action_configurer' => 'Configurer',
+       'construire_action_deplacer' => 'Déplacer',
+       'construire_action_dupliquer' => 'Dupliquer',
+       'construire_action_dupliquer_copie' => '(copie)',
+       'construire_action_supprimer' => 'Supprimer',
+       'construire_ajouter_champ' => 'Ajouter un champ',
+       'construire_attention_enregistrer' => 'N’oublie pas d’enregistrer tes modifications !',
+       'construire_attention_modifie' => 'Le formulaire ci-dessous est différent du formulaire initial. Tu as la possibilité de le réinitialiser à son état avant tes modifications.',
+       'construire_attention_supprime' => 'Tes modifications comportent des suppressions de champs. Confirme l’enregistrement de cette nouvelle version du formulaire.',
+       'construire_aucun_champs' => 'Il n’y a pour l’instant aucun champ dans ce formulaire.',
+       'construire_confirmer_supprimer_champ' => 'Veux-tu vraiment supprimer ce champ ?',
+       'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.',
+       'construire_position_explication' => 'Indique devant quel autre champ sera placé celui-ci.',
+       'construire_position_fin_formulaire' => 'À la fin du formulaire',
+       'construire_position_fin_groupe' => 'À la fin du groupe @groupe@',
+       'construire_position_label' => 'Position du champ',
+       'construire_reinitialiser' => 'Réinitialiser le formulaire',
+       'construire_reinitialiser_confirmer' => 'Tu vas perdre toutes tes modifications. Es-tu sûr de vouloir revenir au formulaire initial ?',
+       'construire_verifications_aucune' => 'Aucune',
+       'construire_verifications_label' => 'Type de vérification à effectuer',
 
        // E
-       'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier vos saisies', # NEW
-       'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.', # NEW
+       'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, vérifie tes saisies',
+       'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.',
 
        // I
-       'info_configurer_saisies' => 'Page de test des Saisies', # NEW
+       'info_configurer_saisies' => 'Page de test des Saisies',
 
        // L
        'label_annee' => 'Année',
@@ -49,90 +49,100 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'label_mois' => 'Mois',
 
        // O
-       'option_aff_art_interface_explication' => 'Afficher uniquement les articles de la langue de l\'utilisateur',
+       'option_aff_art_interface_explication' => 'Afficher uniquement les articles de la langue de lutilisateur',
        'option_aff_art_interface_label' => 'Affichage multilingue',
-       'option_aff_langue_explication' => 'Affiche la langue de l\'article ou rubrique sélectionné devant le titre',
+       'option_aff_langue_explication' => 'Affiche la langue de larticle ou rubrique sélectionné devant le titre',
        'option_aff_langue_label' => 'Afficher la langue',
-       'option_aff_rub_interface_explication' => 'Afficher uniquement les rubriques de la langue de l\'utilisateur',
+       'option_aff_rub_interface_explication' => 'Afficher uniquement les rubriques de la langue de lutilisateur',
        'option_aff_rub_interface_label' => 'Affichage multilingue',
-       'option_attention_explication' => 'Un message plus important que l\'explication.',
+       'option_afficher_si_explication' => 'Indique les conditions pour afficher le champ en fonction de la valeur des autres champs. L’identifiant des autres champs doit être mis entre <code>@</code>. <br />Exemple <code>@selection_1@=="Toto"</code> conditionne l’affichage du champ à ce que le champ <code>selection_1</code> ait pour valeur <code>Toto</code>.',
+       'option_afficher_si_label' => 'Affichage conditionnel',
+       'option_afficher_si_remplissage_explication' => 'Contrairement à la précédente option, celle-ci ne conditionne l’affichage que lors du remplissage du formulaire, pas lors de l’affichage des résultats. Sa syntaxe est la même.',
+       'option_afficher_si_remplissage_label' => 'Affichage conditionnel lors du remplissage',
+       'option_attention_explication' => 'Un message plus important que l’explication.',
        'option_attention_label' => 'Avertissement',
-       'option_autocomplete_defaut' => 'Laisser par défaut', # NEW
-       'option_autocomplete_explication' => 'Au chargement de la page, votre navigateur peut pré-remplir le champ en fonction de son historique', # NEW
-       'option_autocomplete_label' => 'Pré-remplissage du champ', # NEW
-       'option_autocomplete_off' => 'Désactiver', # NEW
-       'option_autocomplete_on' => 'Activer', # NEW
+       'option_autocomplete_defaut' => 'Laisser par défaut',
+       'option_autocomplete_explication' => 'Au chargement de la page, ton navigateur peut pré-remplir le champ en fonction de son historique',
+       'option_autocomplete_label' => 'Pré-remplissage du champ',
+       'option_autocomplete_off' => 'Désactiver',
+       'option_autocomplete_on' => 'Activer',
        'option_cacher_option_intro_label' => 'Cacher le premier choix vide',
-       'option_choix_destinataires_explication' => 'Un ou plusieurs auteurs parmis lesquels l\'utilisateur pourra faire son choix. Si rien n\'est sélectionné, c\'est l\'auteur qui a installé le site qui sera choisi.',
+       'option_choix_alternatif_label' => 'Permettre de proposer un choix alternatif',
+       'option_choix_alternatif_label_defaut' => 'Autre choix',
+       'option_choix_alternatif_label_label' => 'Label de ce choix alternatif',
+       'option_choix_destinataires_explication' => 'Un ou plusieurs auteurs parmis lesquels l’utilisateur pourra faire son choix. Si rien n’est sélectionné, c’est l’auteur qui a installé le site qui sera choisi.',
        'option_choix_destinataires_label' => 'Destinataires possibles',
        'option_class_label' => 'Classes CSS supplémentaires',
-       'option_cols_explication' => 'Largeur du bloc en nombre de caractères. Cette option n\'est pas toujours appliquée car les styles CSS de ton site peuvent l\'annuler.',
+       'option_cols_explication' => 'Largeur du bloc en nombre de caractères. Cette option n’est pas toujours appliquée car les styles CSS de ton site peuvent l’annuler.',
        'option_cols_label' => 'Largeur',
-       'option_datas_explication' => 'Tu dois indiquez un choix par ligne sous la forme "cle|Label du choix"',
+       'option_datas_explication' => 'Tu dois indiquer un choix par ligne sous la forme "cle|Label du choix"',
        'option_datas_label' => 'Liste des choix possibles',
+       'option_datas_sous_groupe_explication' => 'Tu dois indiquez un choix par ligne sous la forme "cle|Label" du choix. <br />Tu peux indiquer le début d’un sous-groupe sous la forme "*Titre du sous-groupe". Pour finir un sous-groupe tu peux en entamez un autre, ou bien mettre une ligne contenant unique "/*".',
        'option_defaut_label' => 'Valeur par défaut',
-       'option_disable_avec_post_explication' => 'Identique à l\'option précédente mais poste quand même la valeur dans un champ caché.',
+       'option_disable_avec_post_explication' => 'Identique à loption précédente mais poste quand même la valeur dans un champ caché.',
        'option_disable_avec_post_label' => 'Désactiver mais poster',
        'option_disable_explication' => 'Le champ ne peut plus obtenir le focus.',
        'option_disable_label' => 'Désactiver le champ',
-       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d\'erreur affiché pour indiquer l\'obligation (sinon laisser vide).', # NEW
-       'option_erreur_obligatoire_label' => 'Message d\'obligation', # NEW
-       'option_explication_explication' => 'Si besoin, une courte phrase décrivant l\'objet du champ.',
+       'option_erreur_obligatoire_explication' => 'Tu peux personnaliser le message d’erreur affiché pour indiquer l’obligation (sinon laisser vide).',
+       'option_erreur_obligatoire_label' => 'Message d’obligation',
+       'option_explication_explication' => 'Si besoin, une courte phrase décrivant lobjet du champ.',
        'option_explication_label' => 'Explication',
        'option_groupe_affichage' => 'Affichage',
        'option_groupe_description' => 'Description',
        'option_groupe_utilisation' => 'Utilisation',
        'option_groupe_validation' => 'Validation',
-       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
-       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
-       'option_horaire_label' => 'Horaire', # NEW
-       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
-       'option_info_obligatoire_explication' => 'Tu peux modifier l\'indication d\'obligation par défaut : <i>[Obligatoire]</i>.',
-       'option_info_obligatoire_label' => 'Indication d\'obligation',
-       'option_inserer_barre_choix_edition' => 'barre d\'édition complète',
+       'option_heure_pas_explication' => 'Lorsque tu utilises l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Tu peux ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).',
+       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie',
+       'option_horaire_label' => 'Horaire',
+       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire',
+       'option_info_obligatoire_explication' => 'Tu peux modifier l’indication d’obligation par défaut : <i>[Obligatoire]</i>.',
+       'option_info_obligatoire_label' => 'Indication dobligation',
+       'option_inserer_barre_choix_edition' => 'barre dédition complète',
        'option_inserer_barre_choix_forum' => 'barre des forums',
-       'option_inserer_barre_explication' => 'Insère une barre d\'outils du porte-plume si ce dernier est activé.',
-       'option_inserer_barre_label' => 'Insérer une barre d\'outils',
+       'option_inserer_barre_explication' => 'Insère une barre doutils du porte-plume si ce dernier est activé.',
+       'option_inserer_barre_label' => 'Insérer une barre doutils',
        'option_label_case_label' => 'Label placé à côté de la case',
        'option_label_explication' => 'Le titre qui sera affiché.',
        'option_label_label' => 'Label',
-       'option_maxlength_explication' => 'L\'utilisateur ne pourra pas taper plus de caractères que ce nombre.',
+       'option_maxlength_explication' => 'Lutilisateur ne pourra pas taper plus de caractères que ce nombre.',
        'option_maxlength_label' => 'Nombre de caractères maximum',
-       'option_multiple_explication' => 'L\'utilisateur pourra sélectionner plusieurs valeurs',
+       'option_multiple_explication' => 'Lutilisateur pourra sélectionner plusieurs valeurs',
        'option_multiple_label' => 'Sélection multiple',
        'option_nom_explication' => 'Un nom informatique qui identifiera le champ. Il ne doit contenir que des caractères alpha-numériques minuscules ou le caractère "_".',
        'option_nom_label' => 'Nom du champ',
        'option_obligatoire_label' => 'Champ obligatoire',
+       'option_option_destinataire_intro_label' => 'Label du premier choix vide (lorsque sous forme de liste)',
        'option_option_intro_label' => 'Label du premier choix vide',
-       'option_option_statut_label' => 'Afficher les statuts', # NEW
+       'option_option_statut_label' => 'Afficher les statuts',
        'option_pliable_label' => 'Pliable',
        'option_pliable_label_case' => 'Le groupe de champs pourra être replié.',
        'option_plie_label' => 'Déjà plié',
-       'option_plie_label_case' => 'Si le groupe de champs est pliable, il sera déjà plié à l\'affichage du formulaire.',
+       'option_plie_label_case' => 'Si le groupe de champs est pliable, il sera déjà plié à laffichage du formulaire.',
        'option_previsualisation_explication' => 'Si le porte-plume est activé, ajoute un onglet pour prévisualiser le rendu du texte saisi.',
        'option_previsualisation_label' => 'Activer la prévisualisation',
        'option_readonly_explication' => 'Le champ peut être lu, sélectionné, mais pas modifié.',
        'option_readonly_label' => 'Lecture seule',
-       'option_rows_explication' => 'Hauteur du bloc en nombre de ligne. Cette option n\'est pas toujours appliquée car les styles CSS de votre site peuvent l\'annuler.',
+       'option_rows_explication' => 'Hauteur du bloc en nombre de ligne. Cette option n’est pas toujours appliquée car les styles CSS de votre site peuvent l’annuler.',
        'option_rows_label' => 'Nombre de lignes',
-       'option_size_explication' => 'Largeur du champ en nombre de caractères. Cette option n\'est pas toujours appliquée car les styles CSS de ton site peuvent l\'annuler.',
+       'option_size_explication' => 'Largeur du champ en nombre de caractères. Cette option n’est pas toujours appliquée car les styles CSS de ton site peuvent l’annuler.',
        'option_size_label' => 'Taille du champ',
-       'option_type_choix_plusieurs' => 'Permettre à l\'utilisateur de choisir <strong>plusieurs</strong> destinataires.',
-       'option_type_choix_tous' => 'Mettre <strong>tous</strong> ces auteurs en destinataires. L\'utilisateur n\'aura aucun choix.',
-       'option_type_choix_un' => 'Permettre à l\'utilisateur de choisir <strong>un seul</strong> destinataire.',
+       'option_type_choix_plusieurs' => 'Permettre à l’utilisateur de choisir <strong>plusieurs</strong> destinataires.',
+       'option_type_choix_tous' => 'Mettre <strong>tous</strong> ces auteurs en destinataires. L’utilisateur n’aura aucun choix.',
+       'option_type_choix_un' => 'Permettre à l’utilisateur de choisir <strong>un seul</strong> destinataire.Permettre à l’utilisateur de choisir <strong>un seul</strong> destinataire (sous forme de liste déroulante).',
+       'option_type_choix_un_radio' => 'Permettre à l’utilisateur de choisir <strong>un seul</strong> destinataire (sous forme de liste à puce).',
        'option_type_explication' => 'En mode "masqué", le contenu du champ ne sera pas visible.',
        'option_type_label' => 'Type du champ',
-       'option_type_password' => 'Masqué',
+       'option_type_password' => 'Texte masqué lors de la saisie (ex : mot de passe)',
        'option_type_text' => 'Normal',
 
        // S
-       'saisie_auteurs_explication' => 'Permet de sélectionner un ou plusieurs auteurs', # NEW
-       'saisie_auteurs_titre' => 'Auteurs', # NEW
-       'saisie_case_explication' => 'Permet d\'activer ou de désactiver quelque chose.',
+       'saisie_auteurs_explication' => 'Permet de sélectionner un ou plusieurs auteurs',
+       'saisie_auteurs_titre' => 'Auteurs',
+       'saisie_case_explication' => 'Permet dactiver ou de désactiver quelque chose.',
        'saisie_case_titre' => 'Case unique',
        'saisie_checkbox_explication' => 'Permet de choisir plusieurs options avec des cases.',
        'saisie_checkbox_titre' => 'Cases à cocher',
-       'saisie_date_explication' => 'Permet de saisir une date ? l\'aide d\'un calendrier',
+       'saisie_date_explication' => 'Permet de saisir une date ? l’aide d’un calendrier',
        'saisie_date_titre' => 'Date',
        'saisie_destinataires_explication' => 'Permet de choisir un ou plusieurs destinataires parmis des auteurs pré-sélectionné.',
        'saisie_destinataires_titre' => 'Destinataires',
@@ -140,24 +150,24 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_explication_titre' => 'Explication',
        'saisie_fieldset_explication' => 'Un cadre qui pourra englober plusieurs champs.',
        'saisie_fieldset_titre' => 'Groupe de champs',
-       'saisie_file_explication' => 'Envoi d\'un fichier',
+       'saisie_file_explication' => 'Envoi dun fichier',
        'saisie_file_titre' => 'Fichier',
-       'saisie_hidden_explication' => 'Un champ pré-rempli que l\'utilisateur ne pourra pas voir.',
+       'saisie_hidden_explication' => 'Un champ pré-rempli que lutilisateur ne pourra pas voir.',
        'saisie_hidden_titre' => 'Champ caché',
        'saisie_input_explication' => 'Une simple ligne de texte, pouvant être visible ou masquée (mot de passe).',
        'saisie_input_titre' => 'Ligne de texte',
-       'saisie_oui_non_explication' => 'Oui ou non, c\'est clair ? :)',
+       'saisie_oui_non_explication' => 'Oui ou non, c’est clair ? :)',
        'saisie_oui_non_titre' => 'Oui ou non',
        'saisie_radio_defaut_choix1' => 'Un',
        'saisie_radio_defaut_choix2' => 'Deux',
        'saisie_radio_defaut_choix3' => 'Trois',
        'saisie_radio_explication' => 'Permet de choisir une option parmis plusieurs disponibles.',
        'saisie_radio_titre' => 'Boutons radios',
-       'saisie_selecteur_article' => 'Affiche un navigateur de sélection d\'article',
-       'saisie_selecteur_article_titre' => 'Sélecteur d\'article',
+       'saisie_selecteur_article' => 'Affiche un navigateur de sélection darticle',
+       'saisie_selecteur_article_titre' => 'Sélecteur darticle',
        'saisie_selecteur_rubrique' => 'Affiche un navigateur de sélection de rubrique',
-       'saisie_selecteur_rubrique_article' => 'Affiche un navigateur de sélection d\'article ou de rubrique',
-       'saisie_selecteur_rubrique_article_titre' => 'Sélecteur d\'article ou rubrique',
+       'saisie_selecteur_rubrique_article' => 'Affiche un navigateur de sélection darticle ou de rubrique',
+       'saisie_selecteur_rubrique_article_titre' => 'Sélecteur darticle ou rubrique',
        'saisie_selecteur_rubrique_titre' => 'Sélecteur de rubrique',
        'saisie_selection_explication' => 'Choisir une option dans une liste déroulante.',
        'saisie_selection_multiple_explication' => 'Permet de choisir plusieurs options avec une liste.',
@@ -168,7 +178,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // T
        'tous_visiteurs' => 'Tous les visiteurs (même non enregistrés)',
-       'tout_selectionner' => 'Tout sélectionner', # NEW
+       'tout_selectionner' => 'Tout sélectionner',
 
        // V
        'vue_sans_reponse' => '<i>Sans réponse</i>',
index 81f69d5..de77118 100644 (file)
@@ -8,7 +8,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // B
-       'bouton_parcourir_docs_article' => 'Sfoglia l\'articolo',
+       'bouton_parcourir_docs_article' => 'Sfoglia larticolo',
        'bouton_parcourir_docs_breve' => 'Sfoglia la breve',
        'bouton_parcourir_docs_rubrique' => 'Sfoglia la rubrica',
        'bouton_parcourir_mediatheque' => 'Sfoglia la mediateca',
@@ -23,7 +23,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'construire_ajouter_champ' => 'Aggiungi un campo',
        'construire_attention_enregistrer' => 'Non dimenticare di salvare le tue modifiche!',
        'construire_attention_modifie' => 'Il modulo in oggetto è diverso dal modulo iniziale. Hai la possibilità di reinizializzare il suo stato a quello precedente alle modifiche.',
-       'construire_attention_supprime' => 'Le modifiche includono l\'eliminazione di alcuni campi. Conferma il salvataggio di questa nuova versione del modulo.',
+       'construire_attention_supprime' => 'Le modifiche includono leliminazione di alcuni campi. Conferma il salvataggio di questa nuova versione del modulo.',
        'construire_aucun_champs' => 'Al momento non è presente alcun campo in questo modulo.',
        'construire_confirmer_supprimer_champ' => 'Vuoi veramente eliminare questo campo?',
        'construire_info_nb_champs_masques' => '@nb@ campo(i) con maschera. Configura il gruppo.',
@@ -38,7 +38,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // E
        'erreur_generique' => 'Ci sono degli errori nei campi di seguito, si prega di verificare gli inserimenti',
-       'erreur_option_nom_unique' => 'Questo nome è già utilizzato da un altro campo e deve essere univoco all\'interno del modulo.',
+       'erreur_option_nom_unique' => 'Questo nome è già utilizzato da un altro campo e deve essere univoco allinterno del modulo.',
 
        // I
        'info_configurer_saisies' => 'Pagina di test di Saisies',
@@ -49,11 +49,11 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'label_mois' => 'Mese',
 
        // O
-       'option_aff_art_interface_explication' => 'Mostra unicamente gli articoli della lingua dell\'utente',
+       'option_aff_art_interface_explication' => 'Mostra unicamente gli articoli della lingua dellutente',
        'option_aff_art_interface_label' => 'Visualizzazione multilingua',
-       'option_aff_langue_explication' => 'Mostra la lingua dell\'articolo o della rubrica selezionata davanti al titolo',
+       'option_aff_langue_explication' => 'Mostra la lingua dellarticolo o della rubrica selezionata davanti al titolo',
        'option_aff_langue_label' => 'Mostra la lingua',
-       'option_aff_rub_interface_explication' => 'Mostra unicamente le rubriche della lingua dell\'utente',
+       'option_aff_rub_interface_explication' => 'Mostra unicamente le rubriche della lingua dellutente',
        'option_aff_rub_interface_label' => 'Visualizzazione multilingua',
        'option_attention_explication' => 'Un messaggio più importante dei una spiegazione.',
        'option_attention_label' => 'Avvertimento',
@@ -63,31 +63,25 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_autocomplete_off' => 'Disattiva',
        'option_autocomplete_on' => 'Attiva',
        'option_cacher_option_intro_label' => 'Nascondi la prima scelta vuota',
-       'option_choix_destinataires_explication' => 'Uno o più autori tra i quali l\'utente potrà fare una scelta. Se non si seleziona niente, è l\'autore che ha installato il sito che sarà scelto.',
+       'option_choix_destinataires_explication' => 'Uno o più autori tra i quali l’utente potrà fare una scelta. Se non si seleziona niente, è l’autore che ha installato il sito che sarà scelto.',
        'option_choix_destinataires_label' => 'Possibili destinatari',
        'option_class_label' => 'Classi CSS supplementari',
        'option_cols_explication' => 'Larghezza del blocco in numero di caratteri. Questa opzione non è sempre applicata poichè gli stili CSS la possono annullare.',
        'option_cols_label' => 'Larghezza',
-       'option_datas_explication' => 'Indica una scelta per riga con il formato "chiave|Etichetta della scelta"',
+       'option_datas_explication' => 'Indica una scelta per riga con il formato "chiave|Etichetta della scelta"', # MODIF
        'option_datas_label' => 'Elenco delle scelte possibili',
        'option_defaut_label' => 'Valore predefinito',
-       'option_disable_avec_post_explication' => 'Identica all\'opzione precedente ma invia lo stesso il valore in un campo nascosto.',
+       'option_disable_avec_post_explication' => 'Identica allopzione precedente ma invia lo stesso il valore in un campo nascosto.',
        'option_disable_avec_post_label' => 'Disattiva ma invia',
        'option_disable_explication' => 'Il campo non può ottenere il focus.',
        'option_disable_label' => 'Disattiva il campo',
-       'option_erreur_obligatoire_explication' => 'Vous pouvez personnaliser le message d\'erreur affiché pour indiquer l\'obligation (sinon laisser vide).', # NEW
-       'option_erreur_obligatoire_label' => 'Message d\'obligation', # NEW
        'option_explication_explication' => 'Se necessario, una frase breve che descrive il campo.',
        'option_explication_label' => 'Spiegazione',
        'option_groupe_affichage' => 'Visualizzazione',
        'option_groupe_description' => 'Descrizione',
        'option_groupe_utilisation' => 'Utilizzazione',
        'option_groupe_validation' => 'Validazione',
-       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
-       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
-       'option_horaire_label' => 'Horaire', # NEW
-       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
-       'option_info_obligatoire_explication' => 'Puoi modificare l\'indicazione predefinita per i campi obbligatori : <i>[Obbligatorio]</i>.',
+       'option_info_obligatoire_explication' => 'Puoi modificare l’indicazione predefinita per i campi obbligatori : <i>[Obbligatorio]</i>.',
        'option_info_obligatoire_label' => 'Indicazione obbligatorio',
        'option_inserer_barre_choix_edition' => 'barra del testo completa',
        'option_inserer_barre_choix_forum' => 'barra dei forum',
@@ -96,9 +90,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_label_case_label' => 'Etichetta a lato della casella',
        'option_label_explication' => 'Il titolo che sarà mostrato.',
        'option_label_label' => 'Etichetta',
-       'option_maxlength_explication' => 'L\'utente non può digiatare più caratteri del numero qui indicato.',
+       'option_maxlength_explication' => 'Lutente non può digiatare più caratteri del numero qui indicato.',
        'option_maxlength_label' => 'Numero massimo di caratteri',
-       'option_multiple_explication' => 'L\'utente può selezionare più valori',
+       'option_multiple_explication' => 'Lutente può selezionare più valori',
        'option_multiple_label' => 'Scelta multipla',
        'option_nom_explication' => 'Un nome informatico che indentifica il campo. Deve contentere solo caratteri alfanumerici minuscoli o il carattere "_".',
        'option_nom_label' => 'Nome del campo',
@@ -117,12 +111,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_rows_label' => 'Numero di righe',
        'option_size_explication' => 'Larghezza del campo in numero di caratteri. Questa opzione non è sempre applicata poich%egrave; gli stili CSS del sito potrebbero annullarla.',
        'option_size_label' => 'Dimensione del campo',
-       'option_type_choix_plusieurs' => 'Consenti all\'utente di scegliere <strong>più</strong> destinatari.',
-       'option_type_choix_tous' => 'Imposta <strong>tutti</strong> questi autori come destinatari. L\'utente non avrà alcuna scelta.',
-       'option_type_choix_un' => 'Consenti all\'utente di scegliere <strong>un solo</strong> destinatario.',
+       'option_type_choix_plusieurs' => 'Consenti allutente di scegliere <strong>più</strong> destinatari.',
+       'option_type_choix_tous' => 'Imposta <strong>tutti</strong> questi autori come destinatari. Lutente non avrà alcuna scelta.',
+       'option_type_choix_un' => 'Consenti all’utente di scegliere <strong>un solo</strong> destinatario.', # MODIF
        'option_type_explication' => 'In modalità "mascherata", il contenuto del campo non sarà visibile.',
        'option_type_label' => 'Tipo del campo',
-       'option_type_password' => 'Mascherato',
+       'option_type_password' => 'Mascherato', # MODIF
        'option_type_text' => 'Normale',
 
        // S
@@ -132,7 +126,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_case_titre' => 'Casella di spunta',
        'saisie_checkbox_explication' => 'Consente di scegliere più opzioni da spuntare.',
        'saisie_checkbox_titre' => 'Caselle di spunta',
-       'saisie_date_explication' => 'Consente di inserire una data con l\'aiuto di un calendario',
+       'saisie_date_explication' => 'Consente di inserire una data con laiuto di un calendario',
        'saisie_date_titre' => 'Data',
        'saisie_destinataires_explication' => 'Consente di scegliere uno o più destinatari tra gli autore selezionati.',
        'saisie_destinataires_titre' => 'Destinatari',
@@ -142,7 +136,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_fieldset_titre' => 'Gruppo di campi',
        'saisie_file_explication' => 'Invio di un file',
        'saisie_file_titre' => 'File',
-       'saisie_hidden_explication' => 'Un campo preimpostato che l\'utente non potrà vedere.',
+       'saisie_hidden_explication' => 'Un campo preimpostato che lutente non potrà vedere.',
        'saisie_hidden_titre' => 'Campo nascosto',
        'saisie_input_explication' => 'Una semplice riga di testo, che può essere visibile o mascherata (password).',
        'saisie_input_titre' => 'Riga di testo',
@@ -151,13 +145,13 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_radio_defaut_choix1' => 'Uno',
        'saisie_radio_defaut_choix2' => 'Due',
        'saisie_radio_defaut_choix3' => 'Tre',
-       'saisie_radio_explication' => 'Consente di scegliere un\'opzione tra più disponibili.',
+       'saisie_radio_explication' => 'Consente di scegliere unopzione tra più disponibili.',
        'saisie_radio_titre' => 'Scelta unica',
        'saisie_selecteur_article' => 'Mostra un navigatore per la selezione di un articolo',
-       'saisie_selecteur_article_titre' => 'Selettore d\'articolo',
+       'saisie_selecteur_article_titre' => 'Selettore darticolo',
        'saisie_selecteur_rubrique' => 'Mostra un navigatore per la selezione di una rubrica',
        'saisie_selecteur_rubrique_article' => 'Mostra un navigatore per la selezione di un articolo o di una rubrica',
-       'saisie_selecteur_rubrique_article_titre' => 'Selettore d\'articolo o rubrica',
+       'saisie_selecteur_rubrique_article_titre' => 'Selettore darticolo o rubrica',
        'saisie_selecteur_rubrique_titre' => 'Selettore di rubrica',
        'saisie_selection_explication' => 'Scegli una opzione nel menu a tendina.',
        'saisie_selection_multiple_explication' => 'Consente di scegliere più opzioni con un elenco.',
@@ -168,7 +162,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // T
        'tous_visiteurs' => 'Tutti gli utenti (anche non registrati)',
-       'tout_selectionner' => 'Tout sélectionner', # NEW
 
        // V
        'vue_sans_reponse' => '<i>Senza risposta</i>',
diff --git a/www/plugins/saisies/lang/saisies_nl.php b/www/plugins/saisies/lang/saisies_nl.php
new file mode 100644 (file)
index 0000000..b5cb162
--- /dev/null
@@ -0,0 +1,190 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/saisies?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // B
+       'bouton_parcourir_docs_article' => 'Blader door het artikel',
+       'bouton_parcourir_docs_breve' => 'Blader door het nieuwsbericht',
+       'bouton_parcourir_docs_rubrique' => 'Blader door de rubriek',
+       'bouton_parcourir_mediatheque' => 'Blader door de mediatheek',
+
+       // C
+       'construire_action_annuler' => 'Annuleren',
+       'construire_action_configurer' => 'Instellen',
+       'construire_action_deplacer' => 'Verplaats',
+       'construire_action_dupliquer' => 'Kopieer',
+       'construire_action_dupliquer_copie' => '(copy)',
+       'construire_action_supprimer' => 'Verwijder',
+       'construire_ajouter_champ' => 'Voeg veld toe',
+       'construire_attention_enregistrer' => 'Sla je wijzingen op!',
+       'construire_attention_modifie' => 'Het onderstaande formulier wijkt van het oorspronkelijke af. Je kunt het naar de oorspronkelijke staat herstellen.',
+       'construire_attention_supprime' => 'Je wijzigingen bevatten verwijderingen van velden. Bevestig de nieuwe formulierversie.',
+       'construire_aucun_champs' => 'Dit formulier heeft geen velden.',
+       'construire_confirmer_supprimer_champ' => 'Wil je dit veld echt verwijderen?',
+       'construire_info_nb_champs_masques' => '@nb@ verborgen veld(en) bij het opzetten van de groep.',
+       'construire_position_explication' => 'Geef aan voor welk veld dit veld moet worden geplaatst.',
+       'construire_position_fin_formulaire' => 'Aan het eind van het formulier',
+       'construire_position_fin_groupe' => 'Aan het eind van groep @groupe@',
+       'construire_position_label' => 'Positie van het veld',
+       'construire_reinitialiser' => 'Formulier resetten',
+       'construire_reinitialiser_confirmer' => 'Je verliest alle aanpassingen. Weet je zeker dat je naar het originele formulier terug wilt?',
+       'construire_verifications_aucune' => 'Geen',
+       'construire_verifications_label' => 'Toe te passen verificatie',
+
+       // E
+       'erreur_generique' => 'Er zitten fouten in onderstaande velden. Controleer je invoer',
+       'erreur_option_nom_unique' => 'Deze naam wordt al door een ander veld gebruikt. Het moet binnen het formulier een unieke naam hebben.',
+
+       // I
+       'info_configurer_saisies' => 'Testbladzijde voor invoer',
+
+       // L
+       'label_annee' => 'Jaar',
+       'label_jour' => 'Dag',
+       'label_mois' => 'Maand',
+
+       // O
+       'option_aff_art_interface_explication' => 'Toon uitsluitend artikelen in de gebruikerstaal',
+       'option_aff_art_interface_label' => 'Meertalige display',
+       'option_aff_langue_explication' => 'Toon de gekozen taal voor de titel van het artikel of de rubriek',
+       'option_aff_langue_label' => 'Toon d etaal',
+       'option_aff_rub_interface_explication' => 'Toon alleen rubrieken in de gebruikerstaal',
+       'option_aff_rub_interface_label' => 'Meertalige display',
+       'option_afficher_si_explication' => 'Geef de voorwaarde op voor het vertonen van het veld in functie van de waarde van andere velden. De identificatie van de andere velden moet tussen <code>@</code> worden geplaatst. <br />Bijvoorbeeld <code>@selection_1@=="Toto"</code> geeft de voorwaarde aan dat het veld moet worden getoond wanneer veld <code>selection_1</code> de waarde <code>Toto</code> heeft.',
+       'option_afficher_si_label' => 'Tonen onder voorwaarde',
+       'option_afficher_si_remplissage_explication' => 'In tegenstelling met de vorige optie verschijnt deze wanneer het formulier wordt getoond en niet wanneer de resultaten worden getoond. De syntax is dezelfde.',
+       'option_afficher_si_remplissage_label' => 'Tonen indien ingevuld',
+       'option_attention_explication' => 'Een boodschap die belangrijker is dan de uitleg.',
+       'option_attention_label' => 'Waarschuwing',
+       'option_autocomplete_defaut' => 'Neem de standaardwaarde',
+       'option_autocomplete_explication' => 'Bij het laden kan de webbrowser de velden met historische informatie vullen',
+       'option_autocomplete_label' => 'Vul de velden vooraf in',
+       'option_autocomplete_off' => 'Niet',
+       'option_autocomplete_on' => 'Wel',
+       'option_cacher_option_intro_label' => 'Verberg de eerste lege keuze',
+       'option_choix_alternatif_label' => 'Toelaten een andere keuze voor te stellen',
+       'option_choix_alternatif_label_defaut' => 'Andere keuze',
+       'option_choix_alternatif_label_label' => 'Label voor deze alternatieve keuze',
+       'option_choix_destinataires_explication' => 'Een of meer auteurs waaruit de gebruiker kan kiezen. Standaard wordt de auteur die de site maakte gekozen.',
+       'option_choix_destinataires_label' => 'Mogelijke ontvangers',
+       'option_class_label' => 'Extra CSS Classes',
+       'option_cols_explication' => 'Veldbreedte in tekens. Deze optie kan door CSS overschreven worden.',
+       'option_cols_label' => 'Breedte',
+       'option_datas_explication' => 'Je moet voor elke rij in het formulier een keuze opgeven in het formaat "key|label of the choice"',
+       'option_datas_label' => 'Lijst van mogelijke keuzes',
+       'option_datas_sous_groupe_explication' => 'Je moet per regel een keuze aangeven in de vorm van "sleutel|Label" van de keuze. <br />Je kunt het begin van een subgroep aangeven met "*Titel van de subgroep". Om een subgroep af te sluiten kun je een nieuwe beginnen of een regel met uitsluitend "/*" invoegen.',
+       'option_defaut_label' => 'Standaardwaarde',
+       'option_disable_avec_post_explication' => 'Als de vorige optie maar de waarde gaat in een verborgen veld.',
+       'option_disable_avec_post_label' => 'Geblokkeerd maar gepost.',
+       'option_disable_explication' => 'Dit veld kan geen focus krijgen.',
+       'option_disable_label' => 'Blokkeer het veld',
+       'option_erreur_obligatoire_explication' => 'Hier kun je de standaard tekst voor een foutboodschap ivm verplichte invoer instellen (anders leeglaten).',
+       'option_erreur_obligatoire_label' => 'Bericht verplicht veld',
+       'option_explication_explication' => 'Indien nodig, een korte omschrijving van het betroffen veld.',
+       'option_explication_label' => 'Uitleg',
+       'option_groupe_affichage' => 'Tonen',
+       'option_groupe_description' => 'Omschrijving',
+       'option_groupe_utilisation' => 'Gebruik',
+       'option_groupe_validation' => 'Validatie',
+       'option_heure_pas_explication' => 'Een hulpmenu laat je het tijdstip in een uurrooster kiezen. Je kunt hier de tijdinterval tussen twee tijdstippen instellen (standaard 30 min).',
+       'option_heure_pas_label' => 'Interval in minuten in het hulpmenu',
+       'option_horaire_label' => 'Uurrooster',
+       'option_horaire_label_case' => 'Ook het uurrooster opnemen',
+       'option_info_obligatoire_explication' => 'Je kan de standaard indicatie aanpassen van verplichting: <i>[Obligatoire]</i>.',
+       'option_info_obligatoire_label' => 'Indicatie verplichting',
+       'option_inserer_barre_choix_edition' => 'edit toolbar compleet',
+       'option_inserer_barre_choix_forum' => 'forum toolbar',
+       'option_inserer_barre_explication' => 'Voeg een porte-plume toolbar toe indien geactiveerd.',
+       'option_inserer_barre_label' => 'Voeg een toolbar toe',
+       'option_label_case_label' => 'Label staat naast de checkbox',
+       'option_label_explication' => 'De titel die zal worden weergegeven.',
+       'option_label_label' => 'Label',
+       'option_maxlength_explication' => 'De gebruikers kan niet meer tekens invoeren dan dit aantal.',
+       'option_maxlength_label' => 'Maximum aantal tekens',
+       'option_multiple_explication' => 'De gebruiker kan meerdere waardes kiezen',
+       'option_multiple_label' => 'Meerdere keuzes',
+       'option_nom_explication' => 'Een ID-naam dat het veld identificeert. Het mag bestaan uit kleine letters of een underscore teken "_".',
+       'option_nom_label' => 'Veldnaam',
+       'option_obligatoire_label' => 'Verplicht veld',
+       'option_option_destinataire_intro_label' => 'Label voor de eerste lege keuze (wanneer in lijstvorm)',
+       'option_option_intro_label' => 'Label voor de eerste lege keuze',
+       'option_option_statut_label' => 'Toon de status',
+       'option_pliable_label' => 'Uitvouwbaar',
+       'option_pliable_label_case' => 'De group velden kan worden uit- en ingevouwen.',
+       'option_plie_label' => 'Al ingevouwen',
+       'option_plie_label_case' => 'Als de groep kan worden in- en uitgevouwen, zorgt deze optie ervoor dat hij zal zijn ingevouwen wanneer het formulier wordt getoond.',
+       'option_previsualisation_explication' => 'Wanneer porte-plume actief is, wordt een preview tab toegevoegd.',
+       'option_previsualisation_label' => 'Preview activeren',
+       'option_readonly_explication' => 'Het veld kan worden bekeken, geselecteerd, maar niet worden aangepast.',
+       'option_readonly_label' => 'Alleen lezen',
+       'option_rows_explication' => 'Veldhoogte in regels. Deze optie kan door CSS worden overschreven.',
+       'option_rows_label' => 'Aantal regels',
+       'option_size_explication' => 'Veldbreedte in tekens. Deze optie kan door CSS worden overschreven.',
+       'option_size_label' => 'Veldbreedte',
+       'option_type_choix_plusieurs' => 'Laat de gebruiker <strong>meerdere</ strong> ontvangers kiezen.',
+       'option_type_choix_tous' => 'Maak <strong>alle</ strong> auteurs ontvanger. De gebruiker kan niet kiezen.',
+       'option_type_choix_un' => 'Laat de gebruiker <strong>een enkele</strong> ontvanger kiezen.',
+       'option_type_choix_un_radio' => 'Sta de gebruiker toe <strong>een enkele</strong> geadresseerde te kiezen (door middel van een lijst).',
+       'option_type_explication' => 'In "discrete" modus wordt de inhoud door sterretjes vervangen.',
+       'option_type_label' => 'Veldtype',
+       'option_type_password' => 'Verborgen tekst tijdens invoer (bv: wachtwoord)',
+       'option_type_text' => 'Normaal',
+
+       // S
+       'saisie_auteurs_explication' => 'Laat je een of meer auteurs kiezen',
+       'saisie_auteurs_titre' => 'Auteurs',
+       'saisie_case_explication' => 'Activeer of disactiveer een bepaalde optie.',
+       'saisie_case_titre' => 'Enkele checkbox',
+       'saisie_checkbox_explication' => 'Voor het kiezen van verschillende opties met checkboxes.',
+       'saisie_checkbox_titre' => 'Checkboxes',
+       'saisie_date_explication' => 'Datuminvoer via een kalender-tool',
+       'saisie_date_titre' => 'Datum',
+       'saisie_destinataires_explication' => 'Voor het kiezen van een of meer ontvangers uit voorgeselecteerde auteurs.',
+       'saisie_destinataires_titre' => 'Ontvangers',
+       'saisie_explication_explication' => 'Een algemene omschrijving.',
+       'saisie_explication_titre' => 'Uitleg',
+       'saisie_fieldset_explication' => 'Een kader dat meerdere velden kan bevatten.',
+       'saisie_fieldset_titre' => 'Fieldset',
+       'saisie_file_explication' => 'Zend een bestand',
+       'saisie_file_titre' => 'Bestand',
+       'saisie_hidden_explication' => 'Een vooraf ingevuld veld dat de gebruiker niet ziet.',
+       'saisie_hidden_titre' => 'Verborgen veld',
+       'saisie_input_explication' => 'Een enkele tekstregel die zichtbaar of verborgen (wachtwoord) kan zijn.',
+       'saisie_input_titre' => 'Tekstveld',
+       'saisie_oui_non_explication' => 'Ja of nee antwoord',
+       'saisie_oui_non_titre' => 'Ja of Nee',
+       'saisie_radio_defaut_choix1' => 'Een',
+       'saisie_radio_defaut_choix2' => 'Twee',
+       'saisie_radio_defaut_choix3' => 'Drie',
+       'saisie_radio_explication' => 'Voor het kiezen van een enkele optie uit meerder mogelijkheden.',
+       'saisie_radio_titre' => 'Radio knop',
+       'saisie_selecteur_article' => 'Toon een artikelkeuze',
+       'saisie_selecteur_article_titre' => 'Artikelkeuze',
+       'saisie_selecteur_rubrique' => 'Toon een rubriekkeuze',
+       'saisie_selecteur_rubrique_article' => 'Toon een artikel- of rubriekkeuze',
+       'saisie_selecteur_rubrique_article_titre' => 'Artikel- of rubriekkeuze',
+       'saisie_selecteur_rubrique_titre' => 'Rubriekkeuze',
+       'saisie_selection_explication' => 'Kies een waarde uit een dropdown list box.',
+       'saisie_selection_multiple_explication' => 'Voor het keizen van meerder waardes uit een lijst.',
+       'saisie_selection_multiple_titre' => 'Meerkeuze',
+       'saisie_selection_titre' => 'Dropdown listbox',
+       'saisie_textarea_explication' => 'Een tekstveld meet meerder regels.',
+       'saisie_textarea_titre' => 'Textarea',
+
+       // T
+       'tous_visiteurs' => 'Alle bezoekers (ook niet-geregistreerde)',
+       'tout_selectionner' => 'Alles kiezen',
+
+       // V
+       'vue_sans_reponse' => '<i>Zonder antwoord</i>',
+
+       // Z
+       'z' => 'zzz'
+);
+
+?>
index 7778323..e1634f0 100644 (file)
@@ -8,40 +8,40 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 $GLOBALS[$GLOBALS['idx_lang']] = array(
 
        // B
-       'bouton_parcourir_docs_article' => 'Посмотреть статью',
-       'bouton_parcourir_docs_breve' => 'Посмотреть новость',
-       'bouton_parcourir_docs_rubrique' => 'Посмотреть раздел',
-       'bouton_parcourir_mediatheque' => 'Изменить библиотеку мультимедиа',
+       'bouton_parcourir_docs_article' => 'Посмотреть статью', # MODIF
+       'bouton_parcourir_docs_breve' => 'Посмотреть новость', # MODIF
+       'bouton_parcourir_docs_rubrique' => 'Посмотреть раздел', # MODIF
+       'bouton_parcourir_mediatheque' => 'Изменить библиотеку мультимедиа', # MODIF
 
        // C
        'construire_action_annuler' => 'Отменить',
        'construire_action_configurer' => 'Настройки',
        'construire_action_deplacer' => 'Переместить',
-       'construire_action_dupliquer' => 'СделаÑ\82Ñ\8c ÐºÐ¾Ð¿Ð¸Ñ\8e',
+       'construire_action_dupliquer' => 'СкопиÑ\80оваÑ\82Ñ\8c',
        'construire_action_dupliquer_copie' => '(копия)',
        'construire_action_supprimer' => 'Удалить',
        'construire_ajouter_champ' => 'Добавить поле',
-       'construire_attention_enregistrer' => 'Ð\9dе Ð·Ð°Ð±Ñ\83дÑ\8cÑ\82е Ñ\81оÑ\85Ñ\80аниÑ\82Ñ\8c Ð²Ð½ÐµÑ\81еннÑ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f!',
-       'construire_attention_modifie' => 'На этой странице у вас есть возможность редактировать форму. Для того, чтобы вернуться к списку выбора форм, нажмите на кнопку ниже',
-       'construire_attention_supprime' => 'Изменения включают удаление полей. Пожалуйста, подтвердите регистрацию новой формы.',
-       'construire_aucun_champs' => 'На данный момент поля в форме отсутствуют',
-       'construire_confirmer_supprimer_champ' => 'Вы действительно хотите удалить это поле??',
-       'construire_info_nb_champs_masques' => '@nb@ скрытых полей',
-       'construire_position_explication' => 'Ð\9dа ÐºÐ°ÐºÐ¾Ðµ Ð¿Ð¾Ð»Ðµ Ð·Ð°Ð¼ÐµÐ½Ð¸ть?',
-       'construire_position_fin_formulaire' => 'В конце формы',
-       'construire_position_fin_groupe' => 'Ð\92 ÐºÐ¾Ð½Ñ\86е группы @groupe@',
-       'construire_position_label' => 'Ð\97амена Ð¿Ð¾Ð»Ñ\8f',
-       'construire_reinitialiser' => 'Ð\92еÑ\80нÑ\83Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð°Ð·Ð°Ð´',
-       'construire_reinitialiser_confirmer' => 'Ð\92Ñ\8b Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\82елÑ\8cно Ñ\85оÑ\82иÑ\82е Ð²ÐµÑ\80нÑ\83Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð°Ð·Ð°Ð´?',
-       'construire_verifications_aucune' => 'Ð\9dе Ð¿Ñ\80овеÑ\80Ñ\8fÑ\82Ñ\8c',
+       'construire_attention_enregistrer' => 'Ð\9eбÑ\8fзаÑ\82елÑ\8cно Ð½Ð°Ð¶Ð¼Ð¸Ñ\82е ÐºÐ½Ð¾Ð¿ÐºÑ\83 Ð¡Ð\9eХРÐ\90Ð\9dÐ\98ТЬ, ÐµÑ\81ли Ð²Ñ\8b Ñ\87Ñ\82о Ñ\82о Ð¸Ð·Ð¼ÐµÐ½Ñ\8fли!',
+       'construire_attention_modifie' => 'На этой странице у вас есть возможность редактировать форму. Для того, чтобы вернуться к списку выбора форм, нажмите на кнопку ниже', # MODIF
+       'construire_attention_supprime' => 'Изменения включают удаление полей. Пожалуйста, подтвердите регистрацию новой формы.', # MODIF
+       'construire_aucun_champs' => 'На данный момент поля в форме отсутствуют', # MODIF
+       'construire_confirmer_supprimer_champ' => 'Вы действительно хотите удалить это поле?',
+       'construire_info_nb_champs_masques' => '@nb@ скрытых полей', # MODIF
+       'construire_position_explication' => 'Ð\9dа Ð¼ÐµÑ\81Ñ\82е ÐºÐ°ÐºÐ¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ\8f Ð¿Ð¾ÐºÐ°Ð·Ñ\8bвать?',
+       'construire_position_fin_formulaire' => 'В самом конце',
+       'construire_position_fin_groupe' => 'Ð\9fоÑ\81ле группы @groupe@',
+       'construire_position_label' => 'РаÑ\81положение',
+       'construire_reinitialiser' => 'Ð\9eÑ\82мениÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f',
+       'construire_reinitialiser_confirmer' => 'Ð\92Ñ\8b Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\82елÑ\8cно Ñ\85оÑ\82иÑ\82е Ð¾Ñ\82мениÑ\82Ñ\8c Ð²Ñ\81е Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f',
+       'construire_verifications_aucune' => 'Ð\9dе Ð²Ñ\8bполнÑ\8fÑ\82Ñ\8c Ð¿Ñ\80овеÑ\80кÑ\83',
        'construire_verifications_label' => 'Тип проверки',
 
        // E
-       'erreur_generique' => 'Вы допустили ошибку! Проверьте введенную Вами информацию.',
+       'erreur_generique' => 'Вы допустили ошибку при заполнении полей формы. Проверьте корректность введенной информации',
        'erreur_option_nom_unique' => 'Такое название поля уже используется.',
 
        // I
-       'info_configurer_saisies' => 'Тестовая страница формы',
+       'info_configurer_saisies' => 'Тестовая страница формы', # MODIF
 
        // L
        'label_annee' => 'Год',
@@ -49,85 +49,81 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'label_mois' => 'Месяц',
 
        // O
-       'option_aff_art_interface_explication' => 'Отображать только статьи в настройках языка пользователя',
-       'option_aff_art_interface_label' => 'Многоязычное отображение',
-       'option_aff_langue_explication' => 'Показать выбранный язык статьи или раздела перед названием',
-       'option_aff_langue_label' => 'Ð\9fоказаÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ий Ñ\8fзÑ\8bк',
-       'option_aff_rub_interface_explication' => 'Отображать только разделы в языковых настройках пользователя.',
-       'option_aff_rub_interface_label' => 'Многоязычное отображение',
-       'option_attention_explication' => 'Сообщение, которое является более важным нежели комментарий.',
-       'option_attention_label' => 'Ð\9fÑ\80имеÑ\87ание!',
-       'option_autocomplete_defaut' => 'Ð\9fо умолчанию',
-       'option_autocomplete_explication' => 'При загрузке страницы браузер может предварительно заполнить поля на основании истории',
+       'option_aff_art_interface_explication' => 'Отображать только статьи в настройках языка пользователя', # MODIF
+       'option_aff_art_interface_label' => 'Многоязычное отображение', # MODIF
+       'option_aff_langue_explication' => 'Показать выбранный язык статьи или раздела перед названием', # MODIF
+       'option_aff_langue_label' => 'Ð\92Ñ\8bвод Ñ\8fзÑ\8bка Ñ\81Ñ\82аÑ\82Ñ\8cи',
+       'option_aff_rub_interface_explication' => 'Отображать только разделы в языковых настройках пользователя.', # MODIF
+       'option_aff_rub_interface_label' => 'Многоязычное отображение', # MODIF
+       'option_attention_explication' => 'Сообщение, которое является более важным нежели комментарий.', # MODIF
+       'option_attention_label' => 'Ð\9fÑ\80едÑ\83пÑ\80еждение',
+       'option_autocomplete_defaut' => 'Ð\9eÑ\81Ñ\82авиÑ\82Ñ\8c Ð¿о умолчанию',
+       'option_autocomplete_explication' => 'При загрузке страницы браузер может предварительно заполнить поля на основании истории', # MODIF
        'option_autocomplete_label' => 'Предварительное заполнение поля',
        'option_autocomplete_off' => 'Отключить',
        'option_autocomplete_on' => 'Включить',
-       'option_cacher_option_intro_label' => 'Не отображать первый пустой вариант',
-       'option_choix_destinataires_explication' => 'Один или несколько авторов, среди которых пользователь может сделать свой ​​выбор. Если ничего не выбрано, то то будет выбран автор, который сейчас на сайте.',
-       'option_choix_destinataires_label' => 'Возможные получатели',
+       'option_cacher_option_intro_label' => 'Не отображать первый пустой вариант', # MODIF
+       'option_choix_destinataires_explication' => 'Один или несколько авторов, среди которых пользователь может сделать свой ​​выбор. Если ничего не выбрано, то то будет выбран автор, который сейчас на сайте.', # MODIF
+       'option_choix_destinataires_label' => 'Возможные получатели', # MODIF
        'option_class_label' => 'Дополнительные CSS классы',
-       'option_cols_explication' => 'Ð\94лина Ð¿Ð¾Ð»Ñ\8f Ð² Ñ\81имволаÑ\85. Ð¡ Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e CSS Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ Ð¿ÐµÑ\80еопÑ\80еделиÑ\82Ñ\8c Ð·Ð½Ð°Ñ\87ение Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ\8f.',
+       'option_cols_explication' => 'Ð\94лина Ð¿Ð¾Ð»Ñ\8f Ð² Ñ\81имволаÑ\85. Ð­Ñ\82а Ð¾Ð¿Ñ\86иÑ\8f Ð½Ðµ Ð²Ñ\81егда Ñ\80абоÑ\82аеÑ\82, Ñ\82ак CSS Ñ\81Ñ\82или Ñ\81айÑ\82а Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð¾Ñ\82менÑ\8fÑ\82Ñ\8c Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ Ð·Ð½Ð°Ñ\87ение.',
        'option_cols_label' => 'Ширина',
-       'option_datas_explication' => 'УкажиÑ\82е Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ\8bе Ð²Ð°Ñ\80ианÑ\82Ñ\8b Ð² Ñ\84оÑ\80маÑ\82е: ÐºÐ»Ñ\8eÑ\87|ваÑ\80ианÑ\82',
-       'option_datas_label' => 'СпиÑ\81ок Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ\8bÑ\85 Ð²Ð°Ñ\80ианÑ\82ов',
+       'option_datas_explication' => 'Ð\97адайÑ\82е Ñ\8dлеменÑ\82Ñ\8b Ñ\81пиÑ\81ка Ð²  Ñ\84оÑ\80маÑ\82е: ÐºÐ»Ñ\8eÑ\87|название Ð¾Ð¿Ñ\86ии',
+       'option_datas_label' => 'Ð\97наÑ\87ениÑ\8f Ñ\81пиÑ\81ка',
        'option_defaut_label' => 'Выводить по умолчанию',
-       'option_disable_avec_post_explication' => 'Такой же вариант как и предыдущий, но вносит значение в скрытое поле.',
-       'option_disable_avec_post_label' => 'Отключено, но опубликовано.',
+       'option_disable_avec_post_explication' => 'Такой же вариант как и предыдущий, но вносит значение в скрытое поле.', # MODIF
+       'option_disable_avec_post_label' => 'Отключено, но опубликовано.', # MODIF
        'option_disable_explication' => 'Поле не может получить фокус',
-       'option_disable_label' => 'Сделать поле неактивным',
-       'option_erreur_obligatoire_explication' => 'Настройте сообщения об ошибке для обязательных полей (в противном случае - оставьте пустым) ',
-       'option_erreur_obligatoire_label' => 'Обязательное сообщение',
-       'option_explication_explication' => 'Краткое описание (по необходимости)',
-       'option_explication_label' => 'Комментарий',
-       'option_groupe_affichage' => 'Показать',
-       'option_groupe_description' => 'Описание',
-       'option_groupe_utilisation' => 'Использование',
-       'option_groupe_validation' => 'Валидация',
-       'option_heure_pas_explication' => 'Lorsque vous utilisez l’horaire, un menu s’affiche pour aider à saisir heures et minutes. Vous pouvez ici choisir l’intervalle de temps entre chaque choix (par défaut 30min).', # NEW
-       'option_heure_pas_label' => 'Intervalle des minutes dans le menu d’aide à la saisie', # NEW
-       'option_horaire_label' => 'Horaire', # NEW
-       'option_horaire_label_case' => 'Permettre de saisie aussi l’horaire', # NEW
-       'option_info_obligatoire_explication' => 'Вы можете изменить стандартные настройки обязательного заполнения полей.. ',
-       'option_info_obligatoire_label' => 'Обязательное заполнение полей',
-       'option_inserer_barre_choix_edition' => 'Да',
-       'option_inserer_barre_choix_forum' => 'Только форум',
-       'option_inserer_barre_explication' => 'Вставить porte-plume?',
-       'option_inserer_barre_label' => 'Панель управления',
-       'option_label_case_label' => 'Позиция чекбокса',
-       'option_label_explication' => 'Название поля',
+       'option_disable_label' => 'Отключить поле',
+       'option_erreur_obligatoire_explication' => 'Выводится, если поле не заполнено. Если оставить пустым - то выведется сообщение по умолчанию.', # MODIF
+       'option_erreur_obligatoire_label' => 'Сообщение о ошибке', # MODIF
+       'option_explication_explication' => 'Пояснение о назначении поля',
+       'option_explication_label' => 'Пояснение',
+       'option_groupe_affichage' => 'Вывод',
+       'option_groupe_description' => 'Основное',
+       'option_groupe_utilisation' => 'Свойства',
+       'option_groupe_validation' => 'Проверка',
+       'option_info_obligatoire_explication' => 'Вы можете изменить стандартные настройки обязательного заполнения полей.. ', # MODIF
+       'option_info_obligatoire_label' => 'Обязательное заполнение полей', # MODIF
+       'option_inserer_barre_choix_edition' => 'добавить полную панель',
+       'option_inserer_barre_choix_forum' => 'добавить сокращенную панель ',
+       'option_inserer_barre_explication' => 'Добавить панель для редактирования текста (кнопки стилей)?',
+       'option_inserer_barre_label' => 'Панель редактирования',
+       'option_label_case_label' => 'Позиция чекбокса', # MODIF
+       'option_label_explication' => 'Название поля', # MODIF
        'option_label_label' => 'Название',
-       'option_maxlength_explication' => 'Ð\9fолÑ\8cзоваÑ\82елÑ\8c Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82 Ð²Ð²ÐµÑ\81Ñ\82и Ð±Ð¾Ð»Ñ\8cÑ\88е Ð·Ð½Ð°ÐºÐ¾Ð² Ñ\87ем:',
+       'option_maxlength_explication' => 'Ð\9cакÑ\81ималÑ\8cное Ðº-во Ñ\81имволов, ÐºÐ¾Ñ\82оÑ\80ое Ð¼Ð¾Ð¶Ð½Ð¾ Ð²Ð²ÐµÑ\81Ñ\82и Ð² Ð¿Ð¾Ð»Ðµ:',
        'option_maxlength_label' => 'Максимальное к-во символов',
-       'option_multiple_explication' => 'Ð\9fолÑ\8cзоваÑ\82елÑ\8e Ð¿Ñ\80едоÑ\81Ñ\82авлÑ\8fеÑ\82Ñ\81Ñ\8f Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82Ñ\8c выбрать несколько вариантов',
-       'option_multiple_label' => 'Ð\9cножеÑ\81Ñ\82веннÑ\8bй Ð²Ñ\8bбоÑ\80',
-       'option_nom_explication' => 'ID компьютера , который идентифицирует поле. Он может содержать только строчные буквы и цифры и символ подчеркивания "_".',
+       'option_multiple_explication' => 'Ð\9fолÑ\8cзоваÑ\82елÑ\8c Ñ\81можеÑ\82 выбрать несколько вариантов',
+       'option_multiple_label' => 'Ð\92Ñ\8bбоÑ\80 Ð½ÐµÑ\81колÑ\8cкиÑ\85 Ð·Ð½Ð°Ñ\87ений',
+       'option_nom_explication' => 'Задать id поля. Латинские буквы, цифры и символ  "_". ',
        'option_nom_label' => 'Название поля',
-       'option_obligatoire_label' => 'Ð\9fоле Ð¾Ð±Ñ\8fзаÑ\82елÑ\8cное Ð´Ð»Ñ\8f Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ\8f',
-       'option_option_intro_label' => 'Ð\9eбознаÑ\87ение Ð´Ð»Ñ\8f Ð¿Ñ\83Ñ\81Ñ\82ого Ð²Ñ\8bбоÑ\80а',
+       'option_obligatoire_label' => 'Ð\9eбÑ\8fзаÑ\82елÑ\8cное Ð¿Ð¾Ð»Ðµ',
+       'option_option_intro_label' => 'Ð\9dазвание Ð¿ÐµÑ\80вого Ñ\8dлеменÑ\82а Ñ\81пиÑ\81ка',
        'option_option_statut_label' => 'Показать статус',
-       'option_pliable_label' => 'Расширяемая',
-       'option_pliable_label_case' => 'Группы полей могут быть расширены или сжаты.',
-       'option_plie_label' => 'СжаÑ\82о.',
-       'option_plie_label_case' => 'Если группу полей можно расширить или сжать, тогда эта опция их сожмет с отображением полей.',
-       'option_previsualisation_explication' => 'СоздаÑ\82Ñ\8c Ð²ÐºÐ»Ð°Ð´ÐºÑ\83 Ð´Ð»Ñ\8f Ð¿Ñ\80оÑ\81моÑ\82Ñ\80а Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ð¾Ð³Ð¾ Ñ\82екÑ\81Ñ\82а?',
-       'option_previsualisation_label' => 'Просмотр',
-       'option_readonly_explication' => 'Ð\9fоле Ð¼Ð¾Ð¶Ð½Ð¾ Ð¿Ñ\80оÑ\81моÑ\82Ñ\80еÑ\82Ñ\8c, Ð²Ñ\8bбÑ\80аÑ\82Ñ\8c, Ð½Ð¾ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ\82Ñ\8c Ð½ÐµÐ»Ñ\8cзÑ\8f.',
-       'option_readonly_label' => 'Только чтение',
-       'option_rows_explication' => 'Высота поля в строках.',
-       'option_rows_label' => 'Ð\92Ñ\8bÑ\81оÑ\82а',
-       'option_size_explication' => 'Длина поля в символах.',
+       'option_pliable_label' => 'Расширяемая', # MODIF
+       'option_pliable_label_case' => 'Группа полей может быть развернута или сжата.', # MODIF
+       'option_plie_label' => 'Уже Ñ\81жаÑ\82о', # MODIF
+       'option_plie_label_case' => 'Если группу полей можно расширить или сжать, тогда эта опция их сожмет с отображением полей.', # MODIF
+       'option_previsualisation_explication' => 'Ð\94обавиÑ\82Ñ\8c Ð²ÐºÐ»Ð°Ð´ÐºÑ\83 Ð¿Ñ\80едваÑ\80иÑ\82елÑ\8cного Ð¿Ñ\80оÑ\81моÑ\82Ñ\80а?',
+       'option_previsualisation_label' => 'Ð\9fÑ\80едваÑ\80иÑ\82елÑ\8cнÑ\8bй Ð¿Ñ\80оÑ\81моÑ\82Ñ\80',
+       'option_readonly_explication' => 'Ð\9fоле Ð¿Ð¾ÐºÐ°Ð·Ñ\8bваеÑ\82Ñ\81Ñ\8f, ÐµÐ³Ð¾ Ð¼Ð¾Ð¶Ð½Ð¾ Ð²Ñ\8bбÑ\80аÑ\82Ñ\8c, Ð½Ð¾ Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ\82Ñ\8c.',
+       'option_readonly_label' => 'Только для чтения',
+       'option_rows_explication' => 'Высота поля в строках. Эта опция не всегда работает, так CSS стили сайта могут отменять заданное значение.',
+       'option_rows_label' => 'Ð\9aолиÑ\87еÑ\81Ñ\82во Ñ\81Ñ\82Ñ\80ок',
+       'option_size_explication' => 'Длина поля в символах. Эта опция не всегда работает, так CSS стили сайта могут отменять заданное значение.',
        'option_size_label' => 'Размер поля',
-       'option_type_choix_plusieurs' => 'Позволяет выбрать <strong>несколько</strong> получателей.',
-       'option_type_choix_tous' => 'Отметить <strong>всех</strong> авторов как получателей. Пользователю выбор не предоставляется.',
-       'option_type_choix_un' => 'Сделать возможным выбор только одного получателя.',
-       'option_type_explication' => 'Ð\92 "Ñ\81кÑ\80Ñ\8bÑ\82ом" Ñ\80ежиме Ñ\81одеÑ\80жимое Ð¿Ð¾Ð»Ñ\8f Ð±Ñ\83деÑ\82 Ð¾Ñ\82обÑ\80ажаÑ\82Ñ\8cÑ\81Ñ\8f Ð² Ð²Ð¸Ð´Ðµ Ð·Ð²ÐµÐ·Ð´Ð¾Ñ\87ек.',
+       'option_type_choix_plusieurs' => 'Позволяет выбрать <strong>несколько</strong> получателей.', # MODIF
+       'option_type_choix_tous' => 'Отметить <strong>всех</strong> авторов как получателей. Пользователю выбор не предоставляется.', # MODIF
+       'option_type_choix_un' => 'Сделать возможным выбор только одного получателя.', # MODIF
+       'option_type_explication' => 'Ð\95Ñ\81ли Ð²Ñ\8bбÑ\80ан "ввод Ð¿Ð°Ñ\80олÑ\8f", Ñ\82о Ñ\81имволÑ\8b Ð² Ð¿Ð¾Ð»Ðµ Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ñ\80евÑ\80аÑ\89аÑ\82Ñ\8cÑ\81Ñ\8f Ð² Ð·Ð²ÐµÐ·Ð´Ð¾Ñ\87ки',
        'option_type_label' => 'Тип поля',
-       'option_type_password' => 'СкÑ\80Ñ\8bÑ\82Ñ\8bй',
-       'option_type_text' => 'Ð\9dоÑ\80малÑ\8cный',
+       'option_type_password' => 'Ð\92вод Ð¿Ð°Ñ\80олÑ\8f', # MODIF
+       'option_type_text' => 'Ð\9eбÑ\8bÑ\87ный',
 
        // S
-       'saisie_auteurs_explication' => 'Ð\9fозволÑ\8fеÑ\82 Ð²Ñ\8bбÑ\80аÑ\82Ñ\8c Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ð¸Ð»Ð¸ Ð½ÐµÑ\81колÑ\8cко Ð°Ð²Ñ\82оÑ\80ов.',
-       'saisie_auteurs_titre' => 'Ð\90втора',
+       'saisie_auteurs_explication' => 'Ð\92Ñ\8bбоÑ\80 Ð°Ð²Ñ\82оÑ\80а Ð¸Ð· Ð·Ð°Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80ованнÑ\8bÑ\85 Ð½Ð° Ñ\81айÑ\82е',
+       'saisie_auteurs_titre' => 'Ð\92Ñ\8bбоÑ\80 Ð°втора',
        'saisie_case_explication' => 'Используется для включения/отключения определенной опции.',
        'saisie_case_titre' => 'Единичный выбор ',
        'saisie_checkbox_explication' => 'Используется для выбора нескольких вариантов при помощи check-box.',
@@ -136,45 +132,45 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_date_titre' => 'Дата',
        'saisie_destinataires_explication' => 'Используется для выбора одного или нескольких получателей из числа предварительно выбранных авторов.',
        'saisie_destinataires_titre' => 'Получатели',
-       'saisie_explication_explication' => 'Ð\9cногоÑ\81Ñ\82Ñ\80оÑ\87ное Ð¿Ð¾Ð»Ðµ input',
-       'saisie_explication_titre' => 'Ð\98нÑ\84оÑ\80маÑ\86иÑ\8f',
-       'saisie_fieldset_explication' => 'Форма, которая содержит несколько полей.',
+       'saisie_explication_explication' => 'Ð\98Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f Ð´Ð»Ñ\8f Ð²Ñ\8bвода Ð¿Ð¾Ñ\8fÑ\81нÑ\8fÑ\8eÑ\89ей Ð¸Ð½Ñ\84оÑ\80маÑ\86ии',
+       'saisie_explication_titre' => 'Ð\9fоÑ\8fÑ\81нение',
+       'saisie_fieldset_explication' => 'FIELDSET. Используется для группировки полей ',
        'saisie_fieldset_titre' => 'Филдсет',
        'saisie_file_explication' => 'Отправить файл',
        'saisie_file_titre' => 'Файл',
-       'saisie_hidden_explication' => 'Ð\9fÑ\80едваÑ\80иÑ\82елÑ\8cно Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð½Ñ\8bе Ð¿Ð¾Ð»Ñ\8f, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð½ÐµÐ´Ð¾Ñ\81Ñ\82Ñ\83пнÑ\8b Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8e.',
-       'saisie_hidden_titre' => 'СкÑ\80Ñ\8bÑ\82ое поле',
-       'saisie_input_explication' => 'СÑ\82Ñ\80оÑ\87ка Ñ\82екÑ\81Ñ\82а, ÐºÐ¾Ñ\82оÑ\80аÑ\8f Ð¼Ð¾Ð¶ÐµÑ\82 Ð±Ñ\8bÑ\82Ñ\8c ÐºÐ°Ðº Ñ\81кÑ\80Ñ\8bÑ\82ой Ñ\82ак Ð¸ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð¹ (паÑ\80олÑ\8c).',
-       'saisie_input_titre' => 'ТекÑ\81Ñ\82овое Ð¿Ð¾Ð»Ðµ',
-       'saisie_oui_non_explication' => 'Ð\98ли Ð\94Ð\90 Ð¸Ð»Ð¸ Ð\9dÐ\95Т ',
-       'saisie_oui_non_titre' => 'Ð\94а Ð¸Ð»Ð¸ Ð½ет',
+       'saisie_hidden_explication' => 'Ð\97наÑ\87ение Ñ\8dÑ\82ого Ð¿Ð¾Ð»Ñ\8f Ð½Ðµ Ð¾Ñ\82обÑ\80ажаеÑ\82Ñ\81Ñ\8f Ð´Ð»Ñ\8f Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8f. INPUT TYPE=HIDDEN',
+       'saisie_hidden_titre' => 'Ð\9dевидимое (Ñ\81кÑ\80Ñ\8bÑ\82ое) поле',
+       'saisie_input_explication' => 'Ð\9eÑ\81новное Ð¿Ð¾Ð»Ðµ Ð´Ð»Ñ\8f Ð²Ð²Ð¾Ð´Ð° Ð¸Ð½Ñ\84оÑ\80маÑ\86ии',
+       'saisie_input_titre' => 'ТекÑ\81Ñ\82оваÑ\8f Ñ\81Ñ\82Ñ\80ока',
+       'saisie_oui_non_explication' => 'Ð\92Ñ\8bбоÑ\80 Ñ\82олÑ\8cко Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ð²Ð°Ñ\80ианÑ\82а Ð¾Ñ\82веÑ\82а: Ð\94Ð\90 Ð¸Ð»Ð¸ Ð\9dÐ\95Т',
+       'saisie_oui_non_titre' => 'Ð\94а Ð¸Ð»Ð¸ Ð\9dет',
        'saisie_radio_defaut_choix1' => 'Один',
        'saisie_radio_defaut_choix2' => 'Два',
        'saisie_radio_defaut_choix3' => 'Три',
        'saisie_radio_explication' => 'Используется для выбора одной опции из нескольких.',
        'saisie_radio_titre' => 'Радио кнопка',
-       'saisie_selecteur_article' => 'Ð\9eÑ\82обÑ\80азиÑ\82Ñ\8c Ð±Ñ\80аÑ\83зеÑ\80 Ð²Ñ\8bбоÑ\80а Ñ\81Ñ\82аÑ\82Ñ\8cи',
-       'saisie_selecteur_article_titre' => 'СелекÑ\82ор статьи',
-       'saisie_selecteur_rubrique' => 'Ð\9eÑ\82обÑ\80азиÑ\82Ñ\8c Ð±Ñ\80аÑ\83зеÑ\80 Ð²Ñ\8bбоÑ\80а Ñ\80аздела',
-       'saisie_selecteur_rubrique_article' => 'Ð\9eÑ\82обÑ\80азиÑ\82Ñ\8c Ð±Ñ\80аÑ\83зеÑ\80 Ð²Ñ\8bбоÑ\80а Ñ\81Ñ\82аÑ\82Ñ\8cи Ð¸Ð»Ð¸ Ñ\80аздела',
-       'saisie_selecteur_rubrique_article_titre' => 'СелекÑ\82оÑ\80 Ñ\81Ñ\82аÑ\82Ñ\8cи Ð¸Ð»Ð¸ Ñ\80аздела.',
-       'saisie_selecteur_rubrique_titre' => 'СелекÑ\82оÑ\80 Ñ\80аздела.',
-       'saisie_selection_explication' => 'Выбрать пункт из выпадающего списка.',
-       'saisie_selection_multiple_explication' => 'Используется для выбора нескольких вариантов из списка.',
-       'saisie_selection_multiple_titre' => 'Ð\9cножеÑ\81Ñ\82веннÑ\8bй Ð²Ñ\8bбоÑ\80',
+       'saisie_selecteur_article' => 'Ð\9fозволÑ\8fеÑ\82 Ð²Ñ\8bбÑ\80аÑ\82Ñ\8cÑ\8e Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8e Ð¸Ð· Ñ\81Ñ\82Ñ\80Ñ\83кÑ\82Ñ\83Ñ\80Ñ\8b Ñ\81айÑ\82а',
+       'saisie_selecteur_article_titre' => 'Ð\92Ñ\8bбор статьи',
+       'saisie_selecteur_rubrique' => 'Ð\9fозволÑ\8fеÑ\82 Ð²Ñ\8bбÑ\80аÑ\82Ñ\8cÑ\8e Ñ\80аздел Ð¸Ð· Ñ\81Ñ\82Ñ\80Ñ\83кÑ\82Ñ\83Ñ\80Ñ\8b Ñ\81айÑ\82а',
+       'saisie_selecteur_rubrique_article' => 'Ð\9fозволÑ\8fеÑ\82 Ð²Ñ\8bбÑ\80аÑ\82Ñ\8cÑ\8e Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8e Ð¸Ð»Ð¸ Ñ\80аздел Ð¸Ð· Ñ\81Ñ\82Ñ\80Ñ\83кÑ\82Ñ\83Ñ\80Ñ\8b Ñ\81айÑ\82а',
+       'saisie_selecteur_rubrique_article_titre' => 'Ð\92Ñ\8bбоÑ\80 Ñ\81Ñ\82аÑ\82Ñ\8cи Ð¸Ð»Ð¸ Ñ\80аздела',
+       'saisie_selecteur_rubrique_titre' => 'Ð\92Ñ\8bбоÑ\80 Ñ\80аздела',
+       'saisie_selection_explication' => 'SELECT - позволяет выбрать один пункт из выпадающего списка',
+       'saisie_selection_multiple_explication' => 'SELECT - позволяет выбрать несколько пунктов из списка',
+       'saisie_selection_multiple_titre' => 'Ð\92Ñ\8bбоÑ\80 Ð½ÐµÑ\81колÑ\8cкиÑ\85 Ð¾Ð¿Ñ\86ий',
        'saisie_selection_titre' => 'Выпадающий список',
-       'saisie_textarea_explication' => 'Многострочное текстовое поле',
+       'saisie_textarea_explication' => 'Textarea - для работы с текстом большого размера',
        'saisie_textarea_titre' => 'Текстовое поле',
 
        // T
        'tous_visiteurs' => 'Все посетители (в том числе не зарегистрированы)',
-       'tout_selectionner' => 'Tout sélectionner', # NEW
+       'tout_selectionner' => 'Выбрать все',
 
        // V
-       'vue_sans_reponse' => '<i>Ð\91ез Ð¾Ñ\82веÑ\82а</i>',
+       'vue_sans_reponse' => '<i>ниÑ\87его Ð½Ðµ Ð·Ð°Ð´Ð°Ð½Ð¾</i>',
 
        // Z
-       'z' => 'zzz'
+       'z' => 'zzz' # MODIF
 );
 
 ?>
index 27c54ab..b8504d2 100644 (file)
@@ -55,6 +55,10 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_aff_langue_label' => 'Zobraziť jazyk',
        'option_aff_rub_interface_explication' => 'Zobraziť len rubriky v jazyku používateľa',
        'option_aff_rub_interface_label' => 'Viacjazyčné zobrazenie',
+       'option_afficher_si_explication' => 'Uveďte podmienky zobrazenia poľa podľa hodnoty iných polí. Čísla iných polí musia byť medzi <code>@</code>. <br />Príklad <code>@selection_1@=="Toto"</code> prikazuje zobraziť pole, ktoré <code>selection_1</code> má hodnotu <code>Toto</code>.',
+       'option_afficher_si_label' => 'Podmienené zobrazenie',
+       'option_afficher_si_remplissage_explication' => 'V porovnaní s predchádzajúcou možnosťou táto podmienka sa týka zobrazenia formulára, nie jeho výsledkov. Jej syntax je rovnaká.',
+       'option_afficher_si_remplissage_label' => 'Podmienené zobrazenie pri vypĺňaní',
        'option_attention_explication' => 'Správa je dôležitejšia ako vysvetlivka.',
        'option_attention_label' => 'Varovanie',
        'option_autocomplete_defaut' => 'Nechať ako predvolené',
@@ -63,6 +67,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_autocomplete_off' => 'Deaktivovať',
        'option_autocomplete_on' => 'Aktivovať',
        'option_cacher_option_intro_label' => 'Skryť prvý prázdny výber',
+       'option_choix_alternatif_label' => 'Nastaviť možnosť vytvárania rozbaľovacích menu',
+       'option_choix_alternatif_label_defaut' => 'Iný výber',
+       'option_choix_alternatif_label_label' => 'Pomenovanie výberu z viacerých možností',
        'option_choix_destinataires_explication' => 'Jeden autor alebo viacerí, z ktorých si používateľ môže vybrať. Ak nie je vybratý žiaden, vyberie sa autor, ktorý nainštaloval stránku.',
        'option_choix_destinataires_label' => 'Možní príjemcovia',
        'option_class_label' => 'Ďalšie triedy CSS',
@@ -70,6 +77,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_cols_label' => 'Šírka',
        'option_datas_explication' => 'Musíte definovať výber pre každý riadok vo formulári "kľúč|označenie výberu"',
        'option_datas_label' => 'Zoznam dostupných možností',
+       'option_datas_sous_groupe_explication' => 'Online výber musíte zadať vo forme "kľúč|menovka" výberu. <br />Môžete označiť začiatok podskupiny formulára "*Nadpis podskupiny". Skupinu môžete skončiť na riadku alebo do ďalšieho riadka môžete napísať len "/*".',
        'option_defaut_label' => 'Predvolená hodnota',
        'option_disable_avec_post_explication' => 'Rovnaká ako predošlá možnosť, ale hodnotu pošle v skrytom poli.',
        'option_disable_avec_post_label' => 'Deaktivovať ale poslať.',
@@ -77,16 +85,17 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_disable_label' => 'Deaktivovať pole',
        'option_erreur_obligatoire_explication' => 'Zobrazovanú chybovú správu môžete upraviť tak, aby označovala povinnosť',
        'option_erreur_obligatoire_label' => 'Správa s povinnosťou',
-       'option_explication_explication' => 'Ak je to potrebné, krátka veta popisujúca zmysel daného poľa.',
+       'option_explication_explication' => 'Ak je to potrebné, krátka veta opisujúca zmysel daného poľa.',
        'option_explication_label' => 'Vysvetlenie',
        'option_groupe_affichage' => 'Zobraziť',
-       'option_groupe_description' => 'Popis',
+       'option_groupe_description' => 'Opis',
        'option_groupe_utilisation' => 'Použitie',
        'option_groupe_validation' => 'Overenie',
        'option_heure_pas_explication' => 'Pri používaní diára sa zobrazí menu, ktoré vám pomôže zadať hodiny a minúty. Tak môžete vybrať časový interval pre každý údaj (predvolený – 30 min).',
        'option_heure_pas_label' => 'Interval v minútach v menu pomocníka k zápisu do poľa',
        'option_horaire_label' => 'Diár',
        'option_horaire_label_case' => 'Povoliť zápis do diára',
+       'option_id_groupe_label' => 'Skupina slov',
        'option_info_obligatoire_explication' => 'Môžete zmeniť predvolenú povinnosť vyplniť polia: <i>[Povinné]</i>.',
        'option_info_obligatoire_label' => 'Označenie povinnosti',
        'option_inserer_barre_choix_edition' => 'celý editovací panel s nástrojmi',
@@ -94,7 +103,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_inserer_barre_explication' => 'Vložiť panel s nástrojmi porte-plume, ak je tento nástroj aktivovaný.',
        'option_inserer_barre_label' => 'Vložiť panel s nástrojmi',
        'option_label_case_label' => 'Označenie sa nachádza pod zaškrtávacím políčkom',
-       'option_label_explication' => 'Zobrazí sa nadpis.',
+       'option_label_explication' => 'Zobrazí sa titulok.',
        'option_label_label' => 'Označenie',
        'option_maxlength_explication' => 'Používateľ nemôže napísať viac znakov ako určuje toto číslo.',
        'option_maxlength_label' => 'Maximálny počet znakov',
@@ -103,6 +112,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_nom_explication' => 'Počítačový názov, ktorý pomenúva pole. Môžu v ňom byť malé písmená abecedy alebo podčiarkovník "_".',
        'option_nom_label' => 'Názov poľa',
        'option_obligatoire_label' => 'Povinné pole',
+       'option_option_destinataire_intro_label' => 'Pomenovanie prvého prázdneho výberu(ak má formu zoznamu)',
        'option_option_intro_label' => 'Označenie prvého prázdneho výberu',
        'option_option_statut_label' => 'Zobraziť stav',
        'option_pliable_label' => 'Roztiahnuteľné',
@@ -119,10 +129,11 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'option_size_label' => 'Veľkosť poľa',
        'option_type_choix_plusieurs' => 'Umožní používateľovi vybrať si <strong>mnohých</ strong> príjemcov.',
        'option_type_choix_tous' => 'Urobiť príjemcov zo <strong>všetkých</ strong> týchto autorov. Používateľ nebude mať na výber.',
-       'option_type_choix_un' => 'Povoliť používateľovi vybrať si <strong>jedného</ strong> príjemcu.',
+       'option_type_choix_un' => 'Povoliť používateľovi vybrať si <strong>jedného</ strong> príjemcu (vo forme rozbaľovacieho menu).',
+       'option_type_choix_un_radio' => 'Umožniť používateľovi vybrať si <strong>jediného</strong> príjemcu (vo forme zoznamu s odrážkami).',
        'option_type_explication' => 'V režime hesla sa obsah napísaný do poľa nahradí hviezdičkami.',
        'option_type_label' => 'Typ poľa',
-       'option_type_password' => 'Maskované',
+       'option_type_password' => 'Skrývaný text pri písaní (napr. heslo)',
        'option_type_text' => 'Normálny',
 
        // S
@@ -136,7 +147,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_date_titre' => 'Dátum',
        'saisie_destinataires_explication' => 'Používa sa na výber jedného príjemcu alebo viacerých z dopredu vybraných autorov.',
        'saisie_destinataires_titre' => 'Príjemcovia',
-       'saisie_explication_explication' => 'Všeobecný vysvetľujúci popis.',
+       'saisie_explication_explication' => 'Všeobecný vysvetľujúci text.',
        'saisie_explication_titre' => 'Vysvetlenie',
        'saisie_fieldset_explication' => 'Rám, v ktorom môže byť niekoľko polí.',
        'saisie_fieldset_titre' => 'Skupina polí',
@@ -146,6 +157,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'saisie_hidden_titre' => 'Skryté pole',
        'saisie_input_explication' => 'Jednoduchý riadok s textom, ktorý môže byť viditeľný alebo skrytý (heslo).',
        'saisie_input_titre' => 'Textové pole',
+       'saisie_mot_explication' => 'Jedno alebo viac kľúčových slov zo skupiny slov',
+       'saisie_mot_titre' => 'Kľúčové slovo',
        'saisie_oui_non_explication' => 'Odpoveď buď Áno alebo Nie',
        'saisie_oui_non_titre' => 'Áno alebo Nie',
        'saisie_radio_defaut_choix1' => 'Jeden',
index dd2aae2..f7082da 100644 (file)
@@ -1,8 +1,8 @@
 <paquet\r
        prefix="saisies"\r
        categorie="outil"\r
-       version="1.31.4"\r
-       etat="test"\r
+       version="1.40.4"\r
+       etat="stable"\r
        compatibilite="[2.0.0;3.0.*]"\r
        logo="images/logo_saisie_48.png"\r
        documentation="http://www.spip-contrib.net/Saisies"\r
index cc84caa..94067e8 100644 (file)
@@ -2,9 +2,9 @@
     <nom><multi>[fr]Saisies pour formulaires[en]Entries for forms</multi></nom>\r
        <slogan>Ecrire facilement des champs de formulaires</slogan>\r
     <auteur>Matthieu Marcillaud - RastaPopoulos - Joseph</auteur>\r
-    <licence>&#169; 2009-2012 GNU/GPL</licence>\r
-    <version>1.31.4</version>\r
-    <etat>test</etat>\r
+    <licence>&#169; 2009-2013 GNU/GPL</licence>\r
+    <version>1.40.4</version>\r
+    <etat>stable</etat>\r
     <categorie>outil</categorie>\r
     \r
        <description>\r
@@ -57,7 +57,7 @@
                <nom>styliser</nom>\r
                <inclure>saisies_pipelines.php</inclure>\r
        </pipeline>\r
-    \r
+\r
        <necessite id="SPIP" version="[2.0.0;3.0.99]" />\r
        <utilise id="verifier" />\r
        <utilise id="spip_bonux" />\r
index c313025..77b12cf 100644 (file)
@@ -1,11 +1,12 @@
 [(#REM) datas peut être une chaine qu'on sait décomposer ]\r
 #SET{datas, #ENV{datas}|saisies_chaine2tableau}\r
 #SET{valeur, #ENV{valeur}|saisies_valeur2tableau}\r
-\r
 <B_choix>\r
 <ul>\r
        <BOUCLE_choix(POUR){tableau #GET{valeur}}>\r
-       <li class="choix">[(#GET{datas}|table_valeur{#VALEUR})]</li>\r
+        [<li class="choix">(#GET{datas}|table_valeur{#VALEUR})</li>]\r
        </BOUCLE_choix>\r
-</ul>\r
+\r
+    [<li class="choix"><em>#ENV{choix_alternatif_label}</em> : (#GET{valeur}|table_valeur{choix_alternatif})</li>]\r
+    </ul>\r
 </B_choix>\r
diff --git a/www/plugins/saisies/saisies-vues/mot.html b/www/plugins/saisies/saisies-vues/mot.html
new file mode 100644 (file)
index 0000000..5e9f0a6
--- /dev/null
@@ -0,0 +1,3 @@
+[(#REM) datas peut être une chaine qu'on sait décomposer ]\r
+#SET{valeur, #ENV{valeur}|saisies_valeur2tableau}\r
+<p><BOUCLE_mots(POUR){tableau #GET{valeur}}{', '}><a href="[(#VALEUR|generer_url_entite{mot})]">#INFO_TITRE{mot,#VALEUR}</a></BOUCLE_mots></p>\r
index 12a6e3e..dcd2157 100644 (file)
@@ -1 +1 @@
-[<p>(#ENV*{valeur}|?{<:item_oui:>,<:item_non:>})</p>]
+[<p>(#ENV*{valeur}|et{#ENV{valeur}|!={#ENV{valeur_non,non}}}|?{<:item_oui:>,<:item_non:>})</p>]
index b3c9c55..45dddb1 100644 (file)
@@ -1,4 +1,4 @@
 [(#REM) datas peut être une chaine qu'on sait décomposer ]\r
-#SET{datas, #ENV{datas}|saisies_chaine2tableau}\r
+#SET{datas, #ENV{datas}|saisies_chaine2tableau|saisies_aplatir_tableau}\r
 \r
 [<p>(#GET{datas}|table_valeur{#ENV{valeur}})</p>]\r
index e8ab81d..e5befe6 100644 (file)
@@ -42,7 +42,7 @@
                <!--!inserer_saisie_editer-->\r
                <li class="editer editer_[(#ENV{nom}|saisie_nom2classe)][ (#GET{obligatoire})][ (#GET{erreurs}|oui)erreur][ (#GET{li_class})][ (#ENV{li_class})][ saisie_(#ENV{type_saisie})]"[ data-id="(#ENV{id_saisie})"]>\r
                        #ENV*{inserer_debut}\r
-                       [<label[(#ENV{type_saisie}|match{oui_non|radio|checkbox}|non) for="champ_#ENV{nom}"]>(#ENV*{label})[<span class='obligatoire'>(#GET{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]\r
+                       [<label[(#ENV{type_saisie}|match{oui_non|radio|checkbox}|non) for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"]>(#ENV*{label})[<span class='obligatoire'>(#GET{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]\r
                        [<span class='erreur_message'>(#GET{erreurs})</span>]\r
                        [<p class='explication'>(#ENV*{explication})</p>]\r
                        [<em class='attention'>(#ENV*{attention})</em>]\r
index bf38d6e..cf44b7b 100644 (file)
@@ -19,7 +19,7 @@ Par défaut ne liste que ceux des rubriques à la racine (secteurs)
                label=<:plugin:label_articles:>,\r
                multiple=oui})]\r
 ]\r
-<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ (#ENV*{attributs})]>\r
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ (#ENV*{attributs})]>\r
        [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)\r
                <option value="0">[(#ENV{option_intro})]</option>]\r
                <BOUCLE_articles_originaux_racine(ARTICLES){id_rubrique}{origine_traduction}>\r
index 759b97c..a394ed6 100644 (file)
@@ -14,6 +14,7 @@
     (defaut = rien)\r
   - cacher_option_intro : pas de premier option vide  (defaut:"")\r
   - defaut : valeur par defaut si pas présente dans l'environnement\r
+  - tri : trier la liste (par défaut par nom), la valeur peut être un tableau [(#ARRAY{statut,nom})] ou une chaine "nom"\r
   - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement\r
   - webmestre : si oui, ne selectionne que les webmestres\r
   \r
 [(#ENV{multiple}|oui)\r
        [(#SET{valeur,[(#ENV*{valeur}|is_array|?{[(#ENV*{valeur})],[(#ENV*{valeur}|explode{','})]})]})]\r
 ]\r
-<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>\r
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>\r
        [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)\r
                <option value="">[(#ENV{option_intro})]</option>]\r
-       <BOUCLE_auteurs(AUTEURS){par num nom, nom}{statut ?}{statut != 5poubelle}{webmestre ?}{tout}>\r
+       <BOUCLE_auteurs(AUTEURS){statut ?}{statut != 5poubelle}{webmestre ?}{par #ENV{tri,#ARRAY{num nom, nom}}|is_array|?{#ENV{tri,#ARRAY{num nom, nom}}|implode{','},#ENV{tri,#ARRAY{num nom, nom}}}}{tout}>\r
                #SET{image_statut, #GET{bonhomme_statut}|table_valeur{#STATUT}}\r
                [(#ENV{multiple}|oui)\r
                <option value="#ID_AUTEUR"[(#ID_AUTEUR|in_array{#ENV{valeur_forcee,#GET{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"][(#GET{image_statut}|oui)[style="background:url((#CHEMIN{prive/images/#GET{image_statut}})) no-repeat left; padding-left: 20px;"]]>#NOM</option>]\r
index 7438f14..0a089d4 100644 (file)
@@ -58,6 +58,20 @@ options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'oui_non'
         options:
index 5411e12..3a570c2 100644 (file)
@@ -15,6 +15,7 @@
                explication=<:plugin:explication_afficher_liste:>})]
 ]#SET{valeur,#ENV{valeur_forcee,#ENV{valeur}}|is_null|?{#ENV{defaut},#ENV{valeur_forcee,#ENV{valeur}}}}
 <div class="choix">
-       <input type="checkbox" name="#ENV{nom}" class="checkbox" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ (#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)checked="checked"] value="#ENV{valeur_oui,on}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ (#ENV*{attributs})]/>
-       [<label for="champ_[(#ENV{nom}|saisie_nom2classe)]">[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)<strong>](#ENV*{label_case})[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)</strong>]</label>]
+       [(#ENV{disable}|non)<input type="hidden" name="#ENV{nom}" value="#ENV{valeur_non,''}" />]
+       <input type="checkbox" name="#ENV{nom}" class="checkbox" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ (#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)checked="checked"] value="#ENV{valeur_oui,on}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ (#ENV*{attributs})]/>
+       [<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)class="on"]>(#ENV*{label_case})</label>]
 </div>
index 13af035..98523a7 100644 (file)
@@ -64,6 +64,20 @@ options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'input'
         options:
index d8df21e..78709a2 100644 (file)
        [(#GET{disabled}|oui) #SET{disabled,#ARRAY|push{#GET{disabled}}} ]
 ]
 [(#ENV{tout_selectionner}|oui)
-       <div class="[(#ENV{choix,choix})] none-nojs">
-               <input type="checkbox" name="#ENV{nom}_tout" class="checkbox" id="champ_[(#ENV{nom}|saisie_nom2classe)]_tout" value="on" onChange="if (jQuery(this).attr('checked')=='checked') jQuery(this).parent('div').parent().find('input').attr('checked','checked'); else jQuery(this).parent('div').parent().find('input').removeAttr('checked');"/>
-               <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_tout"><:saisies:tout_selectionner:></label>
+       <div class="[(#ENV{choix,choix})][ (#ENV{choix,choix})_tout_selectionner ]none-nojs">
+               <input type="checkbox" name="#ENV{nom}_tout" class="checkbox" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_tout" value="on" onChange="if (jQuery(this).attr('checked')=='checked') jQuery(this).parent('div').parent().find('input').attr('checked','checked'); else jQuery(this).parent('div').parent().find('input').removeAttr('checked');"/>
+               <label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_tout"><:saisies:tout_selectionner:></label>
        </div>
 ]
 
 <BOUCLE_checkbox(POUR){tableau #GET{datas}}>
-<div class="#ENV{choix,choix}[ (#ENV{choix,choix})_#CLE]">
-       <input type="checkbox" name="#ENV{nom}[]" class="checkbox" id="champ_[(#ENV{nom}|saisie_nom2classe)]_#COMPTEUR_BOUCLE"[ (#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)checked="checked"] value="#CLE"[(#CLE|in_array{#GET{disabled}}|oui) disabled="disabled"][ (#ENV*{attributs})] />
-       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_#COMPTEUR_BOUCLE">[(#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)<strong>]#VALEUR[(#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)</strong>]</label>
+<div class="#ENV{choix,choix}[ (#ENV{choix,choix})_#CLE]">[(#SET{id,champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_[(#COMPTEUR_BOUCLE|concat{'-',#CLE}|md5)]})]
+       <input type="checkbox" name="#ENV{nom}[]" class="checkbox" id="#GET{id}"[ (#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)checked="checked"] value="#CLE"[(#CLE|in_array{#GET{disabled}}|oui) disabled="disabled"][ (#ENV*{attributs})] />
+       <label for="#GET{id}"[(#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)class="on"]>#VALEUR</label>
 </div>
 </BOUCLE_checkbox>
+[(#ENV{choix_alternatif}|oui)
+<div class="#ENV{choix,choix} choix_alternatif[ (#ENV{choix,choix})_alternatif]">
+    <input name="#ENV{nom}[(#VAL{91}|chr)]choix_alternatif[(#VAL{93}|chr)]" id="[champ_(#ENV{id,#ENV{nom}}|saisie_nom2classe)_choix_alternatif]" />
+    <label for="[champ_(#ENV{id,#ENV{nom}}|saisie_nom2classe)_choix_alternatif]">
+         [(#ENV{choix_alternatif_label, <:saisies:option_choix_alternatif_label_defaut:>})]
+    </label>
+</div>
+]
+</B_checkbox>
index 0be055d..533b91a 100644 (file)
@@ -38,6 +38,18 @@ options:
           label: '<:saisies:option_defaut_label:>'
           rows: 10
           cols: 50
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'choix_alternatif'
+          label: '<:saisies:option_choix_alternatif_label:>'
+          defaut: '' 
+      -
+        saisie: 'input'
+        options:
+          nom: 'choix_alternatif_label'
+          label: '<:saisies:option_choix_alternatif_label_label:>'
+          defaut: '<:saisies:option_choix_alternatif_label_defaut:>'
   -
     saisie: 'fieldset'
     options:
@@ -68,6 +80,20 @@ options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'input'
         options:
index d773e69..c97e7a7 100644 (file)
@@ -14,7 +14,7 @@
 [(#REM) Attention, la valeur ou la valeur forcée peut être une chaine vide. On doit donc tester avec is_null. ]
 #SET{valeur,#ENV{valeur_forcee}|is_null|?{#ENV{valeur}|is_null|?{#ENV{defaut},#ENV{valeur}},#ENV{valeur_forcee}}}
 
-<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size})"][ (#ENV*{attributs})]>
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size})"][ (#ENV*{attributs})]>
        [(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
 <BOUCLE_objets(POUR){tableau #REM|lister_tables_objets_sql}{cle !IN #ENV{exclus,''}}>[(#VALEUR{editable}|oui)
        <option value="#CLE"[(#CLE|=={#GET{valeur}}|oui)selected="selected"]>[(#VALEUR{texte_objets}|_T)]</option>
index 1c7cef4..bab933d 100644 (file)
@@ -84,6 +84,20 @@ options:
       nom: 'affichage'\r
       label: '<:saisies:option_groupe_affichage:>'\r
     saisies:\r
+      -\r
+        saisie: 'textarea'\r
+        options:\r
+          nom: 'afficher_si'\r
+          label: '<:saisies:option_afficher_si_label:>'\r
+          explication: '<:saisies:option_afficher_si_explication:>'\r
+          rows: 5\r
+      -\r
+        saisie: 'textarea'\r
+        options:\r
+          nom: 'afficher_si_remplissage'\r
+          label: '<:saisies:option_afficher_si_remplissage_label:>'\r
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'\r
+          rows: 5\r
       -\r
         saisie: 'input'\r
         options:\r
index d16e97f..b756b4a 100644 (file)
@@ -10,6 +10,7 @@
        - label_(jour|mois|annee)
        - size_(jour|mois|annee)
        - maxlength_(jour|mois|annee)
+       - datetime, par défaut oui. Si pas oui, utilisera une date au format aaaa-mm-jj au lieu d'un datetime mysql
        
        [(#SAISIE{date_jour_mois_annee, date_naissance,
                label=Date de naissance
@@ -17,9 +18,8 @@
 ]
 #SET{valeur,#ENV{valeur,#ENV{defaut}}}
 [(#SET{id,[(#ENV**|md5|substr{0,6})]})]
-<input type='text' name="#ENV{nom}" id="#GET{id}" value="[(#GET{valeur}|sinon{0000-00-00 00:00:00})]" class='datetime' />
+<input type='text' name="#ENV{nom}" id="#GET{id}" value="[(#GET{valeur}|sinon{0000-00-00[(#ENV{datetime,oui}|=={oui}|oui)00:00:00]})]" class='datetime' />
 
-                         
 <script type='text/javascript'>
 function activer_dateur_#GET{id}() {
        jour = '\
@@ -59,7 +59,10 @@ function changer_la_date(me) {
        while(jour.length < 2) {jour = '0' + jour;}
        while(mois.length < 2) {mois = '0' + mois;}
        while(annee.length < 4) {annee = '0' + annee;}
-       date = annee + '-' + mois + '-' + jour + date.substring(10);
+       [(#ENV{datetime,oui}|=={oui}|oui)
+       date = annee + '-' + mois + '-' + jour + date.substring(10);]
+       [(#ENV{datetime,oui}|=={oui}|non)
+       date = annee + '-' + mois + '-' + jour;]
        li.find('.datetime').attr('value',date);
 }
 
index f8d3900..76571c9 100644 (file)
@@ -1,10 +1,10 @@
-#SET{type_choix, #ENV{type_choix,tous}}
+       #SET{type_choix, #ENV{type_choix,tous}}
 #SET{choix_destinataires, #ENV*{choix_destinataires,#ARRAY}}
 #SET{erreurs,#ENV**{erreurs}|table_valeur{#ENV{nom}}}
 <BOUCLE_choix(CONDITION){si #GET{choix_destinataires}|count|<{2}|ou{#GET{type_choix}|=={tous}}}>
 <li class="editer editer_[(#ENV{nom})][ (#ENV{obligatoire})][ (#GET{erreurs}|oui)erreur][ (#ENV{li_class})][ saisie_(#ENV{type_saisie})]" [(#ENV{tout_afficher}|!={oui}|?{style="display:none;"})][ data-id="(#ENV{id_saisie})"]>
        #ENV*{inserer_debut}
-       [<label for="champ_#ENV{nom}">(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
+       [<label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]">(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
        [<span class='erreur_message'>(#GET{erreurs})</span>]
        [<p class='explication'>(#ENV*{explication})</p>]
        [<em class='attention'>(#ENV*{attention})</em>]
        <div class="choix">
                <input type="checkbox" name="#ENV{nom}&#91;&#93;" class="checkbox"
                        readonly="readonly" checked="checked"
-                       id="champ_[(#ENV{nom}|saisie_nom2classe)]_destinataire#ID_AUTEUR"
+                       id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_destinataire#ID_AUTEUR"
                        value="#ID_AUTEUR"[ (#ID_AUTEUR|in_array{#ENV{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)checked="checked"]
                />
-               <label for="champ_#ENV{nom}_destinataire#ID_AUTEUR">#NOM</label>
+               <label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_destinataire#ID_AUTEUR">#NOM</label>
        </div>
        ]
        </BOUCLE_tous>
 </BOUCLE_choix>
 <li class="editer editer_[(#ENV{nom})][ (#ENV{obligatoire})][ (#GET{erreurs}|oui)erreur][ (#ENV{li_class})][ saisie_(#ENV{type_saisie})]">
        #ENV*{inserer_debut}
-       [<label[(#GET{type_choix}|=={un}|oui)for="champ_#ENV{nom}"]>(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
+       [<label[(#GET{type_choix}|=={un}|ou{#GET{type_choix}|=={un_radio}}|oui)for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"]>(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
        [<span class='erreur_message'>(#GET{erreurs})</span>]
        [<p class='explication'>(#ENV*{explication})</p>]
        [<em class='attention'>(#ENV*{attention})</em>]
        [(#REM) Sinon on propose le choix, en select ou en checkbox suivant l'option "type_choix" ]
        <B_destinataires>
                [(#GET{type_choix}|=={un}|oui)
-                       <select name="#ENV{nom}&#91;&#93;" id="champ_[(#ENV{nom}|saisie_nom2classe)]">
+                       <select name="#ENV{nom}&#91;&#93;" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]">
+                [<option value="">(#ENV{option_intro})</option>]
                ]
                <BOUCLE_destinataires(AUTEURS){tous}{id_auteur IN #GET*{choix_destinataires}}{par num nom,nom}>
-                       [(#GET{type_choix}|=={plusieurs}|oui)
+                       [(#GET{type_choix}|=={plusieurs}|ou{#GET{type_choix}|=={un_radio}}|oui)
                                <div class="choix">
-                                       <input type="checkbox" name="#ENV{nom}&#91;&#93;" class="checkbox"
-                                               id="champ_[(#ENV{nom}|saisie_nom2classe)]_destinataire#ID_AUTEUR"
+                                       <input type="[(#GET{type_choix}|=={plusieurs}|?{checkbox,radio})]" name="#ENV{nom}&#91;&#93;" class="checkbox"
+                                               id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_destinataire#ID_AUTEUR"
                                                value="#ID_AUTEUR"[ (#ID_AUTEUR|in_array{#ENV*{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)checked="checked"]
                                        />
-                                       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_destinataire#ID_AUTEUR">[(#ID_AUTEUR|in_array{#ENV*{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)<strong>]#NOM[(#ID_AUTEUR|in_array{#ENV*{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)</strong>]</label>
+                                       <label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_destinataire#ID_AUTEUR"[(#ID_AUTEUR|in_array{#ENV*{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)class="on"]>#NOM</label>
                                </div>
                        ]
                        [(#GET{type_choix}|=={un}|oui)
                                <option value="#ID_AUTEUR"[ (#ID_AUTEUR|in_array{#ENV{valeur_forcee,#ENV*{valeur,#ENV*{defaut,#ARRAY}}}}|oui)selected="selected"]>#NOM</option>
                        ]
+            
                </BOUCLE_destinataires>
                [(#GET{type_choix}|=={un}|oui)
                        </select>
index b23103e..ec96f4b 100644 (file)
@@ -37,14 +37,35 @@ options:
           datas:
             tous: '<:saisies:option_type_choix_tous:>'
             un: '<:saisies:option_type_choix_un:>'
+            un_radio: '<:saisies:option_type_choix_un_radio:>'
             plusieurs: '<:saisies:option_type_choix_plusieurs:>'
           defaut: 'tous'
+      -
+        saisie: 'input'
+        options:
+          nom: 'option_intro'
+          label: '<:saisies:option_option_destinataire_intro_label:>'
+          size: 50
   -
     saisie: 'fieldset'
     options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'input'
         options:
index 64d1e93..45e7de9 100644 (file)
@@ -24,6 +24,20 @@ options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'input'
         options:
index d2f9607..f63ed80 100644 (file)
@@ -29,6 +29,20 @@ options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'case'
         options:
index f5cb85a..909e1b7 100644 (file)
   - defaut : valeur par defaut si pas présente dans l'environnement
   - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement
   - groupes_exclus : tableau de groupes exclus
-  
+  - afficher_id_groupe : afficher le numero du groupe en plus de son titre
+
   Exemple d'appel :
        [(#SAISIE{groupe_mots,groupes,
                label=<:plugin:secteur_region:>,
                multiple=oui,
                table_liaison=articles})] 
 ]
-<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
        [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)
                <option value="0">[(#ENV{option_intro})]</option>]
        <BOUCLE_groupes(GROUPES_MOTS){id_groupe !IN #ENV{groupes_exclus,#ARRAY}}{par num titre, titre}{tables_liees==#VAL{'(^|,)'}|concat{#ENV{table_liaison,.*},'($|,)'}}{tout}>
                [(#ENV{multiple}|oui)
-               <option value="#ID_GROUPE"[(#ID_GROUPE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]
+               <option value="#ID_GROUPE"[(#ID_GROUPE|in_array{#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE[ \(<:info_numero_abbreviation:>(#ENV{afficher_id_groupe,''}|?{#ID_GROUPE})\)]</option>]
                [(#ENV{multiple}|non)
-               <option value="#ID_GROUPE"[(#ID_GROUPE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]
+               <option value="#ID_GROUPE"[(#ID_GROUPE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE[ \(<:info_numero_abbreviation:>(#ENV{afficher_id_groupe,''}|?{#ID_GROUPE})\)]</option>]
        </BOUCLE_groupes>
 </select>
index 376618d..33ec302 100644 (file)
@@ -45,4 +45,4 @@
 ]</BOUCLE_selection>\r
 </datalist>\r
 </B_selection>\r
-<input type="#GET{type}" name="#ENV{nom}" class="#GET{type}[ (#ENV{class})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ list="(#GET{list_id})"][ value="(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}})"][ size="(#ENV{size})"][ maxlength="(#ENV{maxlength})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ placeholder="(#ENV{placeholder})"][(#ENV{obligatoire}|et{#ENV{obligatoire}!={non}}|et{#HTML5}|oui) required="required"][(#ENV{autofocus}|et{#ENV{autofocus}!={non}}|et{#HTML5}|oui) autofocus="autofocus"][(#GET{val_autocomplete}|find{#ENV{autocomplete}}|oui) autocomplete="#ENV{autocomplete}"][ (#ENV*{attributs})] />\r
+<input type="#GET{type}" name="#ENV{nom}" class="#GET{type}[ (#ENV{class})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ list="(#GET{list_id})"][ value="(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}})"][ size="(#ENV{size})"][ maxlength="(#ENV{maxlength})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ placeholder="(#ENV{placeholder})"][(#ENV{obligatoire}|et{#ENV{obligatoire}!={non}}|et{#HTML5}|oui) required="required"][(#ENV{autofocus}|et{#ENV{autofocus}!={non}}|et{#HTML5}|oui) autofocus="autofocus"][(#GET{val_autocomplete}|find{#ENV{autocomplete}}|oui) autocomplete="#ENV{autocomplete}"][ (#ENV*{attributs})] />\r
index cda5ffd..62a43ab 100644 (file)
@@ -30,14 +30,12 @@ options:
           explication: '<:saisies:option_explication_explication:>'\r
           size: 50\r
       -\r
-        saisie: 'radio'\r
+        saisie: 'case'\r
         options:\r
           nom: 'type'\r
-          label: '<:saisies:option_type_label:>'\r
-          explication: '<:saisies:option_type_explication:>'\r
-          datas:\r
-            text: '<:saisies:option_type_text:>'\r
-            password: '<:saisies:option_type_password:>'\r
+          label_case: '<:saisies:option_type_password:>'\r
+          valeur_oui: 'password'\r
+          valeur_non: 'text'\r
           defaut: 'text'\r
   -\r
     saisie: 'fieldset'\r
@@ -56,22 +54,22 @@ options:
           options:\r
             min: 1\r
       -\r
-        saisie: 'oui_non'\r
+        saisie: 'case'\r
         options:\r
           nom: 'disable'\r
-          label: '<:saisies:option_disable_label:>'\r
+          label_case: '<:saisies:option_disable_label:>'\r
           explication: '<:saisies:option_disable_explication:>'\r
       -\r
-        saisie: 'oui_non'\r
+        saisie: 'case'\r
         options:\r
           nom: 'disable_avec_post'\r
-          label: '<:saisies:option_disable_avec_post_label:>'\r
+          label_case: '<:saisies:option_disable_avec_post_label:>'\r
           explication: '<:saisies:option_disable_avec_post_explication:>'\r
       -\r
-        saisie: 'oui_non'\r
+        saisie: 'case'\r
         options:\r
           nom: 'readonly'\r
-          label: '<:saisies:option_readonly_label:>'\r
+          label_case: '<:saisies:option_readonly_label:>'\r
           explication: '<:saisies:option_readonly_explication:>'\r
   -\r
     saisie: 'fieldset'\r
@@ -79,6 +77,20 @@ options:
       nom: 'affichage'\r
       label: '<:saisies:option_groupe_affichage:>'\r
     saisies:\r
+      -\r
+        saisie: 'textarea'\r
+        options:\r
+          nom: 'afficher_si'\r
+          label: '<:saisies:option_afficher_si_label:>'\r
+          explication: '<:saisies:option_afficher_si_explication:>'\r
+          rows: 5\r
+      -\r
+        saisie: 'textarea'\r
+        options:\r
+          nom: 'afficher_si_remplissage'\r
+          label: '<:saisies:option_afficher_si_remplissage_label:>'\r
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'\r
+          rows: 5\r
       -\r
         saisie: 'input'\r
         options:\r
@@ -126,10 +138,10 @@ options:
       label: '<:saisies:option_groupe_validation:>'\r
     saisies:\r
       -\r
-        saisie: 'oui_non'\r
+        saisie: 'case'\r
         options:\r
           nom: 'obligatoire'\r
-          label: '<:saisies:option_obligatoire_label:>'\r
+          label_case: '<:saisies:option_obligatoire_label:>'\r
       -\r
         saisie: 'input'\r
         options:\r
index c8b6191..1765f87 100644 (file)
        [(#SAISIE{mot, en_region,
                label=<:plugin:en_region:>})]
 ]
-
-<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ value="(#ENV{valeur_forcee,#ENV{valeur}})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+<BOUCLE_multiples(GROUPES_MOTS){id_groupe}{unseul!=oui}>
+       [(#REM) defaut peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
+       #SET{defaut, #ENV{defaut}|saisies_chaine2tableau}
+       [(#REM) valeur doit être un tableau ! ]
+       #SET{valeur, #ENV{valeur}|saisies_valeur2tableau}
+       [(#REM) valeur doit être un tableau ! ]
+       #SET{valeur_forcee, #ENV{valeur_forcee}|saisies_valeur2tableau}
+       <BOUCLE_checkmots(MOTS){par num titre, titre}{id_groupe}>
+       <div class="choix choix_#ID_MOT[ (#ENV{class})]">[(#SET{id,champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_[(#ID_MOT|concat{'-',#ENV{nom}}|md5)]})]
+               [(#SET{checked,[(#ID_MOT|in_array{#GET{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)]})]
+               <input type="checkbox" name="#ENV{nom}[]" class="checkbox" id="#GET{id}"[ (#GET{checked})checked="checked"] value="#ID_MOT"[ (#ENV*{attributs})] />
+               <label for="#GET{id}"[(#GET{checked})class="on"]>#TITRE</label>
+       </div>
+       </BOUCLE_checkmots>
+</BOUCLE_multiples>
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ value="(#ENV{valeur_forcee,#ENV{valeur}})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
 [(#ENV{cacher_option_intro}|non)
        <option value="">[(#ENV{option_intro})]</option>]
-<BOUCLE_mots(MOTS){par id_groupe, num titre, titre}{id_groupe ?}>
+<BOUCLE_mots(MOTS){par id_groupe, num titre, titre}{id_groupe ?}>[(#ENV{id_groupe,''}|non)
        [<optgroup label="(#TYPE|unique|attribut_html)" />]
-       <option value="#ID_MOT" [(#ID_MOT|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>
+       ]<option value="#ID_MOT" [(#ID_MOT|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>
 </BOUCLE_mots>
 </select>
+<//B_multiples>
diff --git a/www/plugins/saisies/saisies/mot.yaml b/www/plugins/saisies/saisies/mot.yaml
new file mode 100644 (file)
index 0000000..6433628
--- /dev/null
@@ -0,0 +1,131 @@
+
+titre: '<:saisies:saisie_mot_titre:>'
+description: '<:saisies:saisie_mot_explication:>'
+icone: 'images/saisies_mot.png'
+options:
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'description'
+      label: '<:saisies:option_groupe_description:>'
+    saisies:
+      -
+        saisie: 'input'
+        options:
+          nom: 'label'
+          label: '<:saisies:option_label_label:>'
+          explication: '<:saisies:option_label_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'explication'
+          label: '<:saisies:option_explication_label:>'
+          explication: '<:saisies:option_explication_explication:>'
+          size: 50
+      -
+        saisie: 'groupe_mots'
+        options:
+          nom: 'id_groupe'
+          label: '<:saisies:option_id_groupe_label:>'
+          afficher_id_groupe: ' '
+      -
+        saisie: 'input'
+        options:
+          nom: 'defaut'
+          label: '<:saisies:option_defaut_label:>'
+          size: 50
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'utilisation'
+      label: '<:saisies:option_groupe_utilisation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable'
+          label: '<:saisies:option_disable_label:>'
+          explication: '<:saisies:option_disable_explication:>'
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'disable_avec_post'
+          label: '<:saisies:option_disable_avec_post_label:>'
+          explication: '<:saisies:option_disable_avec_post_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'affichage'
+      label: '<:saisies:option_groupe_affichage:>'
+    saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
+      -
+        saisie: 'input'
+        options:
+          nom: 'option_intro'
+          label: '<:saisies:option_option_intro_label:>'
+          size: 50
+      -
+        saisie: 'case'
+        options:
+          nom: 'cacher_option_intro'
+          label_case: '<:saisies:option_cacher_option_intro_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'attention'
+          label: '<:saisies:option_attention_label:>'
+          explication: '<:saisies:option_attention_explication:>'
+          size: 50
+      -
+        saisie: 'input'
+        options:
+          nom: 'size'
+          label: '<:saisies:option_size_label:>'
+          explication: '<:saisies:option_size_explication:>'
+        verifier:
+          type: 'entier'
+          options:
+            min: 1
+      -
+        saisie: 'input'
+        options:
+          nom: 'info_obligatoire'
+          label: '<:saisies:option_info_obligatoire_label:>'
+          explication: '<:saisies:option_info_obligatoire_explication:>'
+  -
+    saisie: 'fieldset'
+    options:
+      nom: 'obligatoire'
+      label: '<:saisies:option_groupe_validation:>'
+    saisies:
+      -
+        saisie: 'oui_non'
+        options:
+          nom: 'obligatoire'
+          label: '<:saisies:option_obligatoire_label:>'
+      -
+        saisie: 'input'
+        options:
+          nom: 'erreur_obligatoire'
+          label: '<:saisies:option_erreur_obligatoire_label:>'
+          explication: '<:saisies:option_erreur_obligatoire_explication:>'
+defaut:
+  options:
+    label: '<:saisies:saisie_mot_titre:>'
+    # champs extras (definition du champ sql)
+    sql: "text DEFAULT '' NOT NULL"
index 8d7281f..03a33f9 100644 (file)
 ]
 #SET{valeur,#ENV{valeur_forcee,#ENV{valeur}}|is_null|?{#ENV{defaut},#ENV{valeur_forcee,#ENV{valeur}}}}
 <div class="choix">
-       <input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{nom}|saisie_nom2classe)]_oui"[ (#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)checked="checked"] value="#ENV{valeur_oui,on}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
-       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_oui">[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)<strong>]<:item_oui:>[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)</strong>]</label>
+       <input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_oui"[ (#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)checked="checked"] value="#ENV{valeur_oui,on}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
+       <label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_oui"[(#GET{valeur}|=={#ENV{valeur_oui,on}}|oui)class="on"]><:item_oui:></label>
 </div>
 <div class="choix">
-       <input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{nom}|saisie_nom2classe)]_non"[ (#GET{valeur}|=={#ENV{valeur_non,''}}|ou{#GET{valeur}|non})checked="checked"] value="#ENV{valeur_non,''}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
-       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_non">[(#GET{valeur}|=={#ENV{valeur_non,''}}|ou{#GET{valeur}|non})<strong>]<:item_non:>[(#GET{valeur}|=={#ENV{valeur_non,''}}|ou{#GET{valeur}|non})</strong>]</label>
+       <input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_non"[ (#GET{valeur}|=={#ENV{valeur_non,''}}|ou{#GET{valeur}|non})checked="checked"] value="#ENV{valeur_non,''}" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
+       <label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_non"[(#GET{valeur}|=={#ENV{valeur_non,''}}|ou{#GET{valeur}|non})class="on"]><:item_non:></label>
 </div>
index 6f11db1..fe92a2e 100644 (file)
@@ -58,6 +58,20 @@ options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'input'
         options:
index e5d2976..c1c85b8 100644 (file)
@@ -13,7 +13,7 @@
        [(#SAISIE{pays, pays,
                label=<:plugin:info_pays:>})] 
 ]
-<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
 [(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
 <BOUCLE_pays(GEO_PAYS){par multi nom}>
        <option value="#ID_PAYS"[(#ID_PAYS|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#NOM</option>
index 8cfbf51..475524e 100644 (file)
@@ -14,7 +14,7 @@
                label=<:spa:couleur_foncee:>, 
                obligatoire=non})] 
 ]
-<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
        [(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
        <BOUCLE_police(POUR){tableau #VAL{polices/}|find_all_in_path{\w+\.ttf}}{par cle}>
                <option value="#CLE"[ (#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)selected="selected"]>#CLE</option>
index 5801fc0..569476e 100644 (file)
@@ -1,4 +1,4 @@
-<select name="#ENV{nom}" id="champ_#ENV{nom}">
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]">
        #SET{tab,#ENV{formulaire}}
        #SET{tab_par_nom,#ENV{formulaire}|saisies_lister_par_nom}
        #SET{padding,0}
index a8fdb47..7f63b89 100644 (file)
@@ -23,7 +23,7 @@
 
 <BOUCLE_radio(POUR){tableau #GET{datas}}>
 <div class="#ENV{choix,choix}[ (#ENV{choix,choix})_#CLE]">
-       <input type="radio" name="#ENV{nom}" class="radio" id='champ_[(#ENV{nom}|saisie_nom2classe)]_#COMPTEUR_BOUCLE'[ (#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)checked='checked'] value='#CLE' [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
-       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_#COMPTEUR_BOUCLE">[(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)<strong>]#VALEUR[(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)</strong>]</label>
+       <input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_#COMPTEUR_BOUCLE"[ (#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)checked="checked"] value="#CLE" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
+       <label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_#COMPTEUR_BOUCLE"[(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}|=={#CLE}|oui)class="on"]>#VALEUR</label>
 </div>
 </BOUCLE_radio>
index c898090..151f001 100644 (file)
@@ -67,6 +67,20 @@ options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'input'
         options:
index 824e3db..2083bfc 100644 (file)
@@ -16,7 +16,7 @@
                label=<:plugin:secteur_region:>,\r
                multiple=oui})] \r
 ]\r
-<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>\r
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>\r
        [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)\r
                <option value="">[(#ENV{option_intro})]</option>]\r
        <BOUCLE_secteurs(RUBRIQUES){racine}{par num titre, titre}{tout}>\r
index 4efb105..029e908 100644 (file)
@@ -71,6 +71,20 @@ options:
       nom: 'affichage'\r
       label: '<:saisies:option_groupe_affichage:>'\r
     saisies:\r
+      -\r
+        saisie: 'textarea'\r
+        options:\r
+          nom: 'afficher_si'\r
+          label: '<:saisies:option_afficher_si_label:>'\r
+          explication: '<:saisies:option_afficher_si_explication:>'\r
+          rows: 5\r
+      -\r
+        saisie: 'textarea'\r
+        options:\r
+          nom: 'afficher_si_remplissage'\r
+          label: '<:saisies:option_afficher_si_remplissage_label:>'\r
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'\r
+          rows: 5\r
       -\r
         saisie: 'input'\r
         options:\r
index 51dbc28..62c24fe 100644 (file)
@@ -16,7 +16,7 @@
   apres selection du document. L'id du document sera alors passe par URL.
 ]
 
-<input type="text" name="#ENV{nom}" class="text[ (#ENV{class})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ value="(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}})"][ size="(#ENV{size})"][ maxlength="(#ENV{maxlength})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#HTML5}|oui) required="required"] />
+<input type="text" name="#ENV{nom}" class="text[ (#ENV{class})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ value="(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}})"][ size="(#ENV{size})"][ maxlength="(#ENV{maxlength})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#HTML5}|oui) required="required"] />
 
 [(#REM) Si la mediatheque est presente ]
 [(#PLUGIN{medias}|oui)
index aedaa47..fe57d42 100644 (file)
@@ -11,7 +11,7 @@
 ]
 [(#SET{valeur,[(#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut,''}}})]})]
 [(#SET{langues,[(#VAL{changer_lang}|liste_options_langues{#GET{valeur}})]})]
-<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
 <BOUCLE_si_spip2(CONDITION){si (#GET{langues}|is_array|non)}>
 #GET{langues}
 </BOUCLE_si_spip2>
index 304b103..c95f355 100644 (file)
@@ -71,6 +71,20 @@ options:
       nom: 'affichage'\r
       label: '<:saisies:option_groupe_affichage:>'\r
     saisies:\r
+      -\r
+        saisie: 'textarea'\r
+        options:\r
+          nom: 'afficher_si'\r
+          label: '<:saisies:option_afficher_si_label:>'\r
+          explication: '<:saisies:option_afficher_si_explication:>'\r
+          rows: 5\r
+      -\r
+        saisie: 'textarea'\r
+        options:\r
+          nom: 'afficher_si_remplissage'\r
+          label: '<:saisies:option_afficher_si_remplissage_label:>'\r
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'\r
+          rows: 5\r
       -\r
         saisie: 'input'\r
         options:\r
index 79dafc2..5559bd1 100644 (file)
@@ -77,6 +77,20 @@ options:
       nom: 'affichage'\r
       label: '<:saisies:option_groupe_affichage:>'\r
     saisies:\r
+      -\r
+        saisie: 'textarea'\r
+        options:\r
+          nom: 'afficher_si'\r
+          label: '<:saisies:option_afficher_si_label:>'\r
+          explication: '<:saisies:option_afficher_si_explication:>'\r
+          rows: 5\r
+      -\r
+        saisie: 'textarea'\r
+        options:\r
+          nom: 'afficher_si_remplissage'\r
+          label: '<:saisies:option_afficher_si_remplissage_label:>'\r
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'\r
+          rows: 5\r
       -\r
         saisie: 'input'\r
         options:\r
index 371bf5c..1d295ea 100644 (file)
@@ -15,7 +15,7 @@ Par défaut ne liste que ceux des rubriques à la racine (secteurs)
   - valeur_forcee : valeur utilisee meme si une valeur est dans l'environnement\r
 \r
 ]\r
-<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ (#ENV*{attributs})]>\r
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ (#ENV*{attributs})]>\r
        [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)\r
                <option value="0">[(#ENV{option_intro})]</option>]\r
        <BOUCLE_secteurs(RUBRIQUES){racine}{par num titre, titre}{tout}>\r
index ff466e3..33cf777 100644 (file)
@@ -38,7 +38,7 @@
 [(#REM) Attention, la valeur ou la valeur forcée peut être une chaine vide. On doit donc tester avec is_null. ]
 #SET{valeur,#ENV{valeur_forcee}|is_null|?{#ENV{valeur}|is_null|?{#ENV{defaut},#ENV{valeur}},#ENV{valeur_forcee}}}
 
-<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size})"][ (#ENV*{attributs})]>
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size})"][ (#ENV*{attributs})]>
 [(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
 <BOUCLE_selection(POUR){tableau #GET{datas}}>
        <B_cond>
index 9a79b32..2b3590d 100644 (file)
@@ -28,7 +28,7 @@ options:
         options:
           nom: 'datas'
           label: '<:saisies:option_datas_label:>'
-          explication: '<:saisies:option_datas_explication:>'
+          explication: '<:saisies:option_datas_sous_groupe_explication:>'
           rows: 10
           cols: 50
       -
@@ -61,6 +61,20 @@ options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'input'
         options:
index 3121495..79be9d7 100755 (executable)
@@ -28,7 +28,7 @@
 [(#REM) valeur peut être une chaine (plusieurs valeurs ou pas) qu'on sait décomposer ]
 #SET{valeur, #ENV{valeur}|saisies_valeur2tableau}
 
-<select name="#ENV{nom}[]" id="champ_[(#ENV{nom}|saisie_nom2classe)]" multiple="multiple"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size,10})"][ (#ENV*{attributs})]>
+<select name="#ENV{nom}[]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]" multiple="multiple"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ size="(#ENV{size,10})"][ (#ENV*{attributs})]>
 [(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
 <BOUCLE_selection(POUR){tableau #GET{datas}}>
        <option value="#CLE" [(#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui) selected="selected"]>#VALEUR</option>
index ecaa51d..af489cd 100644 (file)
@@ -62,6 +62,20 @@ options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'input'
         options:
index d87d60b..750612d 100644 (file)
@@ -23,7 +23,7 @@
                                cle5,valeur2,
                                cle6,valeur3}}})] 
 ]
-<select name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+<select name="#ENV{nom}" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
 [(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
 <BOUCLE_groupes(POUR){tableau #ENV{datas}}>
        <optgroup label="[(#CLE|attribut_html)]">
index 56a84c6..f64480f 100644 (file)
@@ -19,7 +19,7 @@
                multiple=oui})]
 ]
 
-<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="[(#ENV{size,#ENV{afficher_tous}|?{4,3}})]"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
+<select name="#ENV{nom}[(#ENV{multiple}|?{[(#VAL{&#91;&#93;}|html_entity_decode)]})]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="[(#ENV{size,#ENV{afficher_tous}|?{4,3}})]"][ disabled="(#ENV{disable})"][ (#ENV*{attributs})]>
        [(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)
                <option value="">[(#ENV{option_intro})]</option>]
        [(#ENV{multiple}|oui)
index 182b2cd..9fcc607 100644 (file)
@@ -18,4 +18,4 @@
 [(#REM) Si la valeur est un tableau, le plugin sait le transformer en chaine, plutôt que d'afficher "Array" ]
 #SET{valeur, #ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}
 #SET{valeur, #GET{valeur}|is_array|?{(#GET{valeur}|saisies_tableau2chaine), #GET{valeur}}}
-<textarea name="#ENV{nom}" class="[(#ENV{class}) ][inserer_barre_(#ENV{inserer_barre}) ][(#ENV{previsualisation}|oui)inserer_previsualisation]" id="champ_[(#ENV{nom}|saisie_nom2classe)]" rows="[(#ENV{rows,20})]" cols="[(#ENV{cols,40})]"[ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#ENV{obligatoire}!={non}}|et{#HTML5}|oui) required="required"][ (#ENV*{attributs})]>#GET{valeur}</textarea>
+<textarea name="#ENV{nom}" class="[(#ENV{class}) ][inserer_barre_(#ENV{inserer_barre}) ][(#ENV{previsualisation}|oui)inserer_previsualisation]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]" rows="[(#ENV{rows,20})]" cols="[(#ENV{cols,40})]"[ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][(#ENV{obligatoire}|et{#ENV{obligatoire}!={non}}|et{#HTML5}|oui) required="required"][ (#ENV*{attributs})]>#GET{valeur}</textarea>
index e0cd046..35ab465 100644 (file)
@@ -59,6 +59,20 @@ options:
       nom: 'affichage'
       label: '<:saisies:option_groupe_affichage:>'
     saisies:
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si'
+          label: '<:saisies:option_afficher_si_label:>'
+          explication: '<:saisies:option_afficher_si_explication:>'
+          rows: 5
+      -
+        saisie: 'textarea'
+        options:
+          nom: 'afficher_si_remplissage'
+          label: '<:saisies:option_afficher_si_remplissage_label:>'
+          explication: '<:saisies:option_afficher_si_remplissage_explication:>'
+          rows: 5
       -
         saisie: 'input'
         options:
index ebb3496..365eb74 100644 (file)
 ]
 #SET{valeur,#ENV{valeur_forcee,#ENV{valeur}}|is_null|?{#ENV{defaut},#ENV{valeur_forcee,#ENV{valeur}}}}
 <div class="choix">
-       <input type="radio" name="#ENV{nom}" class="radio" id='champ_[(#ENV{nom}|saisie_nom2classe)]_true'[ (#GET{valeur}|=={true}|oui)checked='checked'] value='true' [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
-       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_true">[(#GET{valeur}|=={true}|oui)<strong>]<:item_oui:>[(#GET{valeur}|=={true}|oui)</strong>]</label>
+       <input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_true"[ (#GET{valeur}|=={true}|oui)checked="checked"] value="true" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
+       <label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_true"[(#GET{valeur}|=={true}|oui)class="on"]><:item_oui:></label>
 </div>
 <div class="choix">
-       <input type="radio" name="#ENV{nom}" class="radio" id='champ_[(#ENV{nom}|saisie_nom2classe)]_false'[ (#GET{valeur}|=={false}|oui)checked='checked'] value='false' [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
-       <label for="champ_[(#ENV{nom}|saisie_nom2classe)]_false">[(#GET{valeur}|=={false}|oui)<strong>]<:item_non:>[(#GET{valeur}|=={false}|oui)</strong>]</label>
+       <input type="radio" name="#ENV{nom}" class="radio" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_false"[ (#GET{valeur}|=={false}|oui)checked="checked"] value="false" [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] />
+       <label for="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_false"[(#GET{valeur}|=={false}|oui)class="on"]><:item_non:></label>
 </div>
index bccdea0..35a77de 100644 (file)
@@ -20,8 +20,23 @@ function saisies_affichage_final($flux){
                        $pi = $p; // si pas de <link inserer comme un goret entre 2 <li> de saisies\r
                $css = generer_url_public('saisies.css');\r
                $ins_css = "\n<link rel='stylesheet' href='$css' type='text/css' media='all' />\n";\r
-               $flux = substr_replace($flux, $ins_css, $pi, 0);\r
-               \r
+\r
+               if (strpos($flux,"saisie_date")!==false){//si on a une saisie de type date, on va charger les css de jquery_ui\r
+                   include_spip("jqueryui_pipelines");\r
+                       if (function_exists("jqueryui_dependances")){\r
+                               $ui_plugins = jqueryui_dependances(array("jquery.ui.datepicker"));\r
+                       \r
+                               array_push($ui_plugins,"jquery.ui.theme");\r
+                               foreach ($ui_plugins as $ui_plug){\r
+                                       $ui_plug_css = find_in_path("css/$ui_plug.css");\r
+                                       if (strpos($flux,"css/$ui_plug.css")===false){// si pas déjà chargé\r
+                                       $ins_css .= "\n<link rel='stylesheet' href='$ui_plug_css' type='text/css' media='all' />\n";\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               $flux = substr_replace($flux, $ins_css, $pi, 0);                \r
                // On insère le JS à la fin du <head>\r
                $pos_head = strpos($flux, '</head');\r
                $js = find_in_path('javascript/saisies.js');\r
index 87cc17d..bc5ba39 100644 (file)
@@ -1,10 +1,10 @@
 <svn_revision>
 <text_version>
 Origine: file:///home/svn/repository/spip-zone/_plugins_/saisies
-Revision: 73152
-Dernier commit: 2013-06-01 05:45:11 +0200 
+Revision: 81214
+Dernier commit: 2014-03-05 22:00:09 +0100 
 </text_version>
 <origine>file:///home/svn/repository/spip-zone/_plugins_/saisies</origine>
-<revision>73152</revision>
-<commit>2013-06-01 05:45:11 +0200 </commit>
+<revision>81214</revision>
+<commit>2014-03-05 22:00:09 +0100 </commit>
 </svn_revision>
\ No newline at end of file