QTranslator在if语句中使用时不起作用

时间:2019-08-21 10:14:24

标签: c++ qt qt5 qtranslator

我使用Qt语言学家添加了翻译文件。然后,我在加载应用程序时继续使用QTranslator

    QTranslator translator;
    bool loaded = translator.load(":/notizie_en_UK.qm");
    bool installed = app.installTranslator(&translator);
    qDebug() << "Adding translation" << loaded << installed;

这很好。 现在,我只想在系统语言不是默认语言的情况下使用翻译,所以我执行了以下操作:

QLocale::Language phoneLang = QLocale::system().language();
qDebug() << "LANGUAGE" << phoneLang << (phoneLang != QLocale::Italian);
if(phoneLang != QLocale::Italian){
    QTranslator translator;
    bool loaded = translator.load(":/notizie_en_UK.qm");
    bool installed = app.installTranslator(&translator);
    qDebug() << "Adding translation" << loaded << installed;
}
else{
    qDebug() << "Using italian";
}

但是,这不起作用。例如,如果使用英语的系统,则翻译器不起作用,并且使用了应用程序的默认语言(在这种情况下为意大利语)。

qDebug()的输出是:

  

LANGUAGE QLocale :: English true

     

添加翻译true true true

1 个答案:

答案 0 :(得分:4)

问题在于,一旦程序执行退出您定义的translator语句的主体,if对象就会被销毁。您可以做的是:

[..]
if (phoneLang != QLocale::Italian) {
    QTranslator *translator = new QTranslator;
    bool loaded = translator->load(":/notizie_en_UK.qm");
    bool installed = app.installTranslator(translator);
    qDebug() << "Adding translation" << loaded << installed;
}
[..]

但是,在必要时必须小心自己销毁translator对象。

更新:

您可以定义翻译器的父级,以清除其子级对象。例如:

// The application is translator's parent.
QTranslator *translator = new QTranslator(app);