Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie wechsele ich die Sprache zur Laufzeit? (https://www.delphipraxis.net/210257-wie-wechsele-ich-die-sprache-zur-laufzeit.html)

softtouch 25. Mär 2022 10:51

Wie wechsele ich die Sprache zur Laufzeit?
 
Ich habe mit Better Translation Manager eine .DEU resource erzeugt.
Wie bekomme ich Delphi dazu, diese zur Laufzeit zu verwenden, sodass ich verschiedene Sprachen ausliefern kann?
Was ich möchte, ist die Sprache während der Laufzeit umzuschalten, via Menu zum Beispiel.

Renate Schaaf 25. Mär 2022 13:35

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Wenn Du im englischen Forum nachfragst, antwortet Dir sicher Anders direkt.

Aber ich kann Dir zeigen, wie ich im Moment Sprachen teste. Meiner Erfahrung nach kann man die Sprach-Resource nur im Quellprogramm nach Application.Initialize laden. Sowie das .dfm eingelesen ist, geht das nicht mehr, weil in der Resource ja auch die übersetzten Formulare enthalten sind, denke ich mal. Wenn im Hauptprogramm die Sprache geändert wird, erfordert das einen Neustart.

Ich löse das im Moment per ini-file, wobei ich schamlos aus Anders source code kopiert habe (Entwicklungssprache ist bei mir Deutsch):

Quellprogramm der app:

Delphi-Quellcode:
var
  h: integer;
  ini: TMemInifile;
  appfolder, Lang: string;

function SetResourceHInstance(NewInstance: HModule): HModule;
var
  CurModule: PLibModule;
begin
  CurModule := LibModuleList;
  Result := 0;
  while (CurModule <> nil) do
  begin
    if CurModule.Instance = HInstance then
    begin
      if (CurModule.ResInstance <> CurModule.Instance) then
        FreeLibrary(CurModule.ResInstance);
      CurModule.ResInstance := NewInstance;
      Result := NewInstance;
      Exit;
    end;
    CurModule := CurModule.Next;
  end;
end;

begin
  Application.Initialize;
  appfolder := GetSpecialFolderLocation(CSIDL_APPDATA); //GetSpecialFolderLocation ist aus Jedi, geht aber inzwischen moderner, hab ich aber vergessen.
  appfolder := appfolder + '\MyApp';
  ini := TMemInifile.Create(appfolder + '\Settings.ini');
  Lang := ini.ReadString('Settings', 'Language', 'DEU');
  ini.free;
  if Lang <> 'DEU' then
  begin
    h := LoadLibraryEx(PChar('MyApp.ENU'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if h <> 0 then
      SetResourceHInstance(h);
{$IF RTLVersion >= 34}
    ResStringCleanupCache;
{$ENDIF}
  end;

....
Im Hauptprogramm habe ich eine Combobox, über die man die Sprache für den Neustart wählen kann. Im OnChange schreibe ich die neue Sprache ins ini-file und sag dem Benutzer, dass er jetzt das Programm neu starten soll.

Ist nicht perfekt, aber zum Testen erstmal geeignet.

Renate

Sinspin 25. Mär 2022 17:57

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Wir verwenden was kommerzielles von SiComponents. Geht wunderbar zur Laufzeit.
Ist halt eine Komponente auf der Form die für alle zu übersetzenden Captions/Text/etc auf der Form, die Versionen in jeder Sprache speichert. Beim Umschalten wird dann halt einfach alles ersetzt.
Die Übersetzungen können auf dem Form selber oder als externe Datei vorliegen.

Sowas kann man sich auch recht einfach selber schreiben.

zeras 25. Mär 2022 18:27

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von Sinspin (Beitrag 1503930)
Wir verwenden was kommerzielles von SiComponents. Geht wunderbar zur Laufzeit.

Ich nutze auch diese Komponente und finde die Umsetzung auch sehr gut.

Zitat:

Zitat von Sinspin (Beitrag 1503930)
Sowas kann man sich auch recht einfach selber schreiben.

Ja, kann man. Wenn man aber alles berücksichtigt, ist das meines Erachtens schon ein größeres Projekt.

Rolf Frei 25. Mär 2022 18:35

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von softtouch (Beitrag 1503918)
Ich habe mit Better Translation Manager eine .DEU resource erzeugt.
Wie bekomme ich Delphi dazu, diese zur Laufzeit zu verwenden, sodass ich verschiedene Sprachen ausliefern kann?
Was ich möchte, ist die Sprache während der Laufzeit umzuschalten, via Menu zum Beispiel.

Einfach die Datei im gleichen Ordner ablegegn wie die Exe und alles passiert automatisch. Aber du solltest nicht DEU nutzen sondern die übergelagerte DE. Diese gilt für alle deustchsprachigen Gebiete. DEU ist nur für Deutsch (Deutschland). DE gilt auch für die Schweiz (DES) und Österreich(DEA?). Wenn du in diese Länder die DEU Sprachdateien lieferst, wird deine Anwendung in den deutschen Subsprachen nicht auf deutsch angezeigt.

Steku 25. Mär 2022 18:40

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Oder mal hier schauen...

https://en.delphipraxis.net/topic/18...ager-released/

Viele Grüße
Steku

softtouch 25. Mär 2022 20:00

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von Rolf Frei (Beitrag 1503933)
Zitat:

Zitat von softtouch (Beitrag 1503918)
Ich habe mit Better Translation Manager eine .DEU resource erzeugt.
Wie bekomme ich Delphi dazu, diese zur Laufzeit zu verwenden, sodass ich verschiedene Sprachen ausliefern kann?
Was ich möchte, ist die Sprache während der Laufzeit umzuschalten, via Menu zum Beispiel.

Einfach die Datei im gleichen Ordner ablegegn wie die Exe und alles passiert automatisch. Aber du solltest nicht DEU nutzen sondern die übergelagerte DE. Diese gilt für alle deustchsprachigen Gebiete. DEU ist nur für Deutsch (Deutschland). DE gilt auch für die Schweiz (DES) und Österreich(DEA?). Wenn du in diese Länder die DEU Sprachdateien lieferst, wird deine Anwendung in den deutschen Subsprachen nicht auf deutsch angezeigt.

Das mache ich ja, es ändert sich aber nichts, die resource wird nicht verwendet. Ich habe DEU, DE und vieles mehr versucht, es bleibt alles Englisch.
Mein Windows ist komplett auf Englisch, auch die Region etc., das wird auch irgendwie von BTM erkannt. Die .DEU wird einwandfrei mit meiner Übersetzung erzeugt. Dann stelle ich Windows komplett auf Deutsch, und die .DEU sollte geladen werden, wird aber nicht. Der Process Monitor von Sysinternals zeigt auch keinen Zugriff auf die .DEU Resource an.

Uwe Raabe 25. Mär 2022 22:42

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von Steku (Beitrag 1503934)

Sehr witzig:
Zitat:

Zitat von softtouch (Beitrag 1503918)
Ich habe mit Better Translation Manager eine .DEU resource erzeugt.


softtouch 26. Mär 2022 06:45

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1503937)
Zitat:

Zitat von Steku (Beitrag 1503934)

Sehr witzig:
Zitat:

Zitat von softtouch (Beitrag 1503918)
Ich habe mit Better Translation Manager eine .DEU resource erzeugt.


Danke, das hilft ja ungemein...

Meine eigentliche Frage war aber, wie ich die Sprache, also das was ich im Menu Project->Languages mit "Set Active" in der IDE machen kann.

venice2 26. Mär 2022 07:32

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von softtouch (Beitrag 1503939)
Zitat:

Zitat von Uwe Raabe (Beitrag 1503937)
Zitat:

Zitat von Steku (Beitrag 1503934)

Sehr witzig:
Zitat:

Zitat von softtouch (Beitrag 1503918)
Ich habe mit Better Translation Manager eine .DEU resource erzeugt.


Danke, das hilft ja ungemein...

Meine eigentliche Frage war aber, wie ich die Sprache, also das was ich im Menu Project->Languages mit "Set Active" in der IDE machen kann.

Wurde doch schon beatwortet..
Zitat:

Wenn im Hauptprogramm die Sprache geändert wird, erfordert das einen Neustart.
Eigene Anwendung mit Shellexecute neu starten nach dem beenden wäre eine möglichkeit.

Uwe Raabe 26. Mär 2022 08:44

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von softtouch (Beitrag 1503939)
Danke, das hilft ja ungemein...

Sollte es gar nicht. Ich finde es nur bezeichnend, wenn auf eine Frage zu Better Translation Manager auf einen Post verweisen wird, in dem gerade dieser Better Translation Manager vorgestellt wird.

softtouch 26. Mär 2022 09:49

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1503942)
Zitat:

Zitat von softtouch (Beitrag 1503939)
Danke, das hilft ja ungemein...

Sollte es gar nicht. Ich finde es nur bezeichnend, wenn auf eine Frage zu Better Translation Manager auf einen Post verweisen wird, in dem gerade dieser Better Translation Manager vorgestellt wird.

Es ging mir ja gar nicht um BTM, da gibt es andere, es ging mir eigentlich darum, wie ich die erzeugte .DEU resource (womit auch immer erzeugt) während der Laufzeit laden kann, sodass user eine Sprache auswählen können, das Program dann neu started und dann die resource geladen wird. Ich bin eigentlich davon ausgegangen, das es mit plain Delphi gehen würde, ohne andere Komponenten, aber das scheint ja wohl nicht so ganz der Fall zu sein. Damit hat sich mein Post sowieso erledigt.

kompi 26. Mär 2022 13:52

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Das geht mit Delphi ohne andere Komponenten.

Man muss nur in der Registry unter HKCU/Software/Embarcadero/Locales einen entsprechenden Eintrag hinzufügen, z.B.

als Name das Programm oder Package mit kompletten Pfad (als Beispiel: c:\Programme\Test\Test.exe) und als Wert DE für Deutsch, ENG für Englisch usw.

Startet man das Programm anschließend neu, so wird die eingestellte Sprache verwendet.

Funktioniert auch mit BTM problemlos.

Gruß Kompi

softtouch 26. Mär 2022 16:09

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von kompi (Beitrag 1503949)
Das geht mit Delphi ohne andere Komponenten.

Man muss nur in der Registry unter HKCU/Software/Embarcadero/Locales einen entsprechenden Eintrag hinzufügen, z.B.

als Name das Programm oder Package mit kompletten Pfad (als Beispiel: c:\Programme\Test\Test.exe) und als Wert DE für Deutsch, ENG für Englisch usw.

Startet man das Programm anschließend neu, so wird die eingestellte Sprache verwendet.

Funktioniert auch mit BTM problemlos.

Gruß Kompi

Ach, das ist ja cool und einfach! Vielen Dank!

Gausi 27. Mär 2022 07:40

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Ich hänge mich hier kurz ran für eine Nachfrage, weil ich gelegentlich überlege, für Mehrsprachigkeit auf das Delphi-interne Konzept umzusteigen:

Verstehe ich das richtig, dass für eine Änderung der GUI-Sprache des Programms ein Neustart des Programms notwendig ist? D.h. die Sprache kann zwar zum Start des Programms festgelegt werden (bzw. wird automatisch bestimmt), kann dann aber während der Laufzeit nicht mehr geändert werden? Und das Festlegen einer Sprache geht nur über einen "Embarcadero-Key" in der Registry, nicht unter einem anderen Key wie HKCU/Software/MyProgram/Locales oder über eine Konfig-Datei?

Uwe Raabe 27. Mär 2022 09:49

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von Gausi (Beitrag 1503962)
Verstehe ich das richtig, dass für eine Änderung der GUI-Sprache des Programms ein Neustart des Programms notwendig ist? D.h. die Sprache kann zwar zum Start des Programms festgelegt werden (bzw. wird automatisch bestimmt), kann dann aber während der Laufzeit nicht mehr geändert werden?

Ja, und das hat durchaus seine Vorteile.

Zitat:

Zitat von Gausi (Beitrag 1503962)
Und das Festlegen einer Sprache geht nur über einen "Embarcadero-Key" in der Registry, nicht unter einem anderen Key wie HKCU/Software/MyProgram/Locales oder über eine Konfig-Datei?

Du kannst den Key in deinem Programm über SetLocaleOverride selber bestimmen. Das muss halt nur vor dem Laden der Forms und Resource-Strings geschehen.

Gausi 27. Mär 2022 10:19

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1503965)
Ja, und das hat durchaus seine Vorteile.

Ok, danke. :thumb:

Dass das auch Vorteile hat (Performance?) kann gut sein, aber für mich wäre das dann gegenüber meines aktuellen Systems mit GNU gettext ein Feature weniger. Wie hoch ich dafür die Priorität setzen soll, weiß ich nicht so ganz, aber wenigstens habe ich an der Stelle jetzt Klarheit, falls die Frage mal akuter wird.

KodeZwerg 27. Mär 2022 10:23

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1503965)
Ja, und das hat durchaus seine Vorteile.

Was wäre denn ein Vorteil wenn man nur um Captions aufzufrischen das Programm neu starten muss? (Ich mach das während der Laufzeit und frage mich was ich verpasst habe)

kompi 27. Mär 2022 10:50

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Laut Dokumentation unter https://docwiki.embarcadero.com/RADS...misch_wechseln kann man die Ressourcen DLL auch während der Laufzeit wechseln und damit eine andere Sprache verwenden. Ich habe dies bisher noch nicht probiert, da der Neustart des Programms für mich ausreichend war. Ich kann mir auch keine Anwendung vorstellen, bei der man ständig die Sprache umschaltet.

Der Vorteil ist hier ganz klar: Die Verwaltung verschiedener Sprachen ist in VCL Anwendungen schon eingebaut. Ich brauche keine zusätzlichen Komponenten.

Und mit dem BTM wird die Sache zu einem Kinderspiel, da man z.B. den Microsoft Translation Dienst verwenden kann.

Gruß Kompi

Renate Schaaf 27. Mär 2022 11:23

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Es geht auch zur Laufzeit (sehr bedingt). Neu kreierte Formulare werden übersetzt angezeigt. Alle auto-kreierten Formulare müsste man wieder neu einlesen, und die sind dann im Design-Zustand. Scheint mir auch ein zu großer Aufwand zu sein.

Siehe hier: https://stackoverflow.com/questions/...ntime/14435962

Renate

Uwe Raabe 27. Mär 2022 14:20

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Der Vorteil des Pure-DLL Ansatz, der halt einen Neustart erfordert, ist halt, dass man außer dem Eintrag in der Registry keinerlei sprach-relevanten Code benötigt. Das eliminiert zumindest diese eine Dependency, sei es nun eigener oder 3rd-Party Code. Das Built-in Verfahren funktioniert immerhin für alle (relevanten) Delphi Versionen gleichermaßen und wird dies vermutlich auch in Zukunft tun (übrigens auch für Non-Windows).

Obwohl sich der Anpassungsaufwand für externe Lösungen in den meisten Fällen wohl im Rahmen bleibt, sind je nach Implementierung irgendwelche Hickups nicht auszuschließen. Gerade bei Projekten, wo externe Lösungen erst genehmigt werden müssen oder dies wegen Sicherheitsbedenken eher schwierig ist, bietet die mitgelieferte Funktionalität eine gute und billige Alternative.

BTM mit seiner Fähigkeit, die DLLs direkt zu erzeugen, ist eine willkommene Ergänzung, mit dem die Nutzung der Delphi-Funktionalität deutlich vereinfacht wird. Wäre schön, wenn eine zukünftige Version auch andere Plattformen als Windows unterstützen würde.

haentschman 28. Mär 2022 05:17

AW: Wie wechsele ich die Sprache zur Laufzeit?
 
Zur Vollständigkeit halber:

https://www.delphipraxis.net/146618-...swerkzeug.html

1. klein
2. Sprachumstellung zur Laufzeit


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 Uhr.

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