2

我需要用法语翻译我的英文 UI,所以我使用 .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);

相应的 UI 也正确翻译为法语。

这是我的问题:在 ConfigurationTabUI 的方法中,当我尝试翻译一个简单的 QString 时它不起作用:

void ConfigurationTabUI::on_ValidButton_clicked(){

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

我真的不知道为什么...感谢您的帮助。

注意:我使用 Qt5.2 并仔细检查了 .ts 文件是否包含正确的翻译字符串。

4

1 回答 1

1

好的,我发现了问题,这只是一个愚蠢的疏忽:

QTranslator 是在堆栈上创建的,而不是动态的(在堆上),所以对象在方法结束时被销毁。结果,它翻译了 UI,因为该对象仍然存在,但是稍后,当调用一个插槽时,什么都没有翻译。

这是我的代码:

//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);
}
于 2017-02-10T08:58:15.257 回答