Besoin d'aide pour conception d'un site multilingue
Utilisation de _SESSION
Discussions Générales
aiglobulles Membre non connecté
Booster Missile
-
Booster Missile
- Voir le profil du membre aiglobulles
- Inscrit le : 15/08/2008
- Groupes :
ma question ne concerne pas phpboost aussi je comprendrais que vous refusiez d'y répondre. J'ai d'abord posé cette question sur d'autres forums notamment dédiés à php, mais n'ayant pas eu de réponse, je me suis dit que la communauté phpboost pourrait pê m'aiguiller

Alors voilà, je suis en stage depuis un peu plus d'un mois et je dois refondre un site full html en un site plus actuel fonctionnant avec une base de données et qui soit multilingue.
Le site est composé de rubriques dont la table se présente ainsi:
Code PHP :
CREATE TABLE IF NOT EXISTS `rubriques` ( `id_rubrique` int(3) NOT NULL AUTO_INCREMENT, `img_rubrique` varchar(50) NOT NULL, `nom_rubrique_fr` varchar(50) NOT NULL, `ordre` int(1) NOT NULL, `desc_rubrique_fr` varchar(2500) NOT NULL, `nom_rubrique_al` varchar(50) NOT NULL, `desc_rubrique_al` varchar(2500) NOT NULL, `nom_rubrique_en` varchar(50) NOT NULL, `desc_rubrique_en` varchar(2500) NOT NULL, `rubrique_mere` int(3) DEFAULT NULL, PRIMARY KEY (`id_rubrique`), KEY `rubrique_mere` (`rubrique_mere`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;
j'ai donc des rubriques avec un identifiant unique pour chacune d'elle et pour chacune d'elle un titre et une description français, allemand et anglais.
Quand on arrive sur le site, le script détecte la langue du navigateur et lance les requêtes pour afficher les pages dans la langue de ce dernier. Si l'utilisateur clique sur l'un des drapeaux visible en haut de la page, celle-ci est alors censée être traduite dans la langue choisie.
mon code:
index.php:
Code PHP :
<?php session_start(); // ON FAIT UN INCLUDE DU FICHIER TBS include("TBS/tbs_class_php5.php"); // ON DEFINIT LES PARAMETRES DE CONNEXION $serveur = "localhost"; $utilisateur = "root"; $motpasse = ""; $base = "alsaceinfo"; // CONNEXION AU SERVEUR $connexion = mysql_connect( $serveur, $utilisateur, $motpasse) or die("Impossible de se conecter au SGBD"); // SELECTION DE LA BASE DE DONNEES mysql_select_db($base) or die ("Impossible de sélectionner la BDD"); // SPOUR COMMENCER ON VOIT SI LA LANGUE A ETE CHOISIE VIA LE SWITCHER if(isset($_GET['action'] )) { // SI ON A CLIQUE LE DRAPEAU FRANCAIS ON CHARGE LE TEMPLATE FRANCAIS switch($_GET['action']) { case "francais": include("home_fr.php"); break; // SI ON A CLIQUE SUR LE DRAPEAU ALLEMAND ON CHARGE LE TEMPLATE ALLEMAND case "allemand": include("home_de.php"); break; // SI ON A CLIQUE SUR LE DRAPEAU ANGLAIS..... TEMPLATE ANGLAIS case "anglais": include("home_en.php"); break; } } // ON CREE LA VARIABLE LANGUE QUI SERA FONCTION DE LA LANGUE DU NAVIGATEUR $Langue = explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']); $Langue = strtolower(substr(chop($Langue[0]),0,2)); // SI LA LANGUE DU NAVIGATEUR EST FR ON LANCE LE TEMPLATE FRANCAIS if ($Langue == "fr") { include("home_fr.php"); } // SINON SI LA LANGUE EST DE ON LANCE LE TEMPLATE ALLEMAND else if ($Langue == "de") { include("home_de.php"); } // DANS TOUS LES AUTRES CAS EXISTANTS ON LANCE LE TEMPLATE ANGLAIS else include("home_en.php"); ?>
home_fr.php (les versions allemandes et anglaises sont identiques avec les requêtes pour les langues concernées)
Code PHP :
<?php $_SESSION['lang'] = 'fr'; $tbs = new clsTinyButStrong; $tbs -> LoadTemplate("/pages/home.php"); $Accueil = "select id_rubrique, nom_rubrique_fr AS nom_rubrique from rubriques where id_rubrique = 1"; $Menu = "select id_rubrique, nom_rubrique_fr AS nom_rubrique, rubrique_mere from rubriques where rubrique_mere is null and id_rubrique not in (1,11) order by id_rubrique"; $Contact = "select id_rubrique, nom_rubrique_fr AS nom_rubrique from rubriques where id_rubrique = 11"; $tbs -> MergeBlock('BlkAccueil',$connexion, $Accueil); $tbs -> MergeBlock('BlkMenu',$connexion, $Menu); $tbs -> MergeBlock('BlkContact',$connexion, $Contact); $Anim = "select distinct date_animation, titre_anim_fr, lieu_animation from animations order by date_animation"; $tbs -> MergeBlock('BlkAnim',$connexion, $Anim); $EncVille = "select img1_ville, nom_ville, CONCAT(LEFT(villes.desc_ville_fr,10),'...') AS desc_ville_fr from villes order by rand()"; $resultat = mysql_query($EncVille) ; $tempo = mysql_fetch_assoc($resultat); $image = $tempo['img1_ville']; $ville = $tempo['nom_ville']; $desc = $tempo['desc_ville_fr']; $tbs -> Show(); ?>
enfin, la page d'affichage home.php
Code HTML :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <script> var imgs=new Array(); imgs[0]="photos/diapo600x400/001.jpg"; imgs[1]="photos/diapo600x400/002.jpg"; imgs[2]="photos/diapo600x400/003.jpg"; imgs[3]="photos/diapo600x400/004.jpg"; var cpt=0; function changeimages() { document.getElementById("ima").src=imgs[cpt]; cpt++; if(cpt>=imgs.length) cpt=0; setTimeout("changeimages()",5000); } </script> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <link href="pages/global.css" type="text/css" rel="stylesheet"> <link href="pages/home.css" type="text/css" rel="stylesheet"> <title>ALSACE-INFO.COM</title> </head> <body onLoad="changeimages()"> <div id="global"> <div id="switch"> <ul id="switch"> <li> <a href="http://localhost/alsace-info/index.php?action=francais"> <img src="images/design/francais.jpg" style="border:1px solid #ffffff;"> </a> </li> <li> <a href="http://localhost/alsace-info/index.php?action=allemand"> <img src="images/design/allemand.jpg" style="border:1px solid #ffffff;"> </a> </li> <li> <a href="http://localhost/alsace-info/index.php?action=anglais"> <img src="images/design/anglais.jpg" style="border:1px solid #ffffff;"> </a> </li> </ul> </div> <div id="diaporama"> <img id="ima" name="ima" src="" alt="" /> </div> <div id="header"> <div id="alsace-info"> <a href="http://www.alsace-info.com"> <img src="images/design/alsace-info.png" alt="Alsace-info - Toute l'info sur le tourisme en alsace" title="Alsace-info - Toute l'info sur le tourisme en alsace" width="220" height="127"> </a> </div> </div> <div id="contenu"> <div id="menu"> <ul id="menu"> <li> <a href="http://localhost/alsace-info" class="Menu"> [BlkAccueil.nom_rubrique] </li> <li> <a href="main2.php?action=search&num=[BlkMenu.id_rubrique;block=li]" class="menu">[BlkMenu.nom_rubrique]</a> </li> <li> <a href="http://localhost/alsace-info/contact.php?action=contact" class="Menu"> [BlkContact.nom_rubrique] </a> </li> </ul> </div> <div id="bloc_news"> <h3> Spectacles et Animations </h3> <ul id="news""> <li> <p id="anim">[BlkAnim.date_animation;block=li;chp;frm=mm/yyyy] - <strong>[BlkAnim.titre_anim_fr;block=li]</strong> </p> <p id="lieu"> [BlkAnim.lieu_animation] </p> </li> </ul> </div> <div id="encart_ville"> <div id="image_ville"> <img src="images/villes/[var.image;magnet=div]"> </div> <div id="desc_ville"> <h3>[var.ville]</h3> [var.desc] </div> </div> </div> <div id="footer"> <p class="footer"> ALSACE-INFO - TOUTE L'INFORMATION SUR LE TOURISME EN ALSACE </p> </div> </div> </body> </html>
Je suis complètement perdu et je ne sais pas comment utiliser la superglobale _SESSION pour que, dans le cas d'une langue sélectionnée, le site conserve cette langue et ne reviennent pas dans la langue du navigateur.
Sauriez vous m'indiquer comment déclarer et utiliser _SESSION ?
D'avance merci pour vos conseils
Bruno
Édité par aiglobulles Le 16/05/2011 à 11h55
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
aiglobulles Membre non connecté
Booster Missile
-
Booster Missile
- Voir le profil du membre aiglobulles
- Inscrit le : 15/08/2008
- Groupes :
RACINE
- index.php
--DOSSIER FR
---- home_fr.php
---- menu_fr.php
-- DOSSIER DE
---- home_de.php
---- menu_de.php
--DOSSIER EN
---- home_en.php
---- menu_en.php
-- DOSSIER TEMPLATES
---- DOSSIER DES CSS
---- home.html
---- ...
J'ai oublié de préciser que j'avais créer une table langue qui se compose ainsi:
| id_langue | libelle |
| 1 | fr |
| 2 | de |
| 3 | en |
En fait, ce que j'essaye de faire, c'est de créer une variable session du genre:
Code PHP :
$_SESSION['lang'] = 'id_langue';
que je pourrais ensuite utiliser de manière conditionnelle afin d'ordonner la langue à afficher. Par exemple, si l'utilisateur clique sur le lien accueil, j'aurai une requête du genre:
Si id_langue = 1 alors affiche moi le template fr/home_fr.php
et ensuite, dans mon code html il me faudrait donc pouvoir placer dans le menu, des liens du genre:
en récupérant l'id_langue je pourrais ainsi faire charger la page dans la langue voulut autre que celle définit par défaut par le navigateur.
J'espère avoir été à peu près clair, ça l'est dans ma tête mais ce n'est pas toujours facile à expliquer...
En tous cas merci d'y consacrer un petit peu de temps.
Édité par aiglobulles Le 16/05/2011 à 15h01
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
Tu place dans ton entête (je précise bien l'entête) :
Code PHP :
Code PHP :
Édité par ReidLos Le 16/05/2011 à 15h06
aiglobulles Membre non connecté
Booster Missile
-
Booster Missile
- Voir le profil du membre aiglobulles
- Inscrit le : 15/08/2008
- Groupes :
un grand merci pour ton aide. J'ai réussi à déclarer ma variable dans index.php, et la page d'accueil fonctionne.
Là ou le bas blesse, c'est que je n'arrive pas à utiliser cette variable. Initialement je pensais créer un fichier php par langue en utilisant des alias de manière à n'avoir qu'un seul fichier html à utiliser.
Par exemple, pour afficher le menu en français je faisais un truc du genre:
dans menu_fr.php
Code PHP :
$menu = "select id_rubrique, nom_rubrique_fr AS nom_rubrique from rubriques";
et dans mon code html/TBS (TinyButStrong)
Code HTML :
Ainsi, dans mon code html, comme j'utilise l'alias nom_rubrique, je peux utiliser ce modèle pour n'importe quelle langue... à partir du moment ou mes selects sont fait correctement dans les fichiers php qu'il convient.
Avec la variable session, l'idée serait de se faciliter encore plus la travail.
$_SESSION['lang'] = 'lang' retourne les valeurs fr, ou en, ou de.
Du coup, je pensais reprendre la variable session pour faire mon select dans un seul fichier menu.php. Par exemple:
Code PHP :
$menu = "select id_rubrique nom_rubrique_'".$_SESSION['lang']."' from rubriques
De tête mon code est faux, je me plante toujours dans la concaténation, mais en testant un simple echo sur mon $_SESSION, firefox me retourne bien "fr", mais cela ne fonctionne pas dans le cas de mon select.
TBS me retourne une erreur indiquant que TBS ne trouve pas la clef pour nom_frubrique_
il ne trouve pas la valeur de $_SESSION après l'underscore.
Du coup, pourrais tu m'indiquer la bonne "orthographe" ?
J'ai pourtant repris les exemples de concaténation qu'on a vu en cours et qui fonctionnent parfaitement dans le cadre des pages que nous avions crée, mais dans ce cas, précis, ça me plante tout...
Merci encore pour ton aide.
Bruno
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
Pour ta concaténation c'est bon. Mais c'est pas propre comme ça. Ta requête est bonne là?
Veux tu utiliser de l'OO?
Édité par ReidLos Le 16/05/2011 à 21h23
aiglobulles Membre non connecté
Booster Missile
-
Booster Missile
- Voir le profil du membre aiglobulles
- Inscrit le : 15/08/2008
- Groupes :
j'ai regardé mon code de plus près ce matin, et après une petite heure de tests, il s'avère que le soucis venait la concaténation de ma variable $_SESSION dans ma requête.
En effet, par exemple, j'écrivais:
Code PHP :
$titre_anim= "titre_anim_'".($_SESSION['lang'])."' AS titre_anim,"
du coup, le script retournais un $_SESSION['lang'] = 'fr' et forcément, il y avait erreur. La bonne "orthographe" est en fait
Code PHP :
$titre_anim= "titre_anim_".($_SESSION['lang'])." AS titre_anim,"
donc sans les simple quote.
Après quelques minutes de test, cela fonctionne parfaitement, donc si cela peut servir en guise de contribution pour proposer un phpboost multilingue, je peux laisser mes codes à disposition.
Encore merci pour ton aide

Ah, par contre pour la POO, ça me plairait en effet, mais on l'a à peine aborder en cours et je ne suis même pas foutu de créer une liste déroulante liée.. donc la POO ça viendra un peu plus tard

@bientôt ................. Bruno
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie