Bonjour,
J'ai conçu un site (en français) et je souhaite mettre une deuxième langues (anglais). Les données à afficher sont proviennent d'une BDD MySql.
Comment procéder ?
Merci.
Bonjour,
J'ai conçu un site (en français) et je souhaite mettre une deuxième langues (anglais). Les données à afficher sont proviennent d'une BDD MySql.
Comment procéder ?
Merci.
Il y a deux aspects à traiter quand on internationalise un site :
1) La traduction de la partie statique du site, c'est à dire l'interface applicative avec les titres, les libellés de champs de saisie, les pages fixes genre informations légales...
2) La traduction éventuelle de la partie dynamique, c'est à dire des données affichées par le site.
Pour le premier aspect, cela peut se traiter :
- par des fichiers de traduction ;
- par une traduction stockée en base de données.
Pour le second aspect, il faut commencer par déterminer ce que vous voulez traduire et modéliser l'internationalisation de vos tables.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Merci,
Pour les données statiques, je prévoir utiliser un tableau associatif avec des id.
Quand aux données stockées,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?php $string_lang = array( 'HOME' => array( 'fr-fr' => "accueil", 'en-En' => "Home"), ......................... ......................... 'COPY' => array( 'fr-fr' => "Mention légale", 'en-uk' => "CopyRight") ); ?>
je suis voudrais ajouter une rubrique langue dans ma table dans ce cas toutes les requête auront une variable $lang (variable session).
Ce méthode implique forcement que chaque article sera obligatoirement inséré dans la table en français et en anglais.
exemple de requête:Est une méthode efficace ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT * FROM table WHERE lang = $_session['lang']...
Ça peut fonctionner ainsi en effet.
3 remarques :
Si vous avez beaucoup de libellés, vous allez charger tous les libellés pour les deux langues, ce qui peut être lourd. Et si un jour vous ajoutez d'autres langues, vous augmentez d'autant la taille des informations chargées. Il vaut parfois mieux faire un fichier par langue et ne charger en mémoire que la langue choisie par l'utilisateur.Pour les données statiques, je prévoir utiliser un tableau associatif avec des id.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?php $string_lang = array( 'HOME' => array( 'fr-fr' => "accueil", 'en-En' => "Home"), ......................... ......................... 'COPY' => array( 'fr-fr' => "Mention légale", 'en-uk' => "CopyRight") ); ?>
Attention aux injections SQL ! Utilisez PDO ou mysqli et "bindez" vos variables php.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT * FROM table WHERE lang = $_session['lang']...
Dans votre code PHP, vous utilisez 'fr_FR' et 'en_EN', soit 5 caractères pour une langue. En base de données, faites plutôt une table des langues et utilisez l'identifiant auto-incrémenté de cette table, ça prend moins de place en BDD et c'est plus facilement maintenable en cas d'erreur ou de changement de code.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Merci pour les conseils. Je m'y et je reviens.
Merci CinePhil c'est bon. J'ai crée une table pour les langues et une table pour les données statiques. Et jusque là tous va bien.
Bonjour CinePhil, je reviens pour un souci due je pense au mon url.
Sur ma page, j'ai deux boutons qui me permettent de changer langues. Tous va bien sur la page d'accueil mais quand j’appelle une page interne l'url pose problème.
Mes url contient des paramètres qui permettent l'affiche des l'article voulu. Comment prendre en compte ces variables passées en paramètres dans l'url ?
Code de changement de langue
lien d'appel du script de changement des langues
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 if(isset($_SESSION['lang']) or $_SESSION['lang'] == "") { $_SESSION['lang'] == 'fr'; } if(isset($_GET['lang']) && ($_GET['lang']== 'fr')) { $_SESSION['lang'] = $_GET['lang']; } elseif(isset($_GET['lang']) && ($_GET['lang']== 'en')) { $_SESSION['lang'] = 'en'; } else { $_SESSION['lang'] = 'fr'; }
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <a href="?lang=fr"><img src="images/drapeau_francais.png" alt="Français" width="30" height="18" /></a> <a href="?lang=en"><img src="images/drapeau-grande-bretagne.png" alt="English" width="30" height="18" /></a>
Exemple d'url
NB: les deux fichiers sont intégrés dans chaque page.
Code : Sélectionner tout - Visualiser dans une fenêtre à part <a href="page.php?lang=<?php echo $data->lang; ?>&id=<?php echo $data->id; ?>">article</a>
Traduction :
Si la variable $_SESSION['lang'] existe ou est égale à une chaîne vide, alors $_SESSION['lang'] == 'fr'.
Je pense que tu veux plutôt dire ceci :
Si la variable $_SESSION['lang'] n'existe pas ou est égale à une chaîne vide.
Ce qui donne ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(!isset($_SESSION['lang']) or $_SESSION['lang'] == "") {Là tu testes deux langues pour l'affecter à $_SESSION['lang'] de manière un peu compliquée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if(isset($_GET['lang']) && ($_GET['lang']== 'fr')) { $_SESSION['lang'] = $_GET['lang']; } elseif(isset($_GET['lang']) && ($_GET['lang']== 'en')) { $_SESSION['lang'] = 'en'; } else { $_SESSION['lang'] = 'fr'; }
Ceci devrait suffire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 if(isset($_GET['lang']) && (($_GET['lang']== 'fr') || ($_GET['lang']== 'en'))) { // Si $_GET['lang'] existe et vaut 'fr' ou 'en', on l'affecte à $_SESSION['lang'] $_SESSION['lang'] = $_GET['lang']; } else { // Sinon langue par défaut = 'fr' $_SESSION['lang'] = 'fr'; }Où et comment est généré l'objet $data ?lien d'appel du script de changement des langues
Exemple d'url
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <a href="?lang=fr"><img src="images/drapeau_francais.png" alt="Français" width="30" height="18" /></a> <a href="?lang=en"><img src="images/drapeau-grande-bretagne.png" alt="English" width="30" height="18" /></a>
Code : Sélectionner tout - Visualiser dans une fenêtre à part <a href="page.php?lang=<?php echo $data->lang; ?>&id=<?php echo $data->id; ?>">article</a>
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Bonjour,
1/ autre écriture :
2/ A priori, tu n'as pas besoin de transmettre la langue, puisqu'elle est enregistrée en SESSION !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 // array des langues du site $langs_array = array( 'fr', 'en' ); // permet d'ajouter facilement d'autres langues // N.B. cet array peut être construit via la base de données (table des langues) ! if( !empty($_GET['lang']) && in_array($_GET['lang'],$langs_array) )) // lang reçu via URL { $_SESSION['lang'] = $_GET['lang']; // mise en session } else { $_SESSION['lang'] = 'fr'; // langue par défaut }
Ce n'est qu'au niveau de la requête qu'il faut utiliser $_SESSION['lang'].
Code : Sélectionner tout - Visualiser dans une fenêtre à part <a href="page.php?id=<?php echo $data->id; ?>">article</a>
3/ Traductions statiques
Plutôt que de les charger à chaque fois (!), je conseille plutôt :
- un fichier par langue : config_dico_langue_fr.php, config_dico_langue_en.php
- de les stocker dans des variables de SESSION
- de charger la langue en cours uniquement, et UNE SEULE FOIS
Exemple config_dico_langue_fr.php :
Fonction de TRADUCTION en fonction de la langue fct_dico_langue.php
Code : 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 <?php // -------------------------------------------------- // PARAMETRAGE LANGUE : FRANCAIS // -------------------------------------------------- // CONNEXION / AUTHENTIFICATION $_SESSION['DICO'][$lgDico]['Vous_avez_deja_compte'] = 'Vous avez déjà un compte'; $_SESSION['DICO'][$lgDico]['Identification'] = 'Identification'; $_SESSION['DICO'][$lgDico]['Authentification'] = 'Authentification'; $_SESSION['DICO'][$lgDico]['Parametres_connexion'] = 'Paramètres de Connexion'; $_SESSION['DICO'][$lgDico]['Connexion'] = 'Connexion'; $_SESSION['DICO'][$lgDico]['Deconnexion'] = 'Déconnexion'; $_SESSION['DICO'][$lgDico]['Connectez_vous'] = 'Connectez-vous'; // ------------ // INSCRIPTION $_SESSION['DICO'][$lgDico]['Creer_nouveau_compte'] = 'Créer un nouveau Compte'; $_SESSION['DICO'][$lgDico]['Inscription'] = 'Inscription'; $_SESSION['DICO'][$lgDico]['S_inscrire'] = 'S\'inscrire'; $_SESSION['DICO'][$lgDico]['Inscrivez_vous'] = 'Inscrivez-vous'; $_SESSION['DICO'][$lgDico]['Formulaire_Inscription'] = 'Formulaire d\'Inscription'; $_SESSION['DICO'][$lgDico]['Remplissez_formulaire_Inscription'] = 'Remplissez le formulaire d\'Inscription';
charger la langue en cours uniquement, et UNE SEULE FOIS :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?php function dico( $mot ) { // Si la variable a été définie, la retourner... if( !empty($_SESSION['DICO'][$_SESSION['lang']][$mot]) ){ $mot_traduit = htmlspecialchars($_SESSION['DICO'][$_SESSION['lang']][$mot]); } else { // $mot_traduit = 'TRANSLATE_ERROR'; // => pour les tests ! (vérification que tous les textes ont été traduits) $mot_traduit = $mot; // on affiche tel quel } return $mot_traduit; };
Exemple d'affichage d'un texte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if( (empty($_SESSION['CONFIG_LANG']['$_SESSION['lang']']) || $_SESSION['CONFIG_LANG']['$_SESSION['lang']']!==true) { // on stocke les traductions depuis le DICTIONNAIRE require_once('./config_dico_langue_' . $lgDico . '.php'); // language (indiquer le chemin correct) // config OK $_SESSION['CONFIG_LANG']['$_SESSION['lang']'] = true; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?php session_start(); require_once('./fct_dico_langue.php'); ?> .... <?php echo dico('Remplissez_formulaire_Inscription'); ?>
Dernière modification par Invité ; 20/02/2015 à 06h33.
Bonjour CinePhil,
l'objet data est le résultat d'une requête.
les langues sont stockées dans une table (au cas où dans le futur on décide d'ajouter d'autres langues).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $q = $connect_db->prepare('SELECT * FROM article WHERE id= :id AND lang = :lang'); $q->bindValue(':id', $id); $q->bindValue(':lang', $lang); $q->execute(); $q->setFetchMode(PDO::FETCH_OBJ); return $q->fetch();
Je me rend compte que ce n'est pas la manière la plus efficace puisque je pouvais faire
puisque la langue est déjà en session.
Code : Sélectionner tout - Visualiser dans une fenêtre à part <a href="page.php?lang=<?php echo $_SESSION['lang']; ?>&id=<?php echo $data->id; ?>">article</a>
NB:
Le principe que je veux mettre en place est toutes les informations soient dynamiques stockées dans une BDD en deux langues (pour l'instant). Les stockées dans un fichier statiques équivaudrait à chaque modification réecrire les informations et aussi la quantité d'info à gérer est très importante.
Salut,
Oui si tu veux un site multi langue réellement pratique et évolutif (totalement administrable depuis le site lui-même sans intervention extérieure), tu as intérêt de mettre à la fois les données statiques et dynamique en bdd. Cela permet à l'utilisateur de traduire les données statiques/libellés dans une autre langue si toutes ne sont pas définies dès le départ.
Le plus souple est donc de tout mettre en bdd. Cela dit pour exploiter au maximum toutes ces possibilités cela demande plus de travail (formulaires de traductions...).
Petite remarque, on peut utiliser la syntaxe courte pour faire des echo dans le html :
Code : Sélectionner tout - Visualiser dans une fenêtre à part <a href="page.php?lang=<?= $_SESSION['lang'] ?>&id=<?= $data->id ?>">article</a>
C'est exactement ce que je veux faire. J'y arrive presque sauf qu'il y a un souci dans la redirection en revenant sur l'index.
J'explique :
les urls sont réécrites dans mon fichier .htaccess
Code apache : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #Options +FollowSymlinks Options -MultiViews RewriteEngine on RewriteRule ^(fr|en)/index\.html$ index.php?lang=$1 [L] RewriteRule ^(fr|en)/page-([0-9\-]+)\.html$ page.php?lang=$1&id=$2 [L]
Lorsque je joins la page (page.php), pas de problème la réécriture est parfaite mais quand je change de langue (fr->en ou en->fr) :
1er problème : les paramètres sont affichés dans la barre d'adresse (ce qui normale avec l'url)
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <a href="page.php?lang=fr"><img src="images/drapeau_francais.png" alt="Français" width="30" height="18" /></a> <a href="page.php?lang=en"><img src="images/drapeau-grande-bretagne.png" alt="English" width="30" height="18" /></a>
1- Comment faire la réécriture étant donné que en fonction de la page mon url change
exemple les urls peuvent prendre la valeur:
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <a href="page2.php?lang=fr"><img src="images/drapeau_francais.png" alt="Français" width="30" height="18" /></a> <a href="page2.php?lang=en"><img src="images/drapeau-grande-bretagne.png" alt="English" width="30" height="18" /></a>
Mon deuxième problème c'est au niveau des fichiers inclus (css, js) quand je retourne sur la page index. la réécriture donne l'url : mon_site/en/index.html.
à l'ouverture du site l'url est : index.html
Comment faire pour que les chemin vers les fichiers inclus soient correcte que ce soit avec : mon_site/en/index.html ou index.html ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager