![]() |
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. |
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:
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.
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; .... Ist nicht perfekt, aber zum Testen erstmal geeignet. Renate |
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. |
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
Zitat:
|
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
|
AW: Wie wechsele ich die Sprache zur Laufzeit?
|
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
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. |
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
Zitat:
|
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
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. |
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
Zitat:
|
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
|
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
|
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 |
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
|
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? |
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
Zitat:
|
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
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. |
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zitat:
|
AW: Wie wechsele ich die Sprache zur Laufzeit?
Laut Dokumentation unter
![]() 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 |
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: ![]() Renate |
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. |
AW: Wie wechsele ich die Sprache zur Laufzeit?
Zur Vollständigkeit halber:
![]() 1. klein 2. Sprachumstellung zur Laufzeit |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 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