Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Mehrsprachiges Programm mit *ini (https://www.delphipraxis.net/126376-mehrsprachiges-programm-mit-%2Aini.html)

Ashanita 23. Dez 2008 00:45


Mehrsprachiges Programm mit *ini
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zu allererst:

Ich hoffe etwas ähnliches wurde nicht schon früher gepostet, denn ich bin mit der Suchfunktion auf nichts gestoßen. Falls es ein ähnliches Tutorial schon geben sollte, dann verzeiht mir :D

Multilanguage Programm


by Whiteprince aka Ashaníta


Allgemeine Information

Zubereitungszeit: ca. 30-45 Minuten
Schwierigkeitsgrad: mittel
Freischaltung: 23. Dezember 08

Beschreibung

Das Programm soll mit mehreren Sprachen mit INI Konfiguration verfügbar sein, sprich wenn man als Einstellung ENGLISCH für das Programm wählt, wird das ganze Programm ins Englische übersetzt.

Screenshots & Demo Downloads

http://gpproductions.kilu.de/Multi-Language-TUT.bmp

Download usw.: SIEHE ANHANG!

Zutaten für 1 Programm:
  1. Button | Name: Deutsch (Name NICHT Caption!)
    Button | Name: Englisch
    Label | Name: TestLabel1
    Label | Name: TestLabel2
Vorbereitung

Erstelle ein neues Projekt (VCL-Formularanwendung) und ziehe alle oben aufgelisteten Komponenten auf die Form. (Genau ausrichten kann man die Später )

Zubereitung

Zuallererst: was hat welche Komponente für eine Aufgabe?

Deutsch (Button) | Übersetzt ganzes Programm in Deutsch
Englisch (Button) | Übersetzt ganzes Programm in Englisch
TestLabel1 (Label) | Einfacher Text zum überprüfen ob Übersetzung funktoniert
TestLabel2 (Label) | Selbe wie TestLabel1

Zuerst fügen wir (ganz wichtig!)IniLang in die uses rein!

Jetzt doppelklicken wir (in der Form) auf den Deutsch-Button. Jetzt können wir mit Hilfe der procedure Funktion bestimmen was beim Button-Klick passiert. Wir geben an, dass beim Klick das Programm übersetzt wird:

Code:
CL:=loadIni(DE) // DE steht hier für Deutsch
Und jetzt, dass ALLE Labels bzw Button (oder was auch immer) Captions mit den englischen/deutschen Wörtern gefüllt wird:

Delphi-Quellcode:
if CL<>nil then
begin
fillProps([form1],CL); // Alles füllen
Das sieht dann jetzt so aus:

Delphi-Quellcode:
procedure TForm1.DeutschClick(Sender: TObject);
begin
CL:=loadIni(DE);
if CL<>nil then
fillProps([form1],CL);
end;
Damit wir das ganze jetzt auch in Englisch machen können, doppelklicken wir auf den Englisch-Button und geben folgenden Code ein:

Delphi-Quellcode:
procedure TForm1.EnglischClick(Sender: TObject);
begin
CL:=loadIni(EN); // Statt DE steht jetzt hier EN
if CL<>nil then
fillProps([form1],CL);
end;
Jetzt erstellen wir die Labels.

Und nun erstellen wir 2 Ini-Dateien, eine mit dem Namen "Englisch.ini" und eine mit dem Namen "German.ini" (die Dateien müssen so heißen).

Die Englisch.ini füllen wir folgendermaßen:

Delphi-Quellcode:
[Form1]
Form1.Caption=Gewünschter Text für die Form-Caption in Englisch
Form1.Englisch.Caption=Gewünschter Text für den Englisch-Button in Englisch
Form1.Deutsch.Caption=Gewünschter Text für den Deutsch-Button in Englisch
Form1.TestLabel1.Caption=Gewünschter Text für den TestLabel1 in Englisch
Form1.TestLabel2.Caption=Gewünschter Text für den TestLabel2 in Englisch
Und die German.ini genau gleich ABER auf Deutsch :D

Damit das Programm gleich beim starten übersetzt wird, doppelklicken wir in die Form (FormCreate Funktion) und geben folgendes ein:

Delphi-Quellcode:
CL:=loadIni(DE); // DE wenn ihr Deutsch laden wollt und EN wenn ihr Englisch laden wollt
if CL<>nil then
fillProps([form1],CL);
Das sieht dann so aus:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
CL:=loadIni(DE);
if CL<>nil then
fillProps([form1],CL);
end;
TEST

Jetzt Compilieren wir das ganze und starten das Programm (bitte geht sicher, dass German.ini und Englisch.ini im selben Ordner wie euer Programm ist) und klicken einmal auf den Englisch-Button bzw den Deutsch-Button und TADA es geht :D

[edit=Phoenix]Verlinkung auf Rapidshare entfernt. Wenn, dann bitte hier anhängen. Mfg, Phoenix[/edit]

DeddyH 23. Dez 2008 01:23

Re: Mehrsprachiges Programm mit *ini
 
Hallo und Willkommen in der DP :dp:,

Du hast Dir da viel Mühe gegeben, allerdings erscheint mir die Bedienung etwas umständlich (ohne es ausprobiert zu haben, ich habe nur Deinen Beitrag gelesen). Vielleicht möchtest Du einmal einen Blick auf sakuras Localizer werfen, um Dir ein paar weitere Anregungen zu holen.

Cyf 23. Dez 2008 01:28

Re: Mehrsprachiges Programm mit *ini
 
Ich denke, es ist sinnvoller die Sprachen in DLLs auszulagern.

DeddyH 23. Dez 2008 01:32

Re: Mehrsprachiges Programm mit *ini
 
Och, der Möglichkeiten gibt es viele, Ressourcen-DLLs sind eine davon (und IMHO keine schlechte).

sx2008 23. Dez 2008 07:01

Re: Mehrsprachiges Programm mit *ini
 
Zitat:

Zitat von Cyf
Ich denke, es ist sinnvoller die Sprachen in DLLs auszulagern.

Es kommt darauf an.
Bei Freeware gibt es öfters User, die das Programm freiwillig in ihre eigene Sprache übersetzen wollen.
INI-Dateien sind einfach mit dem Editor zu bearbeiten.
Bei Resourcen-DLLs könnte die Hürde schon zu hoch sein.

Phoenix 23. Dez 2008 07:22

Re: Mehrsprachiges Programm mit *ini
 
Dafür gibt es aber z.B. Gnu/gettext auch für Delphi. Dort hat man standardisierte .pl-Files mit denen diese freiwilligen Helfer dann auch arbeiten können.

Ich würde auf jeden Fall mit ressourcen arbeiten. Da gibt es genug Automatisierung um angenehm zu arbeiten. Der Aufwand so etwas ausgereiftes von Hand nachprogrammieren zu wollen (zumal noch mit .ini-Dateien, die schon etwas.. in die Jahre gekommen sind) ist einfach nicht gerechtfertigt.

hoika 23. Dez 2008 07:27

Re: Mehrsprachiges Programm mit *ini
 
Hallo,

ausserdem sind Inis mit Vista nicht mehr so einfach zu benutzen.


Heiko

Die Muhkuh 23. Dez 2008 07:53

Re: Mehrsprachiges Programm mit *ini
 
Inwiefern?

hoika 23. Dez 2008 08:08

Re: Mehrsprachiges Programm mit *ini
 
Hallo,

der Pfad der Inis wird "virtualisiert".
Da ins Programme-Verzeichnis nicth geschieben werden kann,
legt Vista die Ini selbständig im Nutzerverzeichnis (Pfad steht im Netz) ab,
und gaukelt dem Programm vor, dass die Ini erfolgreich im Programm-Verzeichnis geschieben wurde.

Das wird dann lustig, wenn man Änderungen im falschen Verzeuichnis sucht und nicht findet.

Heiko

Die Muhkuh 23. Dez 2008 08:17

Re: Mehrsprachiges Programm mit *ini
 
Das lustige daran ist, dass Du im Programm-Verzeichnis keinerlei Daten abzulegen hast und wenn man es macht, wie man es sollte, nämlich unter AppData, funktioniert alles ohne Probleme. :zwinker:

Bernhard Geyer 23. Dez 2008 08:22

Re: Mehrsprachiges Programm mit *ini
 
Zitat:

Zitat von hoika
der Pfad der Inis wird "virtualisiert".

Komisch nur das unsere Programme sich so wie unter NT/2000/XP/2003 verhalten?
Wie wäre es einfach ein passendes Manifest mitliefern und diese Virtualisierung fürs eigene Programm abschalten lässt.

mkinzler 23. Dez 2008 08:24

Re: Mehrsprachiges Programm mit *ini
 
In diesem Fall werden die Inis ja nicht beschrieben, so dass auch keine Virtualisierung erfolgen sollte

Die Muhkuh 23. Dez 2008 08:25

Re: Mehrsprachiges Programm mit *ini
 
So geht es natürlich auch. :-)

