How to create a multi language application/de
Wie erstelle ich eine Applikation, welche die Sprache zur Laufzeit umschalten kann?
Erstellen einer Standardapplikation mit einem Hauptfenster
In diesem Beispiel gibt es ein Hauptfenster mit dem Hauptmenü “Language” und ein paar Widgets im Hauptfenster. Wenn das Sprachmenü aufgeklappt wird, soll dynamisch eine Sprachauswahl angezeigt werden, je nachdem, welche Sprachdateien vorhanden sind:
Ordnerstruktur der Applikation:
- <Applikationsverzeichnis>
- ausführbare Dateien
- <Applikationsverzeichnis>/languages
- für jede Sprache ein Bild (max 16×16) mit der Fahne (z.B. de.png)
- für jede Sprache die übersetzte Datei mit den Texten der Applikation (z.B. TranslationExample_de.qm)
- für jede Sprache die übersetzte Datei mit den Texten von Qt (z.B. qt_de.qm)
Klassendefinition
In der Hauptfensterklasse wird die Funktion changeEvent [doc.qt.nokia.com] überschrieben.
Für die zu ladenden Sprachdateien wird jeweils eine QTranslator [doc.qt.nokia.com] Instanz angelegt.
Um die Sprachumschaltung nur auszuführen, wenn sie geändert wurde, wird die aktuelle Sprache gespeichert.
Erstellen des Sprachmenüs
Das Sprachmenü wird über vorhandene Sprachdateien dynamisch erstellt. Der Vorteil ist, dass nach einem Neustart des Programms neue Übersetzungen genutzt werden können. In diesem Beispiel liegen die Sprachdateien (sowohl für Qt, als auch für die Applikation) im Unterverzeichnis “languages”. Dort kann für jede Sprache ein png angelegt werden, um diese als Icon darzustellen (z.B. mit einer Fahne).
Für jede Sprache wird ein QAction [doc.qt.nokia.com] Objekt erstellt und in eine QActionGroup [doc.qt.nokia.com] hinzugefügt. Das ermöglicht, alles über einen Slot zu lösen: connect(langGroup, SIGNAL), this, SLOT));
Sprachumschaltung
Für die Sprachumschaltung wird aus dem QAction [doc.qt.nokia.com] Objekt das Sprachkürzel geholt, der vorhandene Translator entladen (QApplication::removeTranslator [doc.qt.nokia.com] ) und die neue Sprachdatei geladen. Wenn das geklappt hat, wird der Translator wieder installiert (QApplication::installTranslator [doc.qt.nokia.com] ). Dies sorgt dafür, dass das Event QEvent::LanguageChange [doc.qt.nokia.com] ausgelöst wird, das an alle Widgets der Applikation gesendet wird. Wenn es sich nur um ein Top-Level-Fenster handelt und alle Texte dort gelesen werden, kann man auch den Translator die neue Datei lesen lassen und ui.retranslateUi(this) direkt aufrufen.
- QEvent::LanguageChange [doc.qt.nokia.com] * wird immer dann aufgerufen, wenn ein neuer Translator mittels QApplication::installTranslator hinzugefügt wird.
- QEvent::LocaleChange [doc.qt.nokia.com] * wird aufgerufen, wenn die Systemsprache umgeschaltet wird.
Hinzufügen der Übersetzung zur QMake Projektdatei
In der QMake [doc.qt.nokia.com] projektdatei fügt man die Variable TRANSLATIONS [doc.qt.nokia.com] hinzu und trägt alle Sprachen, die man erstellen möchte, ein.
Mittels lupdate [doc.qt.nokia.com]
erzeugt man die Sprachdateien, die mit dem Qt Linguist [doc.qt.nokia.com] übersetzt werden.
Dann werden die übersetzten Dateien mittels lrelease [doc.qt.nokia.com]
in das Binärformat *.qm compiliert.
Hoffentlich kann das etwas weiterhelfen.