i18n: make retranslator more consistent

- Improve naming.
- Both lambda and slot versions call the code immediately.
This commit is contained in:
Adriaan de Groot 2021-07-24 12:16:19 +02:00
parent 613d076a60
commit 59f11e9b67
4 changed files with 31 additions and 11 deletions

View File

@ -134,7 +134,7 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug,
{
QPushButton* debugWindowBtn = new QPushButton;
debugWindowBtn->setObjectName( "debugButton" );
CALAMARES_RETRANSLATE_WIDGET(
CALAMARES_RETRANSLATE_FOR(
debugWindowBtn,
debugWindowBtn->setText( QCoreApplication::translate( CalamaresWindow::staticMetaObject.className(),
"Show debug information" ) ); );

View File

@ -233,6 +233,11 @@ Retranslator* Retranslator::instance()
return &s_instance;
}
void Retranslator::attach(QObject* o, std::function<void ()> f)
{
connect( instance(), &Retranslator::languageChanged, o, f );
f();
}
void
setAllowLocalTranslation( bool allow )

View File

@ -81,8 +81,12 @@ class Retranslator : public QObject
{
Q_OBJECT
public:
/// @brief Gets the global (single) Retranslator object
static Retranslator* instance();
/// @brief Helper function for attaching lambdas
static void attach( QObject* o, std::function< void( void ) > f);
signals:
void languageChanged();
@ -96,32 +100,43 @@ private:
} // namespace CalamaresUtils
// Implementation detail: connects the retranslator to a slot or function
#define CALAMARES_RETRANSLATE_FOR( object, body ) \
QObject::connect( CalamaresUtils::Retranslator::instance(), &CalamaresUtils::Retranslator::languageChanged, object, body )
/** @brief Call code for this object when language changes
*
* @p body should be a code block (it does not need braces) that can be wrapped
* up as a lambda. When the language changes, the lambda is called. Note that
* this macro should be used in constructors or other code that is run only
* once, since otherwise you will end up with multiple calls to @p body.
*
* NOTE: unlike plain QObject::connect(), the body is **also** called
* immediately after setting up the connection. This allows
* setup and translation code to be mixed together.
*/
#define CALAMARES_RETRANSLATE( body ) CALAMARES_RETRANSLATE_FOR( this, [=] { body } )
#define CALAMARES_RETRANSLATE( body ) CalamaresUtils::Retranslator::attach( this, [=] { body } )
/** @brief Call code for the given object (widget) when language changes
*
* This is identical to CALAMARES_RETRANSLATE, except the @p body is called
* for the given widget, not this object.
* for the given object, not this object.
*
* NOTE: this macro is deprecated.
* NOTE: unlike plain QObject::connect(), the body is **also** called
* immediately after setting up the connection. This allows
* setup and translation code to be mixed together.
*/
#define CALAMARES_RETRANSLATE_WIDGET( widget, body ) CALAMARES_RETRANSLATE_FOR( widget, [=] { body } )
#define CALAMARES_RETRANSLATE_FOR( object, body ) CalamaresUtils::Retranslator::attach( object, [=] { body } )
/** @brief Call a slot in this object when language changes
*
* Given a slot (in method-function-pointer notation), call that slot when the
* language changes. This is shorthand for connecting the Retranslator's
* signal to the given slot.
*
* NOTE: unlike plain QObject::connect(), the slot is **also** called
* immediately after setting up the connection. This allows
* setup and translation code to be mixed together.
*/
#define CALAMARES_RETRANSLATE_SLOT( slotfunc ) CALAMARES_RETRANSLATE_FOR( this, slotfunc )
#define CALAMARES_RETRANSLATE_SLOT( slotfunc ) \
do \
{ \
connect( CalamaresUtils::Retranslator::instance(), &CalamaresUtils::Retranslator::languageChanged, this, slotfunc ); \
(this->*slotfunc)(); \
} while ( false )
#endif

View File

@ -48,7 +48,7 @@ PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt, QObject* parent )
CalamaresUtils::unmarginLayout( m_widget->layout() );
m_cxt.addObject( "_calamares_module_basewidget", m_widget );
CALAMARES_RETRANSLATE_WIDGET(
CALAMARES_RETRANSLATE_FOR(
m_widget,
CalamaresUtils::lookupAndCall( m_obj, { "retranslate" }, { CalamaresUtils::translatorLocaleName() } ); )
}