IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

gestion multi-langue et tables [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut gestion multi-langue et tables
    Bonjour,

    on m'a proposé un système multi-langue qui utilise json ; il convient pour traduire plusieurs mots par contre je ne vois pas comment l'adapter pour traduire des tables si les données à traduire appartiennent à des tables (MySql).
    Voici le système :
    On a cette fonction
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function getPageLanguage($lang,$pages) {
        $dataPage=[];
        foreach($pages as $p){
            $jsonString=file_get_contents('_lang/'.$lang.'/'.$p.'.json');
            $json=json_decode($jsonString);
            $dataPage[$p]=$json;
        };
        return (object) $dataPage;
    }
    qu retourne un objet dont chaque propriété contient les traductions d'une page (sous forme d'un objet qui lui-même contient toutes les traductions de la page)

    Initialement, les traductions d'une page sont contenues dans un fichier json dont voici un petit exemple :
    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
        "home":"Accueil",
        "var1":"test_fr"
    }

    Donc si la page ne contient que des mots (statiques) à traduire, c'est clair pour moi. Voici comment accéder à l'un d'eux, une fois appelée la fonction ci-dessus : $lang->home->var1 (pour la page nommée "home").
    Là où je ne vois pas comment faire, c'est si on veut afficher des données contenues dans une table. Ce que je suppose, c'est qu'on a une table par langue et que selon la langue demandée par l'utilisateur, on va chercher la bonne table. C'est bien ça ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour Laurent,

    comme tu l'as constaté, il y a 2 types de textes.

    1- les textes "statiques"
    Là, en effet, des fichiers json peuvent convenir. (il existe d'autres moyens, mais simplifions...)

    2- les textes "dynamiques" (contenu d'articles,... générés dynamiquement via des formulaires, et enregistrés en BDD)
    Là, c'est au rédacteur/administrateur de rédiger les traductions dans les différentes langues.

    2a- La SOLUTION 1 est d'avoir, dans la table "t_articles", des colonnes différentes pour CHAQUE TRADUCTION :
    • titre_fr
    • titre_en
    • ...
    • contenu_fr
    • contenu_en
    • ...
    • date_creation
    • date_update
    • publier (1/0)

    Puis, en fonction de la langue du site, on affiche les colonnes concernées.

    Un inconvénient est de devoir définir des nouvelles colonnes pour chaque nouvelle langue...
    Mais quand on n'a que 2 ou 3 langues à gérer, ça peut être une solution simple à mettre en oeuvre.


    2b- La SOLUTION 2 (utilisée notamment par Prestashop), est d'avoir une 2ème table "t_articles_lang", pour les colonnes nécessitant des TRADUCTIONS.

    On aura "t_articles" :
    • id_article (index auto-incrémenté)
    • date_creation
    • date_update
    • publier (1/0)
    • ... (BREF : TOUT ce qui NE dépend PAS de la langues)

    On aura "t_articles_lang" :
    • id_article
    • id_lang (il existe une table "ts_lang" *)
    • titre
    • contenu
    • ... (TOUT ce qui dépend de la langues)

    Via une requête avec JOINTURE, on peut donc afficher la ligne/traduction concernée, en fonction de la langue du site

    L'intérêt est de pouvoir définir AUTANT de nouvelles langues qu'on veut, sans changer la structure des tables !


    * Exemple de table "ts_lang" (ici, Prestashop) :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    --
    -- Structure de la table `ps_lang`
    --
     
    CREATE TABLE `ps_lang` (
      `id_lang` int(11) NOT NULL,
      `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      `active` tinyint(1) NOT NULL,
      `iso_code` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
      `language_code` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
      `locale` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
      `date_format_lite` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      `date_format_full` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      `is_rtl` tinyint(1) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    --
    -- Contenu de la table `ps_lang`
    --
     
    INSERT INTO `ps_lang` (`id_lang`, `name`, `active`, `iso_code`, `language_code`, `locale`, `date_format_lite`, `date_format_full`, `is_rtl`) VALUES
    (1, 'Français (French)', 1, 'fr', 'fr', 'fr-FR', 'd/m/Y', 'd/m/Y H:i:s', 0);
    Dernière modification par Invité ; 13/07/2019 à 08h48.

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse Jérôme.
    Je teste la méthode 2-b et en rendrai compte.

  4. #4
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    langue au chat ; je vois pas comment faire. Pour simplifier, je prend la table "categories" (car bien sûr il faut aussi traduire les catégories). Le but est donc d'afficher le nom dans la bonne langue.

    Voici le code (j'ai rajouté dans la table une colonne "id_lang", mais je sais pas comment récupérer le nom dans la bonne langue, donc la table a la nouvelle structure mais le code PHP est celui qui fonctionnait avec une seule langue (c'est de la poo, désolé)).

    la table :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE IF NOT EXISTS `categories` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_lang` int(11) NOT NULL,
      `name` varchar(255) COLLATE utf8_bin NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
     
    INSERT INTO `categories` (`id`, `id_lang`, `name`) VALUES
    (1, 0, 'documentaire'),
    (2, 0, 'essai politique'),
    (3, 1, 'documentary'),
    (4, 1, 'political essay');
    COMMIT;

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    function __construct($id) {
        global $db;
     
        $sql="SELECT * from categories where id=?";
        $reqCategory=$db->prepare($sql);
        $reqCategory=execute([$id]);
        $data=$reqCategory->fetch();
     
        $this->id=$id;
        $this->name=$data['name'];
    }
     
    -----------------
    static function getAllCategories() {
        global $db;
     
        $sql="SELECT * from categories";
        $reqCategory=$db->prepare($sql);
        $reqCategory->execute([]);
        return($reqCategory->FetchAll());
    }
     
    -----------------
    $AllCategories=Categories::getAllCategories();
     
    -----------------
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    <?=$Category['name'] ?>

  5. #5
    Invité
    Invité(e)
    Par défaut
    Laurent,
    tu n'as pas compris le principe...

    A-
    • Il faut DEUX tables "categories" et "categories_lang"
    • + la table "langs"


    1- table "langs" (simplifiée) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE `langs` (
      `id_lang` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      `active` tinyint(1) NOT NULL,
      `iso_code` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    INSERT INTO `langs` (`id_lang`, `name`, `active`, `iso_code`) VALUES
    (1, 'Français (French)', 1, 'fr'),
    (2, 'Anglais (English)', 1, 'en');

    2- table "categories" :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE IF NOT EXISTS `categories` (
      `id_categorie` int(11) NOT NULL AUTO_INCREMENT,
     
    -- ICI, on peut/va ajouter toutes les colonnes, qui N'ont PAS de rapport avec la langue (date, publier,....)
     
      PRIMARY KEY (`id_categorie`)
    ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    INSERT INTO `categories` (`id`) VALUES
    (1),
    (2);

    3- table "categories_lang" :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    CREATE TABLE IF NOT EXISTS `categories_lang` (
      `id_categorie` int(11) NOT NULL,
      `id_lang` int(11) NOT NULL,
      `name` varchar(255) COLLATE utf8_bin NOT NULL,
     
    -- ICI, on peut/va ajouter toutes les colonnes, qui ONT un rapport avec la langue -> traductions (contenu, title,....)
     
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    INSERT INTO `categories_lang` (`id_categorie`, `id_lang`, `name`) VALUES
    (1, 1, 'documentaire'),
    (2, 1, 'essai politique'),
    (1, 2, 'documentary'),
    (2, 2, 'political essay');


    B- ENSUITE, il faut une requête avec JOINTURE, pour récupérer la(les) catégorie(s), avec les bonnes traductions :

    1- SI la langue du site est enregistrée dans une variable $_SESSION['id_lang'], et vaut "1" (fr) ou "2" (en) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql = "SELECT * FROM categories C
       INNER JOIN categories_lang CL
          ON C.id_categorie = CL.id_categorie
       WHERE CL.id_lang = ?
       AND C.id_categorie = ?
    ";
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        $reqCategory = $db->prepare($sql);
        $reqCategory = execute([$_SESSION['id_lang'], $id_categorie]);

    2- SI la langue du site est enregistrée dans une variable $_SESSION['lang'], et vaut "fr" ou "en", il faut AJOUTER LA JOINTURE avec la table langs :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sql = "SELECT * FROM categories C
       INNER JOIN categories_lang CL
          ON C.id_categorie = CL.id_categorie
       INNER JOIN langs LG
          ON CL.id_lang = LG.id_lang
       WHERE LG.lang = ?
       AND C.id_categorie = ?
    ";
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        $reqCategory = $db->prepare($sql);
        $reqCategory = execute([$_SESSION['lang'], $id_categorie]);
    Dernière modification par Invité ; 13/07/2019 à 08h47.

  6. #6
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    J'en suis qu'au SQL,

    mais
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE IF NOT EXISTS `categories_lang` (
      `id_categorie` int(11) NOT NULL,
      `id_lang` int(11) NOT NULL,
      `name` varchar(255) COLLATE utf8_bin NOT NULL,
      PRIMARY KEY (`id_categorie`)
    ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    INSERT INTO `categories` (`id_categorie`, `id_lang`, `name`) VALUES
    (1, 1, 'documentaire'),
    (2, 1, 'essai politique'),
    (1, 2, 'documentary'),
    (2, 2, 'political essay');

    donne
    INSERT INTO `categories` (`id_categorie`, `id_lang`, `name`) VALUES
    (1, 1, 'documentaire'),
    (2, 1, 'essai politique'),
    (1, 2, 'documentary'),
    (2, 2, 'political essay')



    MySQL a répondu : Documentation
    #1054 - Champ 'id_categorie' inconnu dans field list
    ???

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. MySQL gestion & multi-tables
    Par Belenos dans le forum MySQL
    Réponses: 2
    Dernier message: 06/07/2009, 13h50
  2. gestion de langue dans les tables
    Par epeichette dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/10/2007, 15h45
  3. Réponses: 5
    Dernier message: 22/04/2007, 01h11
  4. [PHP 5] Gestion multi langues
    Par lenoil dans le forum Langage
    Réponses: 4
    Dernier message: 29/03/2007, 16h55
  5. Gestion multi-langues et JMenuItem
    Par TheReturnOfMuton dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 19/06/2006, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo