Search code examples
c++qttranslation

how to translate key shortcut


I cannot force QKeySequence::toString() to return translated shortcut representation despite the fact that it documentation suggests it should work. The docs say: "The strings, "Ctrl", "Shift", etc. are translated using QObject::tr() in the "QShortcut" context." but I am not completely sure what it means by shortcut context. I am probably doing something wrong...

Here is my example. To make it work, I need to copy qtbase_es.qm from Qt installation directory to my project build directory. When the translation is correctly loaded, the action in the menu correctly shows "Action Control+Intro" which is Spanish translation of the shortcut for "Action Ctrl+Enter". But the tooltip on the main window is still "Action (Ctrl+Enter)". I would expect it to be "Action (Control+Intro)", like in the menu. What am I doing wrong?

#include <QAction>
#include <QApplication>
#include <QDebug>
#include <QMainWindow>
#include <QMenuBar>
#include <QTranslator>

int main(int argc, char *argv[])
{
    QTranslator spanish;
    qDebug() << spanish.load("qtbase_es.qm"); // should return true if correctly loaded
    QApplication a(argc, argv);
    QApplication::installTranslator(&spanish);
    QMainWindow w;
    auto menu = new QMenu("Menu");
    auto action = menu->addAction("Action");
    action->setShortcutContext(Qt::ApplicationShortcut);
    action->setShortcut(Qt::CTRL | Qt::Key_Enter);
    w.menuBar()->addMenu(menu);
    w.show();
    QApplication::processEvents(); // I also tried this line but it is useless...
    w.setToolTip(QString("%1 (%2)").arg(action->text(), action->shortcut().toString()));
    qDebug() << action->shortcut().toString(); // WRONG: returns Ctrl+Enter but I expect Control+Intro
    return a.exec();
}

Solution

  • The QShortcut::toString has a SequenceFormat parameter, defaulted to ProtableText. The documentation of the format states, that portable format is intended for e.g. writing to a file.

    The native format is intended for displaying to the user, and only this format performs translations.

    Try:

    qDebug() << action->shortcut().toString(QKeySequence::NativeText);