verschiedene Sprachen unterstützen

Für allgemeine Fragen zur Programmierung mit PureBasic.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

verschiedene Sprachen unterstützen

Beitrag von SBond »

Hi Leute,

ich habe mal wieder eine Frage....

Ich schreibe gerade an einem Programm, das recht umfangreich wird. Ich habe es vorgesehen, dass der Benutzer die Sprache ändern kann (multilinguale GUI). ...aber wie mache ich das am besten? Hat jemand so etwas schon mal umgesetzt bzw. gibt es etwas auf das man besonders achten muss?

Ich habe gedacht, dass ich dazu eine XML-Datei erzeuge und darin verschiedene Sprachen speichere. Am Anfang wird es wohl Englisch und Deutsch sein. Das Erstellen und Auslesen dieser Datei stellt kein Problem dar. Interesant wird es, wenn ich die Sprache in der GUI nun ändere.

Statische Gadgets sind recht leicht mit SetGadgetText() umzubenennen. Problematisch wird es für mich z.B. bei Tooltips und Statusmeldungen, die Bedingungsabhängig erzeugt werden. Hier kann ich meiner Meinung nach nur mit Variablen arbeiten, die z.B. den String in der richtigen Sprache enthalten.
Das ist prinzipiell auch möglich, aber ich denke, dass die Lesbarkeit des Quellcodes stark abnimmt.

so wäre z.B. mein derzeitiger Code:

Code: Alles auswählen

If iStatus = #NO_ERROR
	SetStatustext("Es ist kein Fehler aufgetreten.")
	
ElseIf iStatus = #ERROR_BUFFER_OVERFLOW
	SetStatustext("FEHLER: Ein Pufferüberlauf wurde registriert!")
	
ElseIf iStatus = #ERROR_CRITICAL_VOLTAGE
	SetStatustext("FEHLER: die krittische Spannung wurde erreicht!")
	
EndIf

wenn ich die Sprachen in eine Struktur speichere, dann könnte ich so etwas machen:

Code: Alles auswählen

If iStatus = #NO_ERROR
	SetStatustext(Lang\sNo_Error)
	
ElseIf iStatus = #ERROR_BUFFER_OVERFLOW
	SetStatustext(Lang\sError_Buffer_Overflow)
	
ElseIf iStatus = #ERROR_CRITICAL_VOLTAGE
	SetStatustext(Lang\sError_Crit_Voltage)
	
EndIf
bzw so:

Code: Alles auswählen

If iStatus = #NO_ERROR:						SetStatustext(Lang\sNo_Error)				; Es ist kein Fehler aufgetreten.
ElseIf iStatus = #ERROR_BUFFER_OVERFLOW:	SetStatustext(Lang\sError_Buffer_Overflow)	; FEHLER: Ein Pufferüberlauf wurde registriert!
ElseIf iStatus = #ERROR_CRITICAL_VOLTAGE:	SetStatustext(Lang\sError_Crit_Voltage)		; FEHLER: die krittische Spannung wurde erreicht!
EndIf

Ist ein solches vorgehen sinnvoll? Aktuell habe ich ca. 220 Strings. Am Ende werden es ca. 800-1000 sein.

viele Grüße,
SBond
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
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: verschiedene Sprachen unterstützen

Beitrag von ts-soft »

Ich nutze immer diese Vorlage von Freak: http://www.purebasic.fr/english/viewtop ... t=language

Gruß
Thomas
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
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: verschiedene Sprachen unterstützen

Beitrag von SBond »

das ist interessant. So etwas habe ich noch gar nicht gesehen.

vielen Dank :)
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
_sivizius
Beiträge: 98
Registriert: 23.10.2013 15:21

Re: verschiedene Sprachen unterstützen

Beitrag von _sivizius »

Das läuft darauf hinaus, dass du alle Strings
1. einliest
2. indizierst
Einlesen kannst du das beliebig, z.B.
  • Einfache Textdatei, wobei jede Zeile = ein String. Einfach mit ReadString() einlesen.
  • Textdatei, wobei alle Strings mit \0 getrennt sind. Dazu einfach mit ReadData() einlesen und innerhalb des Buffers die Pointer berechnen.
  • Oberes kombiniert mit vTable.
  • Komprimiert, siehe Hilfe:Packer
  • Verschlüsselt, siehe Hilfe:Cipher
  • als .pref, siehe Hilfe:Preference
  • als .xml, siehe Hilfe:XML
  • in einem eigenem Format. Ich habe mir z.B. eine eigene Markup-Language entwickelt, die so etwas beinhaltet.
Für die Indizierung ist wohl ein einfaches Array geeignet. Da brauchst du eig auch keine großen Strukturen, kannst aber eine Struktur mit dem Array und einigen Zusatzinformationen anlegen.
Eine weitere Lösung wäre es, alles als eigene Library zu speichern(.so oder .dll), welche du mit OpenLibrary() einbindest. Darin könntest du Indizierung und Daten usw. schon beinhalten. Das ist dann aber OS spezifisch und man schießt mit Kanonen auf Spatzen :P
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: verschiedene Sprachen unterstützen

Beitrag von NicTheQuick »

Ich würde ja eine globale Map nehmen und ein paar Funktionen drum herum bauen.

Code: Alles auswählen

Global NewMap LANG.s()

Procedure LoadGerman()
	LANG("Programmtitel") = "Mein Programm"
	LANG("Ladefehler") = "Laden der Datei %1 fehlgeschlagen."
	LANG("Fortschritt") = "Fortschritt: %1%%"
EndProcedure

Procedure LoadEnglish()
	LANG("Programmtitel") = "My Program"
	LANG("Ladefehler") = "Error loading file %1."
	LANG("Fortschritt") = "Progress: %1%%"
EndProcedure

Procedure.s TRANSLATE(s.s, para1.s = "", para2.s = "", para3.s = "")
	Protected t.s = LANG(s)
	t = ReplaceString(t, "%%", "%")
	t = ReplaceString(t, "%1", para1)
	t = ReplaceString(t, "%2", para2)
	t = ReplaceString(t, "%3", para3)
	ProcedureReturn t
EndProcedure

LoadGerman()

Debug TRANSLATE("Programmtitel")
Debug TRANSLATE("Ladefehler", "datei.dat")
Debug TRANSLATE("Fortschritt", "95")

LoadEnglish()

Debug TRANSLATE("Programmtitel")
Debug TRANSLATE("Ladefehler", "datei.dat")
Debug TRANSLATE("Fortschritt", "95")
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: verschiedene Sprachen unterstützen

Beitrag von Danilo »

NicTheQuick hat geschrieben:Ich würde ja eine globale Map nehmen und ein paar Funktionen drum herum bauen.
Wenn der String in der Map nicht gefunden wird, würde ich aber den String selbst zurück geben, statt einen Leerstring. Hilft beim Debuggen.

In Deinem Beispiel bekommt man einen Leerstring:

Code: Alles auswählen

Debug TRANSLATE("Programtitel")
Siehe auch: tr()

__________________________________________________
Domain angepasst
21.04.2014
RSBasic
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
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: verschiedene Sprachen unterstützen

Beitrag von NicTheQuick »

Danilo hat geschrieben:
NicTheQuick hat geschrieben:Ich würde ja eine globale Map nehmen und ein paar Funktionen drum herum bauen.
Wenn der String in der Map nicht gefunden wird, würde ich aber den String selbst zurück geben, statt einen Leerstring. Hilft beim Debuggen.
Das stimmt. Ich habe es sowieso nur mal eben dahin gecodet. Erweitern kann das jeder für sich, wenn er möchte. Ich selbst habe auch noch keine mehrsprachige Unterstützung in meine Programme eingebaut. Lediglich für einen Webshop habe ich das mal gemacht, aber der ist leider nicht mehr online.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: verschiedene Sprachen unterstützen

Beitrag von SBond »

super :)


vielen Dank für die Ratschläge. Maps habe ich noch nie verwendet, aber irgendwann ist ja immer das erste mal ;)
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Antworten