Accueil > Forum > > > > MySQL site multilingue
MySQL site multilingue
jeudi 18 novembre 2010 à 11:34:32 |
MySQL site multilingue

gfavier
|
Bonjour à tous, voila mon problème.
Je dois créer un site multilingue avec panel d'administration pour insérer des données en base en différentes langues.
De plus cet outil va s'étendre à d'autres langues par la suite, il est donc pensé de manière dynamique avec un array langues.
Exemple:
$langues = array("fr"=>"Français", "es"=>"Español", "en"=>"English");
Dans le panel, avec une boucle j affiche les input text pour les differentes langues. Si une langue est ajoutée dans le tableau, la boucle gère la création du nouvel input pour cette langue.
Je garde les données d'un input dans un unique champ créer de cette manière:
(bien sûr dans ma classe mysql la fonction mysql_real_escape_string() est utilisée avant insertion en base, l'exemple ci-dessous est simplifié pour expliquer le process)
foreach ($langues AS $key => $value) {
$txt .= "[lang_$key]".$_POST['input['.$key.']][/lang_$key]";
}
De cette manière le champ description de l'article aura cet aspect:
[lang_fr]Desc en français[/lang_fr][lang_es]Desc en español[/lang_es][lang_en]Desc in english[/lang_en]
Ensuite pour afficher dans le frontend la description de la langue choisie par l'utilisateur, j applique cette regexp sur ce champ:
'/\[lang_([a-z]{2})\](.*?)\[\/lang_\1\]/is'
Jusqu'ici tout va bien... Par contre pour trier la liste des articles sur le champ desc ça devient déja plus compliqué mais faisable en php.
J'ai essayé d'utiliser la fonction REGEXP en mysql mais je ne trouve pas la synthaxe correcte pour recupérer ce champ avec uniquement la description dans la bonne langue.
Question:
Est-ce une bonne méthode?
En effet, le champ text est amené à grossir au fur et à mesure que des langues s'ajouteront...
Par contre c'est assez simple pour récuperer depuis un formulaire de recherche les infos pertinentes avec un LIKE en MySQL.
Auriez-vous une méthode pour gérer les sites multilingues qui seraient plus efficace? Avec insertion en base.
Des conseils?
D'avance, merci à tous!
|
|
jeudi 18 novembre 2010 à 12:00:09 |
Re : MySQL site multilingue

Le grand Jisay
|
Salut,
Je trouve que c'est une bonne méthode. Maintenant pour ton problème de tri sur le champs descr, je ne le ferai pas via Mysql mais via PHP. Je créerai une fonction ou méthode si tu travailles en POO qui trie un tableau contenant les bonnes descriptions de la langue voulue.
Par exemple tu es en français et tu récupère via mysql :
-[lang_fr]Desc1_fr[/lang_fr][lang_es]Desc1_es[/lang_es][lang_en]Desc1_en[/lang_en]
-[lang_fr]Desc2_fr[/lang_fr][lang_es]Desc2_es[/lang_es][lang_en]Desc2_en[/lang_en]
-[lang_fr]Desc2_fr[/lang_fr][lang_es]Desc2_es[/lang_es][lang_en]Desc2_en[/lang_en]
-... ert
Ton tableau fr sera alors :
- Desc1_fr
- Desc2_fr
- Desc3_fr
Et tu trie ton tableau fr.
Il me semble que c'est la meilleure solution (et la plus simple)
Bien à toi,
Le grand Jisay
|
|
jeudi 18 novembre 2010 à 12:25:18 |
Re : MySQL site multilingue

gfavier
|
Salut grand Jisey,
merci pour ta réponse, oui je travaille en POO.
Je me demande si il ne serait pas préférable d'utiliser une table additionnelle avec un clé primaire créée sur 2 champs, (article_id, article_lang)
De cette manière, avec une jointure simple on récupère la ligne adéquat sans charger toutes les langues.
Par exemple:
table principale articles:
AR_ID, AR_PRICE, AR_QUANTITY, ...
table reférence pour chaque langue
ARL_ID, ARL_LANG, ARL_NAME, ARL_DESC
ou ARL_ID=AR_ID et ARL_LANG=(iso2 de chaque langue) clé unique
avec AR_ID=ARR_ID and ARR_LANG=$_SESSION['lang'] on récupère les infos ARL_NAME et ARL_DESC dans la langue voulue.
Par contre si on ajoute une langue et qu'il n'y a pas encore d'entrée en base avec la champ ARR_LANG, la requête retournera rien.
Dans ce cas, dans le backoffice, si le champ d'une langue n'est pas renseigné, au moment de l'insertion ou modification, un check peut soit forcer, soit prendre la langue par défaut pour remplir un champ langue vide.
Et cette solution est préférable pour vous?
Merci!
|
|
jeudi 18 novembre 2010 à 14:21:36 |
Re : MySQL site multilingue

Le grand Jisay
|
Salut !
Oui c'est une solution également mais cela implique plus de table. J'ai déjà eu l'occasion de travailler comme cela mais perso je m'y perdait assez rapidement.
La solution de ton premier post, j'ai travaillé avec pendant 2ans. Elle est simple, et on n'a pas une longue liste de table avec les traductions.
Pour mes projets perso, c'est la solution de ton premier post que j'utilise.
Mais bon, chacun ses goûts aussi ;-)
Le grand Jisay
|
|
jeudi 18 novembre 2010 à 14:42:13 |
Re : MySQL site multilingue

TychoBrahe
|
Salut,
Perso je n'aime pas vraiment les solutions proposées ici. Je serais plus partisan d'ajouter 2 champs dans ta table :
- Un champ renseignant la langue dans laquelle l'article est écrit : suppression totale de tes balises et création d'une entrée par langue.
- Un (second) identifiant (je suppose ici que chaque entrée dispose d'un déjà identifiant unique), non unique par contre, pour les articles.
Ainsi une sélection d'un article par son identifiant retourne 1 ligne par langue, ce qui te permet :
- De ne pas avoir ni de champ monstrueux ni de table superflue.
- De sélectionner la langue la plus adéquat (merci HTTP_ACCEPT_LANGUAGE) en sachant d'avance la liste des langues disponibles.
- D'associer des éléments extérieurs soit à un article entier (id de l'article) soit spécifiquement à une traduction de l'article (id de l'entrée). Dans le cas de documents contenant du texte c'est très efficace car ne présentant dans une langue que les documents écrits dans cette langue.
|
|
jeudi 18 novembre 2010 à 14:59:35 |
Re : MySQL site multilingue

