IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Détection de la langue du navigateur client : $_SERVER['HTTP_ACCEPT_LANGUAGE'] retourne toujours "fr" ou "en" [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 187
    Points
    187
    Par défaut Détection de la langue du navigateur client : $_SERVER['HTTP_ACCEPT_LANGUAGE'] retourne toujours "fr" ou "en"
    Bonjour.

    J'ai utilisé cette fonction pour détecter la langue du navigateur du client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    $navigatorLanguage = explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
    $navigatorLanguage = strtolower(substr(chop($navigatorLanguage[0]),0,2));
    echo $navigatorLanguage;
    Ensuite pour tester j'ai téléchargé Opéra 11 en italien pour ne pas écraser l'installation de FF, mais j'obtiens toujours "fr" comme résultat. Si je change Opéra en Anglais il est bien affiché "en".

    Est-ce que c'est la façon la plus appropriée de détecter la langue ?
    Ou est-ce que c'est relié à mon OS?

    Merci de votre aide.

    PS : mon OS est Win7 en Français.
    " ... On naît, on vit, on meurt, mais exister est un honneur ... "

  2. #2
    Membre confirmé Avatar de rikemSen
    Homme Profil pro
    Analyste Développeur Web - Fizzup.com
    Inscrit en
    Décembre 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste Développeur Web - Fizzup.com
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 387
    Points : 540
    Points
    540
    Par défaut
    Ré-essaye sous firefox avec le module "user agent switcher" tu pourras créer toi même tes entêtes et changer de langue sans à avoir à utiliser un autre navigateur. Peut-être opéra n'est finalement pas en italien. ^^"
    Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

    - Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre

  3. #3
    Membre habitué Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par radicaldreamer Voir le message
    Ré-essaye sous firefox avec le module "user agent switcher" tu pourras créer toi même tes entêtes et changer de langue sans à avoir à utiliser un autre navigateur.
    Merci pour le tuyau. Par contre je n'arrive pas à trouver où modifier la langue avec ce module

    Sinon, je crois peut-être savoir pourquoi "en" et "fr" sont détectés. C'est que je suis allé dans les options linguistiques et régionales dans les configs de mon ordi et il n'y a que les langues anglaises et français qui sont disponibles la dedans.

    Est-il possible que ce soit la cause de mon problème?
    " ... On naît, on vit, on meurt, mais exister est un honneur ... "

  4. #4
    Membre confirmé Avatar de rikemSen
    Homme Profil pro
    Analyste Développeur Web - Fizzup.com
    Inscrit en
    Décembre 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste Développeur Web - Fizzup.com
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 387
    Points : 540
    Points
    540
    Par défaut
    Je ne pense pas que ça soit ça.

    Je me suis trompé de module complémentaire désolé. Utilise "modify headers"

    https://addons.mozilla.org/fr/firefo...-http-headers/ (non compatible firefox 4 pour le moment)

    Manipe:
    Tu vas sur ton site,
    tu ouvres live http headers,
    tu fais f5 sur ton site
    tu localises la premiere entete et tu fais "rejouer"

    là une fenetre s'affiche et tu modifies la ligne avec le code de langue en mettant ce que tu veux.

    Tu clic sur rejouer ou qqc du genre (de tête car le plugin ne fonctionne pas, suis passé sur ff4)
    Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

    - Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre

  5. #5
    Membre habitué Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 187
    Points
    187
    Par défaut
    J'ai fait les manips que radicaldreamer a montré et j'obtiens très bien "it" comme résultat.

    Mais je voudrais bien comprendre comment ça marche vraiment ce variable HTTP_ACCEPT_LANGUAGE : langue OS, la,gue navigateur ...
    J'apprécierai si quelqu'un pourrait m'éclairer.

    Merci d'avance.
    " ... On naît, on vit, on meurt, mais exister est un honneur ... "

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Hello

    Il existe une fonction toute prête pour ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
        function get_accepted_languages() {
            $httplanguages = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
            $languages = array();
            if (empty($httplanguages)) {
                return $languages;
            }
     
            foreach (preg_split('/,\s*/', $httplanguages) as $accept) {
                $result = preg_match('/^([a-z]{1,8}(?:[-_][a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', $accept, $match);
     
                if (!$result) {
                    continue;
                }
                if (isset($match[2])) {
                    $quality = (float)$match[2];
                }
                else {
                    $quality = 1.0;
                }
     
                $countries = explode('-', $match[1]);
                $region = array_shift($countries);
                $country_sub = explode('_', $region);
                $region = array_shift($country_sub);
     
                foreach($countries as $country)
                    $languages[$region . '_' . strtoupper($country)] = $quality;
     
                foreach($country_sub as $country)
                    $languages[$region . '_' . strtoupper($country)] = $quality;
     
                $languages[$region] = $quality;
            }
     
            return $languages;
        }

  7. #7
    Membre habitué Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 187
    Points
    187
    Par défaut
    Merci de vos réponses rapides.

    J'ai aussi essayé la fonction get_accepted_languages().
    Le résultat :
    Array
    (
    [fr] => 0.8
    [fr_FR] => 0.8
    [en_US] => 0.5
    [en] => 0.3
    )
    Peut être que ma question est mal posée .
    Si je veux avoir :
    Array
    (
    [it] => 0.9
    [it_IT] => 0.9
    [fr] => 0.8
    [fr_FR] => 0.8
    [en_US] => 0.5
    [en] => 0.3
    )
    quelle doit être mon config :
    - dois-je mettre mon OS en Italien
    - dois-je installer un navigateur en italien
    ...

    Donc si l'utilisateur possède un OS en français et que son navigateur est en italien je ne pourrai jamais le détecter?
    " ... On naît, on vit, on meurt, mais exister est un honneur ... "

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Hello

    Il existe une fonction toute prête pour ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
        function get_accepted_languages() {
            $httplanguages = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
            $languages = array();
            if (empty($httplanguages)) {
                return $languages;
            }
     
            foreach (preg_split('/,\s*/', $httplanguages) as $accept) {
                $result = preg_match('/^([a-z]{1,8}(?:[-_][a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', $accept, $match);
     
                if (!$result) {
                    continue;
                }
                if (isset($match[2])) {
                    $quality = (float)$match[2];
                }
                else {
                    $quality = 1.0;
                }
     
                $countries = explode('-', $match[1]);
                $region = array_shift($countries);
                $country_sub = explode('_', $region);
                $region = array_shift($country_sub);
     
                foreach($countries as $country)
                    $languages[$region . '_' . strtoupper($country)] = $quality;
     
                foreach($country_sub as $country)
                    $languages[$region . '_' . strtoupper($country)] = $quality;
     
                $languages[$region] = $quality;
            }
     
            return $languages;
        }
    y'a déjà une fonction pour ça : locale_accept_from_http

  9. #9
    Membre habitué Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    y'a déjà une fonction pour ça : locale_accept_from_http
    mais avec cette fonction il faut installer une autre bibliothèque : http://www.php.net/manual/fr/intl.requirements.php

    En fait c'est l’interaction de ces fonctions la avec le browser et l'OS que je cherche à comprendre ...
    " ... On naît, on vit, on meurt, mais exister est un honneur ... "

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par ilalaina Voir le message
    mais avec cette fonction il faut installer une autre bibliothèque : http://www.php.net/manual/fr/intl.requirements.php

    En fait c'est l’interaction de ces fonctions la avec le browser et l'OS que je cherche à comprendre ...
    c'est fait avec la valeur de $_SERVER['HTTP_ACCEPT_LANGUAGE']

  11. #11
    Membre habitué Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 187
    Points
    187
    Par défaut
    Je dois peut-être répéter ma question
    Citation Envoyé par ilalaina Voir le message

    Peut être que ma question est mal posée .
    Si je veux avoir :

    Array
    (
    [it] => 0.9
    [it_IT] => 0.9
    [fr] => 0.8
    [fr_FR] => 0.8
    [en_US] => 0.5
    [en] => 0.3
    )
    quelle doit être mon config :
    - dois-je mettre mon OS en Italien
    - dois-je installer un navigateur en italien
    ...

    Donc si l'utilisateur possède un OS en français et que son navigateur est en italien je ne pourrai jamais le détecter?
    " ... On naît, on vit, on meurt, mais exister est un honneur ... "

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Ça dépend que du navigateur, après peu être qu'aussi le navigateur détecte la langue de l'OS pour la valeur par défaut.
    En cas c'est pas PHP qui gère ça, et ça vient uniquement du navigateur

    dans firefox tu peux changer ca : dans about:config, avec l’attribut : intl.accept_languages, change la valeur tu verras

  13. #13
    Membre habitué Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 187
    Points
    187
    Par défaut
    Ok, je commence à y voir clair.
    Je vous remercie tous pour votre aide.
    " ... On naît, on vit, on meurt, mais exister est un honneur ... "

  14. #14
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    @Stealth35

    L'emploi de la fonction locale_accept_from_http demande PHP 5 >= 5.3.0, PECL intl >= 1.0.0. On a pas tous le luxe d'avoir cet environement en prod

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    @Stealth35

    L'emploi de la fonction locale_accept_from_http demande PHP 5 >= 5.3.0, PECL intl >= 1.0.0. On a pas tous le luxe d'avoir cet environement en prod
    Intl existe depuis longtemps,
    De plus la branche PHP 5.2 est finis et Debian est passé 5.3
    Toujours montrer en premier ce qui est le plus moderne, ensuite on peux descendre dans le temps

  16. #16
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Toujours montrer en premier ce qui est le plus moderne, ensuite on peux descendre dans le temps
    Pas faux mais je me place dans une logique d'hébergement mutualisé la plupart du temps et leurs serveur en sont resté à 5.2 pour l'instant.

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Pas faux mais je me place dans une logique d'hébergement mutualisé la plupart du temps et leurs serveur en sont resté à 5.2 pour l'instant.
    je comprend bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection de la langue du navigateur via JS
    Par michaeljeru dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/03/2011, 10h05
  2. Réponses: 4
    Dernier message: 23/03/2011, 15h45
  3. [PHP-JS] Détection de la langue du navigateur
    Par nako dans le forum Langage
    Réponses: 4
    Dernier message: 28/02/2007, 13h13
  4. [JSP] Récupérer la langue du navigateur sans js
    Par Snivel dans le forum Struts 1
    Réponses: 2
    Dernier message: 31/03/2006, 17h56
  5. [Configuration] Détecter des paramètres du navigateur client...
    Par Olish dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 08/10/2005, 18h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo