-1

我使用 Qt Linguist 添加了一个翻译文件。然后我在加载我的应用程序时继续使用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

4

1 回答 1

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);
于 2019-08-21T10:20:29.517 回答