gfavier
|
Salut TychoBrahe,
si je comprend bien ta solution, cela implique que si on a une table avec 15 champs (et seulement 2 champs à traduire), on se retrouve avec:
- id unique
- id de larticle non unique pour chaque langue
- langue
- ... autres champs
Ce qui veut dire que si on a 5 ou 10 langues (j en ai deja 4 par défaut)
Il y aura 5 ou 10 entrées de 15 champs avec pleins de champs identiques (sauf id unique, id article non unique, langue, titre, description qui changent en fonction de la langue), et les 10 autres champs seront toujours identiques.
En terme d'optimisation, je ne suis pas sur que les 2 premières solutions proposées soient moins bien que celle là.
Ou je n ai peut etre pas bien analysé ta réponse?
Je pense que la solution 2, avec une table lié à la principale et contenant comme cle primaire les 2 champs (id_article, lang) est plus simple et moins coûteuse à gérer.
Imaginons qu'il y ait 10 langues, ta table principale a 10 lignes par article, quand les autres solutions n'en ont qu'une.
A vrai dire, je ne suis pas partisan de dupliquer des infos.
Encore une fois je n'ai peut-être pas bien analysé ta réponse.
Merci!
|
|
jeudi 18 novembre 2010 à 15:03:30 |
Re : MySQL site multilingue

gfavier
|
Salut grand Jisey,
je bosse aussi avec cette solution depuis un moment, le point qui me dérange, c'est que plusieurs champs de la table doivent passer en text au lieu de varchar (titre par exemple) systématiquement.
En terme de ressource mysqld je me demande si ce n'est pas mieux de splitter les infos dans 2 tables et réduire les tailles d'un maximum de champ?
Merci pour ton retour!
|
|
jeudi 18 novembre 2010 à 15:46:23 |
Re : MySQL site multilingue

