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 :

[Cookies] multi langue PHP avec cookie


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de heteroclite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 147
    Par défaut [Cookies] multi langue PHP avec cookie
    Bonjour,

    voila je cherche à developper un site multi-lang en php. J'ai donc un script si dessous qui en fonction de la langue va orienter un vers un fichier contenant les traductions dans la langue choisie . Ce script utilise des cookies ....
    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
    <?php   
     
        if(isset($HTTP_COOKIE_VARS['lang'])) {  
            $lang = $HTTP_COOKIE_VARS['lang'];  
        } else {  
            // si aucune langue n'est déclarée on tente de reconnaitre la langue par défaut du navigateur  
            $lang = substr($HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE'],0,2);   
        }  
     
        //script d'origine  
        if ($lang=='fr') {           // si la langue est 'fr' (français) on inclut le fichier fr-lang.php  
            include('fr.php');   
        } elseif ($lang=='en') {      // si la langue est 'en' (anglais) on inclut le fichier en-lang.php  
            include('en.php');   
        }   
        //fin du script d'origine  
     
        //définition de la durée du cookie (1 an)  
        $expire = 365*24*3600;   
     
        //enregistrement du cookie au nom de lang  
        setcookie("lang", $lang, time() + $expire);   
     
        ?>
    ma question est comment arriver à transmettre la variable 'lang' qui doit être enregistrée dans le cookie puis utilisée dans le script ci dessus pour determiner la langue. (en gros quel lien dois je mettre derriere le petit drapeau anglais ou Francais ?)

  2. #2
    Membre émérite Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Par défaut
    Tu pouvais aussi poser ta question dans le post de Linon un peu plus bas et partagez ton experience avec lui.

    Sinon pour ta question de lien à mettre il faut que tu l'envoi vers une page php ou tu recup la langue ( en GET par exemple). Ensuite tu pose le cookie avec setcookie

    Voilà

    Pierre

    PS : plutôt que HTTp_COOKIE_VAR utilise $_COOKIE c'est plus court

  3. #3
    Membre confirmé Avatar de heteroclite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 147
    Par défaut
    voilà j'ai mis mon code à jour

    j'ai deux lien pour choisir la lang et acceder à ma page
    <a href="page1.php?lang=en">anglais</a><br />
    <a href="page1.php?lang=fr">francais</a><br />

    cela appel le script ci-dessous (qui choisi la langue) et determine le ficher de traduction à utiliser.

    ....mais j'ai une erreur ....vous avez une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Cannot modify header information - headers already sent by (output started at c:\program files\easyphp1-8\www\ser\multilang\decide-lang.php:1) in c:\program files\easyphp1-8\www\ser\multilang\decide-lang.php on line 22
    voici mon script decide-lang.php

    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   
        if(!empty($_GET['lang'])) 
        if(isset($_COOKIE['lang'])) {  
           $lang =$_COOKIE['lang'];  
        } else {  
           // si aucune langue n'est déclarée on tente de reconnaitre la langue par défaut du navigateur  
           $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);   
       }  
     
       //script d'origine  
       if ($lang=='fr') {           // si la langue est 'fr' (français) on inclut le fichier fr-lang.php  
           include('fr-lang.php');   
       } elseif ($lang=='en') {      // si la langue est 'en' (anglais) on inclut le fichier en-lang.php  
            include('en-lang.php');   
        }   
        //fin du script d'origine  
     
        //définition de la durée du cookie (1 an)  
        $expire = 365*24*3600;   
     
       //enregistrement du cookie au nom de lang  
        setcookie("lang", $lang, time() + $expire);   
     
     
    ?>

  4. #4
    Membre émérite Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Par défaut
    L'envoi d'un cookie vers le poste de l'utilisateur ne peu se faire que si celui-ci n'a reçu aucune donnée de la part du script.

    Verifies que tu n'as pas laissé un echo, du html, des espaces. Pour etre sur <? doivent etre les premiers caractères de ta page.

  5. #5
    Membre confirmé Avatar de heteroclite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 147
    Par défaut
    j'avais effectivement un espace avant <?php.
    Mais j'ai encore un pb....mon script ne marche pas du tout ! Le choix de la langue ne se fait pas .....c'est toujours en français meme quand je clique sur anglais ... je pense que le cookie ne s'initialise pas et qu'il prends la langue du navigateur ....une idée ?

    j'ai une page index avec les liens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     <a href="page1.php?lang=en">anglais</a><br />
    	<a href="page1.php?lang=fr">francais</a><br />

    un script decide-lang
    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
    <?   
    if(!empty($_GET['lang'])) 
    if(isset($_COOKIE['lang'])){  
    $lang=$_COOKIE['lang'];  
    } else{  
    // si aucune langue n'est déclarée on tente de reconnaitre la langue par défaut du navigateur  
    $lang=substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);   
    }     
    //script d'origine  
    if ($lang=='fr'){           // si la langue est 'fr' (français) on inclut le fichier fr-lang.php  
    include('fr-lang.php');   
    } elseif($lang=='en'){      // si la langue est 'en' (anglais) on inclut le fichier en-lang.php  
    include('en-lang.php');   
    }   
    //fin du script d'origine        
    //définition de la durée du cookie (1 an)  
    $expire =365*24*3600;       
    //enregistrement du cookie au nom de lang  
    setcookie("lang", $lang, time()+ $expire);   
    ?>
    un fichier de traduction ici en français et le meme en anglais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php 
    define('TXT_METEO', 'Il fait un soleil radieux !');  
    define('TXT_CONSEIL_INDEX', 'Faites du PHP !'); 
    ?>
    et la page d'affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php  
     require("decide-lang.php");  
        ?>  
        <html>  
        <body>  
     
        <br>  
        Meteo du jour : <?php echo TXT_METEO; ?>  
        <br>  
        Conseil du jour : <?php echo TXT_CONSEIL_INDEX; ?>  
     
     
        </body>  
        </html>

  6. #6
    Membre émérite
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Par défaut
    Citation Envoyé par FCYPBA
    PS : plutôt que HTTp_COOKIE_VAR utilise $_COOKIE c'est plus court
    C'est surtout que $HTTP_COOKIE_VARS est obsolète... comme tous les $HTTP_*_VARS... .. .

    Sinon voila comment je te conseil de faire... .. .

    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
    49
    50
    51
    52
    53
    // on crée un constante avec le chemin du répertoire courant
    define('LANG_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
    
    // on cherche dans $_GET et $_COOKIE si la variable lang existe
    if(isset($_GET['lang']) && !empty($_GET['lang']))
       $lang = $_GET['lang'];
    elseif(isset($_COOKIE['lang']) && !empty($_COOKIE['lang']))
          $lang = $_COOKIE['lang'];
    else
    {
          // la variable lang n'existe pas on va donc chercher dans les languages acceptés par le navigateur
          $lang_codes = array();
          $accept_lang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : @getenv('HTTP_ACCEPT_LANGUAGE');
          
          if(!empty($accept_lang)) 
          {
                $accept_lang = explode(',',$accept_lang);
                // on recherche les languages acceptés en fonction de leur ordre d'importance
                foreach($accept_lang  as $lang_spec) 
                {
                      if (preg_match('/([a-z]+)(?:-[a-z]+)?(?:;q=(\d+\.\d+))?/', trim($lang_spec), $matches)) 
                      {
                            $lang_code = $matches[1];
                            $qvalue      = isset($matches[2]) ? $matches[2] : 1;
                            
                            if ($qvalue > 0.0001)
                                  $lang_codes[$lang_code] = isset($lang_codes[$lang_code]) ? max($lang_codes[$lang_code], $qvalue) : $qvalue;
                      }
                }
                
                // on classe les languages acceptés du plus important au moins important
                arsort($lang_codes, SORT_NUMERIC);
                
                // on vérifie que les fichier langue existe le premier toruvé c'est le bon
                foreach(array_keys($lang_codes) as $lang_code) 
                {
                      if(is_file(LANG_PATH.$lang_code.'-lang.php'))
                      {
                            $lang = $lang_code;
                            break;
                      }
                }
          }
          else $lang = 'fr';
    }
    
    // on vérifie que le fichier langue existe
    if(!is_file(LANG_PATH.$lang.'-lang.php'))
          $lang = 'fr';
    
    // on inclu et on met à jour le cookie
    include(LANG_PATH.$lang.'-lang.php');
    setcookie("lang", $lang,( time()+(365*24*3600 )));
    @ tchaOo°

  7. #7
    Membre confirmé Avatar de heteroclite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 147
    Par défaut
    ok merci beaucoup pour ces corrections !
    ça fonctionne très bien.
    Je voudrais juste savoir maintenant quels liens je doit mettre lorsque je veux passer de page en page pour conserver la langue choisie initialement ?

    merci

  8. #8
    Membre émérite
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Par défaut
    Citation Envoyé par heteroclite
    Je voudrais juste savoir maintenant quels liens je doit mettre lorsque je veux passer de page en page pour conserver la langue choisie initialement ?
    Aucun la langue est sauvée dans le cookie... la seule condition c'est que le navigateur de l'internaute accept les cookies... sinon tu dois juste créer un lien par langue sur chaque page en fonction de l'adresse de la page affichée... du genre...

    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
    // si PHP4
    if(!function_exists('http_build_query'))
    {
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;function http_build_query($vars, $prefix = '')
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(!is_array($vars))
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return false;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;elseif(empty($vars))
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return '';
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$ret = '';
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;foreach($vars as $name => $value)
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$ret .= $prefix.$name.'='.urlencode($value).'&';
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return substr( $ret, 0, -1);
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
    }
    
    // on recupere l'url de la page courante
    $url = (!empty($_SERVER&#91;'HTTPS']) ? 'https' : 'http').' ://'.$_SERVER&#91;'HTTP_HOST'].$_SERVER&#91;'PHP_SELF'];
    
    // on verifie si il y a des parametre passés dans l'url s'il y en a on les récupère
    $query_str = '';
    
    if(isset($_SERVER&#91;'QUERY_STRING']))
    {
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(!empty($_SERVER&#91;'QUERY_STRING']))
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$query_str = $_SERVER&#91;'QUERY_STRING'].'&';
     
    }
    elseif(!empty($_GET))
    &#160;&#160;&#160;&#160;&#160;&#160;$query_str = http_build_query($_GET).'&';
    
    // on vire lang s'il y est 
    $query_str = preg_replace('~&?lang=&#91;a-z]{2}~','',$query_str);
    
    // on affiche les liens
    echo '<a href="'.$url.'?'.$query_str.'lang=en">anglais</a><br />
    &#160;&#160;&#160;&#160;&#160;&#160;<a href="'.$url.'?'.$query_str.'lang=fr">francais</a><br />';
    
    @ tchaOo°

  9. #9
    Membre confirmé Avatar de heteroclite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 147
    Par défaut
    y' aurai pas un moyen pour eviter de selectionner la langue à chaque page de faire le choix sur l'index et de récupérer la variable enregistrée dans le cookie pour les autres pages ?

    je m'explique

    index: choix de la langue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <a href="page1.php?lang=en">anglais</a><br />
    <a href="page1.php?lang=fr">francais</a><br />
    puis affichage de la page 1 avec des liens vers les autres pages (page 2) type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="page2.php?lang=.$_COOKIE['lang'].'">
    c'est possible ça ?

Discussions similaires

  1. Cookie multi-langue
    Par Le_Pierre dans le forum WordPress
    Réponses: 0
    Dernier message: 26/05/2011, 17h52
  2. Site multi-langue PHP
    Par swissmade dans le forum Langage
    Réponses: 40
    Dernier message: 19/07/2007, 00h06
  3. Réponses: 3
    Dernier message: 25/06/2007, 16h50
  4. [Cookies] mise ne forme avec cookies
    Par Tee shot dans le forum Langage
    Réponses: 3
    Dernier message: 04/06/2007, 22h39

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