Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sprache ändern mit ? (https://www.delphipraxis.net/67918-sprache-aendern-mit.html)

gauggi 21. Apr 2006 19:45


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:
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;
Diese Lösung ist aber nicht gut, denn ich möchte, dass jeder Anwender die Sprache seinen Wünschen

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:

Flare 21. Apr 2006 19:48

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

mkinzler 21. Apr 2006 19:50

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.

Mackhack 21. Apr 2006 19:52

Re: Sprache ändern mit ?
 
Erstell dir ne Resourcen-dll und binde diese in deinem Programm ein.

gauggi 21. Apr 2006 19:53

Re: Sprache ändern mit ?
 
Zitat:

Zitat von Flare
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

Wie meinst du das?

Ich verwende Delphi3. Was ich weiß, sind dort die Datenbankfunktionen sehr komplex. Ich habe noch nie mich mit Datenbanken beschäftigt

Mackhack 21. Apr 2006 19:55

Re: Sprache ändern mit ?
 
Dann haettest du ja jetzt die 1. Aufgabe dazu!

gauggi 21. Apr 2006 19:58

Re: Sprache ändern mit ?
 
Zitat:

Zitat von Mackhack
Erstell dir ne Resourcen-dll und binde diese in deinem Programm ein.

Wie kann ich eine Resourcen-dll erstellen? Blöde Frage.. Ich weiß, aber...

jus 22. Apr 2006 02:13

Re: Sprache ändern mit ?
 
Zitat:

Zitat von gauggi
Diese Lösung ist aber nicht gut, denn ich möchte, dass jeder Anwender die Sprache seinen Wünschen anpassen darf. Wie könnte man das lösen? Mit DLL's oder lng Dateien. Aber wie? Kennt jemand eine Komponente?

Wenn ich es richtig verstanden habe, so muß also der Anwender die Möglichkeit besitzen die Sprachausgaben editieren zu können?
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

Jelly 22. Apr 2006 07:32

Re: Sprache ändern mit ?
 
Nimm GnuText oder, wenns bischen was kosten darf, die TsiLang Component Suite um mehrsprachige Anwendungen zu entwickeln. Denn wenn du jeden einzelnen Label, Datenbankspalte usw. händig übersetzen willst, sonst leicht die Übersicht Du verlieren wirst :zwinker:

Sharky 22. Apr 2006 08:02

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.
Seite 1 von 2  1 2      

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