Inhaltsverzeichnis
Translate

GnuGetText-Werkzeuge für Delphi


Integration in Delphi-Programme

Definition der Texte

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.

Formulare

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.

Ressourcen-Strings

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'; 
     ... 

Andere Strings im Quelltext

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 
   ... 

Erforderliche Programmergänzungen

Initialisierung des Projektes

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.

Einbinden GnuGetText in Units

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;  
    

Festlegen der Sprache beim Start des Programms

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.

Ändern der Sprache während der Laufzeit

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;

Einbinden der Übersetzungen in das Projekt

Die Übersetzungen können entweder als mo-Dateien getrennt von der exe-Datei des Programms oder direkt in die exe-Datei eingebunden werden.

Einbindung als mo-Dateien

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
      ...    

Einbetten in die exe-Datei

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.



J. Rathlev, D-24222 Schwentinental, November 2023