Formulaire menu_lang plat sans URL sur la langue sélectionnée

Une variation sur le choix des langues et de l’aspect de l’URL engendrée

Dans un site multilingue, #MENU_LANG permet aux visiteurs de passer d’une langue à l’autre. Pour cela, il dépose un cookie sur l’ordinateur du visiteur où il indique en quelle langue naviguer. Cette contrib agit exactement pareil, mais n’affiche pas le choix des langues de la même manière.

Il s’agit d’afficher #MENU_LANG mais :
-  une langue à côté de l’autre
-  sans URL pour la langue dans laquelle on navigue

Installation

Configuration site

Vous avez dans un premier temps configuré, dans la partie privée de SPIP (configuration : gestion des langues > multilinguisme), toutes les langues dans lesquelles sera traduit votre site, en cochant / décochant celles-ci dans la longue liste.

Préparation de « mes_fonctions.php »

Si vous n’avez pas encore créé le fichier mes_fonctions.php, créez un fichier et nommez-le mes_fonctions.php dans votre répertoire /squelettes. Collez le code suivant dans un premier temps, en veillant bien à ne pas avoir de caractères (espaces, retour de chariot…) ni avant, ni après :

<?php

?>

Puis, entre les deux balises ci-dessus, copiez/collez dans ce fichier la fonction qui suit (fonction mise à jour le 22/05/08) :

Pour afficher les langues en deux lettres (EN - FR) :

// menu_lang plat sans URL sur la langue sélectionnée
function url_lang ($langues) {
    include_spip('inc/charsets');    
    $texte = '';
    $tab_langues = explode(',', $GLOBALS['meta']['langues_multilingue']);
    while ( list($clef, $valeur) = each($tab_langues) ) 
	if ($valeur == $GLOBALS['spip_lang']) { 
	$texte .= '<span class="languencours">'.$valeur.'</span>&nbsp;'; 
	}
	else { $GLOBALS['delais'] = 0;
	$texte .= '<a href="'.parametre_url(generer_url_action('cookie'), 'url', parametre_url(self(true), '&'), '&').'&amp;amp;var_lang='.$valeur.'" alt="'.traduire_nom_langue($valeur).'">'.$valeur.'&nbsp;</a>'; 
	}
    return $texte;
}
//fin

Pour afficher les langues en entier (English - Français) :

// menu_lang plat sans URL sur la langue sélectionnée
function url_lang ($langues) {
    include_spip('inc/charsets');
    $texte = '';
    $tab_langues = explode(',', $GLOBALS['meta']['langues_multilingue']);
    while ( list($clef, $valeur) = each($tab_langues) ) 
	if ($valeur == $GLOBALS['spip_lang']) { 
	$texte .= '<span class="languencours">'.traduire_nom_langue($valeur).'</span>&nbsp;'; 
	}
	else { $GLOBALS['delais'] = 0;
	$texte .= '<a href="'.parametre_url(generer_url_action('cookie'), 'url', parametre_url(self(true), '&'), '&').'&amp;amp;var_lang='.$valeur.'" alt="'.traduire_nom_langue($valeur).'">'.traduire_nom_langue($valeur).'&nbsp;</a>'; 
	}
    return $texte;
}
//fin

Utilisation

Squelettes

Dans vos squelettes, appelez le menu avec la balise #CONFIG{langues_utilisees} suivie du filtre url_lang :

