Problème de traduction du site en plusieurs langues php

Utilisateur anonyme - Modifié par dinolam le 17/07/2016 à 23:16
 Utilisateur anonyme - 18 juil. 2016 à 17:38
Bonjour,
Je suis entrain de traduire mon site. J'aimerai quand je clique sur une langue de traduire le contenu du champ que je récupère en fonction de la langue choisie . Ce contenu est récupéré dynamiquement dans la base de données. J'ai un champ pour chaque langue par exemple : description_produit_fr, description_produit_gb, description_produit_es.

Mon problème est que le contenu que je récupère en base de données ne change quand je change de langue.

Ci-dessous mon code :

    $langues = array("FR", "GB", "ES");

    foreach ($langues as $langue) {
        if (isset($_SESSION['langue']) && !empty($_GET['page'])) {
            if (in_array($_GET['page'], $langues)) {
                $_SESSION['langue'] = $_GET['page'];
                $langue = $_SESSION['langue'];
            } else if (in_array($_SESSION['langue'], $langues)) {
                $langue = $_SESSION['langue'];
            } else {
                $langue = "FR";
            }
        }
    }

// Requete
$sql = " SELECT produit_id,  produit_description_{$langue} FROM produit ORDER BY date DESC ";
$req = $db->prepare($sql);
$req->execute() or die(print_r($db->errorInfo()));
$data = $req->fetch(PDO::FETCH_ASSOC);


<!-- Liens navigations pour changer de langues -->
<div class="nav-lang">
                    <?php if (!isset($_SESSION['langue'])) { ?>
                        <div class="div-lg"><a class="lang" href="siteAccueil.php?lg=GB<?php if (!empty($_GET['page'])) { echo '&page='.$_GET['page']; } ?>">GB</a></div>
                        <div class="div-lg"><a class="lang" href="siteAccueil.php?lg=ES<?php if (!empty($_GET['page'])) { echo '&page='.$_GET['page']; } ?>">ES</a></div>
                    <?php } else {
                        if ($_SESSION['langue'] == 1) { ?>
                            <div class="div-lg"><a class="lang" href="siteAccueil.php?lg=GB<?php if (!empty($_GET['page'])) { echo '&page=' . $_GET['page']; } ?>">GB</a></div>
                            <div class="div-lg"><a class="lang" href="siteAccueil.php?lg=ES<?php if (!empty($_GET['page'])) { echo '&page=' . $_GET['page']; } ?>">ES</a></div>
                        <?php } else if ($_SESSION['langue'] == 2) { ?>
                            <div class="div-lg"><a class="lang" href="siteAccueil.php?lg=FR<?php if (!empty($_GET['page'])) { echo '&page=' . $_GET['page']; } ?>">FR</a></div>
                            <div class="div-lg"><a class="lang" href="siteAccueil.php?lg=ES<?php if (!empty($_GET['page'])) { echo '&page=' . $_GET['page']; } ?>">ES</a></div>
                        <?php } else { ?>
                            <div class="div-lg"><a class="lang" href="siteAccueil.php?lg=FR<?php if (!empty($_GET['page'])) { echo '&page=' . $_GET['page']; } ?>">FR</a></div>
                            <div class="div-lg"><a class="lang" href="siteAccueil.php?lg=GB<?php if (!empty($_GET['page'])) { echo '&page=' . $_GET['page']; } ?>">GB</a></div>
                        <?php }
                    } ?>
</div>
<!-- Affichage de la description d'un produit récupérée en bd -->
<div class="content">
        <div class="row"><?=$data['produit_description_'.$langue];?></div>
</div>


Mon souci ce que je n'arrive pas à traduire les contenus qui sont récupérés en base de données. Quelqu'un peut m'aider.

Merci par avance !

6 réponses

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
18 juil. 2016 à 13:53
Salut,

euh ... ton get de langue est lg et tu ne fais aucuns tests dessus :<code>$_GET['lg']</codes> est inexistant, de même, <code>$_SESSION['langue']</codes> n'est pas rtenseigné dans ton code.

naga
0
Utilisateur anonyme
18 juil. 2016 à 14:11
Bonjour,

Oui en effet, j'ai crée une class site dans laquelle j'ai initialisé mon $_GET['lg'] et $_SESSION['langue']. Voici le code :


// Site.php
class Site
{
public function __construct()
{
//session_start();
$this->SessionLangue();
}
public function SessionLangue()
{
if(!empty($_GET['lg'])){
if ($_GET['lg']=="FR"){
$_SESSION['langue'] = 1;
}
elseif ($_GET['lg'] == "GB"){
$_SESSION['langue'] = 2;
}
elseif ($_GET['lg'] == "ES")
{
$_SESSION['langue'] = 3;
}
else
{
$_SESSION['langue'] = 1;
}
}
}
public function Langue($FR, $GB, $ES)
{
if(!empty($_SESSION['langue'])){

if ($_SESSION['langue'] == 2)
{
echo $GB;
}
elseif ($_SESSION['langue'] == 3)
{
echo $ES;
}
else
{
echo $FR;
}
}
else{
echo $FR;
}
}
}


