Propertys eines UserControls lokalisierbar machen (Mehrsprachig)

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Jan@81.

    Propertys eines UserControls lokalisierbar machen (Mehrsprachig)

    Hallo zusammen,

    Ich entwickle gerade eine Application für Windows Embedded Compact 2013 und muss dazu leider Windows Forms nutzen. Jetzt suche ich schon seit längerem vergeblich eine Lösung, wie ich selbst erstellte Eigenschaften eines User Controls globalisieren kann.

    Ich habe also eine Eigenschaft als String deklariert, mit der der Benutzer des Controls z.B. einen angezeigten Text ändern kann. Bei Forms gibt es jetzt ja die Möglichkeit die Sprache von Standard auf z.B. Deutsch (Deutschland) umzustellen. Wenn ich die Eigenschaft jetzt z.B. bei einem Label ändere und zurück auf die Standard-Sprache wechsle, so wird wieder der ursprüngliche Text angezeigt. Es werden also Resourcen vom Designer angelegt. Bei meinen selbst erstellten Propertys funktioniert dieses Verhalten allerdings nicht.

    Hat jemand evtl. einen Link oder weiß direkt selber, wie ich meine Eigenschaft erweitern muss?

    Vielen, lieben Dank im voraus schon mal.

    Jan@81 schrieb:

    Bei meinen selbst erstellten Propertys funktioniert dieses Verhalten allerdings nicht.
    Der Fachbegriff heißt Lokalisieren, nicht aber globalisieren.
    Dein Control hat eine Property .Localizable Stell die im Designer auf True.
    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!
    Hallo Rod,

    ​Vielen, lieben Dank für Deine Antwort. Ja Du hast recht: Lokalisieren viel mir heute Mittag nicht ein, Sorry.

    ​Das mit der Eigenschaft "Localizable" hatte ich bereits ausprobiert. Leider führt dies nicht zu dem gewünschten Effekt. Ich vermute, dass man mit dieser Eigenschaft feste Texte, welche im Control verwendet werden, lokalisieren kann direkt im Designer.
    ​Was ich ja machen möchte ist, z.B. ein Label im UserControl einzusetzen und die .Text-Eigenschaft des Labels über eine String-Property für den Benutzer des Controls bereitstellen. Wird das fertige Control nun z.B. in der MainForm eingesetzt, so kann der Benutzer die betroffene String-Property ändern. Stellt er nun die Form auf Deutsch, so kann er einen anderen Text eingeben.

    ​Und hier kommt das beschriebene Problem. Irgendetwas fehlt. Momentan habe ich eine ganz einfache Property im UserControl erstellt:

    VB.NET-Quellcode

    1. Public Property ElementTextFkt_1 As String
    2. Get
    3. Return Label1.Text
    4. End Get
    5. Set(value As String)
    6. Label1.Text = value
    7. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("ElementTextFkt_1"))
    8. End Set
    9. End Property

    Jan@81 schrieb:

    Irgendetwas fehlt.
    Irgend jemand muss das Event PropertyChanged abonieren.
    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!
    Danke nochmals für Deine Antwort!

    ​PropertyChanged dient lediglich zur Datenbindung und kann auch weggelassen werden.

    ​Ich beschreibe nochmal das Problem Schritt für Schritt:

    ​1. Ich lege ein neues Projekt an als Control Library (Steuerelement Bibliothek)
    ​2. Nachdem das Projekt erstellt wurde, ist der Designer bereits mit einem Control gestartet. Hier stelle ich die Localizable​ auf True.
    ​3. Hier lege ich ein Label rein.
    ​4. Im Code-Behind lege ich genau die oben beschriebene Property an. (Ohne PropertyChanged)
    ​5. Ich erstelle das Projekt und heraus kommt eine dll
    ​6. Ich lege ein neues Projekt an als Windows Forms Application (In meinem Fall eine Device Application, da ich auf WEC2013 deploye)
    7. Hier füge ich einen Verweis hinzu. Und zwar den zu meiner zuvor erstellten dll.
    8. Ich füge zu meiner Toolbox ebenfalls die dll hinzu und ich erhalte das von mir erstellte UserControl
    ​9. Ich stelle auf der Mainform die Localizable​ Eigenschaft auf True
    10. Ich ziehe das UserControl in meine Form.
    ​11. Ich gebe der selbst erstellten Eigenschaft einen neuen Namen. Der eingegebene Name wird auf dem Control ordnungsgemäß angezeigt.
    12. Ich wechsle auf der Mainform die Sprache von Standard auf Deutsch (Deutschland)
    ​13. Ich gebe der selbst erstellten Eigenschaft einen anderen Namen. Der Name wird wieder angezeigt.
    ​14. Ich wechsle auf der Mainform die Sprache wieder zurück auf Standard.
    ​15. Der eingegebene Name ändert sich aber nicht. Es wurde auch keine Resource angelegt.

    ​Hier ist das Problem. Und ich frage mich, wie dies funktioniert. Ziehe ich ein Label direkt in die Form und wiederhole die Schritte, so funktioniert alles wunderbar. Wie man es im Internet auch findet. Das Control Label muss also irgendetwas in sich haben, was ich zu meinem selbst erstellten Control ebenfalls hinzufügen muss.

    ​Ich hoffe ich konnte das Problem nun etwas näher erläutern.

    ​Nochmals danke Rod!
    @Jan@81 Hast Du die erstellte Ressourcen-DLL dem Hauptprogramm als Verweis hinzugefügt?
    Besser noch:
    Füge das DLL-Projekt der Projektmappe des Hauptprogramms als Projekt hinzu und füge dem Hauptprogramm-Projekt den Verweis auf das Ressourcen-DLL-Projekt, nicht aber auf die DLL hinzu.
    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!
    @RodFromGermany super Idee! Habe ich soeben gemacht. Leider weiterhin ohne Erfolg.

    ​Habe das ganze auch nochmal mit einem neuen Windows-Forms-Projekt mit .NET4.5 ausprobiert, aber selbst hier funktioniert das nicht. Es liegt also auch nicht am SDK des Chipherstellers für .NETCF3.9.
    Auch hier habe ich beide Projekte in eine Projektmappe gelegt und als Verweis das DLL-Projekt genutzt.

    ​Wie bekomme ich denn das Control in meine Toolbox? Hier wähle ich immer mit der rechten Maustaste "Elemente auswählen..." und muss dann ja doch die dll-Ausgabe wählen. Oder liegt hier der Fehler? (Wie schön ist doch WPF :P , da klappt das zumindest und viel einfacher)
    @Jan@81 Kannst Du mal die bereinigte Projektmappe anhängen?
    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!
    @Jan@81 Eine Form localizable zu machen ist was anderes als ein Property localizable zu machen :!:
    1. neutrale Sprache vorgeben, das ist die Sprache, die in die Exe / Dll reingelinkt wird.
      ==> ich hab da englisch USA eingetragen.
    2. Usercontrol Sidebar: Localizable = True
    3. VB.NET-Quellcode

      1. <System.ComponentModel.Localizable(True)> _
      2. Public Property TextAnzeige As String
      3. ' ...
      4. End Property

    4. Form1.de.resx gelöscht (wir nehmen de-DE)
    Feddich.

    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!