Meine Anwendung ist von dem Beispiel im Ordner <msedir>/apps/i18ndemo/ inspiriert.
Meine Anwendung hat eine Komponente vom Typ tstringdisp und drei Schaltflächen, die zum Ändern der Sprache verwendet werden.
type
class(tmainform)
tmainfo =
sd_weather: tstringdisp;
bt_english: tbutton;
bt_german: tbutton; bt_french: tbutton;
Im Objektinspektor weise ich der Eigenschaft frame.caption der Komponente sd_weather einen Wert zu.
Ich weise auch der Text-Eigenschaft derselben Komponente einen Wert zu.
Ich habe auch die caption-Eigenschaft des Hauptformulars ausgefüllt.
In main.pas füge ich den Verweis auf die Unit msei18nutils hinzu.
implementation
uses
main_mfm, msei18nutils;
Ich deklariere einen String vom Typ resourcestring.
uses
main_mfm,
msei18nutils;
resourcestring
'Good bye!'; rs_goodbye =
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.
Die Anwendung MSEi18n befindet sich im Ordner <msedir>/tools/i18n/.
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.
Ich erstelle ein neues Übersetzungsprojekt (eine TRP-Datei), indem ich auf die Schaltfläche New klicke.
Nachdem ich den Speicherort und den Namen meines Projekts ausgewählt habe, klicke ich auf OK.
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).
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.
Sie werden feststellen, dass ich die Optionen flat und string only aktiviert habe, um nur die Daten anzuzeigen, die mich interessieren.
Sobald die Übersetzungsarbeiten abgeschlossen sind, speichere ich mein Projekt durch einen Klick auf die Schaltfläche Save.
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.
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).
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
'demo_de');
loadlangunit(end;
Das Gleiche mache ich für Französisch.
procedure tmainfo.onexecute_bt_french(const sender: TObject);
begin
'demo_fr');
loadlangunit(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;
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
string;
s: begin
s := utf8tostring(rs_goodbye);
showmessage(s);end;
Das ist alles! Jetzt muss ich meine Anwendung nur noch kompilieren und ausprobieren.
Wenn Sie möchten, können Sie den Projektquellcode herunterladen.