Lokalisierung mit Visual Studio.Net

Bernhard Bergmann

Grünschnabel
Hallo,

Ich möchte ein Programm lokalisieren (für die internationale Verwendung mit mehreren Sprachen freigeben). Hierzu verwende ich die in Visual Studio integrierte Möglichkeit der Lokalisierung mit (.resx) Resourcendateien. Für die (statische) Beschriftung von Buttons, Labels etc. funktioniert das auch sehr gut. Man wählt die Sprache des Formulars und kann dann die Beschriftung der Elemente in der jeweiligen Landessprache angeben.

Jetzt meine Frage:
Zu einem internationalen Programm gehören auch mehrsprachige dynamische Texte bzw. Phrasen wie z.B. Text-Ausgaben in Info-Fenstern, die sich erst während der Laufzeit (dynamisch) ändern. Wie und wo muss ich solche Texte angeben?. Ich habe schon versucht, die resx-Dateien einfach zu erweitern (add String). Aber ich weiß nicht, wie ich auf die neuen Strings zugreifen kann.

Kann mir jemand helfen?

Gruß, Bernd
 
Hi und willkommen im Forum

Die ResourceManager Class sollte dir bei deinem Problem weiter helfen. Mit der Methode GetString kannst du dir einen String anhand seines Namens zurück geben lassen.

edit:
@Alexander
Versteh mich bitte nicht falsch, aber denk bitte vorher nach eh du solche unqualifizierten Kommentare abgibst. Warum sollte er diesen unsinnigen Weg gehen, wenn ihm .Net die passenden Mittel zu Verfügung stellt. Und sowas wird nicht erst seit .NEt gemacht sondern in C++ gibt es schon StringTables
 
Zuletzt bearbeitet:
Hallo alexander und niko,

Erst mal vielen Dank für die schnelle Reaktion. Beide Antworten haben mir etwas weitergeholfen. Ich denke, ich brauche nur noch einen kleinen Kick, dann funkt's.

In den MSDN Libs habe ich viele Hinweise zum Thema Lokalisierung gefunden. Ganz funktionieren tut es aber noch nicht (bitte entschuldigt, wenn ich mich blöde anstelle - Ich habe bisher meist in Java/Eclipse programmiert und das sind jetzt meine ersten Programme in VST).

zunächst instanziiere ich eine Variable vom Typ "ResourceManager"
Dim rm As Resources.ResourceManager = _
Resources.ResourceManager.CreateFileBasedResourceManager _
("frmResults", baseDir, Nothing)

dabei ist
- frmResults = der (Basis-)Filename meiner Resourcendateien
- baseDir = der Verzeichnisname
- Nothing = der Default-ResourceSet

dann lese ich wie vorgeschlagen den Text aus der Resourcendatei
lb_Test.Text = rm.GetString("string_test")

Beim Lesen gibt es eine "MissingManifestResourceException" weil das File "frmResults.Resources" nicht gefunden wird. Ich vermute, es liegt an dem 3.Parameter der Methode "CreateFileBasedResourceManager ". Mit "Nothing" wird der ResourceSet-Default-Typ ausgewählt. Offensichtlich stimmt das bei mir nicht. Meine Resourcendateien heißen z.B. frmResults.de.resx. Anscheinend ist das nicht der Standard.

Könnt Ihr mir sagen, wie bei mir der 3.Parameter heißen müsste?
Ein Hinweis: ich verwende Visual Studio 2005 - vielleicht ist da ja wieder alles ganz anders als in den MSDN-Libs für VST.Net.

Gruß,
Bernd
 
Hallo,
Habe nach längerem Suchen jetzt selbst die Antwort gefunden. Es ist (natürlich) viel einfacher als gedacht:
Bei der instanziierung gebe ich, anstatt die Methode "CreateFileBasedResourceManager" zu verwenden, direkt den Typ der Resource an - also z.B.
> Dim rm As New System.Resources.ResourceManager(GetType(frmResults))
wobei "frmResults" der Name des Formulars ist.

Wenn ich jetzt in der Default-Resourcendatei und in den Satelliten-Dateien für das Formular "frmResults" eine neue Zeile z.B. mit dem Bezeichner "String_test" einfüge und dazu jeweils die zu lokalisierenden Strings eintrage, so kann ich im Programm den lokalisierten Wert mit
> rm.getText("String_test")
aus den Resourcendateien lesen.

Das Thema ist für mich damit beendet. Ich werde es als erledigt abschließen
Gruß, Bernd
 
Zurück