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 :

Detection de langue


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 143
    Par défaut Detection de langue
    Bonjour,

    J'ai un souci avec mon site multi-langues,
    De base je réalise une détection de la langue du navigateur à l'aide de cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
     
    if ($lang != 'fr'){
    	$index = 'en/index.php';
     
    	header("Location: $index",TRUE,301);
    }
    ?>
    de ce coté tout fonctionne.
    Par contre j'aimerai ajouter quand même le choix aux utilisateurs de changer la langue manuellement avec deux boutons Fr/En mais ça ne fonctionne pas car c'est toujours la détection navigateur qui prend le dessus.
    Je ne vois pas comment faire...
    Si quelqu’un a une idée
    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    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
    Par défaut
    J'ai déjà fait ça, voilà comment je m'y prends:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?php
     
    class Lang {
     
        /**
         * Get accepeted languages using browser capabilities
         * @return array
         */
        public static function getAcceptedLanguages() {      
            $httplanguages = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
            $languages = array();
            if (empty($httplanguages)) {
                return $languages;
            }
     
            foreach (explode(',', $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;
        }
     
         // autres trucs...
     
    }
    Une fois que t'as ça, c'est très facile de déterminer la langue:
    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
    <?php
    session_start();
     
    if (isset($_GET['lang'])) {
       // la langue explicitement demandée est toujours prioritaire
     
       if (Lang::isAvailable($_GET['lang']))
         $_SESSION['lang'] = $_GET['lang']; 
       else
         $_SESSION['lang'] = Lang::getDefaultLang();
    }
    elseif (empty($_SESSION['lang'])) {
       // si on a pas encore choisi de langue: autodétection
       $accepted = Lang::getAcceptedLanguages();
     
       // trouver la meilleure langue disponible
       foreach ($accepted as $lang) {
          if (Lang::isAvailable($lang)) {
             $_SESSION['lang'] = $lang;
             break;
          }
       }
    }
     
    // ici $_SESSION['lang'] est toujours initialisé

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 143
    Par défaut
    Merci de votre aide

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 143
    Par défaut
    Bonjour,

    Je reviens sur le sujet car je n'arrive pas à faire fonctionner le code ci dessus.
    Je dois initialiser la variable $lang pour déterminer les langues disponibles sur mon site afin de rediriger sur les bonne pages ?

  5. #5
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    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
    Par défaut
    La mention // autres trucs... est assez explicite... La classe Lang n'est pas complête, c'est à toi de la remplir en fonction de tes besoins.

    Par exemple, voici quelques méthodes qui pourraient servir:
    • isAvailable ($lang)
    • getDefaultLang ()
    • i18n($key, array $values = array())
    • g11n($key, array $values = array())


    On peut très bien tout laisser statique, on a rarement besoin d'avoir plusieurs langues en même temps...

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Sur le principe tu dois donner la priorité à la variable $_GET['lang'] par rapport à la détection du navigateur. Pour donner un exemple simple en procédural on peut faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $lang_traduites = array('fr','en');
     
    // Récupère la langue du navigateur
    $lang_navig = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
    $lang_navig = strtolower(substr(rtrim($lang_navig[0]),0,2));
     
    // Si la langue est envoyée par $_GET['lang'] on la prend sinon on prend celle du navigateur
    $lang = !empty($_GET['lang'])? $_GET['lang'] : $lang_navig;
     
    // On vérifie que le résultat fait partie des langues traduites sinon on met le français par défaut
    $lang = in_array($lang,$lang_traduites) ? $lang : 'fr';

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

Discussions similaires

  1. Detecter la langue du navigateur avec redirection
    Par xunil2003 dans le forum Langage
    Réponses: 6
    Dernier message: 21/11/2010, 19h05
  2. Projet de detection de langue pour moteur de recherche
    Par didi78 dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 05/04/2009, 19h34
  3. Réponses: 1
    Dernier message: 25/04/2007, 16h08
  4. Detection arret de windows
    Par philippe30 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 21/09/2002, 18h41
  5. Changement de langue dynamique (D6 et outils de traduction)
    Par agon dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/09/2002, 16h15

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