Discussion:
multilingue IE et FireFOX
(trop ancien pour répondre)
Bruno
2007-03-08 20:02:15 UTC
Permalink
Bonjour,
Je débute en Php , j'ai trouvé un moyen pour faire un site multi
lingue, cependant il ne fonctionne qu'avec firefox et non IE ?? ça
pose problème !!!
que puis je faire ?
au début de chaque page j'ai :

<?php
$page="lapageencours.php";
if(isset($_COOKIE['langue']))
{
if($_COOKIE['langue'] == 'fr')
{
require("langues/fr/$page");
}
elseif($_COOKIE['langue'] == 'en')
{
// Pour les anglais
require("langues/en/$page");
}
elseif($_COOKIE['langue'] == 'de')
{
// Pour les allemands
require("langues/de/$page");
}
elseif($_COOKIE['langue'] == 'it')
{
// Pour les italiens
require("langues/it/$page");
}
elseif($_COOKIE['langue'] == 'tr')
{
// Pour les turcs
require("langues/tr/$page");
}
else
{
// Au cas où le cookie de langue soit dans une autre langue que
celles proposées
require("langues/en/$page");
}
}
else
{
$langue = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langue = $langue[0].$langue[1];

$date_expiration = time() + 2*24*3600;
setcookie('langue', $langue, $date_expiration);


if($langue == 'fr')
{
// Pour les navigateurs français
require("langues/fr/$page");
}
elseif($langue == 'en')
{
// Pour les anglais
require("langues/en/$page");
}
elseif($langue == 'de')
{
// Pour les allemands
require("langues/de/$page");
}
elseif($langue == 'it')
{
// Pour les italiens
require("langues/it/$page");
}
elseif($langue == 'tr')
{
// Pour les turcs
require("langues/tr/$page");
}
else
{
// Au cas où la langue soit dans une autre langue que celles
proposées
require("langues/en/$page");
}

}
if($_GET['langue'] == 'fr')
{
$date_expiration = time() + 2*24*3600; // Un an !
setcookie('langue', 'fr', $date_expiration); // On enregistre le
cookie

header("location: $page"); // On lui remontre la meme page

}
elseif($_GET['langue'] == 'en')
{
$date_expiration = time() + 2*24*3600;
setcookie('langue', 'en', $date_expiration);

header("location: $page");

}
elseif($_GET['langue'] == 'tr')
{
$date_expiration = time() + 2*24*3600;
setcookie('langue', 'tr', $date_expiration);

header("location: $page");

}
elseif($_GET['langue'] == 'it')
{
$date_expiration = time() + 2*24*3600;
setcookie('langue', 'it', $date_expiration);

header("location: $page");

}
elseif($_GET['langue'] == 'de')
{
$date_expiration = time() + 2*24*3600;
setcookie('langue', 'de', $date_expiration);

header("location: $page");

}
?>



et sur toutes les pages j'ai les drapeaux des pays pour avec un lien ?
langue=fr pour le français par exemple!
je ne comprends pas pourquoi ça marche sur firefox et pas sur IE, que
faut il faire pour y remédier, ça fait plusieurs jours que je tourne
en rond !!
Merci pour vos futures très bonnes réponses!!
Bruno
Olivier Miakinen
2007-03-09 11:06:15 UTC
Permalink
Post by Bruno
Je débute en Php , j'ai trouvé un moyen pour faire un site multi
lingue, cependant il ne fonctionne qu'avec firefox et non IE ?? ça
pose problème !!!
que puis je faire ?
<?php
[ code long comme un jour sans pain, plein de redondances ]
?>
Voici déjà une version condensée de ton code (sauf erreur ça fait
exactement la même chose, mais en quatre fois plus court).

<?php
$page="lapageencours.php";

if (isset($_COOKIE['langue'])) {
$langue = $_COOKIE['langue'];
} else {
$langue = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langue = $langue[0].$langue[1];

$date_expiration = time() + 2*24*3600;
setcookie('langue', $langue, $date_expiration);
}

switch ($_COOKIE['langue']) {
case 'fr':
case 'en':
case 'de':
case 'it':
case 'tr':
break;
default:
$langue = 'en';
}
require("langues/$langue/$page");

switch ($_GET['langue']) {
case 'fr':
case 'en':
case 'de':
case 'it':
case 'tr':
$date_expiration = time() + 2*24*3600;
setcookie('langue', $_GET['langue'], $date_expiration);
header("location: $page");
break;
}
?>

Et là on peut remarquer plein d'erreurs. Par exemple :
- tu ne testes pas que $_SERVER['HTTP_ACCEPT_LANGUAGE'] existe ;
- tu ne testes pas que $_GET['langue'] existe ;
- s'il existe et vaut l'une des cinq langues prévues, la redirection
par header rend inutile tout le traitement fait précédemment (à
moins que le require() fasse un exit(), auquel cas c'est la fin du
code qui est inutile) ;
- s'il n'existe pas, ou s'il vaut par exemple 'es', tu ne fais rien
(à moins que tu aies coupé du code dans ton exemple) ;
- si tu n'as pas de cookie mais un paramètre en get, le setcookie
est fait deux fois, pas forcément avec la même valeur ;
- la redirection est faite vers une adresse relative et non pas
absolue. Ça marchera avec la plupart des navigateurs, mais comme
c'est interdit par la norme rien ne garantit que ça marchera avec
tous ;
- de toute façon ce genre de redirection est plutôt stupide (voir
la FAQ).

J'en ai peut-être oublié... mais déjà tu as quelques pistes pour
avancer.
Olivier Miakinen
2007-03-09 17:51:18 UTC
Permalink
Post by Olivier Miakinen
Voici déjà une version condensée de ton code (sauf erreur ça fait
exactement la même chose, mais en quatre fois plus court).
Heureusement que j'ai écrit « sauf erreur ». ;-)
Post by Olivier Miakinen
<?php
$page="lapageencours.php";
if (isset($_COOKIE['langue'])) {
$langue = $_COOKIE['langue'];
} else {
$langue = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langue = $langue[0].$langue[1];
$date_expiration = time() + 2*24*3600;
setcookie('langue', $langue, $date_expiration);
}
switch ($_COOKIE['langue']) {
Il fallait bien sûr lire « switch ($langue) »
Bruno
2007-03-09 22:35:01 UTC
Permalink
Post by Olivier Miakinen
Post by Olivier Miakinen
Voici déjà une version condensée de ton code (sauf erreur ça fait
exactement la même chose, mais en quatre fois plus court).
Heureusement que j'ai écrit « sauf erreur ». ;-)
Post by Olivier Miakinen
<?php
$page="lapageencours.php";
if (isset($_COOKIE['langue'])) {
$langue = $_COOKIE['langue'];
} else {
$langue = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langue = $langue[0].$langue[1];
$date_expiration = time() + 2*24*3600;
setcookie('langue', $langue, $date_expiration);
}
switch ($_COOKIE['langue']) {
Il fallait bien sûr lire « switch ($langue) »
Merci à vous thierry et Olivier!!
Bien que je ne soit pas doué, j'ai beaucoup appris avec vous!!
alors j'ai essayer de suivre vos idées, et j'ai fait un essai et ça a
l'air de pas mal marcher!! bon j'espère qu'il n'y a pas de failles??

voilà ce que ça donne:

$page=pageencours.php;

if (isset($_COOKIE['langue']))
{$langue= $_COOKIE['langue']; }
else {
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
{$langue = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langue = $langue[0].$langue[1];}
else {$langue = 'en'; }}


if (isset($_GET['langue']))
{ $langue = $_GET['langue']; }

switch ($langue)
{case 'fr':
case 'en':
case 'de':
case 'it':
case 'tr':
break;
default:
$langue = 'en'; }

$date_expiration = time() + 2*24*3600;
setcookie('langue', $_GET['langue'], $date_expiration);
require("langues/$langue/$page");


et ça a l'air de bien marcher !!
J'espère ne rien avoir oublié, je n'ai pas pu faire tous les tests,
mais bon!, qu'est ce que vous en pensez ?
Merci encore!!
Bruno
Olivier Miakinen
2007-03-10 10:07:58 UTC
Permalink
Hahaha... c'est Google qui trouve que « om+n... » est plus court que
« om+news » ?

Si c'est pour charcuter ainsi l'adresse de courriel, il vaudrait mieux
ne pas la mettre du tout et se contenter du nom.
[...] j'ai essayer de suivre vos idées, et j'ai fait un essai et ça a
l'air de pas mal marcher!! bon j'espère qu'il n'y a pas de failles??
$page=pageencours.php;
if (isset($_COOKIE['langue']))
{$langue= $_COOKIE['langue']; }
else {
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
{$langue = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langue = $langue[0].$langue[1];}
else {$langue = 'en'; }}
if (isset($_GET['langue']))
{ $langue = $_GET['langue']; }
Ici, le $_GET prend le pas sur les deux autres. Du coup, plutôt que de
calculer $langue à partir de $_COOKIE ou de HTTP_ACCEPT_LANGUAGE avant
de l'écraser par le $_GET, tu peux faire ceci (je réindente d'une façon
que je trouve personnellement *beaucoup* plus lisible) :

if (isset($_GET['langue'])) {
$langue = $_GET['langue'];
} else if (isset($_COOKIE['langue'])) {
$langue= $_COOKIE['langue'];
} else if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$langue = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langue = $langue[0].$langue[1];
} else {
$langue = 'en';
}

Et du coup tu peux même encore simplifier avec $_REQUEST qui englobe en
une seule fois $_GET et $_COOKIE (et même $_POST pour le jour où tu
voudras faire des formulaires en POST) :

if (isset($_REQUEST['langue'])) {
$langue = $_REQUEST['langue'];
} else if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$langue = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$langue = $langue[0].$langue[1];
} else {
$langue = 'en';
}
switch ($langue)
break;
$langue = 'en'; }
$date_expiration = time() + 2*24*3600;
setcookie('langue', $_GET['langue'], $date_expiration);
require("langues/$langue/$page");
Ça me semble bien (sauf pour l'indentation, et surtout la place des
accolades qui me fait penser à certains programmes en lisp). ;-)
thierry
2007-03-10 10:07:58 UTC
Permalink
salut,

perso je supprimerais le switch par un reg exp....
mais ça devient politique comme débat
Post by Bruno
if (isset($_GET['langue']))
{ $langue = $_GET['langue']; }
if ( !preg_match('/^(de|en|fr|it)$/', $langue) )
$langue = 'en';
Post by Bruno
$date_expiration = time() + 2*24*3600;
setcookie('langue', $_GET['langue'], $date_expiration);
require("langues/$langue/$page");
Thierry
2007-03-12 10:23:49 UTC
Permalink
Post by thierry
salut,
perso je supprimerais le switch par un reg exp....
Ou juste un test :
if (file_exists("langues/$langue/$page))
include("langues/$langue/$page");
else include("langues/en/$page");
Olivier Miakinen
2007-03-12 12:07:16 UTC
Permalink
Post by Thierry
Post by thierry
perso je supprimerais le switch par un reg exp....
if (file_exists("langues/$langue/$page))
include("langues/$langue/$page");
else include("langues/en/$page");
Pas mal, mais à manier avec précaution quand même. En effet, si j'ai
bien compris, $page représente la page en cours. Alors si $langue vaut
"..", le script va boucler puisque "langues/../$page" est équivalent à
"$page".

thierry
2007-03-09 11:06:15 UTC
Permalink
re

relativement à mon précédent message il y a une erreur.
le script va boucler sur le header('location:...')
il faut qu'il soit conditionné par un test, par exemple
sur $setCookie

thierry
Olivier Miakinen
2007-03-09 11:48:08 UTC
Permalink
Post by thierry
relativement à mon précédent message il y a une erreur.
Il y en a plus d'une. ;-)
Post by thierry
le script va boucler sur le header('location:...')
Rectification : il va boucler pour les navigateurs qui acceptent un lien
relatif, il ne va rien faire pour ceux (s'il en existe) qui sont 100 %
conformes à la norme. Rectification bis : ce n'est pas le script qui
va boucler, mais le navigateur qui va le relancer indéfiniment, en
surchargeant donc aussi bien l'ordinateur de tes visiteurs que le
réseau.

Raison de plus pour ne pas utiliser de header('location:...') du tout.
Dans ton cas, un require() est largement suffisant, beaucoup plus
performant, et beaucoup moins sujet à ce genre de bug, sans compter
que tu ne dépends pas du comportement des navigateurs.
Post by thierry
il faut qu'il soit conditionné par un test, par exemple
sur $setCookie
S'il te plaît, ne commence pas à compliquer ton code inutilement, il
l'est déjà assez comme ça. Au contraire il faut le simplifier.
Post by thierry
thierry
Tiens ? Dans ton premier article tu t'appelais Bruno. Au passage, si tu
n'es pas thierry.ANTISPAM.schmit, tu devrais avoir le nom de domaine qui
se termine en « .INVALID ».

Exemples :
<***@free.fr.invalid>
<***@free.invalid>

Mais pas :
<***@invalid.free.fr>

Ni :
<***@free.fr.invalide>
Thierry
2007-03-09 17:46:03 UTC
Permalink
en fait relativement à un message sur lequel j'ai fait répondre à l'auteur
et non pas répondre au groupe, d'où mon message n'est pas paru.
Et comme ton condensé de code est plus court que celui que je proposais
je vais me dispenser de le poster sur le forum :)
Post by Olivier Miakinen
Post by thierry
relativement à mon précédent message il y a une erreur.
Il y en a plus d'une. ;-)
Continuer la lecture sur narkive:
Loading...