younes371 > t'es adepte des solution gores toi
je fais des sites depuis 1999, et j'ai dû abandonner la solution que tu préconise depuis 2000 : impossible à maintenir.
ce que je préconise :
1/ utilisation des librairies multi-lingue spécifiques au langage. en PHP ou en .NET par exemple, il y a de base, des librairies permettant de faire du code multi-lingue sans devoir écrire et gérer "l'intelligence" du système. c'est éprouvé, rapide, et fait gagner un temps précieux.
2/ si l'utilisation de ces librairies est impossible (absente chez l'hergeur, etc.), alors :
PARTOUT où on a un libellé, appeler une fonction "getLabel(codlab, codlan)"
Bien penser à avoir le codlan en paramètre, ne pas se reposer aveuglément sur la session !
Ensuite, coder cette fonction de la sorte (pseudo-code C#) :
Code :
- const string LANGUE_PAR_DEFAUT = "EN";
- string getLabel(string codlab, string codlan)
- {
- string txt;
- txt = (select txtlab from label where codlab = @codlab and codlan = @codlan);
- if (txt != null)
- {
- return txt;
- }
- else if (txt == null && codlan != LANGUE_PAR_DEFAUT)
- {
- return getLabel(codlab, LANGUE_PAR_DEFAUT);
- }
- else
- {
- /* On peut aussi ajouter une alerte administrive aussi */
- return ("¤" + codlab + "¤" );
- }
- }
|
Ensuite, tu fais une table "LABEL" avec la structure "codlan char(2), codlab varchar(50), txtlab varchar(2000)"
et n'hésite pas à faire des codes dignes de ce nom.
genre la quatrième entrée du menu, ça ne doit pas être "menu4", mais "ACCES_AU_PANIER" par exemple. Que tu ne passes pas des heures à relire ton code par la suite.
n'hésite pas à te servir de ce système aussi pour stocker aussi les noms d'images par exemple.
avec ce système, tu n'auras qu'une version unique de toutes tes pages et la possibilité de modifier tous les libellés du site, dans toutes les langues, sans toucher une ligne de code, et de la même façon, tu pourras créer autant de langues que tu veux sans ne jamais retoucher une ligne de code.
ça permet aussi de pouvoir changer de langue à tout moment, sans devoir repasser par la page d'acceuil et perdre sa navigation (c'est bien chiant)
Genre : http://accessories.euro.gehealthca [...] ro=1F04070 <- tu peux consulter la fiche du produit dans n'importe quelle langue, sans perdre ta navigation. avec la solution de younes c'est virtuellement impossible.
autre solution, que j'ai utilisé pour un site où je ne disposais pas d''une base de données, et où je n'avais pas encore compris le fonctionnement (pourtant si simple) de la gestion multilingue de C# :
Fichier XML :
Code :
- <?xml version="1.0" encoding="utf-8" ?>
- <labels>
- <!-- Bannière -->
- <message codmsg="welcome">
- <language codlan="FRA">Bienvenue {0}</language>
- <language codlan="ENG">Welcome {0}</language>
- </message>
- <message codmsg="prevpage">
- <language codlan="FRA">PAGE PRÉCÉDENTE</language>
- <language codlan="ENG">PREVIOUS PAGE</language>
- </message>
- <message codmsg="disconnect">
- <language codlan="FRA">Déconnexion</language>
- <language codlan="ENG">Disconnect</language>
- </message>
- <message codmsg="home">
- <language codlan="FRA">Accueil</language>
- <language codlan="ENG">Home page</language>
- </message>
- ...
|
Les fonctions de recherche d'une message :
Code :
- /// <summary>
- /// Summary description for language.
- /// </summary>
- public class language
- {
- private const string DefaultCodlan = "FRA";
- private const string DefaultMessagePattern = "¤{0} - {1}¤";
- private string codlan;
- private XmlNode dom;
- public language(string codlan, string mappath)
- {
- this.codlan = codlan;
- StreamReader sr = new StreamReader(mappath + "/ressources/labels.xml", Encoding.UTF8);
- XmlDocument doc = new XmlDocument();
- try
- {
- doc.LoadXml(sr.ReadToEnd());
- }
- catch
- {
- }
- sr.Close();
- sr = null;
- this.dom = doc.SelectSingleNode("labels" );
- doc = null;
- }
- ~language()
- {
- this.dom = null;
- }
- public string GetMessage(string msgcod)
- {
- string retMessage = string.Format(DefaultMessagePattern, msgcod, this.codlan);
- foreach (XmlNode ch in this.dom.SelectNodes("message" ))
- {
- if (ch.Attributes["codmsg"].Value == msgcod)
- {
- foreach (XmlNode chch in ch.SelectNodes("language" ))
- {
- if (chch.Attributes["codlan"].Value == this.codlan)
- {
- retMessage = chch.InnerText;
- break;
- }
- else if (chch.Attributes["codlan"].Value == DefaultCodlan)
- {
- retMessage = chch.InnerText;
- }
- }
- break;
- }
- }
- return retMessage;
- }
- }
|
Puis des appels à cette fonction :
Code :
- lan = new language((string)Session["codlan"], Server.MapPath("." ));
- ((Label)e.Item.FindControl("titFam" )).Text = lan.GetMessage("titFam" );
- ((Label)e.Item.FindControl("titFou" )).Text = lan.GetMessage("titFou" );
|
On voit qu'en fait, c'est le même fonctionnement finalementqu'avec la BDD, c'était juste pour donner un exemple complet
ah, et pour les données, idem, surtout pas la solution de younes.
un champ "codlan" dans chaque table nécessitant une localisation, et voilà !
ps : la table "produit" n'est pas localisable par exemple, c'est le même produit, que tu le vendes à un portugais ou un égyptien.
par contre, la table "produit_description" elle, sera localisé, car les infos sur le produit ne sont pas les mêmes d'une langue à l'autre.
passer en multi-lingue une base, ça nécessite souvent le split d'un certain nombre de tables en plusieurs. ne pas foncer bille en tête à rajouter des codlan partout !
Message édité par MagicBuzz le 11-09-2006 à 16:53:47