Magg Posted September 3, 2008 Share Posted September 3, 2008 Bonjour, Je souhaite faire un site français/anglais, j'ai donc suivi le tutorial suivant pour faire cela en php : PHP débutant Je pense qu'il y a un problème avec le cookie : 1 <?php 2 3 if(isset($HTTP_COOKIE_VARS['lang'])) { 4 $lang = $HTTP_COOKIE_VARS['lang']; 5 } else { 6 // si aucune langue n'est déclarée on tente de reconnaitre la langue par défaut du navigateur 7 $lang = substr($HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE'],0,2); 8 } 9 10 //script d'origine 11 if ($lang=='fr') { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php 12 include('lang/fr-lang.php'); 13 } elseif ($lang=='en') { // si la langue est 'en' (anglais) on inclut le fichier en-lang.php 14 include('lang/en-lang.php'); 15 } 16 //fin du script d'origine 17 18 //définition de la durée du cookie (1 an) 19 $expire = 365*24*3600; 20 21 //enregistrement du cookie au nom de lang 22 setcookie("lang", $lang, time() + $expire); 23 24 ?> Les parties qui doivent être traduites ne s'affichent pas, mais à la place j'ai le code php que j'ai tapé dans la partie html. J'ai essayé de le remplacer par le code de base sans cookie donné dans le tutorial : 1 <?php 2 3 if ($_GET['lang']=='fr') { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php 4 include('lang/fr-lang.php'); 5 } 6 7 else if ($_GET['lang']=='en') { // si la langue est 'en' (anglais) on inclut le fichier en-lang.php 8 include('lang/en-lang.php'); 9 } 10 11 else { // si aucune langue n'est déclarée on inclut le fichier fr-lang.php par défaut 12 include('lang/fr-lang.php'); 13 } 14 15 ?> Cela fonctionne très bien, mais quand j'arrive sur la page d'acceuil traduite en anglais et que je clique sur un lien, la page suivante s'ouvre en français et non en anglais. J'ai bien vérifié mon code html et je ne vois pas de problèmes. Je suis juste débutante en php, et je vous remercie d'avance de m'aider à trouver une solution. Link to comment Share on other sites More sharing options...
nemesis93_75 Posted September 3, 2008 Share Posted September 3, 2008 Les parties qui doivent être traduites ne s'affichent pas, mais à la place j'ai le code php que j'ai tapé dans la partie html. Salut, soit j'ai pas trop compris, soit je suis con... enfin bref, tu arrive à afficher tes variables PHP? si non, verifie bien que ton fichier 'html' est en .php (bah oui pour que les <?php echo "balala" ?> passe faut que le fichier soit en php ) pour tester ton 'setcookie', si il reussi, il renvoie un TRUE donc tu remplace : //enregistrement du cookie au nom de lang setcookie("lang", $lang, time() + $expire); par : //enregistrement du cookie au nom de lang if (setcookie("lang", $lang, time() + $expire) != TRUE) { echo 'Le cookie n'a pas marché<br />'; } Comme ça si ton setcookie foire tu le vois Link to comment Share on other sites More sharing options...
Magg Posted September 3, 2008 Author Share Posted September 3, 2008 Mes variables en php ne s'affichent pas quand j'utilise le code avec le cookie, par contre quand j'utilise le code sans le cookie elles s'affichent très bien. J'ai essayé de remplacer le morceau de code par celui que tu m'as donné, mais il m'affiche une page d'erreur : Parse error: syntax error, unexpected ')' Link to comment Share on other sites More sharing options...
BreizFenrir Posted September 3, 2008 Share Posted September 3, 2008 La variable $_GET permet d'accéder aux paramètres fournis dans l'URL de la page, or les valeurs stockées dans un cookie ne sont pas fournies de cette façon. Pour récupérer ces dernières, il faut utiliser $_COOKIE. À noter que cette variable a remplacé $HTTP_COOKIE_VARS avec la version 4.1 de PHP. Il serait je pense sage de ne plus utiliser les variables en "$HTTP_" désormais, et d'utiliser les variables superglobales. Link to comment Share on other sites More sharing options...
Magg Posted September 3, 2008 Author Share Posted September 3, 2008 La variable $_GET permet d'accéder aux paramètres fournis dans l'URL de la page, or les valeurs stockées dans un cookie ne sont pas fournies de cette façon. Pour récupérer ces dernières, il faut utiliser $_COOKIE.À noter que cette variable a remplacé $HTTP_COOKIE_VARS avec la version 4.1 de PHP. Il serait je pense sage de ne plus utiliser les variables en "$HTTP_" désormais, et d'utiliser les variables superglobales. Merci beaucoup pour la précision, pour l'instant j'ai fait ceci : <?php if (isset($_COOKIE['langue'])) { if ($_COOKIE == 'fr') { include("lang/fr-lang.php"); } } if (isset($_COOKIE['langue'])) { if ($_COOKIE == 'en') { include("lang/en-lang.php"); } } else{ include("lang/en-lang.php"); } ?> Les variables s'affichent mais seulement en français, pas de traduction en anglais. Pour appeller le php j'ai ceci : <?php require("lang/decide-lang.php"); ?> Et voilà un fichier de langue : <?php define('TXT_ACCUEIL_INDEX', 'Welcome !'); define('TXT_HEADER', 'blabla1 !'); define('TXT_FOOTER', 'blabla2 !'); define('TXT_PAGE1', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nunc at ante. Morbi pede. Integer fringilla justo. Integer nunc. Mauris erat lectus, tristique in, venenatis eget, cursus eu, nulla. Fusce et dui et lorem tempus pharetra. Nunc accumsan massa et risus. Fusce eget est. Integer elementum tortor vitae nibh.'); define('TXT_PAGE2', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nunc at ante. Morbi pede. Integer fringilla justo. Integer nunc. Mauris erat lectus, tristique in, venenatis eget, cursus eu, nulla. Fusce et dui et lorem tempus pharetra. Nunc accumsan massa et risus. Fusce eget est. Integer elementum tortor vitae nibh.'); ?> Je continue à chercher. Link to comment Share on other sites More sharing options...
nemesis93_75 Posted September 3, 2008 Share Posted September 3, 2008 comment tu fais pour vouloir les afficher en anglais? Link to comment Share on other sites More sharing options...
Magg Posted September 3, 2008 Author Share Posted September 3, 2008 comment tu fais pour vouloir les afficher en anglais? C'est aussi la question que je me pose...! Si tu fais référence au fichier de langue, j'en ai bien deux, un en français et un en anglais, j'en ai mis un seul avec un texte abstrait juste pour l'exemple. EDIT : nouvel essai <?php isset($_GET['lang'])? setcookie("lang",$lang,time()+ 365*24*3600, $_GET['lang']) : '';//definition de la duree du cookie=1an $lang = isset($_COOKIE['lang'])? $_COOKIE['lang'] : 'fr'; $lang = isset($_GET['lang'])? $_GET['lang'] : $lang; switch ($_GET['lang']) { case 'it': include('lang/fr-lang.php'); break; case 'en': include('lang/en-lang.php'); break; } ?> J'ai rajouté ça dans l'appel du php: <?php require("lang/decide-lang.php"); $lang = $_COOKIE['lang']; if (isset($lang)) { include 'language/'. $lang .'.inc.php'; } else { include 'lang/fr-lang.php'; } ?> Cela fonctionne, sauf que le cookie ne s'enregistre pas, la première page est bien traduite, mais dès qu'on clique sur un lien de cette page, la suivante est de nouveau en français. Quelqu'un aurait-il une piste pour que le cookie s'enregistre? Merci d'avance. Link to comment Share on other sites More sharing options...
nemesis93_75 Posted September 4, 2008 Share Posted September 4, 2008 comme je t'ai dit fais un test sur ton setcookie pour voir si il s'enregistre (il renvoi TRUE si il est bien fait ton cookie) si tu veux voir (pour tester) ton texte en anglais, tu peux juste include le fichier de langue anglaise Link to comment Share on other sites More sharing options...
Magg Posted September 4, 2008 Author Share Posted September 4, 2008 comme je t'ai dit fais un test sur ton setcookie pour voir si il s'enregistre (il renvoi TRUE si il est bien fait ton cookie)si tu veux voir (pour tester) ton texte en anglais, tu peux juste include le fichier de langue anglaise Non ça n'a rien à voir. J'étais pas si loin j'ai fini par trouver : <?php $lang = (isset($_GET['lang'])) ? $_GET['lang'] : $_COOKIE['lang']; if ($lang) { $expire = 365*24*3600; setcookie("lang", $lang, time() + $expire,'/'); $_COOKIE['lang'] = $lang; echo 'cookie ecrit'.$_COOKIE['lang']; } switch($lang) { case 'fr': default: include('lang/fr-lang.php'); break; case 'en': include('lang/en-lang.php'); break; } ?> Merci pour votre aide Link to comment Share on other sites More sharing options...
BreizFenrir Posted September 4, 2008 Share Posted September 4, 2008 Dans ton appel à setcookie(), tu utilises $lang, qui n'est pas initialisé à cet endroit du code. Simple oubli de changement de ce paramètre en $_GET['lang']. De plus, ton quatrième paramètre limite la portée du cookie à une sous-section du site qui je pense n'existe pas. En tout cas même si ton code est très propre, m'est avis qu'il est encore optimisable. Ton premier extrait de code a pas mal de redondances. Le mieux c'est de "centraliser" la détection de langue dans le cookie (pour le moment, car utiliser le mécanisme de sessions permettrais d'avoir quelque chose d'à moitié fonctionnel, mais fonctionnel tout de même, chez les personnes qui ont les cookies désactivés), puis de ne tester que $_COOKIE tout du long. La chose c'est que lors d'une modification avec setcookie(), le contenu de $_COOKIE n'est pas changé (ce qui est tout à fait normal même s'il faut y penser), il faut donc le faire manuellement. À la lumière de ces éléments, et en tenant compte de la remarque de nemesis93_75, ton premier extrait de code devient : <?php if (isset($_GET['lang'])) { setcookie("lang", $_GET['lang'], time() + 31536000) or die('Echec de création du cookie'); // Va arrêter l'exécution du code, pas forcément souhaitable $_COOKIE['lang'] = $_GET['lang']; } switch ($_COOKIE['lang']) { case 'en': include 'lang/en-lang.php'; break; default: include 'lang/fr-lang.php'; // Langue par défaut } ?> Et le second extrait : <?php require 'lang/decide-lang.php'; if (!(isset($_COOKIE['lang'])) || (include 'language/'. $lang .'.inc.php') != 'OK') { include 'lang/fr-lang.php'; // Langue par défaut et fallback si langue demandée inexistante } ?> Par contre est-ce normal que dans l'include que j'ai mis dans la condition, le fichier soit de la forme LANG.inc.php, et que ça ne soit pas le cas pour le français à l'intérieur du if ? Indique-nous si ça fonctionne. Après jette un coup d'oeil à $_SESSION (qu'il faudrait utiliser en lieu et place de $_COOKIE dans le code, une fois les paramètres de langue détectés) et modifie ton code pour l'utiliser. Une dernière chose : en règle générale, le navigateur envoie avec sa requête une liste de langues par ordre de préférence. Il pourrait être malin d'utiliser cela en plus du reste. Par ordre de priorité, au final, il faudrait utiliser : paramètre GET, session, préférence navigateur, langue par défaut. Bonne continuation. Edit: GRILLED Link to comment Share on other sites More sharing options...
nonothehobbit Posted September 8, 2008 Share Posted September 8, 2008 Si je peux me permettre, pour la gestion des langues, l'idéal reste quand même l'utilisation de l'extension gettext. http://fr.php.net/gettext En gros au lieu de t'embêter avec des define à tout va, t'écris ton code normalement en utilisant la fonction "_()" à chaque fois que tu insère une chaîne de caractère. Ex : <?php echo _('Hello world'); ?> Ensuite, avec un simple programme (xgettext), un fichier de langue recensant toutes les chaînes de caractère à traduire sera créé. Il suffira de copier ce fichier en changeant le nom pour qu'il corresponde à la locale souhaité (de_DE, en_US, etc) et traduire les chaîne dans le fichier. Le script php fera automatiquement la traduction en fonction de la locale du script (modifiable avec setlocale). La c'était la version courte. Un petit tuto ici : http://blog.sweetpeople.org/utiliser-gettext-avec-php, d'autres sur google. :) Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.