php-experts.org - développement php et internet » langue https://www.php-experts.org Ressources sur le développement internet, PHP/MySQL, Ajax, marketing online, référencement... Sat, 19 Jun 2010 14:23:03 +0000 http://wordpress.org/?v=2.9.2 en hourly 1 Site multilingue: déterminer la langue du visiteur https://www.php-experts.org/developpement-web/php-developpement-web/site-multilingue-determiner-la-langue-du-visiteur-17 https://www.php-experts.org/developpement-web/php-developpement-web/site-multilingue-determiner-la-langue-du-visiteur-17#comments Wed, 13 Aug 2008 13:38:29 +0000 Didier https://www.php-experts.org/?p=17 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

]]>
https://www.php-experts.org/developpement-web/php-developpement-web/site-multilingue-determiner-la-langue-du-visiteur-17/feed 9