Für mein Spiel entwickelt, und fürs Codearchiv angepasst. Meine Übersetzungsklasse "TTranslation". Und was kann man damit nun machen? Man kann Übersetzungsteile definieren (Ein Code und dessen Übersetzung), und diese später Rück-Translaten lassen. Das wird dann interessant, wenn man während dem coding nur die Codes benutzt, weil der dann dort auftauchende Code immer davon abhängig ist was für eine "Translation" man gerade geladen hat.
Um Rechenzeit zu sparen, können Translationteile in sog. TranslationGroups eingeteilt werden. Das spart bei vielen Translations sehr viel Suchzeit. Außerdem kann man damit in Verbindung von Translations in Translations (Siehe Beispiel 2) allerlei interessantes Zeugs anstellen.
Die Befehle im Überblick:
BlitzMax: [AUSKLAPPEN] [EINKLAPPEN]
Das eigentliche Include
BlitzMax: [AUSKLAPPEN] [EINKLAPPEN]
SuperStrict
Type TTranslation Global TranslationMap:TMap = CreateMap() Global FileLoaderStream:TStream Field TranslationGroup:TTranslationGroup Field Code:String Field Content:String Function Create:TTranslation(_Code:String , _Content:String , _TranslationGroupObject:Object , Overwrite:Byte = False) If String(_TranslationGroupObject) Or TTranslationGroup(_TranslationGroupObject) Or _TranslationGroupObject = Null If String(_TranslationGroupObject) Then _TranslationGroupObject = TTranslationGroup.FindTranslationGroup(String(_TranslationGroupObject)) Else Throw "Function call with INVALID parameter" EndIf If _Code = "" DebugLog "ERROR: Function call with EMPTY parameter" Return Null EndIf Local _Translation:TTranslation = TTranslation.FindTranslation(_Code , _TranslationGroupObject , True , True) If Not _Translation _Translation = New TTranslation MapInsert(_Translation.TranslationMap , _Code , _Translation) _Translation.Code = _Code _Translation.Content = _Content ElseIf Overwrite = True _Translation.Code = _Code _Translation.Content = _Content EndIf _Translation.ChangeTranslationGroup(_TranslationGroupObject) Return _Translation End Function Method Remove() MapRemove(Self.TranslationMap , Self.Code) If Self.TranslationGroup MapRemove(Self.TranslationGroup.TranslationMap , Self.Code) EndIf End Method Function FindTranslation:TTranslation(_Code:String , _TranslationGroupObject:Object = Null , SearchOverride:Byte = 1 , NoDebuglog:Byte = False) If String(_TranslationGroupObject) Or TTranslationGroup(_TranslationGroupObject) Or _TranslationGroupObject = Null If String(_TranslationGroupObject) Then _TranslationGroupObject = TTranslationGroup.FindTranslationGroup(String(_TranslationGroupObject)) Else Throw "Function call with INVALID parameter" EndIf Local testvar:String = String(_TranslationGroupObject) Local testvar2:TTranslationGroup = TTranslationGroup(_TranslationGroupObject) Local _Translation:TTranslation If TTranslationGroup(_TranslationGroupObject) _Translation = TTranslation(MapValueForKey(TTranslationGroup(_TranslationGroupObject).TranslationMap , _Code)) If _Translation Then Return _Translation If SearchOverride = 0 If Not NoDebuglog Then DebugLog "WARNING: Cant find " + Chr(34) + _Code + Chr(34) + " in " + Chr(34) + TTranslationGroup(_TranslationGroupObject).Name + Chr(34) + "-Group -> Searching in Global-Group" Return TTranslation.FindTranslation(_Code) Else If Not NoDebuglog Then DebugLog "WARNING: Cant find " + Chr(34) + _Code + Chr(34) + " in " + Chr(34) + TTranslationGroup(_TranslationGroupObject).Name + Chr(34) + "-Group -> Returning Null" Return Null EndIf ElseIf SearchOverride <> 2 _Translation = TTranslation(MapValueForKey(TTranslation.TranslationMap , _Code)) If _Translation Then Return _Translation If Not NoDebuglog Then DebugLog "WARNING: Cant find " + Chr(34) + _Code + Chr(34) + " in " + Chr(34) + "Global" + Chr(34) + "-Group -> Returning Null" Return Null Else If Not NoDebuglog Then DebugLog "HINT: No _TranslationGroupObject given and Global-Search disabled (SearchOverride = 2) - Cant search! -> Returning Null" Return Null EndIf End Function Function CodeInUse:Byte(_Code:String , _TranslationGroup:TTranslationGroup = Null , SearchOverride:Byte = 1) If TTranslation.FindTranslation(_Code , _TranslationGroup , SearchOverride , True) Then Return True Else Return False End Function Function CountTranslations:Int() Local TranslationCount:Int For Local count:Object = EachIn MapValues(TTranslation.TranslationMap) TranslationCount:+1 Next Return TranslationCount End Function Function DecodeTranslation:String(Translation:TTranslation) Local TranslationString:String = Translation.GetContent() Local _TranslationString:String Repeat Local pos:Int = Instr(TranslationString , "%" , 1) If pos Local pos2:Int = Instr(TranslationString , "%" , pos+1) If pos2 = 0 Then pos2 = Len(TranslationString) + 1 _TranslationString:+ Left(TranslationString , pos - 1) TranslationString = Mid(TranslationString , pos) Select Mid(TranslationString , 2 , pos2 - pos - 1) Case "" _TranslationString:+ "%" Case "groupname","Groupname","GroupName" Local TranslationGroup:TTranslationGroup = Translation.GetTranslationGroup() Local TranslationGroupName:String = "Global" If TranslationGroup Then TranslationGroupName = TranslationGroup.GetName() _TranslationString:+TranslationGroupName Default Local _Translation:TTranslation = TTranslation.FindTranslation(Mid(TranslationString , 2 , pos2 - pos - 1) ) If _Translation _TranslationString:+ _Translation.Content Else _TranslationString:+ Mid(TranslationString , 1 , pos2 - pos + 1) EndIf End Select TranslationString = Mid(TranslationString , pos2 - pos + 2) Else _TranslationString:+ TranslationString Exit EndIf Forever Return _TranslationString End Function Method ChangeTranslationGroup(_TranslationGroupObject:Object = Null) If String(_TranslationGroupObject) Or TTranslationGroup(_TranslationGroupObject) Or _TranslationGroupObject = Null If String(_TranslationGroupObject) Then _TranslationGroupObject = TTranslationGroup.FindTranslationGroup(String(_TranslationGroupObject)) Else Throw "Function call with INVALID parameter" EndIf If Self.TranslationGroup Then MapRemove(Self.TranslationGroup.TranslationMap , Self.Code) Self.TranslationGroup = TTranslationGroup(_TranslationGroupObject) If Self.TranslationGroup Then MapInsert(Self.TranslationGroup.TranslationMap , Self.Code , Self) End Method Method GetCode:String() Return Self.Code End Method Method GetTranslationGroup:TTranslationGroup() Return Self.TranslationGroup End Method Method GetContent:String() Return Self.Content End Method Method SetContent(_Content:String) Self.Content = _Content End Method Function FileLoader_LoadFile:TMap(url:Object) If TTranslation.FileLoaderStream Then CloseStream TTranslation.FileLoaderStream ; TTranslation.FileLoaderStream = Null TTranslation.FileLoaderStream = OpenStream(url , True , False) If TTranslation.FileLoaderStream While Not Eof(TTranslation.FileLoaderStream) TTranslation.FileLoader_Read() Wend Else Throw "Tried to read translation, but stream isnt open" EndIf CloseStream TTranslation.FileLoaderStream ; TTranslation.FileLoaderStream = Null Return TTranslation.TranslationMap End Function Function FileLoader_SaveFile(url:Object) If TTranslation.FileLoaderStream Then CloseStream TTranslation.FileLoaderStream ; TTranslation.FileLoaderStream = Null TTranslation.FileLoaderStream = OpenStream(url , False , True) If TTranslation.FileLoaderStream For Local _Translation:TTranslation = EachIn MapValues(TTranslation.TranslationMap) TTranslation.FileLoader_Save(_Translation) Next Else Throw "Tried to save translation, but stream isnt open" EndIf CloseStream TTranslation.FileLoaderStream ; TTranslation.FileLoaderStream = Null End Function Function FileLoader_Read:TTranslation() If TTranslation.FileLoaderStream Local ReadArray:String[3] For Local I:Int = 0 To 2 ReadArray[I] = ReadLine(TTranslation.FileLoaderStream) Next If ReadArray[2] <> "" Then CreateTranslationGroup(ReadArray[2]) Return CreateTranslation(ReadArray[0] , ReadArray[1] , ReadArray[2]) Else Throw "Tried to read translation, but stream isnt open" EndIf End Function Function FileLoader_Save(_Translation:TTranslation) If TTranslation.FileLoaderStream And _Translation WriteLine(TTranslation.FileLoaderStream , _Translation.Code) WriteLine(TTranslation.FileLoaderStream , _Translation.Content) Local TranslationGroupName:String = "" If _Translation.TranslationGroup TranslationGroupName = _Translation.TranslationGroup.Name Else TranslationGroupName = "" EndIf WriteLine(TTranslation.FileLoaderStream , TranslationGroupName) Else Throw "Tried to save translation, but stream isnt open" EndIf End Function End Type
Function CreateTranslation:TTranslation(_Code:String , _Content:String , _TranslationGroupObject:Object) Return TTranslation.Create(_Code, _Content , _TranslationGroupObject) End Function
Function FindTranslation:TTranslation(_Code:String , _TranslationGroupObject:Object = Null , SearchOverride:Byte = 1 , NoDebuglog:Byte = False) Return TTranslation.FindTranslation(_Code , _TranslationGroupObject , SearchOverride , NoDebuglog) End Function
Function TranslateCode:String(_Code:String , _TranslationGroupObject:Object = Null , SearchOverride:Byte = 1) Local Translation:TTranslation = TTranslation.FindTranslation(_Code , _TranslationGroupObject , SearchOverride) If Translation Then Return TTranslation.DecodeTranslation(Translation) Return _Code End Function
Function LoadTranslationsFromFile:TMap(url:Object) Return TTranslation.FileLoader_LoadFile(url) End Function
Function SaveTranslationsToFile(url:Object) TTranslation.FileLoader_SaveFile(url) End Function
Function RemoveAllTranslations() For Local Translation:TTranslation = EachIn MapValues(TTranslation.TranslationMap) Translation.Remove() Next End Function
Type TTranslationGroup Global TranslationGroupList:TList = CreateList() Field Name:String Field TranslationMap:TMap = CreateMap() Method New() TranslationGroupList.AddLast(Self) End Method Function Create:TTranslationGroup(_Name:String) If _Name = "" Then Return Null If TTranslationGroup.NameInUse(_Name) Then Return Null Local _TranslationGroup:TTranslationGroup = New TTranslationGroup _TranslationGroup.Name = _Name Return _TranslationGroup End Function Method Remove() Self.TranslationGroupList.Remove(Self) For Local Translation:TTranslation = EachIn MapValues(Self.TranslationMap) Translation.Remove() Next End Method Function NameInUse:Byte(_Name:String) If TTranslationGroup.FindTranslationGroup(_Name) Then Return True Else Return False End Function Function FindTranslationGroup:TTranslationGroup(_Name:String) For Local _TranslationGroup:TTranslationGroup = EachIn TTranslationGroup.TranslationGroupList If _TranslationGroup.Name = _Name Then Return _TranslationGroup Next Return Null End Function Method GetName:String() Return Self.Name End Method Method GetTranslationMap:TMap() Return Self.TranslationMap End Method End Type
Function CreateTranslationGroup:TTranslationGroup(_Name:String) Return TTranslationGroup.Create(_Name) End Function
Function FindTranslationGroup:TTranslationGroup(_Name:String) Return TTranslationGroup.FindTranslationGroup(_Name) End Function
Function RemoveAllTranslationGroups() RemoveAllTranslations() For Local TranslationGroup:TTranslationGroup = EachIn TTranslationGroup.TranslationGroupList TranslationGroup.Remove() Next End Function
Beispiel1:
BlitzMax: [AUSKLAPPEN] [EINKLAPPEN]
CreateTranslationGroup("GUI") CreateTranslation("#GUI_YES" , "Ja" , "GUI") CreateTranslation("#GUI_NO" , "Nein" , "GUI") CreateTranslation("#GUI_OK" , "Okay" , "GUI") CreateTranslation("#GUI_ABORT" , "Abbrechen" , "GUI") CreateTranslation("#GUI_NEXT" , "Weiter" , "GUI") CreateTranslation("#GUI_BACK" , "Zurück" , "GUI") CreateTranslationGroup("Game") CreateTranslation("#GAME_PLAYERNAME" , "" , "Game") CreateTranslation("#GAME_WELCOME1" , "Wilkommen zum Translations Test" , "Game") CreateTranslation("#GAME_WELCOME2" , "Hallo %#GAME_PLAYERNAME%" , "Game") CreateTranslation("#GAME_CHOOSE" , "Wählen sie zum Fortfahren %#GUI_YES% oder %#GUI_NO%" , "Game") CreateTranslation("#GAME_PERCENT" , "Ladevorgang zu 100%% abgeschlossen" , "Game") CreateTranslationGroup("PLAYER1") CreateTranslation("#PLAYER_LOWHP" , "Player1 hat wenig HP" , "PLAYER1") CreateTranslationGroup("PLAYER2") CreateTranslation("#PLAYER_LOWHP" , "Player2 hat wenig HP" , "PLAYER2")
Global PlayerName:String = "Kernle 32DLL"
FindTranslation("#GAME_PLAYERNAME").SetContent(PlayerName)
Print TranslateCode("#GAME_WELCOME1") Print TranslateCode("#GAME_WELCOME2") Print TranslateCode("#GAME_CHOOSE") Print TranslateCode("#GAME_PERCENT")
Print TranslateCode("#PLAYER_LOWHP" , "PLAYER1") Print TranslateCode("#PLAYER_LOWHP" , "PLAYER2")
Beispiel2:
BlitzMax: [AUSKLAPPEN] [EINKLAPPEN]
Global PlayerList:TList = CreateList() PlayerList.AddLast("Herbert") PlayerList.AddLast("Hans") PlayerList.AddLast("Hubert") PlayerList.AddLast("Peter")
For Local Name:String = EachIn PlayerList CreateTranslationGroup(Name) CreateTranslation("#PLAYER_SAYYES" , Name+" sagt %#GUI_YES%!" , Name) CreateTranslation("#PLAYER_SAYNO" , Name+" sagt %#GUI_NO%!" , Name) CreateTranslation("#PLAYER_LOWHP" , Name+ " hat wenig HP!" , Name)
Next
Print TranslateCode("#PLAYER_SAYYES" , "Peter")
Print TranslateCode("#PLAYER_SAYNO" , "Hans")
Update 26 Juli 2009: Ich habe das ganze Translations Paket nach meinen neusten Anpassungen hier komplett neu eingefügt. Neues und Änderungen betreffen:
- Debug Befehle entfernt
- Translations in Translations hinzugefügt (mithilfe von %Translation%)
- Verschiedene Optimierungen am Code
- "" als TranslationGroupObject wird jetzt richtig als INVALID Parameter erkannt (benutzt stattdessen NULL)
Der Befehl DecodeTranslation enthält eine provisorische Select Case Gabelung, an der man bestimmten Schlüsselwörtern (wie z.b. groupname) eine anderen Einfügung geben kann. So wird %groupname% also mit dem Name der Gruppe ersetzt. Vielleicht ersetze ich das später mal durch eine Externe Liste...
Die Dokumentation mit Befehlsübersicht werde ich die Tage neu einfügen.
So long,
Kernle
|