Et après j'inclus ma classe et j'instancie mon objet.
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
Modifié par nagaD.scar le 18/07/2016 à 14:30
Ok c'est un peu plus claire ^^

Bon le code est redondant : pourquoi passer par des entier si en base c'est de toutes facons explicite => autant stocker directe "EN" ou "GB" ou "FR" dans la session et l'utiliser directement en valeur pour tes requêtes (en mettant la valeur par défaut).

Bref sinon vu le code fournit, ca semble simplement être:


        <div class="row"><? =$data['produit_description_'.$langue];?></div>



qui est mal écrit, essaye avec:


        <div class="row"><? echo $data['produit_description_'.$langue];?></div>



naga
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
18 juil. 2016 à 14:35
Juste par rapport au premier point, si tu fais:

<div class="nav-lang">
	<?php 
		if (isset($_GET['lg'])) { $_SESSION['langue']= $_GET['lg'];}
		if (!isset($_SESSION['langue'])) {$_SESSION['langue']="FR";} // on met une valeur par défault pour pas être embeté. 		
	?>
	<div class="div-lg"><a class="lang" href="siteAccueil.php?lg=FR<?php if (!empty($_GET['page'])) { echo '&page='.$_GET['page']; } ?>" <?php if ($_SESSION['langue']=="FR")) { echo 'style="visibility: hidden;"' ; } ?> >FR</a></div>
	<div class="div-lg"><a class="lang" href="siteAccueil.php?lg=GB<?php if (!empty($_GET['page'])) { echo '&page='.$_GET['page']; } ?>" <?php if ($_SESSION['langue']=="GB")) { echo 'style="visibility: hidden;"' ; } ?> >GB</a></div>
	<div class="div-lg"><a class="lang" href="siteAccueil.php?lg=ES<?php if (!empty($_GET['page'])) { echo '&page='.$_GET['page']; } ?>" <?php if ($_SESSION['langue']=="ES")) { echo 'style="visibility: hidden;"' ; } ?> >ES</a></div>

</div>
<!-- Affichage de la description d'un produit récupérée en bd -->
<div class="content">
        <div class="row"><? echo $data['produit_description_'.isset($_SESSION['langue']];?></div>
</div>


c'est je trouve plus lisible et plus facilement maintenable. après c'est juste une info ;)

naga
0
Re,

Merci @nagaD.scar pour ces explications.
Le code marche très bien pour les éléments que je récupère dynamiquement. Mais les éléments qui sont en dur ne sont pas traduits. A l'image de cet exemple :


<?php
// Gestion des langues
require_once('inc/php/Site.php');

$Site = new Site();
?>

<div class="row">
<a href="#" rel="nofollow" target="_blank"><?php $Site->Langue('Envoyer', 'Send', 'Enviar'); ?></a>
</div>
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
18 juil. 2016 à 16:15
Ok, du coup essaye dans un premier temps d'ajouter des petits debug histoire de comprendre ce qu'il se passe:

public function Langue($FR, $GB, $ES)
		{
			if(!empty($_SESSION['langue'])){
				echo 'session contains: ' . $_SESSION['langue']; 
				if ($_SESSION['langue'] == 2)
				{
					echo $GB;
				}
				elseif ($_SESSION['langue'] == 3)
				{
					echo $ES;
				}
				else
				{
					echo $FR;
				}
			}
			else{
				echo 'session langue is empty : default value send'; 
				echo $FR;
			}
		}


car en l etat il n y a rien de particulier, mais il n y a pas le code complet je suppose, et je ne connais pas la structure des répertoires mais si tu n as pas d erreur je suppose que l include fonctionne bien.


PS: pour ma part, en test simple, j ai seulement la page:

<?php 


	class Site
	{
		public function __construct()
		{
			//session_start();
			$this->SessionLangue();
		}
		public function SessionLangue()
		{
			if(!empty($_GET['lg'])){
				if ($_GET['lg']=="FR"){
					$_SESSION['langue'] = 1;
				}
				elseif ($_GET['lg'] == "GB"){
					$_SESSION['langue'] = 2;
				}
				elseif ($_GET['lg'] == "ES")
				{
					$_SESSION['langue'] = 3;
				}
				else
				{
					$_SESSION['langue'] = 1;
				}
			}
		}
		public function Langue($FR, $GB, $ES)
		{
			if(!empty($_SESSION['langue'])){
				echo 'session contains: ' . $_SESSION['langue']; 

				if ($_SESSION['langue'] == 2)
				{
					echo $GB;
				}
				elseif ($_SESSION['langue'] == 3)
				{
					echo $ES;
				}
				else
				{
					echo $FR;
				}
			}
			else{
				echo 'session langue is empty : default value send'; 
				echo $FR;
			}
		}
     }

		
    $Site = new Site();
	$Site->Langue('Envoyer', 'Send', 'Enviar');	

?>



et ca fonctionne
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
Modifié par nagaD.scar le 18/07/2016 à 16:25
Bon j avoues aussi que

foreach ($langues as $langue) {
        if (isset($_SESSION['langue']) && !empty($_GET['page'])) {
            if (in_array($_GET['page'], $langues)) {
                $_SESSION['langue'] = $_GET['page'];
                $langue = $_SESSION['langue'];
            } else if (in_array($_SESSION['langue'], $langues)) {
                $langue = $_SESSION['langue'];
            } else {
                $langue = "FR";
            }
        }
    }


je ne comprends pas trop ce que tu as voulu faire ..
 $_SESSION['langue'] = $_GET['page'];
?
$langue = $_SESSION['langue']; 
? -> $langue est definit pour le parcours de $langues _:

du coup ca sera toujours egal à la derniere occurrence de $langues, donc ES si $_SESSION est set (mais je vois pas de session start), et si c est pas set, toujours FR. .. c'est peu être le soucis d ailleurs mais j ai pas assez d infos ^^
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
18 juil. 2016 à 16:29
oh et dans la classe aussi :

 

			if(!empty($_GET['lg'])){
				if ($_GET['lg']=="FR"){
					$_SESSION['langue'] = 1;
				}
				elseif ($_GET['lg'] == "GB"){
					$_SESSION['langue'] = 2;
				}
				elseif ($_GET['lg'] == "ES")
				{
					$_SESSION['langue'] = 3;
				}
				else
				{
					$_SESSION['langue'] = 1;
				}
			}


il y a un soucis d accolade, si il n y a pas de get il n y a pas de valeur par défaut:


			if(!empty($_GET['lg'])){
				if ($_GET['lg']=="FR"){
					$_SESSION['langue'] = 1;
				}
				elseif ($_GET['lg'] == "GB"){
					$_SESSION['langue'] = 2;
				}
				elseif ($_GET['lg'] == "ES")
				{
					$_SESSION['langue'] = 3;
				}
				else
				{
					$_SESSION['langue'] = 1;
				}
			}
			else
			{
				$_SESSION['langue'] = 1;
			}

0
Utilisateur anonyme
18 juil. 2016 à 16:26
Chez moi ça fonctionne mais le contenu en dur n'est pas traduit.

Il y a juste ce code que j'ai modifié:


$langues = array("FR", "GB", "ES");

if (isset($_GET['lg']) && in_array($_GET['lg'], $langues)) {
$_SESSION['langue'] = $_GET['lg'];
}
if (!isset($_SESSION['langue'])){
$_SESSION['langue'] = 'FR';
}
$langue = $_SESSION['langue'];
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
18 juil. 2016 à 16:45
Je vais reprendre un peu pour être claire, j ai tendance à poster idée par idée donc c'est pas top.

Donc dans le premier point: ta classe. En l'état, dans tous les cas lors de l initialisation le
$_SESSION['langue']
est écrasé soit en fonction du get s'il existe, sinon par 1 (FR). Du coup pas besoin de s'embêter avec ca. Par contre il serai plus sympas d'avoir la classe qui contiendrai les info voulu. Donc on va utiliser la classe de cette maniere (avec une intro au switch ;]):

	class Site
	{
		var $langID;
		var $langCH;
		public function __construct()
		{
			$this->SessionLangue();
		}
		public function SessionLangue()
		{
			$this->langCH = (!empty($_GET['lg']) ? $_GET['lg'] : 'FR');
			switch ($this->langCH) {
			    case "FR":
					$this->langID=1;
			        break;
			    case "EN":
					$this->langID=2;
			        break;
			    case "ES":
					$this->langID=3;
			        break;
			}
		}
		public function Langue($FR, $GB, $ES)
		{
			switch ($this->langID) {
			    case 1:
					echo $FR;
			        break;
			    case 2:
					echo $GB;
			        break;
			    case 3:
					echo $ES;
			        break;
			}
		}
    }


(il y aura ensuite un interêt à conserver l instance dans la session mais on en parlera pas ici).

Avec ces deux var, le code s en retrouve simplifié d une part, mais te permettra de faire, pour reprendre le point de ta requête :

    $Site = new Site(); // ca doit être fait autre part mais c est pour que tu comprennes
// Requete
$sql = " SELECT produit_id,  produit_description_{$Site->langCH} FROM produit ORDER BY date DESC ";

echo $sql; //histoire que tu check que la requete est bonne

$req = $db->prepare($sql);
$req->execute() or die(print_r($db->errorInfo()));
$data = $req->fetch(PDO::FETCH_ASSOC);


Ensuite le reste (
 $Site->Langue('Envoyer', 'Send', 'Enviar');   
) ne devrait pas poser de probleme.

dis moi.

naga
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
18 juil. 2016 à 16:48
Oh oui il faut peu être que tu sache :
$variable = ( $a > $b ? $a :$b);


fera la même chose que :

$variable; 
if($a > $b){
    $variable=$a;
}
else {
    $variable=$b;
}

0
Utilisateur anonyme
18 juil. 2016 à 17:32
C'est génial, ça marche !
Merci beaucoup @nagaD.scar pour ton aide.

A bientôt !
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
18 juil. 2016 à 17:36
Pas de soucis, bon dev ;)

naga
0
Utilisateur anonyme > nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023
18 juil. 2016 à 17:38
Merci encore !
0
Rejoignez-nous