2017-02-08 3 views
1

Ich musste mein Englisch UI in Französisch übersetzen, also tat ich all notwendig mit .ts und .qm Dateien, in der QTranslator Klasse laden, und es das QApplication installieren:Warum wurde meine C++ Qt UI übersetzt, aber nicht meine QStrings in meinem Programm?

//in the InterfaceWidget constructor: 
QTranslator myappTranslator; 
bool loaded = myappTranslator.load("myApp_" + QLocale::system().name()); 
qDebug() << "Is translation file loaded?" << loaded; // RETURNS TRUE 
QApplication::installTranslator(&myappTranslator); 
ui.setupUi(this); 
ui.retranslateUi(this); //works, it translates the UI 

Später schaffe ich zum InterfaceWidget ein anderes Widget (in einem Register) genannt ConfigurationTabUI und befestigen: richtig

m_ConfigurationTabUI = new ConfigurationTabUI(ui.configTab); 

die entsprechende UI auch auf Französisch übersetzt.

Und hier ist mein Problem: in den Methoden des ConfigurationTabUI, es funktioniert nicht, wenn ich versuche, eine einfache QString zu übersetzen:

void ConfigurationTabUI::on_ValidButton_clicked(){ 

    QString msg(ConfigurationTabUI::tr("message to translate")); 
    qDebug() << "translated string: " << msg; // NOT TRANSLATED 
} 

Ich habe wirklich keine Ahnung, warum ... Vielen Dank für Eure Hilfe.

Hinweis: I Verwenden Sie Qt5.2, und ich habe überprüft, dass die .ts-Datei die richtige übersetzte Zeichenfolge enthält.

+2

Was Sie drucken ist nicht die gleiche Variable in dem Sie die übersetzte String gespeichert. Sie haben die Übersetzung in "msg" gespeichert, aber "l_sMsg" gedruckt, was nirgendwo anders definiert ist und wir haben keine Ahnung, wofür es eingestellt sein könnte. Wenn es sich um einen Tippfehler handelt, fixiere die Frage und dann können wir es uns noch einmal ansehen. – goug

+0

Ah, sorry, es war ein Tippfehler ... Danke, es anzuschauen – toussa

+0

Hat die 'ConfigurationTabUI' Klasse das' Q_OBJECT' Makro? Was passiert, wenn Sie 'QObject :: tr' anstelle von' ConfigurationTabUI :: tr' verwenden? – Mike

Antwort

0

Ok, ich fand das Problem, es ist nur eine stumme Aufsicht:

QTranslator auf dem Stapel erstellt wird und nicht dynamisch (auf dem Heap), so wird das Objekt am Ende des Verfahrens zerstört. Als Ergebnis übersetzt es die UI, weil das Objekt immer noch da ist, aber später, wenn ein Slot aufgerufen wird, wird nichts übersetzt.

Hier ist mein Code:

//in the InterfaceWidget constructor: 
QTranslator* myappTranslator = new QTranslator(QApplication::instance()); 
bool loaded = myappTranslator->load("myApp_" + QLocale::system().name()); 
qDebug() << "Is translation file loaded?" << loaded; // RETURNS TRUE 
QApplication::installTranslator(myappTranslator); 
ui.setupUi(this); 

und in ConfigurationTabUI (die von QWidget erbt):

void ConfigurationTabUI::changeEvent(QEvent *e) 
{ 
    if (e->type() == QEvent::LanguageChange) { 
     ui.retranslateUi(this); 
     reset(); //my method to reload some data in UI 
    } else 
     QWidget::changeEvent(e); 
} 
+0

Ich denke, es wäre sicherer, den Übersetzer als Kind Ihrer 'QApplication' zu erstellen. Ich würde das wahrscheinlich direkt in der 'main.cpp' machen, nachdem ich das' QApplication' Objekt konstruiert habe. – smerlin

+0

Ich habe keinen Zugriff auf main.cpp, weil mein Code ein Framework-Plugin ist.InterfaceWidget-Klasse ist die "Haupt" -Klasse meines Plugins. Wäre noch 'QTranslator * myappTranslator = neuer QTranslator (QApplication :: instance());' sei besser? In welchem ​​Fall ? – toussa

+0

Die QApplication verweist auf das Translator-Objekt. Daher müssen Sie sicherstellen, dass die Lebensdauer des QTranslator-Objekts nicht endet, bevor das QApplication-Objekt zerstört wird. In Qt machen Sie das, indem Sie den QTranslator zu einem Kind von QApplication machen. – smerlin

Verwandte Themen