Moin Leute,
des öfteren kam die Frage nach mehrsprachigen Programmen, und dazu kamen Lösungen, die fast noch DOS basiert waren. .NET macht das richtig fein.
Meine einzige Nebenbedingung ist, dass die Sprache die des Systems ist (so vorhanden) und nicht während der Laufzeit umgestellt werden kann.
Das geht nämlich echt einfach und mit praktisch keinem Aufwand.
.NET erzeugt dann zu jeder implementierten Sprache eine entsprechende Ressourcen-DLL, die vom System automatisch geladen wird.
Zunächst wird in den Projekteinstellungen -> Anwendung -> Assemblyinformation
die neutrale Sprache eingestellt. Sinnvollerweise Englisch (USA), d.h., dass, wenn das System seine Sprache nicht vorfindet, Englisch (USA) als Default verwendet wird.
!!! Nicht aber Englisch !!!
Das macht Sinn, da in der ganzen Welt halt (auch) Englisch gesprochen wird. Außerdem wird die neutrale Sprache auch dann verwendet, wenn eine einzelne Ressource nicht übersetzt wurde.
Nun die Dialoge.
Jede Form muss einzeln für die einzelnen Sprachen angepasst werden:
Die Form bekommt die Property
damit wird der Form kund getan, dass sie in mehreren Sprachen erscheinen soll.
Nun müsst Ihr alle Beschriftungen und Texte in dieser Form in englisch ausfüllen.
Danach wird die Sprache umgestellt:
!!! Nicht aber Language = Deutsch !!!
Alle englischen Texte werden nun nach Deutsch übersetzt. Wenn ein Abstand Label - Text zu klein ist oder so: Ordnet die Controls so an, dass alles für deutsch gut aussieht, der deutscge Dialog sieht dann halt ein wenig anders aus als der US-englische.
Unsere finnischen Freunde wird dies sehr freuen, denn ihre Wörter sind im Mittel deutlich länger als unsere.
Dies macht Ihr nun für alle Sprachen und Formen.
Nun zu den Texten, Bildern usw., die aus der Ressource geladen werden.
Wir fügen mit Projekt -> Hinzufügen -> neues Element eine neue Ressourcendatei hinzu, der wir den Namen Resources.de-DE.resx geben.
==> Die korrekte Bezeichnung für andere Sprachen entnehmt einer vom System erstellten anderssprachigen Dialog-Ressource. <==
Nun müssen wir das Projekt mal kurz beenden, um die neue Ressourcen-Datei im Explorer von Hand richtig einzusortieren.
Wir verschieben die Datei Resources.de-DE.resx in das Unterverzeichnis My Project\. Außerdem öffnen wir die Datei MEIN_PROJEKT.vbproj im Editor, suchen den Text Resources.de-DE.resx und machen daraus My Project\Resources.de-DE.resx.
Fertig. (In C# geht dies etwas einfacher.)
Nun wird das Projekt wieder geöffnet, und korrekterweise wird die Datei Resources.de-DE.resx nun im Verzeichnis My Project\ angezeigt.
Sollen nun Textressourcen hinzugefügt werden, wird dies zuerst in der englischen Ressource (Resources.resx) getan, danach werden unter denselben Namen in der deutschen Ressource (Resources.de.resx) die Übersetzungen eingetragen:
Nun fügen wir unserem Projekt einen Testbutton hinzu und schreiben in seinen Click-Handler:
Nach dem Start und dem Click erscheint die deutsche Messagebox. Beendet das Programm.
Im bin\Debug-Verzeichnis unseres Projekts wurde ein Verzeichnis de angelegt, das die deutschen Ressourcen enthält. Nennt es um (z.B. "_de") und startet das Programm erneut. Nach dem Click erscheint die englische Messagebox.
(Verzeichnis zuckbenennen, sonst wird ein neues Verzeichnis de erstellt.)
So. Das wars.
------------------------------------------
Soll die Sprache während der Laufzeit geändert werden können, so muss die Zielsprache geeignet zwischengespeichert werden und im ReLoad-Ereignis die entsprechende CultureInfo erzeugt und zugewiesen werden:
Fertig.
des öfteren kam die Frage nach mehrsprachigen Programmen, und dazu kamen Lösungen, die fast noch DOS basiert waren. .NET macht das richtig fein.
Meine einzige Nebenbedingung ist, dass die Sprache die des Systems ist (so vorhanden) und nicht während der Laufzeit umgestellt werden kann.
Das geht nämlich echt einfach und mit praktisch keinem Aufwand.
.NET erzeugt dann zu jeder implementierten Sprache eine entsprechende Ressourcen-DLL, die vom System automatisch geladen wird.
Zunächst wird in den Projekteinstellungen -> Anwendung -> Assemblyinformation
die neutrale Sprache eingestellt. Sinnvollerweise Englisch (USA), d.h., dass, wenn das System seine Sprache nicht vorfindet, Englisch (USA) als Default verwendet wird.
!!! Nicht aber Englisch !!!
Das macht Sinn, da in der ganzen Welt halt (auch) Englisch gesprochen wird. Außerdem wird die neutrale Sprache auch dann verwendet, wenn eine einzelne Ressource nicht übersetzt wurde.
Nun die Dialoge.
Jede Form muss einzeln für die einzelnen Sprachen angepasst werden:
Die Form bekommt die Property
damit wird der Form kund getan, dass sie in mehreren Sprachen erscheinen soll.
Nun müsst Ihr alle Beschriftungen und Texte in dieser Form in englisch ausfüllen.
Danach wird die Sprache umgestellt:
!!! Nicht aber Language = Deutsch !!!
Alle englischen Texte werden nun nach Deutsch übersetzt. Wenn ein Abstand Label - Text zu klein ist oder so: Ordnet die Controls so an, dass alles für deutsch gut aussieht, der deutscge Dialog sieht dann halt ein wenig anders aus als der US-englische.
Unsere finnischen Freunde wird dies sehr freuen, denn ihre Wörter sind im Mittel deutlich länger als unsere.
Dies macht Ihr nun für alle Sprachen und Formen.
Nun zu den Texten, Bildern usw., die aus der Ressource geladen werden.
Wir fügen mit Projekt -> Hinzufügen -> neues Element eine neue Ressourcendatei hinzu, der wir den Namen Resources.de-DE.resx geben.
==> Die korrekte Bezeichnung für andere Sprachen entnehmt einer vom System erstellten anderssprachigen Dialog-Ressource. <==
Nun müssen wir das Projekt mal kurz beenden, um die neue Ressourcen-Datei im Explorer von Hand richtig einzusortieren.
Wir verschieben die Datei Resources.de-DE.resx in das Unterverzeichnis My Project\. Außerdem öffnen wir die Datei MEIN_PROJEKT.vbproj im Editor, suchen den Text Resources.de-DE.resx und machen daraus My Project\Resources.de-DE.resx.
Fertig. (In C# geht dies etwas einfacher.)
Nun wird das Projekt wieder geöffnet, und korrekterweise wird die Datei Resources.de-DE.resx nun im Verzeichnis My Project\ angezeigt.
Sollen nun Textressourcen hinzugefügt werden, wird dies zuerst in der englischen Ressource (Resources.resx) getan, danach werden unter denselben Namen in der deutschen Ressource (Resources.de.resx) die Übersetzungen eingetragen:
Nun fügen wir unserem Projekt einen Testbutton hinzu und schreiben in seinen Click-Handler:
Nach dem Start und dem Click erscheint die deutsche Messagebox. Beendet das Programm.
Im bin\Debug-Verzeichnis unseres Projekts wurde ein Verzeichnis de angelegt, das die deutschen Ressourcen enthält. Nennt es um (z.B. "_de") und startet das Programm erneut. Nach dem Click erscheint die englische Messagebox.
(Verzeichnis zuckbenennen, sonst wird ein neues Verzeichnis de erstellt.)
So. Das wars.
------------------------------------------
Soll die Sprache während der Laufzeit geändert werden können, so muss die Zielsprache geeignet zwischengespeichert werden und im ReLoad-Ereignis die entsprechende CultureInfo erzeugt und zugewiesen werden:
Fertig.
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „RodFromGermany“ () aus folgendem Grund: Dateiname umbenannt: Resources.de-DE.resx