Seite 1 von 1

Module Language

Verfasst: 09.09.2015 15:59
von GPI
Meine Neuinterpretation von Freaks Code: http://www.purebasic.fr/english/viewtop ... 9&start=15

Code: Alles auswählen

DeclareModule Language
  EnableExplicit
  Structure Group
    Map Word.s()
  EndStructure
  
  Global NewMap Group.Group()
  
  Macro Get(sGroup,sWord)
    Language::Group(UCase(sGroup))\Word(UCase(sWord))
  EndMacro
  
  Declare Load(*DefaultLanguage,Filenname.s="")
  Declare Save(Filename.s)
EndDeclareModule


Module Language
  Procedure Load(*Default,File.s="")
    Define Group.s="COMMON"
    Define Option.s
    Define Value.s
    Define Len.i
    ClearMap(Group())
    
    Repeat
      ;because read without restore will not work
      Len=MemoryStringLength(*Default)+1
      Option.s=PeekS(*Default)
      *Default+Len*SizeOf(Character)
      
      len=MemoryStringLength(*Default)+1
      Value.s=PeekS(*Default)
      *Default+Len*SizeOf(Character)
      
      Option=UCase(Option)
      Select option
        Case "", "_END_"
          Break
        Case "_GROUP_"
          Group=UCase(Value)
        Default
          Group(Group)\Word(Option)=Value
          ;Debug Group+"\"+Option+"="+Value
      EndSelect
    ForEver
    
    If file
      If OpenPreferences(File)       
        ForEach Group()
          PreferenceGroup(MapKey(Group()))
          ForEach Group()\Word()
            Group()\Word()=ReadPreferenceString(MapKey(Group()\Word()),Group()\Word())
          Next
        Next
        ClosePreferences()
      Else
        ProcedureReturn #False
      EndIf
    EndIf
    ProcedureReturn #True    
  EndProcedure
  
  Procedure Save(File.s)
    If CreatePreferences(File,#PB_Preference_GroupSeparator)
      PreferenceComment("Language File")
      PreferenceGroup("info");just in case we need this information sometimes
      WritePreferenceString("Version","1.00")
      WritePreferenceString("Programm",GetFilePart(ProgramFilename()))
      ForEach Group()       
        PreferenceGroup(MapKey(Group()))
        ForEach Group()\Word()
          WritePreferenceString(MapKey(Group()\Word()),Group()\Word())
        Next
      Next
      ClosePreferences()
      ProcedureReturn #True
    EndIf
    ProcedureReturn #False
  EndProcedure
EndModule


CompilerIf #PB_Compiler_IsMainFile
  
  Language::Load(?English)
  ;Language::Load(?English,"german.pref")
  
  
  Debug Language::Get("MenuTitle","File")
  Debug Language::Get("MenuItem","Open")
  
  ;Language::Save("german.pref")
  
  
  
  
  DataSection
    
    ; Here the default language is specified. It is a list of Group, Name pairs,
    ; with some special keywords for the Group:
    ;
    ; "_GROUP_" will indicate a new group in the datasection, the second value is the group name
    ; "_END_" will indicate the end of the language list (as there is no fixed number)
    ;
    ; Note: The identifier strings are case insensitive to make live easier :)
    
    English:
    
    ; ===================================================
    Data.s "_GROUP_",            "MenuTitle"
    ; ===================================================
    
    Data.s "File",             "File"
    Data.s "Edit",             "Edit"
    
    ; ===================================================
    Data.s "_GROUP_",            "MenuItem"
    ; ===================================================
    
    Data.s "New",              "New"
    Data.s "Open",             "Open..."
    Data.s "Save",             "Save"
    
    ; ===================================================
    Data.s "_END_",              ""
    ; ===================================================
    
  EndDataSection
CompilerEndIf

Re: Module Language

Verfasst: 09.09.2015 16:51
von ts-soft
:allright: , danke

Re: Module Language

Verfasst: 09.09.2015 20:15
von c4s
Danke!

Ich habe mir die (nun) drei Varianten nicht im Detail angesehen, wundere mich aber warum deine so klein (bzgl. Dateigröße) ist... immerhin 1/2 von Freaks und nur 1/3 von Guimauves Update. Bietet es genau die selbe Funktionalität?

Re: Module Language

Verfasst: 09.09.2015 21:04
von GPI
c4s hat geschrieben:Ich habe mir die (nun) drei Varianten nicht im Detail angesehen, wundere mich aber warum deine so klein (bzgl. Dateigröße) ist... immerhin 1/2 von Freaks und nur 1/3 von Guimauves Update. Bietet es genau die selbe Funktionalität?
Freaks Version stammte wohl aus der Zeit, als es keine Maps gab oder Maps in Strukturen nicht erlaubt waren. Er hat sich hier quasi eine eigene Map-Funktionalität geschrieben. Die Syntax ist leicht unterschiedlich (wegen Module und das Load einen Pointer zu den Sprachdaten benötigt), ansonsten ist die Funktionalität absolut identisch. - halt, bei mir gibts keine Reset-Funktion, so richtig einen Sinn seh ich da aber eh nicht. Das "Get"-Macro lässt sich übrigens auch für ein Set missbrauchen... ( Language::Get("NewElement","Insert?")="Insert a new Element?" )
Noch ein kleiner Unterschied: Bei Freaks Code sind theoretisch 2 Sprachdateien gleichzeitig möglich, aber es gibt nur eine Basis-Sprache, während bei meinen Code nur immer eine Sprache aktiv sein kann, dafür würde meine verschiedene Basis-Sprachen ermöglichen ;)

Möglich das Freaks Version weniger Speicher braucht und/oder ein bisschen schneller ist, meine Version ist aber imo leichter verständlich und dadurch leichter zu erweitern. Ich denke mal, das in der heutigen Zeit beides nicht mehr so kritisch ist und die leichte Pflegbarkeit hier eindeutig wichtiger ist. Und sollte bei einem Spiel doch mal was zeitkritisch sein sollte, empfehle ich bei beiden Lösungen, die benötigten Sprachfetzen in lokalen Variablen zu übertragen und dann diese zu benutzen. Das dürfte dann am schnellsten sein.

Re: Module Language

Verfasst: 10.09.2015 08:59
von c4s
Danke für deine Erläuterung. Ist mit dem Reset eine Funktion zum Neuladen gemeint? Das ist durchaus hilfreich, wenn der Anwender zwischendurch die Sprache wechseln will. Lässt sich aber bestimmt leicht nachrüsten.

Momentan verwende ich noch eine vor Jahren selbst gebastelte (von Freak an sich zu Recht kritisierte) Array-Variante, da ich ein paar speziellere Anforderungen habe was die Sprachdaten betrifft. Ich habe aber vor demnächst mal auf ein besseres Grundsystem umzusteigen (denn ständiges Refactoring ist nervig aber nötig!) und werde vermutlich deine Variante verwenden. :allright:

Re: Module Language

Verfasst: 10.09.2015 09:10
von GPI
c4s hat geschrieben:Danke für deine Erläuterung. Ist mit dem Reset eine Funktion zum Neuladen gemeint? Das ist durchaus hilfreich, wenn der Anwender zwischendurch die Sprache wechseln will. Lässt sich aber bestimmt leicht nachrüsten.
Neuladen kann man beliebig oft. Die Reset-Funktion leert die eingelesen Sprachdatei, das wars schon.