Rechercher : dans
Par :

PHP/gestion multi langues avec cookie

Dernière réponse le 18 oct 2009 à 20:58:15 jiboom, le 26 sep 2008 à 18:53:42 
 Signaler ce message aux modérateurs

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.
Configuration: Windows XP
Firefox 3.0.2

Meilleures réponses pour « PHP/gestion multi langues avec cookie » dans :
Introduction à PHP Voir Qu'est-ce que PHP? PHP est un langage interprété (un langage de script) exécuté du côté serveur (comme les scripts CGI, ASP, ...) et non du côté client (un script écrit en Javascript ou une applet Java s'exécute sur votre ordinateur...). La...
Désactiver le gestionnaire ORANGE/WANADOO VoirVoici une manipulation très utile pour ceux qui utilisent une connexion Wanadoo / Orange. Il est très intéressant de remarquer que les programmes de ce FAI (gestionnaire Orange, Navigateur Orange) sont certes pratiques pour les débutants, mais sur...
Télécharger AMSN VoiraMSN est un clone de MSN Messenger en version libre, possédant de nombreuses fonctionnalités parmi lesquelles : Affichage des images Emoticones personnalisées Support Multi-langues (40 langages supportés) Support des Webcams Connexion...
Télécharger PSPad VoirPSPad est un excellent éditeur de texte. Il est utile pour travailler sur du simple texte, mais aussi sur du HTML, CSS, Javascript, php ou autres langages de programmation (C++, Java, Python...). Les fonctionnalités sont impressionnantes: ...
PHP - Les fichiers VoirLa gestion des fichiers avec PHP Avec PHP, la création ou la lecture de fichiers est, une fois de plus, assez simple. Il existe une multitude de fonctions dédiées à l'utilisation des fichiers. La communication entre le script PHP et le fichier...
Les langages informatiques VoirLangage informatique On appelle « langage informatique » un langage destiné à décrire l'ensemble des actions consécutives qu'un ordinateur doit exécuter. Un langage informatique est ainsi une façon pratique pour nous (humains) de donner des...
PHP - Mail et fonctions réseau VoirPHP étant un langage consacré au Web, il possède bien évidemment des fonctions lui permettant de communiquer avec le "monde extérieur" à l'aide de fonctions standards. Le service le plus utilisé sur Internet étant la messagerie électronique, il est...

1

zzzrod, le 26 sep 2008 à 19:55:06

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>

Répondre à zzzrod

2

jiboom, le 27 sep 2008 à 19:42:15

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); 
?>

Répondre à jiboom

3

donuts08, le 27 sep 2008 à 20:40:26

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

Répondre à donuts08

4

jiboom, le 28 sep 2008 à 03:13:18

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....

Répondre à jiboom

5

donuts08, le 28 sep 2008 à 14:44:07

Regarde ici:

http://www.developpez.net/...

donc en résumé changes le nom de ton cookie et ça marchera... OU tu mets $_GET à la place de $_REQUEST

Répondre à donuts08

6

jiboom, le 29 sep 2008 à 01:21:56
  • +3

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.

Répondre à jiboom

7

jiboom, le 29 sep 2008 à 19:34:53

Je ne sais pas comment switcher la discussion en "RESOLU"...

Répondre à jiboom

8

donuts08, le 29 sep 2008 à 19:48:26

Regardes en haut de ta première question =)

Répondre à donuts08

9

etilyeti, le 2 mar 2009 à 02:03:32

Merci Jiboum.
Comment est-ce qu'on ajoute une troisieme langue?

Répondre à etilyeti

10

 forever, le 18 oct 2009 à 20:58:15
  • +1

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);
?>

Répondre à forever