qsTr在QQuickView中不起作用

时间:2017-05-25 13:39:43

标签: c++ qt qml qtranslate qquickview

我使用QQuickView在小部件应用程序中显示qml界面

  m_window = new QQuickView();
  m_container = QWidget::createWindowContainer(m_window,hostWidget,Qt::FramelessWindowHint);
  m_container->setFocusPolicy(Qt::TabFocus);
  m_window->setResizeMode(QQuickView::SizeRootObjectToView);
  m_window->setSource(file_url);

我需要使qml界面多语言,所以在实例化QQuickView之前我将新的翻译安装到应用程序:

  m_qmlTranslator = new QTranslator(this); // this - host QWidget    
  m_qmlTranslator->load(QString::fromUtf8("translate_%1").arg(QLocale::system().name()),strTranslationDir);
  QScopedPointer<QCoreApplication> pAppl(QApplication::instance());
  pAppl->installTranslator(m_qmlTranslator);

加载 installTranslator 函数都返回true。 (目标语言的翻译存在于ts文件中并编译为qm文件,该文件位于右侧dir)

问题是在C ++翻译中运行良好,遵循代码输出目标语言中的字符串

   qDebug() << tr("translation test");

但在QQuickView字符串中显示的qml界面保持未填充

Text {
    id: title
    text: qsTr("translation test")
    font.pixelSize: 36
    font.bold: true
    anchors.horizontalCenter: parent.horizontalCenter
}

调试时我发现Qt为QCoreApplication::translate调用qsTr("translation test")函数并使用正确的 sourceText 变量,但来自self->d_func()->translators的所有QTranslator都返回null QStrings 所以可见文本保持未翻译。

为什么会发生这种情况以及如何在QQuickView中翻译文本?

1 个答案:

答案 0 :(得分:0)

我实际上也有这个问题 C++ 翻译可以工作,QML 翻译不会(QT 5.12.8)。我花了好几个小时才找到解决方案。

对于 qml 文件,我使用了 resource.qrc 文件。我以不同的方式命名了我的 QML 文件。因此,我给它们取了一个别名,而不是 status.qml。

this->pStatus->load(QUrl(QLatin1String("qrc:/statusQML")));

这没有用。解决方案:去掉资源文件中的别名并像这样打开:

this->pStatus->load(QUrl(QLatin1String("qrc:/status.qml")));

瞧。

希望这能让某人节省几个小时。我猜这可能是一个 QT-Bug。