1

我使用 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);

loadinstallTranslator函数都返回 true。(目标语言的翻译存在于 ts 文件中并编译为 qm 文件,该文件放置在正确的目录中)

问题是在 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使用正确的sourceTextQCoreApplication::translate变量调用该函数,但所有 QTranslators 都返回 null QStrings,因此可见文本保持未翻译。qsTr("translation test")self->d_func()->translators

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

4

1 回答 1

0

实际上我也遇到了这个问题,C++ Translations 可以,QML Translations 不行(QT 5.12.8)。我花了好几个小时才找到解决方案。

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

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

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

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

瞧。

希望这可以节省一些时间。我想这可能是一个 QT-Bug。

于 2021-05-13T16:32:56.877 回答