[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/dist/javascript/ -> multilang.js (source)

   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  }


Généré le : Wed Nov 21 10:20:27 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics