Site Multilangue

Petit nouveau ! | 5 Messages

09 janv. 2008, 08:38

Bonjour,

J'ai développé un site multi-langue (je débute..) mais je rencontre un probleme lors du changement de page le site repasse en langue par défaut (FR)

Ci dessous le fichier setlang.php qui est ensuite "require" dans chaque pages afin de "loader" le texte avec le bon language. Ensuite chaque page utilise un "echo" pour afficher le contenu.
<?php
$lang="fr";
if(isset($_GET['lang'])){$lang = $_GET['lang'];}
        if (($lang != "fr") && ($lang != "en")){
                $lang ="fr";}
                
if(isset($lang)){
      include ("lang/$lang-lang.php");
}
//else{include 'lang/fr-lang.php';}
?>

Enfin afin de changer de langue voici le code:

<a href="<?php if ($lang == "FR")  {echo $url_stem . "?lang=EN"; ?

>">ENGLISH<?php } else { echo $url_stem;  ?>FRANCAIS<?php } ?></a>
Le probleme est que le changement de page ne conserve pas le changement de langue.

Merci de votre aide.

Redouane

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 janv. 2008, 08:49

Modération :
redouane, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 3300 Messages

09 janv. 2008, 09:01

il te faut gérer le tout en session

jetes un oeil sur la page d'aide qui parle de session_start(); et utilise la variable $_SESSION pour y accéder en lecture comme en écriture.
Fait du php depuis que ca existe ou presque :)

ViPHP
AB
ViPHP | 5818 Messages

09 janv. 2008, 16:54

Sinon, si tu ne veux pas passer par les sessions il faut que tous tes liens vers les différentes pages renvoient la variable lang.

Code : Tout sélectionner

<a href="page2.php?lang=<?php echo $lang ?>">lien vers page 2</a>

Petit nouveau ! | 5 Messages

10 janv. 2008, 00:55

Hello,

je ne suis pas très chaud avec la gestion de session. L'indexation par google ensuite renvoi plusieurs lien sur la meme page avec un numéro de cookie different.

Je vais tester ta solution AB.

Sinon Zeus, j'avais pas vu l'utilisation de balises pour le code.

Merci

Redouane

ViPHP
ViPHP | 3300 Messages

10 janv. 2008, 01:37

au contraire la version avec session est la plus propre à mon sens et évite beacoup de travail sur les liens de ton site (et de possibles brêches de sécurité).
Fait du php depuis que ca existe ou presque :)

ViPHP
AB
ViPHP | 5818 Messages

10 janv. 2008, 05:19

au contraire la version avec session est la plus propre à mon sens et évite beacoup de travail sur les liens de ton site (et de possibles brêches de sécurité).
Pour la sécurité, je ne comprend pas vraiment comment, passer une variable dans l'URL, variable qui ne sera ni affichée ni utilisée dans une bdd, pourrait induire des problèmes de sécurité, d'autant que cette variable ne servira qu'au choix de la langue :?:

C'est vrai que c'est plus long à mettre en place, mais il suffit de faire une recherche sur les <a href=... et de les compléter soit manuellement, soit automatiquement avec la variable à passer. Bien sûr si on a des headers en php, faudra également ne pas oublier de les compléter également. Mais avec l'aide sur les recherches - remplacements des éditeurs de texte cela peut se faire assez vite à moins que ce ne soit un méga site.
Et c'est d'autant plus facile qu'on y pense dès le début de la réalisation du site.

Par ailleurs, je ne sais pas si cela vaut la peine de déclencher une session juste pour une variable qui n'a pas besoin d'être sécurisée :-k
Je me souviens d'un message d'Hubert qui disait qu'il valait mieux s'en passer si on pouvait l'éviter. Cela fait bosser plus le serveur...


@redouane
Si par la même occasion tu voulais faire afficher au départ, la langue par défaut du navigateur du client, tu peux remplacer tes quatre premières ligne de code par
//Cherche la langue native du navigateur et met l'anglais s'il n'a pas trouvé 'français'
$lang_nav = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
$lang_nav = strtolower(substr(rtrim($lang_nav[0]),0,2));
$lang = ($lang_nav == 'fr')? 'fr' : 'en'; 

//Affecte la valeur du choix du visiteur $_GET['lang'] à $lang sinon reste à la valeur de dessus (celle du navigateur)
$lang = (isset($_GET['lang']) && ($_GET['lang'] == 'fr' || $_GET['lang'] == 'en'))? $_GET['lang'] : $lang;
En complément tu pourrais même stocker le choix du visiteur dans un cookie. Si son navigateur accepte les cookie le client retrouverait son choix à chaque visite. Cela dit, le choix d'une autre langue par le visiteur devrait être peu fréquent puisque dès l'affichage le langage choisi est celui de la langue du navigateur.
Modifié en dernier par AB le 10 janv. 2008, 20:19, modifié 1 fois.

ViPHP
ViPHP | 3300 Messages

10 janv. 2008, 06:23

au contraire la version avec session est la plus propre à mon sens et évite beacoup de travail sur les liens de ton site (et de possibles brêches de sécurité).
Pour la sécurité, je ne comprend pas vraiment comment, passer une variable dans l'URL, variable qui ne sera ni affichée ni utilisée dans une bdd, pourrait induire des problèmes de sécurité, d'autant que cette variable ne servira qu'au choix de la langue :?:
j'ai pas en tête un exemple concret mais je vois d'ici les $_GET['lang'] utilisé tel quel dans le code et bindé à un include ou un require doit y'avoir moyen de faire des cochoncetés tu crois pas? :)

l'argumentation sur la pertinence de la session est valide en soi mais quand on considère que par affichage de page on fait 1 accès au système de fichier ainsi qu'un unserialize je crois que c'est pas trop grave quand même surtout si on considère le confort et la sécurité que ça apporte.

La ou la session pose problème c'est quand on stocke trop de choses dedans comme un array gigantesque ou une structure d'objets imbriqués (et encore la je peut te dire que ca reste tout à fait décent)

Mais bon, pour revenir à son cas particulier je crois que la session est une solution parfaite.
Fait du php depuis que ca existe ou presque :)

Petit nouveau ! | 5 Messages

10 janv. 2008, 19:11

On sent qu'il y a vraiment deux ecoles la?!

Sinon comment gerer la session sans que le lien affiche
php?lang=en&PHPSESSID=8bea793de24737bb8fe61e44c595e673 
?

Concernant la langue du browser, j'ai le cas de figure d'expatriés à l'etranger..mais bon c'est vraiment chercher des poux...

:P

Merci

Redouane

ViPHP
AB
ViPHP | 5818 Messages

10 janv. 2008, 20:46

On sent qu'il y a vraiment deux ecoles la?!

Sinon comment gerer la session sans que le lien affiche
php?lang=en&PHPSESSID=8bea793de24737bb8fe61e44c595e673 
?

Concernant la langue du browser, j'ai le cas de figure d'expatriés à l'etranger..mais bon c'est vraiment chercher des poux...

:P

Merci

Redouane
Et bien justement, c'est pour les expatriés à l'étranger par exemple que le choix de la langue par le visiteur sera utile sinon le navigateur affichera d'office la bonne langue.

Pour que l'identifiant de session ne se mette pas automatiquement dans tous tes liens il faut mettre

Code : Tout sélectionner

php_flag session.use_trans_sid off

dans un fichier .htacess placé à la racine de ton répertoire. Cela n'est utile que si cette configuration du serveur est sur on, evidemment

Ensuite normalement les serveurs sont configurés pour faire passer les identifiants de session de préférence dans un cookie si le navigateur du visiteur les accepte sinon il passera dans l'url. Peu de visiteurs devrait donc voir l'identifiant de session dans l'url.

Par contre pour les robots j'ai pas cherché la solution et je ne sais pas si elle existe. Peut-être l'urlrewriting (sous réserve car jamais utilisé) mais ça va te faire du boulot, sans doute plus que de passer une petite variable dans tes liens. Mais cela te gêne tant que ça cet identifiant dans l'url? Cela n'affecte pas les liens normalement.

EDIT Sinon concernant la solution de la langue passée par GET, niveau sécurité tu ne risques absolument rien tant que tu utilises $lang dans tes echo puisque cette variable contrôle $_GET['lang'] sans équivoque : il est strictement impossible de pirater le résultat de $lang qui sera obligatoirement 'fr' ou 'en' dans les quatre lignes de code que j'ai donné plus haut.

Petit nouveau ! | 5 Messages

12 janv. 2008, 17:12

Ok ben j'ai finallement implementer la solution browser language detect qui me parait plus simple et plus clean.

Voila le resultat: www.lime-consulting.com

Merci a tous!

Redouane

ViPHP
AB
ViPHP | 5818 Messages

12 janv. 2008, 19:21

Bien clean et agréable ce site :wink:

Et je vois que tu as passé la variable de lang dans l'URL. Sur quelques pages tu as pu constater que ce n'est pas un gros travail :)

Te reste plus qu'à mettre ton sujet comme résolu :)

Petit nouveau ! | 5 Messages

13 janv. 2008, 19:09

yep!

;-)

Merci

Redouane