Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 Uhr.
Seite 1 von 2  1 2      

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