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