Détection langue de l'internaute

Résolu
Bonjour,

Je viens de créer un site en deux langues (français et anglais) et je souhaiterai que la langue soit détectée directement à l'arrivée sur le site et ainsi que l'internaute soit redirigé automatiquement sur la version fr ou en.

Dans quelles conditions est-ce possible et de quelle façon ?

Merci par avance,
Ifryona.
Configuration: Windows XP
Firefox 3.0.13

12 réponses

  • Votes
  • Date
  • Date décroissante
  1. Et voici la réponse :

    else if ( empty($_SESSION['lang']) && empty($_GET['lang']) ) {
    		$_SESSION['lang'] = autoSelectLanguage(array('en', 'fr'), 'fr');
                   $lang = $_SESSION['lang'];
    	}
    
    1. Modérateur
      Merci du suivi. Tes réponses aideront d'autres internautes.
  2. Il dois charger en premier la version qui est dans le cache du navigateur ce qui lui évite d'avoir à systématiquement tout recharger.
    1. A priori non car je vide le cache avant de lancer le site
  3. Bonjour à tous,

    J'ai mis en place le code pour la détection de la langue du navigateur et j'y suis presque !!

    Je pense qu'il ne manque pas grand chose, mais voilà mon soucis :
    - je change la langue du navagateur (je passe en "en"),
    - je lance mon site : il est en français,
    - je rafraichit la page (via F5), le site se charge bien en anglais...

    Je ne comprends pas trop, pourquoi ne prend-il pas directement la langue en compte ? Je pense qu'il doit y avoir un soucis d'odre de déclaration ou quelques chose comme ça... Est ce que quelq'un a une idée ? car là j'avoue que je vois pas ! ^^ Voici mon code :

    <?php
    session_start();
    	
    function autoSelectLanguage(array $languages, $default = 'fr') {
    	if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
    		$aBrowserLanguages = explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
    		foreach($aBrowserLanguages as $sBrowserLanguage) {
    			$lang = strtolower(substr($sBrowserLanguage,0,2));
    			if(in_array($lang, $languages)) {
    				return $lang;
    			}
    		}
    	}
    	return $sDefault;
    }
     	$lang = "";
    	
    	if (isset($_GET['lang'])) {
    		$lang = $_GET['lang'];
    		$_SESSION['lang'] = $_GET['lang'];
    	}
    	
    	else if (!empty($_SESSION['lang'])) {
    		$lang = $_SESSION['lang'];
    	}
    	
    	
    	else if ( empty($_SESSION['lang']) && empty($_GET['lang']) ) {
    		$_SESSION['lang'] = autoSelectLanguage(array('en', 'fr'), 'fr');
    	}
    	
    	
    	echo $lang;
    	
    	/*else {
    		$lang = 'fr';
    	}*/
    	
    	/*else if ( empty($_SESSION['lang']) && empty($_GET['lang']) ) {
    		$lang = 'fr';
    	}*/
    	
    	require("decide-lang.php"); 
    	
    ?> 
    
    1. Bonjour et merci pour toutes ces rapides réponses ! Je vais m'occuper de tester cela et je vous tiens au courant !
      1. Modérateur
        Penses à passer le sujet en "Résolu" si ça a résolu ton problème: Cela aidera les internautes qui ont le même problème à trouver plus facilement la solution.
        1. Modérateur
          Les langues sont les code ISO (fr=français, en=anglais...)

          Les variantes culturelles sont indiquées par un tirer:
          en-us : anglais américain
          en-uk : anglais (grande-bretagne)
          etc.

          En prenant seulement les deux premières lettres, ça suffit (à moins que tu veuille fournir des messages français différentes pour les Français, les Canadiens ou les Belges par exemple).

          Le q=... sert à donner un poids (pondération) de préférences, mais de toute manière les langues sont toujours indiquées dans l'ordre de préférence, il n'y a pas besoin de s'occuper de ce paramètres: Il suffit de prendre la première.
          1. Ok, je comprends mieux du coup. Merci pour l'info.
        2. Modérateur
          Non non, il ne faut pas se baser sur le User-Agent, mais sur le Accept-Language.
          1. Simple curiosité (après tout je connais pas trop ces truc là) mais le Accept_Language me donne:
            fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3

            En quoi ça va donc lui donner la langue donc utiliser par la visiteur ?
            D'ailleurs il correspond à quoi le "0.8", "0.5" et "0.3" ?
        3. Sinon avec _SERVER["HTTP_USER_AGENT"]
          ça me donne par exemple chez moi:
          Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13

          A toi de faire ensuite un script pour utiliser ça.
          1. Modérateur
            Je cherche encore à savoir comment elle fonctionne.
            Est-ce la façon la plus fiable ?


            Une manière simple de procéder: prendre les 2 premiers caractères.
            Si tu trouves "fr" tu sers des pages en français, sinon tu sers des pages en anglais.

            La méthode est simple et évite d'avoir à parser la chaîne complète.
            1. Merci pour la réponse.

              J'ai vu qu'on pouvait utiliser la variable $HTTP_ACCEPT_LANGUAGE.
              Je cherche encore à savoir comment elle fonctionne.

              Est-ce la façon la plus fiable ?

              Ifryona.
              1. Modérateur
                En principe les navigateurs envoient la langue par défaut de l'internaute dans les entêtes HTTP.

                Exemple: Accept-Language=fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3

                Les différentes langues sont indiquées dans l'ordre.
                (fr = français, fr-fr pour le français de la France (il y a aussi des variations belgique, canada...)
                ensuite en-us pour l'anglais (américain), etc.

                C'est assez fiable.

                C'est ce qu'utilisent les sites Mozilla.com et Opera.com pour afficher automatiquement la page dans la bonne langue.