Aller au contenu

Site multi-langue : choix non mémorisé


Angus

Sujets conseillés

Bonsoir,

Je tente de créer un site en deux langues. J'ai fais le nécéssaire pour basculer d'un choix à l'autre sans problème avec ce code :

if ($_GET['lang']=='fr') {	   
include('fr/headerfr.php');
}

else if ($_GET['lang']=='en') {
include('en/headeren.php');
}

else {
include('fr/headerfr.php');
}

En revanche, lorsque je change de page, le choix de langue ne se mémorise pas et je retombe toujours sur la langue par défaut. En clair mes liens affichent toujours : monfichier.php et pas monfichier.php?lang=en

J'ai donc cherché une solution sur le net et j'ai trouvé le code permettant de créer un cookie avec le choix mémorisé. Mais lorsque je l'installe, c'est pareil. Aucun message d'erreur, le choix de langue se fait sans problèmes sur la page mais lorsque je cliques sur un lien dans le menu : idem, le choix n'est pas mémorisé.

Voici mon code actuel :

 <?php
if(isset($HTTP_COOKIE_VARS['lang'])) {
$lang = $HTTP_COOKIE_VARS['lang'];
} else {
$lang = substr($HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE'],0,2);
}
if ($_GET['lang']=='fr') {
include('fr/headerfr.php');
}

else if ($_GET['lang']=='en') {
include('en/headeren.php');
}

else {
include('fr/headerfr.php');
}

$expire = 365*24*3600;
setcookie("lang", $lang, time() + $expire);
?>

Que dois-je faire ?

Merci

Lien vers le commentaire
Partager sur d’autres sites

Après ton premier if..else qui lit le cookie, la langue est stockée dans la variable $lang.

C'est donc cette variable $lang qu'il faut tester dans ton deuxième if..else, et non plus $_GET['lang'], qui n'est pas le cookie mais la variable passée dans l'url

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Jan a vraisemblablement raison, j'ajoute qu'il serait bon de ne plus utiliser les tableaux prédéfinis $HTTP_*_VARS (qui dates de versions de PHP antérieures à 4.1.0), mais d'utiliser les tableaux super-globaux $_SERVER, $_COOKIE, $_GET, $_POST, etc.

Pour l'instant les tableaux prédéfinis $HTTP_*_VARS sont encore disponible pour des raisons de compatibilité, mais je jour où ton application sera utilisée sur un version où ces tableaux ne le sont plus tu devras récrire tout ou partie de ton code :)

Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos réponses.

J'avoue être un peu perdu, mais je vais essayer de comprendre. Si je suis les explications de Jan, je dois réécrire mon code de cette façon ?

if ($_HTTP_COOKIE_VARS['lang']=='fr') {	  
include('fr/headerfr.php');
}

else if ($_HTTP_COOKIE_VARS['lang']=='en') {
include('en/headeren.php');
}

else {
include('fr/headerfr.php');
}

Par contre, TheRec, il va falloir me mettre un peu plus sur la piste :hypocrite:

Lien vers le commentaire
Partager sur d’autres sites

Relis le message de Jan, il te dit de tester (avec if) la variable $lang au lieu de $_GET['lang'] (toi en l'occurrence dans ton dernier message tu test $_HTTP_COOKIE_VARS['lang'], alors que je viens de te dire qu'il n'était pas conseillé d'utiliser les variable $HTTP_*_VARS, enfin tu fais comme tu veux ;)). Cela ne peut être plus clair.

Sinon si tu veux prendre en compte le paramètre GET intitulé "lang" pour qu'il prime par rapport au cookie ou à la langue du navigateur tu peux faire ainsi :

<?php
if(isset($_GET['lang'])) {
$lang = $_GET['lang'];
} elseif(isset($_COOKIE['lang'])) {
$lang = $_COOKIE['lang'];
} else {
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
}

if($lang=='fr') {
include('fr/headerfr.php');
} elseif($lang=='en') {
include('en/headeren.php');
} else {
include('fr/headerfr.php');
}

$expire = 365*24*3600;
setcookie("lang", $lang, time() + $expire);
?>

Lien vers le commentaire
Partager sur d’autres sites

Parse error: syntax error, unexpected '{' in /home/httpd/vhosts/monsite.com/httpdocs/sepia/index.php on line 87

Ca vient de ça :

if(isset($_GET['lang']) {

Désolé, je n'avais pas compris dans le bon sens (ce qui m'arrive souvent :nonono: ).

Edit : non c'est bon j'ai trouvé d'ou venait l'erreur. Il manquait un )

Edit2 : Merci TheRec ça marche ! Si je comprends bien, le code que tu m'as proposé prends en compte ton conseil sur les variables ?

Modifié par Angus
Lien vers le commentaire
Partager sur d’autres sites

Oui, effectivement il manquait un parenthèse, je t'avoue avoir écrit ceci à la volée sans l'avoir testé, pardon.

Et oui tu noteras que je n'ai pas utilisé la variable $_HTTP_COOKIE_VARS, à la place j'ai utilisé $_COOKIE, idem pour $HTTP_SERVER_VARS qui est remplacé par $_SERVER.

Ces variables $_HTTP_*_VARS ne sont pas dépréciées pour le moment, elle sont juste déconseillée parce que dans le futur elles disparaîtront certainement au profit des autres, donc autant ne plus les utiliser, ainsi la durée de vie de ton code est plus longue.

Lien vers le commentaire
Partager sur d’autres sites

Non non, mais il n'y a pas de souci, c'est déjà très gentil de m'avoir écrit le code :) Et j'apprécie aussi le petit coup de pouce pour les variables.

Merci pour tout, et merci aussi à Jan ;)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...