Changeset 118606 in spip-zone


Ignore:
Timestamp:
Nov 13, 2019, 6:06:36 PM (12 months ago)
Author:
Charles Razack
Message:

Version 1.4.0.

  • Nouveauté la plus visible : petite refacto du menu de langues → Noms des langues en entier au lieu des codes (fr, en...), liens affichés sous formes de boutons plus grands et centrés pour être bien visibles, ajout d'un label. Petite amélioration pour éviter qu'il y ait un saut lorsque le menu passe en sticky.
  • Configuration : les formulaires sur lesquels activer le script sont tous regroupés dans une même clé formulaires.
  • Configuration : ajout d'une option pour ajouter des sélecteurs dans le paramètre root (exemple complètement au hasard : .formulaire_editer_noisette).
  • Ajout d'un pipeline multilang_parametres pour permettre aux plugins de changer les paramètres passés au script d'init. Cas le plus courant : ajouter des formulaires à prendre en compte par le script.
  • Refactorisation du script d'init afin qu'il soit plus lisible et maintenable : séparation du javascript et du php. Au passage, correction d'un bug rigolo qui faisait que quand on décochait tous les items dans la config, le script devenait actif sur *tous* les formulaires : recherche, login, etc.
Location:
_plugins_/multilang/trunk
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/multilang/trunk

    • Property subgit:lock:7be4c3939de2c5aef221073b77e4040041bfac63 set to 2019-11-13T19:20:25.922
  • _plugins_/multilang/trunk/CHANGELOG.md

    r106747 r118606  
    22
    33Ce fichier sert de changelog, il liste les modifications lors du changement de version.
     4
     5## Version 1.4.0 (2019-11-13)
     6
     7- Ajout d'un pipeline `multilang_parametres` pour permettre aux plugins de changer les paramètres passés au script d'init. Concrètement cela permet d'ajouter des formulaires à prendre en compte par le script (entre autres).
     8- Ménage dans le script d'init afin qu'il soit plus lisible et maintenable : javascript et php sont séparés.
     9- Configuration : les formulaires sur lesquels activer le menu sont tous regroupés dans une même clé `formulaires`.
     10- Configuration : ajout d'une option qui permet d'ajouter des sélecteurs pour `root` (c.a.d d’autres formulaires).
     11- Le script n'est actif que s'il y a des éléments dans `root` (auparavant, le script s’activait sur *tous* les formulaires quand on déselectionnait tout dans la config par exemple : formulaire de recherche, de login, etc.).
     12- Menu de langues : boutons plus visibles, centrés, ajout d'un label, langues en toutes lettres, langues vides signalées par le symbole "∅" au lieu de changer la couleur de fond (ce qui pouvait faire croire à une entrée de menu active).
    413
    514## Version 1.3.0 (2017-10-11)
  • _plugins_/multilang/trunk/alire.txt

    r106748 r118606  
    6969
    7070Bon donc ca marche toujours avec ou sans mediatheque... Reste plus qu'a tester avec un plugin qui veut du multilang
    71 
  • _plugins_/multilang/trunk/formulaires/configurer_multilang.html

    r106747 r118606  
    1313                                        <h3 class="legend"><:multilang:cfg_activer:></h3>
    1414                                        <ul class="editer-groupe">
    15                                                 [(#SAISIE{case,siteconfig,
    16                                                         label_case=<:multilang:cfg_lbl_siteconfig:>,
    17                                                         defaut=on,
    18                                                         conteneur_class=pleine_largeur})]
    19                                                 #SET{defaut_on,#LISTE{rubrique,auteur,document}}
     15
     16                                                [(#REM) Formulaires à prendre en compte ]
     17                                                #SET{defaut,#ENV{formulaires,#ARRAY}|array_keys}
     18                                                [(#SET{data,#ARRAY{siteconfig,<:multilang:cfg_lbl_siteconfig:>}})]
    2019                                                <BOUCLE_objets(DATA){source tableau,#REM|lister_tables_objets_sql}{editable=oui}>
    21                                                         [(#SET{name,[(#CLE|objet_type)]})]
    22                                                         [(#SET{label,[(#VALEUR{texte_objets}|_T)]})]
    23                                                         [(#SAISIE{case,#GET{name},
    24                                                                 label_case=#GET{label},
    25                                                                 defaut='',
    26                                                                 conteneur_class=pleine_largeur})]
     20                                                #SET{objet,#CLE|objet_type}
     21                                                #SET{objet_nom,#VALEUR{texte_objets}|_T}
     22                                                #SET{data,#GET{data}|array_merge{#ARRAY{#GET{objet},#GET{objet_nom}}}}
    2723                                                </BOUCLE_objets>
    2824
    29                                                 [(#SAISIE{oui_non,multilang_public,
    30                                                         label=<:multilang:cfg_lbl_espace_public:>,
     25                                                [(#SAISIE{checkbox,formulaires,
     26                                                        label=<:multilang:cfg_formulaires_label:>,
     27                                                        data=#GET{data},
     28                                                        defaut=#GET{defaut},
     29                                                        conteneur_class=pleine_largeur
     30                                                })]
     31
     32                                                [(#SAISIE{textarea,formulaires_autres,
     33                                                        label=<:multilang:cfg_formulaires_autres_label:>,
     34                                                        explication=<:multilang:cfg_formulaires_autres_explication:>,
     35                                                        rows=2,
     36                                                })]
     37
     38                                                [(#SAISIE{case,multilang_public,
     39                                                        label_case=<:multilang:cfg_lbl_espace_public:>,
    3140                                                        defaut=''})]
    3241
    33                                                 [(#SAISIE{oui_non,multilang_crayons,
    34                                                         label=<:multilang:cfg_lbl_crayons:>,
     42                                                [(#SAISIE{case,multilang_crayons,
     43                                                        label_case=<:multilang:cfg_lbl_crayons:>,
    3544                                                        explication=<:multilang:cfg_explication_crayons:>,
     45                                                        afficher_si='@multilang_public@',
    3646                                                        defaut=''})]
    3747                                        </ul>
  • _plugins_/multilang/trunk/javascript/multilang.js

    r106747 r118606  
    7777         * C'est ce modèle qui est cloné au début de chaque formulaire
    7878         */
    79         multilang_menu_lang = $("<div class='langues'></div>");
     79        multilang_menu_lang =
     80                $("<div class='langues'></div>")
     81                .append($('<span class="langues__label">').html(eval('multilang_lang.label_langues')+'&nbsp;'));
    8082        $.each(multilang_avail_langs,function() {
    81                 var title = 'multilang_lang.title_lien_multi_'+this;
    82                 multilang_menu_lang.append($("<a class='change_lang "+this+"' title='"+eval(title)+"'></a>").html("["+this+"]"));
    83         });
    84         multilang_menu_lang.append($("<a class='recover_lang' href='#'></a>").html("["+multilang_lang.lien_desactiver+"]"));
     83                var title = 'multilang_lang.title_lien_multi_'+this,
     84                        label = 'multilang_lang.label_'+this;
     85                multilang_menu_lang.append($("<a class='langues__item change_lang "+this+"' title='"+eval(title)+"'></a>").html(eval(label)));
     86        });
     87        multilang_menu_lang.append($("<a class='langues__item recover_lang' href='#'></a>").html(multilang_lang.lien_desactiver));
    8588
    8689        //init fields
  • _plugins_/multilang/trunk/javascript/multilang_init.js.html

    r72085 r118606  
    11#CACHE{7*24*3600}
    22#HTTP_HEADER{Content-Type: text/javascript; charset=#CHARSET}
    3 [(#REM|generer_multilang_init)]
     3#SET{params,     #REM|multilang_init_parametres}
     4#SET{globales,   #REM|multilang_init_globales}
     5#SET{nb_langues, #CONFIG{langues_multilingue}|explode{","}|count}
     6#SET{has_params, #GET{params}|count|>{0}}
     7#SET{activer,    #GET{nb_langues}|>{1}|et{#GET{has_params}}}
     8<BOUCLE_activer(CONDITION) {si #GET{activer}}>
     9[(#REM)<script>]
     10
     11// Variables globales
     12var
     13        multilang_avail_langs   = "[(#GET{globales/avail_langs}|implode{','})]",
     14        multilang_avail_langs   = multilang_avail_langs.split(','),
     15        multilang_dir_langs     = [(#GET{globales/dir_langs}|json_encode)],
     16        multilang_def_lang      = "#GET{globales/def_lang}",
     17        multilang_lang_courante = "#GET{globales/lang_courante}",
     18        multilang_dir_plugin    = "#GET{globales/dir_plugin}";
     19
     20// On trie les langues : langue de l'environnement en premier,
     21// puis langue principale du site, puis les autres en ordre alphabétique.
     22// Un utilisateur de langue anglaise souhaite logiquement traduire en anglais.
     23multilang_avail_langs = jQuery.grep(multilang_avail_langs, function(value) {
     24        return (value != multilang_def_lang && value != multilang_lang_courante);
     25});
     26multilang_avail_langs.sort();
     27multilang_avail_langs.unshift(multilang_lang_courante);
     28if (multilang_lang_courante!=multilang_def_lang) {
     29        multilang_avail_langs.unshift(multilang_def_lang);
     30}
     31
     32// Appel de multilang_init_lang si
     33// - document.ready
     34// - onAjaxLoad (cas des docs et de la configuration du site)
     35jQuery(function ($) {
     36
     37        // Lance le script principal et passe le menu en sticky
     38        function multilang_init() {
     39
     40                // Appel du script principal
     41                multilang_init_lang([(#GET{params}|json_encode)]);
     42
     43                // Passe le menu en sticky
     44                if ($(".menu_multilang").length > 0) {
     45                        $(".menu_multilang").each(function () {
     46                                var $menu_lang = $(this),
     47                                        $form = $menu_lang.parents("form"),
     48                                        hauteur_menu = $menu_lang.outerHeight();
     49
     50                                $(window).scroll(function () {
     51                                        var offset = $form.offset(),
     52                                                limite_multilang = offset.top,
     53                                                limite_bas = limite_multilang + $form.height() - $form.find(".boutons").height(),
     54                                                pos_bas = $menu_lang.offset().top + hauteur_menu;
     55
     56                                        if (($(window).scrollTop() >= limite_multilang) && (pos_bas <= limite_bas) && ($(window).scrollTop() < limite_bas)) {
     57                                                if (!$menu_lang.hasClass("menu_multilang_flottant")) {
     58                                                        $menu_lang.addClass("menu_multilang_flottant");
     59                                                }
     60                                                var menu_lang_width = $menu_lang.outerWidth();
     61                                                $menu_lang.css({
     62                                                        "position": "fixed",
     63                                                        "top": 0,
     64                                                        "width": menu_lang_width + "px",
     65                                                        "z-index": "1001"
     66                                                });
     67                                                // Un padding sur la parent
     68                                                $form.css({'padding-top': hauteur_menu + 'px'});
     69                                        }
     70                                        if (($(window).scrollTop() < limite_multilang) || (pos_bas > limite_bas)) {
     71                                                $menu_lang.removeClass("menu_multilang_flottant").css({
     72                                                        "position": "static",
     73                                                        "width": "auto"
     74                                                });
     75                                                $form.css({'padding-top': ''});
     76                                        }
     77                                });
     78                        });
     79                }
     80        }
     81
     82        multilang_init();
     83        if (typeof onAjaxLoad == "function") {
     84                onAjaxLoad(multilang_init);
     85        }
     86});
     87
     88</BOUCLE_activer>
     89#FILTRE{trim}
  • _plugins_/multilang/trunk/javascript/multilang_init.js_fonctions.php

    r106747 r118606  
    55}
    66
    7 function generer_multilang_init() {
    8         $data = '';
    9         if (count($langues = explode(',', $GLOBALS['meta']['langues_multilingue'])) > 1) {
    10                 include_spip('inc/config');
    11                 $config = lire_config('multilang', array());
    12                 $root = array();
    13                 if (isset($config['multilang_public'])) {
    14                         unset($config['multilang_public']);
     7/**
     8 * Retourne les paramètres nécessaires au script d'initialisation de multilang
     9 *
     10 * Il s'agit de sélecteurs jQuery pour choisir les éléments à prendre en compte.
     11 * Retourne un tableau vide si aucun formulaire sélectionné en config ou listé via pipeline.
     12 *
     13 * @uses pipeline `multilang_parametres`
     14 * @return string Tableau associatif (vide si rien en config) :
     15 *     - root       : (string) sélecteurs jQuery d'éléments racines
     16 *     - root_opt   : (string) idem, compléments
     17 *     - forms      : (string) sélecteurs jQuery des formulaires
     18 *     - fields     : (string) sélecteurs jQuery des champs
     19 *     - fields_opt : (string) idem, compléments
     20 */
     21function multilang_init_parametres() {
     22
     23        include_spip('inc/config');
     24        $params = array();
     25        $config = lire_config('multilang', array());
     26
     27        // root = éléments racines à prendre en compte
     28        // Ce sont les conteneurs des formulaires listés dans la config.
     29        $root = array();
     30        $formulaires = is_array($config['formulaires']) ? array_filter($config['formulaires']) : array();
     31        foreach ($formulaires as $formulaire) {
     32                switch ($formulaire) {
     33                        case 'siteconfig':
     34                                $root = array_merge($root, array('div#configurer-accueil', 'div.formulaire_configurer_identite'));
     35                                break;
     36                        case 'document':
     37                                $root = array_merge($root, array('div#portfolio_portfolio', 'div#portfolio_documents', 'div#liste_documents, div.formulaire_editer_document'));
     38                                break;
     39                        case 'groupe_mots':
     40                                $root[] = 'div.formulaire_editer_groupe_mot'; // le nom du formulaire n’est pas le type !
     41                                break;
     42                        default:
     43                                $root[] = 'div.formulaire_editer_'.$formulaire;
     44                                break;
    1545                }
    16                 if (isset($config['multilang_crayons'])) {
    17                         unset($config['multilang_crayons']);
    18                 }
    19                 if (isset($config['siteconfig']) && $config['siteconfig']) {
    20                         $root[] = 'div#configurer-accueil,div.formulaire_configurer_identite' ; // Config Site
    21                         unset($config['siteconfig']);
    22                 }
     46        }
     47        // Config : autres formulaires en texte libre
     48        if (trim($config['formulaires_autres'])) {
     49                $root = array_merge($root, explode(',', $config['formulaires_autres']));
     50        }
     51        $params['root'] = $root;
    2352
    24                 foreach ($config as $conf => $val) {
    25                         if ($val == 'on') {
    26                                 if ($conf == 'document') {
    27                                         $root[] = 'div#portfolio_portfolio,div#portfolio_documents,div#liste_documents,div.formulaire_editer_document';
    28                                 } else {
    29                                         if ($conf == 'groupe_mots') {
    30                                                 $conf = 'groupe_mot'; // le nom du formulaire n’est pas le type !
    31                                         }
    32                                         $root[] .= 'div.formulaire_editer_'.$conf;
    33                                 }
    34                                 unset($config[$conf]);
    35                         }
    36                 }
    37                 // Appel de multilang_init_lang si
    38                 // - document.ready
    39                 // - onAjaxLoad (cas des docs et de la configuration du site)
    40                 if (is_array($langues_config = lire_config('multilang/langues_utilisees', 'aucune')) && count($langues_config) > 0) {
    41                         $langues = array_intersect($langues, $langues_config);
    42                 }
    43                 $langues_ltr = array();
    44                 foreach ($langues as $langue) {
    45                         $langues_ltr[$langue] = lang_dir($langue);
    46                 }
    47                 $data = '
    48         var multilang_avail_langs = "'.implode(',', $langues).'".split(\',\'),
    49         multilang_dir_langs = '.json_encode($langues_ltr).',
    50         multilang_def_lang = "'.$GLOBALS['meta']['langue_site'].'",
    51         multilang_lang_courante = "'.$GLOBALS['spip_lang'].'",
    52         multilang_dir_plugin = "'._DIR_PLUGIN_MULTILANG.'";
     53        // root_opt = compléments : formulaires ayant la classe .multilang
     54        $params['root_opt'] = array('form:has(.multilang)');
    5355
    54         // On trie les langues. Langue de l environnement en premier,
    55         // puis langue principale du site puis les autres en ordre alphabetique
    56         // Un utilisateur de langue anglaise souhaite logiquement traduire en anglais
    57         multilang_avail_langs = jQuery.grep(multilang_avail_langs, function(value) {
    58                 return (value != multilang_def_lang && value != multilang_lang_courante);
    59         });
    60         multilang_avail_langs.sort();
    61         multilang_avail_langs.unshift(multilang_lang_courante);
    62         if(multilang_lang_courante!=multilang_def_lang) multilang_avail_langs.unshift(multilang_def_lang);
     56        // fields = champs à prendre en compte
     57        $params['fields'] = array(
     58                'textarea:not(textarea#adresses_secondaires, textarea#repetitions)',
     59                'input:text:not(input#new_login, input#email, #titreparent, input.date, input.heure, input#largeur, input#hauteur, .ac_input, #url_syndic, #url_auto, .rechercher_adresse input, #champ_geocoder, #champ_lat, #champ_lon, #champ_zoom, #places, *.nomulti)',
     60                '.multilang',
     61        );
    6362
    64         jQuery(function($){
    65                 function multilang_init(){
    66                         var root = "'.implode(',', $root).'";
    67                         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,.rechercher_adresse input,#champ_geocoder,#champ_lat,#champ_lon,#champ_zoom,#places,*.nomulti),.multilang";
    68                         // on exclue aussi les form d upload (Pour les vignettes de docs, logos...)
    69                         var forms_selector = "form[class!=\'form_upload\'][class!=\'form_upload_icon\']";
    70                         // Les div qui ont un formulaire de classe multilang (pour accélérer la recherche dans le DOM,
    71                         // on passe le form et le parent sera trouvé dans lors de l\'init)
    72                         var root_opt = "form:has(.multilang)";
    73                         var fields_selector_opt = ".multilang";
    74                         multilang_init_lang({fields:fields_selector,fields_opt:fields_selector_opt,root:root,root_opt:root_opt,forms:forms_selector});
     63        // fields_opt = compléments : classe .multilang
     64        $params['fields_opt'] = array('.multilang');
    7565
    76                         if($(".menu_multilang").length > 0){
    77                                 $(".menu_multilang").each(function(){
    78                                         var menu_lang = $(this);
    79                                         $(window).scroll(function() {
    80                                                 var offset = menu_lang.parents("form").offset(),
    81                                                         limite_multilang = offset.top;
    82                                                         limite_bas = limite_multilang+menu_lang.parents("form").height()-menu_lang.parents("form").find(".boutons").height(),
    83                                                         pos_bas = menu_lang.offset().top+menu_lang.height();
    84                                                 if(($(window).scrollTop() >= limite_multilang) && (pos_bas <= limite_bas) && ($(window).scrollTop() < limite_bas)){
    85                                                         if(!menu_lang.hasClass("menu_lang_flottant")) {
    86                                                                 menu_lang.addClass("menu_lang_flottant");
    87                                                         }
    88                                                         var menu_lang_width = menu_lang.width();
    89                                                         menu_lang.css({"position": "fixed", "top": 0, "width": menu_lang_width+"px","z-index":"1001"});
    90                                                 }
    91                                                 if(($(window).scrollTop() < limite_multilang)||(pos_bas > limite_bas) )
    92                                                         menu_lang.removeClass("menu_lang_flottant").css({"position": "static", "width": "auto"});
    93                                         });
    94                                 });
    95                         }
    96                 }
    97                 multilang_init();
    98                 if(typeof onAjaxLoad == "function") onAjaxLoad(multilang_init);
    99         });
    100 ';
     66        // forms = formulaires à prendre en compte
     67        // On exclut les forms d'upload (pour les vignettes de docs, logos...)
     68        $params['forms'] = array('form[class!="form_upload"][class!="form_upload_icon"]');
     69
     70        // Permettre aux plugins d'ajouter ou modifier des choses.
     71        $params = pipeline('multilang_parametres', array(
     72                'args' => array(),
     73                'data' => $params,
     74        ));
     75
     76        // Sécurité : après le pipeline, on vérifie s'il y a des éléments en root.
     77        // Dans le cas contraire, on vide le reste sinon le script s'activerait sur *tous* les formulaires sans distinction.
     78        if (
     79                empty($params['root'])
     80                and empty($params['root_opt'])
     81        ) {
     82                unset($params['fields']);
     83                unset($params['fields_opt']);
     84                unset($params['forms']);
    10185        }
    102         return $data;
     86
     87        // Passage à la moulinette final
     88        $params = array_map(
     89                function ($v) {
     90                        return implode(',', $v);
     91                },
     92                $params
     93        );
     94        $params = array_filter($params);
     95
     96        return $params;
    10397}
     98
     99
     100/**
     101 * Retourne les variables globales nécessaires au script d'initialisation de multilang
     102 *
     103 * @return array Tableau associatif
     104 *     - avail_langs   : (array) langues activées
     105 *     - dir_langs     : (array) directions des langues
     106 *     - def_lang      : (string) langue principale
     107 *     - lang_courante : (string) langue actuelle
     108 *     - dir_plugin    : (string) chemin du plugin
     109 */
     110function multilang_init_globales() {
     111
     112        include_spip('inc/config');
     113
     114        // Langues activées
     115        $langues = explode(',', $GLOBALS['meta']['langues_multilingue']);
     116        if (is_array($langues_config = lire_config('multilang/langues_utilisees', 'aucune')) && count($langues_config) > 0) {
     117                $langues = array_intersect($langues, $langues_config);
     118        }
     119        $langues_ltr = array();
     120        foreach ($langues as $langue) {
     121                $langues_ltr[$langue] = lang_dir($langue);
     122        }
     123
     124        $globales = array(
     125                'avail_langs'   => $langues,
     126                'dir_langs'     => $langues_ltr,
     127                'def_lang'      => $GLOBALS['meta']['langue_site'],
     128                'lang_courante' => $GLOBALS['spip_lang'],
     129                'dir_plugin'    => _DIR_PLUGIN_MULTILANG,
     130        );
     131
     132        return $globales;
     133}
  • _plugins_/multilang/trunk/javascript/multilang_lang.js.html

    r72085 r118606  
    55        champs_readonly : '<:multilang:message_champs_readonly|filtrer_entites|texte_script:>',
    66        lien_desactiver : '<:multilang:lien_desactiver|filtrer_entites|texte_script:>',
     7        label_langues : '<:multilang:label_langues|filtrer_entites|texte_script:>',
    78        <BOUCLE_langues(DATA){source tableau, #GET{langues}|explode{','}}>[(#SET{lang,[(#VALEUR|traduire_nom_langue)]})][
    89        title_lien_multi_(#VALEUR) : '<:multilang:lien_multi_title{lang=#GET{lang}}|filtrer_entites|texte_script:>',][
    9         title_lien_multi_sans_(#VALEUR) : '<:multilang:lien_multi_title_sans{lang=#GET{lang}}|filtrer_entites|texte_script:>',
     10        title_lien_multi_sans_(#VALEUR) : '<:multilang:lien_multi_title_sans{lang=#GET{lang}}|filtrer_entites|texte_script:>',][
     11        label_#VALEUR : '(#GET{lang}|filtrer_entites|texte_script)',
    1012        ]</BOUCLE_langues>
    1113        numero : '<:multilang:champ_numero|html2unicode|unicode2charset:>'
  • _plugins_/multilang/trunk/lang/multilang_fr.php

    r97422 r118606  
    1818        'cfg_lbl_espace_public' => 'Utiliser multilang dans l’espace public du site',
    1919        'cfg_lbl_formstables' => 'des forms&tables',
    20         'cfg_lbl_siteconfig' => 'de la configuration du site',
     20        'cfg_formulaires_label' => 'Formulaires',
     21        'cfg_formulaires_autres_label' => 'Autres formulaires',
     22        'cfg_formulaires_autres_explication' => 'Sélecteurs jQuery séparés par des virgules : <code>.formulaire_editer_patate,.formulaire_machiner_truc:not([bidule])</code>',
     23        'cfg_lbl_siteconfig' => 'Configuration du site (accueil et identité)',
    2124        'cfg_titre_multilang' => 'Multilang',
    2225        'champ_numero' => 'Numéro',
     
    2831        // L
    2932        'label_langues_utilisees' => 'Langues utilisées par multilang',
     33        'label_langues' => 'Langues',
    3034        'lien_desactiver' => 'Tout',
    3135        'lien_multi_title' => 'Éditer les champs multilingues en « @lang@ »',
  • _plugins_/multilang/trunk/multilang.css.html

    r98294 r118606  
    3030}
    3131
    32 .menu_lang_flottant{
     32.menu_multilang_flottant{
    3333        border-bottom:3px solid #000;
    3434        background-color:rgb(255,255,255);
  • _plugins_/multilang/trunk/multilang.js.html

    r72120 r118606  
    11#CACHE{7*24*3600}
    22#HTTP_HEADER{Content-Type: text/javascript; charset=#CHARSET}
    3 [(#INCLURE{fond=javascript/multilang_init.js})]
    4 [(#INCLURE{fond=javascript/multilang_lang.js,lang})]
    5 [(#INCLURE{javascript/multilang.js})]
     3<INCLURE{fond=javascript/multilang_init.js}>
     4<INCLURE{fond=javascript/multilang_lang.js,lang}>
     5#INCLURE{javascript/multilang.js}
    66#FILTRE{trim}
  • _plugins_/multilang/trunk/multilang_administrations.php

    r98284 r118606  
    1919        $maj = array();
    2020
     21        // Installation : config par défaut
    2122        $maj['create'] = array(
    2223                array('multilang_creer_config'),
    2324        );
     25
     26        // Màj 0.1.1 : réorganisation de la config
     27        $maj['0.1.1'] = array(
     28                array('multilang_maj_011'),
     29        );
     30
    2431        include_spip('base/upgrade');
    2532        maj_plugin($nom_meta_base_version, $version_cible, $maj);
     
    2734}
    2835
    29 function multilang_creer_config() {
    30         include_spip('inc/config');
    31                 $config = lire_config('multilang');
    32         if (!is_array($config)) {
    33                 $config = array();
    34         }
    35         $config_defaut = array_merge(array(
    36                         'siteconfig' => 'on',
    37                         'article' => '',
    38                         'breve' => '',
    39                         'rubrique' => 'on',
    40                         'auteur' => 'on',
    41                         'document' => 'on',
    42                         'motcle' => '',
    43                         'site' => '',
    44                         'evenement' => ''
    45         ), $config);
    46         ecrire_meta('multilang', serialize($config_defaut));
    47 }
    4836/**
    4937 * Fonction de desinstallation
     
    5644        effacer_meta($nom_meta_base_version);
    5745}
     46
     47/**
     48 * Configuration par défaut à l'installation
     49 *
     50 * @return void
     51 */
     52function multilang_creer_config() {
     53        include_spip('inc/config');
     54        $config = lire_config('multilang', array());
     55        $config_defaut = array_merge_recursive(array(
     56                'formulaires' => array(
     57                        'siteconfig' => 'on',
     58                        'rubrique'   => 'on',
     59                        'auteur'     => 'on',
     60                        'document'   => 'on',
     61        )), $config);
     62        ecrire_config('multilang', $config_defaut);
     63}
     64
     65/**
     66 * Mise à jour schéma 0.1.1 : réorganisation de la config
     67 *
     68 * On met tout ce qui concerne les formulaires dans une clé `formulaires`.
     69 *
     70 * @return void
     71 */
     72function multilang_maj_011() {
     73        include_spip('inc/config');
     74        include_spip('base_objets');
     75        include_spip('inc/filtres');
     76        $config          = lire_config('multilang', array());
     77        $formulaires     = array_map('objet_type', array_keys(lister_tables_objets_sql()));
     78        $formulaires[]   = 'siteconfig';
     79        $cfg_formulaires = array();
     80        foreach ($config as $cle => $valeur) {
     81                $surnoms   = objet_info($cle, 'type_surnoms');
     82                $surnoms   = is_array($surnoms) ? $surnoms : array();
     83                $surnoms[] = $cle;
     84                if (array_intersect($surnoms, $formulaires)) {
     85                        $cfg_formulaires[$cle] = $valeur;
     86                        foreach ($surnoms as $surnom) {
     87                                $surnom = str_replace('-', '', $surnom); // mot-cle => motcle
     88                                unset($config[$surnom]);
     89                        }
     90                }
     91        }
     92        $config['formulaires'] = array_filter($cfg_formulaires);
     93        ecrire_config('multilang', $config);
     94}
  • _plugins_/multilang/trunk/paquet.xml

    r116095 r118606  
    22        prefix="multilang"
    33        categorie="edition"
    4         version="1.3.0"
     4        version="1.4.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.2.*]"
    77        logo="images/multilang-32.png"
    8         schema="0.1.0"
     8        schema="0.1.1"
    99        documentation="https://contrib.spip.net/?article3498"
    1010>
     
    2424        <pipeline nom="affichage_final" inclure="multilang_pipelines.php" />
    2525        <pipeline nom="formulaire_traiter" inclure="multilang_pipelines.php" />
     26        <pipeline nom="mutilang_parametres" action="" />
    2627
    2728        <menu nom="configurer_multilangue" titre="multilang:configuration_multilang" parent="menu_configuration" icone="images/multilang-16.png" />
  • _plugins_/multilang/trunk/prive/style_prive_plugin_multilang.html

    r98295 r118606  
    1 #CACHE{0*100,cache-client}
    2 #HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
     1[(#REM)
     2
     3        Ce squelette definit les styles de l'espace prive
     4
     5        Note: l'entete "Vary:" sert a repousser l'entete par
     6        defaut "Vary: Cookie,Accept-Encoding", qui est (un peu)
     7        genant en cas de "rotation du cookie de session" apres
     8        un changement d'IP (effet de clignotement).
     9
     10        ATTENTION: il faut absolument le charset sinon Firefox croit que
     11        c'est du text/html !
     12        <style>
     13]
     14#CACHE{3600*100,cache-client}
     15#HTTP_HEADER{Content-Type: text/css; charset=utf-8}
    316#HTTP_HEADER{Vary: Accept-Encoding}
    417
     
    1023.menu_multilang {
    1124        background-color:transparent;
    12         padding:5px;
     25        border-bottom: 3px solid transparent;
     26        transition: all 0.2s;
    1327}
    1428
    15 .menu_multilang .langues{
    16         overflow:auto;
     29/* Boutons de langue */
     30.menu_multilang .langues {
     31        display: flex;
     32        flex-flow: row wrap;
     33        align-items: center;
     34        justify-content: center;
     35        text-align: center; /* vieux navs */
     36        overflow: auto;
     37        margin: 1em 0;
    1738}
    1839
    19 .menu_multilang .langues a{
    20         cursor:pointer;
    21         font-weight:normal;
    22         margin-right:2px;
    23         display:block;
    24         float:left;
     40.menu_multilang .langues__item {
     41        display: inline-block; /* vieux navs */
     42        flex: 0 1 auto;
     43        padding: 0.33em 0.66em;
     44        margin: 0.33em 0.33em 0 0;
     45        background-color: [#(#GET{claire}|couleur_eclaircir)];
     46        border: 1px solid transparent;
     47        cursor: pointer;
     48        font-weight: 400;
     49        transition: all 0.2s;
     50        border-radius: 0.2em;
     51        text-decoration: none;
    2552}
    2653
    27 .menu_multilang .langues a.on{
    28         font-weight:bold;
     54.menu_multilang .langues__item:first-letter {
     55        text-transform: uppercase;
    2956}
    3057
    31 .menu_multilang .langues a.empty{
    32         background-color:#GET{foncee};
    33         padding:2px;
    34         color:#fff;
     58.menu_multilang .langues__item.on,
     59.menu_multilang .langues__item:hover,
     60.menu_multilang .langues__item:focus {
     61        background-color: #GET{foncee};
     62        color: #fff;
    3563}
    3664
    37 .menu_multilang .multilang_message{
    38         clear:both;
     65.menu_multilang .langues__item.empty:before {
     66        content: '∅';
     67        margin-right: 0.25em;
    3968}
    4069
    41 .menu_lang_flottant{
    42         border-bottom:3px solid #GET{foncee};
     70.menu_multilang .langues__label {
     71        display: inline-block; /* vieux navs */
     72        padding-left: 2.5em;
     73        margin: 0.33em 0.33em 0 0;
     74        background-image: url(#CHEMIN{prive/themes/spip/images/icone-multilang.svg});
     75        background-repeat: no-repeat;
     76        background-size: 2em auto;
     77        background-position: left center;
     78}
     79
     80.menu_multilang .multilang_message {
     81        padding: 0.25em 0.5em;
     82        clear: both;
     83        text-align: center;
     84        font-weight: bold;
     85        background-color: hsla(0, 0%, 0%, 0.066);
     86}
     87.menu_multilang .multilang_message p:last-child {
     88        margin: 0;
     89}
     90/* Mode sticky */
     91.menu_multilang_flottant {
     92        border-bottom-color: #GET{foncee};
    4393        background-color:[#(#GET{claire}|couleur_eclaircir)];
    44         opacity:.8;
     94        opacity: 0.9;
     95}
     96.menu_multilang_flottant .langues {
     97        margin: 0;
     98}
     99
     100.menu_multilang_flottant .langues__item {
     101        border-bottom-left-radius: 0;
     102        border-bottom-right-radius: 0;
    45103}
    46104
     
    48106<BOUCLE_langues(POUR){tableau #GET{langues}|explode{','}}>
    49107.multi_lang_#VALEUR {
    50         background-position:98% 1px;
    51         background-repeat:no-repeat;
    52         background-image:url([(#VAL{Multi #VALEUR}|image_typo{taille=11,couleur=cccccc}|extraire_attribut{src}|url_absolue)]);
     108        background-position: 98% 1px;
     109        background-repeat: no-repeat;
     110        background-image: url([(#VAL{Multi #VALEUR}|image_typo{taille=11,couleur=cccccc}|extraire_attribut{src}|url_absolue)]);
    53111}
    54112</BOUCLE_langues>
    55113
    56114.multi_lang_no_multi {
    57         background-position:98% 1px;
    58         background-repeat:no-repeat;
    59         background-image:url([(#VAL{No multi}|image_typo{taille=11,couleur=cccccc}|extraire_attribut{src}|url_absolue)]);
     115        background-position: 98% 1px;
     116        background-repeat: no-repeat;
     117        background-image: url([(#VAL{No multi}|image_typo{taille=11,couleur=cccccc}|extraire_attribut{src}|url_absolue)]);
    60118}
    61119
    62120.multi_lang_broken {
    63         background-position:98% 1px;
    64         background-repeat:no-repeat;
    65         background-image:url(#CHEMIN{images/multi_forbidden.png});
     121        background-position: 98% 1px;
     122        background-repeat: no-repeat;
     123        background-image: url(#CHEMIN{images/multi_forbidden.png});
    66124}
    67125
Note: See TracChangeset for help on using the changeset viewer.