Sprache zur Laufzeit ändern

Xo-mate

Erfahrenes Mitglied
Ich habe ein Programm mit 2 Sprachen (deutsch und englisch).
Wie kann ich zur Laufzeit zwischen diesen beiden Sprachen wechseln?
Am liebsten Antworten mit Beispiel.
Danke im Voraus.
 
Hi!

Das folgende Beispiel zeigt Dir eine Möglichkeit Englisch als Programmsprache auszuwählen,
wenn das Programm nicht in einer deutschen Sprachumgebung gestartet wurde.
Program.SetCurrentCulture kannst natürlich auch überall von deinem Programm aus aufrufen. ;)
C#:
sealed class Program {
	[STAThread]
	static void Main() {
		
		Form1 app = null;

		try {
			if ( Thread.CurrentThread.CurrentCulture.Name.StartsWith( "de" ) )
				Program.SetCurrentCulture( "de" );
			else
				Program.SetCurrentCulture( "en" );

			Application.EnableVisualStyles();
			Application.DoEvents();
			app = new Form1();
			Application.Run( app );				
		}
		catch ( Exception ex ) {
			MessageBox.Show(
				string.Format( "{0}{1}{1}{2}", ex.GetType().FullName, Environment.NewLine, ex.ToString() ),
				string.Format( "{0} ({1})", ex.Source, ex.GetType().Name ) );
		}
		finally {
			if ( app != null ) {
				app.Dispose();
				app = null;
			}
			GC.WaitForPendingFinalizers();
			GC.Collect();
		}
	}

	public static void SetCurrentCulture( string Culture ) {
		Thread.CurrentThread.CurrentUICulture = new CultureInfo( Culture );
		switch( Culture ){
			case "de":
				Thread.CurrentThread.CurrentCulture = new CultureInfo( Culture + "-" + Culture.ToUpper() );
				break;
			case "en":
				Thread.CurrentThread.CurrentCulture = new CultureInfo( Culture + "-GB" );
				break;
		}
	}
}
 
Also:
Ich habe den ersten Teil davon in mein main() eingebaut und "Program" durch "Form1" (meine Klasse) ersetzt.. Das SetCurrentCulture ist ebenfalls eingefügt. Die Namespaces sind auch vorhanden. Das einzige, was ich nicht hab ist dieses "sealed class".
Jedenfalls funktioniert es so, wie ich es jetzt habe nicht :(
 
Also:
Ich habe den ersten Teil davon in mein main() eingebaut und "Program" durch "Form1" (meine Klasse) ersetzt.. Das SetCurrentCulture ist ebenfalls eingefügt. Die Namespaces sind auch vorhanden. Das einzige, was ich nicht hab ist dieses "sealed class".
Jedenfalls funktioniert es so, wie ich es jetzt habe nicht :(
 
Die Main hat auch in deinem Form nichts zu suchen. ;)
Die Klasse Program gehört normaler Weise in den Rootnamespace deiner App.

Erstell ein neues *.cs File und füge die Klasse Program ein.
Lösch die Main aus deinem Form1 wo sie bisher war
und starte das Projekt.

So wie in dieser Demo von mir:
[post=1296048]AW: C# Beim drücken eines Buttons Fensterinhalt ändern - Post[/post]
 
Also alles so gemacht, wie dus gesagt hast.
Es funktioniert auch alles soweit - er änder (laut CultureInfo.CurrentCulture) auch die Sprache, aber er ändert nicht die Sprache (also den Text) auf meinen Buttons etc. nach Englisch
 
Achso, dachte weisst schon wie man das macht. Du musst natürlich nach dem Einstellen der Sprache
alle Controls abgrasen und alle Beschriftungen neu setzen. Und gefähr so:
C#:
this.SuspendLayout();

ResourceManager resources = new ResourceManager( this.GetType() );
foreach( Control _control in this.Controls )
	if ( !excludeList.Contains( _control.GetType() ) )
		_control.Text = resources.GetString( myControl.Name + ".Text" );

this.ResumeLayout();
Aber vorsicht bei Combo- und ListBoxen. Deren Text Property entspricht dem aktuell ausgewählten Item.
Da diese Steuerelemente idR zu Laufzeit mit Werten gefüllt werden,
kannst einen Ausnahmefehler bekommen wenn Du versuchst ein "myControl.Text" Property aus den Resourcen zu holen.
Ignoriere also diese Controls.

//Edit: Kannst dafür eine ArrayList hernehmen und mit den unerwünschten Typen füllen.
 
Zuletzt bearbeitet:
Hallo

wo und wie ist die excludedList definiert?

grüsse

EDIT://

hat sich erledigt, habe es so gemacht:

List<Type> excludedControlTypes = new List<Type>();
excludedControlTypes.Add(typeof(ListBox));
excludedControlTypes.Add(typeof(ComboBox));
 
Zuletzt bearbeitet:
@Christian Kusmanow
Ist ein bisschen Off-Topic, aber:
warum rufst du im Beispiel-Code (zweiter Post) im Finally-Block folgende Methoden auf?
Code:
GC.WaitForPendingFinalizers();
GC.Collect();
Sollte der GC doch automatisch machen, falls er es für nötig hält, nicht?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück