Simple Klasse zum benutzen von Sprachdateien

    • VB.NET

    Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

      Simple Klasse zum benutzen von Sprachdateien

      Hallo zusammen,
      ich habe mich in letzter Zeit ein bisschen mit XML Dateien in VB.NET beschäftigt und eine kleine Klasse geschrieben, mit der man sein Programm mit Hilfe von Sprachdateien übersetzen kann.

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Xml
      2. Public Class languages
      3. Dim lnghash As New Hashtable
      4. Sub New(Optional ByVal lng As String = "")
      5. Debug.Print("Initializing the language Manager...")
      6. Dim r As XDocument
      7. If lng = "" Then
      8. lng = Globalization.CultureInfo.CurrentUICulture.TwoLetterISOLanguageName
      9. End If
      10. Dim filename As String = Application.StartupPath & "\lng\" & lng & ".xml"
      11. Try
      12. If My.Computer.FileSystem.FileExists(filename) Then
      13. r = XDocument.Load(filename)
      14. Else : r = XDocument.Load(Application.StartupPath & "\lng\en.xml")
      15. End If
      16. Catch es As Exception
      17. MsgBox("The Languagefile could not be found.", MsgBoxStyle.Critical)
      18. Application.Exit()
      19. End Try
      20. For Each e As XElement In r....Elements("string")
      21. lnghash.Add(e.Attribute("name").Value, e.Value)
      22. Debug.Print("Added (" & e.Attribute("name").Value & ", " & e.Value & ") to the Hashtable")
      23. Next
      24. End Sub
      25. Public Function L(ByVal name As String, Optional ByVal Var1 As String = "", Optional ByVal Var2 As String = "", Optional ByVal Var3 As String = "", Optional ByVal Var4 As String = "", Optional ByVal Var5 As String = "", Optional ByVal Var6 As String = "", Optional ByVal Var7 As String = "", Optional ByVal Var8 As String = "", Optional ByVal Var9 As String = "", Optional ByVal Var10 As String = "") As String
      26. Try
      27. Dim text As String = String.Format(lnghash(name), Var1, Var2, Var3, Var4, Var5, Var6, Var7, Var8, Var9, Var10)
      28. Return text
      29. Catch ex As Exception
      30. Debug.Print("The Variable """ & name & """ doesn't exist!")
      31. Return ""
      32. End Try
      33. End Function
      34. End Class


      Die XML Dateien liegen im Ordner /lng relativ zum Programm und heißen z.B. de.xml, fr.xml, en.xml (/lng/de.xml, /lng/en.xml etc.). Die XML-Dateien sehen ungefähr so aus:
      Spoiler anzeigen

      XML-Quellcode

      1. <?xml version="1.0" encoding="ISO-8859-1"?><language> <string name="tool_file">Datei</string> <string name="tool_windows">Fenster</string> <string name="tool_help">Hilfe</string></language>


      Beim initialisieren der Klasse kann eine Sprache angegeben werden:

      VB.NET-Quellcode

      1. Dim l As New languages("de")



      Wenn keine Sprache angegeben wurde, wird die Systemsprache verwendet. Existiert die Systemsprache nicht, wird die Datei en.xml benutzt.

      Über den Befehl

      VB.NET-Quellcode

      1. l.L("tool_help")


      könnt ihr dann den String zu einem bestimmten Schlüsselwort auslesen.

      Ich hoffe, die Klasse gefällt euch und jemand kann sie gebrauchen :)


      Viele Grüße
      Leo Bernard

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

      Nette sache, aber wie kann man es auf Tausende von Menu Items und Forms anwenden??
      so...für den TE habe ich den Sourcecode mal leserlich gemacht:

      VB.NET-Quellcode

      1. Imports System.Xml
      2. Public Class languages
      3. Dim lnghash As New Hashtable
      4. Sub New(Optional ByVal lng As String = "")
      5. Debug.Print("Initializing the language Manager...")
      6. Dim r As XDocument
      7. If lng = "" Then
      8. lng = Globalization.CultureInfo.CurrentUICulture.TwoLetterISOLanguageName
      9. End If
      10. Dim filename As String = Application.StartupPath & "\lng\" & lng & ".xml"
      11. Try
      12. If My.Computer.FileSystem.FileExists(filename) Then
      13. r = XDocument.Load(filename)
      14. Else
      15. r = XDocument.Load(Application.StartupPath & "\lng\en.xml")
      16. End If
      17. Catch es As Exception
      18. MsgBox("The Languagefile could not be found.", MsgBoxStyle.Critical)
      19. Application.Exit()
      20. End Try
      21. For Each e As XElement In r.Elements("string")
      22. lnghash.Add(e.Attribute("name").Value, e.Value)
      23. Debug.Print("Added (" & e.Attribute("name").Value & ", " & e.Value & ") to the Hashtable")
      24. Next
      25. End Sub
      26. Public Function L(ByVal name As String, Optional ByVal Var1 As String = "", Optional ByVal Var2 As String = "", Optional ByVal Var3 As String = "", Optional ByVal Var4 As String = "", Optional ByVal Var5 As String = "", Optional ByVal Var6 As String = "", Optional ByVal Var7 As String = "", Optional ByVal Var8 As String = "", Optional ByVal Var9 As String = "", Optional ByVal Var10 As String = "") As String
      27. Try
      28. Dim text As String = String.Format(lnghash(name), Var1, Var2, Var3, Var4, Var5, Var6, Var7, Var8, Var9, Var10)
      29. Return text
      30. Catch ex As Exception
      31. Debug.Print("The Variable """ & name & """ doesn't exist!")
      32. Return ""
      33. End Try
      34. End Function
      35. End Class


      und dir BeefyX kann ich nur sagen: You FAIL!
      junge....wieso arbeitest du mit GoTO? Das ist der schlechteste Programmierstil den es überhaupt gibt. Ich könnte den Code jetzt besser machen, aber ich habe keinen Bock darauf ( aber die Zeit hätte ich^^ ).
      wat? Ich hab den Code ja nicht gemacht.
      GoTo wurde irgendwann mal erfunden, als es Methoden, Klassen und Namensräume noch nicht gab.
      Heutzutage gibt es das alles und rate mal warum! Es ist schneller, einfacher und performanter.
      Außerdem erhöht das nicht verwenden die Lesbarkeit da man nicht die Sprungmarke suchen muss.
      Es ist schneller, einfacher und performanter.

      Falsch es ist nur Übersichtlicher und einfacher...
      An der Geschwindigkeit ändert sich nichts, beides mal wird an eine Position gesprungen...

      @BeefyX: Dafür gibt es Continue ;)
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      @BeefyX: Es ist keine Funktion sondern ein Schlüsselwort. (Ich würde es sogar fast einen Operator nennen).

      @TE: Ich würde nicht den "zwei Buchstaben Iso-Wert" nehmen, sondern die "Landabkürzung-Sprachabkürzung" (Weiß grad nicht wie das heißt ... auch irgendein ISO-Wert. Für die Klasse würde ich noch eine Funktion/Prozedur empfehlen, die eine Form durchlaufen kann und alle angegebenen Namen überprüft, ob das Control auch existiert und dann den Text ändern. Evtl. das gleiche auch für Properties für Fehlermeldungen ?