2010-08-24 22 views
9

Ich habe eine winforms-Anwendung, die Benutzer müssen in der Lage sein, die Sprache zur Laufzeit zu ändern.So ändern Sie die Sprache zur Laufzeit ohne Layout-Probleme

Um den Schalter zu verallgemeinern und vermeiden harte Codesteuer Namen, die ich die folgende Erweiterung versucht:

internal static void SetLanguage(this Form form, CultureInfo lang) 
    { 
     ComponentResourceManager resources = new ComponentResourceManager(form.GetType()); 

     ApplyResourceToControl(resources, form, lang); 
     resources.ApplyResources(form, "$this", lang); 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang) 
    { 
     foreach (Control c in control.Controls) 
     { 
      ApplyResourceToControl(resources, c, lang); 
      resources.ApplyResources(c, c.Name, lang); 
     } 
    } 

Diese alle Fäden ändert.

Ein Nebeneffekt davon ist jedoch, dass der gesamte Inhalt des Fensters an die ursprüngliche Windows-Startgröße angepasst wird, unabhängig von der aktuellen Größe.

Wie kann ich verhindern, dass sich das Layout ändert oder eine neue Layoutberechnung einleitet?

+0

Ich wünschte, ich kann Sie mehr als einmal sehr hilfreich bewerten! – Bosak

Antwort

5

Sehen Sie sich die .resx-Datei an, um zu sehen, was alles neu zugewiesen wird. Eigenschaften wie Size und Form.AutoScaleDimensions sind lokalisierbare Eigenschaften. Die Neuzuweisung hat die Wirkung, die Sie sehen. Besonders die automatische Skalierung aufzuheben wäre ziemlich unangenehm.

Keine spezifischen Ratschläge, um dieses Problem zu beheben, dies ist nur nicht an einem anderen Ort als dem Formularkonstruktor ausgeführt werden. Rekonstruiere das Formular. Wenn Sie darauf hinweisen, dass der tatsächliche Benutzer Ihres Formulars niemals das Bedürfnis verspürt, seine Muttersprache spontan zu ändern, scheint dies keinen Eindruck zu hinterlassen.

5

Dies ist der vollständige Code, den ich jetzt verwende.

Die Änderung besteht darin, nur die Eigenschaft Text manuell zu ändern. Wenn ich andere Eigenschaften lokalisieren kann, muss der Code danach erweitert werden.

/// <summary> 
    /// Change language at runtime in the specified form 
    /// </summary> 
    internal static void SetLanguage(this Form form, CultureInfo lang) 
    { 
     //Set the language in the application 
     System.Threading.Thread.CurrentThread.CurrentUICulture = lang; 

     ComponentResourceManager resources = new ComponentResourceManager(form.GetType()); 

     ApplyResourceToControl(resources, form.MainMenuStrip, lang); 
     ApplyResourceToControl(resources, form, lang); 

     //resources.ApplyResources(form, "$this", lang); 
     form.Text = resources.GetString("$this.Text", lang); 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang) 
    { 
     foreach (Control c in control.Controls) 
     { 
      ApplyResourceToControl(resources, c, lang); 
      //resources.ApplyResources(c, c.Name, lang); 
      string text = resources.GetString(c.Name+".Text", lang); 
      if (text != null) 
       c.Text = text; 
     } 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, MenuStrip menu, CultureInfo lang) 
    { 
     foreach (ToolStripItem m in menu.Items) 
     { 
      //resources.ApplyResources(m, m.Name, lang); 
      string text = resources.GetString(m.Name + ".Text", lang); 
      if (text != null) 
       m.Text = text; 
     } 
    } 
Verwandte Themen