Le grand Jisay
|
En terme de ressource mysqld je me demande si ce n'est pas mieux de splitter les infos dans 2 tables et réduire les tailles d'un maximum de champ?
Certainement que oui, c'est mieux mais si on réfléchis bien, combien de champs doivent réellement passer en text ? Tout ce qui est description longue. Pour les autres, titres, ... je ne vois pas quel intérêt il y a de les mettre en text. Il faut alors mettre une restriction sur le nombre de caractères que peut entrer un utilisateur. Un varchar(2500) par exemple reste tout à fait raisonnable pour le process Mysql.
|
|
jeudi 18 novembre 2010 à 17:49:57 |
Re : MySQL site multilingue

TychoBrahe
|
Il y aura 5 ou 10 entrées de 15 champs avec pleins de champs identiques (sauf id unique, id article non unique, langue, titre, description qui changent en fonction de la langue), et les 10 autres champs seront toujours identiques.
Je en connais pas ta structure de base de données : je me basait sur le fait qu'il existe uniquement un titre et un contenu, et donc aucun champ qui ne se retrouve en doublon (ces deux champs étant différents en fonction de la langue). Après en effet, si certains champs se retrouveraient en doublon il faut les mettre dans une table à part et faire une jointure. Ne t'en fais pas, je ne suis pas non plus favorable à la création de doublons, c'est un procédé abominable.
En terme d'optimisation, je ne suis pas sur que les 2 premières solutions proposées soient moins bien que celle là.
Niveau "optimisation" éviter un traitement "à la main" des données par PHP est très coûteux par rapport à un traitement par le SGBDR. Mais le problème n'est pas là, le problème est plus qu'il faut absolument éviter de stocker des infos qui demandent d'être retraitées derrière (truc avec des balises qu'il faut extraire par exemple).
|
|
Cette discussion est classée dans : input, mysql, champ, lang, langues
Répondre à ce message
Sujets en rapport avec ce message
pb sur mysql avec requete select * from TABLE IN (select ...) [ par malibu23 ]
Salut j ai un pb sur mysql lorsque je fais un requetedu type select CHAMP from TABLE where CHAMP IN ( select CHAMP from TABLE where CHAMP = VARIABLE);
champ Text BDD Mysql et execution code PHP [ par cecelecyborg ]
Bonjour à tous, Je cherche à executer du code php contenu dans un champ Text d'une base de données MySQL. Est-ce que cela est faisable, et si oui, u
Champ Mysql dans textarea...retour à la ligne non conservé. [ par stevethx40 ]
Salut !!Voilà j'ai un soucis que j'ai retrouvé plusieurs fois sur le forum...mais pas de réponse qui ont marché avec moi...J'ai un formulaire qui envo
Question requete mysql [ par zzzzzz ]
salut j'ai plusieurs champs dont 1 champ nommé "id" qui est en auto increment et un autre champ nommé "titre" (et d'autres champs qui sont pas utiles
MySQL DATETIME [ par eax ]
saluty'a qqun qui pourrait me dire comment faire pour rechercher des données dans une table MySQL:j'ai un champ `cree_le` qui est un timestamp (DATETI
passage d'une valeur de checkbox ds requête mysql [ par arnold002 ]
Bonjour,J'ai créé un formulaire avec champ texte et checkbox. Le voici :<input type=checkbox name=var[] value="ingre
alimentation de champ [ par lafouz150 ]
Bonjour à tous ! Voila j suis encore novice en php et mysql , mais malgré ca je voudrais realiser un site avec un but assez simple. 1) J' ai une bas
Pratique la couleur ;-) [ par nougitch ]
Bonjour, J'aimerai récupérer les données d'une table dans un select multiple. Voici ce que j'ai fait , je m'explique après : "
Lister le contenu d'un champ mais avec des conditions ??? [ par pepekiss ]
Bonjour, pour mon site, j'aurais besoin de lister le contenu d'un champ. Voilà le début de mon code.mysql_connect("localhost","root","");mysql_select_
pb alignement champ varchar mysql [ par bastien30 ]
Bonjour,je gère une table mysql via un formulairepour l'insertion pas de pb, mon occurence est bien enregistréeavec pour chaque champ de type varchar,
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|