Seite 2 von 2
Verfasst: 04.02.2005 13:17
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...
Verfasst: 04.02.2005 13:22
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.
Verfasst: 04.02.2005 13:28
von derRaab
Auch nicht schlecht.
Objekte, in denen Arrays liegen können gibt es aber nicht in PureBasic, oder?
Ach, Wünsche...
Verfasst: 04.02.2005 13:31
von Leo
Wenn du sowas wie
meinst, dann nein ^^
Verfasst: 04.02.2005 14:12
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))
Verfasst: 04.02.2005 18:46
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?
Verfasst: 04.02.2005 20:37
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.
Verfasst: 04.02.2005 20:58
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...
Du kannst natürlich für Deinen spezifischen Anwendungszweck Recht haben, aber evtl. solltest Du Dein Konzept nochmal überdenken...

Verfasst: 04.02.2005 21:06
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 ...
Verfasst: 10.02.2005 15:20
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.