8768 sujets

Développement web côté serveur, CMS

Pages :
Salut, je dois effectuer un site dans les deux langues ( Français et Néerlandais ).

Tous les articles que je dois insérer en FR ont leur traduction en NL.

Niveau architecture, ça fonctionne comme suit:

monsite.com/fr/index.php
monsite.com/nl/index.php

Je comptais faire une page qui se situe à monsite.com/index.php et sur cette page, détecter la langue pour rediriger vers le FR ou le NL.

Je pensais mettre en place cela avec la méthode "HTTP_ACCEPT_LANGUAGE"], mai j'ai du mal à la mettre en place, et un stress supplémentaire me tracasse... Si le navig rencontre une autre langue que fr ou nl, que se passe-t-il?

J'ai trouvé ceci sur Alsa, mais j'ai du mal à le faire fonctionner:


$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
if ($lang != 'fr')

	$index = 'index_en.php';

	

	header("Location: $index",TRUE,301);



Une piste?
Modifié par FranZz (29 Apr 2010 - 19:35)
Bonjour.
Je travaille en ce moment sur un site pouvant être affiché en français et en anglais. J'utilise également HTTP_ACCEPT_LANGUAGE, mais avec un strpos(), pour trouver si 'fr' ou 'en' apparaît dans cette variable. Si c'est fr, mon site est affiché en français, et sinon, il est affiché en anglais.

J'imagine que tu peux procéder de la même manière. Tu n'aurais donc qu'à rechercher par exemple que si HTTP_ACCEPT_LANGUAGE contient la chaîne 'fr' : si c'est le cas, tu rediriges l'utilisateur vers monsite.com/fr/index.php, et dans le cas contraire, tu rediriges vers monsite.com/nl/index.php. Autrement dit, le néerlandais est la langue par défaut du site.
Salut! merci pour la piste.


Oui, c'est ça que j'essaie de faire, mais la langue par défaut est le fr en fait.
Et bien il te suffit de rechercher la présence de 'nl' dans HTTP_ACCEPT_LANGUAGE, et si tu ne le trouves pas, tu rediriges vers monsite.com/fr/index.php. Smiley cligne


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



if ($lang = 'nl')

	$index = 'monsite.com/fr/index.php';

	

	header("Location: $index",TRUE,301);


Bah, on dirait que ça m'affiche le fr à chaque fois....
Modifié par FranZz (29 Apr 2010 - 11:13)
Ca dépend de ton navigateur. Le tien t'affichera toujours 'fr', alors que celui d'un néerlandais affichera toujours 'nl'.

--- édit -----
Enfin c'est vrai pour les navigateurs en version finale, càd traduits. Si tu prends une alpha, il y a de très fortes chances pour que la langue acceptée soit l'anglais.
Modifié par phpdoesnotcare (29 Apr 2010 - 11:20)
ok, mais j'ai fait le test en déclarant comme ceci




$lang = 'nl';

if ($lang = 'nl')

	$index = './fr/index.php';

	

	header("Location: $index",TRUE,301);


mais la page qui s'affiche est toujours ma page de base...
oui... non, en fait, je teste, mais ça roule pas vraiment...

Je sais pourtant ce que je veux faire, mais pas assez de notions pour le mettre en pratique...

je pensais qu'en utilisant un code du genre, ça fonctionnerait:

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); 
   
if ($lang = 'nl') 
 
    $index = 'monsite.com/nl/index.php'; 
 
    header("Location: $index",TRUE,301);

else header("Location:monsite.com/fr/index.php",TRUE,301); 


mais pour être franc, je vois pas ce que 0,2 vient faire dans l'histoire, ni TRUE, ni 301, et je me doute que ma façon de rediriger est mal exprimée... Je vais donc creuser ces éléments parce que là, c'est pas vraiment exploitable...
Modifié par FranZz (29 Apr 2010 - 11:43)
Pour substr(), 0 et 2 veulent dire que tu veux ne conserver que les deux premiers premiers caractères de $_SERVER['HTTP_ACCEPT_LANGUAGE'] : tu coupes à partir du caractères 0, et tu vas 2 caractères plus loin.

Pour header(), true veut dire que ce header va remplacer le précédent, et 301 qu'il s'agit d'une redirection définitive (c'est utilisé par exemple quand tu changes de nom de domaine).

Petite info, n'ayant pas ton code sous la main : header() ne fonctionne que s'il n'y a eu aucun autre header envoyé avant, càd qu'il ne doit pas y avoir du de code HTML avant, ni de echo, print, etc.
Fais ce petit test : tout en haut de ton index.php, à la première ligne, mets le code suivant, et dis-moi si ça marche :
header('location: ./nl/index.php');

Modifié par phpdoesnotcare (29 Apr 2010 - 12:00)
Salut, je vais analyser ta soluce, mais en bidouillant entre temps, j'ai trouvé quelque chose qui fonctionne, mais c'est un peu du barbare!
( merci pour ton explication cela dit )
<?php
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

if ($lang == nl) $lang=nl;

else $lang == fr;
?>

Et quelques lignes plus bas, j'ai:

<meta http-equiv="refresh" content="2;url=<?php echo $lang; ?>/index.php" />

ça fonctionne, mais cette méthode est pas la meilleure, tu en penses quoi?
Et bien... Y'a pas mal de choses à redire. Smiley smile

Pour commencer, il est obligatoire d'utiliser des quotes, simples (') ou doubles (") autour des chaînes de caractères, comme 'fr' ou 'nl', ici.
Ensuite, en PHP, il n'est pas très "propre" de comparer des chaînes de caractères via l'opérateur ==. Il faut lui préférer la fonction strcmp() qui prend les deux chaînes à comparer en paramètre, et renvoie 0 si elles sont égales, et autre chose dans le cas contraire (je te laisse te renseigner pour en savoir plus là-dessus).
Ensuite, encore, c'est un petit souci d'algo, en fait. Voilà ce que tu fais :
Si $lang est égal à 'nl' Alors $lang vaut 'nl'
Sinon $lang vaut 'fr'
Ca n'engage que moi, mais je pense qu'il est plus simple de faire quelque chose du style :
Si $lang n'est pas égal à 'nl' Alors $lang vaut 'fr'
Enfin... le coup de la méta pour une redirection n'est pas forcément génial, et il vaut mieux passer par header().

Voilà. Smiley smile
ok ok, je m'en doute que ce que j'ai trouvé n'est pas ce qu'on fait de mieux, mais bon, c'est en cherchant quoi!

Alors, si je reprends ce que tu me demandes, c'est à dire, la première ligne de ma page étant
<?php header('location: nl/index.php'); ?>

Rien ne se passe..

Par contre, si je place dans les métas:
<meta http-equiv="refresh" content="2;url=nl/index.php" />

là ça roule....
Modifié par FranZz (29 Apr 2010 - 12:21)
FranZz a écrit :
ok ok, je m'en doute que ce que j'ai trouvé n'est pas ce qu'on fait de mieux, mais bon, c'est en cherchant quoi!
Ah mais je suis tout à fait d'accord. Et pour être franc, je préfère largement que tu testes par toi-même plutôt que de bêtement reprendre ce que je pourrais te donner sans chercher à comprendre ! Smiley cligne

C'est vraiment curieux que ça ne fonctionne pas. Tu as même réussi à me faire douter. Smiley lol
Je viens de tester chez moi, et la redirection marche très bien avec le header que je t'ai donné.
On est bien d'accord que la page dans laquelle tu fais tout ça c'est index.php, qui se trouve à la racine de ton site ? Et tu testes ça chez quel hébergeur ?
Modifié par phpdoesnotcare (29 Apr 2010 - 12:30)
Ben écoute, j'ai refait carrément une page, mais ça roule tjs pas...


<?php

header('location: http://127.0.0.1:8888/supersite/nl/index.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Document sans titre</title>
</head>

<body>
test
</body>
</html>

Pourtant, quand je copie colle juste l'adresse dans mon navig, là ça roule....

la console:
[29-Apr-2010 13:04:15] PHP Warning: Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/supersite/index.php:3) in /Applications/MAMP/htdocs/supersite/index.php on line 5
Modifié par FranZz (29 Apr 2010 - 13:08)
c'est bon, ça roule! ça se redirige comme il faut!

avec <?php header('location: fr/index.php');?>

Je crois que j'avais commencé le code à la deuxième ligne...
Pages :