Sprache Separieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Shadow-Gamer
Beiträge: 152
Registriert: 06.09.2009 13:31
Computerausstattung: NB: Intel P8700, Mobility ATI HD4650, 4GB, Win 7

Sprache Separieren

Beitrag von Shadow-Gamer »

Guten Tach^^

Wie trennt man am besten die Sprache vom Code ab?

Ich habe das bis jetzt immer so gemacht:

edit:

Code: Alles auswählen

lang.pb
z.B. 
Global lang_Name$ = "Name"
Global lang_MyName$ = "Der Name"

output.pb

z.B debug lang_Name$ + lang_MyName$
Aber ich habe das auch schon mit Arrays gesehen.
Ich denke das es vielleicht auch Geschmackssache ist, aber ich will meinen Code auch für andere Benutzerfreundlich machen.
Ich versuche ja nicht faul zu sein. :)
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: Sprache Separieren

Beitrag von ts-soft »

Ich nutze immer diesen Code von freak:
http://www.purebasic.fr/english/viewtopic.php?t=26729

Gruß
Thomas
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprache Separieren

Beitrag von STARGÅTE »

Ich würde es jetzt, wo es die Map in PB gibt, damit machen.

und dann auch eine Sprache aus einer .ini oder so laden und dann zB so befüllen:
Language("File") = "Datei"
Language("Open") = "Öffnen"

Was in der INI also Key und Value ist ...
...

das eigent sich nun besser als das Array oder eine LinkedList aus dem vorgeschlagenen Link, da dies bei vielen Wörtern so langsam ist.
Und vorallem wenn man diese SprachString in Laufzeit verwendet kann das zu problemne führen ...

Ich glaube Map ist da am geeignetsten.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Shadow-Gamer
Beiträge: 152
Registriert: 06.09.2009 13:31
Computerausstattung: NB: Intel P8700, Mobility ATI HD4650, 4GB, Win 7

Re: Sprache Separieren

Beitrag von Shadow-Gamer »

mal ne blöde Frage :lol: was ist mit map gemeint?
Ich versuche ja nicht faul zu sein. :)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprache Separieren

Beitrag von STARGÅTE »

Maps (auch bekannt als Hashtable oder Dictionary; in Deutsch auch "Liste, Tabelle, Verzeichnis" genannt) sind Strukturen für das Speichern von Daten, welche entsprechend Ihren Bedürfnissen dynamisch zugewiesen werden. Es handelt sich dabei um eine Sammlung von Elementen (die Daten, die Sie speichern möchten) und jedes Element ist vollkommen unabhängig von den anderen. Sie können soviele Elemente hinzufügen, wie Sie möchten (oder soviele, wie in den Speicher Ihres Computers passen), und greifen mittels einem Key (Schlüssel) wieder darauf zu. Diese Art der Datenspeicherung ist sehr nützlich, wenn Sie schnellen Zugriff auf ein beliebiges Element benötigen. Die Einfüge-Reihenfolge der Elemente wird beim Verwenden einer Map nicht gespeichert (anders als bei einer @library"LinkedList" "LinkedList") und daher kann sie auch nicht sortiert werden.

Bevor Sie mit Maps arbeiten können, müssen Sie diese zuerst deklarieren. Dies kann mit dem Schlüsselwort NewMap erfolgen. Strukturen werden auch oft verwendet, um mehrere Daten in einem einzelnen Element zu speichern.
Beispiel:

Code: Alles auswählen

NewMap Language.s()
Language("File") = "Datei"
Language("Open") = "Öffnen"

Debug Language("File")
Debug Language("Save")
Debug Language("Open")
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Shadow-Gamer
Beiträge: 152
Registriert: 06.09.2009 13:31
Computerausstattung: NB: Intel P8700, Mobility ATI HD4650, 4GB, Win 7

Re: Sprache Separieren

Beitrag von Shadow-Gamer »

Ok Danke, ich werde das ganze mal ausprobieren
Ich versuche ja nicht faul zu sein. :)
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Sprache Separieren

Beitrag von HeX0R »

STARGÅTE hat geschrieben: das eignet sich nun besser als das Array oder eine LinkedList aus dem vorgeschlagenen Link, da dies bei vielen Wörtern so langsam ist.
Hast du dir das "aus dem vorgeschlagenen Link" überhaupt mal angeschaut?
Das ist nämlich durchaus clever gelöst und mit Sicherheit nicht langsam.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprache Separieren

Beitrag von STARGÅTE »

jo, hab ich, deswegen hab ich es ja geschrieben ...

Code: Alles auswählen

Procedure.s Language(Group$, Name$)
  Static Group.l  ; for quicker access when using the same group more than once
  Protected String$, StringIndex, Result

  Group$  = UCase(Group$)
  Name$   = UCase(Name$)
  String$ = "##### String not found! #####"  ; to help find bugs

  If LanguageGroups(Group)\Name$ <> Group$  ; check if it is the same group as last time   
    For Group = 1 To NbLanguageGroups
      If Group$ = LanguageGroups(Group)\Name$
        Break
      EndIf
    Next Group

    If Group > NbLanguageGroups  ; check if group was found
      Group = 0
    EndIf
  EndIf
  
  If Group <> 0
    StringIndex = LanguageGroups(Group)\IndexTable[ Asc(Left(Name$, 1)) ]
    If StringIndex <> 0

      Repeat
        Result = CompareMemoryString(@Name$, @LanguageNames(StringIndex))

        If Result = 0
          String$ = LanguageStrings(StringIndex)
          Break

        ElseIf Result = -1 ; string not found!
          Break

        EndIf

        StringIndex + 1
      Until StringIndex > LanguageGroups(Group)\GroupEnd

    EndIf

  EndIf

  ProcedureReturn String$
EndProcedure
Die erste Schleife sucht eine Gruppe, die zweite Schleife sucht den Namen...
das dauert mit sicherheit länger (wenn man sehr viele Wörter hat) als alles in eine Map zu schmeisen und "nahezu" direkt auf ein Element zugreifen kann, auch wenn hier zB die Gruppe "gesavt" wird, und der Anfangsbuchstabe mit einem Index beschleunigt wird., was ja "anfänge" einer Map darstellt.
Das ist durch aus clever, nur jetzt löst die MAP das meiner Meinung nach ab !
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Sprache Separieren

Beitrag von NicTheQuick »

Wer PHP kennt, kann das in etwa mit assoziativen Arrays vergleichen. Oder eben die Maps in Java. Allerdings gibt es in Java verschiedene Arten von Maps. Map alleine ist da nur eine Obergruppe.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Sprache Separieren

Beitrag von Kaeru Gaman »

wie effizient und performant Maps wirklich sind, wissen wahrscheinlich nur Freak und Fred....

außerdem gibt es zig Methoden so etwas zu veranstalten.
man kann genausogut die Schlüsselbegriffe als Konstanten definieren, in einer Enumeration,
und die sprachspezifischen Beschriftungen in einem Array ablegen, das über die Konstanten als Indices angesprochen wird.

das ist zwar weniger flexibel und garnicht zur Laufzeit manipulierbar, dafür performanter und einfacher als jede Liste oder Map.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten