Я пытаюсь убедить мое приложение Qt перевести кнопки в пустое диалоговое окно. По неизвестной причине первый диалог переводится на немецкий, но диалог, выполненный в лямбда-слоте, не переводится. Я уже пытался использовать более старый синтаксис сигнала, чтобы увидеть, было ли лямбда-выражение проблемой, но это не изменило результат.
После того, как конструктор RTWindow завершен, конструктор приложения завершен и main()
звонки app.exec()
, У меня нет кода, который я мог бы контролировать, который мог бы заменить переводчик.
В этом коде обратный вызов, вызываемый нажатием на элемент меню, создает непереведенное диалоговое окно. Диалог, созданный в конструкторе, переведен.
Я не вижу
RTWindow::RTWindow(QWidget *parent) : QMainWindow(parent)
{
ui.setupUi(this);this->setWindowTitle("RodeTracker 2");
auto fileMenu = new QMenu("Datei");
auto configMenu = new QMenu("Bearbeiten");
auto clientAction = new QAction("Kunden ...");
configMenu->addAction(clientAction);
ui.menuBar->addMenu(fileMenu);
ui.menuBar->addMenu(configMenu);
// translates fine:
QMessageBox msgBox;
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
msgBox.exec();
connect(clientAction, &QAction::triggered, [=]()
{
// doesn't translate:
QMessageBox msgBox;
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
msgBox.exec();
});
}
Перевод устанавливается с такими строками: (QApplication производный конструктор)
QLocale::setDefault(QLocale(QLocale::German, QLocale::Germany));
QTranslator qtBaseTranslator;
if (qtBaseTranslator.load(QLocale::German, "qtbase", "_", ""))
{
installTranslator(&qtBaseTranslator);
qDebug() << "Base Translator loaded";
}
Я получаю вывод «Базовый переводчик загружен». Кто-нибудь знает, что может помешать переводу?
QTranslator
объект должен существовать в течение всего срока службы приложения QApplication. В приведенном выше примере генерация переводчика в качестве локальной переменной в QAppDeriv
С конструктором все будет хорошо во время строительства, но не после этого. Правильный подход заключается в создании QTranslator
в кучу.
QAppDeriv::QAppDeriv(int &argc, char **argv, int flags)
: QApplication(argc, argv, flags)
{
// set default local
QLocale::setDefault(QLocale(QLocale::German, QLocale::Germany));
// create translator objects on heap
QTranslator *qtTranslator = new QTranslator();
if (qtTranslator->load(QLocale::German, "qt", "_", ""))
{
installTranslator(qtTranslator);
}
QTranslator *qtBaseTranslator = new QTranslator();
if (qtBaseTranslator->load(QLocale::German, "qtbase", "_", ""))
{
installTranslator(qtBaseTranslator);
}
// create the main window
window = std::make_shared<RTWindow>();
window->show();
}
Других решений пока нет …