C# et localisation

C# et localisation - C#/.NET managed - Programmation

Marsh Posté le 19-10-2005 à 00:53:05    

Je viens de faire une class en C# qui me permet de gérer de façon dynamique la langue de mon application, à partir d'un fichier XML.
 
Voici le code :

Code :
  1. using System;
  2. using System.Xml;
  3. using System.Globalization;
  4. namespace SQLConnector
  5. {
  6. /// <summary>
  7. /// Summary description for labels.
  8. /// </summary>
  9. public class labels
  10. {
  11.  public static string getLabel(int number)
  12.  {
  13.   string languageCode = RegionInfo.CurrentRegion.ThreeLetterISORegionName;
  14.   bool found = false;
  15.   XmlDocument dom = new XmlDocument();
  16.   dom.Load("labels.xml" );
  17.   XmlNode root = dom.DocumentElement;
  18.   foreach (XmlNode language in root.SelectNodes("./language/@iso" ))
  19.   {
  20.    if (language.Value == languageCode)
  21.    {
  22.     found = true;
  23.     break;
  24.    }
  25.   }
  26.   if (!found)
  27.   {
  28.    languageCode = root.SelectSingleNode("default" ).Attributes["iso"].Value;
  29.   }
  30.   dom = null;
  31.   return getLabel(number, languageCode);
  32.  }
  33.  public static string getLabel(int number, string languageCode)
  34.  {
  35.   string labelText = "undefined";
  36.   XmlDocument dom = new XmlDocument();
  37.   dom.Load("labels.xml" );
  38.   XmlNode root = dom.DocumentElement;
  39.   foreach (XmlNode language in root.SelectNodes("./language" ))
  40.   {
  41.    if (language.Attributes["iso"].Value == languageCode)
  42.    {
  43.     foreach (XmlNode label in language.SelectNodes("./label" ))
  44.     {
  45.      if (System.Convert.ToInt16(label.Attributes.GetNamedItem("number" ).Value, 10) == number)
  46.      {
  47.       labelText = label.InnerText;
  48.       break;
  49.      }
  50.     }
  51.     break;
  52.    }
  53.   }
  54.   dom = null;
  55.   return labelText;
  56.  }
  57. }
  58. }


 
Je me repose sur le fichier :

Code :
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <labels>
  3. <language iso="FRA" name="Français">
  4.  <label number="0">SQLConnector - La solution de connexion multibase</label>
  5.  <label number="1">Base de données</label>
  6.  <label number="2">Connecter</label>
  7.  <label number="3">Déconnecter</label>
  8.  <label number="4">Non connecté</label>
  9.  <label number="5">Connecté</label>
  10.  <label number="6">Connexion</label>
  11.  <label number="7">SGBD :</label>
  12. </language>
  13. <language iso="USA" name="American">
  14.  <label number="0">SQLConnector - Multibase connection solution</label>
  15.  <label number="1">Database</label>
  16.  <label number="2">Connect</label>
  17.  <label number="3">Disconnect</label>
  18.  <label number="4">Not connected</label>
  19.  <label number="5">Connected</label>
  20.  <label number="6">Connection</label>
  21.  <label number="7">DBMS :</label>
  22. </language>
  23. <default iso="USA"/>
  24. </labels>


 
Ca marche (c'est déjà pas mal :D)
 
Mais j'ai quelques petites questions :
1) Est-ce que mon fichier XML est correct d'un point de vue sémantique ? Niveau structure, ça me semble correct et tout mais bon, au pour les labels par exemple, est-ce que la valeur ne serait pas mieu dans un attribut "value" ?
2) Dans mon code, est-ce que j'utilise "ce qu'il y a de mieu" pour parcourir mon fichier ? Je veux dire par là qu'il y a 1001 façons de parcourir un fichier XML, et je pense que parmi celles-ci, une est mieu que les autres...
3) Là, pour chaque label, je charge deux fois mon fichier (une première fois pour vérifier que la langue existe, et une seconde pour charger le label correspondant à la langue retenue). Sans stocker une infinité de variables en mémoire dans des Dictionnaires, ai-je un moyen simple de conserver en cache mon fichier XML sans trop de code ? J'aimerais si possible conserver l'aspect statique de mes fonctions.
4) Mon PC est sous Windows XP Edition Familiale, en français. Seulement, pour pouvoir bénéficier complètement des graphismes de Microsoft Filght Simulator, j'ai dû contourner un bug en mettant "Anglais (Etats-Unis)" dans mes options régionales. Du coup, malgré un OS en Français, mon programme me parle en anglais. Plutôt que d'utiliser System.Globalization.RegionInfo.CurrentRegion, qui retourne les infos des paramètres régionnaux, y a-t-il un moyen de retrouver la langue de l'OS ? C'est pas très gênant en soit, mais vu que je n'ai pour le moment pas prévu de pouvoir imposer une langue, c'est pas forcément terrible. (chuis trop fier de trouver la langue tout seul comme un grand pour permettre à l'utilisateur de choisir :D - d'autant plus qu'on peut toujours jouer avec le fichier labels.xml)
5) Même si là c'est pas utile, comment indiquer à la compilation que je veux que "labels.cs" soit compilé dans une DLL externe ? (sans créer un projet dédié à la DLL) C'est possible ?
6) J'avais encore une autre question, mais je l'ai oubliée :D Ca va me revenir... Ha oui ! Est-ce que ça intéresse des gens un programme capable de se connecter à n'importe quelle base de données (en fait, tout ce qui est supporté par OLEDB), afin de générer des fichiers d'extractions des tables, à divers formats (CSV, fichier avec masque, SQL Loader, lot de requêtes, XML, etc.) ? Et pourquoi pas des choses plus évoluées, telles que la duplication de tables entre deux bases différentes, le listing des données d'une tables, etc.

Reply

Marsh Posté le 19-10-2005 à 00:53:05   

Reply

Marsh Posté le 19-10-2005 à 12:41:14    

Bah y'a des lectures, mais pas beaucoup de réponses à mes 6 questions :/
 
Bon, je m'en fous à la limite, aucune question n'est blocante pour moi mais bon... Plutôt que de réécrire la moitié de mon appli dans 6 mois parcequ'on me dit que j'ai fait n'importe quoi, j'aimerais le savoir dès maintenant... :sweat:

Reply

Marsh Posté le 19-10-2005 à 13:26:13    

Allez, je viens poster [:dawa]
 
Et j'ai une chose à dire : tu t'es fait chier pour rien [:dawa]
 
Le framework a déjà tout pour gérer la localisation, grâce à de beaux fichiers .resx... qui ne sont rien d'autres que de l'XML :D Le Framework va pouvoir charger tout seul le .resx dont il a besoin, selon la Culture que tu indique. etc, etc etc :D

Reply

Marsh Posté le 19-10-2005 à 14:10:30    

Euh... T'as un exemple de comment ça marche ?
 
=> Moi, je veux que le fichier XML soit aisément modifiable par l'utilisateur
=> Qu'il puisse ajouter sa langue si elle n'est pas prise en charge
=> N'avoir qu'un seul EXE pour toutes les langues

Reply

Marsh Posté le 19-10-2005 à 14:19:17    

Dans tous les cas, pour faire ce que je compte faire, je pense pouvoir gérer ces différents SGBD (c'est pas tous des SGBD mais bon, je peux jouer dedans quand même :D)
 
http://www.carlprothman.net/Default.aspx?tabid=87

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed