Ich würde mir eine generische Formular-Klasse erstellen, die die Label-Beschriftungen bei Bedarf aus einer Datei lädt.
Weiterhin würde ich mir einen Observer (GOF-Strategy, Observer-Pattern) schreiben, der beim Sprachenwechsel alle Formulare benachrichtigt.
Die Formulare melden sich beim Observer an (subscribe), sobald sie erzeugt werden (FormCreate-Methode) und melden sich wieder ab (unsubscribe), wenn sie zerstört werden (FormDestroy).
Alle deine Formulare leitest Du dann von diesem TMultiLanguageForm ab und musst dich dann um gar nichts mehr kümmern.
Der Observer verwaltet eigentlich nur eine Liste von TMultiLanguageForm. Meldet sich eine Form an, kommt es in die Liste. meldet sie sich ab, wird sie aus der Liste entfernt. Beim Sprachwechsel werden einfach alle Formulare der Liste nacheinander aufgefortert, ihre Spracheinstellungen neu zu laden.
Delphi-Quellcode:
unit MultiLingualForms;
interface
uses Classes, Forms;
Type
IObserverReceiver =
Interface
Procedure Notify (
Const aMessage :
String);
End;
TLanguageObserver =
Class
private
FObserver : TInterfaceList;
Public
Constructor Create;
Destructor Destroy;
Override;
Procedure Subscribe (aObserver : IObserverReceiver);
Procedure Unsubscribe(aObserver : IObserverReceiver);
Procedure Notify;
End;
TMultiLanguageForm =
Class (TForm, IObserverReceiver)
protected
Procedure DoCreate;
Override;
Procedure DoDestroy;
Override;
Procedure ChangeLanguage;
Procedure IObserverReceiver.Notify = ChangeLanguage;
End;
Function Observer : TLanguageObserver;
implementation
{ TLanguageObserver }
Var
_Observer : TLanguageObserver;
Function Observer : TLanguageObserver;
Begin
If not Assigned (_Observer)
Then _Observer := TLanguageObserver.Create;
Result := _Observer
End;
constructor TLanguageObserver.Create;
begin
inherited;
FObserver := TInterfaceList.Create;
end;
destructor TLanguageObserver.Destroy;
begin
FObserver.Free;
inherited;
end;
procedure TLanguageObserver.Notify;
Var
i : Integer;
begin
For i:=0
To FObserver.Count-1
do
IObserverReceiver(FObserver[i]).Notify;
end;
procedure TLanguageObserver.Subscribe(aObserver: IObserverReceiver);
begin
If FObserver.IndexOf(aObserver)=-1
Then
FObserver.Add(aObserver)
end;
procedure TLanguageObserver.Unsubscribe(aObserver: IObserverReceiver);
begin
FObserver.Remove(aObserver)
end;
{ TMultiLanguageForm }
procedure TMultiLanguageForm.DoCreate;
begin
inherited;
Observer.Subscribe(Self);
ChangeLanguage;
end;
procedure TMultiLanguageForm.DoDestroy;
begin
Observer.Unsubscribe(Self);
inherited;
end;
procedure TMultiLanguageForm.ChangeLanguage;
begin
// Sprachdatei laden und eigene Label neu setzen
end;
initialization
_Observer :=
Nil;
finalization
_Observer.Free;
end.
Beim Sprachwechsel einfach 'Observer.Notify' aufrufen, der macht den Rest.
Nebenbei gibt es sehr schöne Tools, die einem die Entwicklung mehrsprachiger Anwendungen erleichtern. GnuGetText oder TsiLang sind zwei Kandidaten, aber es gibt sicherlich noch Andere.