![]() |
Sprache ändern mit ?
Guten Abend!
Bis jetzt habe ich, wenn ich eine Anwendung zweisprachig erstellt habe, mit INI Dateien gearbeitet. Das sah dann so aus:
Delphi-Quellcode:
Diese Lösung ist aber nicht gut, denn ich möchte, dass jeder Anwender die Sprache seinen Wünschen
var
Ini: TIniFile; Sprache: String; begin Ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'test.ini'); Sprache := Ini.ReadString('program','Sprache',''); Ini.free; if Sprache = 'English' then begin Datei1.Caption:='File'; end; anpassen darf. Wie könnte man das lösen? Mit DLL's oder lng Dateien. Aber wie? Kennt jemand eine Komponente? Oder Tipps? :-D Ich bin jeder Hilfe dankbar! :cheers: |
Re: Sprache ändern mit ?
Du könntest 2 Dateien anlegen (oder eben wie viele Sprachen du haben möchtest) und in jeder Datei unter dem Selben Punkt deine beiden Übersetzungen hinschreiben. Ich hoffe du weißt grad was ich meine :-D
Und dann brauchst du einfach entsprechend der Sprache eine Datei einladen. Als D könntest du Ini-Dateien nehmen. Du könntest das ganze aber auch per Datenbank erledigen. Flare |
Re: Sprache ändern mit ?
Für diesen Zweck gibt es unzählige Lösungen. Auch in Delphi gibt es schon Unterszützung für Mehrsprachigkeit.
|
Re: Sprache ändern mit ?
Erstell dir ne Resourcen-dll und binde diese in deinem Programm ein.
|
Re: Sprache ändern mit ?
Zitat:
Ich verwende Delphi3. Was ich weiß, sind dort die Datenbankfunktionen sehr komplex. Ich habe noch nie mich mit Datenbanken beschäftigt |
Re: Sprache ändern mit ?
Dann haettest du ja jetzt die 1. Aufgabe dazu!
|
Re: Sprache ändern mit ?
Zitat:
|
Re: Sprache ändern mit ?
Zitat:
Ein Vorschlag von mir wäre alle Komponenten, die Sprachausgaben enthalten, mit Tagnummern zu markieren und die Einträge dieser Nummern dann aus INI Dateien auszulesen. Denn das tolle an Ini-Dateien ist ja, dass der Anwender dazu lediglich den Notepad Editor benötigt statt einer laufenden Datenbank, die du unter Umständen noch mitliefern und installieren mußt. Wenn der Anwender die Ausgaben eh nicht editieren darf, sondern die Sprache nur zur Laufzeit einfach umschalten kann, so würde ich es dennoch mit den Tagnummern arbeiten und die Ausgaben in Ressourcedateien *.res packen und einfach im eigenen Programm einbinden. Ich benütze z.B. diese Methode weil *.res auch Unicode Zeichen enthalten können. Der Nachteil ist nur (zumindest bis Delphi7), dass man für Unicode *.res einen anderen als den Borland Ressource Compiler(z.B. GoRC) verwenden muß. jus |
Re: Sprache ändern mit ?
Nimm
![]() ![]() |
Re: Sprache ändern mit ?
Hai ihr,
da ich das vor kurzem selber gebraucht habe hatte ich mir mal eine Lösung überlegt. So könnte man das ganze zum Beispiel machen. Das ganze ist nur als Denkanstoss gedacht. Ich bringe die Funktion gerade in eine Klasse um das etwas einfacher zu machen. Eigentlich ganz einfach das ganze. Für jede Komponente wird ein Abschnitt in der Ini erzeugt (besser wäre dann TMemIniFiles) und dort wird der Komponenten name und der Text des gewählten Propertys gespeichert (WriteInit()) bzw. gelesen (ReadIni()).
Delphi-Quellcode:
uses
TypInfo, IniFiles; var apppath: string; function MyGetWideStrProp(Instance: TObject; const PropName: string): Widestring; resourcestring SUnknownProperty = 'Eigenschaft %s existiert nicht.'; var PropInfo: PPropInfo; begin PropInfo := GetPropInfo(Instance, PropName); if PropInfo = NIL then begin raise EPropertyError.CreateResFmt(@SUnknownProperty, [PropName]); end; result := GetWideStrProp(Instance, PropName); end; procedure MySetWideStrProp(Instance: TObject; const PropName: string; const Value: Widestring); resourcestring SUnknownProperty = 'Eigenschaft %s existiert nicht.'; var PropInfo: PPropInfo; begin PropInfo := GetPropInfo(Instance, PropName); if PropInfo = NIL then begin raise EPropertyError.CreateResFmt(@SUnknownProperty, [PropName]); end; SetWideStrProp(Instance, PropInfo, Value); end; procedure WriteIni(aForm: TForm; aType: TClass; const aProperty: string = 'Text'); var CurrentCompo: TComponent; ndx: Integer; TranslateIni: TIniFile; CurrentText: string; begin TranslateIni := TIniFile.Create(apppath + 'data.ini'); try for ndx := 0 to Pred(aForm.ComponentCount) do begin CurrentCompo := aForm.Components[ndx]; if (CurrentCompo is aType) then begin CurrentText := MyGetWideStrProp(CurrentCompo, aProperty); TranslateIni.WriteString(CurrentCompo.ClassName, CurrentCompo.Name, CurrentText); end; end; finally TranslateIni.Free; end; end; procedure ReadIni(aForm: TForm; aType: TClass; const aProperty: string = 'Text'); var CurrentCompo: TComponent; ndx: Integer; TranslateIni: TIniFile; NewText: string; begin TranslateIni := TIniFile.Create(apppath + 'data.ini'); try for ndx := 0 to Pred(aForm.ComponentCount) do begin CurrentCompo := aForm.Components[ndx]; if (CurrentCompo is aType) then begin NewText := TranslateIni.ReadString(CurrentCompo.ClassName, CurrentCompo.Name, ''); MySetWideStrProp(CurrentCompo, aProperty, NewText); end; end; finally TranslateIni.Free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin apppath := IncludeTrailingBackslash(ExtractFilePath(ParamStr(0))); ReadIni(self, TEdit, 'Text'); ReadIni(self, TLabel, 'Caption'); end; procedure TForm1.FormDestroy(Sender: TObject); begin WriteIni(self, TEdit, 'Text'); WriteIni(self, TLabel, 'Caption'); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 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