Feedback

VB - Klasse für mehrsprachige Programme

Veröffentlicht von am 10.12.2006
(2 Bewertungen)
Mit dieser Klasse kann man komfortabel selbst angelegte Sprachdateien im INI Format auslesen.

Dazu erstellt man eine Datei im INI Format mit Sektionen und Keys, also z.B. so:

[SektionA]
001=Hallo Welt!
002=Programm schließen
003=Hilfe anzeigen...

Mit der Klasse kann man nun als Eigenschaft oder direkt diese Sektion angeben (SektionA) und dann einen gewünschten Key auslesen z.B. Key "001" und dann bekommt man den entsprechenden String zurück.

Man kann aber noch Zeilenumbrüche und Variablenplatzhalter im String einbauen die dann von der Klasse entsprechend verarbeitet werden. Hier ein Beispiel:

[SektionB]
001=Meine erste Variable lautet: %1. Jetzt der Zeilenumbruch\nUnd das ist die zweite Variable: %2

Der Delimeter "\n" ist in der Klasse schon als Standard festgelegt, kann aber noch geändert werden. Wenn man nun den String mit den Platzhaltern aufrufen will, ausgefüllt mit unseren beiden Variablen dann kann man wie folgt vorgehen:

ReadLine
("C:\Sprachdatei.lng","SektionB","001","","\n",Var1,Var2)


Die Variablen Var1 und Var2 können durch eigene ersetzt werden. Die erste Variable wird dann im String an der Stelle "%1" geschrieben und die zweite Variable wird an der Stelle "%2" im String geschrieben.

Dort wo sich der Zeilenumbruchsidentifizierer befindet, also "\n", dort wird dann auch ein Zeilenumbruch eingefügt (vbNewLine).
Public Class MultiLanguage
    Private mSection As String = ""
    Private mDefault As String = ""
    Private mLineBreak As String = "\n"

    Private INI As New MyINI

    Public Property Section() As String
        Get
            Section = mSection
        End Get
        Set(ByVal Value As String)
            mSection = Value
        End Set
    End Property

    Public Property DefaultString() As String
        Get
            DefaultString = mDefault
        End Get
        Set(ByVal Value As String)
            mDefault = Value
        End Set
    End Property

    Public Property LineBreak() As String
        Get
            LineBreak = mLineBreak
        End Get
        Set(ByVal Value As String)
            mLineBreak = Value
        End Set
    End Property

    Sub New(ByVal FileName As String)
        INI.INIFile = FileName
        INI.Read()
    End Sub

    Public Sub Refresh(ByVal FileName As String)
        INI.INIFile = FileName
        INI.Read()
    End Sub

    ''' <summary>
    ''' Diese Funktion ließt eine bestimmte Zeile aus der Sprachdatei heraus.
    ''' Die Eigenschaften Path und Section müssen hierfür schon vorher festgelegt sein.
    ''' </summary>
    ''' <param name="LineID">Die Zeilen ID die ausgelesen werden soll</param>
    ''' <param name="PlaceHolderVars">Die Variablen für die Platzhalter im String</param>
    Public Function GetLine(ByVal LineID As String, ByVal ParamArray PlaceHolderVars() As String) As String
        GetLine = GetLine(mSection, LineID, mDefault, mLineBreak, PlaceHolderVars)
    End Function

    ''' <summary>
    ''' Diese Funktion ließt eine bestimmte Zeile aus der Sprachdatei heraus.
    ''' Hierfür müssen keine Eigenschaften vorher festgelegt worden sein da man diese alle hier angeben muss.
    ''' </summary>
    ''' <param name="Section">Die Sektion in der sich der auszulesende String befindet</param>
    ''' <param name="Key">Der Key der Zeile der ausgelesen werden soll</param>
    ''' <param name="Default">Ein Defaultwert der zurückgegeben wird falls die auszulesende Zeile nicht existiert</param>
    ''' <param name="LineBreak">Ein String der als Zeilenumbruchidentifikation dient z.B.: \n</param>
    ''' <param name="PlaceHolderVars">Die Variabeln die durch die Platzhalter im String ersetzt werden sollen (%1 bis %X...)</param>
    Public Function GetLine(ByVal Section As String, ByVal Key As String, ByVal [Default] As String, ByVal LineBreak As String, ByVal ParamArray PlaceHolderVars() As Object) As String
        Try
            Dim Parameters() As String
            Dim Value As String = ""

            Value = INI.GetINIValue(Section, Key)

            'Platzhalter suchen (%1, %2, %3 ...) und Variablen aus dem Paramter Array einfügen
            'Als erstes den String nach % splitten
            Parameters = Split(Value, "%")
            'Dann prüfen ob Parameter angabe mit anzahl der Platzhalter übereinstimmt. Wenn OK dann weiter
            If Parameters.Length = PlaceHolderVars.Length + 1 Then
                For i As Integer = 0 To Parameters.Length - 2
                    Value = Value.Replace(("%" & i + 1).ToString, (PlaceHolderVars(i)).ToString)
                Next i
            Else
                Throw New Exception("Parametercount doesn't match to placeholdercount!")
            End If

            'Alles fertig und weiter gehts mit den Zeilenumbrüchen
            'Falls kein Delimeter angegeben wurde dann den Wert übergeben und beenden
            If mLineBreak = "" Then
                Return Value
            End If

            'Zeilenumbrüche hinzufügen
            Value = Value.Replace(LineBreak, vbNewLine)

            Return Value
        Catch ex As Exception
            Return [Default]
        End Try
    End Function
End Class
Abgelegt unter Sprache, Multilanguage.

2 Kommentare zum Snippet

TAiS46 schrieb am 12.10.2008:
Funktioniert irgendwie nicht.
Habe es eingebungen mit:
Dim language As New MultiLanguage
Msgbox(language.ReadLine("C:\Sprachdatei.lng","SektionB","001","","\n","test1","test2"))

Datei existiert und alles ok, Fehler wird auch nicht ausgegeben, was ist das Problem?
TAiS46 schrieb am 13.10.2008:
Zeile 98 muss anders lauten!

If Parameters.Length - 1 = PlaceHolderVars.Length Then
 

Logge dich ein, um hier zu kommentieren!