Autor |
Beitrag |
chickenfigt1989
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Do 19.08.10 23:32
Hallo,
Ich wollt mein programm emhrsprachig machen.
Dabei dachte ich an ini.
Wie sollte den die ini aussehen?
zur info:
Ich hab über 100 formen und showmessage sollten auhc übersetzt werden
lg
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 19.08.10 23:34
Am besten gar nicht auf Ini zurückgreifen. Ich würde vorschlagen XML, GNUGetText oder Ressourcen (ich glaub für die gibts n Tutorial sogar hier). Am besten mal alle Themen in der Forensuche suchen, das wurde schon n paar mal disskutiert afaik.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
chickenfigt1989 
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Fr 20.08.10 00:01
Würde es aber gern dennoch mit Ini machen da ich mit GNUGetText gar nicht zurecht komme.
lg
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Fr 20.08.10 00:13
Ich würde mich dem Vorschlag anschließen und XML nehmen. Auch wenn es neu für dich ist. Denn: Nur Bekanntes anzuwenden ist doch auf Dauer auch langweilig, oder ?
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 20.08.10 00:24
Ich kann dir auch erklären warum XML einer INI vorzuziehen ist. Ein Formular kannst du nämlich sehen wie einen Baum, bei dem jede Komponente ein Blatt ist und jede Eigenschaft ein Blatt ist. Wobei Komponenten wieder Blätter haben können, so wie Formulare. Und das schöne ist, bei XML kannst du die Daten ebenfalls als Baum darstellen. Durch diese Ähnlichkeit kann man das viel bequemer modellieren und programmieren.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 20.08.10 00:27
Mal zur Ini:
Ich würde die ini so aufbauen:
[Deutsch]
0-Speichern fehlgeschlagen
1-Meldung2
2-Meldung3
[English]
0-Saving failed
1-Message2
2-Message3
Dann wählst du in deinem Programm ne Sprache aus. Dann lädst du dir die passende Sprache in ein String Array. Jede Meldung kriegt eine Konstante. MSG_CannotSaveFile=0 z.B.
Und dann schreibst du immer ShowMessage( MessageList[MSG_CannotSaveFile] );
Du wirst natürlich nicht drum herum kommen, deine Forms von Hand zu übersetzen 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 20.08.10 05:32
elundril hat folgendes geschrieben : | Ich kann dir auch erklären warum XML einer INI vorzuziehen ist. |
Noch dazu sind die API-Funktionen, auf denen TIniFile aufbaut, als deprecated markiert, sollten also möglichst nicht mehr verwendet werden...
Eben weil das INI-Format noch ein Relikt aus den alten Windowsversionen ist, werden auch die entsprechenden Funktionen nur noch mitgeschleppt. Es kann aber passieren, dass es in einer der nächsten Windowsversionen diese Funktionen nicht mehr gibt. Und dann funktionieren auch alle Programme, die die nutzen, nicht mehr...
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Fr 20.08.10 09:38
Ich hätte eine Datenbank genommen. ^^
|
|
Critter
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: Fr 20.08.10 10:53
Hi,
Xion hat folgendes geschrieben : | [Deutsch]
0-Speichern fehlgeschlagen
1-Meldung2
2-Meldung3
[English]
0-Saving failed
1-Message2
2-Message3 |
davon würde ich abraten, ich würde mit mehreren Dateien Arbeiten - für jede Sprache eine. Das hat den Vorteil, dass die Dateien, die öffnen musst nicht so groß sind, und somit schneller geparst werden können - völlig unabhängig vom verwendeten Format (INI/XML/DB).
Desweiteren würde ich keine Nummernidizes nehmen, sondern den Text in einer Basissprache, bevorzugt Englisch, verwenden. Das hat den Vorteil, dass du dir deine Übersetzungsfunktion so gestalten kannst, dass sie wenn ein Text mal nicht in der Sprachdatei vorhanden ist immer noch den Index-Wert zurück liefern kann und somit den richtigen Text in Englischer Sprache. Du musst dich nur dran gewöhnen immer die gleichen Bezeichner zu Verwenden also. z. B. immer Einstellungen zu sagen und nciht mal Einstellungen und mal Optionen.
Des weiteren würde ich auch nicht darauf achten, wo der Text jetzt her kommt, also aus welchem Form. Wenn ein Button die Caption "Cancel" hat suchtst du einfach die allgemeine Übersetzung für Cancel und nicht die für den Cancel-Button in Form3, sonst produzierst du ziemlich viel Redundanten overhead und hasst viel mehr arbeit wenn sich mal ein Begriff ändern soll (also aus allen "Einstellungen" plötzlich "Optionen" werden sollen).
Wenn du nicht speichern musst, wo die Werte her kommen kannst du anstelle einer INI oder auch XML gleich eine reine Textdatei verwenden, wen du die dann noch ein wenig Optimierst (Nach Index sortieren und Texte dann Binär suchen oder ähnliches) kann das Auffinden der Texte darin auch recht Flott werden.
Ein Beisiel für German.lng:
Quelltext 1: 2: 3: 4: 5:
| Cancel=Abbrechen Ok=Ok Options=Einstellungen Sorry, you are out of Memory!=Ey alter dein Speicher ist voll! The entered value (%1) is bigger than %2=Der eingegebene Wert darf nicht größer als %2 sein. Sie haben aber %1 eingegeben. |
critter
PS: Wenn du tatsächlich so eine Dateistrucktur wählst, lässt sie sich auch hervorragend, in einer tStringList verwalten  .
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 20.08.10 11:12
Wenn du 100 Forman hast und dementsprechend vermutlich tausende Strings, dann würde ich dir dringend von so einer selbstgebastelten Ini/XML/Sonstwas-Lösung abraten. Mal abgesehen davon, dass vermutlich 90 der 100 Formen überflüssig sind, weil da ein dicker Design-Fehler in der Software steckt.
Bei GetText hast du dann zum Übersetzen eine Zeile Code, und das ist fast beliebig erweiterbar. Auch die Pflege der Übersetzungen ist recht einfach, wenn man das einmal raushat. 
_________________ We are, we were and will not be.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 20.08.10 12:51
Ähm, gab es nicht eine Unit von(jetzt verwechsle ich ihn wieder mit jemandem >.<).. Narses, um seine Programme mehrsprachig zu gestalten?
lg,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 20.08.10 16:13
Das war AXMD, aber die Unit müsste ich erst suchen, keine Ahnung wie die hieß, ist schon 4 oder 5 Jahre her. Ich schau nach der Arbeit mal.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 20.08.10 20:47
"100 Forms" -> es gibt kommerzielle Lösungen dafür. Z.B. Korzh Localizer.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 20.08.10 20:50
Delphi selbst hat ja auch eine integrierte Lösung dafür, die funktioniert auch recht gut. Insbesondere weil es bei so vielen Forms recht gut automatisiert.
Hier ist die Unit, die ich vorhin meinte:
www.delphi-forum.de/...p;highlight=language
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 20.08.10 21:05
My -.-
Die "in Delphi integrierte Lösung" interessiert mich jetzt gerade, ist unter Project\Languages\Add versteckt.
lg,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
chickenfigt1989 
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Fr 20.08.10 23:05
Oke hab mir mal den integrierten übersetzer von delphi angeschaut, aber wie soll der Funktionieren?
wenn ich die gewünschte Sprache hinzufüge wird ne kopie meiner Formen in nen ENG ordner angelegt aber da is nichts übersetzt.
lg
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 20.08.10 23:09
Na, übersetzen musst du es vermutlich selbst noch. So wie bei INI oder XML oder den anderen Systemen...
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Sa 21.08.10 16:43
Ich hätte da eine Idee, klingt sicher nicht besonders professionell, aber funktuioniert.
Angenommen, Du hast eine TEdit-Komponente, die die Sprache beinhaltet z.B. "Deutsch" oder eine Combobox-Komponente mit mehreren Sprachtexten. Dann wäre es sinnvoll, alle Komponenten des Formulars mit ihren Caption-Eigenschaften in eine Inidatei zu schreiben bzw. bei Wechsel der Sprache aus dieser wieder auszulesen.
z.b.:
Speichern, bzw. Laden
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure Sprachversion(speichern : boolean); var i : integer; c : TComponent; begin Inidatei := TInifile.Create(Pfad+Name+Spracherw+Endung); if speichern then with Inidatei do begin with Formular do begin for i := 0 to ComponentCount-1 do begin c := Components[i]; CName := c.Name; if c is TWinControl then begin WriteString('CAPTION',CName,TWinControl(c).Caption); WriteString('HINT',CName,TWinControl(c).Hint); end; end; end; end else begin with Formular do begin for i := 0 to ComponentCount-1 do begin c := Components[i]; CName := c.Name; if c is TWinControl then begin TWinControl(c).Caption := ReadString('CAPTION',CName,''); TWinControl(c).Hint := ReadString('HINT',CName,''); end; end; end; end; free; end; |
Pfad + Name + Spracherw + Endung: z.B.: Paramstr(0)+'SPRACHE_'+'DEU'+'.TXT';
Dann ist die "IniDatei" im Programmverzeichnis. Du brauchst dann nur die andere Sprachdateien zu erzeugen.
Ich habe dies jetzt nicht getestet, aber es sollte funktionieren.
Ich hoffe, ich habe Dir gedient.
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 21.08.10 17:38
Und wo ist der große Unterschied zu der fertigen Unit, die bereits angesprochen und von mir verlinkt wurde? 
|
|
Fienix
      
Beiträge: 109
Win 2K, Win XP Pro, Win 7
D 5 Pro., D 7 Ent., D 2010 Pro.
|
Verfasst: Sa 21.08.10 19:03
Ich hab es auch so gemacht wie von Tranx beschrieben.
Ich lade allerdings beim Pogrammstart eine TStringList, die om OnShow/OnAfterShow(mein Ereignis) auch wieder mit Captions gefüllt wird die noch nicht in der INI/XML vorhanden sind.
Wenn was neues dazu kommt dann wird meine TStringList erweitert und beim FormClose in die Datei geschrieben.
_________________ Wer sichert ist feige!!
|
|
|