site multi langues: passage de l'info langue de page en page

Eléphant du PHP | 250 Messages

16 mars 2007, 14:01

Bonjour,
Bon je vais passer pour un vrai boulet :? mais tant pis.
Voilà, je detecte la langue du navigateur et en fonction, j'affiche la page dans sa langue (en fait 3 langus dispos: français, anglais, espagnole).
Je laisse aussi la possibilité au visiteur d'afficher la langue de son choix (toujours les 3 mêmes).
Sur la page d'accueil, pas de problème, ça fonctionne bien.
Mais dés que je passe à une autre page...plus rien, sinon la langue par défaut, le français.
Comment puis je récupérer l'info de la page d'index, et la conserver pour les pages suivantes
Voici le script appelé choix_lang.php (au passage, merci à guilt92 et ghalaad, pour leur aide pécieuse du début de la semaine..) :
<?php

if(isset($HTTP_COOKIE_VARS['lang'])) 
{
$lang = $HTTP_COOKIE_VARS['lang'];
}


switch ($_GET['lang'])
{
    case 'fr': include('langues/fr_lang.php');
        break;
    case 'en': include('langues/en_lang.php');
        break;
    case 'es': include('langues/es_lang.php');
        break;
    default : include('langues/fr_lang.php');
}

//enregistrement du cookie au nom de lang
setcookie("lang", $lang); 
?>
et voici le code d'entête
<?php
require("./langues/choix_lang.php");
?>
En fait, j'imagine bien que je ne dois pas récupére le cookie, mais mon incompétence :lol: m'empeche de bien comprendre les tutaux à ce sujet..et là, je sèche depuis 48h.. :oops:
Je sais bien qu'il y a déjà mille et mille posts comme celui là, mais je ne trouve pas (du moins me semble-t-il) la réponse...
Merci d'avance pour vos avis, conseils, sur la direction dans laquelle je dois chercher.

P.S: Ah si, encore une chose: l'en tête se présente ainsi:

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <?php require("./langues/choix_lang.php"); ?> <html xmlns="http://www.w3.org/1999/xhtml"> <head>
Dois je placer le scrip php avant la définition du doctype? Là aussi, je ne suis pas certain de moi...merci encore et d'avance!
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
AB
ViPHP | 5818 Messages

16 mars 2007, 15:51

Bonjour,

Si j'ai bien compris, pour choisir sa langue, le visiteur clique sur un lien qui renvoie une variable $_GET['lang'] et tu voudrais que cette variable soit enregistrée dans un cookie pour la passer de page en page.

D'après ton code ça devrait donner quelque chose comme:
//si le visiteur envoie la variable $_GET['lang'] pour choisir sa langue, on l'enregistre dans un cookie nommé 'lang'
isset($_GET['lang'])? setcookie("lang", $_GET['lang']) : '' ;

//si le cookie existe on le récupère sinon on donne la langue par défaut
$lang = isset($_COOKIE['lang'])? $_COOKIE['lang'] : 'fr' ;
//si $_GET['lang'] est envoyé on la récupère sinon on donne la valeur du cookie s'il existe sinon la valeur par défaut
$lang = isset($_GET['lang'])? $_GET['lang'] : $lang ;

//et on fait l'include suivant la valeur de $lang
switch ($lang)
{
    case 'fr': include('langues/fr_lang.php');
        break;
    case 'en': include('langues/en_lang.php');
        break;
    case 'es': include('langues/es_lang.php');
        break;
    default : include('langues/fr_lang.php');
} 

à inclure dans toutes tes pages.

NB: il serait judicieux de donner une valeur de temps pour la durée de vie de ton cookie car tel quel il s'effacera dès la clôture de la session visiteur.

Eléphant du PHP | 250 Messages

16 mars 2007, 20:10

Bonsoir,
et merci AB...Effectivement c'est plus clair maintenant..Même moi je comprend! :lol:
NB: il serait judicieux de donner une valeur de temps pour la durée de vie de ton cookie car tel quel il s'effacera dès la clôture de la session visiteur.
Justement, comme je detecte la langue navigateur, je pensais qu'il était sans doute superflu de laisser (1 mois ou 1 an) un cookie.
Je vais y réflechir.
Merci encore à toi, et à toutes celles et ceux qui nous aident ainsi.
Bonne soirée et à bientôt...bhé oui, je suis quand même TRES TRES debutant
:wink: et je passe pluis de temps comme ça: :-k |*()
Encore merci à toi
Tchô
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

16 mars 2007, 21:29

Modération :
Boro64, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

VaN
Mammouth du PHP | 1107 Messages

16 mars 2007, 21:38

zeus qui nous fait un passage de script :

foreach($thread != [résolu])
{
post_comment($moderation_msg, $pseudo);
}

:lol:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

16 mars 2007, 21:57

ah, que serions nous sans le copier/coller :D
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 250 Messages

16 mars 2007, 23:59

:( Houlala, oui Zeus...seulement :
1) j'espérais peut être une réponse quant à ma dernière question (mais ce n'est plus la peine, je viens de tester, et de comprendre...donc j'ai ma réponse)
2) Je souhaitai tester la proposition d'AB
3) celle ci génère tout de même un "WARNING' lors de l'utilisation
Mais tu as raison, la réponse et sans doute celle qui me met sur la voie, et je mets, tout de suite après mon post, 'Résolu' grâce à ce merveilleux bouron sus-nommé :wink:
Pardon donc pour le retard
Merci encore à tous et à bientôt...pour de nouvelles questions :lol:
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
AB
ViPHP | 5818 Messages

17 mars 2007, 11:25

Bonjour,

