Aller au contenu

[RESOLU] [PHP] site multilangue


Magg

Messages recommandés

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.

Lien vers le commentaire
Partager sur d’autres sites

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 :francais: )

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 :p

Lien vers le commentaire
Partager sur d’autres sites

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 ')'

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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. :oops:

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 :top:

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 :love:

Lien vers le commentaire
Partager sur d’autres sites

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']. :top:

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 :love:

Lien vers le commentaire
Partager sur d’autres sites

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. :)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...