VirtualBox

Changeset 97351 in vbox


Ignore:
Timestamp:
Oct 31, 2022 4:58:43 PM (2 years ago)
Author:
vboxsync
Message:

FE/Qt: bugref:9565: Avoid multiple translation calls; Try to ignore LanguageChange events besides the last one.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/globals
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/QIWithRetranslateUI.h

    r96407 r97351  
    4242/* GUI includes: */
    4343#include "UILibraryDefs.h"
     44#include "UITranslator.h"
    4445
    4546
     
    6162    virtual bool eventFilter(QObject *pObject, QEvent *pEvent)
    6263    {
    63         /* Handle LanguageChange events for qApp or this object: */
    64         if (pObject == qApp || pObject == this)
    65         {
    66             switch (pEvent->type())
    67             {
    68                 case QEvent::LanguageChange: retranslateUi(); break;
    69                 default: break;
    70             }
    71         }
     64        /* If translation is NOT currently in progress handle
     65         * LanguageChange events for qApp or this object: */
     66        if (   !UITranslator::isTranslationInProgress()
     67            && pEvent->type() == QEvent::LanguageChange
     68            && (pObject == qApp || pObject == this))
     69            retranslateUi();
     70
    7271        /* Call to base-class: */
    7372        return Base::eventFilter(pObject, pEvent);
     
    106105    virtual bool eventFilter(QObject *pObject, QEvent *pEvent)
    107106    {
    108         /* Handle LanguageChange events for qApp or this object: */
    109         if (pObject == qApp || pObject == this)
    110         {
    111             switch (pEvent->type())
    112             {
    113                 case QEvent::LanguageChange: retranslateUi(); break;
    114                 default: break;
    115             }
    116         }
     107        /* If translation is NOT currently in progress handle
     108         * LanguageChange events for qApp or this object: */
     109        if (   !UITranslator::isTranslationInProgress()
     110            && pEvent->type() == QEvent::LanguageChange
     111            && (pObject == qApp || pObject == this))
     112            retranslateUi();
     113
    117114        /* Call to base-class: */
    118115        return Base::eventFilter(pObject, pEvent);
     
    142139    virtual bool eventFilter(QObject *pObject, QEvent *pEvent)
    143140    {
    144         /* Handle LanguageChange events for qApp or this object: */
    145         if (pObject == qApp || pObject == this)
    146         {
    147             switch (pEvent->type())
    148             {
    149                 case QEvent::LanguageChange: retranslateUi(); break;
    150                 default: break;
    151             }
    152         }
     141        /* If translation is NOT currently in progress handle
     142         * LanguageChange events for qApp or this object: */
     143        if (   !UITranslator::isTranslationInProgress()
     144            && pEvent->type() == QEvent::LanguageChange
     145            && (pObject == qApp || pObject == this))
     146            retranslateUi();
     147
    153148        /* Call to base-class: */
    154149        return Base::eventFilter(pObject, pEvent);
     
    187182    virtual bool eventFilter(QObject *pObject, QEvent *pEvent)
    188183    {
    189         /* Handle LanguageChange events for qApp or this object: */
    190         if (pObject == qApp || pObject == this)
    191         {
    192             /* Handle LanguageChange events: */
    193             switch (pEvent->type())
    194             {
    195                 case QEvent::LanguageChange: retranslateUi(); break;
    196                 default: break;
    197             }
    198         }
     184        /* If translation is NOT currently in progress handle
     185         * LanguageChange events for qApp or this object: */
     186        if (   !UITranslator::isTranslationInProgress()
     187            && pEvent->type() == QEvent::LanguageChange
     188            && (pObject == qApp || pObject == this))
     189            retranslateUi();
     190
    199191        /* Call to base-class: */
    200192        return Base::eventFilter(pObject, pEvent);
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UITranslator.cpp

    r97068 r97351  
    7777/* static */
    7878UITranslator *UITranslator::s_pTranslator = 0;
     79bool UITranslator::s_fTranslationInProgress = false;
    7980QString UITranslator::s_strLoadedLanguageId = UITranslator::vboxBuiltInLanguageName();
    8081
     
    143144    }
    144145
     146    /* Lock listener: */
     147    s_fTranslationInProgress = true;
     148    /* A list of translators to install: */
     149    QList<QTranslator*> translators;
     150
    145151    /* Delete the old translator if there is one: */
    146152    if (s_pTranslator)
     
    165171        /* We install the translator in any case: on failure, this will
    166172         * activate an empty translator that will give us English (built-in): */
    167         qApp->installTranslator(s_pTranslator);
     173        translators << s_pTranslator;
    168174    }
    169175    else
     
    189195        Assert(pQtSysTr);
    190196        if (pQtSysTr && pQtSysTr->load(strLanguageFileName))
    191             qApp->installTranslator(pQtSysTr);
     197            translators << pQtSysTr;
    192198        // Note that the Qt translation supplied by Oracle is always loaded
    193199        // afterwards to make sure it will take precedence over the system
     
    205211        Assert(pQtTr);
    206212        if (pQtTr && (fLoadOk = pQtTr->load(strLanguageFileName)))
    207             qApp->installTranslator(pQtTr);
     213            translators << pQtTr;
    208214        /* The below message doesn't fit 100% (because it's an additional
    209215         * language and the main one won't be reset to built-in on failure)
     
    220226    ::darwinRetranslateAppMenu();
    221227#endif
     228
     229    /* Iterate through all the translators: */
     230    for (int i = 0; i < translators.size(); ++i)
     231    {
     232        /* Unlock listener before the last one translator: */
     233        if (i == translators.size() - 1)
     234        {
     235            QCoreApplication::sendPostedEvents(0, QEvent::LanguageChange);
     236            s_fTranslationInProgress = false;
     237        }
     238
     239        /* Install current one: */
     240        qApp->installTranslator(translators.at(i));
     241    }
     242
     243    /* Unlock listener in case if it's still locked: */
     244    s_fTranslationInProgress = false;
    222245}
    223246
     
    762785}
    763786
     787/* static */
     788bool UITranslator::isTranslationInProgress()
     789{
     790    return s_fTranslationInProgress;
     791}
     792
    764793UITranslator::UITranslator(QObject *pParent /* = 0 */)
    765794    : QTranslator(pParent)
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UITranslator.h

    r97068 r97351  
    127127    static QString insertKeyToActionText(const QString &strText, const QString &strKey);
    128128
     129    /** Returns whether we are performing translation currently. */
     130    static bool isTranslationInProgress();
     131
    129132private:
    130133
     
    152155    static UITranslator *s_pTranslator;
    153156
     157    /** Holds whether we are performing translation currently. */
     158    static bool  s_fTranslationInProgress;
     159
    154160    /** Holds the currently loaded language ID. */
    155161    static QString  s_strLoadedLanguageId;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette