Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.

How to create a multi language application/de: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
[[Category:HowTo::German]]<br />[[How_to_create_a_multi_language_application|English]] '''German''' [[How_to_create_a_multi_language_application_Greek|Ελληνικά]]
[[Category:HowTo::German]]
[[How_to_create_a_multi_language_application|English]] '''German''' [[How_to_create_a_multi_language_application_Greek|Ελληνικά]]


[toc align_right=&quot;yes&amp;quot; depth=&quot;2&amp;quot;]
[toc align_right="yes" depth="2"]


= Wie erstelle ich eine Applikation, welche die Sprache zur Laufzeit umschalten kann? =
= Wie erstelle ich eine Applikation, welche die Sprache zur Laufzeit umschalten kann? =
Line 9: Line 10:
[[Image:http://lh3.ggpht.com/_m1PNLlZctqY/TRELoZ10m5I/AAAAAAAAAC0/qskj_psAyCI/s800/LanguageApp.png|Hauptfenster der Applikation]]
[[Image:http://lh3.ggpht.com/_m1PNLlZctqY/TRELoZ10m5I/AAAAAAAAAC0/qskj_psAyCI/s800/LanguageApp.png|Hauptfenster der Applikation]]


In diesem Beispiel gibt es ein Hauptfenster mit dem Hauptmenü &quot;Language&amp;quot; und ein paar Widgets im Hauptfenster. Wenn das Sprachmenü aufgeklappt wird, soll dynamisch eine Sprachauswahl angezeigt werden, je nachdem, welche Sprachdateien vorhanden sind:
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:


[[Image:http://lh3.ggpht.com/_m1PNLlZctqY/TRELoozTsDI/AAAAAAAAAC4/AWTMerfK-ME/s800/LanguageAppMenu.png|Hauptfenster der Applikation mit Sprachmenü]]
[[Image:http://lh3.ggpht.com/_m1PNLlZctqY/TRELoozTsDI/AAAAAAAAAC4/AWTMerfK-ME/s800/LanguageAppMenu.png|Hauptfenster der Applikation mit Sprachmenü]]
Line 15: Line 16:
== Ordnerstruktur der Applikation: ==
== Ordnerstruktur der Applikation: ==


* &lt;Applikationsverzeichnis&amp;gt;
* <Applikationsverzeichnis>
** ausführbare Dateien
** ausführbare Dateien
* &lt;Applikationsverzeichnis&amp;gt;/languages
* <Applikationsverzeichnis>/languages
** für jede Sprache ein Bild (max 16x16) mit der Fahne (z.B. de.png)
** für jede Sprache ein Bild (max 16x16) 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 der Applikation (z.B. TranslationExample_de.qm)
Line 24: Line 25:
== Klassendefinition ==
== Klassendefinition ==


In der Hauptfensterklasse wird die Funktion &quot;changeEvent(QEvent*)&quot;:http://doc.qt.nokia.com/latest/qwidget.html#changeEvent überschrieben.<br />Für die zu ladenden Sprachdateien wird jeweils eine &quot;QTranslator&amp;quot;:http://doc.qt.nokia.com/latest/qtranslator.html Instanz angelegt.<br />Um die Sprachumschaltung nur auszuführen, wenn sie geändert wurde, wird die aktuelle Sprache gespeichert.
In der Hauptfensterklasse wird die Funktion "changeEvent(QEvent*)":http://doc.qt.nokia.com/latest/qwidget.html#changeEvent überschrieben.
Für die zu ladenden Sprachdateien wird jeweils eine "QTranslator":http://doc.qt.nokia.com/latest/qtranslator.html Instanz angelegt.
Um die Sprachumschaltung nur auszuführen, wenn sie geändert wurde, wird die aktuelle Sprache gespeichert.


<code><br />class MainWindow : public QMainWindow<br />{<br />
<code>
class MainWindow : public QMainWindow
{


protected:<br /> /** this event is called, when a new translator is loaded or the system language is changed<br /> '''/<br /> void changeEvent(QEvent''');
protected:
/** this event is called, when a new translator is loaded or the system language is changed
*/
void changeEvent(QEvent''');


protected slots:<br /> /** this slot is called by the language menu actions<br /> '''/<br /> void slotLanguageChanged(QAction''' action);
protected slots:
/** this slot is called by the language menu actions
*/
void slotLanguageChanged(QAction''' action);


private:<br /> /** loads a language by the given language shortcur (e.g. de, en, …)<br /> '''/<br /> void loadLanguage(const QString&amp;amp; rLanguage);
private:
<br /> /'''* creates the language menu dynamically from the content of m_langPath<br /> '''/<br /> void createLanguageMenu(void);
/** loads a language by the given language shortcur (e.g. de, en, …)
<br /> Ui::MainWindow ui; /&lt; ui definition from designer'''/<br /> QTranslator m_translator; /*'''&lt; contains the translations for this application'''/<br /> QTranslator m_translatorQt; /*'''&lt; contains the translations for qt'''/<br /> QString m_currLang; /*'''&lt; contains the currently loaded language'''/<br /> QString m_langPath; /*'''&lt; Path of language files. This is always fixed to /languages.'''/<br />};<br /></code>
*/
void loadLanguage(const QString&amp;amp; rLanguage);
 
/'''* creates the language menu dynamically from the content of m_langPath
*/
void createLanguageMenu(void);
 
Ui::MainWindow ui; /< ui definition from designer*/
QTranslator m_translator; /*'''< contains the translations for this application*/
QTranslator m_translatorQt; /*'''< contains the translations for qt*/
QString m_currLang; /*'''< contains the currently loaded language*/
QString m_langPath; /*'''< Path of language files. This is always fixed to /languages.*/
};
</code>


== Erstellen des Sprachmenüs ==
== 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 &quot;languages&amp;quot;. Dort kann für jede Sprache ein png angelegt werden, um diese als Icon darzustellen (z.B. mit einer Fahne).<br />Für jede Sprache wird ein &quot;QAction&amp;quot;:http://doc.qt.nokia.com/latest/qaction.html Objekt erstellt und in eine &quot;QActionGroup&amp;quot;:http://doc.qt.nokia.com/latest/qactiongroup.html hinzugefügt. Das ermöglicht, alles über einen Slot zu lösen: '''connect(langGroup, SIGNAL (triggered(QAction *)), this, SLOT (slotLanguageChanged(QAction *)));'''
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":http://doc.qt.nokia.com/latest/qaction.html Objekt erstellt und in eine "QActionGroup":http://doc.qt.nokia.com/latest/qactiongroup.html hinzugefügt. Das ermöglicht, alles über einen Slot zu lösen: '''connect(langGroup, SIGNAL (triggered(QAction *)), this, SLOT (slotLanguageChanged(QAction *)));'''


<code><br />// we create the menu entries dynamically, dependant on the existing translations.<br />void MainWindow::createLanguageMenu(void)<br />{<br /> QActionGroup* langGroup = new QActionGroup(ui.menuLanguage);<br /> langGroup-&gt;setExclusive(true);
<code>
// we create the menu entries dynamically, dependant on the existing translations.
void MainWindow::createLanguageMenu(void)
{
QActionGroup* langGroup = new QActionGroup(ui.menuLanguage);
langGroup->setExclusive(true);


connect(langGroup, SIGNAL (triggered(QAction *)), this, SLOT (slotLanguageChanged(QAction *)));
connect(langGroup, SIGNAL (triggered(QAction *)), this, SLOT (slotLanguageChanged(QAction *)));


// format systems language<br /> QString defaultLocale = QLocale::system&amp;amp;#40;&amp;#41;.name(); // e.g. &quot;de_DE&amp;quot;<br /> defaultLocale.truncate(defaultLocale.lastIndexOf('''')); // e.g. &quot;de&amp;quot;
// format systems language
<br /> m_langPath = QApplication::applicationDirPath();<br /> m_langPath.append(&quot;/languages&amp;quot;);<br /> QDir dir(m_langPath);<br /> QStringList fileNames = dir.entryList(QStringList(&quot;TranslationExample'''''.qm&amp;quot;));
QString defaultLocale = QLocale::system().name(); // e.g. "de_DE"
<br /> for (int i = 0; i &lt; fileNames.size(); ++i)<br /> {<br /> // get locale extracted by filename<br /> QString locale;<br /> locale = fileNames[i]; // &quot;TranslationExample_de.qm&amp;quot;<br /> locale.truncate(locale.lastIndexOf('.')); // &quot;TranslationExample_de&amp;quot;<br /> locale.remove(0, locale.indexOf('''') + 1); // &quot;de&amp;quot;
defaultLocale.truncate(defaultLocale.lastIndexOf('''')); // e.g. "de"
<br /> QString lang = QLocale::languageToString(QLocale(locale).language());<br /> QIcon ico(QString(&quot;%1/%2.png&amp;quot;).arg(m_langPath).arg(locale));
 
<br /> QAction *action = new QAction(ico, lang, this);<br /> action-&gt;setCheckable(true);<br /> action-&gt;setData(locale);
m_langPath = QApplication::applicationDirPath();
<br /> ui.menuLanguage-&gt;addAction(action);<br /> langGroup-&gt;addAction(action);
m_langPath.append("/languages");
<br /> // set default translators and language checked<br /> if (defaultLocale == locale)<br /> {<br /> action-&gt;setChecked(true);<br /> }<br /> }<br />}<br /></code>
QDir dir(m_langPath);
<br />h2. Sprachumschaltung
QStringList fileNames = dir.entryList(QStringList("TranslationExample'''''.qm"));
<br />Für die Sprachumschaltung wird aus dem &quot;QAction&amp;quot;:http://doc.qt.nokia.com/latest/qaction.html Objekt das Sprachkürzel geholt, der vorhandene Translator entladen (&quot;QApplication::removeTranslator&amp;quot;:http://doc.qt.nokia.com/latest/qapplication.html#removeTranslator ) und die neue Sprachdatei geladen. Wenn das geklappt hat, wird der Translator wieder installiert (&quot;QApplication::installTranslator&amp;quot;:http://doc.qt.nokia.com/latest/qapplication.html#installTranslator ). Dies sorgt dafür, dass das Event &quot;QEvent::LanguageChange&amp;quot;:http://doc.qt.nokia.com/latest/qevent.html#Type-enum 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.<br /><code><br />// Called every time, when a menu entry of the language menu is called<br />void MainWindow::slotLanguageChanged(QAction* action)<br />{<br /> if(0 != action)<br /> {<br /> // load the language dependant on the action content<br /> loadLanguage(action-&gt;data().toString());<br /> setWindowIcon(action-&gt;icon());<br /> }<br />}
 
<br />void switchTranslator(QTranslator&amp;amp; translator, const QString&amp;amp; filename)<br />{<br /> // remove the old translator<br /> qApp-&gt;removeTranslator(&amp;translator);
for (int i = 0; i < fileNames.size(); ++i)
<br /> // load the new translator<br /> if(translator.load(filename))<br /> qApp-&gt;installTranslator(&amp;translator);<br />}
{
<br />void MainWindow::loadLanguage(const QString&amp;amp; rLanguage)<br />{<br /> if(m_currLang != rLanguage)<br /> {<br /> m_currLang = rLanguage;<br /> QLocale locale = QLocale(m_currLang);<br /> QLocale::setDefault(locale);<br /> QString languageName = QLocale::languageToString(locale.language());<br /> switchTranslator(m_translator, QString(&quot;TranslationExample''%1.qm&amp;quot;).arg(rLanguage));<br /> switchTranslator(m_translatorQt, QString(&quot;qt_%1.qm&amp;quot;).arg(rLanguage));<br /> ui.statusBar-&gt;showMessage(tr(&quot;Current Language changed to %1&amp;quot;).arg(languageName));<br /> }<br />}<br /></code>
// get locale extracted by filename
<br />''' &quot;QEvent::LanguageChange&amp;quot;:http://doc.qt.nokia.com/latest/qevent.html#Type-enum * wird immer dann aufgerufen, wenn ein neuer Translator mittels QApplication::installTranslator hinzugefügt wird.<br />* &quot;QEvent::LocaleChange&amp;quot;:http://doc.qt.nokia.com/latest/qevent.html#Type-enum * wird aufgerufen, wenn die Systemsprache umgeschaltet wird.
QString locale;
locale = fileNames[i]; // "TranslationExample_de.qm"
locale.truncate(locale.lastIndexOf('.')); // "TranslationExample_de"
locale.remove(0, locale.indexOf('''') + 1); // "de"
 
QString lang = QLocale::languageToString(QLocale(locale).language());
QIcon ico(QString("%1/%2.png").arg(m_langPath).arg(locale));
 
QAction *action = new QAction(ico, lang, this);
action->setCheckable(true);
action->setData(locale);
 
ui.menuLanguage->addAction(action);
langGroup->addAction(action);
 
// set default translators and language checked
if (defaultLocale == locale)
{
action->setChecked(true);
}
}
}
</code>
 
h2. Sprachumschaltung
 
Für die Sprachumschaltung wird aus dem "QAction":http://doc.qt.nokia.com/latest/qaction.html Objekt das Sprachkürzel geholt, der vorhandene Translator entladen ("QApplication::removeTranslator":http://doc.qt.nokia.com/latest/qapplication.html#removeTranslator ) und die neue Sprachdatei geladen. Wenn das geklappt hat, wird der Translator wieder installiert ("QApplication::installTranslator":http://doc.qt.nokia.com/latest/qapplication.html#installTranslator ). Dies sorgt dafür, dass das Event "QEvent::LanguageChange":http://doc.qt.nokia.com/latest/qevent.html#Type-enum 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.
<code>
// Called every time, when a menu entry of the language menu is called
void MainWindow::slotLanguageChanged(QAction* action)
{
if(0 != action)
{
// load the language dependant on the action content
loadLanguage(action->data().toString());
setWindowIcon(action->icon());
}
}
 
void switchTranslator(QTranslator&amp;amp; translator, const QString&amp;amp; filename)
{
// remove the old translator
qApp->removeTranslator(&amp;translator);
 
// load the new translator
if(translator.load(filename))
qApp->installTranslator(&amp;translator);
}
 
void MainWindow::loadLanguage(const QString&amp;amp; rLanguage)
{
if(m_currLang != rLanguage)
{
m_currLang = rLanguage;
QLocale locale = QLocale(m_currLang);
QLocale::setDefault(locale);
QString languageName = QLocale::languageToString(locale.language());
switchTranslator(m_translator, QString("TranslationExample''%1.qm").arg(rLanguage));
switchTranslator(m_translatorQt, QString("qt_%1.qm").arg(rLanguage));
ui.statusBar->showMessage(tr("Current Language changed to %1").arg(languageName));
}
}
</code>
 
''' "QEvent::LanguageChange":http://doc.qt.nokia.com/latest/qevent.html#Type-enum * wird immer dann aufgerufen, wenn ein neuer Translator mittels QApplication::installTranslator hinzugefügt wird.
* "QEvent::LocaleChange":http://doc.qt.nokia.com/latest/qevent.html#Type-enum * wird aufgerufen, wenn die Systemsprache umgeschaltet wird.


<code><br />void MainWindow::changeEvent(QEvent* event)<br />{<br /> if(0 != event)<br /> {<br /> switch(event-&gt;type())<br /> {<br /> // this event is send if a translator is loaded<br /> case QEvent::LanguageChange:<br /> ui.retranslateUi(this);<br /> break;<br /> // this event is send, if the system, language changes<br /> case QEvent::LocaleChange:<br /> {<br /> QString locale = QLocale::system&amp;amp;#40;&amp;#41;.name();<br /> locale.truncate(locale.lastIndexOf('_'));<br /> loadLanguage(locale);<br /> }<br /> break;<br /> }<br /> }
<code>
void MainWindow::changeEvent(QEvent* event)
{
if(0 != event)
{
switch(event->type())
{
// this event is send if a translator is loaded
case QEvent::LanguageChange:
ui.retranslateUi(this);
break;
// this event is send, if the system, language changes
case QEvent::LocaleChange:
{
QString locale = QLocale::system().name();
locale.truncate(locale.lastIndexOf('_'));
loadLanguage(locale);
}
break;
}
}


QMainWindow::changeEvent(event);<br />}<br /></code>
QMainWindow::changeEvent(event);
}
</code>


== Hinzufügen der Übersetzung zur QMake Projektdatei ==
== Hinzufügen der Übersetzung zur QMake Projektdatei ==


In der &quot;QMake&amp;quot;:http://doc.qt.nokia.com/latest/qmake-manual.html projektdatei fügt man die Variable &quot;'''TRANSLATIONS'''&quot;:http://doc.qt.nokia.com/latest/qmake-variable-reference.html#translations hinzu und trägt alle Sprachen, die man erstellen möchte, ein.<br /><code><br />TRANSLATIONS = languages/TranslationExample_en.ts  languages/TranslationExample_de.ts<br /></code>
In der "QMake":http://doc.qt.nokia.com/latest/qmake-manual.html projektdatei fügt man die Variable "'''TRANSLATIONS'''":http://doc.qt.nokia.com/latest/qmake-variable-reference.html#translations hinzu und trägt alle Sprachen, die man erstellen möchte, ein.
<code>
TRANSLATIONS = languages/TranslationExample_en.ts  languages/TranslationExample_de.ts
</code>


Mittels &quot;lupdate&amp;quot;:http://doc.qt.nokia.com/latest/linguist-manager.html#lupdate<br /><code><br />lupdate -verbose TranslationExample.pro<br /></code><br />erzeugt man die Sprachdateien, die mit dem &quot;Qt Linguist&amp;quot;:http://doc.qt.nokia.com/latest/linguist-manual.html übersetzt werden.
Mittels "lupdate":http://doc.qt.nokia.com/latest/linguist-manager.html#lupdate
<code>
lupdate -verbose TranslationExample.pro
</code>
erzeugt man die Sprachdateien, die mit dem "Qt Linguist":http://doc.qt.nokia.com/latest/linguist-manual.html übersetzt werden.


<code><br />linguist languages/TranslationExample_en.ts languages/TranslationExample_de.ts<br /></code>
<code>
linguist languages/TranslationExample_en.ts languages/TranslationExample_de.ts
</code>


Dann werden die übersetzten Dateien mittels &quot;lrelease&amp;quot;:http://doc.qt.nokia.com/latest/linguist-manager.html#lrelease
Dann werden die übersetzten Dateien mittels "lrelease":http://doc.qt.nokia.com/latest/linguist-manager.html#lrelease


<code><br />lrelease TranslationExample.pro<br /></code><br />in das Binärformat *.qm compiliert.
<code>
lrelease TranslationExample.pro
</code>
in das Binärformat *.qm compiliert.


Hoffentlich kann das etwas weiterhelfen.
Hoffentlich kann das etwas weiterhelfen.

Revision as of 09:29, 25 February 2015

English German Ελληνικά

[toc align_right="yes" depth="2"]

Wie erstelle ich eine Applikation, welche die Sprache zur Laufzeit umschalten kann?

Erstellen einer Standardapplikation mit einem Hauptfenster

Hauptfenster der Applikation

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:

Hauptfenster der Applikation mit Sprachmenü

Ordnerstruktur der Applikation:

  • <Applikationsverzeichnis>
    • ausführbare Dateien
  • <Applikationsverzeichnis>/languages
    • für jede Sprache ein Bild (max 16x16) 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(QEvent*)":http://doc.qt.nokia.com/latest/qwidget.html#changeEvent überschrieben. Für die zu ladenden Sprachdateien wird jeweils eine "QTranslator":http://doc.qt.nokia.com/latest/qtranslator.html Instanz angelegt. Um die Sprachumschaltung nur auszuführen, wenn sie geändert wurde, wird die aktuelle Sprache gespeichert.

class MainWindow : public QMainWindow
{
 

protected:
 /** this event is called, when a new translator is loaded or the system language is changed
 */
 void changeEvent(QEvent''');

protected slots:
 /** this slot is called by the language menu actions
 */
 void slotLanguageChanged(QAction''' action);

private:
 /** loads a language by the given language shortcur (e.g. de, en, …)
 */
 void loadLanguage(const QString&amp;amp; rLanguage);

 /'''* creates the language menu dynamically from the content of m_langPath
 */
 void createLanguageMenu(void);

 Ui::MainWindow ui; /< ui definition from designer*/
 QTranslator m_translator; /*'''< contains the translations for this application*/
 QTranslator m_translatorQt; /*'''< contains the translations for qt*/
 QString m_currLang; /*'''< contains the currently loaded language*/
 QString m_langPath; /*'''< Path of language files. This is always fixed to /languages.*/
};

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":http://doc.qt.nokia.com/latest/qaction.html Objekt erstellt und in eine "QActionGroup":http://doc.qt.nokia.com/latest/qactiongroup.html hinzugefügt. Das ermöglicht, alles über einen Slot zu lösen: connect(langGroup, SIGNAL (triggered(QAction *)), this, SLOT (slotLanguageChanged(QAction *)));

// we create the menu entries dynamically, dependant on the existing translations.
void MainWindow::createLanguageMenu(void)
{
 QActionGroup* langGroup = new QActionGroup(ui.menuLanguage);
 langGroup->setExclusive(true);

connect(langGroup, SIGNAL (triggered(QAction *)), this, SLOT (slotLanguageChanged(QAction *)));

// format systems language
 QString defaultLocale = QLocale::system().name(); // e.g. "de_DE"
 defaultLocale.truncate(defaultLocale.lastIndexOf('''')); // e.g. "de"

 m_langPath = QApplication::applicationDirPath();
 m_langPath.append("/languages");
 QDir dir(m_langPath);
 QStringList fileNames = dir.entryList(QStringList("TranslationExample'''''.qm"));

 for (int i = 0; i < fileNames.size(); ++i)
 {
 // get locale extracted by filename
 QString locale;
 locale = fileNames[i]; // "TranslationExample_de.qm"
 locale.truncate(locale.lastIndexOf('.')); // "TranslationExample_de"
 locale.remove(0, locale.indexOf('''') + 1); // "de"

 QString lang = QLocale::languageToString(QLocale(locale).language());
 QIcon ico(QString("%1/%2.png").arg(m_langPath).arg(locale));

 QAction *action = new QAction(ico, lang, this);
 action->setCheckable(true);
 action->setData(locale);

 ui.menuLanguage->addAction(action);
 langGroup->addAction(action);

 // set default translators and language checked
 if (defaultLocale == locale)
 {
 action->setChecked(true);
 }
 }
}

h2. Sprachumschaltung

Für die Sprachumschaltung wird aus dem "QAction":http://doc.qt.nokia.com/latest/qaction.html Objekt das Sprachkürzel geholt, der vorhandene Translator entladen ("QApplication::removeTranslator":http://doc.qt.nokia.com/latest/qapplication.html#removeTranslator ) und die neue Sprachdatei geladen. Wenn das geklappt hat, wird der Translator wieder installiert ("QApplication::installTranslator":http://doc.qt.nokia.com/latest/qapplication.html#installTranslator ). Dies sorgt dafür, dass das Event "QEvent::LanguageChange":http://doc.qt.nokia.com/latest/qevent.html#Type-enum 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.

// Called every time, when a menu entry of the language menu is called
void MainWindow::slotLanguageChanged(QAction* action)
{
 if(0 != action)
 {
 // load the language dependant on the action content
 loadLanguage(action->data().toString());
 setWindowIcon(action->icon());
 }
}

void switchTranslator(QTranslator&amp;amp; translator, const QString&amp;amp; filename)
{
 // remove the old translator
 qApp->removeTranslator(&amp;translator);

 // load the new translator
 if(translator.load(filename))
 qApp->installTranslator(&amp;translator);
}

void MainWindow::loadLanguage(const QString&amp;amp; rLanguage)
{
 if(m_currLang != rLanguage)
 {
 m_currLang = rLanguage;
 QLocale locale = QLocale(m_currLang);
 QLocale::setDefault(locale);
 QString languageName = QLocale::languageToString(locale.language());
 switchTranslator(m_translator, QString("TranslationExample''%1.qm").arg(rLanguage));
 switchTranslator(m_translatorQt, QString("qt_%1.qm").arg(rLanguage));
 ui.statusBar->showMessage(tr("Current Language changed to %1").arg(languageName));
 }
}

"QEvent::LanguageChange":http://doc.qt.nokia.com/latest/qevent.html#Type-enum * wird immer dann aufgerufen, wenn ein neuer Translator mittels QApplication::installTranslator hinzugefügt wird.

void MainWindow::changeEvent(QEvent* event)
{
 if(0 != event)
 {
 switch(event->type())
 {
 // this event is send if a translator is loaded
 case QEvent::LanguageChange:
 ui.retranslateUi(this);
 break;
 // this event is send, if the system, language changes
 case QEvent::LocaleChange:
 {
 QString locale = QLocale::system().name();
 locale.truncate(locale.lastIndexOf('_'));
 loadLanguage(locale);
 }
 break;
 }
 }

QMainWindow::changeEvent(event);
}

Hinzufügen der Übersetzung zur QMake Projektdatei

In der "QMake":http://doc.qt.nokia.com/latest/qmake-manual.html projektdatei fügt man die Variable "TRANSLATIONS":http://doc.qt.nokia.com/latest/qmake-variable-reference.html#translations hinzu und trägt alle Sprachen, die man erstellen möchte, ein.

TRANSLATIONS = languages/TranslationExample_en.ts  languages/TranslationExample_de.ts

Mittels "lupdate":http://doc.qt.nokia.com/latest/linguist-manager.html#lupdate

lupdate -verbose TranslationExample.pro

erzeugt man die Sprachdateien, die mit dem "Qt Linguist":http://doc.qt.nokia.com/latest/linguist-manual.html übersetzt werden.

linguist languages/TranslationExample_en.ts languages/TranslationExample_de.ts

Dann werden die übersetzten Dateien mittels "lrelease":http://doc.qt.nokia.com/latest/linguist-manager.html#lrelease

lrelease TranslationExample.pro

in das Binärformat *.qm compiliert.

Hoffentlich kann das etwas weiterhelfen.