Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zwischen Sprachen umschalten? (https://www.delphipraxis.net/139219-zwischen-sprachen-umschalten.html)

AlexII 25. Aug 2009 20:26


Zwischen Sprachen umschalten?
 
Hallo,

hab mein Programm mit GNU Gettext übersetzt. Welche Übersetzung aber eingeschaltet wird richtet sich nach der Sprache des Windows. Möchte es aber so machen, dass der User zwischen den Sprachen im Programm selber wählen kann, wie funktioniert das? :gruebel:

Ralf Kaiser 25. Aug 2009 20:54

Re: Zwischen Sprachen umschalten?
 
Vor dem TranslateComponent(Self):

UseLanguage('<ISOCODE>');

also z.B:

UseLanguage('de-DE');


Die zu der Sprache gehörenden PO (bzw. MO) Dateien müssen natürlich im jeweiligen Sprachverzeichnis vorhanden sein.

OldGrumpy 25. Aug 2009 20:59

Re: Zwischen Sprachen umschalten?
 
Für DXGettext gibt es da einige Helferchen, wie das mit der GNU-Variante funktioniert, kann ich Dir nicht sagen :)

Hinweis: Die Links auf der Seite sind veraltet, aber das Projekt "cnxmanager" ist immer noch auf Sourceforge zu finden und das Sourcepackage dazu enthält die beschrieben Dateien auch.

Und noch eine Warnung: Controls die dynamisch zur Laufzeit erstellt werden und auch wieder verschwinden können, bringen dxgettext in Schwierigkeiten. Der Grund: Der erste Aufruf zur Übersetzung (TranslateComponent()) legt eine Liste der Controls mit den ursprünglichen Texten an. Wenn man danach die Sprache ändert, muss man mittels Aufruf von RetranslateComponent() die neuen Texte abrufen. Dabei wird die zuvor angelegte Liste benutzt. Wenn also zwischen den Aufrufen Controls hinzukommen, werden die nicht übersetzt (es sei denn man ruft nach der Erzeugung explizit gleich TranslateComponent(MeinNeuesControl) auf), aber viel schwerwiegender: Wenn Controls zwischen den Aufrufen abgeräumt werden, gibts Access Violations (im besten Falle), im schlimmsten Falle wird irgendwo Speicher zerstört und man sucht sich einen Wolf nach ganz seltsamen Problemen im Programm.

AlexII 25. Aug 2009 21:12

Re: Zwischen Sprachen umschalten?
 
Zitat:

Zitat von Alfi001
Vor dem TranslateComponent(Self):

UseLanguage('<ISOCODE>');

also z.B:

UseLanguage('de-DE');

Die zu der Sprache gehörenden PO (bzw. MO) Dateien müssen natürlich im jeweiligen Sprachverzeichnis vorhanden sein.

So etwa?

Delphi-Quellcode:
procedure TForm1.Deutsch1Click(Sender: TObject);
begin
UseLanguage('de-DE');
TranslateComponent(Self);
end;

procedure TForm1.Englisch1Click(Sender: TObject);
begin
UseLanguage('en-EN');
TranslateComponent(Self);
end;

AlexII 25. Aug 2009 21:13

Re: Zwischen Sprachen umschalten?
 
Zitat:

Zitat von OldGrumpy
Und noch eine Warnung: Controls die dynamisch zur Laufzeit erstellt werden und auch wieder verschwinden können, bringen dxgettext in Schwierigkeiten. Der Grund: Der erste Aufruf zur Übersetzung (TranslateComponent()) legt eine Liste der Controls mit den ursprünglichen Texten an. Wenn man danach die Sprache ändert, muss man mittels Aufruf von RetranslateComponent() die neuen Texte abrufen. Dabei wird die zuvor angelegte Liste benutzt. Wenn also zwischen den Aufrufen Controls hinzukommen, werden die nicht übersetzt (es sei denn man ruft nach der Erzeugung explizit gleich TranslateComponent(MeinNeuesControl) auf), aber viel schwerwiegender: Wenn Controls zwischen den Aufrufen abgeräumt werden, gibts Access Violations (im besten Falle), im schlimmsten Falle wird irgendwo Speicher zerstört und man sucht sich einen Wolf nach ganz seltsamen Problemen im Programm.

Was was ... bitte in Deutsch :roteyes:

Ralf Kaiser 25. Aug 2009 21:26

Re: Zwischen Sprachen umschalten?
 
Zitat:

Zitat von AlexII
So etwa?

Delphi-Quellcode:
procedure TForm1.Deutsch1Click(Sender: TObject);
begin
UseLanguage('de-DE');
TranslateComponent(Self);
end;

procedure TForm1.Englisch1Click(Sender: TObject);
begin
UseLanguage('en-EN');
TranslateComponent(Self);
end;

Fast.

Du musst dir merken ob das Formular schon mal übersetzt wurde. NUr beim ersten Mail verwendest du "TranslateComponent()". Bei allen folgenden Malen verwendest du "ReTranslateComponent()"!

Ansonsten reicht auch ein "UseLanguage('de')" wenn ein Sprachverzeichnis "DE" vorhanden ist (der Parameter von "UseLanguage" gibt letztendlich an in welchen Verzeichnis sich die MO Datei befindet. Du musst als nicht füe Deutsch-Östereich, Deutsch-Schweiz, Deutsch-... alle MO Dateien mitliefern. Es reicht wen ein Verzeichnis für "DE" existiert (es sei denn du hast in den verschiedenen Sprachvarianten unterschiedliche Formulierungen)

AlexII 25. Aug 2009 21:40

Re: Zwischen Sprachen umschalten?
 
Hab das jetzt so:

Delphi-Quellcode:
UseLanguage('ru-RU');
ReTranslateComponent(Self);
Und wie speichere ich ab welche Sprache gewählt wurde? :gruebel:

Ralf Kaiser 25. Aug 2009 21:57

Re: Zwischen Sprachen umschalten?
 
Die Einstellung speichern kannst du wo du willst:

Inifile, Registry, Textdatei, XML-File,... ,schreibs auf einen Zettel und häng ihn an die Wand :mrgreen:

Das Speichern der Einstellung hat nichts mit dxGetText zu tun, du speicherst nur einen String irgendwo ab (oder vieleicht auch nur den Index einer Combobox aus der die Sprache gewählt wurde, kommt auf dein Programm an)

OldGrumpy 26. Aug 2009 09:07

Re: Zwischen Sprachen umschalten?
 
Zitat:

Zitat von AlexII
Zitat:

Zitat von OldGrumpy
Und noch eine Warnung: [...]

Was was ... bitte in Deutsch :roteyes:

Was genau verstehst Du denn nicht?

AlexII 26. Aug 2009 17:49

Re: Zwischen Sprachen umschalten?
 
Zitat:

Zitat von Alfi001
Die Einstellung speichern kannst du wo du willst:

Inifile, Registry, Textdatei, XML-File,... ,schreibs auf einen Zettel und häng ihn an die Wand :mrgreen:

Ja das war meine erste Idee, aber ich dachte vllt gibt es von dxGetText nen extra Befehl oder so... na gut, ich mache es mit .ini

AlexII 26. Aug 2009 18:33

Re: Zwischen Sprachen umschalten?
 
Jetzt stehe ich vor der Frage wie man auf die Ursprungssprache wechselt, also ich die Sprache in der das Prog. geschrieben wurde, es gibt ja für sie keine .po-Datei. :gruebel:

Einfach mit

Delphi-Quellcode:
ReTranslateComponent(Self);
Geht nicht, wie dann? :gruebel:

Ralf Kaiser 26. Aug 2009 18:48

Re: Zwischen Sprachen umschalten?
 
Also ich entwickele Anwendungen immer in Englisch (englisches Delphi wegen der Systemmeldungen, eigene englische Originaltexte in den Formularen). Da dxGetText als "Indexsprache" Englisch benutzt gibt es dafür (normalerweise) auch keine PO Datei.

So reicht dann ein simples

UseLanguage('EN');
RetranslateComponent(self);

um wieder aufs Original umzuschalten.

Generell gilt dabei, dass die Originale, also die Strings aus den Formularen, immer dann benutzt werden wenn eine PO Datei für die gewählte Sprache nicht gefunden werden kann! Ein "UseLanguage('WUPPDI')" würde also auch dazu führen, dass die Originale wieder angezeigt werden.

AlexII 26. Aug 2009 18:50

Re: Zwischen Sprachen umschalten?
 
Ja das klappt, thx. :thumb:

AlexII 29. Aug 2009 14:16

Re: Zwischen Sprachen umschalten?
 
Komischerweise wird Itemindex der ComboBox immer auf 0 gesetzt :gruebel:
Ich denke weil TranslateComponent(Self); vor dem Auslesen der Daten in die ComboBox geschieht.

Auslesen der Daten in die ComboBox geschieht bei mir aber in OnShow und wenn ich erst danach TranslateComponent(Self); ausführe ist ItemIndex 1 (wird auch so in der .ini abgespeichert), wie erwartet, aber wenn ich das Programm das zweite mal öffne (und immer wieder) ist es wieder 0 :gruebel: Voll komisch

OldGrumpy 29. Aug 2009 16:12

Re: Zwischen Sprachen umschalten?
 
TranslateComponent() setzt Comboboxen auf -1 bzw. 0 zurück (je nach Typ), da für die Übersetzung die alten Texte raus und die neuen rein müssen. Steht so auch in der Doku. Abhilfe: ItemIndex erst nach TranslateComponent setzen oder notfalls mit einer lokalen Variable merken.

AlexII 29. Aug 2009 16:18

Re: Zwischen Sprachen umschalten?
 
Ach so..... ok muss ich mal ändern. Thx :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:12 Uhr.

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