8791 sujets

Développement web côté serveur, CMS

Bonjour !

Je n'arrive pas à regrouper les fonctions des 2 scripts suivants destinés à l'usage d'un site multilingue :


if (isset ($_GET["lang"])) {	 
$lang = $_GET["lang"];
} else {                      
$lang = 1;
}


Jusqu'ici tout va bien mais si l'internaute a l'idée de saisir dans l'url une langue qui n'existe pas (par exemple : $lang = 5), j'aurai souhaité que la langue prise par défaut revienne à 1. D'où mon second script :


if ($_GET['lang']=='1') {
$lang = 1;
}  
else if ($_GET['lang']=='2') {
$lang = 2;
} 
else if ($_GET['lang']=='3') {
$lang = 3;
} 
else if ($_GET['lang']=='4') {
$lang = 4;
} 
else {                      
$lang = 1;
}


En fait, je souhaiterai conserver les propriétés du 1er script et ajouter la fonction du second au sein d'un même script.

ça doit sembler ridicule à un expert PHP, mais lorsque l'on est pas doué, c'est une montagne ! (Avant de poster, j'ai fait beaucoup d'essais avec nos amis is, else if...)

A votre bon coeur Smiley lol
Modifié par webmc (11 Apr 2012 - 15:41)
if(isset($_GET['lang']))
{
	switch($_GET['lang'])
	{
		case '1':
			$lang = 1;
			break;
		case '2':
			$lang = 2;
			break;
		case '3':
			$lang = 3;
			break;
		case '4':
			$lang = 4;
			break;
		default:
			$lang = 1;
			break;
	}
}
else {
	$lang = 1;
}


Mais tu peux éventuellement simplifier tout ça en remplaçant le switch avec la fonction in_array() par exemple.

if( in_array($_GET['lang'], array('1', '2', '3', '4')) )
{
	$lang = $_GET['lang'];
}
else {
	$lang = 1;
}
Un grand merci, Moust !
Tes deux versions fonctionnent parfaitement... Y'a pas à dire, y'a des œufs mieux remplis que d'autres Smiley cligne
Bonjour !

J'ouvre à nouveau le post car le titre est toujours valable pour ma nouvelle interrogation :

Je souhaite ajouter au script de moust, une fonction de contrôle préalable permettant de vérifier l'existence d'un cookie mais je n'arrive pas à associer correctement les deux scripts afin que :

Dans un 1er temps, la page cherche s'il existe le cookie "lang" pour récupérer la langue de l'utilisateur :


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


Et si l'utilisateur souhaite changer de langue manuellement :


if(isset($_GET['lang']))
{
if( in_array($_GET['lang'], array('1', '2', '3', '4')) )
{
$lang = $_GET['lang'];
}
else {
$lang = 1;
}}
else {
$lang = 1;
}


Sachant que le second script est suivi de :


setcookie('lang', $lang, time() + 365*24*3600);


Et que si j'en saisi l'usage, j'aimerai bien inscrire tout ceci au sein d'une session.

D'avance, merci de votre aide Smiley cligne

<?php

$lang_array = array('fr' => '1', 'en' => '2', 'de' => '3', 'it' => '4');
$default_lang = '1';

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

  $lang_index = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

  $user_lang = !empty($lang_array[$lang_index]) 
    ? $lang_array[$lang_index] 
    : $default_lang;

  $lang = !empty($_COOKIE['lang'])) && in_array($_COOKIE['lang'], $lang_array) 
    ? $_COOKIE['lang']
    : $user_lang;

} else {

  $get_lang = intval(trim($_GET['lang']));

  $lang = !empty($_GET['lang']) && in_array($_GET['lang'], $lang_array) 
    ? $_GET['lang']
    : $default_lang;

}


A toi de remplacer les index du tableau $lang_array par les codes ISO des langues que tu comptes gérer. Pour récupérer la langue de l'utilisateur c'est un peu plus compliqué que ce que tu as fait (substr sur HTTP_ACCEPT_LANGUAGE), on avait un sujet sur la question mais je le retrouve plus.
Modifié par jb_gfx (11 Apr 2012 - 18:53)
Devant une telle maitrise du langage, je m'abaisse bien bas. Smiley lol

Mille merci jb_gfx pour ton code qui semble fonctionner à merveille même si tu aurais pu te forcer un peu pour adapter automatiquement la langue selon la localité de l'internaute. Je déconne Smiley clapclap

Juste quelques questions sur l'usage de la solution proposée :

Par défaut, une langue est définie et un cookie se charge de retenir la langue sélectionnée par l'utilisateur. Grâce à ce fameux cookie, la langue est conservée au fil des pages visitées. Mais à votre avis, y'a t'il beaucoup de gens qui désactivent l'enregistrement des cookies sur leur navigateur comme le java-script il y a quelques années ? Car à ce moment là, le système ne fonctionne plus alors Smiley ohwell Et, dans cette perspective, n'est-il pas plus sage (alors que le cookie semble éviter l'absolue nécessité de cela) d'ajouter sur chaque lien :
 ?lang=<?php echo $lang; ?>
A moins que la meilleure solution passe par $_SESSION car l'internaute ne peut pas désactiver la fonction contrairement aux cookies ?

Et, à part le fait de ne pas devoir rajouter à chaque lien la petite extension définie plus haut, il y a d'autres avantages à inscrire le beau code de jb_gfx au sein d'une session ?

