2012-06-30 8 views
7

Eine sehr einfache Sache, und ich kann es nicht zur Arbeit bringen. Ich möchte meine DLL so globalisieren, dass ich Ressourcendateien + den ResourceManager benutze.Resourcemanager gibt dieselbe Ressource zurück, obwohl CultureInfo angegeben ist

nenne ich die Resourcemanager wie folgt aus:

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); 

die Saiten bekommen diese

System.Diagnostics.Debug.WriteLine(p.GetString("greeting")); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en"))); 

Und es gibt 4 mal die gleiche Zeichenfolge. Meine Dateien sind

genannt
Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx 

Alle Dateieinstellungen sind die gleichen, aber wie bereits erwähnt - nur die Ressource in der Standard-Datei verwendet wird.

Was übersehe ich hier?

+2

Sind die RESX-Datei tatsächlich in Satelliten-Baugruppen zusammengestellt zu werden? Suchen Sie im Ordner bin \ Debug und suchen Sie nach Unterverzeichnissen mit den Namen en, nl und nl-NL. –

+0

Versuchen Sie, die Übersetzungen über 'Default.ResourceManager.GetString' zu erhalten. Wahrscheinlich hat der Ressourcenmanager, den Sie erstellen, einige falsche Parameter. –

Antwort

10

Es gibt einige Möglichkeiten, Ressourcendateien zu verwenden, von denen eine .resx Dateien verwendet. Diese Dateien werden basierend auf dem Wert Thread.CurrentThread.CurrentUICulture automatisch lokalisiert. Die Standarddatei .resx wird in die Assembly kompiliert, in der sie enthalten ist (z. B. Ihre Hauptprogrammdatei), während die lokalisierten Ressourcen (Default.nl-NL.resx) in ein Assembly in ein Assembly kompiliert werden (basierend auf der Kulturkennung nl-NL). genannt <AssemblyName>.resources.dll.

Das Adressieren von Werten aus diesen Ressourcen ist so einfach wie <ResourceName>.<KeyName>, zum Beispiel Default.Greeting. Um es zu testen, können Sie die Kultur ändern, mit:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
Console.WriteLine(Default.Greeting); 

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL"); 
Console.WriteLine(Default.Greeting); 

Welche Ausgabe wird

Hello 
Hallo 

beim Programmstart wird die UI-Kultur zur Kultur des Computers festgelegt es auf läuft, so dass Sie gewonnen Sie müssen die Sprache nicht selbst angeben, um die lokalisierten Ressourcen immer zu präsentieren. Also, .resx Dateien scheinen der Weg zu gehen. Wenn Sie ResourceManager von var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); verwenden, müssen Sie .resources Dateien lesen. Wenn es keine (in Ihrem Fall) Appname.Default.resources Datei gibt, wird p.GetString fehlschlagen. Also ich denke, Sie haben eine .resources Datei früher erstellt, aber nicht die lokalisierten .resx Dateien in .resources Dateien konvertiert.

Wenn Sie die Resourcemanager in der Lage sein verwenden möchten, um die Kultur zu bestimmen, können Sie verwenden:

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US")); 
+1

Danke - Ich weiß nicht, warum ich nicht nur Resources.Default verwendet habe. Muss das Wochenende sein! –

+0

@CodeCaster könntest du bitte meine Frage bitte anschauen. http://stackoverflow.com/questions/24070892/resources-dont-load-current-culture – Marc