Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

multilingue IE et FireFOX

10 réponses
Avatar
Bruno
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

10 réponses

Avatar
Olivier Miakinen

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

Avatar
thierry
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
Avatar
Olivier Miakinen

relativement à mon précédent message il y a une erreur.


Il y en a plus d'une. ;-)

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.

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.

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 :



Mais pas :


Ni :


Avatar
Thierry
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 :)

"Olivier Miakinen" <om+ a écrit dans le message de
news:45f14243$

relativement à mon précédent message il y a une erreur.


Il y en a plus d'une. ;-)




Avatar
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 ». ;-)

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

Avatar
Bruno
On 9 mar, 18:51, Olivier Miakinen <om+ wrote:



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 ». ;-)

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


Avatar
Olivier Miakinen

On 9 mar, 18:51, Olivier Miakinen <om+ wrote:


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

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']; }


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)
{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");


Ça me semble bien (sauf pour l'indentation, et surtout la place des
accolades qui me fait penser à certains programmes en lisp). ;-)

Avatar
thierry
salut,

perso je supprimerais le switch par un reg exp....
mais ça devient politique comme débat

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


if ( !preg_match('/^(de|en|fr|it)$/', $langue) )
$langue = 'en';


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



Avatar
Thierry
"thierry" a écrit dans le message de news:
45f2747b$0$6774$
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");

Avatar
Olivier Miakinen

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


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