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:

Beitrag von derRaab »

Danke Leo,

aber so mußt du ja bei jedem Zugriff auf den Text mittels einer Schleife auf den Inhalt zugreifen. Das finde ich nicht so schick, aber natürlich funktioniert das.

Vielleicht gibt es ja doch noch andere Lösungen...
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.l Language_AddID(ger.s,eng.s)
  AddElement(Lang())
  Lang()\name = Str(ListIndex(Lang()))
  Lang()\String[#Language_German] = ger
  Lang()\String[#Language_English]= eng
  ProcedureReturn Val(Lang()\name)
EndProcedure
Procedure.s Language_Get(name.s,ind.l)
  ForEach Lang()
    If Lang()\name = name
      Break 
    EndIf
  Next
  ProcedureReturn Lang()\String[ind]
EndProcedure
Procedure.s Language_GetID(id.l,ind.l)
  SelectElement(Lang(),id)
  ProcedureReturn Lang()\String[ind]
EndProcedure

Language_Init()

;-Erste Möglichkeit
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 "!!!Erste Möglichkeit!!!"
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)
Debug ""

;-Zweite Möglichkeit
Debug "!!!Zweite Möglichkeit!!!"
Second = Language_AddID("Ein Versuch mit der zweiten Möglichkeit","A try with the second thing (good english here)")
HalloWelt2 = Language_AddID("Ein Hallo Welt","A Hello World")
Debug "Second:"
Debug Language_GetID(Second,#Language_German)
Debug Language_GetID(Second,#Language_English)
Debug ""
Debug "Hallo Welt2:"
Debug Language_GetID(HalloWelt2,#Language_German)
Debug Language_GetID(HalloWelt2,#Language_English)
So könnt mans per IDs lösen.. die ID wird bei Language_AddID zurück gegeben, und man muss diese dann nur noch bei Language_GetID angeben.
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

Beitrag von derRaab »

Auch nicht schlecht. :mrgreen:

Objekte, in denen Arrays liegen können gibt es aber nicht in PureBasic, oder?

Ach, Wünsche...
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Wenn du sowas wie

Code: Alles auswählen

abc = new Array
meinst, dann nein ^^
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Um nochmal zum alten Problem zu kommen:

Code: Alles auswählen


;Danke Danilo :D

DataSection 

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

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

EndDataSection 
Procedure.s GetLanguageText(restorep,lan.l) 
  ger.s = PeekS(restorep)
  eng.s = PeekS(restorep+Len(ger)+1)
  ret.s 
  If lan = 0 
    ret = ger
  Else
    ret = eng
  EndIf
  ProcedureReturn ret
EndProcedure 

; Sprachen ( 0 = de, 1 = en ) 

MessageRequester("Deutsch",GetLanguageText(?title,0))
MessageRequester("English",GetLanguageText(?title,1))
MessageRequester("Deutsch",GetLanguageText(?headline,0))
MessageRequester("English",GetLanguageText(?headline,1))
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

Beitrag von derRaab »

Nach diversen Gesprächen bin ich mal auf den Vorschlag von bluejoke zurückgekommen und glaube doch, dass .ini-Dateien der richtige Weg sein könnte.

Also könnte ich eine oder mehrere .ini-Dateien in die Exe via IncludeBinary einschließen und dann diese ansprechen.

Wenn mir jetzt noch jemand einen Tipp geben kann, wie ich die dann beim Programmaufruf ansprechen kann? <) Anscheinend geht das nicht einfach über den Dateinamen. Muß ich die erst in ein temporäres Verzeichnis packen, dann die Dateien einlesen und dann die Dateien im temporären Verzeichnis wieder löschen?
Feudel
Beiträge: 13
Registriert: 21.12.2004 23:06

Beitrag von Feudel »

eine ini-datei als ressource ist wohl nicht das richtige. Warum nicht die einfache Lösung

data.s "deutsch","englisch","französisch","oderwasauchimmer"
data.s ...
data "%ende%","%ende%"","%ende%"","%ende%" (soviel mal wie sprachen)

mit repeat-until %ende% alles in ein einfaches array einlesen und anzahl merken (dann natürlich durch anzahl sprachen teilen)

einzelne sparache einlesen aus array mit for next bis anzahl und step wobei im step die sprachposition festgelegt wird. absolut übersichtlich und einfach zu pflegen (data kann über include eingebunden werden) - so spart man sich jeglichen firlefanz.
... hmmm
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

@derRaab: nochmal eine grds. Anregung zur Lokalisierung von Programmen:

Die Lokalisierung wird ja oftmals auch nach Veröffentlichung eines Programmes noch erweitert, z.B. durch Anwender die für ihre Muttersprache Dir eine Sprachdatei zur Verfügung stellen.

Warum also unbedingt die einzelnen unterstützten Sprachen von Anfang an komplett im Programm einbauen ?
Damit schränkst Du in dieser Beziehung Deine Anwender ein, da eben nicht nachträglich noch weitere Sprachen ergänzt werden können.
Oder Du müsstest jedes Mal eine neue Exe erstellen + zum Download stellen.

Ich habe es beim C.A.V.-Tool so gemacht, dass ich die drei "Haupt-Anwendersprachen" deutsch, englisch und französisch direkt ins Programm integriere. Alle weiteren Sprachen sind als Textdateien in einem Locale-Verzeichnis verfügbar und können unbegrenzt erweitert werden... :mrgreen:

Du kannst natürlich für Deinen spezifischen Anwendungszweck Recht haben, aber evtl. solltest Du Dein Konzept nochmal überdenken... :wink:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Feudel
Beiträge: 13
Registriert: 21.12.2004 23:06

Beitrag von Feudel »

... hat natürlich alles seine Vor und Nachteile aber wenn es sich nicht gerade um ein Mammut-Werk handelt ist eine neue exe doch vertretbar.

so und jetzt geh ich zum fasching ...
... hmmm
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich persönlich bevorzuge eine lösung über textdateien. (die müssen dann ja garnicht .txt heissen)

in jeder datei sind alle im programm vorkommenden begriffe in einer festen reihenfolge drin.

beim programmstart oder einer sprachumstellung im options-menu,
wird dann von einer routine die datei der aktuellen sprachversion
in ein array geladen.

bsp:
german.dat

Code: Alles auswählen

Hauptmenu
Einstellungen
weiter
zurück
OK
Dieses Programm wurde entwickelt von blablabla
english.dat

Code: Alles auswählen

Mainmenu
Options
next
previous
OK
This program was developed by blablabla
im code selbst wird die länderspezifische beschriftung aus dem array angezeigt.

die eigentliche herausforderung liegt hier im design der buttons und textfelder,
die größe muss für alle sprachversionen vernünftig aussehen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten