2009-11-24 6 views
15

Es gibt viele Tutorials, wie man mehrsprachige RESX-Dateien erstellt und Satelliten-Assemblies mit AL.exe erstellt, aber ich habe kein funktionierendes Beispiel gefunden, wie man RESX/Resources/Satelliten-DLL-Dateien in einzelne EXE-Dateien einbettet und verteilt multilanguage App als solche EXE.Wie man mehrsprachige Dateien * .resx (oder * .resources) in einzelne EXE einbetten?

Ich habe versucht, ilmerge.exe zu verwenden, aber es sieht aus wie es nicht funktioniert für mehrere DLLs mit dem gleichen Namen (Kultur Satelliten DLLs haben identische Namen, ursprünglich in verschiedenen Unterbenannten nach Kultur benannt).

Ich weiß auch nicht, wie Sie ResourceManager-Instanz erstellen, um mit eingebetteten Ressourcen zu arbeiten.

Meine Ziele sind dynamisches Umschalten zwischen geschlossenen, vordefinierten Sprachen. Ich brauche Klasse/Methode, die Kultur Zeichenfolge (d. H. "De-DE"), Ressource-Name (d. H. "AbbrechenText") erhalten und übersetzten Text basierend auf eingebettet ResX/Ressource/DLL.

Ich benutze VS2008, bitte beachten Sie, welche Einstellung für "Build-Aktion" in resx/Ressourcen-Dateien Eigenschaftenblatt benötigt wird. Arbeitscode Beispiel oder Link zu Tutorial-Projekt wäre die beste.

+1

Ich weiß, es ist gruselig, einen solchen alten Thread wieder zu aktivieren, aber ich bin daran interessiert herauszufinden, ob Sie Ihr Problem gelöst haben und wenn ja, wie? Verwenden Sie immer noch bis zu diesem Zeitpunkt Ihre Herangehensweise (die Antwort, die Sie unten gegeben haben)? Ich arbeite an einem ähnlichen Projekt in VS 2012 und möchte meine Sprachressourcen-DLLs in die Haupt-assembly/exe-Datei kombinieren, während ich immer noch ResourceManager verwende, um zwischen Deutsch und Englisch zu wechseln. Vielen Dank! – Sebastian

+0

@Sebastian Ich habe keinen anderen Weg erforscht, bitte teile es mit, wenn du einen besseren findest – tomash

Antwort

8

Meine Lösung: Programm enthält nur eine Standardsprache Ressource-Datei (Resx). Alle anderen Sprachen werden von .resx nach .resources kompiliert und als Ressourcendatei eingebettet. Wichtig! Ich habe die Erweiterung geändert, weil ".resources" als spezieller Ressourcentyp erkannt wird. Meine französischen Dateien heißen daher "PIAE.LangResources.fr".

Hier einfacher Code ist übersetzt Zeichenfolge abrufen (es sollte mit Caching-Werten von Ressourcen verbessert werden):

internal static string GetString(string str, string lang) 
    { 

     if (string.IsNullOrEmpty(str)) throw new ArgumentNullException("empty language query string"); 
     if (string.IsNullOrEmpty(lang)) throw new ArgumentNullException("no language resource given"); 

     // culture-specific file, i.e. "LangResources.fr" 
     Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PIAE.LangResources."+lang); 

     // resource not found, revert to default resource 
     if (null == stream) 
     {                 
      stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PIAE.Properties.LangResources.resources"); 
     } 

     ResourceReader reader = new ResourceReader(stream); 
     IDictionaryEnumerator en= reader.GetEnumerator(); 
     while (en.MoveNext()) 
     { 
      if (en.Key.Equals(str)) 
      { 
       return en.Value.ToString(); 
      } 
     } 

     // string not translated, revert to default resource 
     return LangResources.ResourceManager.GetString(str); 
    } 
+6

+1, wir verwenden einen ähnlichen Ansatz. Es tut weh, dass .net Sie zwingt, das Rad neu zu erfinden, wenn Sie Satellitenbaugruppen vermeiden wollen. Eine sehr schlechte Designentscheidung, IMO. – Heinzi

+0

Netter Ansatz.Ich wollte nur hinzufügen, dass ein "ResourceSet" um den Reader herum verwendet werden kann, um das Abrufen von Werten nach Namen zu erleichtern. –

4

Sie haben es nicht gefunden, weil das .NET-Framework nicht funktioniert. .NET erwartet Satelliten-DLLs an speziell benannten Orten (zB Verzeichnisse, die nach der Sprache der darin enthaltenen Ressourcen benannt sind. ZB de, de-DE, chs, ...). Wenn Sie nicht auf diese Weise arbeiten, kann .NET seine Magie nicht anwenden (das heißt, automatisch die richtige Ressource gemäß der aktuellen UI-Kultur auszuwählen: Thread.CurrentThread.CurrentUICulture).

+2

Es ist OK für mich, ich kann die richtige Kultur an mir selbst weitergeben - aber ich verteile kleines Werkzeug und will definitiv keine Unterordner hinzufügen/dlls. Nur eine EXE, auch wenn .NET Framework hier wenig hilft. – tomash

0

Verwenden Sie dieses Programm, es funktioniert bei mir: EXEPack

Sie müssen nur manuell tun, jedes Mal kompilieren Sie nicht sicher, ob es einen Befehl Werkzeug.