Home > PHP > Site multilingue: déterminer la langue du visiteur

Site multilingue: déterminer la langue du visiteur

Sur les sites qui sont disponibles en plusieurs langues, il est fréquent de trouver une page “d’accueil” comportant plusieurs drapeaux ou un quelconque moyen de choisir son langage que l’on veut voir affiché. Cette pratique, aussi mauvaise pour le référencement qu’en termes d’ergonomie, peut facilement être évitée grâce au header “Accept-Language”.

Lors de chaque requête vers un serveur HTTP, le navigateur de l’internaute envoie un header “Accept-Language” contenant les langages qu’il accepte (ses favoris), dans l’ordre de préférence. Par exemple, chez moi, sa valeur est : “Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3″ (le q est un quality factor si on en croit la RFC 2616, on peut ne pas s’en occuper dans l’utilisation qui nous concerne)

Imaginons qu’on aie un site existant en français et anglais, avec un répertoire par version, placé à la racine (Encore une fois, je schématise, merci de ne pas trop m’en tenir rigueur… même remarque pour les noms des variables ci-dessous).

Plaçons le script PHP suivant sur la fameuse “page d’accueil” (qui est tout sauf accueillante) de notre site multilingue:

  1. $langagesSite = array(‘en’ => ‘English’, ‘fr’ => ‘Français’);
  2. $langageDefaut = ‘fr’;
  3. $langagesClient = split ([,;]‘, $_SERVER[‘HTTP_ACCEPT_LANGUAGE’]);
  4. $selected = null;
  5. foreach($langagesClient as $l) {
  6.       if (isset($langagesSite[$l]) && $selected == null) {
  7.            $selected = $l;
  8.       }
  9. }
  10. if ($selected == null) {
  11. $selected = $langageDefaut;
  12. }
  13. header(’Location:/’.$selected, true, 301);
  14. die();

Voyons ce qu’il se passe: on liste les langues disponibles pour le site (ligne 1), on détermine une langue comme étant celle par défaut (ligne 2), puis on récupère les langues que le visiteur a déclarées comme étant “recevables”. On parcourt cette liste à la recherche d’une correspondance… Dès qu’on l’obtient, on l’affecte à $selected, ce qui court-circuite les tests suivants. Dans le cas où on n’aurait aucune correspondance (si le visiteur demande du russe et/ou du chinois sur un site en anglais et français), on reprend la valeur de la langue par défaut.
Une fois cette affectation faite, on renvoie le visiteur, à l’aide d’une redirection 301 ou “redirection permanente”, vers le répertoire approprié.
Et dans le cas où le visiteur n’aurait pas envoyé l’entête magique dans sa requête (c’est le cas des crawlers des moteurs de recherche, en particulier de GoogleBot), la langue par défaut sert de

Ce post vous a été utile ? Re-Twittez le ! ReTwittez ce post

PHP , , , ,

  1. Luc ALBERT
    | #1

    Salut,
    Bien que ta méthode soit intéressante, elle assez bloquante… Si pour une raison ou une autre, on ne veut pas avoir le site dans la langue fournie par le navigateur, on est bloqué! Que par défaut on est le site dans la langue du navigateur c’est une bonne chose, mais il faut pouvoir la choisir par la suite non ?
    Je ne comprends pas non plus pourquoi tu dis “[...]il est fréquent de trouver une page “d’accueil” comportant plusieurs drapeaux ou un quelconque moyen de choisir son langage que l’on veut voir affiché. Cette pratique, aussi mauvaise pour le référencement qu’en termes d’ergonomie[...]“. J’ai du mal à voir où peut bien être le problème au niveau du référencement, si tenté bien sûr qu’il y ait eu un travail effectué au niveau au minimum des liens.
    Qui plus est, ta méthode, comme tu l’expliques au niveau des crawlers, ne permet donc de ne référencer qu’une seule langue sur ton site au final.

  2. Didier
    | #2

    Salut Luc !
    Avec cette méthode, les contenus auront des URLs comme /fr/article1.html ou /en/article1.html. Tu peux très bien, sur chaque page de ton site, proposer un lien vers la version correspondante dans une autre langue (pour que le visiteur puisse “traduire” la page en cours et changer de langue), et soumettre les différentes URLs aux moteurs de recherche.
    Côté référencement, je trouve simplement dommage d’utiliser la home (page qui reçoit en grande généralité le plus de liens entrants) pour renvoyer vers du contenu, alors qu’elle a un meilleur potentiel côté positionnement.
    Il va falloir que j’apprenne à être clair dans mes explications ;)

  3. | #3

    Bonjour,
    Je voulais te montrer ma méthode, seulement comme ça collait pas dans un commentaire…
    J’ai fait un article :
    http://www.julienbreux.com/2008/08/site-multilingue/

    Voici comment j’utilise la gestion de la langue couplée avec la session.

  4. | #4

    Une explication plus complète de la gestion des langues dans une application web pour en plus prendre en compte les proxies etc…

    http://xhtml.net/php/pluf-framework-php/426-Vary-header-avec-Pluf

    Un site multilingue nécessite plus de précautions que simplement regarder les en-têtes du client qui fait la requête.

  5. | #5

    Je ne vois pas en quoi mettre des liens vers les différentes parties localisées du site en page d’accueil est mauvais. Ton astuce est sympa, mais largement insuffisante :

    * l’utilisateur n’a pas forcément le contrôle sur les préférences du navigateur ( dans un cyber café par ex)
    * l’utilisateur peut donc vouloir choisir, pour une raison ou pour une autre, une des autres langues disponibles sur le site.

    aussi, il ne faut donc forcer la redirection que si il vient pour la première fois sur la page d’accueil, et il est bon de mettre des liens vers les autres langues (et pas que sur la page d’accueil).

    Par contre, il y a un point sur lequel il n’est pas très adéquate d’utiliser des drapeaux : la langue n’a pas forcément à voir avec le pays indiqué par le drapeau. Mettre un drapeau français pour un québécois, ou un drapeau anglais pour un anglais, n’est pas très pertinent ;-) Il est donc préférable de mettre l’intitulé de la langue plutôt qu’un drapeau, sur les liens.

  6. thierry
    | #6

    salut,

    pourquoi ne mets tu pas de “break” une fois la langue trouvé dans ton foreach ?

    si j’ai bien compris les langues sont dans l’ordre de la valeur de “q”, sans break la dernière langue existante à l’intérieur du site sera choisi au lieu de la première.

  7. Didier
    | #7

    Salut Thierry,
    le $selected == null permet d’éviter d’écraser la langue sélectionnée. Mais en effet, un break ne ferait pas de mal, ça éviterait quelques passages inutiles dans la boucle ;)

  8. thierry
    | #8

    Salut Didier,

    très juste pour le $selected == null, je me suis laissé influencer par ce que j’avais adapté au lieu de rester concentré sur ce que tu avais fais :s

    merci pour la partage.

  9. | #9

    > Il est donc préférable de mettre l’intitulé de la langue plutôt qu’un drapeau, sur les liens.

    Et pour un arabophone, il va être fort difficile de trouver un drapeau!

  1. No trackbacks yet.