PHP/gestion multi langues avec cookie

Résolu/Fermé
jiboom - 26 sept. 2008 à 18:53
 le malien - 22 avril 2012 à 17:42
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
<?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:

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)
<?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.
11
je ne sais pas comment switcher la discussion en "RESOLU"...
0
bonjour à tous,

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.
0
En vue de la réutilisation de ce script, je l'a mis à jour pour une utilisation sur PHP 5.3 (quelques détails) et ne le bride plus a 2 langues.
// Déterminer dans quelle langue les URLs seront traduites

// 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['lang']) && !isset ($_GET['langue']))	
	{  			
	$langue = $_COOKIE['lang'];
	}
// le choix de la langue est déclaré par url
else if (isset($_GET['langue']))
	{ 
	$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($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
	// on peut rajouter ici un script pour les langues autorisées 
	set_cookie($langue);
	}

//fonction de création du cookie de la langue
function set_cookie($langue)
	{
	$expire = 365*24*3600;
//enregistrement du cookie au nom de lang + détection si erreur
	if (setcookie("lang", $langue, time() + $expire) != TRUE)
		{
			//echo 'Le cookie n\'a pas marché<br />'.$_COOKIE['lang'];
		}
	else
		{
			setcookie("lang", $langue, time() + $expire);
			//echo 'Le cookie a marché<br />'.$_COOKIE['lang'];		
		}
	}
0
j'ai arrangé un peu le code pour nos chers débutants:

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";
}
?>
0
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:
<?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;?>&amp?lang=fr" ><span><span><img src="images/FR.png" height=25 width=32 /></span></span></a></li>       
    				<li><a href="?page=<?php echo $page;?>&amp?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); 
?>
1
zzzrod Messages postés 28 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 13 novembre 2011 3
26 sept. 2008 à 19:55
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>
0
donuts08 Messages postés 519 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 15 octobre 2008 39
27 sept. 2008 à 20:40
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
0

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

<?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&amp;page=<?php echo $page;?>" ></a>
<a href="?lang=fr&amp;page=<?php echo $page;?>" ></a>


frustration....
0
donuts08 Messages postés 519 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 15 octobre 2008 39
28 sept. 2008 à 14:44
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
0
donuts08 Messages postés 519 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 15 octobre 2008 39
29 sept. 2008 à 19:48
regardes en haut de ta première question =)
0
Merci Jiboum.
Comment est-ce qu'on ajoute une troisieme langue?
0
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);
?>
0