[gelöst] Sprache zur Laufzeit ändern

Alles rund um die Programmierung mit Qt
Antworten
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

[gelöst] Sprache zur Laufzeit ändern

Beitrag von stonecold »

Hallo,

ich habe mich ein wenig mit dem QTranslator beschäftigt und es auch geschafft, die Sprache mittels

Code: Alles auswählen

app.installTranslator(&translator);
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
Zuletzt geändert von stonecold am 6. Dezember 2010 08:22, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Einfach neuen Translator laden und auf das QEvent::LanguageChange reagieren.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Jajaja, der gute alte Gültigkeitsbereich :D
Schau mal einfach wie lange dein QTranslator lebt.
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag 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.
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag 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();
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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 .... )
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Den Post von franfz solltest Du auch lesen!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

franzf hat geschrieben:Jajaja, der gute alte Gültigkeitsbereich :D
Schau mal einfach wie lange dein QTranslator lebt.
Wo hast Du das berücksichtigt? :roll:
Des weiteren würde der alte Translator auch nicht entfernt...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Hat das Plugin nicht eine eigene Übersetzungen oder woher sollen die Texte kommen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag 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!
Antworten