Naviguer dans la langue du visiteur

© Christian PAULUS. Document créé le 28 octobre 2007 , mis à jour le 5 juillet 2009.

Science sans conscience n’est que ruine de l’âme. François Rabelais

Accueil du site > Astuces > SPIP > Naviguer dans la langue du visiteur

Gestion des langues / SPIP 1.9.2c

Votre site Internet - sous SPIP - est en plusieurs langues (multilingue ou plurilingue). Vous souhaitez que le visiteur découvre votre site dans la langue qu’il vient de paramétrer dans son navigateur.

Voici une méthode qui semble donner de bons résultats. Elle s’appuie au maximum sur les fonctions déjà disponibles dans SPIP. A vous de l’optimiser si besoin est.

Etre accueilli dans sa langue

L’option SPIP forcer_lang demande à SPIP de prendre en compte le cookie du visiteur [1]. Cette option est à placer dans le script mes_options.php.

<?php

    
// mes_options.php
    
$forcer_lang true ;

?>

L’utilisation du critère lang ? dans une boucle permet de ne sélectionner que l’article dans la langue du visiteur [2].

Exemple :

<B_introduction>
<BOUCLE_introduction(ARTICLES){id_rubrique}{lang?}{0,1}>
[<div class="chapo">(#CHAPO)</div>]
[<div class="texte">(#TEXTE)</div>]
</BOUCLE_introduction>
</B_introduction>

Cet exemple sélectionnera l’article dans la langue souhaitée. S’il n’y a pas au moins un article traduit, ce sera le grand vide.

Reconnaître le navigateur

Si votre visiteur a correctement paramétré son outil de navigation, il semble logique que lors de sa visite, c’est dans cette langue sélectionnée que les pages de votre site doivent apparaître. La fonction SPIP utiliser_langue_visiteur() remplit cette fonction, elle est à placer dans votre script mes_fonctions.php.

<?php
    
    
// mes_fonctions.php
    
utiliser_langue_visiteur();

?>

Un menu pour changer de langue

Vous pouvez utiliser la balise SPIP #MENU_LANG [3] pour présenter une liste défilante des langues disponibles. Mais lorsqu’il y a peu de versions linguistiques, un simple lien sera amplement suffisant, et parfois plus esthétique.

Le filtre url_langues_action() est une adaptation de url_lang() [4] qui complète un URL afin de prendre en compte le choix du visiteur.

<?php

function url_langues_action ($langues) {
    
include_spip("inc/charsets");
    
$texte "";
    
$tab_langues explode(","$langues);
    
$url parametre_url(generer_url_action('cookie'), 'url'self(true));
    while ( list(
$key$value) = each($tab_langues) ) {
        if (
$value == $GLOBALS['spip_lang']) {
            
// n'affiche pas la langue en cours
            //$texte .= ""
            // . "<span class='languencours'>"
            // . traduire_nom_langue($value) 
            // . "</span>&nbsp;";
        
}
        else {
            
$langue ucfirst(traduire_nom_langue($value));
            
$texte .= ""
                
"<li>"
                
"<a href=\"" $url "&var_lang=" 
                
$value "\""    
                
" title=\"$langue\">$langue</a></li>\n"
                
;
        }
    }
    
$texte "<ul>\n".$texte."</ul>\n";
    return (
$texte);
}

?>

Ce filtre est à recopier dans votre script mes_fonctions.php.

Utilisez ensuite ce filtre dans votre squelette. Par exemple dans le script de navigation inc-navigation.php :

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

Des liens pour les moteurs

Mais si SPIP tient compte de la langue utilisateur et affiche automatiquement l’article demandé dans la langue souhaitée, le cache de certains navigateurs, et bien sûr les moteurs de recherche, se mélangeront les pinceaux. Il faut donc compléter l’URL appelée par la valeur de la langue.

Le filtre url_lang_visiteur() a pour vocation de rajouter à l’URL donnée en paramètre l’attribut lang et sa valeur si la langue du visiteur – qui se trouve dans $spip_lang – est autre que la langue par défaut de votre site.

Ce filtre est lui aussi, à ajouter dans votre script mes_fonctions.php :

<?php

function url_lang_visiteur($url) {
    global 
$spip_lang;

    if(
$spip_lang != $GLOBALS['meta']['langue_site']) {
        
$url parametre_url($url'lang'$spip_lang);
    }
    return(
$url);
}

?>

Il suffit ensuite de placer ce filtre dans les URLs du menu de navigation ou autres URLs principales.

Par exemple, un menu de navigation un peu basique :

<ul>
<BOUCLE_rubriques(RUBRIQUES){racine}{par num titre, titre}>
<li>
<a href="[(#URL_RUBRIQUE|url_lang_visiteur)]" class="titre[ (#EXPOSE)]" [title="(#TITRE)"]>
</li>
</BOUCLE_rubriques>
</ul>

En espérant que ce billet puisse vous aider.

Notes

[1] Spip.net : Réaliser un site multilingue

[2] Ibid.

[3] Spip.net : Les balises propres au site

[4] Spip-contrib : Formulaire menu_lang plat, par natalia

Plussoyez !

Les forums sont fermés.

  • Naviguer dans la langue du visiteur 3 novembre 2007 23:33, par arriflex

    Bonjour,

    Je cherche à créer un site multilangue (3 langues) sous SPIP.

    Je voudrais que l’utilisateur puisse choisir lsa langue non pas avec la balise #MENU_LANG mais en cliquant sur une icone (un drapeau) présente sur chaque page.

    Tous les éléments du site ont une traduction (articles, menus...) et je souhaiterai que, une fois la langue choisie, la navigation reste dans cette langue.

    Savez-vous comment je pourrais faire pour coder ces icones. Peut-être grâce au filtre que vous proposer mais je ne vois pas comment...

    Merci beaucoup à vous.

    Les forums sont fermés.

    • Naviguer dans la langue du visiteur 4 novembre 2007 17:35, par Christian PAULUS

      On peut très bien suivre l’exemple donné dans cette page et remplacer les liens “texte” par des liens “image”.

      Du style :

      <?php

      // extrait de code

      $texte .= ""
      _                 "<li>"
      _                 "<a href=\"" $url "&var_lang=" 
      _                 $value "\""    
      _                 " title=\"$langue\"><img src='drapeau' alt='' /></a></li>\n"
      _                 
      _ ?>

      Je n’ai pas donné ce type d’exemple (drapeau) car souvent déprécié par l’internaute (comment faire comprendre par un drapeau qui symbolise un pays, que le site est accessible à des francophones pour lesquels il n’y a pas de symbole graphique).

      Les forums sont fermés.

      • Naviguer dans la langue du visiteur 10 novembre 2007 15:20, par arriflex
        Merci beaucoup pour votre réponse.
        Je n’arrive cependnt pas (étant très mauvais en php) à faire en sorte d’attribuer un drapeau différent par langue.

        Les drapeaux s’appellent drapofr.gif, drapoen.gif et drapopl.gif, et j’ai essayé, sans succès, d’associer le drapeau à la bonne langue.

        Sauriez-vous comment cela peut-il être fait ?

        Merci beaucoup pour ce code et ces explications.

        Les forums sont fermés.

        • Naviguer dans la langue du visiteur 10 novembre 2007 16:26, par Christian PAULUS

          A priori, un code du style :

          <?php

          // extrait de code

          $texte .= ""
          _   "<li>"
          _   "<a href=\"" $url "&var_lang=" $value "\""    
          _   " title=\"$langue\">"
          _   "<img src='/img/drapo" $langue ".gif' alt='' width='16' height='16' />"
          _   "</a></li>\n"
          _   
          _ ?>

          devrait faire l’affaire, en admettant que tous les dapeaux soient dans le dossier img à la racine du site.

          Les forums sont fermés.

          • Naviguer dans la langue du visiteur 10 novembre 2007 17:59, par arriflex

            Merci infiniement !

            C’est presque parfait, seulement SPIP n’affiche pas le drapeau Français (drapoFrançais.gif) dans les interfaces en Anglais et Polonais.

            C’est peut-être du à la présence d’un "ç"

            Merci beaucoup en tout cas pour ce code qui a presque complètement résolu mon problème !

            Les forums sont fermés.

          • Naviguer dans la langue du visiteur 10 novembre 2007 18:12, par arriflex

            C’est bon, j’ai trouvé la solution : j’ai remplacé . "img src=’squelettes/images/drapo" . $langue . ".gif’ width=’23’ height=’23’" par . "img src=’squelettes/images/drapo" . $value . ".gif’ width=’23’ height=’23’" et ai renommé mes drapeaux "drapofr.gif", "drapoen.gif" et "drapopl.gif".

            Merci beaucoup à vous !!!

            Les forums sont fermés.

            • Naviguer dans la langue du visiteur 3 octobre 2008 12:25, par RP

              Bonjour,

              Les drapeaux ne s’affichent pas.
              Ils sont dans le répertoire IMG/rep_flag
              Mes drapeaux sa’appelent fr.gif et en.gif

              J’ai mis $langue dans alt pour avoir un affichage.
              Valeurs affichées dans ce cas : English Français

              Lorsque je mets $value dans alt les valeurs sont en et fr

              Voici mon code :

              Appel de la fonction dans menu.html

              Lorsque je fais un appel en forçant le nom du drapeau, celui-ci ne s’affiche pas

              Une idée ?

              Les forums sont fermés.

  • Naviguer dans la langue du visiteur 14 novembre 2007 15:08, par Antoine
    Bonjour,
    J’ai un pb. avec la page article dans un site (SPIP 1.9.2c [10268]) configuré en multilingue, avec un menu de langue activé sur les articles et les rubriques. Un changement de langue à partir de la page article sur le site public abouti à une page d’erreur 404. Tous les titres : du site, des rubriques et des articles sont par contre bien gérés au changement de langue avec les balises , ainsi que l’affichage des bons articles (correspondant à la langue choisie) dans les pages sommaire, rubrique et article. L’option : $forcer_lang = true ; est présente dans mes_options.php (dossier ecrire) et l’option : utiliser_langue_visiteur() ; dans mes_fonction.php (dossier squelettes). Le filtre lang est utilisé sur les boucles.
    J’ai sans doute oublié quelque chose, mais quoi ?
    Antoine

    Les forums sont fermés.

  • Naviguer dans la langue du visiteur 2 décembre 2007 21:34, par Tadzio

    Bonsoir et merci pour ce script qui fonctionne à merveille !
    Bien que ma question ne soit pas directement liée à la navigation par elle-même, elle reste liée à la gestion des langues...
    Voilà mon problème :
    J’ai découvert SPIP il y a moins d’un mois, et je suis en train d’adapter un squelette pour mes besoins propres en FR et EN. Mon problème est lié au format d’affichage des dates de publication des articles et des brèves dans les squelettes, savoir MM JJ, AAAA en anglais et JJ MM AAAA en français.
    Mon PHP étant limité, verriez-vous un moyen, en fonction de la langue de l’utilisateur, d’afficher dans le squelette la date de publication d’un article dans le format "Mardi 27 novembre 2007" quand la langue est le FR, et "Tuesday November 27, 2007" quand c’est en EN ?

    Merci par avance, en vous souhaitant bonne continuation.
    Tadzio

    Les forums sont fermés.

    • Naviguer dans la langue du visiteur 3 décembre 2007 01:25, par Christian PAULUS

      (Nota : proposition testée avec succès sur site multilingue / SPIP 192c.)

      Etrange en effet.

      A priori, il faut modifier le fichier /ecrire/lang/spip_en.php qui ne semble pas tenir compte de la translation fr/en.

      Les lignes :

      'date_de_mois_1' => '@j@ @nommois@',
      'date_de_mois_10' => '@j@ @nommois@',
      'date_de_mois_11' => '@j@ @nommois@',
      'date_de_mois_12' => '@j@ @nommois@',
      'date_de_mois_2' => '@j@ @nommois@',
      'date_de_mois_3' => '@j@ @nommois@',
      'date_de_mois_4' => '@j@ @nommois@',
      'date_de_mois_5' => '@j@ @nommois@',
      'date_de_mois_6' => '@j@ @nommois@',
      'date_de_mois_7' => '@j@ @nommois@',
      'date_de_mois_8' => '@j@ @nommois@',
      'date_de_mois_9' => '@j@ @nommois@',

      sont identiques à spip_fr.php. Donc sans translation jour_mois -> mois_jour.

      Curieux, mais je ne vois que ça, car les noms sont - eux - traduits correctement !

      Donc dans ce fichier, les corrections :

      'date_de_mois_1' => '@nommois@ @j@',
      'date_de_mois_10' => '@nommois@ @j@',
      'date_de_mois_11' => '@nommois@ @j@',
      'date_de_mois_12' => '@nommois@ @j@',
      'date_de_mois_2' => '@nommois@ @j@',
      'date_de_mois_3' => '@nommois@ @j@',
      'date_de_mois_4' => '@nommois@ @j@',
      'date_de_mois_5' => '@nommois@@j@',
      'date_de_mois_6' => '@nommois@ @j@',
      'date_de_mois_7' => '@nommois@ @j@',
      'date_de_mois_8' => '@nommois@ @j@',
      'date_de_mois_9' => '@nommois@ @j@',

      corrigent ce soucis.

      Pour ajouter la virgule après le nom du mois, toujours dans le fichier spip_en.php :

      Avant :

      'date_fmt_jour_mois_annee' => '@jourmois@ @annee@',

      Après :

      'date_fmt_jour_mois_annee' => '@jourmois@, @annee@',

      Enfin, pour ajouter le nom du jour (Monday, ou Lundi si fr...) il suffit dans le squelette d’appeler la balise avec le bon filtre :

      [<div class="date">[(#DATE|nom_jour) ](#DATE|affdate_jourcourt)</div>]

      Le problème de cette solution est qu’elle touche directement la distribution de SPIP. Si elle vous convient, ne pas oublier de rectifier le tir (si besoin) en cas de mise à jour.

      Quelqu’un a une meilleure idée ?

      Les forums sont fermés.

      • Naviguer dans la langue du visiteur 3 décembre 2007 14:03, par Tadzio

        Merci beaucoup pour votre réponse rapide...
        En fait, j’utilise déjà cette solution que j’avais reprise sur spip-contrib, et effectivement sur 1.9.2, c’est ok. Ce qui me chiffonne, c’est qu’il faille modifier les fichiers de base de SPIP (ca ne marche pas si intallé dans le fichier lang local du squelette) ; en terme de portabilité du squelette, à mon avis, ce n’est pas très bon... Quand j’ai décidé de créer un site perso motorisé par SPIP il y a moins d’un mois, j’ai tellement galéré avec des squelettes clé-en-main où il fallait tout modifier à droite et gauche (empilement de màj pour suivre l’évolution de SPIP), que j’ai décidé d’en choisir un le plus light possible et de le configurer selon mes besoins...
        Bref, quand j’ai vu votre code (qui doit être un filtre, si j’ai tout bien compris de SPIP), je pensais qu’il y aurait une solution simple de ce genre, que l’on pourrait par la suite appliquer à toutes les balises #DATE_xxx.
        Dans l’esprit de votre code pour les drapeaux de langue, je pense a un filtre avec 2 array MOIS et JOURS dans chaque langue, et à un code source qui assemble le tout pour renvoyer en $texte une date formatée ; une chose du genre (#DATE|formatdate{#LANG,arg}) ou arg serait un choix long/court pour avoir une format Wednesday December 3, 2007 ou Wed Dec 3, 2007.
        En passant par un array perso en FR, cela permettrait de contourner la minuscule du format "jour" des jours dans SPIP, gênant quand "jour" est en début de phrase...

        Comme je passe "brutalemet" ;) du HTML pur au PHP, j’ai bien une idée de ce qu’il faut faire, mais je ne maitrise pas encore trop l’affaire pour finaliser le code...

        Si vous pouviez juste me donner un schéma de code général pour ce filtre, ou le déclarer (option/fonction), je pense etre capable de boucher les trous... Ce que je ne sais pas faire, c’est reprendre la date depuis la balise d’appel, et travailler avec pour renvoyer $texte dans le bon format court/long...

        Voilà, j’espère ne pas avoir été trop brouillon,
        Merci par avance pour votre aide

        Les forums sont fermés.

        • Naviguer dans la langue du visiteur 3 décembre 2007 20:19, par Christian PAULUS

          Pour écrire ses propres filtres, lire cet article sur spip.net. Voir le paragraphe "Ajouter ses propres fonctions".

          Bon courage !

          Les forums sont fermés.

          • Naviguer dans la langue du visiteur 5 décembre 2007 06:25, par Tadzio
            Merci beaucoup pour le lien vers ce tutorial. J’ai enfin compris le fonctionnement et l’appel des filtres depuis le squelette. Bonne continuation à ce site qui m’a été fort utile !

            Les forums sont fermés.

  • Naviguer dans la langue du visiteur 23 janvier 2009 17:21, par rex

    Franchement merci pour cet article très utile. Spip manque un peu d’explication à ce niveau.

    Merci beaucoup

    Les forums sont fermés.