GnuGetText-Werkzeuge für Delphi |
|
Alle Strings, die in andere Sprachen übersetzt werden sollen, müssen im Quelltext so gekennzeichnet sein, dass sie von dxgettext beim Durchsuchen der Dateien eindeutig gefunden werden.
Texte, die in einem Formular definiert sind, wie z.B. Caption, Hint und Text werden von dxgettext automatisch erkannt. Im Quelltext der zugehörigen Unit muss die Funktion TranslateComponent (siehe unten) im OnCreate-Ereignis des Formulars angegeben werden.
Alle in einer Sektion resourcestring definierten Texte werden automatisch erkannt und
während der Laufzeit durch die jeweilige Übersetzung ersetzt.
Beispiel:
resourcestring msg = 'Hello, World'; ...
Zu übersetzende Strings müssen als Argument einer der folgenden Funktionen angegeben werden,
damit sie von dxgettext erkannt werden:
_(<string>), gettext(<string>) und dgettext(<domain><string>).
Die Funktionen sind in der Unit GnuGetText definiert.
Beispiele:
gettext('Hello, World'); // Textdefinition für die Standarddomäne "default" _('Hello, World'); // Kurzform der Funktion "gettext" dgettext('domain','Hello, World'); // wie "gettext" aber mit anderer Domäne ...
In der dpr-Datei des Projekts sind einige Ergänzungen erforderlich, wenn
neben der Standarddomäne default auch andere verwendet werden und, wenn
bestimmte Komponenten oder Klassen , wie z.B. TFont von der Übersetzung
ausgeschlossen werden sollen.
Beispiel:
program sample; uses GnuGetText in 'GnuGetText.pas', // enthält die unten aufgerufenen Funktionen Vcl.Forms, SampleMain in 'SampleMain.pas' {frmMerge}; begin TP_GlobalIgnoreClass(TFont); // Ausschluss von Klassen von der Übersetzung AddDomains(['delphi10','units']); // Definition zusätzlicher Textdomänen Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TfrmMain, frmMain); Application.Run; end.
Als erstes muss die Unit GnuGetText in der uses-Klausel angegeben werden, da in ihr die aufzurufenden Funktionen definiert sind. Je nach Bedarf kann dann vor der Initialisierung der Anwendung eine der folgenden Funktionen eingefügt werden:
Die Beschreibungen von weiteren möglichen Funktionen findet man in der ausführlichen englischen Beschreibung.
In Units, die ein Formular verwenden, müssen beim Erstellen die im Formular verwendeten Texte durch die jeweiligen Übersetzungen ersetzt werden. Dazu wird die Prozedur TranslateComponent im OnCreate-Ereignis des Formulars aufgerufen.
Beispiele:
procedure TMyForm.FormCreate (Sender: TObject); begin TranslateComponent (self); ... end; |
procedure TMyForm.FormCreate (Sender: TObject); begin TranslateComponent (self,'units'); ... end; |
Wenn die Unit GnuGetText, wie oben beschrieben, in die uses-Klausel
der Projekt-Datei eingebunden ist, wird bei ihrer Initialisierung (Programmabschnitt initialization)
automatisch die vom Benutzer im System eingestellte Anzeigesprache ermittelt und
als Standardsprache gespeichert. Wenn der Benutzer eine andere Sprache verwenden möchte,
kann er dies in der dpr-Datei vor der Anwendungsinitialisierung durch
Aufruf der Prozedur Uselanguage erreichen.
Beispiel:
program sample; uses GnuGetText in 'GnuGetText.pas', ... begin AddDomains(['delphi10','units']); UseLanguage('de'); ... end.
Zunächst muss die neue Sprache im GnuGetText-System registriert werden.
Dann muss für jedes verwendete Formular die Prozedur TranslateComponent
aufgerufen werden.
Beispiel:
procedure ChangeLanguage (NewLangCode : LanguageString); var i : integer; begin UseLanguage(NewLangCode); with Application do for i:=0 to ComponentCount-1 do if (Components[i] is TForm) then ReTranslateComponent(Components[i]); end;
Die Übersetzungen können entweder als mo-Dateien getrennt von der exe-Datei des Programms oder direkt in die exe-Datei eingebunden werden.
Dieses Verfahren ist von Vorteil, wenn mehrere exe-Dateien einer Projektgruppe die gleichen Übersetzungen verwenden. Bei der Erstellung des Installationspakets dafür müssen sie mit der gleichen Unterverzeichnisstruktur, so wie im weiteren beschrieben wird, eingefügt werden.
Die Verzeichnisstruktur ist ein wenig unübersichtlich und erklärt sich am besten durch
das nachfolgende Beispiel. Zunächst gibt es im Verzeichnis mit dem ausführbaren Programm
(exe-Datei) ein Unterverzeichnis locale. Darunter befindet sich
für jede unterstützte Sprache ein weiteres Unterverzeichnis, dessen Name dem
Kürzel nach ISO639 (z.B. de, es, it) entsprechen muss.
In jedem dieser sprachspezifischen Unterverzeichnisse gibt es dann ein weiteres
Unterverzeichnis LC_MESSAGES, in dem sich schließlich die mo-Dateien
(default.mo und evtl. die für weitere Textdomänen) mit den jeweiligen
Übersetzungen befinden.
Das nachfolgende Beispiel erläutert die Struktur:
<Exe-Verzeichnis>\ > locale\ > de\ > LC_MESSAGES\ > default.mo > delphi10.mo > es\ > LC_MESSAGES\ > default.mo > delphi10.mo ...
Dieses Verfahren eignet sich, wenn nur eine einzelne exe-Datei weiter gegeben werden soll. Sie enthält dann automatisch alle Übersetzungen. Es ist damit nicht erforderlich, die mo-Dateien mit ihrer etwas komplizierten Verzeichnisstruktur zu integrieren.
Die mo-Dateien aller zu verwendenden Sprachen müssen zunächst in die zuvor beschriebenen Unterverzeichnisse kopiert werden, um sie dann mit dem Programm ggassemble in die die exe-Datei zu integrieren.