8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je tente de mettre en place un site multilingue Smiley lol
Pour cela, lorsque je suis sur une page de mon site (n'importe laquelle), j'appelle le code suivant, contenu dans un fichier choix-langue.php:

if(!$_GET['lang']) {
	echo 'Erreur, aucune langue n\'a été choisie…';
	}
else
	{
	setcookie('fabricecaboche_lang',$_GET['lang']);
	$location = $_SERVER["REQUEST_URI"];
	header('location: '.$location);
	}


Comment définir $location pour récupérer l'url d'où je viens (et les éventuelles variables contenues dans l'url - il n'y en n'a pas toujours)?

$_SERVER["REQUEST_URI"] ne fonctionne pas:

a écrit :
Trop de redirections sont survenues en tentant d’ouvrir « http://www.*****.net/choix-lang.php?lang=fr&nomRub=web ». Ceci peut se produire lorsque vous ouvrez une page qui est redirigée vers une autre page laquelle se redirige à son tour vers la page originale.


J'ai bien regardé du côté des principales entrées de $_SERVER, mais je n'ai rien trouvé de concluant…

Une âme charitable aurait une idée? une piste?
Modifié par speedlab (27 Feb 2010 - 18:28)
Ta redirection provoque un boucle infini, doù le message de ton browser.
En effet tu fais un header location sans mettre le paramètre get dans l'url.
Ne confonds pas cookie et paramètre get.
Pense aussi à utiliser les sessions.
Salut,

tu te simplifierais la vie en faisant un lien vers la page en cours (et donc en faisant un include de choix-langue.php au début de chaque page).

Exemple de code pour les liens :
<?php
$qry_str = preg_replace('#&*lang=[a-z]{2}#', '', $_SERVER['QUERY_STRING']);
$href_lang = !empty($qry_str) ? htmlspecialchars($_SERVER['PHP_SELF']).'?'.$qry_str.'&amp;lang=' : htmlspecialchars($_SERVER['PHP_SELF']).'?lang=';
?>
<a href="<?php echo $href_lang; ?>fr">français</a> <a href="<?php echo $href_lang; ?>en">english</a>  

Modifié par Heyoan (16 Feb 2010 - 10:54)
Bonsoir Heyoan,

Peux-tu s'il te plaît m'expliquer en français le contenu des variables $qry_st et $href_lang ?

$qry_str est une expression régulière, mais que fait-elle exactement?
et surtout, peux-tu m'expliquer $href_lang?

J'aimerais bien comprendre Smiley lol
Yep ! Smiley langue

alors déjà $_SERVER['QUERY_STRING'] permet de récupérer une string contenant toutes les variables en GET d'une url (tout ce qui est placé après le ?). Par exemple pour l'url http://www.example.com/index.php?var1=22&var2=33&lang=fr elle contiendra var1=22&var2=33&lang=fr. Donc la ligne
$qry_str = preg_replace('#&*lang=[a-z]{2}#', '', $_SERVER['QUERY_STRING']); 
permet de récupérer cette variable en supprimant un éventuel &lang=fr (ou &lang=en) ce qui donne ici :
$qry_str = 'var1=22&var2=33'.

La seconde ligne
$href_lang = !empty($qry_str) ? htmlspecialchars($_SERVER['PHP_SELF']).'?'.$qry_str.'&lang=' : htmlspecialchars($_SERVER['PHP_SELF']).'?lang='; 
utilise un opérateur ternaire et permet de préparer le lien de base (pour rappeler la même page) auquel on va rajouter &lang=fr ou &lang=en : si $qry_str est vide on se contente de prendre l'url de la page htmlspecialchars($_SERVER['PHP_SELF']) à laquelle on rajoute ?lang=, sinon on concatène l'url de la page avec $qry_str puis on rajoute &lang=
Ensuite chacun des liens rajoute fr pour français et en pour english.

Si par exemple ta page s'appelle index.php il suffit de tester avec les urls suivantes :
http://www.example.com/index.php
http://www.example.com/index.php?var1=22
http://www.example.com/index.php?var1=22&var2=33&lang=fr
http://www.example.com/index.php?lang=fr
et de regarder à chaque fois les liens générés.
Ok,
Et merci, j'ai (bien) compris, enfin je crois Smiley smile

Alors, tout ça fonctionne presque. Je commence ma page par le code suivant pour définir la valeur de mon cookie:

if(!$_GET['lang']) { $_GET['lang'] = 'fr'; }
else { setcookie('moncookie_lang',$_GET['lang']); }


Ce bout de code est suivi, quelques lignes en dessous, par include('select-lang.php'), qui contient ce code (pour récupérer la langue écrite dans mon cookie précédemment):


	 if(isset($HTTP_COOKIE_VARS['moncookie_lang'])) {
	     $lang = $HTTP_COOKIE_VARS['moncookie_lang'];
	 } else {
 	     $lang = substr($HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE'],0,2); 
	 }

 	 if ($lang == 'fr') { include('lang/fr-lang.php'); } 
 	 elseif ($lang == 'es') { include('lang/es-lang.php'); } 
 	 
 	 //définition de la durée du cookie (7 jours)
 	 $expire = 7*24*3600; 
 	 
 	 //enregistrement du cookie
 	 setcookie('moncookie_lang', $lang, time() + $expire); 


Mon problème: ça ne fonctionne que si je clique deux fois sur le lien défini par tes liens… Est-ce parce que l'include('select-lang.php') n'est pas opérationnel de suite après l'écriture du cookie?

Une idée, une piste?
speedlab a écrit :
Est-ce parce que l'include('select-lang.php') n'est pas opérationnel de suite après l'écriture du cookie?
Non : c'est parce qu'un cookie n'est disponible en lecture qu'après le rechargement de la page.

Au passage $HTTP_COOKIE_VARS et $HTTP_SERVER_VARS sont obsolètes depuis plusieurs années déjà : il faut utiliser $_COOKIE et $_SERVER. De toute façon ton code est un peu moche ! Smiley langue

Dans l'ordre des priorités :
* est-ce qu'une langue a été cliquée ($_GET['lang']) ?
* sinon est-ce qu'un cookie moncookie_lang existe ?
* sinon est-ce que la variable $_SERVER['HTTP_ACCEPT_LANGUAGE'] est renseignée ?
* sinon on attribue une valeur par défaut.
Ce qui donne :
$langues = array('fr', 'es'); // langues autorisées 
if(!empty($_GET['lang']) && in_array($_GET['lang'], $langues)) { 
    $lang = $_GET['lang']; 
	$expire = 365 * 24 * 3600;  // on définit la dure du cookie, (ici 1 an) 
	setcookie("moncookie_lang", $lang, time()+$expire, '/');  // on l'écrit 
} elseif(!empty($_COOKIE['moncookie_lang']) && in_array($_COOKIE['moncookie_lang'], $langues)) { 
    $lang = $_COOKIE['moncookie_lang']; 
} elseif(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && in_array(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2), $langues)) { 
    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); 
} else { 
    $lang = 'fr'; 
} 
...
require_once('lang/'.$lang.'-lang.php'); // avant le DOCTYPE si aucune sortie HTML (echo, print...) sinon plus loin dans le BODY

Modifié par Heyoan (27 Feb 2010 - 09:31)
…Merci Heyoan, tes explications sont limpides!

Heyoan a écrit :
Non : c'est parce qu'un cookie n'est disponible en lecture qu'après le rechargement de la page.


Tout s'explique, je ne le savais pas Smiley lol

Encore merci pour les explications et le(s) coup(s) de pouce(s?).