Qt Linguist:仅翻译了 .ui-based 个小部件,其他 contexts/widgets 个未翻译

Qt Linguist: Only .ui-based widgets are translated, other contexts/widgets not

我已经检查了很多与 Qt Linguist 相关的问题,但我还没有找到针对我的特定问题的解决方案。

我有一个(中文)翻译文件,其中很多字段都正确填写了。

我的问题是在我的应用程序中只有 .ui-based contexts/widgets 的翻译工作正常。其他上下文(例如 VideoWidget)未被翻译。

翻译本身似乎存在

QString test1 = QApplication::translate("MainWindow", "Report");
QString test2 = QApplication::translate("VideoWidget", "Left");

test1 = "报告"

test2 = "报告"

VideoWidget 派生自 QGroupBox,如前所述,它不是从 .ui 文件生成的。

我需要做什么才能使非.ui-based widgets/contexts 的翻译正常工作?据我所知,翻译器全局存储在 QApplication 中,所以我无法想象需要为每个小部件加载翻译器..

它将帮助您设置一个翻译器:

QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(),
         QLibraryInfo::location(QLibraryInfo::TranslationsPath));
a.installTranslator(&qtTranslator);

通过这种方式,它也会翻译默认的小部件和所有 Qt 文本。

显然,需要 manually/explicitly 通过为这些小部件编写您自己的 retranslateUi() 类方法来处理非基于 ui 的小部件的翻译。这些需要在 LanguageChange 事件上触发。

这也是基于设计器的小部件的(自动生成的)retranslateUi() 函数中发生的情况。

void MainWindow::changeEvent(QEvent* event)
{
    if(event->type() == QEvent::LanguageChange)
        m_videoWidget->retranslateUi();
    else
        QMainWindow::changeEvent(event);
}

void VideoWidget::retranslateUI()
{
    m_button1->setText(tr("Left"));
    m_button1->setToolTip(tr("Select Left Camera."));
    m_button2->setText(tr("Posterior"));
    m_button2->setToolTip(tr("Select Posterior Camera."));
    m_button3->setText(tr("Right"));
    m_button3->setToolTip(tr("Select Right Camera."));

    m_dockButton->setText(tr("Toggle docking"));
    m_dockButton->setToolTip(tr("Dock or undock the video view."));
}