Compare commits
9 Commits
packagecho
...
issue-1736
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1623164e0e | ||
![]() |
2ab58bca7a | ||
![]() |
73e82addb4 | ||
![]() |
4725300231 | ||
![]() |
6a57870b73 | ||
![]() |
a6f6102372 | ||
![]() |
519699c021 | ||
![]() |
011ef2cc83 | ||
![]() |
206c709f9e |
@@ -19,6 +19,7 @@
|
||||
#include "Settings.h"
|
||||
#include "ViewManager.h"
|
||||
#include "progresstree/ProgressTreeView.h"
|
||||
#include "translation/Binding.h"
|
||||
#include "utils/CalamaresUtilsGui.h"
|
||||
#include "utils/Logger.h"
|
||||
#include "utils/Qml.h"
|
||||
@@ -134,10 +135,13 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug,
|
||||
{
|
||||
QPushButton* debugWindowBtn = new QPushButton;
|
||||
debugWindowBtn->setObjectName( "debugButton" );
|
||||
CALAMARES_RETRANSLATE_FOR(
|
||||
CalamaresUtils::Retranslator::attach(
|
||||
debugWindowBtn,
|
||||
debugWindowBtn->setText( QCoreApplication::translate( CalamaresWindow::staticMetaObject.className(),
|
||||
"Show debug information" ) ); );
|
||||
[ = ]()
|
||||
{
|
||||
debugWindowBtn->setText( QCoreApplication::translate( CalamaresWindow::staticMetaObject.className(),
|
||||
"Show debug information" ) );
|
||||
} );
|
||||
sideLayout->addWidget( debugWindowBtn );
|
||||
debugWindowBtn->setFlat( true );
|
||||
debugWindowBtn->setCheckable( true );
|
||||
@@ -173,7 +177,7 @@ getWidgetNavigation( Calamares::DebugWindowManager*,
|
||||
QObject::connect( viewManager, &Calamares::ViewManager::backEnabledChanged, back, &QPushButton::setEnabled );
|
||||
QObject::connect( viewManager, &Calamares::ViewManager::backLabelChanged, back, &QPushButton::setText );
|
||||
QObject::connect(
|
||||
viewManager, &Calamares::ViewManager::backIconChanged, [=]( QString n ) { setButtonIcon( back, n ); } );
|
||||
viewManager, &Calamares::ViewManager::backIconChanged, [ = ]( QString n ) { setButtonIcon( back, n ); } );
|
||||
QObject::connect(
|
||||
viewManager, &Calamares::ViewManager::backAndNextVisibleChanged, back, &QPushButton::setVisible );
|
||||
bottomLayout->addWidget( back );
|
||||
@@ -189,7 +193,7 @@ getWidgetNavigation( Calamares::DebugWindowManager*,
|
||||
QObject::connect( viewManager, &Calamares::ViewManager::nextEnabledChanged, next, &QPushButton::setEnabled );
|
||||
QObject::connect( viewManager, &Calamares::ViewManager::nextLabelChanged, next, &QPushButton::setText );
|
||||
QObject::connect(
|
||||
viewManager, &Calamares::ViewManager::nextIconChanged, [=]( QString n ) { setButtonIcon( next, n ); } );
|
||||
viewManager, &Calamares::ViewManager::nextIconChanged, [ = ]( QString n ) { setButtonIcon( next, n ); } );
|
||||
QObject::connect(
|
||||
viewManager, &Calamares::ViewManager::backAndNextVisibleChanged, next, &QPushButton::setVisible );
|
||||
bottomLayout->addWidget( next );
|
||||
@@ -205,7 +209,7 @@ getWidgetNavigation( Calamares::DebugWindowManager*,
|
||||
QObject::connect( viewManager, &Calamares::ViewManager::quitEnabledChanged, quit, &QPushButton::setEnabled );
|
||||
QObject::connect( viewManager, &Calamares::ViewManager::quitLabelChanged, quit, &QPushButton::setText );
|
||||
QObject::connect(
|
||||
viewManager, &Calamares::ViewManager::quitIconChanged, [=]( QString n ) { setButtonIcon( quit, n ); } );
|
||||
viewManager, &Calamares::ViewManager::quitIconChanged, [ = ]( QString n ) { setButtonIcon( quit, n ); } );
|
||||
QObject::connect( viewManager, &Calamares::ViewManager::quitTooltipChanged, quit, &QPushButton::setToolTip );
|
||||
QObject::connect( viewManager, &Calamares::ViewManager::quitVisibleChanged, quit, &QPushButton::setVisible );
|
||||
bottomLayout->addWidget( quit );
|
||||
|
@@ -14,10 +14,12 @@
|
||||
#include "DllMacro.h"
|
||||
#include "locale/Translation.h"
|
||||
|
||||
#include <QList>
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
|
||||
#include <functional>
|
||||
#include <optional>
|
||||
|
||||
class QEvent;
|
||||
class QLocale;
|
||||
@@ -102,7 +104,6 @@ private:
|
||||
explicit Retranslator( QObject* parent );
|
||||
};
|
||||
|
||||
|
||||
} // namespace CalamaresUtils
|
||||
|
||||
/** @brief Call code for this object when language changes
|
||||
@@ -116,17 +117,7 @@ private:
|
||||
* immediately after setting up the connection. This allows
|
||||
* setup and translation code to be mixed together.
|
||||
*/
|
||||
#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 object, not this object.
|
||||
*
|
||||
* 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_FOR( object, body ) CalamaresUtils::Retranslator::attach( object, [=] { body } )
|
||||
#define CALAMARES_RETRANSLATE( body ) CalamaresUtils::Retranslator::attach( this, [ = ] { body } )
|
||||
/** @brief Call a slot in this object when language changes
|
||||
*
|
||||
* Given a slot (in method-function-pointer notation), call that slot when the
|
||||
|
@@ -16,6 +16,8 @@ set(calamaresui_SOURCES
|
||||
modulesystem/ModuleManager.cpp
|
||||
modulesystem/ProcessJobModule.cpp
|
||||
modulesystem/ViewModule.cpp
|
||||
# Dynamic Translation support
|
||||
translation/Binding.cpp
|
||||
utils/CalamaresUtilsGui.cpp
|
||||
utils/ImageRegistry.cpp
|
||||
utils/Paste.cpp
|
||||
|
58
src/libcalamaresui/translation/Binding.cpp
Normal file
58
src/libcalamaresui/translation/Binding.cpp
Normal file
@@ -0,0 +1,58 @@
|
||||
/* === This file is part of Calamares - <https://calamares.io> ===
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2022 Adriaan de Groot <groot@kde.org>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
* Calamares is Free Software: see the License-Identifier above.
|
||||
*
|
||||
*/
|
||||
#include "Binding.h"
|
||||
|
||||
#include "utils/Retranslator.h"
|
||||
|
||||
namespace Calamares
|
||||
{
|
||||
namespace Translation
|
||||
{
|
||||
Binding::Binding( QWidget* parent )
|
||||
: m_parent( parent )
|
||||
{
|
||||
connect( CalamaresUtils::Retranslator::instance(),
|
||||
&CalamaresUtils::Retranslator::languageChanged,
|
||||
this,
|
||||
&Binding::update );
|
||||
};
|
||||
Binding::~Binding()
|
||||
{
|
||||
for ( auto* p : m_labels )
|
||||
{
|
||||
delete p;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Binding::update()
|
||||
{
|
||||
std::for_each( m_labels.begin(), m_labels.end(), [ parent = m_parent ]( BaseUpdater* p ) { p->update( parent ); } );
|
||||
}
|
||||
|
||||
|
||||
Binding::BaseUpdater::~BaseUpdater() {}
|
||||
|
||||
QString
|
||||
Binding::BaseUpdater::tr( QWidget* parent ) const
|
||||
{
|
||||
QString text = parent->tr( untranslated_string );
|
||||
if ( args.has_value() )
|
||||
{
|
||||
for ( const QString& s : args.value() )
|
||||
{
|
||||
text = text.arg( s );
|
||||
}
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Translation
|
||||
} // namespace Calamares
|
138
src/libcalamaresui/translation/Binding.h
Normal file
138
src/libcalamaresui/translation/Binding.h
Normal file
@@ -0,0 +1,138 @@
|
||||
/* === This file is part of Calamares - <https://calamares.io> ===
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2022 Adriaan de Groot <groot@kde.org>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
* Calamares is Free Software: see the License-Identifier above.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef TRANSLATION_BINDING_H
|
||||
#define TRANSLATION_BINDING_H
|
||||
|
||||
#include "DllMacro.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QWidget>
|
||||
|
||||
#include <functional>
|
||||
#include <optional>
|
||||
|
||||
namespace Calamares
|
||||
{
|
||||
namespace Translation
|
||||
{
|
||||
|
||||
/** @brief An object that can re-translate a whole collection of widgets.
|
||||
*
|
||||
* A labeler should be attached to a top-level widget. Child widgets
|
||||
* of that top-level can be translated via the Labeler. This removes
|
||||
* the need for CALAMARES_RETRANSLATE macro calls.
|
||||
*
|
||||
*/
|
||||
class DLLEXPORT Binding : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
Binding( QWidget* parent );
|
||||
virtual ~Binding() override;
|
||||
|
||||
void update();
|
||||
|
||||
/** @brief Adds (or updates) the string applied to a widget
|
||||
*
|
||||
* Sets the text on @p widget to be the (translated) @p string. If
|
||||
* @p widget already has a translation set via the Labeler, the
|
||||
* translation is updated with the new string.
|
||||
*/
|
||||
template < typename T >
|
||||
void add( T* widget, const char* string )
|
||||
{
|
||||
(void)add_internal( widget, string );
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
void add( T* widget, const char* string, const QStringList& s )
|
||||
{
|
||||
auto* p = add_internal( widget, string );
|
||||
p->setArgs( s );
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
void addUi( T* ui )
|
||||
{
|
||||
auto it = std::find_if( m_labels.begin(), m_labels.end(), [ = ]( BaseUpdater* p ) { return p->widget == ui; } );
|
||||
if ( it == m_labels.end() )
|
||||
{
|
||||
auto* p = new UiUpdater< T > { ui };
|
||||
m_labels.append( p );
|
||||
p->update( m_parent );
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
struct BaseUpdater
|
||||
{
|
||||
void* widget = nullptr;
|
||||
const char* untranslated_string = nullptr;
|
||||
std::optional< QStringList > args;
|
||||
|
||||
BaseUpdater( QWidget* w, const char* s )
|
||||
: widget( w )
|
||||
, untranslated_string( s )
|
||||
{
|
||||
}
|
||||
virtual ~BaseUpdater();
|
||||
|
||||
virtual void update( QWidget* parent ) = 0;
|
||||
|
||||
QString tr( QWidget* parent ) const;
|
||||
void setArgs( const QStringList& s ) { args = s; }
|
||||
};
|
||||
template < typename T >
|
||||
struct Updater : public BaseUpdater
|
||||
{
|
||||
using BaseUpdater::BaseUpdater;
|
||||
void update( QWidget* parent ) override { static_cast< T* >( widget )->setText( tr( parent ) ); }
|
||||
};
|
||||
template < typename T >
|
||||
struct UiUpdater : public BaseUpdater
|
||||
{
|
||||
UiUpdater( T* ui )
|
||||
: BaseUpdater( nullptr, nullptr )
|
||||
{
|
||||
widget = ui;
|
||||
}
|
||||
void update( QWidget* parent ) override { static_cast< T* >( widget )->retranslateUi( parent ); }
|
||||
};
|
||||
|
||||
QWidget* m_parent = nullptr;
|
||||
QList< BaseUpdater* > m_labels;
|
||||
|
||||
template < typename T >
|
||||
BaseUpdater* add_internal( T* widget, const char* string )
|
||||
{
|
||||
auto it
|
||||
= std::find_if( m_labels.begin(), m_labels.end(), [ = ]( BaseUpdater* p ) { return p->widget == widget; } );
|
||||
if ( it != m_labels.end() )
|
||||
{
|
||||
( *it )->untranslated_string = string;
|
||||
( *it )->update( m_parent );
|
||||
return *it;
|
||||
}
|
||||
else
|
||||
{
|
||||
auto* p = new Updater< T > { widget, string };
|
||||
m_labels.append( p );
|
||||
p->update( m_parent );
|
||||
return p;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace Translation
|
||||
} // namespace Calamares
|
||||
|
||||
#endif
|
@@ -22,10 +22,10 @@
|
||||
|
||||
#include "modulesystem/ModuleManager.h"
|
||||
#include "modulesystem/RequirementsModel.h"
|
||||
#include "translation/Binding.h"
|
||||
#include "utils/CalamaresUtilsGui.h"
|
||||
#include "utils/Logger.h"
|
||||
#include "utils/NamedEnum.h"
|
||||
#include "utils/Retranslator.h"
|
||||
#include "widgets/TranslationFix.h"
|
||||
|
||||
#include <QApplication>
|
||||
@@ -75,7 +75,27 @@ WelcomePage::WelcomePage( Config* config, QWidget* parent )
|
||||
|
||||
initLanguages();
|
||||
|
||||
CALAMARES_RETRANSLATE_SLOT( &WelcomePage::retranslate );
|
||||
auto* labeler = new Calamares::Translation::Binding( this );
|
||||
labeler->add(
|
||||
ui->supportButton, QT_TR_NOOP( "%1 support" ), { Calamares::Branding::instance()->shortProductName() } );
|
||||
labeler->add( ui->mainText,
|
||||
[]()
|
||||
{
|
||||
if ( Calamares::Settings::instance()->isSetupMode() )
|
||||
{
|
||||
return Calamares::Branding::instance()->welcomeStyleCalamares()
|
||||
? QT_TR_NOOP( "<h1>Welcome to the Calamares setup program for %1.</h1>" )
|
||||
: QT_TR_NOOP( "<h1>Welcome to %1 setup.</h1>" );
|
||||
}
|
||||
else
|
||||
{
|
||||
return Calamares::Branding::instance()->welcomeStyleCalamares()
|
||||
? QT_TR_NOOP( "<h1>Welcome to the Calamares installer for %1.</h1>" )
|
||||
: QT_TR_NOOP( "<h1>Welcome to the %1 installer.</h1>" );
|
||||
}
|
||||
}(),
|
||||
{ Calamares::Branding::instance()->versionedName() } );
|
||||
labeler->addUi( ui );
|
||||
|
||||
connect( ui->aboutButton, &QPushButton::clicked, this, &WelcomePage::showAboutBox );
|
||||
connect( Calamares::ModuleManager::instance(),
|
||||
@@ -165,7 +185,7 @@ WelcomePage::setupButton( Button role, const QString& url )
|
||||
{
|
||||
auto size = 2 * QSize( CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() );
|
||||
button->setIcon( CalamaresUtils::defaultPixmap( icon, CalamaresUtils::Original, size ) );
|
||||
connect( button, &QPushButton::clicked, [u]() { QDesktopServices::openUrl( u ); } );
|
||||
connect( button, &QPushButton::clicked, [ u ]() { QDesktopServices::openUrl( u ); } );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -205,29 +225,6 @@ WelcomePage::setLanguageIcon( QPixmap i )
|
||||
ui->languageIcon->setPixmap( i );
|
||||
}
|
||||
|
||||
void
|
||||
WelcomePage::retranslate()
|
||||
{
|
||||
QString message;
|
||||
|
||||
if ( Calamares::Settings::instance()->isSetupMode() )
|
||||
{
|
||||
message = Calamares::Branding::instance()->welcomeStyleCalamares()
|
||||
? tr( "<h1>Welcome to the Calamares setup program for %1.</h1>" )
|
||||
: tr( "<h1>Welcome to %1 setup.</h1>" );
|
||||
}
|
||||
else
|
||||
{
|
||||
message = Calamares::Branding::instance()->welcomeStyleCalamares()
|
||||
? tr( "<h1>Welcome to the Calamares installer for %1.</h1>" )
|
||||
: tr( "<h1>Welcome to the %1 installer.</h1>" );
|
||||
}
|
||||
|
||||
ui->mainText->setText( message.arg( Calamares::Branding::instance()->versionedName() ) );
|
||||
ui->retranslateUi( this );
|
||||
ui->supportButton->setText( tr( "%1 support" ).arg( Calamares::Branding::instance()->shortProductName() ) );
|
||||
}
|
||||
|
||||
void
|
||||
WelcomePage::showAboutBox()
|
||||
{
|
||||
|
@@ -52,7 +52,6 @@ public:
|
||||
void init();
|
||||
|
||||
public slots:
|
||||
void retranslate();
|
||||
void showAboutBox();
|
||||
|
||||
protected:
|
||||
|
Reference in New Issue
Block a user