Kann ein Objekt in einer Klasse auch später dimensioniert werden? Lokalisierungsproblem EDIT: Auslesen von Sprachdateien

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Kann ein Objekt in einer Klasse auch später dimensioniert werden? Lokalisierungsproblem EDIT: Auslesen von Sprachdateien

    Hallo,

    ich bin neu hier im Forum und habe eine Frage. Ich möchte gerne die Lokalisierung von VB 2010 nutzen und alle Controls usw von einer Form in mehreren Sprachen anlegen. Das Problem ist, dass diese Sprache am Anfang in einer Loginform ausgewählt werden soll. Es gibt eine Hauptform, in der diese Loginform am Anfang aufgerufen wird, und es gibt mehrere Panels (eigene Klassen), die an dieser Hauptform angedockt werden. Das Andocken passiert erst nach dem Login, aber die Dimensionierung (und New()-Aufruf) schon vorher.

    Nun funktioniert die interne Lokalisierung nur, wenn der Konstruktor des jeweiligen Fensters schon die Sprache kennt. D.h. ich muss es irgendwie hinkriegen, dass zuerst das Login passiert und erst danach die anderen Panels erzeugt werden (da kann ich auf die globale Sprachvariable zugreifen und die lokale Sprache im Programm entsprechend ändern).

    Ist es möglich so?

    Die Alternative wäre es mehrere Sprachdateien anzulegen, aber es ist natürlich viel Arbeit und die interne Lokalisierung ist sehr verlockend, weil sie sehr wenig Aufwand bedeutet.

    Vielen Dank im voraus.

    Sonne75

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sonne75“ ()

    Nehm Sprachdateien dann kannst du später welche nachreichen. Zudem ist das kein Aufwand mit Sprachdateien. Du denkst vielleicht du musst jedem Wert/Control einzeln die Übersetzungen zuweisen. Mit einer richtigen rekursiven Funktion kann sich das ganz schnell automatisieren und du kannst einfach Controls neu draufpacken und übersetzen lassen ohne Code beim Übersetzen zu ändern.
    Danke für deine schnelle Antwort. Es sind unterschiedliche Sachen in jedem Panel vorhanden: Comboboxen mit unterschiedlichen Einträgen, Labels usw.
    Leider habe ich wenig Erfahrung mit solchen Sprachdateien, ich hätte jetzt immer nach dem Controlnamen in der Sprachdatei gesucht.

    Könntest du mir ein Beispielcode geben, wie du es meinst?
    So "baue" ich mir die multilingualität:

    Ich erstelle eine Sprachdatei(Bsp-Weise mit dem notepad) ind das ich dann die Namen der Controls bzw. der Texte schreibe und sie mit einen Semelikomma(;) trenne, abspeichern und zum Login Form:
    Erstelle eine neue Methode wie folgt:

    VB.NET-Quellcode

    1. Sub Sprache_Laden(Sprachdatei As String)
    2. Dim R As String = IO.File.ReadAllText(Sprachdatei) 'R als Read; ließt die Sprachdatei ein
    3. Dim A() As String = R.Split(";") 'A als Array; Beinhaltet alle Einträge
    4. 'Control-Namen zuweisen:
    5. Label_Name.Text = A(0) 'Ein Array beginnt bei 0!
    6. Button_MessageName.Text = A(1)
    7. '...
    8. End Sub



    Viel Spaß :)

    PS: Kann man auch für andere Sachen verwenden

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „felipe12305“ ()

    Danke, ich habe eine Funktion "IndexOf(Array, Value)" gefunden, die den Index zurückliefert. Leider habe ich den ersten Tipp missverstanden, ich dachte, die Funktion ReadAllText würde mir schon ein 2D-Array liefern (z.B. "btName1", "btName2", "btName3"; "N1", "N2", "N3"). Da hätte ich nur nach "btName2" suchen können, hätte Index 1 bekommen und hätte mit diesem Index "N2" erhalten.

    Aber diese Funktion liefert nur 1D-Array, wie kann ich eine Tabelle einlesen? Müsste bestimmt auch einfach gehen...
    Ich glaube, ich habe es verstanden.
    Ich verwende StreamReader und da ReadLine. Da habe ich eine Zeile mit 2 Werten (Name des Controls und seine Bezeichnung) als String, die splitte ich mit Split(";") und erhalte ein Array, der ich dem anderen 2D-Array hinzufüge (arr2D[ i ]=arrSplit) und das ganze in einer Do-Schleife, bis die Datei vollausgelesen ist.
    Dann habe ich mein 2D-Array mit je Name und Bezeichnung und kann da drin nach dem Index vom Namen suchen und dadurch seine Bezeichnung dem jeweiligen Control zuweisen.

    Mangafreak1995 schrieb:

    Speicher das doch in ein Dictionary.
    Da ich mich noch in Grundlagen befinde, sagt es mir leider nicht viel.

    @programmer71
    Habe jetzt in dem Beispiel (2D-Array) gelesen, dass mit (arr2D[ i ]= arrSplit) eben kein Array abgelegt wird, sondern der Verweis auf es gespeichert wird. D.h. der nächste Schleifendurchlauf wird den arrSplit ändern und somit auch arr2D-Eintrag vom vorigen Index. Müsste dann manuell zuweisen

    VB.NET-Quellcode

    1. arr2D(i,0)=arrSplit(0)
    2. arr2D(i,1)=arrSplit(1))

    Sollte diesen Thread jemand lesen, würde er sonst nicht richtig umsetzen können...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „sonne75“ ()

    Dann informiere dich doch was ein Dictionary ist. Das wird dir einiges erleichtern.
    Ich habe geschaut, ein Dictionary ist eine Klasse, die Keys und Values hat, d.h. für jede Sprache braucht man ein eigenes Dictionary. Leider habe ich in der Hilfe keine direkte Funktion gefunden, wie man Dictionary in ein File schreibt und daraus liest (außer den Umweg über ; und ReadLine). In LabView heißt es ConfigurationFile: da sind Schlüssel und Werte hinterlegt, in einem File und da liest man daraus, was man braucht. Schon sehr komfortabel. Gibt es sowas nicht in VB?

    Aber dein Vorschlag wäre es, jede Sprachdatei zeilenweise je in ein Dictionary einzulesen? Und statt IndexOf einfach TryGetValue nutzen, wo man als TValue gleich die Texteigenschaft vom Control übergibt?
    Nein, nicht ganz. Du hast ja schon ne Idee mit deiner eigenen Configdatei.

    Quellcode

    1. name1;blabalbal
    2. name2;blabalbalal
    3. name3;blbalbaa

    Das ist jetzt eine deiner Sprachdateien. ZB für Deutsch. Jetzt liest du das Ganze ein via ReadLine, splittest beim ersten Semikolon und fügst dem Dictionary ein Paar zu ( vor dem Semikolon, nach dem Semikolon ). Danach kannst du deine geladene Sprache in dem Dictionary nachgucken. Wie in einem Wörterbuch(eng.: Dictionary) halt.