![]() |
Übersetzung in andere Sprachen mit bestimmten Anforderungen
Hallo Leute :).
Ich schreibe gerade an einer DLL für ein Fremdprogramm (Plugin für Total Commander um genau zu sein). Nun bin ich an einem Punkt angelangt, an dem ich diese DLL gerne in andere Sprachen übersetzen möchte. Also hab ich natürlich die Forensuche und sonstige Suchmaschinen bemüht und einige Komponenten, Möglichkeiten usw. gefunden: Kryvich's Delphi Localizer, (dx)GetText, Sisulizer, DeLoc/DelLoc usw. Bevor ich mir alle nach und nach anschaue, frage ich vorher mal in die Runde, da sich mit Sicherheit schon einige von euch mit Übersetzungen beschäftigt haben und die Varianten dafür (besser) kennen. Außerdem habe ich bestimmte Vorgaben/Bedingungen, die erfüllt werden sollten:
MfG Dalai |
AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
Für GetText-Dateien gibt es eine Vielzahl kostenloser Editoren, mit denen auch Nichtprogrammierer die Sprachdateien komfortabel selbst editieren können. Das ist ein großer Vorteil bei GetText, es ist quasi ein Standard. Ich habe gute Erfahrungen damit gemacht. In meinem Fall hat irgendeine externe Übersetzungfirma, mit der ich selber nie Kontakt hatte, die Übersetzung gemacht, und die konnten dort mit meinen Dateien anscheinend sofort etwas anfangen. Gab jedenfalls keine Rückfragen.
Ich kann allerdings nicht sagen, wie komfortabel die Übersetzung von visuell zusammengeklickten Formularen bei dxGetText gelöst ist, da es in meinem Programm so etwas nicht gab und ich mich deshalb nicht damit beschäftigt hatte. |
AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
Die TotalCommander-Plugins benötigen eigene Übersetzungen? Hat TC das nicht auch? Naja, schade.
Ich habe früher TSiLang verwendet, ein sehr sehr gutes Produkt. Kostet aber etwas. dxGetText würde ich heute verwenden. |
AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
Zitat:
Zitat:
Zitat:
Ich würde es auch selbst programmieren, aber momentan fehlen mir gute Ideen. Andererseits will ich ungern das Rad neu erfinden, weil es da mit Sicherheit etwas gibt. MfG Dalai |
AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
Ich komme mit DKLang ganz gut klar, es liefert auch eine editierbare Textdatei.
|
AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
dxGetText liefert auch eine editierbare Textdatei, nur ist die nicht sonderlich benutzerfreundlich. Dafür gibt es spezielle Editoren, die auch umme sind. Aber vielleicht ist das mit Kanonen auf Spatzen schießen.
Je einfacher Du die Text-Datei gestaltest (INI-Datei z.B.), desto mehr musst Du im Code programmieren, was aber auch kein Beinbruch ist. Natürlich wäre es Toll, alles im Code automatisch zu machen, aber wie wäre es mit diesem Ansatz (funktioniert sofort)
Delphi-Quellcode:
Du setzt alle Beschriftungen also individuell zur Laufzeit. Das ist so banal, da traut man sich ja gar nicht, Dir das vorzuschlagen. Das sieht zwar dämlich aus, aber bei -sagen wir- < 20 Formularen ist der Zusatzaufwand wirklich nicht groß. Das ist in einer Stunde erledigt.
uses
myTranslations; // <-- contains a loaded Translations : TStringList' Procedure TMyForm.FormCreate(... begin Self.Caption := Translations.Values['TMyForm.Caption']; Label1.Caption := Translations.Values['TMyForm.Label1.Caption']; btOk.Caption := Translation.Values['Buttons.OK']; .... Die Textdatei sieht dann so aus:
Code:
Natürlich ist das optimierbar (Sections etc.) und die Schlüssel in der Textdatei kannst Du ja auch noch für den Endanwender kompatibler gestalten (Wer kann sich schon etws unter 'TMyForm.Label1.Caption' vorstellen?)
TMyForm.Caption=Überschrift Formular 1
TMyForm.Label1.Caption=Vorname Buttons.OK=OK Wäre das nicht ein Anfang? |
AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
Ich verwende seit kurzem dieses Produkt:
![]() Gefällt mir persönlich sehr gut. :thumb: Ist zwar nicht ganz kostenlos, dürfte aber das Budget nicht sprengen. :wink: |
AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
MfG Dalai |
AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
Das, was Furtbichler vorschlägt, kann man auch mit der RTTI noch automatisieren. Allerdings ist das dann schon irgendwie das Rad neu erfinden. Ich kann mir einfach nicht vorstellen, dass es dafür nicht schon eine fertige (kostenlose) Lösung da draußen gibt.
|
AW: Übersetzung in andere Sprachen mit bestimmten Anforderungen
Rein theoretisch koennte man auch die Unit GnuGetText.pas so abaendern, dass sie statt auf .mo-Dateien direkt auf .po-Dateien zugreift. Das dxGetText-Projekt enthaelt entsprechende Sourcen zum Zugriff. Dann koennten Deine Anwender mit PoEdit oder Gorm (den ich uebrigens sehr empfehlen kann) einfach die .po-Dateien editieren.
Das wuerde Dir den aufwaendigen Parsing-Code fuer Komponenten ersparen. Aber es gibt bestimmt einfachere Loesungen. Ich bin aber ein ziemlicher Fan von dxGetText. "I liked the shaver so much, I bought the company" -- Victor Kiam |
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:
Dann schreibt man einfach:
Function Translate (string aKey, aDefault : String) : String;
begin Result := Translations.Values[aKey]; if Result='' then Result := aDefault; End;
Delphi-Quellcode:
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.
...
MyLabel.Caption := Translate('MyLabel',MayLabel.Caption); ... Klar, kann man alles verbessern, automatisieren, per RTTI automatisch erstellen, aber wie schon gesagt: Bei 1-2 Formularen absoluter Overkill. Oder Spielerei. |
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.) |
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:
Zum Abrufen der übersetzten Strings dann einfach:
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;
Delphi-Quellcode:
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.
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; 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 11:32 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