Seite 1 von 1
[gelöst] Sprache zur Laufzeit ändern
Verfasst: 2. Dezember 2010 15:10
von stonecold
Hallo,
ich habe mich ein wenig mit dem QTranslator beschäftigt und es auch geschafft, die Sprache mittels
beim Programmstart einzustellen. Gibt es eine Möglichkeit die Sprache zur Laufzeit zu änderen? Im Forum gibt es Einträge von 2008, da gab es die Funktion retranslateUi. Diese Funktion scheint in der Version 4.6 nicht mehr drin zu sein.
Des Weiteren habe ich versucht den Shortcut Ctrl+D z.B. in meinem TS File in Strg+D zu übersetzten. Leider erscheint im Menu dann nur noch D. Was könnte das Problem sein.
Danke für Antworten und Gruß,
Mario
Verfasst: 2. Dezember 2010 16:18
von Christian81
Einfach neuen Translator laden und auf das QEvent::LanguageChange reagieren.
Verfasst: 3. Dezember 2010 09:52
von stonecold
Hallo Christian,
danke für deine schnelle Antwort.
Ich habe folgenen Eintrag in der Doku gefunden, der sich ja auch deiner Aussage deckt.
http://doc.trolltech.com/4.6/internatio ... ranslation
Offensichtlich habe ich aber irgendetwas nicht richtig verstanden.
Ich will in meinem Beispielprojekt die Sprache von deutsch nach Englisch switchen.
Folgendes ist der Slot der bei Betätigung eines Eitrags in meinem Menu aufgerufen wird.
Code: Alles auswählen
void QListBug::englischSlot(bool flag)
{
std::cout << "english pressed\n";
QTranslator translator;
translator.load("QListBug_en");
QApplication::instance()->installTranslator(&translator);
}
Danach gibt es auch das erwartete Event QEvent::LanguageChange, welches ich folgendermaßen nutze.
Code: Alles auswählen
void QListBug::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange)
{
ui.actionDeutsch->setText(tr("Deutsch"));
ui.actionEnglisch->setText(tr("Englisch"));
}
else
{
QWidget::changeEvent(event);
}
}
Ich hätte jetzt erwartet, dass nach dem Laden des entsprechenden qm Files die Texte entsprechend der Übersetzung, also German und English und nicht Deutsch und Englich gesetzt werden.
Bezüglich der oben beschreibenen Shortcutproblematik habe ich auch noch keine Lösung gefunden.
Was mache ich falsch?
Verfasst: 3. Dezember 2010 10:02
von franzf
Jajaja, der gute alte Gültigkeitsbereich

Schau mal einfach wie lange dein QTranslator lebt.
Verfasst: 3. Dezember 2010 10:09
von stonecold
Hallo franzf,
aber auch so (das Beispiel ist natürlich nicht so schön)
Code: Alles auswählen
void QListBug::englischSlot(bool flag)
{
std::cout << "englisch pressed\n";
QTranslator* translator = new QTranslator();
translator->load("QListBug_en");
QApplication::instance()->installTranslator(translator);
}
funktioniert es nicht.
Verfasst: 3. Dezember 2010 10:32
von stonecold
Muss der ursprüngliche Translator eigentlich deinstalliert werden. So sieht meine main.cpp aus
Code: Alles auswählen
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator translator;
if(a.arguments().contains("-de"))
{
translator.load("QListBug_de");
}
else
{
translator.load("QListBug_en");
}
a.installTranslator(&translator);
QListBug w;
w.show();
return a.exec();
}
Verfasst: 3. Dezember 2010 17:16
von Christian81
Muss der ursprüngliche Translator eigentlich deinstalliert werden.
Ein bischen doku lesen ist doch nun wirklich nicht schwer, oder?
http://doc.trolltech.com/4.7/qcoreappli ... Translator
Verfasst: 4. Dezember 2010 09:22
von padreigh
stonecold hat geschrieben:
Code: Alles auswählen
void QListBug::englischSlot(bool flag)
{
std::cout << "english pressed\n";
QTranslator translator;
translator.load("QListBug_en");
QApplication::instance()->installTranslator(&translator);
}
Zwar am Thema vorbei, aber: warum std::cout ?!?
Code: Alles auswählen
#include <QDebug>
qDebug() << "dein Fehlertext" << QVariant(0.8) << QString("1,2,3,4,5,6,7").split(",");
Wenn du das ganze ohne (CONFIG -= debug) kompilierst fehlen die Ausgaben, mit (CONFIG += debug) kommen sie raus - kein Auskommentieren nötig ... qWarning() und qCritical() gibts auch, du kannst nen eigenen messagehandler installieren der das irgendwohin (nicht wie std-mässig auf std::cout) rauspackt - warscheinlich könnteste sogar 3 verschiedene Logfiles in dem messsagehandler nutzen .... )
Verfasst: 6. Dezember 2010 08:22
von stonecold
Hallo Christian,
danke für den Link! Ich hatte diese Info eher in der Klasse QTranslator vermutet. Ich habe noch zwei Fragen. Das Beispiel ist in deutsch. Wenn ich es mit -de starte kann ich auch problemlos zwischen deutsch und englisch umschalten. Starte ich das eigentlich deutsche Programm aber in englisch kann ich es nicht zurück auf deutsch schalten. Erst nachdem ich jetzt in der deutschen Übersetzungsdatei von deutsch nach deutch

übersetzt habe geht es. Ich hätte erwartet, dass wenn keine Übersetzung vorhanden ist, die eingecodete Sprache genommen wird.
Frage 2: Wieso kann ich aus Ctrl+D micht Strg+D machen. Bei mir steht jetzt nur noch D.
@padreigh: Danke für den Tipp!
Gruß,
Mario
Verfasst: 6. Dezember 2010 08:42
von Christian81
Den Post von franfz solltest Du auch lesen!
Verfasst: 6. Dezember 2010 08:56
von stonecold
Das habe ich doch bereits berücksichtigt. Translator ist ein Member der Klasse.
Code: Alles auswählen
void QListBug::deutschSlot(bool flag)
{
std::cout << "deutsch pressed\n";
translator.load("QListBug_de");
QApplication::instance()->installTranslator(&translator);
}
void QListBug::englischSlot(bool flag)
{
std::cout << "englisch pressed\n";
translator.load("QListBug_en");
QApplication::instance()->installTranslator(&translator);
}
Die Kombiniation Programm in deutsch starten und dann zwischen deutsch und englisch togglen funktioniert ja auch. In englisch starten nur wenn ich die deutsche qm-Datei ins deutsche übersetzten obwohl die gecodete Sprache auch deutsch ist. Das kann denn doch nichts mit dem Gültigkeitsbereich zutun haben. Habe ich dich falsch verstanden?
Verfasst: 6. Dezember 2010 09:47
von Christian81
franzf hat geschrieben:Jajaja, der gute alte Gültigkeitsbereich

Schau mal einfach wie lange dein QTranslator lebt.
Wo hast Du das berücksichtigt?
Des weiteren würde der alte Translator auch nicht entfernt...
Verfasst: 8. Dezember 2010 10:13
von stonecold
Hallo Christian,
translator ist Member der Klasse. Folglich ist die Lebenszeit von translator an die Lebenszeit des Objektes gekoppelt.
Das Deinstallieren des Translators hat dazu geführt, das die gecodeten Begriffe wieder genommen werden.
Eine letzte Frage zu dem Thema. Wie verhält es sich mit Plugins?
Ich habe verschiedene Plugins mit mehreren Fenstern. Im Interface habe ich bereits ein Funktion vorgesehen, die das retranslateUi des jeweiligen Widgets aufruft. Eine Übersetzung findet allerdings nicht statt.
Verfasst: 9. Dezember 2010 18:12
von Christian81
Hat das Plugin nicht eine eigene Übersetzungen oder woher sollen die Texte kommen?
Verfasst: 9. Dezember 2010 20:28
von stonecold
Hallo Christian,
übersetzt werden die Sachen. Allerdings liefern mir die Plugins verschiedene Widgets, die ich in der Mainapplication in einem TabWidget einfüge. Der Name des Widgets ist das Label des jeweiligen Tabs ( accessibleName() ). Wenn ich das Plugin neu lade sind die Begriffe auch übersetzt. Ich suche jetzt nach einem eleganten Weg die Tab-Label zu "updaten" ohne das Plugin neu zu laden.
Gruß,
Mario
Edit:
Okay, hab ne Lösung
Code: Alles auswählen
for(unsigned int i = 1; i < ui.tabWidget->count()-1; ++i)
{
ui.tabWidget->setTabText(i, ui.tabWidget->widget(i)->accessibleName());
}
Die Widget werden zwischen zwei bereits existierende Tabs eingefügt deshalb i = 1!
Danke!