Restore dynamisch Verwenden

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

Restore dynamisch Verwenden

Beitrag von derRaab »

Hallo Leute,

ich suche gerade nach einer Lösung um mehrsprachige Inhalte innerhalb PureBasic zu hinterlegen.

Da habe ich mir einfach mal das zurechtgelegt:

Code: Alles auswählen

; Stringtabelle für Mehrsprachigkeit
;
; Sprungmarken sind die Bezeichner
; Sprachreihenfolge: de, en

; Texte
DataSection

   title:
   Data.s = "Hier der Titel", "Here the title"

   headline:
   Data.s = "Dies ist die Überschrift", "This is the headline"

EndDataSection

; Methode, um den richtigen String zu erhalten
Procedure.s GetLanguageText(string.s)
   ; lokale Variable innerhalb der Funktion
   Protected i.b
   Protected returnString.s
   ; springen zum richtigen Inhalt
   Restore string
   ; entsprechenden String auslesen
   For i = 0 To currentLanguage
      Read returnString
   
   Next
   
   ProcedureReturn returnString

EndProcedure

; Sprachen ( 0 = de, 1 = en )
Global currentLanguage.b

; Deutsch
currentLanguage = 0

MessageRequester("Deutsch",GetLanguageText("title"))
Leider kann man restore so nicht verwenden. PureBasic sucht direkt nach dem Label "string" anstatt nach dem Label mit dem Inhalt von String ( in diesem Fall "title" ).

Meine Frage nun:

1. Wie kann ich Restore dynamisch verwenden?
2. Macht meine Lösung überhaupt Sinn, oder sollte ich mehrsprachige Inhalte anders verwalten?

Danke euch...
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

warum nimmst du denn keine Preference-Dateien (INI-Format)?
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

Beitrag von derRaab »

Wird das dann in die exe mit einkompiliert? Ich möchte zum momentanen Zeitpunkt gerne nur eine Datei erstellen, die für sich immer funktioniert.

Das Thema ist mir auch neu. Bin noch nicht so tief drin.

Sind INI-Dateien der übliche professionelle Weg?
Benutzeravatar
ChaOsKid
Beiträge: 66
Registriert: 29.08.2004 15:07
Wohnort: Oktoberfest

Beitrag von ChaOsKid »

hi derRaab,

ich hab dir deinen code mal etwas umgebaut ;)

Code: Alles auswählen

; Stringtabelle für Mehrsprachigkeit
;
; Sprungmarken sind die Bezeichner
; Sprachreihenfolge: de, en

; Texte
; Sprachen ( 0 = de, 1 = en )
Global currentLanguage.b

; Deutsch
currentLanguage = 0

; Methode, um den richtigen String zu erhalten
Procedure.s GetLanguageText(eintrag.l)
  ; lokale Variable innerhalb der Funktion
  Protected i.b
  Protected returnString.s
  ; springen zum richtigen Inhalt
  Select eintrag
    Case 1
      Restore title
    Case 2
      Restore headline
  EndSelect
  ; entsprechenden String auslesen
  For i = 0 To currentLanguage
    Read returnString
  Next
  ProcedureReturn returnString
EndProcedure

MessageRequester("Deutsch",GetLanguageText(1) + GetLanguageText(2))
currentLanguage = 1
MessageRequester("English",GetLanguageText(1) + GetLanguageText(2))


DataSection
title:
Data.s = "Hier der Titel", "Here the title"
headline:
Data.s = "Dies ist die Überschrift", "This is the headline"
EndDataSection
mfG
Tobi
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

Beitrag von derRaab »

Danke Tobi,

aber so müsste ich ja in der Select-Anweisung alle Möglichkeiten hinterlegen. Das macht ja keinen Sinn, wenn ich mehrere Hundert verschiedene Texte habe. :mrgreen:

Ich würde schon gerne wissen, ob man dem Parameter Restore nicht auch dynamisch steuern kann. Also:

Code: Alles auswählen

Restore InhaltDieserVariable
Vielleicht kann mir da ja noch jemand helfen. :)

Und immernoch die grundsätzliche Frage, ob dieser Lösungsweg denn Sinn macht. Oder speichert Ihr alle Texte in Strukturen ab. Und wenn ja, wie?

Danke
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Oder speichert Ihr alle Texte in Strukturen ab. Und wenn ja, wie?

wie wär's mit einem XML-Dom?

Code: Alles auswählen

<entries>
	<entry language='DE' id='1'>Hallo</entry>
	<entry language='EN' id='1'>Hello</entry>
	<entry language='DE' id='2'>Welt</entry>
	<entry language='EN' id='2'>World</entry>
	[...]
</entries>
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

Beitrag von derRaab »

:mrgreen:

Haha Kiffi,
ja XML geht natürlich extern auch. Ich würde jedoch gerne ein recht einfache Struktur der Strings beibehalten und die DataSection verwenden. Ich habe sowas auch schon mal in einem der Foren oder der vielleicht sogar der Hilfe gesehen, aber ich finde es nicht mehr :(

Vielleicht hat ja jemand was gesehen?
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

wie wäre es ganz simpel mit einer Liste?

Code: Alles auswählen

Structure lang
  string.s[2]
EndStructure

NewList text.lang()

Procedure AddText(deutsch$, englisch$)
  LastElement(text())
  AddElement(text())
  text()\string[0] = deutsch$
  text()\string[1] = englisch$
EndProcedure

AddText("Datei öffnen", "Open File")       ;eintrag 0
AddText("Speichern", "Save File")          ;eintrag 1
AddText("Hallo Freunde","Hello Friends")   ;eintrag 2

language = 0
ForEach text()
Debug text()\string[language]
Next

language = 1
ForEach text()
Debug text()\string[language]
Next
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

Beitrag von derRaab »

Danke Lebostein,

aber wenn ich so arbeite, dann muß ich im Code mit mit Indexen arbeiten und nicht mit Bezeichnern. Ich weiß nicht ob das verständlich ist, aber sinngemäß würde ich gerne statt so:

Code: Alles auswählen

; GewünschterText.s = MeinSprachpaket\IndexDarin[SprachID]
myText.s = languageStrings\0[languageID]
lieber ungefähr so:

Code: Alles auswählen

; GewünschterText.s = MeinSprachpaket\TextBezeichnerDarin[SprachID]
myText.s = languageStrings\title[languageID]
Hier mal ein kleines Beispiel, wie ich das in ActionScript machen würde:

Code: Alles auswählen

// assoziatives Array
var myStrings:Array = new Array ();
myStrings['title'] = new Array ("Dies ist der Titel", "This is the title");
myStrings['headline'] = new Array ("Dies ist die Überschrift", "This is the headline");
// Sprache
var languageID:Number = 0;
// Ansprechbar:
var myCurrentString:String = myStrings['title'][languageID];
So habe ich eine übersichtliche Darstellung im Code und kann einfach über StringContainer.StringBezeichnung.SprachID darauf zugreifen und sehe auch so im Code immer sehr übersichtlich, welchen String ich gerade anspreche.

Wie kann ich denn in PureBasic das nachempfinden?
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Code: Alles auswählen

Procedure Language_Init()
  Enumeration 
    #Language_English
    #Language_German
    #Language_Count = #Language_German
  EndEnumeration
  Structure Lang
    name.s
    String.s[#Language_Count+1]
  EndStructure
  NewList Lang.Lang()
EndProcedure
Procedure.l Language_Add(name.s,ger.s,eng.s)
  AddElement(Lang())
  Lang()\name = name 
  Lang()\String[#Language_German] = ger
  Lang()\String[#Language_English]= eng
  ProcedureReturn ListIndex(Lang())
EndProcedure
Procedure.s Language_Get(name.s,ind.l)
  ForEach Lang()
    If Lang()\name = name
      Break 
    EndIf
  Next
  ProcedureReturn Lang()\String[ind]
EndProcedure

Language_Init()

Language_Add("sayhello","Hallo welt","Hello world")
Language_Add("headline","Dies ist die Überschrift", "This is the headline")
Language_Add("title","Hier der Titel", "Here the title")

Debug "Sayhello:"
Debug Language_Get("sayhello",#Language_German)
Debug Language_Get("sayhello",#Language_English)
Debug ""
Debug "Titel:"
Debug Language_Get("title",#Language_German)
Debug Language_Get("title",#Language_English)
Debug ""
Debug "Headline:"
Debug Language_Get("headline",#Language_German)
Debug Language_Get("headline",#Language_English)
So mach ichs immer.
Antworten