Encore MERCI !!!
Comme tu l'as dis, les cookies peuvent être désactivés ou supprimés automatiquement à la fermeture du navigateur.

Les session fonctionnent très bien, mais les données sont généralement perdues à la fermeture du navigateur.

Ce sont les principales contraintes à retenir. Après c'est une question de choix technique. L'usage d'une session reste cependant plus sûre vu que contrairement aux cookies elle ne peut être désactivé.

Le paramètre de langue en plus dans l'url peut-être utile pour passer ce paramètre lors d'un copier-coller de l'url dans un mail par exemple.
Merci d'être passé par là, Moust !

En résumé, il faut considérer le cookie "lang" comme un service supplémentaire. Si celui-ci a pu être enregistré et qu'il n'est pas effacé avant son expiration, il peut servir à afficher la langue précédemment choisie par l'utilisateur lors d'une prochaine visite avec le même navigateur.

Histoire de conclure ma formation "multilingue" et de clore ce post, comment doit-on procéder à partir du code de jb_gfx (tout en conservant l'intégralité de ses propriétés actuelles) Smiley rolleyes ?

J'ai saisi qu'il faut déjà commencer par :
session_start();

Voilà, j'ai fini Smiley lol

Mais imaginons que l'un d'entre vous trouve la syntaxe parfaite, comment ça fonctionne ensuite ? il faut toujours ajouter le paramètre de langue [$lang] à chaque lien ou ça ne sera plus utile ?

Promis après j'arrête de vous embêter... Smiley cligne
Merci Moust ! Lire j'y arrive un peu mais comprendre c'est plus difficile Smiley cligne

Ton script et celui de jb_gfx fonctionnent bien mais j'aimerai comprendre comment réussir une session dans cet exemple et y trouver éventuellement un avantage.

Alors, j'ai repris ton script en essayant d'y inclure la variable $_SESSION.


session_start(); 

if(isset($_GET['lang'])) {
if( in_array($_GET['lang'], array('1', '2', '3', '4')) )

{
$lang = $_GET['lang'];
$_SESSION['lang'] = $lang;
setcookie('lang', $lang, time() + (3600 * 24 * 30));
}

else {

$lang = 1;
$_SESSION['lang'] = 1;

}}

else if(isset($_SESSION['lang']))

{
$lang = $_SESSION['lang'];
}

else if(isset($_COOKIE['lang']))

{
$lang = $_COOKIE['lang'];
}

else

{
$lang = '1';
$_SESSION['lang'] = 1;
}


Ce que je ne comprends absolument pas, c'est que la session devrait retenir la langue en cours. Par exemple, si je suis sur :
http://localhost/xxx/index.php?lang=3 
et que j'enlève ?lang=3, la langue ne devrait pas changer (comme avec un cookie) alors que là, je retourne à la langue 1.

Avec les scripts qui n'utilisent pas de session, les liens qui permettent de changer de langue sont :
<a href="?lang=<?php echo $lang; ?>"><?php echo $M1[$lang]; ?></a>
Ainsi les paramètres s'affichent dans l'URL.

Pour passer à une autre page en cas de session, j'ai essayé :

<a href="contact.php?lang=<?php echo $_SESSION['lang']; ?>"><?php echo $M5[$lang]; ?></a>
Cela fonctionne mais je pensais, qu'avec les sessions, qu'il n'y avait pas besoin de faire apparaître les paramètres dans l'url, sinon quel est l'intérêt de tout cela par rapport à :

<a href="contact.php?lang=<?php echo echo $lang; ?>"><?php echo $M5[$lang]; ?></a>
Désolé Moust, mais là je suis perdu... Ne crie pas STP Smiley lol
Modifié par webmc (13 Apr 2012 - 16:28)
Ton script devrait fonctionner pour peu que tu ai bien placé la fonction session_start() avant l'envoie du header (avant tout code HTML ou appel à la fonction php header() ).

Ton code peut d'ailleurs être un peu simplifié (et même encore plus mais on va rester sur cette structure pour la compréhension) :


session_start(); 

if(isset($_GET['lang']))
{
	if( in_array($_GET['lang'], array('1', '2', '3', '4')) )
	{
		$lang = $_GET['lang'];
	}
	else {
		$lang = 1;
	}
}
else if(isset($_SESSION['lang']))
{
	$lang = $_SESSION['lang'];
}
else {
	$lang = 1;
}

$_SESSION['lang'] = $lang;



Et effectivement tu n'as plus besoin de passer le paramètre lang dans l'url (sauf pour changer de langue) puise qu'il est retenu un session (c'est tout l'intérêt du truc). Penses cependant à bien faire appel à la méthode session_start() sur chaque page où tu as besoin d'utiliser les sessions.
Modifié par moust (13 Apr 2012 - 17:52)
Merci super Moust !

A force de faire des essais (session, cookie), j'avais interdit au navigateur de stocker les données. Alors évidemment, ça ne pouvait pas fonctionner du coup ! Smiley fou

Ton code simplifié me convient parfaitement car l'intégration du cookie reste ainsi à ma portée. Avec un peu de persévérance, j'ai pu découvrir la variable session et l'utilisation d'un cookie à travers un exemple concret et obtenir au final un script qui fonctionne parfaitement... enfin je crois... Smiley ola

Merci de votre aide et d'avoir répondu à mes questions avec pédagogie tout en faisant fait preuve de patience Smiley lol