2009-03-31 4 views
4

Wenn benutzerdefinierte Exceptions ausgegeben oder Nachrichten an den Endbenutzer ausgegeben werden, kann man die Strings (einschließlich String-Konstanten) fest codieren, Ressourcen-Assemblys nur verwenden oder Strings aus einer Tabelle in einer Datenbank abrufen.Best Practice: Was ist der beste Weg, um Exception/error oder informational messages in C# .net für die Internationalisierung zu speichern?

Ich möchte, dass meine Anwendung problemlos in eine andere Sprache wechseln kann, ohne dass sie neu kompiliert werden muss. Während das Speichern der String-Ressourcen in einer Assembly oder einer Datenbank diesen Zweck erfüllen würde, trägt dies zur Komplexität der Programmlogik bei, was wiederum zu den Kosten des Produkts beiträgt.

Meine Frage ist: Was ist der beste Weg, um mit dem Ziel im Auge zu behalten, ohne die Kosten zu ignorieren, die mit jeder Option kommt? Wenn Sie eine Übung haben, die besser ist als die, die aufgeführt ist, würde ich es gerne hören.

Technologies: OS: Windows-Familie Plattform: .NET Frame 2 und bis Sprache: C# Datenbank: MS SQL 2005 und bis

Danke Jungs!

Cullen

Antwort

4

Verwenden Ressourcen:

Wie wirkt sich das mehr Komplexität in die Programmlogik hinzufügen?

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

bearbeiten

In VS2008, wenn Sie eine Ressource erstellen, können Sie, wenn seine interne oder öffentliche definieren. So übernehmen wir es öffentlich gesetzt, in einer Versammlung genannt ClassLibrary1, können wir eine Eigenschaft zugreifen wie:

ClassLibrary1.Properties.Resources.InvalidError

Wo InvalidError der Name des Fehlers ist. Wiederum glaube ich nicht, dass dies der Logik zusätzliche Kraft verleiht.

+0

enthält Meine Lösung mehrere Projekte, daher mehrere Baugruppen. Eine der Ideen besteht darin, eine Nur-Ressourcen-Assembly zum Speichern der Zeichenfolgen zu erstellen und anschließend mit ResourceManager eine Verbindung zur Assembly herzustellen und die Zeichenfolgen zu lesen. Es trägt zur Komplexität bei. –

+0

@Cullen Tsering: Ich muss Josh zustimmen, der Designer kümmert sich um all das für Sie und erstellt eine gut typisierte Klasse, die die Strings in der Ressourcendatei freilegt, so dass Sie nur darauf zugreifen müssen wie in seinem Probe. Ihr Kommentar zeigt an, dass Sie die Entwurfszeitunterstützung nicht ausprobiert haben. – casperOne

+0

casperOne: Können Sie die Entwurfszeitunterstützung bitte bitte ausführlich erklären? –

2

.NET unterstützt bereits mehrere Ressourcen für mehrere Kulturen eine Namenskonvention:

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

Wesentlichen als Josh VS2008 schafft diese Ressourcen eine schöne Art sichere Wrapper für den Zugriff darauf hingewiesen.

Allerdings zeigt die VS-UI das Bär Minimum von, was Sie tun können.

Wenn Sie eine neue Ressourcendatei erstellen, die genauso wie die Standardeinstellung aufgerufen wird, fügen Sie die Kulturinformationen vor dem Resx hinzu. (HINWEIS: Sie müssen es woanders erstellen und dann in den magischen Eigenschaftsordner kopieren.)

Dann wird Ihre Anwendung, wenn Sie die Kultur auf den Thread angewendet haben, der auf die Ressource zugreift, die richtige Zeichenfolge aus den spezifischen Ressourcen ziehen.

Zum Beispiel:

// 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; 

Wenn Sie Sie Nachricht parametrieren müssen, verwenden Sie string.Format den Ausgang zu parametrieren.

Ein Wort der Vorsicht ist, versuchen Sie Ihre Anwendungsschichten so zu gestalten, dass Ihre Ausnahmen eine reichhaltige Nutzlast tragen (um den Fehler zu beschreiben), anstatt sich nur auf Text zu verlassen.

Auf diese Weise kann Ihre Präsentationsschicht die beste Benutzeroberflächenerfahrung bieten, die die Nutzlast nutzen könnte.

HTH

Philip

+0

Danke Philip für den hilfreichen Kommentar. –