Übrigens: Wäre es nicht besser die Daten an den ersten Post anzuhängen und nicht auf Rapidshare auszulagern?

hoika 23. Dez 2008 09:04

Re: Mehrsprachiges Programm mit *ini
 
Hallo,

Bernhard, ja mit Manifest löst man sowas ... ;)


Heiko

Phoenix 23. Dez 2008 09:06

Re: Mehrsprachiges Programm mit *ini
 
Zitat:

Zitat von Die Muhkuh
Übrigens: Wäre es nicht besser die Daten an den ersten Post anzuhängen und nicht auf Rapidshare auszulagern?

Ja, wäre es. Und das sollte man bitte auch tun. Ich habe die Links zu Rapidshare mal entfernt.

Cyf 23. Dez 2008 11:27

Re: Mehrsprachiges Programm mit *ini
 
Wie genannt, sollte Virtualisierung kein Thema sein, da auf die Inis nur lesend zugegriffen wird.
es ist aber in der Tat so, dass Inis etwas in die Jahre gekommen sind und ich meine auch, es gäbe Begrenzungen für die Anzahl und Länge der Einträge. Allerdings ist eine andere Frage, ob (wenn man eben keine Ressourcen will) der Aufwand für z.B. XML sich lohnt.

hoika 23. Dez 2008 11:29

