8768 sujets

Développement web côté serveur, CMS

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 !
Modérateur
Bonjour,


if (in_array($_GET['page'], $langues)) {
                $_SESSION['langue'] = $_GET['page'];
                $langue = $_SESSION['langue'];
            } 


=> $_GET['lg'] plutôt non?

Comme le code est là la langue ne change jamais
Modifié par kustolovic (18 Jul 2016 - 10:41)
Modérateur
Sinon le foreach ne sert à rien et est inutilement lourd. Tout ça peut être résolu de manière plus simple:

Pour la requête, même si la valeur de $langue est sécurisée, il faudrait tout de même faire un paramètre propre (car dans une modification ultérieure, rien ne te garantit que $langue sera toujours sécurisé).

Utiliser un alias permet de ne pas réutiliser le code de langue plus loin Smiley smile


$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'];

// Requete
$sql = 'SELECT produit_id, :desc_table as description  FROM produit ORDER BY date DESC';
$req = $db->prepare($sql);
$req->execute(array(':desc_table' => 'produit_description_'.$langue)) or die(print_r($db->errorInfo()));
$data = $req->fetch(PDO::FETCH_ASSOC);

print $data['description']; // traduit
Bonjour @kustolovic,

Merci d'avoir pris le temps de me répondre.
Ça marche très bien. Seulement, il y a un autre souci maintenant car les éléments qui sont affichés en dur ne sont pas traduits.


<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_'.$langue];?></div>
</div>


Voici un exemple de la façon dont je récupère mes éléments qui sont en dur :

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

    $Site = new Site();


<div class="row">
      <a href="#"><?php $Site->Langue('Envoyer', 'Send', 'Enviar'); ?></a>
</div>


Merci !
Modifié par dinolam (18 Jul 2016 - 15:58)
J'ai modifié ma class de cette façon et ça marche.


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;
			}
		}
    }


Merci beaucoup @kustolovic pour ton aide !
A bientôt !
dinolam a écrit :
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']) &amp;&amp; !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-&gt;prepare($sql);
$req-&gt;execute() or die(print_r($db-&gt;errorInfo()));
$data = $req-&gt;fetch(PDO::FETCH_ASSOC);



&lt;!-- Liens navigations pour changer de langues --&gt;

&lt;div class="nav-lang"&gt;
                    &lt;?php if (!isset($_SESSION['langue'])) { ?&gt;
                        &lt;div class="div-lg"&gt;&lt;a class="lang" href="siteAccueil.php?lg=GB&lt;?php if (!empty($_GET['page'])) { echo '&amp;page='.$_GET['page']; } ?&gt;"&gt;GB&lt;/a&gt;&lt;/div&gt;
                        &lt;div class="div-lg"&gt;&lt;a class="lang" href="siteAccueil.php?lg=ES&lt;?php if (!empty($_GET['page'])) { echo '&amp;page='.$_GET['page']; } ?&gt;"&gt;ES&lt;/a&gt;&lt;/div&gt;
                    &lt;?php } else {
                        if ($_SESSION['langue'] == 1) { ?&gt;
                            &lt;div class="div-lg"&gt;&lt;a class="lang" href="siteAccueil.php?lg=GB&lt;?php if (!empty($_GET['page'])) { echo '&amp;page=' . $_GET['page']; } ?&gt;"&gt;GB&lt;/a&gt;&lt;/div&gt;
                            &lt;div class="div-lg"&gt;&lt;a class="lang" href="siteAccueil.php?lg=ES&lt;?php if (!empty($_GET['page'])) { echo '&amp;page=' . $_GET['page']; } ?&gt;"&gt;ES&lt;/a&gt;&lt;/div&gt;
                        &lt;?php } else if ($_SESSION['langue'] == 2) { ?&gt;
                            &lt;div class="div-lg"&gt;&lt;a class="lang" href="siteAccueil.php?lg=FR&lt;?php if (!empty($_GET['page'])) { echo '&amp;page=' . $_GET['page']; } ?&gt;"&gt;FR&lt;/a&gt;&lt;/div&gt;
                            &lt;div class="div-lg"&gt;&lt;a class="lang" href="siteAccueil.php?lg=ES&lt;?php if (!empty($_GET['page'])) { echo '&amp;page=' . $_GET['page']; } ?&gt;"&gt;ES&lt;/a&gt;&lt;/div&gt;
                        &lt;?php } else { ?&gt;
                            &lt;div class="div-lg"&gt;&lt;a class="lang" href="siteAccueil.php?lg=FR&lt;?php if (!empty($_GET['page'])) { echo '&amp;page=' . $_GET['page']; } ?&gt;"&gt;FR&lt;/a&gt;&lt;/div&gt;
                            &lt;div class="div-lg"&gt;&lt;a class="lang" href="siteAccueil.php?lg=GB&lt;?php if (!empty($_GET['page'])) { echo '&amp;page=' . $_GET['page']; } ?&gt;"&gt;GB&lt;/a&gt;&lt;/div&gt;
                        &lt;?php }
                    } ?&gt;
&lt;/div&gt;

&lt;!-- Affichage de la description d'un produit récupérée en bd --&gt;
&lt;div class="content"&gt;
        &lt;div class="row"&gt;&lt;?=$data['produit_description_'.$langue];?&gt;&lt;/div&gt;
&lt;/div&gt;


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 !