Laden...

Text aus Array für mehrere Klassen

Letzter Beitrag vor 16 Tagen 4 Posts 243 Views
Text aus Array für mehrere Klassen

Unter Anderem für eine Unterstützung von mehreren Sprachen habe ich folgendes implementiert:

  • Ein Interface, mit dem ich einen Text setzen kann
  • Mehrere Klassen, für die ich dann SetText aufrufen kann und die dann die Text Eigenschaft gemäß einem übergebenen Array setzen.

Nun muss ich aber für ganz viele GUI Klassen eine eigene Klasse implementieren, die praktisch alle gleich aussehen

    public interface ILanguageText
    {
        void SetText();
    }
    public class LanguageLabel(Label label, string[] texts) : ILanguageText
    {
        readonly Label label = label;
        readonly string[] texts = texts;

        public void SetText()
        {
            label.Text = texts[Language.Actual] + ExtraText;
        }
    }
    public class LanguageGroupBox(GroupBox groupBox, string[] texts) : ILanguageText
    {
        readonly GroupBox groupBox = groupBox;
        readonly string[] texts = texts;

        public void SetText()
        {
            groupBox.Text = texts[Language.Actual];
        }
    }
    public class LanguageMenuItem(ToolStripMenuItem menuItem, string[] texts) : ILanguageText
    {
        readonly ToolStripMenuItem menuItem = menuItem;
        readonly string[] texts = texts;

        public void SetText()
        {
            menuItem.Text = texts[Language.Actual];
        }
    }

Kann man so etwas nicht auch mit einem Template machen? Nach meinem aktuellen Wissen geht das nicht, da die Text Eigenschaft der einzelnen Klassen ja nicht in einem gemeinsamen Interface oder einer gemeinsamen Basisklasse definiert ist.

Prinzipiell könnte das so aussehen. Aber t.Text geht ja nicht

    public class LanguageItem<T>(T t, string[] texts) : ILanguageText
   {
       readonly T t = t;
       readonly string[] texts = texts;
       public void SetText()
       {
           t.Text = texts[Language.Actual];
       }
   }

Geht das vielleicht doch?

Was soll das denn am Ende werden, oder vereinfachen? Und welche UI Technologie ist das? Forms?
In quasi allen modernen UIs würde man Bindings verwenden - da braucht man das alles nicht.


Wenn ich mir grob denken kann, dass es hier um Lokalisierung geht wäre ich überrascht, dass Du die Anforderungen hast, dass Du was völlig Neues erfinden müsstest.

Je nach UI Technologie, gibt es für Lokalisierung schon fertige Lösungen von .NET Seite her.
Dein Ansatz für jedes Control eine eigene Klasse anzulegen ist auch unnötig.
Die Implementierung macht man i.d.R. über die Basis Klasse der Controls, die die Text Property überhaupt erst anbietet.
Aber das kann man sich eigentlich sparen, da man dafür eben Bindings verwenden kann.
Sollte aber auch in der Doku zur jeweiligen UI Technik unter dem Punkt Lokalisierung stehen.

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Für WinForms Projekte (das glaube ich aus den verwendeten Klassen heraus lesen zu können) wird die Lokalisierung in der Regel über Ressourcen realisiert. Das ist eine auch vom WinForms-Designer unterstützte Variante. Lokalisierung bedeutet i.d.R. ja nicht nur das anpassen der Strings sondern oft auch eine Anpassung der Größen und Positionen einzelner Controls.

Wenn Du Deinen Weg weiterverfolgen möchtest, solltest Du dich auch mal mit der Schnittstelle IExtenderProvider auseinandersetzen und Dir Extension-Methoden genauer anschauen. Wie schon geschrieben ist das erstellen je einer eigenen Klasse je Control nicht de sinnvollste Weg solche Dinge umzusetzen.