2009-03-31 8 views
4

Lors du lancement d'exceptions personnalisées ou de l'émission de messages à l'utilisateur final, il est possible d'utiliser les chaînes codées en dur (y compris les constantes de chaîne), utiliser des assemblys ressources uniquement ou obtenir des chaînes d'une base de données.Meilleure pratique: Quelle est la meilleure façon de stocker les messages d'exception/d'erreur ou d'information dans C# .net pour l'internationalisation?

J'aimerais que mon application puisse passer facilement à une autre langue sans devoir la recompiler. Bien que le stockage des ressources de chaîne dans un assemblage ou une base de données atteigne cet objectif, cela ajoute à la complexité de la logique du programme, ce qui à son tour ajoute au coût du produit.

Ma question est la suivante: quelle est la meilleure façon d'atteindre cet objectif sans ignorer le coût associé à chaque option? Si vous avez une pratique qui est meilleure que ce qui a été répertorié, j'aimerais l'entendre.

Technologies: OS: Windows famille Plate-forme: Cadre .NET 2 et jusqu'à Langue: C# Base de données: MS SQL 2005 et jusqu'à

Merci les gars!

Cullen

Répondre

4

Utiliser les ressources:

Comment cela ajouter plus de complexité à la logique du programme?

try 
{ 
    //do something with System.Net.Mail with invalid email.. 
} 
catch (FormatException fex) 
{ 
    throw new Exception(Resources.ErrorMsg.Invalid_Email, fex); 
} 

Modifier

Dans VS2008 lorsque vous créez une ressource, vous pouvez définir si son interne ou public. Donc, supposons que nous définissons donc du public, dans un ensemble appelé ClassLibrary1, nous pouvons accéder à une propriété comme:

ClassLibrary1.Properties.Resources.InvalidError

Où InvalidError est le nom de l'erreur. Encore une fois, je ne pense pas que cela ajoute quelque chose à la logique.

+0

Ma solution contient plusieurs projets, donc plusieurs ensembles. Une des idées consiste à créer un assembly de ressources uniquement pour stocker les chaînes, puis à utiliser ResourceManager pour se connecter à l'assembly et pour lire les chaînes. Cela ajoute à la complexité. –

+0

@Cullen Tsering: Je suis d'accord avec Josh, le concepteur s'occupe de tout ça pour vous, et crée une classe bien typée qui expose les chaînes dans le fichier de ressources de sorte que tout ce que vous avez à faire est d'y accéder comme dans son échantillon. Votre commentaire indique que vous n'avez pas essayé le support du design. – casperOne

+0

casperOne: Pouvez-vous élaborer sur le support du design time s'il vous plait? –

2

.NET supporte déjà plusieurs ressources pour plusieurs cultures en utilisant une convention de nommage:

<default resource file name>.<culture>.resx 

essentiellement comme Josh a fait remarquer VS2008 crée un type agréable emballage en toute sécurité pour accéder à ces ressources.

Cependant, l'interface utilisateur VS expose le minimum de ce que vous pouvez faire.

Si vous créez un nouveau fichier de ressources appelé exactement le même que celui par défaut, ajoutez les informations de culture avant le resx. (REMARQUE: vous devrez le créer ailleurs, puis le copier dans le dossier Propriétés de la magie.)

Ensuite, si vous avez appliqué la culture au thread accédant à la ressource, votre application tirera la chaîne correcte des ressources spécifiques.

Par exemple:

// Using the default culture 
    string s = Resources.Error1Msg; 

    Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-CO"); 

    // Using the specific culture specified as above: 
    s = Resources.Error1Msg; 

Si vous devez vous paramétrez message, utilisez string.Format pour paramétrer la sortie.Un mot de prudence est d'essayer d'architecturer vos couches d'application de telle sorte que vos exceptions portent une charge utile riche (pour décrire l'erreur), au lieu de compter uniquement sur le texte. De cette façon, votre couche de présentation peut présenter la meilleure expérience d'interface utilisateur qui pourrait utiliser la charge utile.

HTH

Philip

+0

Merci Philip pour le commentaire utile. –

Questions connexes