Re: Mehrsprachiges Programm mit *ini
 
Hallo,

Noch ein kleiner Tip.

TIniFile öffnet die Ini schreibend,
auch wenn nur lesend zugegriffen wird.

Lösung: TMemIniFile.


Heiko

Ashanita 23. Dez 2008 12:42

Re: Mehrsprachiges Programm mit *ini
 
Zitat:

Zitat von Die Muhkuh
So geht es natürlich auch. :-)

Übrigens: Wäre es nicht besser die Daten an den ersten Post anzuhängen und nicht auf Rapidshare auszulagern?

Tut mir Leid, ich habe nicht gewusst, dass ich das machen kann. War ja auch recht müde als ich es geschrieben hab :D

Ich hänge es mal direkt normal an :)

@Heiko (über mir)

Danke dir, ich werde es mir mit TMemIniFile mal ansehen.
Mein Delphi ist noch nicht weit genug um mit DLL zu arbeiten, aber ich enke das kommt bald :D

Und das mit INI, mache ich, damit ich Rechtschreibverbesserungen usw. machen kann. Aber mal sehen wie es mit DLL dann aussieht.

Greetz Asha

thkerkmann 23. Dez 2008 13:38

Re: Mehrsprachiges Programm mit *ini
 
Hi,

Zitat:

Zitat von hoika
Hallo,

Noch ein kleiner Tip.

TIniFile öffnet die Ini schreibend,
auch wenn nur lesend zugegriffen wird.

Lösung: TMemIniFile.


Heiko

Wie kommst Du denn auf das schmale Brett. :wiejetzt:
TInifile öffnet die Ini gar nicht, sondern bemüht zu diesem Zweck die Windows Api Funktionen zum lesen / schreiben.

Gruss

hoika 23. Dez 2008 14:02

Re: Mehrsprachiges Programm mit *ini
 
Hallo,

schon klar,
die API-Funktionen aber öffnen die Ini zum Schreiben.


Heiko

Muellermilchtrinker 1. Aug 2009 13:23

Re: Mehrsprachiges Programm mit *ini
 
Wie funktoniert das mit mehreren Forms??

Mein Versuch:
Delphi-Quellcode:
CL:=loadIni(EN);
if CL<>nil then
fillProps([form1],CL);
fillProps([form2],CL);
da wird nur mein hauptformular übersetzt.


meine ini wurde so fortgeführt

Zitat:

[Form1]
... (übersetzungen)

[Form2]
und dann wie oben

xZise 1. Aug 2009 14:57

Re: Mehrsprachiges Programm mit *ini
 
Erstens fehlt dir ein begin-end Block! Zweitens nehme ich an, ist form2 noch gar nicht erstellt ust, wenn du die Funktion aufrufst oder?

MfG
xZise

Muellermilchtrinker 2. Aug 2009 15:30

Re: Mehrsprachiges Programm mit *ini
 
ich rufe es im formcreate ereignis von form1 auf.
an dem begin-end block liegts auch nicht den hab ich erstellt

DeddyH 2. Aug 2009 15:38

Re: Mehrsprachiges Programm mit *ini
 
Form1 ist vermutlich Dein MainForm, oder? Dann hat xZise absolut recht, Form2 gibt es zu diesem Zeitpunkt überhaupt noch nicht.

Muellermilchtrinker 2. Aug 2009 15:42

Re: Mehrsprachiges Programm mit *ini
 
ja, es ist mein mainform.
Muss ich es dann nochmal mit dem jeweiligen Form in dessen FormCreate Ereignis aufrufen??

DeddyH 2. Aug 2009 15:48

