[ Index ] |
|
Code source de SPIP 1.9.2c |
1 /* 2 * multilang_mot_cles 3 * 4 * Copyright (c) 2006 Renato Formato (renatoformato@virgilio.it) 5 * Licensed under the GPL License: 6 * http://www.gnu.org/licenses/gpl.html 7 * 8 */ 9 10 var multilang_containers={},forms_fields={},multilang_forms,multilang_menu_lang; 11 var match_multi = /(?:\[([a-z_]+)\]|^[\s\n]*)((?:.|\n)*?)(?=\[[a-z_]+\]|$)/ig; 12 var multilang_css_link,multilang_css_cur_link={},multilang_root,multilang_fields_selector,multilang_menu_selector,multilang_forms_selector; 13 multilang_css_link = {"cursor":"pointer","margin":"2px 5px","float":"left"}; 14 $.extend(multilang_css_cur_link,multilang_css_link); 15 $.extend(multilang_css_cur_link,{fontWeight:"bold"}); 16 17 /* options is a hash having the following values: 18 * - fields (mandatory): a jQuery selector to set the fields that have to be internationalized. 19 * - page (optional): a string to be searched in the current url. if found the plugin is applied. 20 * - root (optional): the root element of all processing. Default value is 'document'. To speed up search 21 * - forms (optional): a jQuery selector to set the forms that have to be internationalized. Default value is 'form'. 22 * - main_menu (optional): a jQuery selector to set the container for the main menu to control all the selected forms. 23 * - form_menu (optional): a jQuery selector to set the container for the form menus. 24 */ 25 function multilang_init_lang(options) { 26 //Detect if we're on the right page and if multilinguism is activated. If not return. 27 if((options.page && window.location.search.indexOf(options.page)==-1) || multilang_avail_langs.length<=1) return; 28 //set the root element of all processing 29 var root = options.root || document; 30 multilang_root = $(root); 31 //set the main menu element 32 multilang_containers = options.main_menu ? $(options.main_menu,multilang_root) : $("empty"); 33 //create menu lang template 34 multilang_menu_lang =$("<div>"); 35 $.each(multilang_avail_langs,function() { 36 multilang_menu_lang.append($("<a>").html("["+this+"]").css(this==multilang_def_lang?multilang_css_cur_link:multilang_css_link)[0]); 37 }); 38 //store all the internationalized forms 39 multilang_forms_selector = options.forms || "form"; 40 multilang_forms = $(multilang_forms_selector,multilang_root); 41 //create menu lang for the global form 42 if(multilang_containers.size()) forms_make_menu_lang(multilang_containers); 43 //init fields 44 multilang_fields_selector = options.fields; 45 multilang_menu_selector = options.form_menu; 46 forms_init_multi(); 47 } 48 49 function forms_make_menu_lang(container,target) { 50 target = target || multilang_forms; 51 $(multilang_menu_lang).clone().find("a").click(function() {forms_change_lang(this,container,target)}).end(). 52 append("<div style='clear:left'></div>").appendTo(container); 53 } 54 55 function forms_change_lang(el,container,target) { 56 var lang = el.innerHTML; 57 container = container || multilang_containers; 58 //update lang menu with current selection 59 container.find("a").each(function(){ 60 $(this).css("fontWeight",lang==this.innerHTML?"bold":"normal"); 61 }).end(); 62 lang = lang.slice(1,-1); 63 //store the fields inputs for later use (usefull for select) 64 var target_name = target!=multilang_forms?target[0].hash.value:"undefined"; 65 if(!forms_fields[target_name]) forms_fields[target_name] = $(multilang_fields_selector,target); 66 //save the current values 67 forms_fields[target_name].each(function(){ 68 forms_save_lang(this,this.form.form_lang); 69 }); 70 //change current lang 71 target.each(function(){this.form_lang = lang}); 72 //reinit fields to current lang 73 forms_fields[target_name].each(function(){forms_set_lang(this,lang)}); 74 } 75 76 function forms_init_multi(options) { 77 var target = options?options.target:null; 78 var init_forms; 79 //Update the list of form if this is an update 80 if(target) { 81 //Verify the target is really a form to be internationalized (in case of an ajax request fired by onAjaxLoad) 82 if(target==document) return; 83 init_forms = $(target).find('form').in_set($(multilang_forms_selector,multilang_root)); 84 if(!init_forms.length) return; 85 multilang_forms.add(init_forms.each(forms_attach_submit).get()); 86 } else { 87 //attach multi processing to submit event 88 init_forms = multilang_forms; 89 multilang_forms.each(forms_attach_submit); 90 } 91 forms_fields = {}; 92 forms_fields["undefined"] = $(multilang_fields_selector,multilang_forms); 93 //init the value of the field to current lang 94 //add a container for the language menu inside the form 95 init_forms.each(function() { 96 this.form_lang = multilang_def_lang; 97 var container = multilang_menu_selector ? $(multilang_menu_selector,this) : $(this); 98 container.prepend("<div class='menu_lang'>"); 99 }); 100 $(multilang_fields_selector,init_forms).each(function(){ 101 forms_init_field(this,this.form.form_lang); 102 }); 103 //create menu for each form. The menu is just before the form 104 $("div.menu_lang",init_forms).empty().each(function() { 105 //store all form containers to allow menu lang update on each container 106 //when it is triggered by global menu 107 multilang_containers.add(this); 108 forms_make_menu_lang($(this),$(this).parents("form")); 109 }); 110 } 111 112 function forms_attach_submit() { 113 var oldsubmit = this.onsubmit; 114 this.onsubmit = ""; 115 if(oldsubmit) $(this).submit(function(){forms_multi_submit.apply(this);return oldsubmit.apply(this);}) 116 else $(this).submit(forms_multi_submit); 117 } 118 119 function forms_init_field(el,lang) { 120 //Retrieves the following data 121 //1)the title element of the field 122 //2)boolean multi = the fields has a multi value 123 //3)various lang string 124 //if already inited just return 125 if(el.field_lang) return; 126 var langs; 127 var m = el.value.match(/<multi>((?:.|\n)*?)<\/multi>/); 128 el.field_lang = {}; 129 el.titre_el = $("#titre_"+el.id); 130 if(m!=null) { 131 el.multi = true; 132 match_multi.lastIndex=0; 133 while((langs=match_multi.exec(m[1]))!=null) { 134 el.field_lang[langs[1]||multilang_def_lang] = langs[2]; 135 } 136 //Put the current lang string only in the field 137 forms_set_lang(el,lang); 138 } else { 139 el.multi = false; 140 el.field_lang[lang] = el.value; 141 } 142 } 143 144 function forms_set_lang(el,lang) { 145 //if current lang is not setted use default lang value 146 if(el.field_lang[lang]==undefined) 147 el.field_lang[lang] = el.field_lang[multilang_def_lang]; 148 el.value = el.field_lang[lang]; 149 el.titre_el.html(el.value); 150 } 151 152 function forms_save_lang(el,lang) { 153 //if the lang value is equal to the def lang do nothing 154 //else save value but if the field is not empty, delete lang value 155 if(el.field_lang[multilang_def_lang]!=el.value) { 156 if(!el.value) { 157 delete el.field_lang[lang]; 158 return; 159 } 160 el.multi = true; 161 el.field_lang[lang] = el.value; 162 } 163 } 164 165 //This func receives the form that is going to be submitted 166 function forms_multi_submit(params) { 167 if(multilang_avail_langs.length<=1) return; 168 var form = this; 169 //remove the current form from the list of forms 170 multilang_forms.not(this); 171 //remove the current menu lang container from the list 172 multilang_containers.not("div.menu_lang",$(this)); 173 //build the input values 174 $(multilang_fields_selector,this).each(function(){ 175 //save data before submit 176 forms_save_lang(this,form.form_lang || multilang_def_lang); 177 //build the string value 178 var def_value = this.field_lang[multilang_def_lang]; 179 if(!this.multi) this.value = def_value; 180 else { 181 var value="",count=0; 182 $.each(this.field_lang,function(name){ 183 //save default lang value and other lang values if different from 184 //the default one 185 if(this!=def_value || name==multilang_def_lang) { 186 value += "["+name+"]"+this; 187 count++; 188 } 189 }); 190 this.value = count!=1?"<multi>"+value+"</multi>":value.replace(/^\[[a-z_]+\]/,''); 191 } 192 }); 193 //save back the params 194 if(params) $.extend(params,$(form).formToArray(false)); 195 } 196 197 jQuery.fn.in_set = function(set) { 198 var elements = this.get(); 199 var result = $.grep(set,function(i){ 200 var found = false; 201 $.each(elements,function(){ 202 if(this==i) found=true; 203 }) 204 return found; 205 }); 206 return jQuery(result); 207 }
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Wed Nov 21 10:20:27 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |