PHP/gestion multi langues avec cookie
Résolu
jiboom
-
le malien -
le malien -
Bonjour,
j'ai créé un site en php avec affichage sur page unique. je veux mettre 2 images clickable, avec 2 petits drapeaux permettant de choisir la langue d'affichage.
j'ai procéder en créant 2 fichiers: fr-lang.php et en-lang.php. Ils contiennent les memes variables, avec des valeurs différentes selon la langue.
ex: pour fr-lang.php
ex: pour en-lang.php
jusque là ça roule. je veux créer une cookie sur ma 1ère page (index.php) comme ça:
j'ai donc testé l'existence de mon cookie, et selon le cas redirigé vers la bonne langue, ou sinon celle du navigateur.
Maintenant la ou j'ai un probleme, c'est que ma variable $lang ne change jamais. elle est sensé etre modifiée sur ce lien:
remarque:je passe une autre variable qui fonctionne très bien, $page, mais si j'enlève le code php lié à cette variable dans cette balise, le problème ne change pas.
Sous FF ou IE, le pb est le même. Si je vais voir le cookie dans mes doosiers, il est biuen là, mais la valeur lang est toujours 'fr', jamais 'en'...
J'espère avoir été le plus clair.
Après trop d'heures à tourner en rond, je m'en remets à vous!
Merci d'avance.
j'ai créé un site en php avec affichage sur page unique. je veux mettre 2 images clickable, avec 2 petits drapeaux permettant de choisir la langue d'affichage.
j'ai procéder en créant 2 fichiers: fr-lang.php et en-lang.php. Ils contiennent les memes variables, avec des valeurs différentes selon la langue.
ex: pour fr-lang.php
<?php //--------------------------------------------------------- // menu de index.php //--------------------------------------------------------- define('TXT_BOUTON_1', 'HOME'); define('TXT_BOUTON_2', 'bonjour'); define('TXT_BOUTON_3', 'au revoir'); ?>
ex: pour en-lang.php
<?php //--------------------------------------------------------- // menu de index.php //--------------------------------------------------------- define('TXT_BOUTON_1', 'HOME'); define('TXT_BOUTON_2', 'hello'); define('TXT_BOUTON_3', 'good bye'); ?>
jusque là ça roule. je veux créer une cookie sur ma 1ère page (index.php) comme ça:
<?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); } if ($lang=='fr') { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php include('lang/fr-lang.php'); } elseif ($lang=='en') { // si la langue est 'en' (anglais) on inclut le fichier en-lang.php include('lang/en-lang.php'); } //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); ?> <html> <head>blabla</head> <body>blabla</body> </html>
j'ai donc testé l'existence de mon cookie, et selon le cas redirigé vers la bonne langue, ou sinon celle du navigateur.
Maintenant la ou j'ai un probleme, c'est que ma variable $lang ne change jamais. elle est sensé etre modifiée sur ce lien:
<a href="?page=<?php echo "$page";?>?lang=fr" ><span><span><img src="images/FR.png" height=25 width=32 /></span></span></a>
remarque:je passe une autre variable qui fonctionne très bien, $page, mais si j'enlève le code php lié à cette variable dans cette balise, le problème ne change pas.
Sous FF ou IE, le pb est le même. Si je vais voir le cookie dans mes doosiers, il est biuen là, mais la valeur lang est toujours 'fr', jamais 'en'...
J'espère avoir été le plus clair.
Après trop d'heures à tourner en rond, je m'en remets à vous!
Merci d'avance.
A voir également:
- PHP/gestion multi langues avec cookie
- Logiciel gestion locative gratuit excel - Télécharger - Comptabilité & Facturation
- Logiciel gestion photo gratuit - Guide
- Easy php - Télécharger - Divers Web & Internet
- Traduction toutes les langues gratuit - Télécharger - Traduction
- Gestion de fichiers - Télécharger - Gestion de fichiers
9 réponses
mon probleme est résolu. merci pour les différents coups de mains qui m'ont aiguillé vers la résolution de ce problème! Mon erreur se situait dans les boucles if-else et dans les appellations des variables.
voici la solution:
étape 1: DETECTION (1ères lignes de index.php)
étape 2: CREATION DU COOKIE (les lignes qui suivent)
etape 3: CHOIX DE LA LANGUE A AFFICHER (script dans le BODY)
étape 4: LIENS <A HREF="">
Merci pour votre aide, j'espère que ça aidera d'autres personnes.
voici la solution:
étape 1: DETECTION (1ères lignes de index.php)
<?php // si langue déclarée par cookie et qu'il ny a pas de requete // pour le choix de la langue alors on choisit le cookie if (isset ($_COOKIE['CHOIXlang']) && $_GET['langue'] != 'fr' && $_GET['langue'] != 'en') { $langue = $_COOKIE['CHOIXlang']; } // le choix de la langue est déclaré par url else if ($_GET['langue'] == 'en' || $_GET['langue'] == 'fr') { $langue = $_GET['langue']; set_cookie($langue); } // si aucune langue n'est déclarée on tente de reconnaitre // la langue par défaut du navigateur else { $langue = substr($HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE'],0,2); set_cookie($langue); } ?>
étape 2: CREATION DU COOKIE (les lignes qui suivent)
<?php function set_cookie($langue) { //définition de la durée du cookie (1 an) $expire = 365*24*3600; //enregistrement du cookie au nom de CHOIXlang + détection si erreur if (setcookie("CHOIXlang", $langue, time() + $expire) != TRUE) { // echo 'Le cookie na pas marché<br />'; } else { setcookie("CHOIXlang", $langue, time() + $expire); // echo 'Le cookie a marché<br />'; } } ?>
etape 3: CHOIX DE LA LANGUE A AFFICHER (script dans le BODY)
<?php // affichage de la bonne langue // si le cookie vaut 'fr' ou si la requete vaut 'fr', // on inclut le fichier fr-lang.php if ($_GET['langue'] == "fr" || $langue == "fr") { include('lang/fr-lang.php'); } // affichage de la bonne langue // si le cookie vaut 'en' ou si la requete vaut 'en', // on inclut le fichier fr-lang.php elseif ($_GET['langue'] == "en" || $langue == "en") { include('lang/en-lang.php'); } ?>
étape 4: LIENS <A HREF="">
<a href="?langue=fr" ><img src="images/FR.png" height=25 width=32 /></a>
Merci pour votre aide, j'espère que ça aidera d'autres personnes.
merci pour l'aide,
mais ça ne résoud pas mon probleme.
la variable $lang, ne se modifie jamais avec mon lien...
j'ai mis des 'echo' un peu partout pour trouver le probleme...
je me rends compte que:
-le cookie est créé
-la détection de langue par défaut fonctionne
-le cookie ne change jamais de valeur après sa création, seulement au premier load de la page, par exemple si je lance ma page comme ça: http://www.monsite.com?lang=en, le site est bien en anglais.
voila le code complet de ma page:
mais ça ne résoud pas mon probleme.
la variable $lang, ne se modifie jamais avec mon lien...
j'ai mis des 'echo' un peu partout pour trouver le probleme...
je me rends compte que:
-le cookie est créé
-la détection de langue par défaut fonctionne
-le cookie ne change jamais de valeur après sa création, seulement au premier load de la page, par exemple si je lance ma page comme ça: http://www.monsite.com?lang=en, le site est bien en anglais.
voila le code complet de ma page:
<?php if(isset($_COOKIE['lang']) && $_REQUEST['lang'] == '') { // langue déclarée par cookie $lang = $_COOKIE['lang']; $test=1; } elseif (isset($_REQUEST['lang']) && $_REQUEST['lang'] != '') { // langue déclarée par request (http link) $lang = $_REQUEST['lang']; set_cookie($lang); $test=2; } 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); set_cookie($lang); $test=3; } //tableau pour le choix des pages $tablo_pages = array( "home.php" => "home.php", "cinema.php" => "cinema.php", "docu.php" => "docu.php"); if( isset( $_GET['page'] ) && array_key_exists( $_GET['page'], $tablo_pages ) ) { $page = $tablo_pages[$_GET['page']]; } else { $page = $tablo_pages["home.php"]; } function set_cookie($lang) { //définition de la durée du cookie (1 an) $expire = 365*24*3600; //enregistrement du cookie au nom de lang + détection si erreur if (setcookie("lang", $lang, time() + $expire) != TRUE) { echo 'Le cookie na pas marché<br />'; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title> mon site </title> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <link rel="stylesheet" href="style.css" type="text/css" /> <script type="text/javascript" src="script.js"></script> <script type="text/javascript" src="sb/build/adapter/shadowbox-base.js"></script> <script type="text/javascript" src="sb/build/shadowbox.js"></script> <script type="text/javascript"> Shadowbox.loadSkin('classic', 'sb/src/skin'); Shadowbox.loadLanguage('fr', 'sb/build/lang'); Shadowbox.loadPlayer(['flv', 'html', 'iframe', 'img', 'qt', 'swf', 'wmp'], 'sb/build/player'); window.onload = function(){ Shadowbox.init(); /** * Note: The following function call is not necessary in your own project. * It is only used here to set up the demonstrations on this page. */ initDemos(); }; </script> </head> <body> <div class="PageBackgroundGlare"> <div class="PageBackgroundGlareImage"></div> </div> <div class="Main"> <div class="Sheet"> <div class="Sheet-body"> <div class="Header"> <div> <table class="logo"> <tr><td class="logo-name"><a href="#"></a></td></tr> <tr><td class="logo-text"></td></tr> </table> </div> </div> <?php // affichage de la bonne langue if ($lang == "fr") { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php include('lang/fr-lang.php'); $final=1; } elseif ($lang == "en") { // si la langue est 'en' (anglais) on inclut le fichier en-lang.php include('lang/en-lang.php'); $final=2; } // test pour les erreurs echo "$ lang vaut " ; echo $lang; echo ' '; echo "$ _COOKIE vaut (" ; echo $_COOKIE['lang']; echo ")"; echo ' '; echo "$ test vaut "; echo $test; echo ' '; echo "$ final vaut "; echo $final; ?> <div class="nav"> <ul class="menu"> <li><a href="?page=home.php" class=" active"><span><span><?php echo TXT_BOUT_1; ?> </span></span></a></li> <li><a href="?page=cinema.php"><span><span><?php echo TXT_BOUT_2; ?> </span></span></a></li> <li><a href="?page=docu.php"><span><span><?php echo TXT_BOUT_3; ?> </span></span></a></li> <li><a href="?page=<?php echo $page;?>&?lang=fr" ><span><span><img src="images/FR.png" height=25 width=32 /></span></span></a></li> <li><a href="?page=<?php echo $page;?>&?lang=en" ><span><span><img src="images/EN.png" height=25 width=32 /></span></span></a></li> </ul> <div class="l"></div> <div class="r"><div></div></div> </div> <?php include ($page); ?>
Essayez avec ça:
<?php
if(isset($_COOKIE['lang']) && $_REQUEST['lang'] == '') {
// langue déclarée par cookie
$lang = $_COOKIE['lang'];
} elseif (isset($_REQUEST['lang']) && $_REQUEST['lang'] != '') {
// langue déclarée par request (http link)
$lang = $_REQUEST['lang'];
set_cookie($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);
set_cookie($lang);
}
function set_cookie($lang) {
//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);
}
if ($_COOKIE['lang'] == 'fr') { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php
include('lang/fr-lang.php');
} elseif ($_COOKIE['lang'] == 'en') { // si la langue est 'en' (anglais) on inclut le fichier en-lang.php
include('lang/en-lang.php');
}
?>
<html>
<head>blabla</head>
<body>blabla</body>
</html>
<?php
if(isset($_COOKIE['lang']) && $_REQUEST['lang'] == '') {
// langue déclarée par cookie
$lang = $_COOKIE['lang'];
} elseif (isset($_REQUEST['lang']) && $_REQUEST['lang'] != '') {
// langue déclarée par request (http link)
$lang = $_REQUEST['lang'];
set_cookie($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);
set_cookie($lang);
}
function set_cookie($lang) {
//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);
}
if ($_COOKIE['lang'] == 'fr') { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php
include('lang/fr-lang.php');
} elseif ($_COOKIE['lang'] == 'en') { // si la langue est 'en' (anglais) on inclut le fichier en-lang.php
include('lang/en-lang.php');
}
?>
<html>
<head>blabla</head>
<body>blabla</body>
</html>
bonjour,
je vois ça et je crois que tu as mis un point d'interrogation en trop...
<li><a href="?page=<?php echo $page;?>&?lang=fr" ><span><span><img src="images/FR.png" height=25 width=32 /></span></span></a></li>
ce qui te génère: ?page=home&?lang=fr
alors que tu devrais avoir: ?page=home& lang=fr
je vois ça et je crois que tu as mis un point d'interrogation en trop...
<li><a href="?page=<?php echo $page;?>&?lang=fr" ><span><span><img src="images/FR.png" height=25 width=32 /></span></span></a></li>
ce qui te génère: ?page=home&?lang=fr
alors que tu devrais avoir: ?page=home& lang=fr
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
merci pour le coup d'oeil, j'ai réglé cet élément mais ça n'avance pas. toujours les mm pb.
j'explore, je teste...là vous pouvez voir les 1ères lignes de index.php
avec ma petite variable $test je suis sur que :
ça fonctionne très bien, le cookie est lu comme il faut quand il faut, les requetes par url sont bien interprétées et sinon le choix de la langue est juste.
le choix de l'include est juste, $final se comporte comme il faut.
mais $lang ne change jamais quand je clic sur mon lien:
frustration....
j'explore, je teste...là vous pouvez voir les 1ères lignes de index.php
<?php if (isset ($_COOKIE['lang'])) // si langue déclarée par cookie, on l'utilise { $lang = $_COOKIE['lang']; $test=1; } else if ($_REQUEST['lang'] == 'en' || $_REQUEST['lang'] == 'fr')// langue déclarée par request (http link) { $lang = $_REQUEST['lang']; set_cookie($lang); $test=2; } 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); set_cookie($lang); $test=3; } function set_cookie($lang) { //définition de la durée du cookie (1 an) $expire = 365*24*3600; //enregistrement du cookie au nom de lang + détection si erreur if (setcookie("lang", $lang, time() + $expire) != TRUE) { echo 'Le cookie na pas marché<br />'; } else { setcookie("lang", $lang, time() + $expire); echo 'Le cookie a marché<br />'; } } ?>
avec ma petite variable $test je suis sur que :
ça fonctionne très bien, le cookie est lu comme il faut quand il faut, les requetes par url sont bien interprétées et sinon le choix de la langue est juste.
<?php // affichage de la bonne langue if ($lang == "fr") // si la langue est 'fr' (français) on inclut le fichier fr-lang.php { include('lang/fr-lang.php'); $final=1; } elseif ($lang == "en") // si la langue est 'en' (anglais) on inclut le fichier en-lang.php { include('lang/en-lang.php'); $final=2; } // test pour les erreurs echo "$ lang vaut $lang . " ; echo "$ _COOKIE vaut "; echo $_COOKIE['lang']; echo "."; echo "$ test vaut $test . "; echo "$ final vaut $final ."; ?>
le choix de l'include est juste, $final se comporte comme il faut.
mais $lang ne change jamais quand je clic sur mon lien:
<a href="?lang=en&page=<?php echo $page;?>" ></a> <a href="?lang=fr&page=<?php echo $page;?>" ></a>
frustration....
regarde ici:
https://www.developpez.net/forums/d89723/php/langage/_request-vs-_get-_post/#post593174
donc en résumé changes le nom de ton cookie et ça marchera... OU tu mets $_GET à la place de $_REQUEST
https://www.developpez.net/forums/d89723/php/langage/_request-vs-_get-_post/#post593174
donc en résumé changes le nom de ton cookie et ça marchera... OU tu mets $_GET à la place de $_REQUEST
http://php-dream.com/fre/portions/portion3ca5.html?id=53
Gestion site Français et Anglais
Permet de détecter la langue du butineur, tout en laissant à l'utilisateur la possibilité de changer de langue.
De plus la langue de l'utilisateur est stockée dans un cookie, ce qui permet aussi de se souvenir de sa langue à son retour.
Dans cette portion de script si l'utilisateur n'est pas francophone, on suppose alors qu'il est anglophone.
<?php
define('COOKIE_TIME', 86400 * 365);
// Gestion de la langue
if(isset($_REQUEST['lang'])) {
// Changement de langue
$lang = ('fr' == $_REQUEST['lang']) ? 'fr' : 'en';
} else {
// Langue du Cookie
if(!empty($COOKIE['cookie_lang'])) {
$lang = ('fr' == $COOKIE['cookie_lang']) ? 'fr' : 'en';
} else {
// Langue du Navigateur
$lang = ('fr' == substr($SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)) ? 'fr' : 'en';
}
}
setcookie('cookie_lang', $lang, time() + COOKIE_TIME);
?>
Gestion site Français et Anglais
Permet de détecter la langue du butineur, tout en laissant à l'utilisateur la possibilité de changer de langue.
De plus la langue de l'utilisateur est stockée dans un cookie, ce qui permet aussi de se souvenir de sa langue à son retour.
Dans cette portion de script si l'utilisateur n'est pas francophone, on suppose alors qu'il est anglophone.
<?php
define('COOKIE_TIME', 86400 * 365);
// Gestion de la langue
if(isset($_REQUEST['lang'])) {
// Changement de langue
$lang = ('fr' == $_REQUEST['lang']) ? 'fr' : 'en';
} else {
// Langue du Cookie
if(!empty($COOKIE['cookie_lang'])) {
$lang = ('fr' == $COOKIE['cookie_lang']) ? 'fr' : 'en';
} else {
// Langue du Navigateur
$lang = ('fr' == substr($SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)) ? 'fr' : 'en';
}
}
setcookie('cookie_lang', $lang, time() + COOKIE_TIME);
?>
je developpe une site web en multi langue, pour le moment je l'ai crée en langue français et je voulais le traduire en englais, j'ai utilisé la même méthode j'avais la même problème: le variable langue est toujours n'ai pas défini, j'ai utilisé la solution de jiboom mais toujours la meme problème.
par contre dans mon code je voulais lit ce variable à partir d'une menu déroulante voici mon code HTML
<tr>
<td><div align="right" class="user">
<div align="right">LANGUAGE :</div></td> <form>
<td> <div align="left"> <input type=hidden name="langue" id="langue">
<select>
<option value="fr">Francais(Fr)</option>
<option value="en">English(En)</option>
</select>
</form>
</tr></div></td>
et j'ai utiliser la démarche de jiboom pour le codage en php.
j'attend votre aide,
cdlt.
déclaré en premier la function "set_cookie"
mettres une condition sur la variable "$_GET['langue']" pour eviter les erreurs au cas où elle n'est pas déclarée.
-----------------------------
<?php
function set_cookie($langue)
{
$expire = 365*24*3600;
if (setcookie("CHOIXlang", $langue, time() + $expire) != TRUE)
{
}
else
{
setcookie("CHOIXlang", $langue, time() + $expire);
}
}
?>
<?php
$GETlangue = isset($_GET['langue']) ? $_GET['langue']:'';
if (isset ($_COOKIE['CHOIXlang']) && $GETlangue != 'fr' && $GETlangue != 'en')
{
$langue = $_COOKIE['CHOIXlang'];
}
else if ($GETlangue == 'en' || $GETlangue == 'fr')
{
$langue = $GETlangue;
set_cookie($langue);
}
else
{
$langue = explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
$langue = strtolower(substr(chop($langue[0]),0,2));
set_cookie($langue);
}
?>
<a href="?langue=fr" >FR</a> | <a href="?langue=en" >EN</a>
<br />
<br />
<?php
if ($GETlangue == "fr" || $langue == "fr")
{
echo "fr";
}
elseif ($GETlangue == "en" || $langue == "en")
{
echo "en";
}
?>