Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Übersetzung in andere Sprachen mit bestimmten Anforderungen (https://www.delphipraxis.net/179708-uebersetzung-andere-sprachen-mit-bestimmten-anforderungen.html)

Furtbichler 27. Mär 2014 20:45

AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
 
Leute bei einem Formular und vielleicht 20 Texten würde ich noch nicht einmal drüber nachdenken, irgend etwas anzupassen. Einfach die Texte, die man übersetzen will, nach meinem Vorschlag einlesen. Wer will, kann noch folgende Funktion verwenden:

Delphi-Quellcode:
Function Translate (string aKey, aDefault : String) : String;
begin
  Result := Translations.Values[aKey];
  if Result='' then Result := aDefault;
End;
Dann schreibt man einfach:
Delphi-Quellcode:
...
  MyLabel.Caption := Translate('MyLabel',MayLabel.Caption);
...
D.h. man übergibt einfach der 'Translate'-Funktion einfach den aktuellen Wert. Wenn nun -aus welchem Grund auch immer- der übersetzte Text nicht vorhanden ist, wird wenigstens der Originaltext verwendet.

Klar, kann man alles verbessern, automatisieren, per RTTI automatisch erstellen, aber wie schon gesagt: Bei 1-2 Formularen absoluter Overkill. Oder Spielerei.

Namenloser 27. Mär 2014 21:29

AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal ein RTTI-Beispiel, basierend auf einem alten Testprojekt von mir von 2006. Sollte sich recht leicht für deine Zwecke anpassen lassen.

(Analog zu GetPropValue gibt es auch SetPropValue.)

Dalai 28. Mär 2014 22:05

AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
 
So, die Programmierung hat etwas länger gedauert, als ich gehofft hatte. Naja, wie immer eigentlich ;).

Ich hab mich für die einfache Methode von Furtbichler entschieden :thumb:. Ich hab die Funktion ähnlich umgesetzt:
Delphi-Quellcode:
unit Translation;

interface

uses Classes, SysUtils, IniFiles;

const
    CRLF = #13#10;

procedure CreateLangFile(const AFileName: string);
procedure FreeLangFile;
procedure ReadLangFileSection(const ASection: string);
function Translate(const AName: string; const ADefault: string): string;

implementation

var hLangFile : TIniFile;
    sl: TStringList;

procedure CreateLangFile(const AFileName: string);
begin
    hLangFile:= TIniFile.Create(AFileName);
    sl:= TStringList.Create;
end;

procedure FreeLangFile;
begin
    if Assigned(hLangFile) then
        hLangFile.Free;
    if Assigned(sl) then
        sl.Free;
end;

procedure ReadLangFileSection(const ASection: string);
begin
    if Assigned(sl) then
        hLangFile.ReadSectionValues(ASection, sl);
end;

function GetLangString(const AName: string; const ADefault: string; const Asl: TStringList): string;
var idx: integer;
begin
    Result:= ADefault;
    idx:= Asl.IndexOfName(AName);
    if (idx <> -1) then
    begin
        Result:= Asl.Values[Asl.Names[idx]];
    end;
    Result:= StringReplace(Result, '\n', CRLF, [rfReplaceAll]);
end;

function Translate(const AName: string; const ADefault: string): string;
begin
    Result:= GetLangString(AName, ADefault, sl);
end;
Zum Abrufen der übersetzten Strings dann einfach:
Delphi-Quellcode:
Translation.CreateLangFile('C:\full\path\to\German.lng');
...
Translation.ReadLangFileSection(Self.Name);
Self.Caption:= Translate(Self.Name, 'Properties of %s');
btnOK.Caption:= Translate(btnOK.Name, btnOK.Caption);
...
Translation.FreeLangFile;
Genaugenommen müsste man das objektorientiert umsetzen, aber dazu fehlte mir gestern echt der Nerv. Mal sehen, vielleicht mach ich das noch, sofern es sich lohnt.

Danke auch an Namenloser für die Anregung mittels RTTI. Nette Methode, aber so kann ich nicht steuern, welche Strings nicht übersetzt werden dürfen. Oder man müsste dafür mehr Aufwand treiben, indem man sich genau überlegt, wann man die Übersetzung durchführt - was durchaus schwierig wird, wenn bestimmte Strings nur bei Bedarf genutzt werden.

MfG Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr.
Seite 2 von 2     12   

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