Re: Mehrsprachiges Programm mit *ini
 
Das solltest Du in Erwägung ziehen.

Muellermilchtrinker 2. Aug 2009 15:53

Re: Mehrsprachiges Programm mit *ini
 
wenn ich es im FormCreate des jeweiligen Forms dann aufrufe, wirds aber nicht übersetzt.

Mein Code:
Delphi-Quellcode:
      CL:=loadIni(EN);
      if CL<>nil then
      begin
      fillProps([Form2],CL);
      end;
meine Ini sieht wie oben geschrieben aus.

DeddyH 2. Aug 2009 15:59

Re: Mehrsprachiges Programm mit *ini
 
Ich kann hier im Moment kein rar entpacken, daher würde es nichts nützen, den Source herunterzuladen. Wird Deine Routine denn ausgeführt?

jaenicke 2. Aug 2009 15:59

Re: Mehrsprachiges Programm mit *ini
 
Zitat:

Zitat von thkerkmann
TInifile öffnet die Ini gar nicht, sondern bemüht zu diesem Zweck die Windows Api Funktionen zum lesen / schreiben.

Und genau diese sind als veraltet und nur für 16-Bit-Kompatiblität vorhanden gekennzeichnet...
Diese können also jederzeit aus der aktuellen API herausfliegen, da es jetzt den XP-Mode gibt, ggf. auch schon beim Nachfolger von Windows 7.

(Wird wohl nicht so schnell passieren, es gibt aber keine Garantie, dass es nicht passiert. Und deshalb kann es sein, dass Programme, die darauf bzw. auf TIniFile aufbauen, plötzlich nicht mehr funktionieren.)

Muellermilchtrinker 2. Aug 2009 16:09

Re: Mehrsprachiges Programm mit *ini
 
also wenn ichs complimiert habe kommt an der seite der codezeilen blaue punkt.
ich schätze mal, dass das bedeutet sie wird ausgeführt.

jaenicke 2. Aug 2009 16:11

Re: Mehrsprachiges Programm mit *ini
 
Zitat:

Zitat von Muellermilchtrinker
also wenn ichs complimiert habe kommt an der seite der codezeilen blaue punkt.
ich schätze mal, dass das bedeutet sie wird ausgeführt.

Richtig, aber vielleicht ist CL ja nil? Setz doch einfach einmal einen Haltepunkt und schau nach was passiert.

Muellermilchtrinker 2. Aug 2009 16:15

Re: Mehrsprachiges Programm mit *ini
 
ich hab jetzt einfach mal noch gesagt, er soll dann noch ne showmessage ausgeben und die gibt er aus.

DeddyH 2. Aug 2009 16:18

Re: Mehrsprachiges Programm mit *ini
 
Wie gesagt, setz einen Breakpoint und steppe einmal durch (F7 bzw. F8).

Muellermilchtrinker 2. Aug 2009 16:23

Re: Mehrsprachiges Programm mit *ini
 
also er springt dann in die nächste zeile fillprops steht

DeddyH 2. Aug 2009 16:31

Re: Mehrsprachiges Programm mit *ini
 
Und genau da wäre es jetzt interessant, ob das auch richtig abgearbeitet wird.

Muellermilchtrinker 2. Aug 2009 16:33

Re: Mehrsprachiges Programm mit *ini
 
da er es ja nicht übersetzt, denke ich mal das er es nicht richtig abarbeitet

DeddyH 2. Aug 2009 16:39

Re: Mehrsprachiges Programm mit *ini
 
Nicht denken, nachsehen ;)

sx2008 2. Aug 2009 16:40

Re: Mehrsprachiges Programm mit *ini
 
Sorry Leute, wenn ich mich hier mal einmische:
Es gibt einen Unterschied zwischen Forum und Chat:
Chat: ein Satz/Halbsatz pro Nachricht
Forum: mehrere Sätze; gut durchdacht mit deutlich höherem Informationsgehalt als bei einem Chat.

Und sorry falls ich hier einem Forumsmanager auf den Schlips trete.
Aber bitte mehr Informationsgehalt pro Nachricht; danke.

DeddyH 2. Aug 2009 16:50

Re: Mehrsprachiges Programm mit *ini
 
Sollen wir jetzt erklären, wie man seinen Code zeilenweise abarbeitet und Variablen überwacht? Das ist mir persönlich zuviel Schreibarbeit, IIRC gibt es aber ein Tut dazu hier in der DP.

Muellermilchtrinker 2. Aug 2009 17:01

Re: Mehrsprachiges Programm mit *ini
 
habs jetzt gecheckt wie man variablen überwacht.
CL hat den Wert 0


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf