[PLUGINS] +multilangue
authorLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Wed, 19 Jun 2013 06:32:40 +0000 (08:32 +0200)
committerLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Wed, 19 Jun 2013 06:32:40 +0000 (08:32 +0200)
38 files changed:
www/plugins/multilang/alire.txt [new file with mode: 0644]
www/plugins/multilang/formulaires/configurer_multilang.html [new file with mode: 0644]
www/plugins/multilang/formulaires/configurer_multilang_fonctions.php [new file with mode: 0644]
www/plugins/multilang/images/background.png [new file with mode: 0644]
www/plugins/multilang/images/multi_forbidden.png [new file with mode: 0644]
www/plugins/multilang/images/multi_undefined.png [new file with mode: 0644]
www/plugins/multilang/images/multilang-16.png [new file with mode: 0644]
www/plugins/multilang/images/multilang-24.png [new file with mode: 0644]
www/plugins/multilang/images/multilang-32.png [new file with mode: 0644]
www/plugins/multilang/images/multilang-48.png [new file with mode: 0644]
www/plugins/multilang/javascript/multilang.js [new file with mode: 0644]
www/plugins/multilang/javascript/multilang_init.js.html [new file with mode: 0644]
www/plugins/multilang/javascript/multilang_init.js_fonctions.php [new file with mode: 0644]
www/plugins/multilang/javascript/multilang_lang.js.html [new file with mode: 0644]
www/plugins/multilang/lang/multilang.xml [new file with mode: 0644]
www/plugins/multilang/lang/multilang_en.php [new file with mode: 0644]
www/plugins/multilang/lang/multilang_es.php [new file with mode: 0644]
www/plugins/multilang/lang/multilang_fa.php [new file with mode: 0644]
www/plugins/multilang/lang/multilang_fr.php [new file with mode: 0644]
www/plugins/multilang/lang/multilang_sk.php [new file with mode: 0644]
www/plugins/multilang/lang/paquet-multilang.xml [new file with mode: 0644]
www/plugins/multilang/lang/paquet-multilang_en.php [new file with mode: 0644]
www/plugins/multilang/lang/paquet-multilang_es.php [new file with mode: 0644]
www/plugins/multilang/lang/paquet-multilang_fr.php [new file with mode: 0644]
www/plugins/multilang/lang/paquet-multilang_it.php [new file with mode: 0644]
www/plugins/multilang/lang/paquet-multilang_ru.php [new file with mode: 0644]
www/plugins/multilang/lang/paquet-multilang_sk.php [new file with mode: 0644]
www/plugins/multilang/multilang.css.html [new file with mode: 0644]
www/plugins/multilang/multilang.js.html [new file with mode: 0644]
www/plugins/multilang/multilang_administrations.php [new file with mode: 0644]
www/plugins/multilang/multilang_pipelines.php [new file with mode: 0644]
www/plugins/multilang/paquet.xml [new file with mode: 0644]
www/plugins/multilang/prive/squelettes/contenu/configurer_multilang.html [new file with mode: 0644]
www/plugins/multilang/prive/squelettes/contenu/configurer_multilangue.html [new file with mode: 0644]
www/plugins/multilang/prive/style_prive_plugin_multilang.html [new file with mode: 0644]
www/plugins/multilang/prive/themes/spip/images/multilang-16.png [new file with mode: 0644]
www/plugins/multilang/prive/themes/spip/images/multilang-24.png [new file with mode: 0644]
www/plugins/multilang/svn.revision [new file with mode: 0644]

diff --git a/www/plugins/multilang/alire.txt b/www/plugins/multilang/alire.txt
new file mode 100644 (file)
index 0000000..05e8bb7
--- /dev/null
@@ -0,0 +1,71 @@
+\r
+Tous les champs input:text et textarea sauf ceux des forms .form_upload et .form_upload_icon sont traites dans :\r
+- articles\r
+- rubriques\r
+- configuration du site\r
+- auteurs (interessant uniquement pour le champs BIO)\r
+- documents dans les colonnes de gauche des pages d'edition d'articles et de rubriques\r
+- documents dans les parties basses des pages de presentation des articles et rubriques\r
+- groupe de mots cles\r
+- mots cles\r
+- sites\r
+- Breves\r
+\r
+\r
+A faire :\r
+- F&T : pb de doublon avec forms_lang.js\r
+- Integration avec Porte-Plume : quand on change de langue, la previsu "Voir" ne bascule pas\r
+\r
+- Suggestion de RastaPopoulos : J'avais une idée supplémentaire pour que ce soit extensible : activer également ce système sur tous les champs ayant une classe "multilang". Fait, a tester avec class "multilang"\r
+\r
+Trucs a regler :\r
+1.-------------\r
+Avec Mediatheque, l'init est rappelee grace au onAjaxLoad. Et affiche bien le menu lang dans la modale. Mais un 2e menu est aussi rajoute dans le doc principal sous la modale de mediatheque... De meme quand on ferme la modale, on repasse par l'init... Et on se retrouve avec un 3e menu. J'ai donc interdit la creation d'un menu s'il en existe deja un dans la div :\r
+fct forms_init_multi :\r
+               if(!container.find('.menu_lang').size())\r
+                       container.prepend("<div class='menu_lang'>");\r
+et supprime le test de la fonction d'init (qui est un peu bourrin de toute facon):\r
+       //if(multilang_root.find('.menu_lang').length > 0) return;\r
+\r
+Premier bug : Dans une page d'edition article ou rubrique, si on modifie le doc + enregistrer le doc, PUIS enregistrer l'article (ou la rubrique) on passe 2 fois dans le submit et les champs ont la structure multi en double\r
+\r
+Solution : \r
+function forms_attach_submit() {\r
+       if($(this).parents('.ajax').size() && $(this).find('input[name=var_ajax]')){\r
+               $(this).bind('form-pre-serialize',forms_multi_submit);\r
+       }else{\r
+               var oldsubmit = this.onsubmit;\r
+               this.onsubmit = "";\r
+               if(oldsubmit && oldsubmit != "")\r
+                       $(this).submit(function(){forms_multi_submit.apply(this);return oldsubmit.apply(this);})\r
+               else\r
+                       if(oldsubmit != "")$(this).submit(forms_multi_submit);\r
+       }\r
+}\r
+Ca marche mais je ne pige pas bien...  En fait quand on charge la page d'edition, le this.onsubmit est undefined et on rajoute une action sur le submit : forms_multi_submit . Lors du 2e passage (onAjaxLoad), le this.onsubmit vaut "" et on rajoutait une 2e fois le forms_multi_submit... Mais pourquoi une chaine vide ?\r
+\r
+Avec ou sans mediatheque, donc maintenant ca fonctionne\r
+\r
+2.---------------\r
+Dans le pipeline, j'ai rajoute un 2e passage par l'init pour la suggestion de Rasta :\r
+forms_selector = $(".multilang").parents("form")\r
+multilang_init_lang({fields:".multilang",forms:forms_selector});\r
+du coup, y'a pas de root de defini, donc le multilang agit sur tout le document\r
+\r
+Effet, le le menu lang s'affiche bien, mais ne fonctionne plus\r
+\r
+En fait faut pas passer 2 fois dans la fonction d'init. Ce n'est pas prevu pour. Donc faut tout integrer en un appel :\r
+\r
+       jQuery(document).ready(function(){\r
+               function multilang_init(){\r
+                       root = "'.$root.'" ;\r
+                       fields_selector = "textarea,input:text:not(input#id_parent,input.password,input#new_login,#titreparent,*.nomulti),.multilang" ;\r
+                       forms_selector = ".multilang:parent,form[class!=\'form_upload\'][class!=\'form_upload_icon\']" ;\r
+                       multilang_init_lang({fields:fields_selector,root:root,forms:forms_selector});\r
+               }\r
+               multilang_init();\r
+               if(typeof onAjaxLoad == "function") onAjaxLoad(multilang_init);\r
+       });\r
+\r
+Bon donc ca marche toujours avec ou sans mediatheque... Reste plus qu'a tester avec un plugin qui veut du multilang\r
+       \r
diff --git a/www/plugins/multilang/formulaires/configurer_multilang.html b/www/plugins/multilang/formulaires/configurer_multilang.html
new file mode 100644 (file)
index 0000000..1cf4c1e
--- /dev/null
@@ -0,0 +1,72 @@
+<div class="formulaire_spip formulaire_configurer formulaire_#FORM">\r
+\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
+\r
+   <form method="post" action="#ENV{action}">\r
+   <div>\r
+      #ACTION_FORMULAIRE{#ENV{action}}\r
+\r
+      <ul>\r
+         <li class="fieldset">\r
+            <fieldset>\r
+               <h3 class="legend"><:multilang:cfg_activer:></h3>\r
+               <ul>\r
+                  [(#SAISIE{oui_non,siteconfig,\r
+                     label=<:multilang:cfg_lbl_siteconfig:>,\r
+                     defaut=on}\r
+                  )]\r
+                  #SET{defaut_on,#LISTE{rubrique,auteur,document}}\r
+                  <BOUCLE_objets(DATA){source tableau,#REM|lister_tables_objets_sql}>\r
+                  [(#VALEUR{editable}|=={oui}|oui)\r
+                       [(#SET{name,[(#CLE|objet_type)]})]\r
+                       [(#SET{label,[(#VALEUR{texte_objets}|_T)]})]\r
+                                       [(#SAISIE{oui_non,#GET{name},\r
+                            label=#GET{label},\r
+                            defaut=''})]\r
+                                       ]</BOUCLE_objets>\r
+                  \r
+                                 [(#PLUGIN{agenda}|oui)\r
+                                         [(#SAISIE{oui_non,evenement,\r
+                            label=<:multilang:cfg_lbl_evenement:>,\r
+                            defaut=''}\r
+                         )]\r
+                                 ]\r
+                                 [(#PLUGIN{gis}|oui)\r
+                                         [(#SAISIE{oui_non,gis,\r
+                            label=<:multilang:cfg_lbl_gis:>,\r
+                            defaut=''}\r
+                         )]\r
+                                 ]\r
+                                 [(#SAISIE{oui_non,multilang_public,\r
+                     label=<:multilang:cfg_lbl_espace_public:>,\r
+                     defaut=off}\r
+                  )]\r
+                                 [(#SAISIE{oui_non,multilang_crayons,\r
+                     label=<:multilang:cfg_lbl_crayons:>,\r
+                                        explication=<:multilang:cfg_explication_crayons:>,\r
+                     defaut=''}\r
+                  )]\r
+               </ul>\r
+            </fieldset>\r
+         </li>\r
+         <li class="fieldset">\r
+                       <fieldset>\r
+                               <h3 class="legend"><:multilang:cfg_langues:></h3>\r
+                               [(#SET{langues,[(#CONFIG{langues_multilingue}|explode{','}|multilang_nommer_langues)]})]\r
+                               [(#SAISIE{selection_multiple,langues_utilisees,\r
+                                       label=<:multilang:label_langues_utilisees:>,\r
+                                       explication=<:multilang:explication_langues_utilisees:>,\r
+                                       cacher_option_intro=oui,\r
+                                       datas=#GET{langues},\r
+                                       size=[(#GET{langues}|count|>{10}|?{10,#GET{langues}|count})]})]\r
+                       </fieldset>\r
+               </li>\r
+      </ul>\r
+\r
+      <p class="boutons">\r
+         <input type="submit" name="_cfg_ok" class="submit" value="<:bouton_enregistrer:>" />\r
+      </p>\r
+   </div>\r
+   </form>\r
+</div>\r
diff --git a/www/plugins/multilang/formulaires/configurer_multilang_fonctions.php b/www/plugins/multilang/formulaires/configurer_multilang_fonctions.php
new file mode 100644 (file)
index 0000000..78bf5d1
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+function multilang_nommer_langues($langues=array()){
+       if(!is_array($langues) || count($langues) <= 1){
+               return false;
+       }
+       sort($langues);
+       foreach ($langues as $l => $langue) {
+               $langues[$langue] = traduire_nom_langue($langue);
+               unset($langues[$l]);
+       }
+       return $langues;
+}
+?>
\ No newline at end of file
diff --git a/www/plugins/multilang/images/background.png b/www/plugins/multilang/images/background.png
new file mode 100644 (file)
index 0000000..70bb7dc
Binary files /dev/null and b/www/plugins/multilang/images/background.png differ
diff --git a/www/plugins/multilang/images/multi_forbidden.png b/www/plugins/multilang/images/multi_forbidden.png
new file mode 100644 (file)
index 0000000..fa5cabd
Binary files /dev/null and b/www/plugins/multilang/images/multi_forbidden.png differ
diff --git a/www/plugins/multilang/images/multi_undefined.png b/www/plugins/multilang/images/multi_undefined.png
new file mode 100644 (file)
index 0000000..1dabe73
Binary files /dev/null and b/www/plugins/multilang/images/multi_undefined.png differ
diff --git a/www/plugins/multilang/images/multilang-16.png b/www/plugins/multilang/images/multilang-16.png
new file mode 100644 (file)
index 0000000..78abc66
Binary files /dev/null and b/www/plugins/multilang/images/multilang-16.png differ
diff --git a/www/plugins/multilang/images/multilang-24.png b/www/plugins/multilang/images/multilang-24.png
new file mode 100644 (file)
index 0000000..11e6ed4
Binary files /dev/null and b/www/plugins/multilang/images/multilang-24.png differ
diff --git a/www/plugins/multilang/images/multilang-32.png b/www/plugins/multilang/images/multilang-32.png
new file mode 100644 (file)
index 0000000..d7b88d0
Binary files /dev/null and b/www/plugins/multilang/images/multilang-32.png differ
diff --git a/www/plugins/multilang/images/multilang-48.png b/www/plugins/multilang/images/multilang-48.png
new file mode 100644 (file)
index 0000000..fc2db8e
Binary files /dev/null and b/www/plugins/multilang/images/multilang-48.png differ
diff --git a/www/plugins/multilang/javascript/multilang.js b/www/plugins/multilang/javascript/multilang.js
new file mode 100644 (file)
index 0000000..72f0fb7
--- /dev/null
@@ -0,0 +1,646 @@
+/**\r
+ * multilang\r
+ *\r
+ * Copyright (c) 2006-2010 Renato Formato (rformato@gmail.com)\r
+ * Licensed under the GPL License:\r
+ *   http://www.gnu.org/licenses/gpl.html\r
+ *\r
+ * Modif Yffic mars 2010\r
+ * - Correction bug : Fonctionnement incoherent si plusieurs menu dans la meme page (ex : portfolio dans page de\r
+ *   presentation d'un article)\r
+ * - On ne rajoute pas le menu s'il existe deja (cas d'un retour Ajax)\r
+ * - On ne rajoute pas le menu dans forms d'upload (par ex vignette d'un doc)\r
+ */\r
+\r
+\r
+var multilang_containers={}, //menu containers\r
+    multilang_forms_fields={};\r
+\r
+/*\r
+(?:\[([a-z_]+)\]|^[\s\n]*)\r
+[lang] or white space\r
+\r
+((?:.|\n)*?)\r
+all chars not greedy\r
+\r
+(?=\[[a-z_]+\]|$)\r
+[lang] or end string\r
+*/\r
+\r
+/**\r
+ * Initialisation de différentes variables :\r
+ *\r
+ */\r
+var multilang_match_multi = /(?:\[([a-z_]+)\]|^[\s\n]*)((?:.|\n|\s)*?)(?=\[[a-z_]+\]|$)/ig;\r
+var multilang_jq_root, //root of the search (jQuery object)\r
+    multilang_root_opt,\r
+    multilang_fields_selector,\r
+    multilang_fields_selector_opt,\r
+    multilang_menu_selector,\r
+    multilang_containers,\r
+    multilang_forms_toadd,\r
+    multilang_forms, //forms to be processed (jQuery object)\r
+    multilang_menu_lang, //template of the menu (jQuery object)\r
+    multilang_forms_selector, //selector of the forms to be processed (string)\r
+    multilang_init = false;\r
+\r
+/**\r
+ * options is a hash having the following values:\r
+ * - fields (mandatory): a jQuery selector to set the fields that have to be internationalized.\r
+ * - page (optional): a string to be searched in the current url. if found the plugin is applied.\r
+ * - root (optional): the root element of all processing. Default value is 'document'. To speed up search\r
+ * - forms (optional): a jQuery selector to set the forms that have to be internationalized. Default value is 'form'.\r
+ * - main_menu (optional): a jQuery selector to set the container for the main menu to control all the selected forms.\r
+ * - form_menu (optional): a jQuery selector to set the container for the form menus.\r
+ */\r
+function multilang_init_lang(options) {\r
+       var init_done = options.init_done || multilang_init;\r
+       //Detect if we're on the right page and if multilinguism is activated. If not return.\r
+       if((options.page && window.location.search.indexOf(options.page)==-1) || multilang_avail_langs.length<=1) return;\r
+       \r
+       //set the root element of all processing\r
+\r
+       var root = options.root || document;\r
+       multilang_jq_root = $(root).add($(options.root_opt).parent());\r
+       multilang_root_opt = options.root_opt;\r
+\r
+       /**\r
+        * set the main menu element\r
+        * Plus utilisé pour l'instant\r
+        */\r
+       multilang_containers = options.main_menu ? $(options.main_menu,multilang_jq_root) : $([]);\r
+\r
+       multilang_forms_toadd = $([]);\r
+\r
+       /**\r
+        * On crée le modèle du menu de langue\r
+        * C'est ce modèle qui est cloné au début de chaque formulaire\r
+        */\r
+       multilang_menu_lang = $("<div class='langues'></div>");\r
+       $.each(multilang_avail_langs,function() {\r
+               var title = 'multilang_lang.title_lien_multi_'+this;\r
+               multilang_menu_lang.append($("<a class='change_lang "+this+"' title='"+eval(title)+"'></a>").html("["+this+"]"));\r
+       });\r
+       multilang_menu_lang.append($("<a class='recover_lang' href='#'></a>").html("["+multilang_lang.lien_desactiver+"]"));\r
+\r
+       //init fields\r
+       multilang_fields_selector = options.fields;\r
+       multilang_fields_selector_opt = options.fields_opt;\r
+\r
+       //store all the internationalized forms\r
+       multilang_forms_selector = options.forms || "form";\r
+\r
+       if(init_done){\r
+               multilang_forms_toadd = $(multilang_forms_selector,multilang_jq_root).not($(multilang_forms));\r
+       }\r
+       multilang_forms = $(multilang_forms_selector,multilang_jq_root);\r
+       if(!init_done)\r
+               multilang_forms_toadd = multilang_forms;\r
+\r
+       //create menu lang for the global form\r
+       if(multilang_containers.size())\r
+               multilang_make_menu_lang(multilang_containers);\r
+       multilang_menu_selector = options.form_menu;\r
+\r
+       multilang_init = true;\r
+\r
+       // Modif Yffic : On va pas plus loin s'il n'y a pas de form\r
+       if(multilang_forms_toadd.size()) multilang_init_multi();\r
+\r
+}\r
+\r
+/**\r
+ * Initialisation des champs multi sur les formulaires\r
+ *\r
+ * @param options\r
+ * @return\r
+ */\r
+function multilang_init_multi(options) {\r
+       var target = options ? options.target : null;\r
+       var init_forms;\r
+       //Update the list of form if this is an update\r
+       if(target) {\r
+               //Verify the target is really a form to be internationalized (in case of an ajax request fired by onAjaxLoad)\r
+               if(target==document) return;\r
+               init_forms = $(target).find('form').in_set($(multilang_forms_selector,multilang_jq_root));\r
+               if(!init_forms.length) return;\r
+               multilang_forms.add(init_forms.each(multilang_attach_submit).get());\r
+       } else {\r
+               //attach multi processing to submit event\r
+               init_forms = multilang_forms_toadd;\r
+               multilang_forms_toadd.each(multilang_attach_submit);\r
+       }\r
+\r
+       multilang_forms_fields = {};\r
+       multilang_forms_fields["undefined"] = $(multilang_fields_selector,multilang_forms);\r
+       //init the value of the field to current lang\r
+       //add a container for the language menu inside the form\r
+       init_forms.each(function() {\r
+               /*\r
+                * Je ne sais pas à quoi cela sert particulièrement, désactivé pour l'instant\r
+                */\r
+               //$(this).find('input[type=submit],button').click(function(){\r
+                       //multilang_multi_submit.apply($(this).parents('form').get(0));\r
+                       //$(this).parents('form').submit();\r
+                       //return false;\r
+               //});\r
+               this.isfull = false;\r
+               this.form_lang = multilang_def_lang;\r
+               var container = multilang_menu_selector ? $(multilang_menu_selector,this) : $(this);\r
+               // Pas de rajout s'il y en deja un\r
+               if(!container.find('.menu_multilang').size())\r
+                       container.prepend("<div class='menu_multilang'></div>");\r
+       });\r
+\r
+       /**\r
+        * Initialisation de chaque input ou textarea\r
+        * On vérifie si on est dans un formulaire optionnel (dans ce cas on ne prend que\r
+        * les éléments qui on la class optionnelle) sinon on prend tous les champs qui\r
+        * matchent\r
+        */\r
+       $(multilang_fields_selector,init_forms).each(function(){\r
+           var me = $(this);\r
+           if(me.closest(multilang_root_opt).length){\r
+               if(me.is(multilang_fields_selector_opt))\r
+                       multilang_init_field(this,this.form.form_lang);\r
+           }else{\r
+                       multilang_init_field(this,this.form.form_lang);\r
+               }\r
+       });\r
+       //create menu for each form. The menu is just before the form\r
+       $("div.menu_multilang",init_forms).empty().each(function() {\r
+               //store all form containers to allow menu lang update on each container\r
+               //when it is triggered by global menu\r
+               multilang_containers.add(this);\r
+               multilang_make_menu_lang($(this),$(this).parents("form"));\r
+       });\r
+}\r
+\r
+/**\r
+ * Création du menu de langue\r
+ * Liste les langues disponibles et ajoute un lien pour désactiver multilang\r
+ *\r
+ * @param container\r
+ * @param target\r
+ * @return\r
+ */\r
+function multilang_make_menu_lang(container,target) {\r
+       target = target || multilang_forms;\r
+       $(multilang_menu_lang).clone().find("a").click(function() {\r
+               if($(this).is('.change_lang') && !$(this).is('.on')){\r
+                       $(this).parents('form > .menu_multilang').find('a.on').removeClass('on');\r
+                       $(this).parents('form > .menu_multilang').find('.multilang_message').detach();\r
+                       $(this).parents('form').find('li.editer_titre_numero,div.editer_titre_numero').show();\r
+                       $(this).addClass('on');\r
+                       multilang_change_lang(this,container,target);\r
+               }else if(!$(this).is('.on') && $(this).is('.recover_lang')){\r
+                       $(this).parents('form > .menu_multilang').find('a.on').removeClass('on');\r
+                       $(this).parents('form > .menu_multilang').append('<div class="multilang_message"><p>'+multilang_lang.champs_readonly+'<\/p><\/div>');\r
+                       $(this).parents('form').find('li.editer_titre_numero,div.editer_titre_numero').hide();\r
+                       $(this).addClass('on');\r
+                       multilang_multi_recover(this,container,target,'submit');\r
+               }\r
+               return false;\r
+       }).end().appendTo(container);\r
+       $(target).find('.menu_multilang .langues a').eq(0).addClass('on');\r
+\r
+       var target_id = multilang_init_target_id(target);\r
+       multilang_forms_fields[target_id].each(function(){\r
+               multilang_save_lang(this,this.form.form_lang);\r
+       });\r
+       // Maj du menu de langues\r
+       multilang_mark_empty_langs(container,target);\r
+}\r
+\r
+/**\r
+ * Initialise target_id\r
+ *\r
+ * @param target Le formulaire\r
+ * @return\r
+ */\r
+function multilang_init_target_id(target){\r
+       var target_id = target != multilang_forms ? jQuery.data(target[0]) : "undefined";\r
+       multilang_forms_fields[target_id] = $(multilang_fields_selector,target);\r
+       return(target_id);\r
+}\r
+\r
+/**\r
+ * Affiche le contenu complet du champ\r
+ * Utilisé lors de la désactivation de multilang et de la validation des formulaires\r
+ *\r
+ * @param el Le lien de désactivation\r
+ * @param container Le container du formulaire\r
+ * @param target Le formulaire\r
+ * @return\r
+ */\r
+function multilang_multi_recover(el,container,target,event){\r
+       if(target[0].isfull){\r
+               return true;\r
+       }\r
+       if(event == 'submit'){\r
+               lang = 'full';\r
+               var target_id = multilang_init_target_id(target);\r
+               target[0].isfull = true;\r
+               multilang_forms_fields[target_id].each(function(){\r
+                       if(!this.totreat) return ;\r
+                       //save data before submit\r
+                       multilang_save_lang(this,this.form.form_lang);\r
+                       //build the string value\r
+                       multilang_field_set_background(this,lang);\r
+                       if(container && target){\r
+                               multilang_mark_empty_langs(container,target);\r
+                       }\r
+                       var def_value = this.field_lang[multilang_def_lang];\r
+                       if(!this.multi)\r
+                               this.value = (def_value==undefined?"":def_value);\r
+                       else {\r
+                               var value="",count=0;\r
+                               $.each(this.field_lang,function(name){\r
+                                       if((name != 'full') && (this.length > 0)){\r
+                                               //save default lang value and other lang values if different from the default one\r
+                                               if(name == multilang_def_lang){\r
+                                                       value = "["+name+"]"+this+value;\r
+                                                       count++;\r
+                                               }else if(this!=def_value) {\r
+                                                       value += "["+name+"]"+this;\r
+                                                       count++;\r
+                                               }\r
+                                       }\r
+                               });\r
+                               this.value = (count > 1 ? "<multi>"+value+"</multi>":value.replace(/^\[[a-z_]+\]/,''));\r
+                       }\r
+                       // Add the title number to the final value\r
+                       if(multilang_is_title(this) && ($('#'+this.id+'_numero').val() != ''))\r
+                               this.value= $('#'+this.id+'_numero').val().replace(/\.|\s+/,'') + ". " + this.value;\r
+               });\r
+               return true;\r
+       }\r
+}\r
+\r
+/**\r
+ * Défini si un id de champ correspond a un champ "numerotable"\r
+ *\r
+ * @param id chaine correspondant a l'id du champ\r
+ */\r
+function multilang_is_title(el) {\r
+       return (el.id=='titre' || el.id=='champ_titre' || (el.id=='nom_site' && ($(el).parents('#configurer-accueil,.formulaire_configurer_identite,.formulaire_editer_auteur').size() < 1)) || el.id.match(/^titre_document[0-9]+/)!=null || el.name.match(/^content_[a-z0-9_]+_titre/)!=null || el.name.match(/^content_[a-z0-9_-]+nom_/)!=null)\r
+}\r
+\r
+/**\r
+ * Initialisation du script sur un champ\r
+ *\r
+ * Récupère les données suivantes\r
+ * - Le contenu de l'élément du champ\r
+ * - Le booléen (true/false) multi (est ce un champs déjà multi)\r
+ * - Les différentes chaines de langue dans un objet :\r
+ * {fr="texte fr",en="texte en",full="<multi>[fr]texte fr[en]texte en</multi>"}\r
+ * Si le champ est déjà initialisé, fait un simple return\r
+ *\r
+ * @param el Le champ a initialiser\r
+ * @param lang La langue\r
+ *\r
+ */\r
+function multilang_init_field(el,lang,force) {\r
+       if(el.field_lang && !force) return;\r
+       var langs;\r
+       \r
+       // On enlève les espaces, retours à la ligne et tabulations de début et de fin de chaine\r
+       el.value.replace(/(?:^\s+|\s+$)/g, "");\r
+       \r
+       // Modif Yffic : ne pas considerer comme multi les champs qui contiennent du texte\r
+       // en dehors des multi sauf un numero (\d+\.\s+)\r
+       var m = el.value.match(/(\d+\.\s+)?<multi>((?:.|\n|\s)*?)<\/multi>(.|\n*)/);\r
+       el.field_lang = {};\r
+       el.field_pre_lang = ""; //this is the 01. part of the string, the will be put outside the <multi>\r
+       el.titre_el = $("#titre_"+el.id);\r
+       \r
+       // Init the elements to treat\r
+       if(m!=null) {\r
+               if( m.index || (m[3]!=undefined && m[3]!="")){\r
+                       $(el).addClass('multi_lang_broken');\r
+                       el.totreat=false;\r
+               }\r
+               else\r
+                       el.totreat=true;\r
+               if(el.totreat) {\r
+                       el.field_pre_lang = m[1] || "";\r
+                       // Suppress point and spaces\r
+                       el.field_pre_lang = el.field_pre_lang.replace(/\.|\s+/,'') ;\r
+                       el.multi = true;\r
+                       multilang_match_multi.lastIndex=0;\r
+                       el.field_lang['full'] = el.value;\r
+                       while((langs=multilang_match_multi.exec(m[2]))!=null) {\r
+                               var text = langs[2].match(/^(\d+\.\s+)((?:.|\n|\s)*)/), value;\r
+                               // Suppression du numero uniquement pour les titres\r
+                               if(multilang_is_title(el) && text!=null) {\r
+                                       value = text[2];\r
+                                       // Suppress point and spaces\r
+                                       el.field_pre_lang = text[1].replace(/\.|\s+/,'') || "";\r
+                               } else {\r
+                                       value = langs[2];\r
+                               }\r
+                               el.field_lang[langs[1]||multilang_def_lang] = value;\r
+                       }\r
+               }\r
+       } else {\r
+               el.multi = false;\r
+               el.totreat=true;\r
+\r
+               // Suppression du numero uniquement pour les titres\r
+               if(multilang_is_title(el)) {\r
+                       var n = el.value.match(/(\d+\.\s+)?(.*)/);\r
+                       el.field_pre_lang = n[1] || "";\r
+                       el.field_pre_lang = el.field_pre_lang.replace(/\.|\s+/,'') ;\r
+                       el.field_lang[multilang_def_lang] = n[2];\r
+               } else\r
+                       el.field_lang[multilang_def_lang] = el.value;\r
+       }\r
+\r
+       // Put the current lang string only in the field\r
+       multilang_set_lang(el,lang);\r
+\r
+       /**\r
+        * Si le champ est un titre, on ajoute un champ facultatif "numéro" au formulaire permettant\r
+        * de traiter le cas où l'on utilise les numéros pour trier les objets\r
+        * Ajout d'Yffic le 30/03/2010\r
+        */\r
+       if(!force && multilang_is_title(el)){\r
+               numid=el.id+'_numero';\r
+               /**\r
+                * Cas des crayons qui n'ont pas toujours de formalisme en ul > li\r
+                */\r
+               if(el.name.match(/^content_[a-z0-9_]+_titre/)){\r
+                       if($(el).parent().is('li'))\r
+                               $(el).parent()\r
+                                       .before('<li class="editer_'+numid+'"><label for="titre_numero">'+multilang_lang.numero+'</label><input id="'+numid+'" name="titre_numero" type="text" value="'+el.field_pre_lang+'" size="4" class="text nomulti" /></li>');\r
+                       else\r
+                               $(el)\r
+                                       .before('<div class="editer_titre_numero"><label for="titre_numero">'+multilang_lang.numero+'</label><input id="'+numid+'" name="titre_numero" type="text" value="'+el.field_pre_lang+'" size="4" class="text nomulti" /><br /><br /></div>');\r
+               }else\r
+                       $(el).parent()\r
+                               .before('<li class="editer_'+numid+'"><label for="titre_numero">'+multilang_lang.numero+'</label><input id="'+numid+'" name="titre_numero" type="text" value="'+el.field_pre_lang+'" size="4" class="text nomulti" /></li>');\r
+               $('#'+numid).totreat = false;\r
+       }\r
+}\r
+\r
+/**\r
+ * Action au click sur une langue du menu de langue\r
+ *\r
+ * @param el Le lien cliqué sur le menu\r
+ * @param container Le conteneur du formulaire\r
+ * @param target Le formulaire lui même\r
+ *\r
+ */\r
+function multilang_change_lang(el,container,target) {\r
+       var added_lang="";\r
+       var target_id = multilang_init_target_id(target);\r
+       var lang = el.innerHTML;\r
+\r
+       lang = lang.slice(1,-1);\r
+\r
+       if(target[0].isfull){\r
+               // Maj du menu de langues avant multilang_init_field\r
+               multilang_forms_fields[target_id].each(function(){\r
+                       var me = $(this);\r
+                       if(me.parents(multilang_root_opt).size()>0){\r
+                       if(me.is(multilang_fields_selector_opt))\r
+                               multilang_init_field(this,lang,true);\r
+                   }else\r
+                       multilang_init_field(this,lang,true);\r
+               });\r
+               target[0].isfull = false;\r
+       }else{\r
+               //store the fields inputs for later use (usefull for select)\r
+               //save the current values\r
+               multilang_forms_fields[target_id].each(function(){\r
+                       multilang_save_lang(this,this.form.form_lang);\r
+               });\r
+               // Maj du menu de langues apres multilang_save_lang\r
+       }\r
+\r
+       //change current lang\r
+       target.each(function(){this.form_lang = lang});\r
+\r
+       //reinit fields to current lang\r
+       multilang_forms_fields[target_id].each(function(){\r
+               multilang_set_lang(this,lang);\r
+       });\r
+       \r
+       multilang_mark_empty_langs(container,target);\r
+}\r
+\r
+/**\r
+ * Marquer dans le menu des langues, celles pour lesquelles\r
+ * au moins un champ multi du formulaire n'est pas renseigne\r
+ *\r
+ * @param container Le conteneur du formulaire\r
+ *\r
+ */\r
+function multilang_mark_empty_langs(container,target) {\r
+       var langs_empty = [];\r
+       var target_id = multilang_init_target_id(target);\r
+\r
+       multilang_forms_fields[target_id].each(function(){\r
+               var field_langs = [];\r
+               // Mise sous forme de tableau\r
+               if(typeof(this.field_lang) != 'undefined'){\r
+                       $.each(this.field_lang,function(name,value){\r
+                               if(value)\r
+                                       field_langs.push(name);\r
+                       });\r
+               }\r
+               // Trouver les elements non communs entre le tableau des langues availables et pour chaque champ,\r
+               // celui des langues renseignees, si ce champ est multi\r
+               // Si la langue d'origine n'est pas remplie (champ texte par exemple, on ne considère donc pas empty)\r
+               if(this.multi) {\r
+                       // Comparaison des tableaux\r
+                       $.each(multilang_avail_langs,function(i,name){\r
+                               if ((jQuery.inArray(name, field_langs) == -1) && (jQuery.inArray(name, langs_empty) == -1) && (jQuery.inArray(multilang_def_lang, field_langs) != -1))\r
+                                       langs_empty.push(name);\r
+                       });\r
+               }else{\r
+                       // Comparaison des tableaux\r
+                       $.each(multilang_avail_langs,function(i,name){\r
+                               if ((jQuery.inArray(name, field_langs) == -1) && (jQuery.inArray(name, langs_empty) == -1) && (jQuery.inArray(multilang_def_lang, field_langs) != -1))\r
+                                       langs_empty.push(name);\r
+                       });\r
+               }\r
+       });\r
+\r
+       // On indique dans le menu de langue, celles qui ont au moins un champ non renseigne\r
+       if(container!='') {\r
+               $.each(multilang_avail_langs,function(i,name){\r
+                       if((jQuery.inArray(name, langs_empty) == -1)){\r
+                               var title = 'multilang_lang.title_lien_multi_'+name;\r
+                               container.find('a[class~='+name+']').removeClass('empty').attr('title',eval(title));\r
+                       }else{\r
+                               var title = 'multilang_lang.title_lien_multi_sans_'+name;\r
+                               container.find('a[class~='+name+']').addClass('empty').attr('title',eval(title));\r
+                       }\r
+               });\r
+       }\r
+}\r
+\r
+/**\r
+ * Action au changement de la langue\r
+ * Lorsque l'on clique sur une le menu de langue\r
+ * On affiche pour le champ "el" son contenu dans la langue "lang"\r
+ *\r
+ * @param el Un champ du formulaire (input ou textarea)\r
+ * @param lang La langue correspondante souhaitée\r
+ * @return\r
+ */\r
+function multilang_set_lang(el,lang) {\r
+\r
+       if(!el.totreat) return;\r
+\r
+       //if current lang is not setted use default lang value\r
+       if(el.field_lang[lang]==undefined) {\r
+               el.field_lang[lang] = el.field_lang[multilang_def_lang];\r
+       }\r
+\r
+       el.value = (el.field_lang[lang] == undefined ? "" : el.field_lang[lang]);\r
+\r
+       el.titre_el.html(el.value);\r
+\r
+       multilang_field_set_background(el,lang);\r
+}\r
+\r
+/**\r
+ * Change la class multi_lang_* d'un champ pour indiquer la présence ou non de multis\r
+ * - multi_lang_(lang) si une langue particulière est disponible\r
+ * - multi_lang_no_multi si pas de multis pour le champ\r
+ *\r
+ * @param el\r
+ * @param lang\r
+ * @return\r
+ */\r
+function multilang_field_set_background(el,lang) {\r
+       if(lang != 'full'){\r
+               if(el.totreat){\r
+                       $(el).removeAttr('readonly').removeClass('multilang_readonly');\r
+                       if(typeof($(el).attr('class')) != 'undefined'){\r
+                               $($(el).attr('class').split(' ')).each(function(){\r
+                                       var m = this.match(/^multi_lang_*/);\r
+                                       if(m!=null)\r
+                                               $(el).removeClass(m.input).addClass('multi_lang_'+lang);\r
+                               });\r
+                       }\r
+                       $(el).addClass('multi_lang_'+(el.multi?lang:'no_multi'));\r
+               }\r
+               else{\r
+                       if(typeof($(el).attr('class')) != 'undefined'){\r
+                               $($(el).attr('class').split(' ')).each(function(){\r
+                                       var m = this.match(/^multi_lang_*/);\r
+                                       if(m!=null)\r
+                                               $(el).removeClass(m.input);\r
+                               });\r
+                       }\r
+                       $(el).css({"background":"url("+multilang_dir_plugin+"/images/multi_forbidden.png) no-repeat right top"});\r
+               }\r
+       }else{\r
+               $(el).attr('readonly','readonly').addClass('multilang_readonly');\r
+               if(typeof($(el).attr('class')) != 'undefined'){\r
+                       $($(el).attr('class').split(' ')).each(function(){\r
+                               var m = this.match(/^multi_lang_*/);\r
+                               if(m!=null)\r
+                                       $(el).removeClass(m.input);\r
+                       });\r
+               }\r
+       }\r
+}\r
+\r
+/**\r
+ * Garde en mémoire dans l'array de langues du champs la valeur de la langue\r
+ * sélectionnée\r
+ *\r
+ * @param el Le champ du formulaire concerné\r
+ * @param lang La langue actuelle\r
+ * @return\r
+ */\r
+function multilang_save_lang(el,lang) {\r
+\r
+       if(!el.totreat) return ;\r
+\r
+       // Suppression du numero uniquement pour les titres\r
+       if(multilang_is_title(el)) {\r
+               var m = el.value.match(/^(\d+\.\s+)((?:.|\n|\s)*)/);\r
+               if(m!=null) {\r
+                       // Suppress point and spaces\r
+                       el.field_pre_lang = m[1].replace(/\.|\s+/,'');\r
+                       el.value = m[2];\r
+               }\r
+       }\r
+\r
+       //if the lang value is equal to the def lang do nothing\r
+       //else save value but if the field is not empty, delete lang value\r
+       if(el.field_lang[multilang_def_lang]!= el.value) {\r
+               if(!el.value) {\r
+                       delete el.field_lang[lang];\r
+                       return;\r
+               }\r
+               el.multi = true;\r
+               el.field_lang[lang] = el.value;\r
+       }else{\r
+               el.field_lang[lang] = el.field_lang[multilang_def_lang];\r
+               $.each(el.field_lang,function(index, value){\r
+                       if((index != multilang_def_lang) && (value == el.field_lang[multilang_def_lang])){\r
+                               delete el.field_lang[index];\r
+                       }\r
+               });\r
+       }\r
+}\r
+\r
+//This func receives the form that is going to be submitted\r
+function multilang_multi_submit(params) {\r
+       if(multilang_avail_langs.length<=1) return;\r
+       var form = $(this);\r
+       //remove the current form from the list of forms\r
+       multilang_forms.not(this);\r
+       //remove the current menu lang container from the list\r
+       multilang_containers.not("div.menu_multilang",$(this));\r
+       //build the input values\r
+       multilang_multi_recover('','',form,'submit');\r
+       //save back the params\r
+       if(params) $.extend(params,$(form).formToArray(false));\r
+}\r
+\r
+/**\r
+ * On attache nos évènements pour la validation du formulaire\r
+ * - sur le submit pour tous les formulaires\r
+ * - sur l'évènement 'form-pre-serialize' d'ajaxForms au cas où nous sommes dans\r
+ * un formulaire ajax\r
+ *\r
+ * @return\r
+ */\r
+function multilang_attach_submit() {\r
+       if($(this).parents('.ajax').size() && $(this).find('input[name=var_ajax]')){\r
+               $(this).bind('form-pre-serialize',multilang_multi_submit);\r
+       }else if($(this).is('.formulaire_crayon')){\r
+               cQuery(this).bind('form-pre-serialize',function(){multilang_multi_submit.apply(this);});\r
+       }else{\r
+               var oldsubmit = this.onsubmit;\r
+               this.onsubmit = "";\r
+               if(oldsubmit && oldsubmit != ""){\r
+                       $(this).submit(function(){multilang_multi_submit.apply(this);return oldsubmit.apply(this);});\r
+               }\r
+               else if(oldsubmit != "")\r
+                       $(this).submit(multilang_multi_submit);\r
+       }\r
+}\r
+\r
+(function($) {\r
+       $.extend($.fn, {\r
+               in_set: function(set) {\r
+                       var elements = this.get();\r
+                       var result = $.grep(set,function(i){\r
+                               var found = false;\r
+                               $.each(elements,function(){\r
+                                       if(this==i) found=true;\r
+                               })\r
+                               return found;\r
+                       });\r
+                       return jQuery(result);\r
+               }\r
+       });\r
+})(jQuery);
\ No newline at end of file
diff --git a/www/plugins/multilang/javascript/multilang_init.js.html b/www/plugins/multilang/javascript/multilang_init.js.html
new file mode 100644 (file)
index 0000000..cea63c8
--- /dev/null
@@ -0,0 +1,3 @@
+#CACHE{7*24*3600}
+#HTTP_HEADER{Content-Type: text/javascript; charset=#CHARSET}
+[(#REM|generer_multilang_init)]
\ No newline at end of file
diff --git a/www/plugins/multilang/javascript/multilang_init.js_fonctions.php b/www/plugins/multilang/javascript/multilang_init.js_fonctions.php
new file mode 100644 (file)
index 0000000..00e7d84
--- /dev/null
@@ -0,0 +1,92 @@
+<?php
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function generer_multilang_init(){
+       $data = '';
+       if(count($langues = explode(',',$GLOBALS["meta"]["langues_multilingue"])) > 1){
+               include_spip('inc/config');
+               $config = lire_config('multilang',array());
+               $root = '' ;
+               if(isset($config['multilang_public']))
+                       unset($config['multilang_public']);
+               if(isset($config['multilang_crayons']))
+                       unset($config['multilang_crayons']);
+               if(isset($config['siteconfig']) && $config['siteconfig']){
+                       $root .= 'div#configurer-accueil,div.formulaire_configurer_identite' ; // Config Site
+                       unset($config['siteconfig']);
+               }
+               
+               foreach($config as $conf => $val){
+                       if($val == 'on') {
+                               if($conf == 'document')
+                                       $root .= ',div#portfolio_portfolio,div#portfolio_documents,div#liste_documents,div.formulaire_editer_document' ;
+                               else
+                                       $root .= ',div.formulaire_editer_'.$conf;
+                               unset($config[$conf]);
+                       }
+               }
+               // Appel de multilang_init_lang si
+               // - document.ready
+               // - onAjaxLoad (cas des docs et de la configuration du site)
+               if(is_array($langues_config = lire_config('multilang/langues_utilisees','aucune')) && count($langues_config) > 0){
+                       $langues = implode(',',array_intersect($langues,$langues_config));
+               }else{
+                       $langues = implode(',',$langues);
+               }
+               $data = '
+       var multilang_avail_langs = "'.$langues.'".split(\',\'),
+       multilang_def_lang = "'.$GLOBALS["meta"]["langue_site"].'",
+       multilang_lang_courante = "'.$GLOBALS["spip_lang"].'",
+       multilang_dir_plugin = "'._DIR_PLUGIN_MULTILANG.'";
+
+       // On trie les langues. Langue de l environnement en premier,
+       // puis langue principale du site puis les autres en ordre alphabetique
+       // Un utilisateur de langue anglaise souhaite logiquement traduire en anglais
+       multilang_avail_langs = jQuery.grep(multilang_avail_langs, function(value) {
+               return (value != multilang_def_lang && value != multilang_lang_courante);
+       });
+       multilang_avail_langs.sort();
+       multilang_avail_langs.unshift(multilang_lang_courante);
+       if(multilang_lang_courante!=multilang_def_lang) multilang_avail_langs.unshift(multilang_def_lang);
+
+       jQuery(document).ready(function(){
+               function multilang_init(){
+                       var root = "'.$root.'";
+                       var fields_selector = "textarea:not(textarea#adresses_secondaires,textarea#repetitions),input:text:not(input#new_login,input#email,#titreparent,input.date,input.heure,input#largeur,input#hauteur,.ac_input,#url_syndic,#url_auto,#champ_geocoder,#champ_lat,#champ_lon,#champ_zoom,#places,*.nomulti),.multilang";
+                       // on exclue aussi les form d upload (Pour les vignettes de docs, logos...)
+                       var forms_selector = "form[class!=\'form_upload\'][class!=\'form_upload_icon\']";
+                       // Les div qui ont un formulaire de classe multilang (pour accélérer la recherche dans le DOM,
+                       // on passe le form et le parent sera trouvé dans lors de l\'init)
+                       var root_opt = "form:has(.multilang)";
+                       var fields_selector_opt = ".multilang";
+                       multilang_init_lang({fields:fields_selector,fields_opt:fields_selector_opt,root:root,root_opt:root_opt,forms:forms_selector});
+                       
+                       if($(".menu_multilang").length > 0){
+                               $(".menu_multilang").each(function(){
+                                       var menu_lang = $(this);
+                                       $(window).scroll(function() {
+                                               var offset = menu_lang.parents("form").offset();
+                                               var limite_multilang = offset.top;
+                                               var limite_bas = limite_multilang+menu_lang.parents("form").height()-menu_lang.parents("form").find(".boutons").height();
+                                               var pos_bas = menu_lang.offset().top+menu_lang.height();
+                                               if(($(window).scrollTop() >= limite_multilang) && (pos_bas <= limite_bas) && ($(window).scrollTop() < limite_bas)){
+                                                       if(!menu_lang.hasClass("menu_lang_flottant"))
+                                                               menu_lang.addClass("menu_lang_flottant");
+                                                       var menu_lang_width = menu_lang.width();
+                                                       menu_lang.css({"position": "fixed", "top": 0, "width": menu_lang_width+"px","z-index":"999"});
+                                               }
+                                               if(($(window).scrollTop() < limite_multilang)||(pos_bas > limite_bas) )
+                                                       menu_lang.removeClass("menu_lang_flottant").css({"position": "static", "width": "auto"});
+                                       });
+                               });
+                       }
+               }
+               multilang_init();
+               if(typeof onAjaxLoad == "function") onAjaxLoad(multilang_init);
+       });
+';
+       }
+       return $data;
+}
+?>
\ No newline at end of file
diff --git a/www/plugins/multilang/javascript/multilang_lang.js.html b/www/plugins/multilang/javascript/multilang_lang.js.html
new file mode 100644 (file)
index 0000000..35dc5de
--- /dev/null
@@ -0,0 +1,12 @@
+#CACHE{7*24*3600}
+#HTTP_HEADER{Content-Type: text/javascript; charset=#CHARSET}
+#SET{langues,#EVAL{$GLOBALS["meta"]["langues_multilingue"]}}
+var multilang_lang = {
+       champs_readonly : '<:multilang:message_champs_readonly|filtrer_entites|texte_script:>',
+       lien_desactiver : '<:multilang:lien_desactiver|filtrer_entites|texte_script:>',
+       <BOUCLE_langues(DATA){source tableau, #GET{langues}|explode{','}}>[(#SET{lang,[(#VALEUR|traduire_nom_langue)]})][
+       title_lien_multi_(#VALEUR) : '<:multilang:lien_multi_title{lang=#GET{lang}}|filtrer_entites|texte_script:>',][
+       title_lien_multi_sans_(#VALEUR) : '<:multilang:lien_multi_title_sans{lang=#GET{lang}}|filtrer_entites|texte_script:>',
+       ]</BOUCLE_langues>
+       numero : '<:multilang:champ_numero|html2unicode|unicode2charset:>'
+};
diff --git a/www/plugins/multilang/lang/multilang.xml b/www/plugins/multilang/lang/multilang.xml
new file mode 100644 (file)
index 0000000..f54ac3e
--- /dev/null
@@ -0,0 +1,16 @@
+<traduction module="multilang" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/multilang/trunk/lang/" reference="fr">
+       <langue code="en" url="http://trad.spip.net/tradlang_module/multilang?lang_cible=en">
+               <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/multilang?lang_cible=es">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       </langue>
+       <langue code="fa" url="http://trad.spip.net/tradlang_module/multilang?lang_cible=fa">
+               <traducteur nom="Davood Hossein" lien="http://trad.spip.net/auteur/davood-hossein" />
+       </langue>
+       <langue code="fr" />
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/multilang?lang_cible=sk">
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
+       </langue>
+</traduction>
diff --git a/www/plugins/multilang/lang/multilang_en.php b/www/plugins/multilang/lang/multilang_en.php
new file mode 100644 (file)
index 0000000..45c174c
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/multilang?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'cfg_activer' => 'Activate Multilang on the edit page:',
+       'cfg_boite_multilang' => 'Configuration of the Multilang plugin',
+       'cfg_descr_multilang' => 'Multilang: plugin to manage multi tags',
+       'cfg_effacer' => 'Re-init',
+       'cfg_explication_crayons' => 'Requires multilang to be activated in the public space of the site.',
+       'cfg_langues' => 'Used languages',
+       'cfg_lbl_article' => 'of the articles',
+       'cfg_lbl_auteur' => 'of the authors',
+       'cfg_lbl_breve' => 'of the news items',
+       'cfg_lbl_crayons' => 'Use multilang in the pencils',
+       'cfg_lbl_document' => 'of the documents',
+       'cfg_lbl_espace_public' => 'Use multilang in the public space',
+       'cfg_lbl_evenement' => 'of the events',
+       'cfg_lbl_formstables' => 'of forms&tables',
+       'cfg_lbl_gis' => 'geolocated points',
+       'cfg_lbl_motcle' => 'of the keywords',
+       'cfg_lbl_rubrique' => 'of the sections',
+       'cfg_lbl_site' => 'of the websites',
+       'cfg_lbl_siteconfig' => 'of the website configuration',
+       'cfg_titre_multilang' => 'Multilang',
+       'champ_numero' => 'Number',
+       'configuration_multilang' => 'Multilang',
+
+       // E
+       'explication_langues_utilisees' => 'Select the languages to use in the multilang menu. Select none to use them all.',
+
+       // L
+       'label_langues_utilisees' => 'Used languages by multilang',
+       'lien_desactiver' => 'All',
+       'lien_multi_title' => 'Edit multilingual fields in «@lang@»',
+       'lien_multi_title_sans' => 'Version "@lang@" is incomplete. Click to edit.',
+
+       // M
+       'message_champs_readonly' => 'The multilingual fields are in read only mode, choose a language to edit them'
+);
+
+?>
diff --git a/www/plugins/multilang/lang/multilang_es.php b/www/plugins/multilang/lang/multilang_es.php
new file mode 100644 (file)
index 0000000..016c7d4
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/multilang?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'cfg_activer' => 'Activar Multilang en la página de edición:',
+       'cfg_boite_multilang' => 'Configuración del plugin Multilang',
+       'cfg_descr_multilang' => 'Multilang: Plugin de gestión de las etiquetas "multi"',
+       'cfg_effacer' => 'Reiniciar',
+       'cfg_explication_crayons' => 'Se requiere activar Multilang en el espacio público del sitio.',
+       'cfg_langues' => 'Idiomas utilizados',
+       'cfg_lbl_article' => 'artículos',
+       'cfg_lbl_auteur' => 'autores',
+       'cfg_lbl_breve' => 'breves',
+       'cfg_lbl_crayons' => 'Utilizar Multilang en los lápices',
+       'cfg_lbl_document' => 'documentos',
+       'cfg_lbl_espace_public' => 'Utilizar Multilang en el espacio público del sitio',
+       'cfg_lbl_evenement' => 'Eventos',
+       'cfg_lbl_formstables' => 'forms&tables',
+       'cfg_lbl_gis' => 'puntos geolocalizados',
+       'cfg_lbl_motcle' => 'palabaras clave',
+       'cfg_lbl_rubrique' => 'secciones',
+       'cfg_lbl_site' => 'sitios',
+       'cfg_lbl_siteconfig' => 'de la configuración del sitio',
+       'cfg_titre_multilang' => 'Multilang',
+       'champ_numero' => 'Número',
+       'configuration_multilang' => 'Multilang',
+
+       // E
+       'explication_langues_utilisees' => 'Seleccione los idiomas a utilizar para el menú de Multilang. No seleccione ninguna para utilizarlas todas.',
+
+       // L
+       'label_langues_utilisees' => 'Idiomas utilizados por Multilang',
+       'lien_desactiver' => 'Todo',
+       'lien_multi_title' => 'Editar los campos multilingües en «@lang@»',
+       'lien_multi_title_sans' => 'La versión «@lang@» está incompleta. Haga clic para editar.',
+
+       // M
+       'message_champs_readonly' => 'Los campos multilingües son sólo de lectura, elija un idioma para modificarlos'
+);
+
+?>
diff --git a/www/plugins/multilang/lang/multilang_fa.php b/www/plugins/multilang/lang/multilang_fa.php
new file mode 100644 (file)
index 0000000..0ff0f62
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/multilang?lang_cible=fa
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'cfg_activer' => 'فعال سازي چندزبانگي در صفحه‌ي ويراستاري',
+       'cfg_boite_multilang' => 'پيكربندي پلاگين چندزبانگي ',
+       'cfg_descr_multilang' => 'چندزبانگي: پلاگين مديريت چند برچسب چندتايي',
+       'cfg_effacer' => 'بازنصب',
+       'cfg_explication_crayons' => 'لزوم فعال سازي چندزبانگي در فضاي همگاني سايت.',
+       'cfg_langues' => 'زبان‌هاي مورد استفاده ',
+       'cfg_lbl_article' => 'مقاله‌ها',
+       'cfg_lbl_auteur' => 'نويسندگان',
+       'cfg_lbl_breve' => 'خبرها',
+       'cfg_lbl_crayons' => 'استفاده از چندزبانگي در مدادها',
+       'cfg_lbl_document' => 'سندها',
+       'cfg_lbl_espace_public' => 'استفاده از چندزبانگي در فضاي همگاني سايت',
+       'cfg_lbl_evenement' => 'برنامه‌ها',
+       'cfg_lbl_formstables' => 'فرم‌ها/جدول‌ها',
+       'cfg_lbl_gis' => 'نقاط محلي‌سازي شده (geolocated) ',
+       'cfg_lbl_motcle' => 'كليدواژه‌ها',
+       'cfg_lbl_rubrique' => 'بخش‌ها',
+       'cfg_lbl_site' => 'سايت‌ها',
+       'cfg_lbl_siteconfig' => 'از پيكربندي سايت',
+       'cfg_titre_multilang' => 'چندزبانگي',
+       'champ_numero' => 'شماره ',
+       'configuration_multilang' => 'چندزبانگي',
+
+       // E
+       'explication_langues_utilisees' => 'زبان‌هاي مورد استفاده براي منيوي چندزبانگي را انتخاب كنيد. براي استفاده‌ از تمام آن‌ها هيچ چيز انتخاب نكنيد.',
+
+       // L
+       'label_langues_utilisees' => 'زبان‌هاي مورد استفاده توسط چندزبانگي ',
+       'lien_desactiver' => 'همه',
+       'lien_multi_title' => 'ويرايش ميدان‌هاي چندزبانگي در زبان «@lang@»  ',
+       'lien_multi_title_sans' => 'نسخه‌ي «@lang@»كامل نيست. براي ويرايش كردن آن كليك كنيد. ',
+
+       // M
+       'message_champs_readonly' => 'ميدان‌هاي چندزبانگي در حالت فقط خواندني هستند، يك زبان را براي ويرايش كردن آن‌ها انتخاب كنيد
+'
+);
+
+?>
diff --git a/www/plugins/multilang/lang/multilang_fr.php b/www/plugins/multilang/lang/multilang_fr.php
new file mode 100644 (file)
index 0000000..02ed7bd
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+// 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_/multilang/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'cfg_activer' => 'Activer Multilang sur la page d\'édition :',
+       'cfg_boite_multilang' => 'Configuration du plugin Multilang',
+       'cfg_descr_multilang' => 'Multilang : Plugin de gestion des tags multi',
+       'cfg_effacer' => 'Re-initialiser',
+       'cfg_explication_crayons' => 'Nécessite que multilang soit activé dans l\'espace public du site.',
+       'cfg_langues' => 'Langues utilisées',
+       'cfg_lbl_article' => 'des articles',
+       'cfg_lbl_auteur' => 'des auteurs',
+       'cfg_lbl_breve' => 'des breves',
+       'cfg_lbl_crayons' => 'Utiliser multilang dans les crayons',
+       'cfg_lbl_document' => 'des documents',
+       'cfg_lbl_espace_public' => 'Utiliser multilang dans l\'espace public du site',
+       'cfg_lbl_evenement' => 'des évènements',
+       'cfg_lbl_formstables' => 'des forms&tables',
+       'cfg_lbl_gis' => 'des points géolocalisés',
+       'cfg_lbl_motcle' => 'des mots clés',
+       'cfg_lbl_rubrique' => 'des rubriques',
+       'cfg_lbl_site' => 'des sites',
+       'cfg_lbl_siteconfig' => 'de la configuration du site',
+       'cfg_titre_multilang' => 'Multilang',
+       'champ_numero' => 'Numéro',
+       'configuration_multilang' => 'Multilang',
+
+       // E
+       'explication_langues_utilisees' => 'Sélectionnez les langues à utiliser pour le menu de multilang. N\'en sélectionnez aucune pour toutes les utiliser.',
+
+       // L
+       'label_langues_utilisees' => 'Langues utilisées par multilang',
+       'lien_desactiver' => 'Tout',
+       'lien_multi_title' => 'Éditer les champs multilingues en «@lang@»',
+       'lien_multi_title_sans' => 'La version «@lang@» est incomplète. Cliquez pour l\'éditer.',
+
+       // M
+       'message_champs_readonly' => 'Les champs multilingues sont en lecture seule, choisissez une langue pour les modifier'
+);
+
+?>
diff --git a/www/plugins/multilang/lang/multilang_sk.php b/www/plugins/multilang/lang/multilang_sk.php
new file mode 100644 (file)
index 0000000..14fa8da
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/multilang?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // C
+       'cfg_activer' => 'Aktivovať Multilang na upravovacej stránke:',
+       'cfg_boite_multilang' => 'Nastavenia zásuvného modulu Multilang',
+       'cfg_descr_multilang' => 'Multilang: zásuvný modul na správu multitagov',
+       'cfg_effacer' => 'Znova spustiť',
+       'cfg_explication_crayons' => 'Treba aktivovať multilang na používanie na verejne prístupnej stránke.',
+       'cfg_langues' => 'Používané jazyky',
+       'cfg_lbl_article' => 'článkov',
+       'cfg_lbl_auteur' => 'autorov',
+       'cfg_lbl_breve' => 'noviniek',
+       'cfg_lbl_crayons' => 'Používať multilang v module crayons',
+       'cfg_lbl_document' => 'súborov',
+       'cfg_lbl_espace_public' => 'Používať multilang na verejne prístupnej stránke',
+       'cfg_lbl_evenement' => 'udalostí',
+       'cfg_lbl_formstables' => 'formulárov a tabuliek',
+       'cfg_lbl_gis' => 'geolokalizovaných bodov',
+       'cfg_lbl_motcle' => 'kľúčových slov',
+       'cfg_lbl_rubrique' => 'rubrík',
+       'cfg_lbl_site' => 'stránok',
+       'cfg_lbl_siteconfig' => 'nastavení stránky',
+       'cfg_titre_multilang' => 'Multilang',
+       'champ_numero' => 'Číslo',
+       'configuration_multilang' => 'Multilang',
+
+       // E
+       'explication_langues_utilisees' => 'Vyberte jazyky, ktoré sa budú používať v menu multilangu. Ak chcete používať všetky, nevyberte žiaden.',
+
+       // L
+       'label_langues_utilisees' => 'Jazyky, ktoré bude multilang používať',
+       'lien_desactiver' => 'Všetky',
+       'lien_multi_title' => 'Upraviť viacjazyčné polia v jazyku "@lang@"',
+       'lien_multi_title_sans' => 'Verzia v jazyku "@lang@" je neúplná. Kliknite, ak ju chcete upraviť.',
+
+       // M
+       'message_champs_readonly' => 'Viacjazyčné polia sú iba na čítanie, ak ich chcete upraviť, vyberte si jazyk'
+);
+
+?>
diff --git a/www/plugins/multilang/lang/paquet-multilang.xml b/www/plugins/multilang/lang/paquet-multilang.xml
new file mode 100644 (file)
index 0000000..a5954f5
--- /dev/null
@@ -0,0 +1,14 @@
+<traduction module="paquet-multilang" gestionnaire="salvatore" url="http://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/multilang/trunk/lang/" reference="fr">
+       <langue code="en" />
+       <langue code="es" url="http://trad.spip.net/tradlang_module/paquet-multilang?lang_cible=es">
+               <traducteur nom="Raquel S. Bujaldón" lien="http://trad.spip.net/auteur/raquel" />
+       </langue>
+       <langue code="fr" />
+       <langue code="it" />
+       <langue code="ru" url="http://trad.spip.net/tradlang_module/paquet-multilang?lang_cible=ru">
+               <traducteur nom="nazar" lien="http://trad.spip.net/auteur/nazar" />
+       </langue>
+       <langue code="sk" url="http://trad.spip.net/tradlang_module/paquet-multilang?lang_cible=sk">
+               <traducteur nom="jaro" lien="http://trad.spip.net/auteur/jaro" />
+       </langue>
+</traduction>
diff --git a/www/plugins/multilang/lang/paquet-multilang_en.php b/www/plugins/multilang/lang/paquet-multilang_en.php
new file mode 100644 (file)
index 0000000..b0b4075
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-multilang?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'multilang_description' => 'This plugin adds a language menu like <code>[fr] [en] [it]</code> at the top of each form, depending on the language selected in the site configuration.',
+       'multilang_slogan' => 'Control the display of the contents of multi tags with a language menu'
+);
+
+?>
diff --git a/www/plugins/multilang/lang/paquet-multilang_es.php b/www/plugins/multilang/lang/paquet-multilang_es.php
new file mode 100644 (file)
index 0000000..80b8115
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-multilang?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'multilang_description' => 'Este plugin añade un menú de idiomas del tipo <code>[fr] [en] [it]</code> encima de cada formulario, en función de los idiomas activados en la configuración del sitio.',
+       'multilang_slogan' => 'Administrar la muestra del contenido de las etiquetas multi con un menu'
+);
+
+?>
diff --git a/www/plugins/multilang/lang/paquet-multilang_fr.php b/www/plugins/multilang/lang/paquet-multilang_fr.php
new file mode 100644 (file)
index 0000000..7bc8904
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+// 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_/multilang/trunk/lang/
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'multilang_description' => 'Ce plugin rajoute un menu de langues du type <code>[fr] [en] [it]</code> au-dessus de chaque formulaire, en fonction des langues activées dans la configuration du site.',
+       'multilang_slogan' => 'Gérer l\'affichage du contenu des tags multi par un menu'
+);
+
+?>
diff --git a/www/plugins/multilang/lang/paquet-multilang_it.php b/www/plugins/multilang/lang/paquet-multilang_it.php
new file mode 100644 (file)
index 0000000..74d8d3d
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-multilang?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'multilang_description' => 'Questo plugin aggiunge un menu di linguaggi di tipo <code>[fr] [it] [it]</code> nella parte superiore di ogni modulo, a seconda della lingua selezionata nella configurazione del sito.',
+       'multilang_slogan' => 'Gérer l\'affichage du contenu des tags multi par un menu' # NEW
+);
+
+?>
diff --git a/www/plugins/multilang/lang/paquet-multilang_ru.php b/www/plugins/multilang/lang/paquet-multilang_ru.php
new file mode 100644 (file)
index 0000000..5fcec10
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-multilang?lang_cible=ru
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'multilang_description' => 'Этот плагин добавляет языковое меню, в виде <code> [RU] [EN] [IT] </code> в верхней части каждой формы, в зависимости от языка, выбранного в настройках сайта.',
+       'multilang_slogan' => 'Управляет отображением содержимого нескольких тегов языкового меню'
+);
+
+?>
diff --git a/www/plugins/multilang/lang/paquet-multilang_sk.php b/www/plugins/multilang/lang/paquet-multilang_sk.php
new file mode 100644 (file)
index 0000000..5b3da3c
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de http://trad.spip.net/tradlang_module/paquet-multilang?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+       // M
+       'multilang_description' => 'Tento zásuvný modul pridá jazykové menu <code>[fr] [en] [it]</code> do hornej časti každého formulára podľa aktivovaných jazykov v konfigurácii stránky.',
+       'multilang_slogan' => 'Riadiť zobrazenie obsahu kombinovaných tagov podľa menu'
+);
+
+?>
diff --git a/www/plugins/multilang/multilang.css.html b/www/plugins/multilang/multilang.css.html
new file mode 100644 (file)
index 0000000..818a87c
--- /dev/null
@@ -0,0 +1,56 @@
+#CACHE{3600*100,cache-client}\r
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}\r
+#HTTP_HEADER{Vary: Accept-Encoding}\r
+\r
+.menu_multilang {\r
+       background-color:transparent;\r
+       padding:5px;\r
+}\r
+\r
+.menu_multilang .langues{\r
+       overflow:auto;\r
+}\r
+\r
+.menu_multilang .langues a{\r
+       cursor:pointer;\r
+       font-weight:normal;\r
+       margin-right:2px;\r
+}\r
+\r
+.menu_multilang .langues a.on{\r
+       font-weight:bold;\r
+}\r
+\r
+.menu_multilang .langues a.empty{\r
+       background-color:#000000;\r
+}\r
+\r
+.menu_multilang .multilang_message{\r
+       clear:both;\r
+}\r
+\r
+.menu_lang_flottant{\r
+       border-bottom:3px solid #000;\r
+       background-color:rgb(255,255,255);\r
+       background-color:rgba(255,255,255,.8);\r
+}\r
+\r
+#SET{langues,#EVAL{$GLOBALS["meta"]["langues_multilingue"]}}\r
+<BOUCLE_langues(DATA){source table,#GET{langues}|explode{','}}>\r
+.multi_lang_#VALEUR {\r
+       background-position:98% 1px;\r
+       background-repeat:no-repeat;\r
+       background-image:url([(#VAL{Multi #VALEUR}|image_typo{taille=11,couleur=cccccc}|extraire_attribut{src}|url_absolue)]);\r
+}</BOUCLE_langues>\r
+\r
+.multi_lang_no_multi {\r
+       background-position:98% 1px;\r
+       background-repeat:no-repeat;\r
+       background-image:url([(#VAL{No multi}|image_typo{taille=11,couleur=cccccc}|extraire_attribut{src}|url_absolue)]);\r
+}\r
+\r
+.multi_lang_broken {\r
+       background-position:98% 1px;\r
+       background-repeat:no-repeat;\r
+       background-image:url(#CHEMIN{images/multi_forbidden.png});\r
+}
\ No newline at end of file
diff --git a/www/plugins/multilang/multilang.js.html b/www/plugins/multilang/multilang.js.html
new file mode 100644 (file)
index 0000000..a62d439
--- /dev/null
@@ -0,0 +1,6 @@
+#CACHE{7*24*3600}
+#HTTP_HEADER{Content-Type: text/javascript; charset=#CHARSET}
+[(#INCLURE{fond=javascript/multilang_init.js})]
+[(#INCLURE{fond=javascript/multilang_lang.js,lang})]
+[(#INCLURE{javascript/multilang.js})]
+#FILTRE{trim}
\ No newline at end of file
diff --git a/www/plugins/multilang/multilang_administrations.php b/www/plugins/multilang/multilang_administrations.php
new file mode 100644 (file)
index 0000000..7d4660f
--- /dev/null
@@ -0,0 +1,56 @@
+<?php\r
+/**\r
+ * Fichier d'installation / upgrade et désinstallation du plugin Multilang\r
+ */\r
+\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+/**\r
+ * Fonction d'upgrade/maj\r
+ * On crée une configuration par défaut\r
+ *\r
+ * @param string $nom_meta_base_version\r
+ * @param string $version_cible\r
+ */\r
+function multilang_upgrade($nom_meta_base_version,$version_cible){\r
+\r
+       $maj = array();\r
+       \r
+       $maj['create'] = array(\r
+               array('multilang_creer_config'),\r
+       );\r
+       include_spip('base/upgrade');\r
+       maj_plugin($nom_meta_base_version, $version_cible, $maj);\r
+\r
+}\r
+\r
+function multilang_creer_config(){\r
+       include_spip('inc/config');\r
+               $config = lire_config('multilang');\r
+       if (!is_array($config))\r
+               $config = array();\r
+       $config_defaut = array_merge(array(\r
+                       'siteconfig' => 'on',\r
+                       'article' => '',\r
+                       'breve' => '',\r
+                       'rubrique' => 'on',\r
+                       'auteur' => 'on',\r
+                       'document' => 'on',\r
+                       'motcle' => '',\r
+                       'site' => '',\r
+                       'evenement' => ''\r
+       ), $config);\r
+       ecrire_meta('multilang', serialize($config_defaut));\r
+}\r
+/**\r
+ * Fonction de desinstallation\r
+ * On efface uniquement la méta d'installation\r
+ *\r
+ * @param float $nom_meta_base_version\r
+ */\r
+function multilang_vider_tables($nom_meta_base_version) {\r
+       effacer_meta('multilang');\r
+       effacer_meta($nom_meta_base_version);\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/www/plugins/multilang/multilang_pipelines.php b/www/plugins/multilang/multilang_pipelines.php
new file mode 100644 (file)
index 0000000..85058c8
--- /dev/null
@@ -0,0 +1,141 @@
+<?php\r
+\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+/**\r
+ * Insertion dans le pipeline insert_head_css (SPIP)\r
+ * si on a configuré multilang pour s'insérer dans l'espace public\r
+ *\r
+ * @param string $flux Le contenu du head CSS\r
+ * @return string $flux Le contenu du head CSS modifié\r
+ */\r
+function multilang_insert_head_css($flux){\r
+       if(!function_exists('lire_config'))\r
+               include_spip('inc/config');\r
+       \r
+       $multilang_public = lire_config('multilang/multilang_public','off');\r
+       if($multilang_public == 'on'){\r
+\r
+               static $done = false;\r
+\r
+               if (!$done) {\r
+                       $done = true;\r
+                       $flux .= '<link rel="stylesheet" href="'.url_absolue(generer_url_public('multilang.css')).'" type="text/css" media="all" />';\r
+               }\r
+       }\r
+       return $flux;\r
+}\r
+\r
+/**\r
+ * Insertion dans le pipeline insert_head_prive (SPIP)\r
+ * Ajoute css et javascript dans le <head> privé\r
+ *\r
+ * @param string $flux \r
+ *             Le contenu du head\r
+ * @return string $flux \r
+ *             Le contenu du head modifié\r
+ */\r
+function multilang_insert_head_prive($flux){\r
+       if(!function_exists('lire_config'))\r
+               include_spip('inc/config');\r
+       $config = lire_config('multilang',array());\r
+\r
+       $flux .= multilang_inserer_head($config);\r
+\r
+       return $flux;\r
+}\r
+\r
+/**\r
+ * Insertion dans le pipeline insert_head (SPIP)\r
+ * si on a configuré multilang pour s'insérer dans l'espace public\r
+ *\r
+ * @param string $flux \r
+ *             Le contenu du head\r
+ * @return string $flux \r
+ *             Le contenu du head modifié\r
+ */\r
+function multilang_insert_head($flux){\r
+       if(!function_exists('lire_config'))\r
+               include_spip('inc/config');\r
+       $config = lire_config('multilang',array());\r
+\r
+       if($config['multilang_public'] == 'on'){\r
+               $flux .= multilang_insert_head_css(''); // au cas ou il n'est pas implemente\r
+               $flux .= multilang_inserer_head($config);\r
+       }\r
+       return $flux;\r
+}\r
+\r
+/**\r
+ * La fonction de modification du $flux pour l'insertion dans le head qu'il\r
+ * soit privé ou public\r
+ *\r
+ * @param array $config La configuration du plugin\r
+ * @return string $data Le contenu textuel qui sera inséré dans le head\r
+ */\r
+function multilang_inserer_head($config=array()){\r
+       /**\r
+        * N'activer multilang que si plus d'une langue dans le site\r
+        */\r
+       if(count($langues = explode(',',$GLOBALS["meta"]["langues_multilingue"])) > 1){\r
+               $data = '\r
+<script type="text/javascript" src="'.generer_url_public("multilang.js","lang=".$GLOBALS["spip_lang"]).'"></script>\r
+';\r
+       }\r
+       return $data;\r
+}\r
+\r
+/**\r
+ * Insertion dans le pipeline affichage_final (SPIP)\r
+ * \r
+ * Sur la page crayons.js, on insère également notre javascript pour être utilisable\r
+ * dans les crayons\r
+ * \r
+ * @param string $flux Le contenu de la page\r
+ * @return string $flux Le contenu de la page modifiée \r
+ */\r
+function multilang_affichage_final($flux){\r
+       if(isset($_REQUEST['page']) && $_REQUEST['page'] == 'crayons.js'){\r
+               if(!function_exists('lire_config'))\r
+                       include_spip('inc/config');\r
+               $config = lire_config('multilang',array());\r
+               \r
+               /**\r
+                * On n'utilise multilang que si l'espace public est activé ainsi que les crayons\r
+                */\r
+               if(($config['multilang_public'] == 'on') && ($config['multilang_crayons'] == 'on')){\r
+                       unset($config['multilang_public']);\r
+                       unset($config['multilang_crayons']);\r
+                       $root = '' ;\r
+                       \r
+                       if(isset($config['siteconfig']) && $config['siteconfig']){\r
+                               $root .= ',input[type=hidden][name*=name_][value|=meta-valeur]';\r
+                               unset($config['siteconfig']);\r
+                       }\r
+                       \r
+                       foreach($config as $conf => $val){\r
+                               if($val == 'on') { // Articles\r
+                                       $root .= ',input[type=hidden][name*=name_][value|='.$conf.']:not(input[value|='.$conf.'-logo])';\r
+                                       unset($config[$conf]);\r
+                               }\r
+                       }\r
+                       $texte = '\r
+                               var crayons_multilang_init = function(){\r
+                                       var crayons_root = ".formulaire_spip:has('.$root.')";\r
+                                       var fields_selector = "textarea,input:text:not(input.date,input.heure,*.nomulti)";\r
+                                       var forms_selector = "form[class!=\'form_upload\'][class!=\'form_upload_icon\']";\r
+                                       var root_opt = "form:has(.multilang)";\r
+                                       var fields_selector_opt = ".multilang";\r
+                                       multilang_init_lang({fields:fields_selector,fields_opt:fields_selector_opt,root:crayons_root,root_opt:root_opt,forms:forms_selector,init_done:false});\r
+                               }\r
+                               \r
+                               cQuery(document).ready(function(){\r
+                                       if(typeof onAjaxLoad == "function") onAjaxLoad(crayons_multilang_init);\r
+                                       crayons_multilang_init();\r
+                               });';\r
+                       $flux .= $texte;\r
+               }\r
+       }\r
+       return $flux;\r
+}\r
+?>
\ No newline at end of file
diff --git a/www/plugins/multilang/paquet.xml b/www/plugins/multilang/paquet.xml
new file mode 100644 (file)
index 0000000..239700c
--- /dev/null
@@ -0,0 +1,29 @@
+<paquet
+       prefix="multilang"
+       categorie="edition"
+       version="0.9.2"
+       etat="stable"
+       compatibilite="[3.0.0;3.0.99]"
+       logo="images/multilang-32.png"
+       schema="0.1"
+       documentation="http://contrib.spip.net/?article3498"
+>      
+
+       <nom>Multilang</nom>
+       <!-- Gérer l'affichage du contenu des tags multi par un menu -->
+
+       <auteur>Renato Formato</auteur>
+       <auteur lien="http://www.kent1.info">kent1</auteur>
+       <auteur lien="http://contrib.spip.net/?auteur10787">Yffic</auteur>
+
+       <licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL 3</licence>
+
+       <pipeline nom="header_prive" action="insert_head_prive" inclure="multilang_pipelines.php" />
+       <pipeline nom="insert_head_css" inclure="multilang_pipelines.php" />
+       <pipeline nom="insert_head" inclure="multilang_pipelines.php" />
+       <pipeline nom="affichage_final" inclure="multilang_pipelines.php" />
+       <menu nom="configurer_multilangue" titre="multilang:configuration_multilang" parent="menu_configuration" icone="images/multilang-16.png" />
+       <necessite nom="saisies" compatibilite="[1.1;[" />
+
+       <utilise nom="crayons" />
+</paquet>
diff --git a/www/plugins/multilang/prive/squelettes/contenu/configurer_multilang.html b/www/plugins/multilang/prive/squelettes/contenu/configurer_multilang.html
new file mode 100644 (file)
index 0000000..48dde44
--- /dev/null
@@ -0,0 +1,5 @@
+[(#AUTORISER{configurer,multilang}|sinon_interdire_acces)]
+<h1 class="grostitre"><:multilang:configuration_multilang:></h1>
+<div class="ajax">
+       #FORMULAIRE_CONFIGURER_MULTILANG
+</div>
\ No newline at end of file
diff --git a/www/plugins/multilang/prive/squelettes/contenu/configurer_multilangue.html b/www/plugins/multilang/prive/squelettes/contenu/configurer_multilangue.html
new file mode 100644 (file)
index 0000000..e931019
--- /dev/null
@@ -0,0 +1 @@
+<INCLURE{fond=prive/squelettes/contenu/configurer_multilang,env} />
diff --git a/www/plugins/multilang/prive/style_prive_plugin_multilang.html b/www/plugins/multilang/prive/style_prive_plugin_multilang.html
new file mode 100644 (file)
index 0000000..6fe1d00
--- /dev/null
@@ -0,0 +1,66 @@
+#CACHE{0*100,cache-client}
+#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
+#HTTP_HEADER{Vary: Accept-Encoding}
+
+#SET{claire,##ENV{couleur_claire,edf3fe}}
+#SET{foncee,##ENV{couleur_foncee,3874b0}}
+#SET{left,#ENV{ltr}|choixsiegal{left,left,right}}
+#SET{right,#ENV{ltr}|choixsiegal{left,right,left}}
+
+.menu_multilang {
+       background-color:transparent;
+       padding:5px;
+}
+
+.menu_multilang .langues{
+       overflow:auto;
+}
+
+.menu_multilang .langues a{
+       cursor:pointer;
+       font-weight:normal;
+       margin-right:2px;
+       display:block;
+       float:left;
+}
+
+.menu_multilang .langues a.on{
+       font-weight:bold;
+}
+
+.menu_multilang .langues a.empty{
+       background-color:#GET{foncee};
+       padding:2px;
+       color:#fff;
+}
+
+.menu_multilang .multilang_message{
+       clear:both;
+}
+
+.menu_lang_flottant{
+       border-bottom:3px solid #GET{foncee};
+       background-color:[#(#GET{claire}|couleur_eclaircir)];
+       opacity:.8;
+}
+
+#SET{langues,#EVAL{$GLOBALS["meta"]["langues_multilingue"]}}
+<BOUCLE_langues(POUR){tableau #GET{langues}|explode{','}}>
+.multi_lang_#VALEUR {
+       background-position:98% 1px;
+       background-repeat:no-repeat;
+       background-image:url([(#VAL{Multi #VALEUR}|image_typo{taille=11,couleur=cccccc}|extraire_attribut{src}|url_absolue)]);
+}
+</BOUCLE_langues>
+
+.multi_lang_no_multi {
+       background-position:98% 1px;
+       background-repeat:no-repeat;
+       background-image:url([(#VAL{No multi}|image_typo{taille=11,couleur=cccccc}|extraire_attribut{src}|url_absolue)]);
+}
+
+.multi_lang_broken {
+       background-position:98% 1px;
+       background-repeat:no-repeat;
+       background-image:url(#CHEMIN{images/multi_forbidden.png});
+}
\ No newline at end of file
diff --git a/www/plugins/multilang/prive/themes/spip/images/multilang-16.png b/www/plugins/multilang/prive/themes/spip/images/multilang-16.png
new file mode 100644 (file)
index 0000000..955defc
Binary files /dev/null and b/www/plugins/multilang/prive/themes/spip/images/multilang-16.png differ
diff --git a/www/plugins/multilang/prive/themes/spip/images/multilang-24.png b/www/plugins/multilang/prive/themes/spip/images/multilang-24.png
new file mode 100644 (file)
index 0000000..11e6ed4
Binary files /dev/null and b/www/plugins/multilang/prive/themes/spip/images/multilang-24.png differ
diff --git a/www/plugins/multilang/svn.revision b/www/plugins/multilang/svn.revision
new file mode 100644 (file)
index 0000000..42c256c
--- /dev/null
@@ -0,0 +1,10 @@
+<svn_revision>
+<text_version>
+Origine: file:///home/svn/repository/spip-zone/_plugins_/multilang/trunk
+Revision: 72466
+Dernier commit: 2013-04-30 12:00:50 +0200 
+</text_version>
+<origine>file:///home/svn/repository/spip-zone/_plugins_/multilang/trunk</origine>
+<revision>72466</revision>
+<commit>2013-04-30 12:00:50 +0200 </commit>
+</svn_revision>
\ No newline at end of file