Laden...

[gelöst] MultiLanguage mit RessourcenDateien (Sattelite Assemblies) - Wie Sprache hinzufuegen?

Erstellt von MillionsterNutzer vor 14 Jahren Letzter Beitrag vor 14 Jahren 7.107 Views
M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 14 Jahren
[gelöst] MultiLanguage mit RessourcenDateien (Sattelite Assemblies) - Wie Sprache hinzufuegen?

Hi!

Ich muss eines meiner bestehenden Projekte (VS2008) nachtraeglich MultiLangugage tauglich machen und wollte dazu Ressourcendateien verwenden.

Ich habe ein kleines Testprojekt angelegt, in dem alle Texte einer Datei namens Lang.resx untergebracht sind, innerhalb des Codes werden die Strings dann z.B. wie folgt geladen:


this.Text = Lang.frm2Title;

Zusaetlich habe ich nun die Ressourcen Lang.de.resx und Lang.fr.resx hinzugefuegt. Wenn ich nun meine Sprache mit


Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr");

umstelle und die Texte erneut anfrage bekomme ich auch tatsaechlich die franzoesichen Texte. Soweit alles gut, aber

Wie kann ich einer fertigen Anwendung nachtraeglich ein Sprache hinzufuegen? Ich habe selbst einfach mal eine der bestehenden resx-Files kopiert, umbenannt und mit einem einfachen Texteditor die Werte umgeschrieben ("es" fuer Spanisch). Anschliessend habe ich mit AL.exe eine dll daraus generiert und mit dem entsprechenden "es"-Verzeichnis in das Stammverzeichnis eingefuegt, genau so wie das Ganze auf einigen Seiten geschildert wird, allerdings ohne Erfolg - es wird die Standardsprache anstatt der nachtraeglich zugefuegten Sprache verwendet.

Ich koennte wetten ich hab da was falsch verstanden...

Wie erstelle ich am besten eine neue Resx-Datei fuer eine zusaetzliche Sprache und was muss ich mit ihr anstellen damit sie anschliessend auch angenommen wird?

Viele Gruesse

Ralf

PS: Kann ich das Testprojekt irgendwie anfuegen - ich denk das wuerde die Sache vereinfachen...

4.931 Beiträge seit 2008
vor 14 Jahren

Hast du denn auch in deiner Applikation dann


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

aufgerufen? Oder hast du es auf einem spanischen System laufen lassen (z.B. Windows XP mit MultiLanguage-Pack)?

Edit: und schau Dir mal den "Windows Resource Localization Editor (WinRes.exe)" an, von Microsoft (siehe http://msdn.microsoft.com/de-de/library/8bxdx003.aspx).

Außerdem schau dir mal das Tutorial [Tutorial] Textlokalisierung mit .NET an. Weiter unten gibt es auch Links zu anderen Ressource-Editoren.

P.S. Du kannst einfach dein Projekt als Dateianhang (am besten als RAR oder ZIP-Datei) hier hochladen (sofern es kleiner als 256KB ist).

M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 14 Jahren

Hi Th69!

Ich checke vorher welche Sprachordner in meinem Stammverzeichnis vorhanden sind und biete diese in einer ComboBox zur Auswahl an. Das heisst wenn ich nachtraeglich ein "es"-Ordner mit der spanischen Ressourcen.dll in das Stammverzeichnis meiner Anwendung kopiere wird das dementsprechend erkannt und behandelt.

Die Moeglichkeit Dateien anzuhaengen hab ich vorher schlichtweg uebersehen 😕

Du kannst ja mal einen Blick reinwerfen wenn du willst.

4.931 Beiträge seit 2008
vor 14 Jahren

Hallo,

ich kriege ebenfalls bei deinem Projekt keine spanischen Texte angezeigt.

Dann habe ich mal mit dem Zeta Resource Editor eine spanische Übersetzung (nutzt intern "google translator") anlegen lassen und diese dann in dein Projekt eingefügt (und dann normal kompilieren lassen). Schon hatte ich spanische Texte (s. Anhang)

Da du direkt die "AL.exe" benutzt hast (zum Vergleich: meine MultiLangExample.resources.dll ist nur 4KB groß, anstatt 9 KB), nehme ich an, daß du dort falsche Optionen benutzt hast. Wie sieht denn dein Aufruf aus?

Ich muß gestehen, ich habe selber es auch nicht geschafft mit AL die korrekte DLL zu erzeugen. (Edit: s.u.)
Hier mein Aufruf:


AL /c:es /t:lib /embed:MultiLangExample.lang.es.resources /out:MultiLangExample.resources.dll

So wie ich im Internet gelesen habe, muß man auf jeden Fall mittels "resgen" vorher die ".resx"-Datei in die ".resources" umwandeln. Ich habe einfach die vom VS erzeugte Datei aus dem "obj\debug"-Verzeichnis genommen -)
In der von VS erzeugten DLL sind auch noch die AssemblyInfos enthalten (sollte m.E. aber keine Rolle hier spielen?).

Mein Tipp also: einfach VS die Arbeit machen lassen und anschließend einfach die entsprechende sprachbezogene DLL nehmen und ausliefern.

Edit:
ich habe es gerade noch mal probiert (mit der Befehlszeile von oben) und nun klappt es doch bei mir (ich hatte beim ersten Test noch einen falschen Target-Namen angegeben!). Juhu -)

Du kannst es jetzt mal so bei dir ausprobieren (inclusive resgen)...

Hier auch noch ein Link mit ausführlicher Erklärung dazu: http://ondotnet.com/pub/a/dotnet/2002/10/14/local2.htm?page=last

M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 14 Jahren

Hi TH69!

Wollte gestern auch schon den Zeta Editor nutzen hatte aber bzw. habe aber Probleme beim downloaden/installieren.

Ich werde mich heute morgen als erste mal darum kuemmern, aber wahrscheinlich lag es daran, dass ich kein resgen genutzt habe!

Werde das Ergebnis spaeter noch posten. Bis dahin Danke!

Ralf

M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 14 Jahren
[gelöst] MultiLanguage mit RessourcenDateien (Sattelite Assemblies) - Wie Sprache hinzufuegen?

Hi TH69!

Ich muss zugeben dass ich es ganz ohne die Hilfe von VS immer noch nicht hinbekomme, aber im Prinzip ist das in Ordnung.

Solange ich einen Uebersetzer dazu bringen kann eine "resx."-Datei in eine neue zu uebersetzten, kann ich mit Hilfe von VS die neue Sattelite Assembly erstellen und diese dann verteilen.

Mit dem Zeta Ressource Editor oder dem ResXEditor gibt es ja sogar zwei Tools die den Uebersetzer unterstuetzen.

Leider habe ich nicht die Zeit zu untersuchen was ich mit resgen.exe und al.exe anders mache als VS08, aber wie schon gesagt solange ich eine Loesung habe ist das in Ordnung.

Vielen Dank fuer deine Unterstuetung!!!

Ralf

M
71 Beiträge seit 2008
vor 14 Jahren

Hi,

ich hätte jetzt nochmal eine kurze Frage hierzu:

Wenn ich in meinem Programm nur eine Deutsche Ressource-Datei hinzufüge (in VS), wird in bin\Debug ein neuer Ordner "de" erzeugt. Ist es jetzt möglich, dass ich per Hand einen Ordner "es" erstelle und dort eine neue Ressource-Datei einfüge?

Das Ziel ist, dass ich (ohne das Programm neu zu erstellen/ändern) dynamisch immer neue Sprachen hinzufügen kann.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo milkman,

warum probierst du des nicht einfach aus?

herbivore

M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 14 Jahren

Hi milkman!

Die Ueberlegung hatte ich vor kurzem auch: Einfach die deutsche .resx- Datei nehmen uebersetzen und dann mit resgen.exe eine Ressourcen-Datei draus machen und dann mit AL.exe eine neue Sattelite Assembly erstellen. Das ganze dann im es Ordner beim Kunden einbauen und fertig.

Naja, theoretisch funktioniert das auch (hast ja die Antwort von TH69 gesehen), allerdings hab ichs nicht ganz hinbekommen. Letztlich habe ich die ueberstezte Datei einfach ins Projekt eingebunden, VS08 eine .dll daraus erstellen lassen und die dann dem Kunden geschickt.

Naja. Du kannst dir ja das angehaengte Projekt schnappen und damit rumspielen - letztlich wirst du es selber ausprobieren muessen.

Gruesse

Ralf

M
71 Beiträge seit 2008
vor 14 Jahren

Hi Ralf,

so in der Art hab ich mir das auch gedacht. Was ich nur gerne vermeiden würde: Wenn die Software in eine neue Sprache übersetzt wird, muss ich das Programm wieder anpassen und allen Kunden schicken.

Deswegen wollte ich es so lösen, dass ich einfach nur im Programmordner einen neuen Ordner mit den Sprachkürzel erstelle und dort die DLL einfüge.

Hier mal kurz meine Vorgehensweise:1.Kopieren der strings.de.resx 1.Übersetzen und Umbenennung der strings.de.resx in strings.es.resx 1.Erstellen der ressources-Datei mit:

resgen.exe strings.es.resx

1.Erstellen der resources.dll mit

al.exe /culture:es /out:LanguageTest.resources.dll /embed:strings.es.resources /t:lib

Allerdings nimmt er immer die Default-Sprache...

M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 14 Jahren

Nun, ich kann dir keine Loesung fuer dein Problem vorschlagen, da ich selber nicht die Zeit hatte es fuer mich zu loesen, aber prinzipiell musst du das Programm nicht anpassen.

Zwar musst du die neue (uebersetzte) .resx-Datei in VS einbinden und dort in eine Sattelite-dll umwandeln lassen. Deswegen musst du dem Kunden aber nicht gleich das ganze Programm wieder schicken - Es reicht wenn du ihm die generierte DLL schickst und er sie dann dementsprechend unterbringt...

Verstanden?

M
71 Beiträge seit 2008
vor 14 Jahren

Ich verstehe 🙂

Werde das dann Morgen direkt mal testen - Danke dir 👍

4.931 Beiträge seit 2008
vor 14 Jahren

Hallo milkman,

beim embed-Parameter mußt du auch den Namensbereich (namespace) angeben, d.h.


/embed:LanguageTest.strings.es.resources

Edit:
noch mal als Nachtrag:
man kann die DLL auch von Hand erstellen, jedoch ist der Weg über VS doch bequemer.
Und wie MillionsterNutzer schon geschrieben hat, dann einfach die generierte Resourcen-DLL (in dem Sprach-Ordner) an die Kunden ausliefern.

M
71 Beiträge seit 2008
vor 14 Jahren

Hi Th69,

wenn ich LanguageTest.strings.es.resources verwende, kommt ein Fehler, dass das System die angegebene Datei nicht finden kann.
Hab dann meine resources Datei in LanguageTest.strings.es.resources umbenannt und anschließend wieder ausgeführt. Allerdings mag das mein Programm auch nicht.

Ich hätte das am liebsten so gelöst, da ich im Moment ein Programm schreibe, was resx Dateien automatisch übersetzt. So könnte ich die Dateien dann automatisch in den Ordner kopieren und müsste nicht extra in VS.

M
71 Beiträge seit 2008
vor 14 Jahren

Moin,

musste mich jetzt gerade nochmal mit dem Thema beschäftigen. Da die DLLs per Batch erstellt werden, kann ich da leider nichts mit dem VS machen.

Der "Fehler" lag daran, dass ich den Namespace nicht angegeben hatte bzw. falsch.

Ich hatte es so:

/embed:LanguageTest.strings.es.resources

Das ging natürlich nicht, weil meine Datei strings.es.resources hieß.

Korrekt ist folgendes:

/embed:strings.es.resources,LanguageTest.strings.es.resources

Nach dem Komma muss der Namespace und der Dateiname angegeben werden.

Evtl. hilft das ja noch ein paar von euch 😉