Tutoriel MSEide


Eine mehrsprachige Anwendung mit MSEi18n

Meine Anwendung

Meine Anwendung ist von dem Beispiel im Ordner <msedir>/apps/i18ndemo/ inspiriert.

Erstellen der Anwendung in MSEide

Meine Anwendung hat eine Komponente vom Typ tstringdisp und drei Schaltflächen, die zum Ändern der Sprache verwendet werden.

type
  tmainfo = class(tmainform)
    sd_weather: tstringdisp;
    bt_english: tbutton;
    bt_german: tbutton;
    bt_french: tbutton;

Komponenteneigenschaften

Im Objektinspektor weise ich der Eigenschaft frame.caption der Komponente sd_weather einen Wert zu.

Objektinspektor

Ich weise auch der Text-Eigenschaft derselben Komponente einen Wert zu.

Objektinspektor

Ich habe auch die caption-Eigenschaft des Hauptformulars ausgefüllt.

Objektinspektor

Die msei18nutils-Unit

In main.pas füge ich den Verweis auf die Unit msei18nutils hinzu.

implementation

uses
  main_mfm,
  msei18nutils;

Ein String vom Typ resourcestring

Ich deklariere einen String vom Typ resourcestring.

uses
  main_mfm,
  msei18nutils;

resourcestring
  rs_goodbye = 'Good bye!';

Ich erstelle meine Bewerbung. Der Compiler informiert mich, dass er eine main.rsj-Datei erstellt.

Writing Resource String Table file: main.rsj

Aus Neugier werfe ich einen Blick in diese Datei (die sich im selben Ordner wie die kompilierten Units befindet).

{"version":1,"strings":[
{"hash":90624273,"name":"main.rs_goodbye","sourcebytes":[71,111,111,100,32,98,121,101,33],"value":"Good bye!"}
]}

Alles scheint korrekt. Es ist Zeit, die Anwendung MSEi18n zu öffnen.

MSEi18n

Die Anwendung MSEi18n befindet sich im Ordner <msedir>/tools/i18n/.

MSEi18n-Konfiguration

Nachdem ich MSEi18n kompiliert habe, öffne ich es und klicke im Menü Settings auf die Schaltfläche Configure MSEi18n.

Die Felder MSEDIR und COMPILER müssen wie im folgenden Bild ausgefüllt werden.

MSEi18n Configure

Erstellen eines Übersetzungsprojekts

Ich erstelle ein neues Übersetzungsprojekt (eine TRP-Datei), indem ich auf die Schaltfläche New klicke.

MSEi18n New

Nachdem ich den Speicherort und den Namen meines Projekts ausgewählt habe, klicke ich auf OK.

Projekteditierung

Ich werde jetzt mein Übersetzungsprojekt bearbeiten. Dazu klicke ich auf die Schaltfläche Edit.

Ich klicke in die Spalte File, um eine neue Zeile im Raster zu erstellen, und füge in diese Zeile die Datei main.mfm ein. In der Spalte Kind wähle ich rfk_module aus.

Da ich in meiner Anwendung einen String vom Typ resourcestring verwende, füge ich eine zweite Zeile hinzu. Dazu klicke ich mit der rechten Maustaste über die erste Zeile und wähle im angezeigten Menü Append Row.

In der Spalte File gebe ich main.rsj an. In der Spalte Kind wähle ich rfk_resstrings aus.

Außerdem fülle ich die Spalten Language und Directory aus (eine Zeile für Deutsch, eine Zeile für Französisch).

MSEi18n Edit

String-Übersetzung

Mit einem Klick auf OK schließe ich das Fenster. Ich kann nun einerseits die in meiner MFM-Datei enthaltenen Zeichenfolgen und andererseits die in der RSJ-Datei enthaltene Zeichenfolge vom Typ resourcestring übersetzen.

MSEi18n

Sie werden feststellen, dass ich die Optionen flat und string only aktiviert habe, um nur die Daten anzuzeigen, die mich interessieren.

Speichern des Projekts

Sobald die Übersetzungsarbeiten abgeschlossen sind, speichere ich mein Projekt durch einen Klick auf die Schaltfläche Save.

Compilation

Bevor ich das Projekt kompiliere, erstelle ich die Ordner, die die Module enthalten sollen, basierend auf dem, was ich beim Bearbeiten des Projekts angegeben habe.

mkdir -p de
mkdir -p fr

Mit einem Klick auf Make kann ich das Projekt nun kompilieren. Es öffnet sich ein Fenster, in dem ich überprüfen kann, ob die Kompilierung der Module durch Free Pascal erfolgreich verlaufen ist.

MSEi18n Make

Hier sind die Dateien, die erstellt wurden.

projet
├── de
│   ├── demo_de.pas
│   ├── libdemo_de.so
│   ├── main.mfm
│   ├── main_mfm.pas
│   ├── main.rsj
│   └── main_rst.pas
├── demo.pas
├── demo.prj
├── demo.trd
├── demo.trp
├── fr
│   ├── demo_fr.pas
│   ├── libdemo_fr.so
│   ├── main.mfm
│   ├── main_mfm.pas
│   ├── main.rsj
│   └── main_rst.pas
├── libdemo_de.so
├── libdemo_fr.so
├── main.mfm
├── main_mfm.pas
├── main.pas
└── main.rsj

Es ist Zeit, meine Bewerbung fertigzustellen. Also öffne ich mein demo.prj-Projekt in MSEide erneut (falls ich es geschlossen hatte).

Ändern der Anwendungssprache

Die Prozedur loadlangunit

Ich erstelle eine Methode für das onexecute-Event des bt_german-Buttons.

Im Hauptteil dieser Methode verwende ich die Funktion loadlangunit, um die Sprache zu ändern, mit dem Basisnamen des Moduls als Parameter.

procedure tmainfo.onexecute_bt_german(const sender: TObject);
begin
 loadlangunit('demo_de');
end;

Das Gleiche mache ich für Französisch.

procedure tmainfo.onexecute_bt_french(const sender: TObject);
begin
  loadlangunit('demo_fr');
end;

Um die Anwendung wieder auf Englisch zu setzen (die Sprache der in der MFM-Datei enthaltenen Zeichenfolgen), muss ich nur die Prozedur loadlangunit mit einer leeren Zeichenfolge als Argument aufrufen.

procedure tmainfo.onexecute_bt_english(const sender: TObject);
begin
  loadlangunit('');
end;

Die utf8tostring-Funktion

Ich muss noch etwas mit meinem String rs_goodbye vom Typ resourcestring machen. Ich möchte, dass sich meine Anwendung vom Benutzer in der zuletzt ausgewählten Sprache verabschiedet, wenn dieser das Fenster schließt.

Also füge ich eine Methode für das onclosequery-Ereignis der Klasse tmainfo hinzu.

procedure tmainfo.onclosequery_mainfo(const sender: tcustommseform; var amodalresult: modalresultty);
begin
end;

Im Hauptteil dieser Methode verwende ich die Funktion utf8tostring, um die Übersetzung der Zeichenfolge rs_goodbye zu erhalten.

procedure tmainfo.onclosequery_mainfo(const sender: tcustommseform; var amodalresult: modalresultty);
var
  s: string;
begin
  s := utf8tostring(rs_goodbye);
  showmessage(s);
end;

Das ist alles! Jetzt muss ich meine Anwendung nur noch kompilieren und ausprobieren.

Auf Wiedersehen

Wenn Sie möchten, können Sie den Projektquellcode herunterladen.