Einzelnen Beitrag anzeigen

Renate Schaaf

Registriert seit: 25. Jun 2020
Ort: Lippe
114 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Wie wechsele ich die Sprache zur Laufzeit?

  Alt 25. Mär 2022, 13:35
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 <> 'DEUthen
  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
Renate
  Mit Zitat antworten Zitat