Почему мой C++ Qt UI был переведен, а не мои QStrings в моей программе?

Мне нужно было перевести мой английский пользовательский интерфейс на французский, поэтому я сделал все необходимое с помощью файлов.ts и.qm, загрузил его в класс QTranslator и установил в QApplication:

//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

Позже я создаю и присоединяю к InterfaceWidget другой виджет (во вкладке) с именем ConfigurationTabUI:

m_ConfigurationTabUI = new ConfigurationTabUI(ui.configTab);

Соответствующий интерфейс также переведен на французский, правильно.

И вот моя проблема: в методах ConfigurationTabUI он не работает, когда я пытаюсь перевести простую строку QString:

void ConfigurationTabUI::on_ValidButton_clicked(){

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

Я действительно понятия не имею, почему... Спасибо за вашу помощь.

Примечание: я использую Qt5.2 и дважды проверил, что файл.ts содержит правильную переведенную строку.

1 ответ

Решение

Хорошо, я нашел проблему, это просто тупой недосмотр:

QTranslator создается в стеке, а не динамически (в куче), поэтому объект уничтожается в конце метода. В результате он переводит пользовательский интерфейс, потому что объект все еще там, но позже, когда вызывается слот, ничего не переводится.

Вот мой код:

//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);

и в ConfigurationTabUI (который наследуется от QWidget):

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);
}
Другие вопросы по тегам