Sprachmodul

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

PhillipK

Betreff: Sprachmodul

BeitragDo, Jan 10, 2013 2:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu!

Ich habe grade beim einbauen eines features etwas zu weit ausgeholt und heraus kam ein TLanguage type, welches einem ermöglicht, sprachdateien zu laden und einen string zu parsen.

Die anwendung ist simpel:
Code: [AUSKLAPPEN]
TLanguage.LoadLanguage(file:String) - lädt eine Sprachdatei. Die Sprach-TMap wird immer geleert, sollte man eine datei laden. Anmerkungen hierzu im Code, Rem block.

TLanguage.LoadSpecial(file:String) - lädt spezielle strings. Die Specialliste wird nicht geleert.

TLanguage.SetKeyword(key:string,value:String) - setzt ein keyword (zb wird FIRE mit Leertaste assoziiert.

TLanguage.Get:String(key:String) - holt den assoziierten Wert aus den TMaps oder returnt "$"+key, um einen fehler aufzuzeigen.

TLanguage.Translate:String(line:String, indikator:string = "$") - parset einen String.  Indikator diehnt als "einleitung" für zu übersetzende objekte. Wird ein indikatorzeichen gefunden, ist das hintenanstehende wort ein Keyword, welches ersetzt wird.


Geteilt ist das ganze in 2 tmaps, um einmal "spezielle" keywords zu haben, die man ingame schnell austauscht.
Als beispiel: Man hat eine Tastenbelegung über optionen und möchte im tutorial immer den aktuellen Feuer-knopf anzeigen.
Der tutorial text sagt zb aus: "Drücke $FIRE um zu schießen."
Ändert man nun die Tastenbelegung, kann man TLanguage.SetKeyword("FIRE", NewKey()) setzen - als beispiel "Leertaste".


Hier der Code, klein handlich und unscheinbar. dennoch brauchbar:
BlitzMax: [AUSKLAPPEN]
SuperStrict

'TLanguage.LoadLanguage(file:String) um allgemeine, sprachspezifische sachen zu laden :)
'zum testen nur was kleines handgeschriebenes:

TLanguage.SetKeyword("HELLO", "Hallo")
TLanguage.SetKeyword("WORLD", "Welt")

Local test1:String = TLanguage.Translate("$HELLO $WORLD! Das ist ein test :)")
Print("input: $HELLO $WORLD! Das ist ein test :)")
Print("output: " + test1 + "~n")

'natürlich könnte man auch ganze sätze benutzen :)
TLanguage.SetKeyword("GREETING_1", "Hallo Welt! Das ist ein weiterer test Wink")
Local test2:String = TLanguage.Translate("$GREETING_1")
Print("input: $GREETING_1")
Print("output: " + test2)

Rem
Anmerkungen:

Ein indikator ist wählbar. Als Default ist $ angegeben.
Dieser indikator + eine beliebige folge von zeichen (a-z, A-Z, unterstrich ( _ ), 0 - 9) werden als Schlagwort interpretiert.

Eine datei die geladen werden kann ist immer im folgenden schema aufgebaut:
key = value
key2 = value2
...
wobei zu beachten ist, das momentan noch groß/kleinschreibung unterstützt wird.

Es ist möglich, eigene Keywords mit SetKeyword() einzufügen. Dies habe ich eingebaut, wenn men zb den indikator $FIRE mit einem Tasten-namen interpretieren möchte:

Beispiel:
TLanguage.SetKeyword("FIRE", "Leertaste")

"Drücke $FIRE zum schießen" wird zu "Drücke Leertaste zum schießen."


Wird eine dateit mit LoadLanguage() geladen, wird die bisherige sprach-datenbank gelöscht. Dies diehnt dem zweck, on-the-fly die sprache zu ändern (von Deutsch zu Englisch als beispiel)
Zwar würden in der Tmap eh sämtliche keywörter überschrieben werden, doch evtl hat man das ein oder andere vergessen zu übersetzen. Für diesen fall soll nicht einfach das einer anderen sprache zurückgegben werden,
sondern $KEY, damit der Programmierer sofort sieht, was falsch ist.
end rem



Type TLanguage
Global list:TMap = CreateMap()
Global special:TMap = CreateMap()

Function LoadLanguage(file:String)
Local stream:TStream = ReadFile(file)
If stream Then
list.Clear()
While Not Eof(stream)
Local l:String = ReadLine(stream)
Local p:Int = l.Find("=")
Local part1:String = Trim(l[..p])
Local part2:String = Trim(l[p + 1..])

list.Insert(part1, part2)
Wend
stream.Close()
EndIf
End Function
Function LoadSpecial(file:String)
Local stream:TStream = ReadFile(file)
If stream Then
While Not Eof(stream)
Local l:String = ReadLine(stream)
Local p:Int = l.Find("=")
Local part1:String = Trim(l[..p])
Local part2:String = Trim(l[p + 1..])

special.Insert(part1, part2)
Wend
stream.Close()
EndIf
End Function

Function SetKeyword(key:String, value:String)
special.Insert(key,value)
End Function

Function Get:String(key:String)
If list.Contains(key) Then Return String(list.ValueForKey(key))
If special.Contains(key) Then Return String(special.ValueForKey(key))
Return "$" + key
End Function
Function Translate:String(line:String, indicator:String = "$")
If Len(indicator) = 0 Then Return line

Local tmp:String = ""
Local a:Int = 0
For Local i:Int = 0 Until Len(line)
If line[i] = indicator[0] Then

tmp:+line[a..i]
'indicator gefunden
a = i + 1
While a < Len(line)
If (line[a] >= 65 .. 'größer gleich großes A
And line[a] <= 90) .. 'kleiner gleich großez Z
Or (line[a] >= 97 .. 'oder größer gleich kleines a
And line[a] <= 122) .. 'und kleiner gleich kleines z
Or (line[a] = 95) .. 'oder gleich unterstrich ( _ )
Or (line[a] >= 48 .. 'oder größer gleich 0 (null)
And Line[a] <= 57) Then 'und kleiner gleich 9 (neun)

a:+1

Else
Exit 'wenn ein anderes zeichen da ist, aufhören.
EndIf
Wend

Local part:String = line[i + 1..a]

Local toInsert:String = Self.Get(part)

If Len(toInsert) > 0 Then
tmp:+toInsert
End If

End If
Next
tmp:+line[a..]

Return tmp
End Function
End Type

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group