Je ne m'étais préoccupé que de récupérer la variable $_GET['lang'] pour la mettre dans un cookie.

Pour le reste il serait bien de travailler un peu le switch pour le mettre dans une fonction
//si le visiteur envoie la variable $_GET['lang'] pour choisir sa langue, on l'enregistre dans un cookie nommé 'lang' 
isset($_GET['lang'])? setcookie("lang", $_GET['lang']) : '' ; 

//si le cookie existe on le récupère sinon on donne la langue par défaut 
$lang = isset($_COOKIE['lang'])? $_COOKIE['lang'] : 'fr' ; 
//si $_GET['lang'] est envoyé on la récupère sinon on donne la valeur du cookie s'il existe sinon la valeur par défaut 
$lang = isset($_GET['lang'])? $_GET['lang'] : $lang ; 

//et on fait l'include suivant la valeur de $lang 
function inclure_page($lang) {
switch ($lang) 
    { 
    case 'fr': include('langues/fr_lang.php'); 
        break; 
    case 'en': include('langues/en_lang.php'); 
        break; 
    case 'es': include('langues/es_lang.php'); 
        break; 
    default : include('langues/fr_lang.php'); 
    }
}


et dans ton code HTM

Code : Tout sélectionner

<?php inclure_page($lang) ?>

Pour ce qui est du cookie, je lui mettrais une valeur non nulle puisque si le visiteur clique dessus c'est qu'il souhaite une autre langue que celle détectée par le navigateur. Alors pourquoi ne pas conserver son choix jusqu'à sa prochaine visite? :wink:

(je n'ai pas testé ce code car il est simple et tu devrais pouvoir le débugguer si problème)

ViPHP
ViPHP | 3607 Messages

17 mars 2007, 11:51

ah, que serions nous sans le copier/coller :D
Il n'y a pas de messages semi-automatique sur phpBB ?

Eléphant du PHP | 250 Messages

17 mars 2007, 13:53

Merci AB,
Je regarde ça.
Effectivement, tu as raison:
Pour ce qui est du cookie, je lui mettrais une valeur non nulle puisque si le visiteur clique dessus c'est qu'il souhaite une autre langue que celle détectée par le navigateur. Alors pourquoi ne pas conserver son choix jusqu'à sa prochaine visite? Wink
Très juste remarque dont je vais tenir compte.
Merci encore pour ton aide et conseil.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 mars 2007, 15:51

ah, que serions nous sans le copier/coller :D
Il n'y a pas de messages semi-automatique sur phpBB ?
Encore mieux, il y a Hubert Rocksor qui nous réalise de super addons :pouce: dont les messages de modérations pré-formatés ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 250 Messages

17 mars 2007, 20:55

Bonsoir,
Désolé Zeus, mais je remets ce sujet à jour car...bhé ça marche toujours pô :(
Après vérification, et peut être est-ce là le problème, le cookie est bien créé, mais..il y autant de cookie que d'impulsion de choix de langues...
Je m'explique: 1 cookie est enregistré à l'arrivée sur le site avec l'extension de la langue du navigateur...puis si je selectionne une autre langue que celle affichée, il se crée un second cookie...qui n'écrase pas le 1er...???!!! :twisted:
Or, je croyais avoir lu dans le manuel php qu'un nouveau cookie écrasait le précedent; ici visiblement il n'en est rien; si bien qu'au changement de page, le 1er cookie prend le pas sur le second...et affiche donc la page dans la langue initiale... |*()
AB, merci pour ton aide, visiblement sinon tout fonctionne (et j'ai ajouté une limite de temps au cookie comme très justement suggéré plus haut :wink:
Voilà, je ne remets pas le code puisque c'est celui inscrit plus haut.
Si quelqu'un a une piste, je suis bien sur preneur...
Merci à toutes et tous
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

VaN
Mammouth du PHP | 1107 Messages

17 mars 2007, 22:46

Tu y trouveras peut etre une utilité, voici comment je gère la langue d'affichage d'un site multi-langue sur lequel je travaille (je n'utilise pas du tout la langue d'affichage du browser, donc peut etre a retravailler) :

sur chacune de mes pages :
// on recupère la langue d'affichage
if(isset($_GET['lang']))
{
	include 'lang/'.$_GET['lang'].'.php';
	// création du cookie qui sauvegarde la langue
	setcookie("lang",$_GET['lang'],time() + 365*24*3600);
}
elseif(isset($_COOKIE['lang']))
	include 'lang/'.$_COOKIE['lang'].'.php';
else
	include 'lang/fr.php';
Les boutons de changements de langues :
<a href="<?php echo $_SERVER['PHP_SELF']; ?>?lang=fr<?php echo $add; ?>"><img src="img/flag_fr.gif" alt="Français" border="0" /></a>
<a href="<?php echo $_SERVER['PHP_SELF']; ?>?lang=en<?php echo $add; ?>"><img src="img/flag_uk.gif" alt="English" border="0" /></a>

Eléphant du PHP | 250 Messages

18 mars 2007, 10:50

Merci VaN,
je vais regarder ça de près...
Mai: Est-il vrai qu'un cookie ecrase le precedent?
Si oui, pourquoi cel ne se fait il pas dans le cas vu plus haut??? :?
Merci de vos réponses...la doc php ne dit rien à ce sujet...me semble-t-il...
Merci encore à toutes et tous
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Invité
Invité n'ayant pas de compte PHPfrance

18 mars 2007, 12:04

Mai: Est-il vrai qu'un cookie ecrase le precedent?
Oui il écrase le précédent du même nom.

Pris isolément, le code que je t'ai donné plus haut fonctionne. Il doit y avoir une erreur ailleurs dans ton code.