[<div class="menu_langues">(#CONFIG{langues_utilisees}|url_lang)</div>]

Feuilles de styles

Dans vos CSS, vous pouvez personnaliser la balise avec la classe « .menu_langues » et « .languencours »

Exemple

Exemple de résultat visible ici.

Discussion

18 discussions

  • pour les utilisateurs de spip 2.0, il y a également cette page à consulter qui apporte des éléments de réponse :
    http://www.spip-contrib.net/MenuLangSurClic

    Répondre à ce message

  • Je mets le résultat de la discussion sur le forum Bandeau langues façon Spip.net

    En rajoutant le critère {fusion lang} (qui me sauve !) et un test sur la balise #TOTAL_BOUCLE , j’y suis arrivé à ce code :

    <p class="langues">
    
    <span class="invisible"><:info_langues:> : </span>
    
    <BOUCLE_langues(RUBRIQUES){racine}{fusion lang}{par lang}>
    
    [(#TOTAL_BOUCLE|>{1}|?{<span lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR"[ (#LANG|=={#ENV{lang}}|?{class="on",''})]>[&#91;<a href="#URL_SITE_SPIP/?lang=#LANG" rel="alternate" title="[(#LANG|traduire_nom_langue)]">(#LANG|unique{langues})</a>&#93;]
    </span>})]
    
    </BOUCLE_langues>	
    		
    </p>

    Le menu des langues apparaît seulement s’il y a au moins deux langues.

    Répondre à ce message

  • je n’arrive pas à integrer la fonction de traduction des articles en même temps que celle du site, j’ai essayé cette contrib ainsi que celles proposées dans le forum mais rien n’y fait , j’ai l’impression que c’est une question de version, n’y a t-il pas quelqu’un qui aurait la solution ?
    http://anglais.maternelle.free.fr/spip.php?article9&lang=en

    audedo

    Répondre à ce message

  • Finalement le plus a jour est là je crois :
    http://programmer.spip.org/Forcer-un-changement-de-langue-d

    Répondre à ce message

  • Répondre à ce message

  • Bonjour, et merci pour cette contrib.

    J’essaie d’utiliser sur un site SPIP 2.O.3
    Les liens s’affichent biens, mais sans l’url elle même !

    Ca me génère le lien suivant :
    href=« http://127.0.0.1/RAS2/spip.php?action=cookie&var_lang=fr » qui m’envoie dans l’espace privé.

    Est ce du à Spip 2 ? Que puis je faire ? Je ne comprend rien à la partie php... je suppose que c’est là
    parametre_url(self(true), ’&’)
    que réside le problème, mais... ?

    Répondre à ce message

  • Bonjour, je vous conseille de regarder de ce côté-là :
    Traduction d’un article ET de l’interface d’un clic

    Répondre à ce message

  • Y-a-t’il un moyen, au clic sur le lien anglais, de renvoyer sur une page entièrement traduite ?
    Car la traduction marche essentiellement pour les éléments spip, et j’aimerais que ma propre page traduite soit affichée.

    Répondre à ce message

  • Bonjour,

    J’utilise ce script sur mon site mais il y a un petit disfonctionnement.

    En effet, l’url généré n’est pas du tout (80% des cas) celui de la page courante. Je suis sous SPIP 1.9.2g

    Avez-vous des suggestions ?

    Répondre à ce message

  • 4
    Vinchoz

    Bonjour,

    J’ai utilisé ce menu de mon site.
    Il s’affiche correctement
    Il se trouve que le lien de traduction se retrouve « fixer » : je m’explique :
    -  Je vide le cache ds l’interface admin
    -  je vais sur le site... et navigue... je demande un changement de langue pour l’article X : ça fonctionne
    -  si je continue à naviguer et redemande une traduction d’un autre article... le lien me renvoie toujours sur la traduction de l’article X, et cela même si je me connecte avec une autre machine.
    ... ds l’urgence je l’ai fait sur la homepage... mais c’est pas très pratique.

    Avez-vous une idée ?

    Merci de votre collaboration

    Vin.

    • vianatalia

      J’ai remarqué récemment un dysfonctionnement mais apparemment pas le même : je suis sur la page accueil en EN. Je vais à la page recherche. Je change la langue : FR. Je navigue vers des pages que je n’ai pas encore visité : tout va bien. Je reviens à la page accueil, elle s’affiche en EN.

      Dans les deux cas je crois que c’est lié au cache de SPIP. Si jamais je mets le cache à 0 dans le squelette, le problème disparaît. Non ?

    • Bonjour,

      Tout d’abord merci de votre réponse.
      La piste semble plausible.
      J’ai fait l’essai en rajoutant : #CACHE{0} au début des squelettes : sommaire, rubrique et article.html
      Résultat : aucun changement notoire malheureusement !
      Le changement de langue s’effectue toujours correctement mais cela ne renvoie pas sur la bonne page.

      Cela fonctionne si, dans une page je clic sur le bouton « Recalculer la page » : Là le lien se fait parfaitement.

      Mais après : tous les changement de langue ramène à cette dernière traduction : comme si le numéro de l’article ou de la rubrique étais « scotché » une 1re fois dans le lien langue.

      Je continue à chercher mais je ne suis pas très à l’aise en php.

      Salutations

      Vin.

    • Bonjour, a priori si l’on rajoute à la ligne « else » du fichier mes_fonctions.php $GLOBALS['delais'] = 0; ça marche bien. Merci de me dire s’il y a encore des problèmes. Ce qui donne :

              else { $GLOBALS['delais'] = 0;

      Le code est mis à jour dans l’article ci-dessus.

    • Vinchoz

      Bonjour,

      Cela à l’air de marcher parfaitement :-) ... si on n’oublie pas de vider le cache ds la partie admin.
      Je vous remercie de votre intervention... et de cette contrib !!!

      Meilleures salutations

      Vin.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom