Module Language

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Module Language

Beitrag 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
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Module Language

Beitrag von ts-soft »

:allright: , danke
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Module Language

Beitrag 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?
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Module Language

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Module Language

Beitrag 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:
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Module Language

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten