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] [EINKLAPPEN] 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] [EINKLAPPEN] SuperStrict
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")
TLanguage.SetKeyword("GREETING_1", "Hallo Welt! Das ist ein weiterer test ") Local test2:String = TLanguage.Translate("$GREETING_1") Print("input: $GREETING_1") Print("output: " + test2)
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] a = i + 1 While a < Len(line) If (line[a] >= 65 .. And line[a] <= 90) .. Or (line[a] >= 97 .. And line[a] <= 122) .. Or (line[a] = 95) .. Or (line[a] >= 48 .. And Line[a] <= 57) Then a:+1 Else Exit 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
|