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

  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.
    0
    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.
      0
      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.
        0
        1. 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.
          0
          1. Modérateur
            Non non, il ne faut pas se baser sur le User-Agent, mais sur le Accept-Language.
            0
            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" ?
              0
          2. 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.
            0
            1. Ok, je comprends mieux du coup. Merci pour l'info.
              0
          3. 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.
            0
            1. Bonjour et merci pour toutes ces rapides réponses ! Je vais m'occuper de tester cela et je vous tiens au courant !
              0
              1. 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"); 
                	
                ?> 
                
                0
                1. Il dois charger en premier la version qui est dans le cache du navigateur ce qui lui évite d'avoir à systématiquement tout recharger.
                  0
                  1. A priori non car je vide le cache avant de lancer le site
                    0
                2. Et voici la réponse :

                  else if ( empty($_SESSION['lang']) && empty($_GET['lang']) ) {
                  		$_SESSION['lang'] = autoSelectLanguage(array('en', 'fr'), 'fr');
                                 $lang = $_SESSION['lang'];
                  	}
                  
                  0
                  1. Modérateur
                    Merci du suivi. Tes réponses aideront d'autres internautes.
                    0