Multilanguage System [Version 2.2]

    • Release

    Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von Fibonacci.

      Multilanguage System [Version 2.2]

      Hallo,

      Beschreibung
      In diesem Thread möchte ich euch gerne mein Multilanguage-System vorstellen. Mit der Multilanguage Klasse kann man ganz einfach und simpel Programme schreiben, die mehrere Sprachen unterstützen.

      Wie funktioniert es?
      Zunächst binded man die Klasse in das Projekt ein. Dies geht ganz einfach, indem man die Klasse (.vb) im Projektmappenfenster auf den Projekttitel dropt. (Siehe bild im anhang)

      Man erstellt eine Multilanguage-Datei (eine ganz einfache und normale .txt Datei). Diese ist wie folgt aufgebaut:

      Quellcode

      1. 1.Zeile ist Defaultsprache also z.B "sprache2"
      2. ;[sprache
      3. Bezeichner=wert
      4. Bezeichner2=wert
      5. Bezeichner3=wert
      6. ];
      7. ;[sprache2
      8. Bezeichner=wert
      9. Bezeichner2=wert
      10. Bezeichner3=wert
      11. ];
      12. ;[sprache3
      13. Bezeichner=wert
      14. Bezeichner2=wert
      15. Bezeichner3=wert
      16. ];


      wobei die Anzahl der Sprachen und Bezeichner natürlich unbegrenzt ist.

      Die Daten werden mit Funktionen ausgelesen; dazu später mehr.

      Beispiel
      Eine einsatzfählige Multilanguagedatei könnte so aussehen: (Ich nehme für das Beispiel die drei Sprachen Deutsch, English und Französisch)

      Quellcode

      1. Deutsch
      2. ;[Deutsch
      3. welcome=Guten Tag!
      4. messageboxtitle=Dies ist ein Programm
      5. ];
      6. ;[Englisch
      7. welcome=Good Day!
      8. messageboxtitle=This is a Program
      9. ];
      10. ;[Franzoesisch
      11. welcome=Bonjour
      12. messageboxtitle = C'est une Programme
      13. ];


      mit
      ;[sprache
      fängt man mit einer Sprache an

      und mit
      ];

      schliesst man sie.

      In der 1. Zeile einer ML-Datei steht die Sprache, die die App laden soll. Wenn der Benutzer die Sprache über den Sprachendialog ändert, ändert er die 1. Zeile.

      So, nun schreiben wir unser kleines Programm. Wir nehmen einfach mal an, wir hätten jetzt einen französischsprechenden Benutzer.


      Im Form_Load Event intialisieren wir Multilanguage; wir geben also an wo die Datei liegt und welche Sprache wir auslesen wollen.

      VB.NET-Quellcode

      1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      2. 'Multilanguage Initialisieren
      3. Dim ml As New MultiLanguage
      4. 'Dateipfad inklusive Dateiname und Endung
      5. ml.setFile("ml_text.txt", True)
      6. End Sub

      Wenn der letzte Parameter von setFile() True ist, wird die gespeicherte-/standard-sprache benutzt. Wenn er False ist (oder nicht angegeben ist), muss man mit ml.setLang("sprache") die Sprache angeben.

      Und nun können wir mithilfe von getML() den Wert eines Bezeichners (in unserem Fall "welcome") auslesen und unsere Willkommensmessagebox aufrufen.

      VB.NET-Quellcode

      1. ' Unsere Willkommensmessagebox anzeigen
      2. MessageBox.Show(ml.getML("welcome"), ml.getML("messageboxtitle"))


      Variable Texte

      Auch kann man Variable Texte aus der Datei lesen. Zum Beispiel eine Solche Datei:

      Quellcode

      1. Deutsch
      2. ;[Deutsch
      3. date = Das aktuelle Datum: %var
      4. ];
      5. ;[Englisch
      6. date = Today's date: %var
      7. ];


      getML() hat optionale Parameter namens sVariables. In diesen Strings sind Daten drin. Die "%var" werden mit diesen Daten ersetzt.

      Mit der oben gezeigten Datei würde es so aussehen:

      VB.NET-Quellcode

      1. Dim ml As New MultiLanguage
      2. ml.setFile("C:\Users\mottzi\Desktop\ML_TEST.txt") ' hier kann man auch den letzten Parameter "True" stellen, damit die gespeicherte Sprache / Standardsprache automatisch geladen wird (aus der MLDATEI ), dann ist setLang() unnötig.
      3. ml.setLang("en")
      4. MsgBox(ml.getML("date", My.Computer.Clock.LocalTime().ToString))


      Es können auch mehrere %var vorkommen, jedes %var braucht auch einen Paramater
      ein Beispiel:

      Quellcode

      1. Deutsch
      2. ;[Deutsch
      3. date = Das aktuelle Datum: %var. %var
      4. ];
      5. ;[Englisch
      6. date = Today's date: %var. %var
      7. ];


      dann muss getML() so aussehen: getML("schlüssel", "var1", "var2").

      Die Anzahl von Variablen ist auch unbegrenz. Wenn man 5 %var hat sieht getML() so aus: getML("schlüssel", "var1", "var2", "var3", "var4", "var5"....)


      Zeilenumbrüche

      Zeilenumbrüche sind nun mit "%n" (newline) möglich. z.B:

      Quellcode

      1. Deutsch
      2. ;[Deutsch
      3. date = Heute ist%n ein schöner Tag!
      4. ];
      5. ;[Englisch
      6. date = Today it is%n a nice day!
      7. ];


      Kommentare

      Kommentare macht man in einer ML-Datei mit "//". Entweder sind Kommentare am Ende einer Zeile, order ganz auf einer eigenen Zeile.
      Die 1. Zeile darf kein Kommentar sein.

      Methoden

      • Mit setFile() geben wir an, wo sich die Datei befindet
      • Mit setLang() geben wir an, welche Sprache wir auslesen wollen
      • Mit getML() lesen wir den Wert eines Bezeichners aus
      • Mit getLangCount() können wir herausfinden, wieviele Sprachen unterstützt werden
      • Mit getLangs() können die Sprachen von einer ML-Datei ausgelesen werden. Returnt eine List(Of String)
      • Mit getVarCount() kann man herausfinden wieviele "%var" ein String hat.
      • Mit formLangSelect() kann man den Sprache-Speichern Dialog aufrufen
      • mit getSavedLang() kann man die Default/Gespeicherte Sprache herausfinden.


      Vorteile?
      Wenn man dieses System benutzt, ist es sehr leicht viele Sprachen anzubieten. Man könnte beim veröffentlichen der Beta oder so, die User auffordern die ML-Datei zu übersetztn. So bekommt man in möglichst kurzer Zeit, viele Sprachen.

      Bemerkungen
      Natürlich muss man selbst einen "Sprachen Dialog" programmieren, damit der User auswählen kann, welche Sprache er möchte. Vielleicht implementiere ich das noch zusätzlich in die Klasse.

      Credits

      Das Alliedmodders-Team benutz für sein AMXX Plugin ein ähnliches ML-System. Ich finde dieses System gut, darum wollte ich es für VB "nachprogrammieren".

      Daten
      IDE: vb 08
      Sprache: vb.net 3.5 (vlt geht auch 2.0, muss ich später nachgucken^^)


      [*]Hast du sonst noch Ideen? Bitte Posten :)



      Wenn ihr noch Ideen habt, was ich noch vergessen habe oder noch reinpacken kann einfach sagen. Ebenfalls würde ich mich über Kommentare und Kritik freuen.

      Auf einen kleinen Verweis in euren Programmen würde ich mich natürlich freuen; freiwillig of course :thumbsup:
      MFG Mottzi


      [CHANGELOG]

      Version 1.1:
      1. Variable Daten möglich (was ist das? Siehe oben.)
      Version 1.2:
      1. Zeilenumbrüche möglich (Siehe oben.)
      2. Kommentare möglich (Siehe oben)
      Version 1.3:
      1. Variable Daten einsetzten nun besser (verscheidene Paramater anstatt "par1;par2;par3". Mehr siehe oben)
      2. Kommentarzeilen nun möglich
      Version 2.0
      1. Standardsprache hinzugefügt (1. Zeile = Standardsprache... Mehr Infos siehe Beispiele)
      2. Sprachenauswähl-Dialog hinzugefügt (Siehe oben)
      3. Funktion hinzugefügt:
        Function getSavedLang(Optional ByVal sFile As String = "") As String
        Function getLangs(ByVal sFile As String) As List(Of String)
      4. setFile hat nun noch einen Parameter. Wenn man den letzten Parameter (Boolean) auf True setzt, liesst er die gespeicherte Sprache autmatisch ein, und man muss nicht mit setLang arbeiten.
      5. Code verbessert
      Version 2.1
      1. Der Sprachenauswähldialog wurde gefixxt und verbessert.
      Version 2.2
      1. Code Verbessert
      Bilder
      • bild.jpg

        50,89 kB, 536×516, 387 mal angesehen
      • languagesdialog.JPG

        14,21 kB, 272×143, 407 mal angesehen
      Dateien
      "I think Microsoft has abused the Windows brand so much that it has lost its cachet."
      Paul Thurrott

      Dieser Beitrag wurde bereits 47 mal editiert, zuletzt von „mottzi“ () aus folgendem Grund: Neue Version

      Setz mal lieber mich in die Credits. Das System ist in der Form meine Idee. Wie hast du eigentlich erfaren, das in der neuen, bis jetzt nicht veröffentlichten, Variante der Languages.dll so ein ähnliches System zum einsatz kommt?
      Ideen kann man nicht patentieren oder einen Anspruch darauf legen.Sonst gaebe es nur eine Firma die Handys, Navis etc. herstellen duerfte.

      Btt: hab jetzt nicht getestet aber ich finde die Umsetzung gelungen, da man die dll leicht versteht und somit verwenden kann.

      m9898 schrieb:

      Setz mal lieber mich in die Credits. Das System ist in der Form meine Idee. Wie hast du eigentlich erfaren, das in der neuen, bis jetzt nicht veröffentlichten, Variante der Languages.dll so ein ähnliches System zum einsatz kommt?

      Ehm, entschuldigung, aber wozu denkst du setzte ich Credits? Damit später andere kommen und mir sagen, dass sie falsch sind? Nein.
      Wie im Anfangspost zu lesen ist, habe ich die Idee von Alliedmodders - von nirgendwo anders. Ob jetzt du diese Idee auch hast, kein Plan.

      Und falls es dir noch niemand gesagt hat, ich mach es jetzt: Diese Art aka "Setzt mal lieber mich in die Credits" empfinde ich als Vorlaut und vielleicht auch als bissle frech. :D
      "I think Microsoft has abused the Windows brand so much that it has lost its cachet."
      Paul Thurrott

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

      In der Tat sehr komischer, lustiger Zufall. Doch wie du bereits geschrieben hast, ist deine languages.dll noch gar nicht veröffentlicht orden, also kann ich ja davon gar nichts wissen :huh:
      "I think Microsoft has abused the Windows brand so much that it has lost its cachet."
      Paul Thurrott
      löl, XD ich bemerke es erst jetzt, haha. Keine Anung was mit mir los war. Das passiert wenn man müde ist )=
      "I think Microsoft has abused the Windows brand so much that it has lost its cachet."
      Paul Thurrott

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

      mottzi schrieb:

      Natürlich muss man selbst einen "Sprachen Dialog" programmieren, damit der User auswählen kann, welche Sprache er möchte. Vielleicht implementiere ich das noch zusätzlich in die Klasse.
      Oder man verwendet es so:

      VB.NET-Quellcode

      1. Dim ml As New MultiLanguage
      2. ml.setFile("test.txt")
      3. ml.setLang(System.Globalization.CultureInfo.CurrentUICulture.ToString)

      Dann muss man die Sprachen nur richtig benennen. Also "de-DE" usw

      Skybird schrieb:

      Das sind ja Ubisoftmethoden hier !

      EiPott: Stimmt, INI ist auch fast gleich. Es werden wahrscheinlich in nächster Zeit neue Funktionen kommen, damit meine Klasse sich einwenig von Ini abhebt. :P
      "I think Microsoft has abused the Windows brand so much that it has lost its cachet."
      Paul Thurrott

      Dodo schrieb:

      Finde das System nicht besonders gut, ich würde dir ja zu XML raten. Wie macht man mehrzeiligen Text? Das selbe Problem gibts bei INI auch.

      Danke für die Idee

      *** Version 1.2 ***
      Changes: Siehe oben
      "I think Microsoft has abused the Windows brand so much that it has lost its cachet."
      Paul Thurrott
      ja, xml wäre besser. ansonnsten ne super Idee.

      aber hier:

      VB.NET-Quellcode

      1. getML("schlüssel", "var1;var2")


      wäre es sauberer das nicht mit einem string "var1;var2" zu lösen, sondern mit einem array aus mehreren strings.

      so wird das meines wissens doch normalerweise gemacht, wenn man eine unbegrenzte anzahl an argumenten ermöglichen will.
      (bin mir aber grad nich ganz sicher, aaber icvh glaub wenn man ein array als letztes argument nimmt, dann kann man die argumente so übergeben:

      VB.NET-Quellcode

      1. getML("schlüssel", "var1", "var2")

      kann aber auch sein, dass ich das falsch in erinnerung hab...)
      :P Mfg Aligator :P
      Meinst du, ich soll eine .dll machen? Ich weiss nicht, ich finde dafür hat die Klasse noch zu wenig Funktionen...
      "I think Microsoft has abused the Windows brand so much that it has lost its cachet."
      Paul Thurrott