Problème de traduction du site en plusieurs langues php

- 17 juil. 2016 à 23:04 - Dernière réponse :  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 !
Afficher la suite 

Votre réponse

14 réponses

Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
- 18 juil. 2016 à 13:53
0
Merci
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
Commenter la réponse de nagaD.scar
- 18 juil. 2016 à 14:11
0
Merci
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.
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
- 18 juil. 2016 à 14:28
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
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
- 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
Commenter la réponse de Utilisateur anonyme
0
Merci
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>
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
- 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
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
- 18 juil. 2016 à 16:23
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 ^^
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
- 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;
			}

Commenter la réponse de Utilisateur anonyme
- 18 juil. 2016 à 16:26
0
Merci
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'];
Commenter la réponse de Utilisateur anonyme
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
- 18 juil. 2016 à 16:45
0
Merci
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
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
- 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;
}

Commenter la réponse de nagaD.scar
- 18 juil. 2016 à 17:32
0
Merci
C'est génial, ça marche !
Merci beaucoup @nagaD.scar pour ton aide.

A bientôt !
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
- 18 juil. 2016 à 17:36
Pas de soucis, bon dev ;)

naga
>
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
- 18 juil. 2016 à 17:38
Merci encore !
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.