Prob avec site multilangue avec cookies

Résolu
Bonjour tout le monde
je vous poste mon problème
je suis entrain de chercher quelle sont les voie plus pratique pour un site multilingue
je teste des script en local et ca marche sans prob vue la non complexité du script et sa varieté sur le web mais une fois que j introduit les cookies j ai ce type de prob
d après mes recherches je sait que certainement c est à cause d un echo qui ne doit pas être la
mais la je ne sait pas ou je doit modifier le script
voilà le message d erreur
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\siteml\choix.htm:4) in C:\xampp\htdocs\siteml\decide-lang.php on line 22

voiilà mon script tout simplement il se deroule de cette facon
une page index qui afffiche le contenu
puis un requiers choix.htm qui contient qui donnent la possibilités de choisir la langue
puis une autre requiers decide-lang.php qui agit selon ces étapes

1-assigner une langue si elle existe dans une cookie
2-si elle n est pas existante prendre la langue par defaut du navigateur
3-si non choisir une langue soit francais ou anglaise
fixer la cookies à un ans
voilà ma page index.php
1-// ma page index
<?php require("choix.htm");?>
<?php require("decide-lang.php");?>
<html>
<body>
<?php echo TXT_ACCUEIL_INDEX; ?>
<br>
Meteo du jour : <?php echo TXT_METEO; ?>
<br>
Conseil du jour : <?php echo TXT_CONSEIL_INDEX; ?>
</body>
</html>
2-ma page choix.htm
<table>
<tr><td valign="top" colspan="3" height="71px"> <a href="index.php?lang=fr" title="langue francaise">langue francaise</a></td></tr>
<tr><td valign="top" colspan="3" height="71px"> <a href="index.php?lang=en" title="langugue anglaise">langue anglaie </a></td></tr>
</table>
3-ma page decide-lang.php
<?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-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);

?>
je compte sur vous .
Configuration: Windows Vista
Firefox 3.0.13

12 réponses

  1. Contributeur
    bonjour,

    je pense que ton soucis viens du fait que tu inclu ton choix.htm juste avant le <HTML> et le body.. hors tu as des balises <table> avec du texte... qui se retrouve donc 'hors' de ta page..

    donc moi je ferais :

    //je supose que TXT_xxx sont des des constantes avec un define ( 'TXT_xxx', 'Mon texte xxx');
    //sinon, variables .. dans ce cas ca serait plutot $TXT_
    <?php

    $Html="<html><body>"

    include("choix.htm");
    include("decide-lang.php");
    //ici tu charge le texte TXT_xxx en fonction de la langue inscrit dans le cookie

    $Html.=TXT_ACCUEIL_INDEX."<br>";
    $Html.="Meteo du jour :".TXT_METEO."<br>";
    $Html.="Conseil du jour : ".TXT_CONSEIL_INDEX;
    $Html.="</body></html>";
    echo $Html;

    2-ma page choix.htm
    $Html.='<table><tr><td valign="top" colspan="3" height="71px"> <a href="index.php?lang=fr" title="langue francaise">langue francaise</a></td></tr>
    <tr><td valign="top" colspan="3" height="71px"> <a href="index.php?lang=en" title="langugue anglaise">langue anglaie </a></td></tr>
    </table>';

    3-ma page decide-lang.php
    <?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-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);

    ?>

    ps : je supose que tu voudrais faire un peu comme moi sur mon site : jjsteing.u7n.org ;)
    0
    1. merci infiniment jjsteing je vais
      suivre ton conseil et te donner un feedback
      0
      1. salut j ai suivie tes conseil je vois que le message d " erreur a disparu
        mais lorsque je clique pour changer de langue sur

        $Html.='<table><tr><td valign="top" colspan="3" height="71px"> <a href="index.php?lang=fr" title="langue francaise">langue francaise</a></td></tr>
        <tr><td valign="top" colspan="3" height="71px"> <a href="index.php?lang=en" title="langugue anglaise">langue anglaie </a></td></tr>
        </table>';

        la langue reste bloqué sur celle francaise
        donc on réussit à bloquer le message d erreur mais le switch entre les langue désormais ne fonctionne pas.
        0
        1. Contributeur
          re :)

          if ($lang=='fr') { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php
          include('fr-lang.php');
          } else{ // si la langue est 'en' (anglais) on inclut le fichier en-lang.php
          include('en-lang.php');
          }

          pas elseif.. si c'est pas fr, alors anglais..

          de plus, vérifie bien que $lang prenne bien la valeur de 'fr' ou 'en' (ou autre en fait)
          tient moi au jus ;)
          0
          1. mon ami je te remercie énormément
            je t explique exactement les fautes que j ai fait comme ça on rigole ensemble
            :
            1-il n y avait pas de $_GET[] dans decide-lang.php
            et c est normale que ca bloque dans la langue francaise vue que j ai demandé dans
            f(isset($HTTP_COOKIE_VARS['lang'])) {
            $lang = $HTTP_COOKIE_VARS['lang']
            que si jamais il n ya rien dans la variable lang $lang prend par defaut la langue du navigateur par defaut
            :-))))))))))))))))))))))))))) c ' est normale mon firefox est en francais .
            2-je fesait des test avec une variable lang alors que je les declarés dans mon fichier choix.php en étant lan
            3-j ai suprimé les espace dans mon fichier en-lang.php cat ca fesait sortir le message Warning: Cannot modify header information - headers already sent by ect ect
            ca roule parfaitement
            Merci énormément pour le fait que tu m aider à me faire les bonne question.
            je vais mettre cette discussion comme étant résolu grâce à toi
            stp est ce que tu vois ce petit effort est bien pour un débutant ?.
            0
            1. Contributeur
              re:)

              tres bien.. et pourvu que ca dure ;)

              Si tu as d autres soucis, hesite pas ;)

              courage pour la suite de ton site, c est normale de bloquer des fois, meme moi, sans dire que je suis un expert, je bloque.. sur des conneries en plus !! :p.. donc, n'ai pas paur de poser des questions ;)

              @++
              0
              1. ah juste instant avant de dire c est fait :pppppp
                je ne reussit pas à enregistrer valeur de la cookie
                il fait le switch des langue mais je ne réussit pas a conserver les valeurs des cookie lorsque je réouvre la page
                voilà ma soufrance.
                <?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 ((isset($_GET['lang'])) && ($_GET['lang']=='fr')) { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php
                include('fr-lang.php');
                } elseif ((isset($_GET['lang'])) && ($_GET['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", $_GET['lang'], time() + $expire);
                ?>
                0
                1. desolé jjsteing
                  mais je ne sait pour la cookie n as pas enregsitré aucune valeur.
                  0
                  1. Contributeur
                    re :)
                    Sous firefox ou ie ou les deux ?
                    0
                    1. sous les deux j ai verfié aussi que firefox et IE donner la permission
                      au cookie jusqu leur expiration
                      peut etre j aurai due fait une faute en mettant directement $_GET['lang']
                      setccokie("lang",$_GET['lang'],time()+$expire);
                      0
                      1. je suis entrain de modifier mon script
                        de cette facon : mais rien ne change .
                        <?php

                        $lang_traduites = array(0 => 'fr', 1 => 'en');
                        $langue_defaut = $lang_traduites[0];

                        $lang_navig = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
                        $lang_navig = strtolower(substr(rtrim($lang_navig[0]),0,2));

                        $lang = !empty($_COOKIE['lang'])? $_COOKIE['lang'] : 0;
                        $lang = !empty($_GET['lang'])? $_GET['lang'] : $lang;
                        $lang = !empty($lang)? $lang : $lang_navig ;
                        $lang = in_array($lang,$lang_traduites)? $lang : $langue_defaut;

                        //script d'origine
                        if ((isset($_GET['lang'])) && ($_GET['lang']=='fr')) { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php
                        include('fr-lang.php');
                        } elseif ((isset($_GET['lang'])) && ($_GET['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);

                        ?>
                        0
                        1. madames et messieurs voilà
                          merci pour tout le monde qui m ad aidé je vous poste le script finale qui fonctionne correctement
                          merci infiniment pour jjsteing
                          le changement été fait de cette manière
                          $lang_traduites = array(0 => 'fr', 1 => 'en');
                          $langue_defaut = $lang_traduites[0];

                          $lang_navig = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
                          $lang_navig = strtolower(substr(rtrim($lang_navig[0]),0,2));

                          $lang = !empty($_COOKIE['lang'])? $_COOKIE['lang'] : 0;
                          $lang = !empty($_GET['lang'])? $_GET['lang'] : $lang;
                          $lang = !empty($lang)? $lang : $lang_navig ;
                          $lang = in_array($lang,$lang_traduites)? $lang : $langue_defaut;
                          include($lang.'-lang.php');

                          //script d'origine

                          //fin du script d'origine

                          //définition de la durée du cookie (1 an)
                          if ((!empty($_GET['lang']) && in_array($_GET['lang'],$lang_traduites)) && (empty($_COOKIE['lang']) || (isset($_COOKIE['lang']) && $_COOKIE['lang'] != $_GET['lang']))) setcookie('lang', $_GET['lang'], time() + 3600 * 24 * 365);

                          ?>
                          0