From cbe14bbf03994ddef9af77863ded9412ec8a1885 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sat, 1 Jun 2019 23:26:08 +0200 Subject: [PATCH 01/45] [libcalamaresui] Rename m_slideShow -> m_qmlShow - It could be any QML, so it's not a slideshow per se. - Minor prep-work for fixing up loading times. --- src/libcalamaresui/ExecutionViewStep.cpp | 23 ++++++++++------------- src/libcalamaresui/ExecutionViewStep.h | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index a65ab3a1c..fc6bd2b58 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -36,10 +36,9 @@ #include #include #include -#include -#include #include - +#include +#include namespace Calamares { @@ -54,21 +53,21 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) QVBoxLayout* layout = new QVBoxLayout( m_widget ); QVBoxLayout* innerLayout = new QVBoxLayout; - m_slideShow = new QQuickWidget; - layout->addWidget( m_slideShow ); + m_qmlShow = new QQuickWidget; + layout->addWidget( m_qmlShow ); CalamaresUtils::unmarginLayout( layout ); layout->addLayout( innerLayout ); - m_slideShow->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); - m_slideShow->setResizeMode( QQuickWidget::SizeRootObjectToView ); + m_qmlShow->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + m_qmlShow->setResizeMode( QQuickWidget::SizeRootObjectToView ); - m_slideShow->engine()->addImportPath( CalamaresUtils::qmlModulesDir().absolutePath() ); + m_qmlShow->engine()->addImportPath( CalamaresUtils::qmlModulesDir().absolutePath() ); innerLayout->addSpacing( CalamaresUtils::defaultFontHeight() / 2 ); innerLayout->addWidget( m_progressBar ); innerLayout->addWidget( m_label ); - cDebug() << "QML import paths:" << Logger::DebugList( m_slideShow->engine()->importPathList() ); + cDebug() << "QML import paths:" << Logger::DebugList( m_qmlShow->engine()->importPathList() ); connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue ); @@ -136,16 +135,14 @@ ExecutionViewStep::onActivate() { CALAMARES_RETRANSLATE_WIDGET( m_widget, if ( !Calamares::Branding::instance()->slideshowPath().isEmpty() ) - m_slideShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance() + m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance() ->slideshowPath() ) ); ) - JobQueue* queue = JobQueue::instance(); foreach ( const QString& instanceKey, m_jobInstanceKeys ) { - Calamares::Module* module = Calamares::ModuleManager::instance() - ->moduleInstance( instanceKey ); + Calamares::Module* module = Calamares::ModuleManager::instance()->moduleInstance( instanceKey ); if ( module ) { auto jl = module->jobs(); diff --git a/src/libcalamaresui/ExecutionViewStep.h b/src/libcalamaresui/ExecutionViewStep.h index ed6de4382..c6e2897c9 100644 --- a/src/libcalamaresui/ExecutionViewStep.h +++ b/src/libcalamaresui/ExecutionViewStep.h @@ -60,7 +60,7 @@ private: QWidget* m_widget; QProgressBar* m_progressBar; QLabel* m_label; - QQuickWidget* m_slideShow; + QQuickWidget* m_qmlShow; QStringList m_jobInstanceKeys; From 5973dbf74c0bf5b2dfeae2b22cdfbbb692ce753f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sat, 1 Jun 2019 23:39:39 +0200 Subject: [PATCH 02/45] [libcalamaresui] Shuffle code for QML slideshow - Create widgets earlier - Group layouting code - Add retranslator only once, not on every activate - Load QML only once, preferably at activation --- src/libcalamaresui/ExecutionViewStep.cpp | 35 ++++++++++++++---------- src/libcalamaresui/ExecutionViewStep.h | 1 + 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index fc6bd2b58..4ce9eb8ed 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -46,31 +46,36 @@ namespace Calamares ExecutionViewStep::ExecutionViewStep( QObject* parent ) : ViewStep( parent ) , m_widget( new QWidget ) + , m_progressBar( new QProgressBar ) + , m_label( new QLabel ) + , m_qmlShow( new QQuickWidget ) + , m_qmlShowLoaded( false ) { - m_progressBar = new QProgressBar; - m_progressBar->setMaximum( 10000 ); - m_label = new QLabel; QVBoxLayout* layout = new QVBoxLayout( m_widget ); QVBoxLayout* innerLayout = new QVBoxLayout; - m_qmlShow = new QQuickWidget; - layout->addWidget( m_qmlShow ); - CalamaresUtils::unmarginLayout( layout ); + m_progressBar->setMaximum( 10000 ); - layout->addLayout( innerLayout ); m_qmlShow->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); m_qmlShow->setResizeMode( QQuickWidget::SizeRootObjectToView ); - m_qmlShow->engine()->addImportPath( CalamaresUtils::qmlModulesDir().absolutePath() ); + layout->addWidget( m_qmlShow ); + CalamaresUtils::unmarginLayout( layout ); + layout->addLayout( innerLayout ); + innerLayout->addSpacing( CalamaresUtils::defaultFontHeight() / 2 ); innerLayout->addWidget( m_progressBar ); innerLayout->addWidget( m_label ); cDebug() << "QML import paths:" << Logger::DebugList( m_qmlShow->engine()->importPathList() ); - connect( JobQueue::instance(), &JobQueue::progress, - this, &ExecutionViewStep::updateFromJobQueue ); + connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue ); + + CALAMARES_RETRANSLATE_WIDGET( m_widget, + if ( m_qmlShowLoaded ) + m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ) ); + ) } @@ -133,11 +138,11 @@ ExecutionViewStep::isAtEnd() const void ExecutionViewStep::onActivate() { - CALAMARES_RETRANSLATE_WIDGET( m_widget, - if ( !Calamares::Branding::instance()->slideshowPath().isEmpty() ) - m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance() - ->slideshowPath() ) ); - ) + if ( !m_qmlShowLoaded && !Calamares::Branding::instance()->slideshowPath().isEmpty() ) + { + m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ) ); + m_qmlShowLoaded = true; + } JobQueue* queue = JobQueue::instance(); foreach ( const QString& instanceKey, m_jobInstanceKeys ) diff --git a/src/libcalamaresui/ExecutionViewStep.h b/src/libcalamaresui/ExecutionViewStep.h index c6e2897c9..6d5b90705 100644 --- a/src/libcalamaresui/ExecutionViewStep.h +++ b/src/libcalamaresui/ExecutionViewStep.h @@ -61,6 +61,7 @@ private: QProgressBar* m_progressBar; QLabel* m_label; QQuickWidget* m_qmlShow; + bool m_qmlShowLoaded; QStringList m_jobInstanceKeys; From ff03235e33c3c3e98365f2367aad52f87d1c1e67 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 2 Jun 2019 13:19:16 +0200 Subject: [PATCH 03/45] [libcalamaresui] Load QML on startup --- src/libcalamaresui/ExecutionViewStep.cpp | 10 ++++++++-- src/libcalamaresui/ExecutionViewStep.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index 4ce9eb8ed..a1f7bcd27 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -69,6 +69,7 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) innerLayout->addWidget( m_label ); cDebug() << "QML import paths:" << Logger::DebugList( m_qmlShow->engine()->importPathList() ); + loadQml(); connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue ); @@ -134,15 +135,20 @@ ExecutionViewStep::isAtEnd() const return true; } - void -ExecutionViewStep::onActivate() +ExecutionViewStep::loadQml() { if ( !m_qmlShowLoaded && !Calamares::Branding::instance()->slideshowPath().isEmpty() ) { m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ) ); m_qmlShowLoaded = true; } +} + +void +ExecutionViewStep::onActivate() +{ + loadQml(); JobQueue* queue = JobQueue::instance(); foreach ( const QString& instanceKey, m_jobInstanceKeys ) diff --git a/src/libcalamaresui/ExecutionViewStep.h b/src/libcalamaresui/ExecutionViewStep.h index 6d5b90705..12eb6736c 100644 --- a/src/libcalamaresui/ExecutionViewStep.h +++ b/src/libcalamaresui/ExecutionViewStep.h @@ -65,6 +65,7 @@ private: QStringList m_jobInstanceKeys; + void loadQml(); //< Loads the slideshow QML (from branding) void updateFromJobQueue( qreal percent, const QString& message ); }; From daf2e552464a3f85d2009bf055040654b6eebb40 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 2 Jun 2019 13:22:18 +0200 Subject: [PATCH 04/45] [branding] Be more chatty in example slideshow - Log when the timer fires and the slide advances - Add a start() function (unused at this moment, will be called from C++ at the right time) --- src/branding/default/show.qml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/branding/default/show.qml b/src/branding/default/show.qml index b724a4832..7e04970ea 100644 --- a/src/branding/default/show.qml +++ b/src/branding/default/show.qml @@ -24,12 +24,17 @@ Presentation { id: presentation + function nextSlide() { + console.log("Next slide"); + presentation.goToNextSlide(); + } + Timer { id: advanceTimer interval: 5000 running: false repeat: true - onTriggered: presentation.goToNextSlide() + onTriggered: nextSlide() } Slide { From 103decab68cd0a54e3b1d26069fb1b8e23982ecc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 2 Jun 2019 13:40:53 +0200 Subject: [PATCH 05/45] [libcalamaresui] Create the slideshow on activation - Load QML on startup, compile async - Create QML component when the page is reached. - On leave, stop the slideshow (otherwise, e.g. timers will keep running) This should move some of the delay from loading a large slideshow forward as the engine is already initialized when we reach the install / slideshow page. --- src/libcalamaresui/ExecutionViewStep.cpp | 30 +++++++++++++++++------- src/libcalamaresui/ExecutionViewStep.h | 6 ++++- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index a1f7bcd27..f41068237 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -49,7 +50,8 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) , m_progressBar( new QProgressBar ) , m_label( new QLabel ) , m_qmlShow( new QQuickWidget ) - , m_qmlShowLoaded( false ) + , m_qmlComponent( nullptr ) + , m_qmlObject( nullptr ) { QVBoxLayout* layout = new QVBoxLayout( m_widget ); QVBoxLayout* innerLayout = new QVBoxLayout; @@ -72,11 +74,6 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) loadQml(); connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue ); - - CALAMARES_RETRANSLATE_WIDGET( m_widget, - if ( m_qmlShowLoaded ) - m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ) ); - ) } @@ -138,10 +135,12 @@ ExecutionViewStep::isAtEnd() const void ExecutionViewStep::loadQml() { - if ( !m_qmlShowLoaded && !Calamares::Branding::instance()->slideshowPath().isEmpty() ) + if ( !m_qmlComponent && !Calamares::Branding::instance()->slideshowPath().isEmpty() ) { - m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ) ); - m_qmlShowLoaded = true; + m_qmlComponent = new QQmlComponent( m_qmlShow->engine(), + QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ), + QQmlComponent::CompilationMode::Asynchronous + ); } } @@ -149,6 +148,12 @@ void ExecutionViewStep::onActivate() { loadQml(); + if ( m_qmlComponent ) + { + m_qmlObject = m_qmlComponent->create(); + cDebug() << "Created QML object" << (void *)m_qmlObject << m_qmlObject->objectName(); + cDebug() << "Show root" << m_qmlShow->rootObject() << "context" << m_qmlShow->rootContext(); + } JobQueue* queue = JobQueue::instance(); foreach ( const QString& instanceKey, m_jobInstanceKeys ) @@ -191,4 +196,11 @@ ExecutionViewStep::updateFromJobQueue( qreal percent, const QString& message ) m_label->setText( message ); } +void +ExecutionViewStep::onLeave() +{ + delete m_qmlObject; + m_qmlObject = nullptr; +} + } // namespace diff --git a/src/libcalamaresui/ExecutionViewStep.h b/src/libcalamaresui/ExecutionViewStep.h index 12eb6736c..a968f22e4 100644 --- a/src/libcalamaresui/ExecutionViewStep.h +++ b/src/libcalamaresui/ExecutionViewStep.h @@ -25,8 +25,10 @@ #include class QLabel; +class QObject; class QProgressBar; class QQuickWidget; +class QQmlComponent; namespace Calamares { @@ -51,6 +53,7 @@ public: bool isAtEnd() const override; void onActivate() override; + void onLeave() override; JobList jobs() const override; @@ -61,7 +64,8 @@ private: QProgressBar* m_progressBar; QLabel* m_label; QQuickWidget* m_qmlShow; - bool m_qmlShowLoaded; + QQmlComponent* m_qmlComponent; + QObject* m_qmlObject; //< The actual show QStringList m_jobInstanceKeys; From f52d62034b605c29a3a82018f1c5680b21bc3fb3 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 2 Jun 2019 14:27:12 +0200 Subject: [PATCH 06/45] [libcalamaresui] Manual QML loading trickery - The slideshow item needs a parent to be visible, - QML gets size 0,0 unless explicitly sized to the surrounding widget. --- src/libcalamaresui/ExecutionViewStep.cpp | 16 +++++++++++++--- src/libcalamaresui/ExecutionViewStep.h | 5 +++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index f41068237..fd675313c 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -150,9 +151,18 @@ ExecutionViewStep::onActivate() loadQml(); if ( m_qmlComponent ) { - m_qmlObject = m_qmlComponent->create(); - cDebug() << "Created QML object" << (void *)m_qmlObject << m_qmlObject->objectName(); - cDebug() << "Show root" << m_qmlShow->rootObject() << "context" << m_qmlShow->rootContext(); + auto* rootItem = m_qmlShow->quickWindow()->contentItem(); + rootItem->setSize( m_qmlShow->size() ); + + QObject* o = m_qmlComponent->create(); + m_qmlObject = qobject_cast< QQuickItem* >( o ); + if ( !m_qmlObject ) + delete o; + else + { + m_qmlObject->setParentItem( rootItem ); + m_qmlObject->setSize( m_qmlShow->size() ); + } } JobQueue* queue = JobQueue::instance(); diff --git a/src/libcalamaresui/ExecutionViewStep.h b/src/libcalamaresui/ExecutionViewStep.h index a968f22e4..c8a0a59d6 100644 --- a/src/libcalamaresui/ExecutionViewStep.h +++ b/src/libcalamaresui/ExecutionViewStep.h @@ -27,8 +27,9 @@ class QLabel; class QObject; class QProgressBar; -class QQuickWidget; class QQmlComponent; +class QQuickItem; +class QQuickWidget; namespace Calamares { @@ -65,7 +66,7 @@ private: QLabel* m_label; QQuickWidget* m_qmlShow; QQmlComponent* m_qmlComponent; - QObject* m_qmlObject; //< The actual show + QQuickItem* m_qmlObject; //< The actual show QStringList m_jobInstanceKeys; From 2b5cf9e613828b3cd71b0c236deec6e287607b72 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 3 Jun 2019 10:38:29 +0200 Subject: [PATCH 07/45] [libcalamaresui] There is code in Qt for setting up QML widgets - The not-publicly documented setContent() method does all the parenting and resizing needed; some of this isn't available from outside of the widget either. The QML slideshow now sizes and re-sizes correctly. --- src/libcalamaresui/ExecutionViewStep.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index fd675313c..2fb18ff84 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -151,17 +151,17 @@ ExecutionViewStep::onActivate() loadQml(); if ( m_qmlComponent ) { - auto* rootItem = m_qmlShow->quickWindow()->contentItem(); - rootItem->setSize( m_qmlShow->size() ); - QObject* o = m_qmlComponent->create(); m_qmlObject = qobject_cast< QQuickItem* >( o ); if ( !m_qmlObject ) delete o; else { - m_qmlObject->setParentItem( rootItem ); - m_qmlObject->setSize( m_qmlShow->size() ); + // setContent() is public API, but not documented publicly. + // It is marked \internal in the Qt sources, but does exactly + // what is needed: sets up visual parent by replacing the root + // item, and handling resizes. + m_qmlShow->setContent( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ), m_qmlComponent, m_qmlObject ); } } From 68e6bd676e2c1daa9f8e3fa4aa85235bc6b8cb39 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Jun 2019 12:15:41 +0200 Subject: [PATCH 08/45] [libcalamaresui] Instantiate QML at load time - By instantiating only on activation, an ugly "white" gap appears where there is no widget at all. So instantiate earlier so that the widget already exists and is painting by the time the slideshow part is visible. - This makes the net effect of this branch so far zero: the slideshow is still loaded and started when Calamares starts. --- src/libcalamaresui/ExecutionViewStep.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index 2fb18ff84..f8f9ea03b 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -143,12 +143,6 @@ ExecutionViewStep::loadQml() QQmlComponent::CompilationMode::Asynchronous ); } -} - -void -ExecutionViewStep::onActivate() -{ - loadQml(); if ( m_qmlComponent ) { QObject* o = m_qmlComponent->create(); @@ -164,6 +158,12 @@ ExecutionViewStep::onActivate() m_qmlShow->setContent( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ), m_qmlComponent, m_qmlObject ); } } +} + +void +ExecutionViewStep::onActivate() +{ + loadQml(); JobQueue* queue = JobQueue::instance(); foreach ( const QString& instanceKey, m_jobInstanceKeys ) From 71209b323ad0e0a31bc242e6c94feda146842d02 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Jun 2019 13:06:34 +0200 Subject: [PATCH 09/45] [libcalamaresui] Call QML methods on start and stop - Use onActivate() and onLeave() in QML as well, to start and stop the slideshow. --- src/libcalamaresui/ExecutionViewStep.cpp | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index f8f9ea03b..047fcede0 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -160,10 +160,40 @@ ExecutionViewStep::loadQml() } } +/** @brief Calls the QML method @p method() + * + * Pass in only the name of the method (e.g. onActivate). This function + * checks if the method exists (with no arguments) before trying to + * call it, so that no warnings are printed due to missing methods. + * + * If there is a return value from the QML method, it is logged (but not otherwise used). + */ +void +callQMLFunction( QQuickItem* qmlObject, const char* method ) +{ + QByteArray methodSignature( method ); + methodSignature.append( "()" ); + + if ( qmlObject && qmlObject->metaObject()->indexOfMethod( methodSignature ) >= 0 ) + { + QVariant returnValue; + QMetaObject::invokeMethod( qmlObject, method, Q_RETURN_ARG( QVariant, returnValue ) ); + if ( !returnValue.isNull() ) + { + cDebug() << "QML" << methodSignature << "returned" << returnValue; + } + } + else if ( qmlObject ) + { + cDebug() << "QML" << methodSignature << "is missing."; + } +} + void ExecutionViewStep::onActivate() { loadQml(); + callQMLFunction( m_qmlObject, "onActivate" ); JobQueue* queue = JobQueue::instance(); foreach ( const QString& instanceKey, m_jobInstanceKeys ) @@ -209,6 +239,7 @@ ExecutionViewStep::updateFromJobQueue( qreal percent, const QString& message ) void ExecutionViewStep::onLeave() { + callQMLFunction( m_qmlObject, "onLeave" ); delete m_qmlObject; m_qmlObject = nullptr; } From 9188eab66f01b4ea313c8f21ca1ff9bab51205a5 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Jun 2019 13:33:20 +0200 Subject: [PATCH 10/45] Changes: document new things in slideshow --- CHANGES | 12 ++++++++++++ src/branding/default/show.qml | 5 ++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 9f72f515c..7e9fc22be 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,10 @@ website will have to do for older versions. This release contains contributions from (alphabetically by first name): +Distributions are **advised** to check the slideshow they use for the +installation step; changes in loading and translation mechanisms may +require changes in the slideshow. + ## Core ## - With this release, option *WITH_PYTHONQT* changes default to **off**. @@ -18,6 +22,14 @@ This release contains contributions from (alphabetically by first name): configured after the last *exec* section of the sequence has been solved. The *finished* page can be left out (but then you don't get the restart-now functionality). #1168 + - The *slideshow* which is run during installation is now loaded on + startup (while requirements checking is being done). This should + improve responsiveness when the slideshow starts. If the slideshow + has methods `onActivate()` and `onLeave()` those will be called + when the installation step is activated (e.g. the installation + starts and the slideshow becomes visible) or is finished (and the + slideshow becomes hidden). + - The example slideshow now starts its timers when it becomes visible. ## Modules ## diff --git a/src/branding/default/show.qml b/src/branding/default/show.qml index 7e04970ea..c1db046c2 100644 --- a/src/branding/default/show.qml +++ b/src/branding/default/show.qml @@ -68,5 +68,8 @@ Presentation centeredText: "This is a third Slide element." } - Component.onCompleted: advanceTimer.running = true + function onActivate() { + presentation.currentSlide = 0; + advanceTimer.running = true + } } From 003f37ca04b7b971f635b8217228fb0f29f17bda Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 2 Jun 2019 13:22:18 +0200 Subject: [PATCH 11/45] [branding] Be more chatty in example slideshow - Log when the timer fires and the slide advances - Add a start() function (unused at this moment, will be called from C++ at the right time) --- src/branding/default/show.qml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/branding/default/show.qml b/src/branding/default/show.qml index b724a4832..7e04970ea 100644 --- a/src/branding/default/show.qml +++ b/src/branding/default/show.qml @@ -24,12 +24,17 @@ Presentation { id: presentation + function nextSlide() { + console.log("Next slide"); + presentation.goToNextSlide(); + } + Timer { id: advanceTimer interval: 5000 running: false repeat: true - onTriggered: presentation.goToNextSlide() + onTriggered: nextSlide() } Slide { From cd7fc93b6a78f01f250ef7a0da49d2fcd80eac87 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Jun 2019 13:47:21 +0200 Subject: [PATCH 12/45] [branding] Be more chatty when slideshow is loaded --- src/branding/default/show.qml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/branding/default/show.qml b/src/branding/default/show.qml index 7e04970ea..cb98ecb0a 100644 --- a/src/branding/default/show.qml +++ b/src/branding/default/show.qml @@ -68,5 +68,8 @@ Presentation centeredText: "This is a third Slide element." } - Component.onCompleted: advanceTimer.running = true + Component.onCompleted: { + advanceTimer.running = true; + console.log("Component complete"); + } } From 41c2a7e4e0f713c3100efd43b3714684710ef17d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Jun 2019 22:42:53 +0200 Subject: [PATCH 13/45] [branding] Drop complicated machinery for one subdir --- src/branding/CMakeLists.txt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/branding/CMakeLists.txt b/src/branding/CMakeLists.txt index b03127e39..981da1468 100644 --- a/src/branding/CMakeLists.txt +++ b/src/branding/CMakeLists.txt @@ -1,7 +1 @@ -file( GLOB SUBDIRECTORIES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*" ) -foreach( SUBDIRECTORY ${SUBDIRECTORIES} ) - set( _sd "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}" ) - if( IS_DIRECTORY "${_sd}" AND EXISTS "${_sd}/branding.desc" ) - calamares_add_branding_subdirectory( ${SUBDIRECTORY} ) - endif() -endforeach() +calamares_add_branding_subdirectory( default ) From 593dcff40a561d50a6324ae62f7be9bd06c10a1f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Jun 2019 23:01:56 +0200 Subject: [PATCH 14/45] [branding] Enable translations for the default show - Just translate two simple strings, to avoid burdening translators, - Add Dutch translation already. These translations are not yet processed by ci/txpull and push. --- .../default/lang/calamares-default_en.ts | 17 +++++++++++++++++ .../default/lang/calamares-default_nl.ts | 17 +++++++++++++++++ src/branding/default/show.qml | 4 ++-- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/branding/default/lang/calamares-default_en.ts create mode 100644 src/branding/default/lang/calamares-default_nl.ts diff --git a/src/branding/default/lang/calamares-default_en.ts b/src/branding/default/lang/calamares-default_en.ts new file mode 100644 index 000000000..30474fc02 --- /dev/null +++ b/src/branding/default/lang/calamares-default_en.ts @@ -0,0 +1,17 @@ + + + + + show + + + This is a second Slide element. + + + + + This is a third Slide element. + + + + diff --git a/src/branding/default/lang/calamares-default_nl.ts b/src/branding/default/lang/calamares-default_nl.ts new file mode 100644 index 000000000..aad00eaf7 --- /dev/null +++ b/src/branding/default/lang/calamares-default_nl.ts @@ -0,0 +1,17 @@ + + + + + show + + + This is a second Slide element. + Dit is het tweede Dia element. + + + + This is a third Slide element. + Dit is het derde Dia element. + + + diff --git a/src/branding/default/show.qml b/src/branding/default/show.qml index cb98ecb0a..89ad354de 100644 --- a/src/branding/default/show.qml +++ b/src/branding/default/show.qml @@ -61,11 +61,11 @@ Presentation } Slide { - centeredText: "This is a second Slide element." + centeredText: qsTr("This is a second Slide element.") } Slide { - centeredText: "This is a third Slide element." + centeredText: qsTr("This is a third Slide element.") } Component.onCompleted: { From f3f8f3ea46e038ac5b11e5ccdc63047fb85a7a8d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Jun 2019 23:08:12 +0200 Subject: [PATCH 15/45] [branding] Make the default show nervously quick --- src/branding/default/show.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/branding/default/show.qml b/src/branding/default/show.qml index 89ad354de..83d47d9e7 100644 --- a/src/branding/default/show.qml +++ b/src/branding/default/show.qml @@ -31,7 +31,7 @@ Presentation Timer { id: advanceTimer - interval: 5000 + interval: 1000 running: false repeat: true onTriggered: nextSlide() From a08e7644672e0750d49aecadb149a0a2f8ccacb5 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Jun 2019 23:38:44 +0200 Subject: [PATCH 16/45] CMake: add compiled branding translations to build dir - Copy the .qm files (compiled translations) into the build dir as part of the build process. This is independent of **installing** those same translations, but does allow the translations to be used by Calamares when run from the build dir for testing. --- CMakeModules/CalamaresAddBrandingSubdirectory.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakeModules/CalamaresAddBrandingSubdirectory.cmake b/CMakeModules/CalamaresAddBrandingSubdirectory.cmake index 78330e245..344777eb0 100644 --- a/CMakeModules/CalamaresAddBrandingSubdirectory.cmake +++ b/CMakeModules/CalamaresAddBrandingSubdirectory.cmake @@ -107,7 +107,9 @@ function( calamares_add_branding_translations NAME ) file( GLOB BRANDING_TRANSLATION_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${SUBDIRECTORY}/lang/calamares-${NAME}_*.ts" ) if ( BRANDING_TRANSLATION_FILES ) qt5_add_translation( QM_FILES ${BRANDING_TRANSLATION_FILES} ) - add_custom_target( branding-translation-${NAME} ALL DEPENDS ${QM_FILES} ) + add_custom_target( branding-translation-${NAME} ALL DEPENDS ${QM_FILES} + COMMAND ${CMAKE_COMMAND} -E copy ${QM_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/lang/ + ) install( FILES ${QM_FILES} DESTINATION ${BRANDING_COMPONENT_DESTINATION}/lang/ ) list( LENGTH BRANDING_TRANSLATION_FILES _branding_count ) message( " ${Green}BRANDING_TRANSLATIONS:${ColorReset} ${_branding_count} language(s)" ) From ef2531b01d8bbb35ec385e1934f4e2aea2635406 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Jun 2019 23:46:32 +0200 Subject: [PATCH 17/45] [branding] Update documentation - mention that translations are included - point to external repo for fancy/ example. --- src/branding/README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/branding/README.md b/src/branding/README.md index 1d816911e..146de0d5b 100644 --- a/src/branding/README.md +++ b/src/branding/README.md @@ -20,7 +20,9 @@ so that it can be run directly from the build directory for testing purposes: - `default/` is a sample brand for the Generic Linux distribution. It uses the default Calamares icons and a as start-page splash it provides a tag-cloud view of languages. The slideshow is a basic one with a few - slides of text and a single image. No translations are provided. + slides of text and a single image. Translations (done by hand, not via + the usual mechanism of Calamares translations) in English, Arabic, Dutch + and French are available. Since the slideshow can be **any** QML, it is limited only by your designers imagination and your QML experience. For straightforward presentations, @@ -37,6 +39,9 @@ Qt translation files are supported (`.ts` sources which get compiled into `.qm`). Inside the `lang` subdirectory all translation files must be named according to the scheme `calamares-_.ts`. +The example branding component, called *default*, therefore has translation +files names `calamares-default_nl.ts` (similar for other languages than Dutch). + Text in your `show.qml` (or whatever *slideshow* is set to in the descriptor file) should be enclosed in this form for translations @@ -83,7 +88,8 @@ Generally, you will add a few presentation-level elements first, then slides. - For visible navigation arrows, add elements of class *ForwardButton* and *BackwardButton*. Set the *source* property of each to a suitable - image. See the `fancy/` example. It is recommended to turn off other + image. See the `fancy/` example in the external branding-examples + repository. It is recommended to turn off other kinds of navigation when visible navigation is used. - To indicate where the user is, add an element of class *SlideCounter*. This indicates in "n / total" form where the user is in the slideshow. From 148b829591e9af7f281b159ddfe3f6ae27c58fcc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 10:58:14 +0200 Subject: [PATCH 18/45] [libcalamares] Introduce slideshowAPI setting --- src/branding/default/branding.desc | 11 +++++++++++ src/libcalamaresui/Branding.cpp | 9 +++++++++ src/libcalamaresui/Branding.h | 2 ++ 3 files changed, 22 insertions(+) diff --git a/src/branding/default/branding.desc b/src/branding/default/branding.desc index 1dd4de03a..1bd76cd29 100644 --- a/src/branding/default/branding.desc +++ b/src/branding/default/branding.desc @@ -93,6 +93,17 @@ images: # The slideshow is displayed during execution steps (e.g. when the # installer is actually writing to disk and doing other slow things). slideshow: "show.qml" +# There are two available APIs for the slideshow: +# - 1 (the default) loads the entire slideshow when the installation- +# slideshow page is shown and starts the QML then. The QML +# is never stopped (after installation is done, times etc. +# continue to fire). +# - 2 loads the slideshow on startup and calls onActivate() and +# onLeave() in the root object. After the installation is done, +# the show is stopped (first by calling onLeave(), then destroying +# the QML components). +slideshowAPI: 2 + # Colors for text and background components. # diff --git a/src/libcalamaresui/Branding.cpp b/src/libcalamaresui/Branding.cpp index 48917f1ba..876fdfa80 100644 --- a/src/libcalamaresui/Branding.cpp +++ b/src/libcalamaresui/Branding.cpp @@ -127,6 +127,7 @@ Branding::Branding( const QString& brandingFilePath, , m_descriptorPath( brandingFilePath ) , m_welcomeStyleCalamares( false ) , m_welcomeExpandingLogo( true ) + , m_slideshowAPI( 1 ) { cDebug() << "Using Calamares branding file at" << brandingFilePath; @@ -234,6 +235,14 @@ Branding::Branding( const QString& brandingFilePath, } else bail( "Syntax error in slideshow sequence." ); + + int api = doc[ "slideshowAPI" ].IsScalar() ? doc[ "slideshowAPI" ].as() : -1; + if ( ( api < 1 ) || ( api > 2 ) ) + { + cWarning() << "Invalid or missing *slideshowAPI* in branding file."; + api = 1; + } + m_slideshowAPI = api; } catch ( YAML::Exception& e ) { diff --git a/src/libcalamaresui/Branding.h b/src/libcalamaresui/Branding.h index 23a7a7a49..a3909bc00 100644 --- a/src/libcalamaresui/Branding.h +++ b/src/libcalamaresui/Branding.h @@ -118,6 +118,7 @@ public: /** @brief Path to the slideshow QML file, if any. */ QString slideshowPath() const { return m_slideshowPath; } + int slideshowAPI() const { return m_slideshowAPI; } QString string( Branding::StringEntry stringEntry ) const; QString styleString( Branding::StyleEntry styleEntry ) const; @@ -172,6 +173,7 @@ private: QMap< QString, QString > m_images; QMap< QString, QString > m_style; QString m_slideshowPath; + int m_slideshowAPI; QString m_translationsPathPrefix; /** @brief Initialize the simple settings below */ From 15ab98cb266b94d27356a1093c4a0042a97bcd84 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 11:05:56 +0200 Subject: [PATCH 19/45] [libcalamaresui] Use API version to load slideshow differently --- src/libcalamaresui/ExecutionViewStep.cpp | 30 ++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index 047fcede0..f31b7273b 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -72,7 +72,11 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) innerLayout->addWidget( m_label ); cDebug() << "QML import paths:" << Logger::DebugList( m_qmlShow->engine()->importPathList() ); - loadQml(); + if ( Branding::instance()->slideshowAPI() == 2 ) + { + cDebug() << "QML load on startup."; + loadQml(); + } connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue ); } @@ -143,7 +147,7 @@ ExecutionViewStep::loadQml() QQmlComponent::CompilationMode::Asynchronous ); } - if ( m_qmlComponent ) + if ( m_qmlComponent && !m_qmlObject ) { QObject* o = m_qmlComponent->create(); m_qmlObject = qobject_cast< QQuickItem* >( o ); @@ -192,8 +196,16 @@ callQMLFunction( QQuickItem* qmlObject, const char* method ) void ExecutionViewStep::onActivate() { - loadQml(); - callQMLFunction( m_qmlObject, "onActivate" ); + if ( Branding::instance()->slideshowAPI() == 2 ) + { + // The QML was already loaded in the constructor, need to start it + callQMLFunction( m_qmlObject, "onActivate" ); + } + else + { + // API version 1 assumes onCompleted is the trigger + loadQml(); + } JobQueue* queue = JobQueue::instance(); foreach ( const QString& instanceKey, m_jobInstanceKeys ) @@ -239,9 +251,13 @@ ExecutionViewStep::updateFromJobQueue( qreal percent, const QString& message ) void ExecutionViewStep::onLeave() { - callQMLFunction( m_qmlObject, "onLeave" ); - delete m_qmlObject; - m_qmlObject = nullptr; + // API version 2 is explicitly stopped; version 1 keeps running + if ( Branding::instance()->slideshowAPI() == 2 ) + { + callQMLFunction( m_qmlObject, "onLeave" ); + delete m_qmlObject; + m_qmlObject = nullptr; + } } } // namespace From 193bcbde7113ea83ad91ec8deeedf93cecee347d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 11:17:06 +0200 Subject: [PATCH 20/45] [libcalamaresui] Use setSource() for API version 1 - Just avoid all the componentized loading and do the synchronous load-compile-setContent thing. --- src/libcalamaresui/ExecutionViewStep.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index f31b7273b..62e270dee 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -201,10 +201,10 @@ ExecutionViewStep::onActivate() // The QML was already loaded in the constructor, need to start it callQMLFunction( m_qmlObject, "onActivate" ); } - else + else if ( !Calamares::Branding::instance()->slideshowPath().isEmpty() ) { // API version 1 assumes onCompleted is the trigger - loadQml(); + m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ) ); } JobQueue* queue = JobQueue::instance(); From f9bd0fba1000fb240095902b8188de2097e73f4e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 11:47:25 +0200 Subject: [PATCH 21/45] [libcalamares] Handle async QML loading - The component isn't ready immediately, so instatiate once it is fully loaded and ready - Edge case if the execution view step is already visible, then start the show (because a previous call to onActivate() will have missed it). --- src/libcalamaresui/ExecutionViewStep.cpp | 82 ++++++++++++++---------- src/libcalamaresui/ExecutionViewStep.h | 5 +- 2 files changed, 53 insertions(+), 34 deletions(-) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index 62e270dee..fbc239a03 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -42,6 +42,35 @@ #include #include +/** @brief Calls the QML method @p method() + * + * Pass in only the name of the method (e.g. onActivate). This function + * checks if the method exists (with no arguments) before trying to + * call it, so that no warnings are printed due to missing methods. + * + * If there is a return value from the QML method, it is logged (but not otherwise used). + */ +static void +callQMLFunction( QQuickItem* qmlObject, const char* method ) +{ + QByteArray methodSignature( method ); + methodSignature.append( "()" ); + + if ( qmlObject && qmlObject->metaObject()->indexOfMethod( methodSignature ) >= 0 ) + { + QVariant returnValue; + QMetaObject::invokeMethod( qmlObject, method, Q_RETURN_ARG( QVariant, returnValue ) ); + if ( !returnValue.isNull() ) + { + cDebug() << "QML" << methodSignature << "returned" << returnValue; + } + } + else if ( qmlObject ) + { + cDebug() << "QML" << methodSignature << "is missing."; + } +} + namespace Calamares { @@ -74,8 +103,8 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) cDebug() << "QML import paths:" << Logger::DebugList( m_qmlShow->engine()->importPathList() ); if ( Branding::instance()->slideshowAPI() == 2 ) { - cDebug() << "QML load on startup."; - loadQml(); + cDebug() << "QML load on startup, API 2."; + loadQmlV2(); } connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue ); @@ -138,7 +167,7 @@ ExecutionViewStep::isAtEnd() const } void -ExecutionViewStep::loadQml() +ExecutionViewStep::loadQmlV2() { if ( !m_qmlComponent && !Calamares::Branding::instance()->slideshowPath().isEmpty() ) { @@ -146,9 +175,19 @@ ExecutionViewStep::loadQml() QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ), QQmlComponent::CompilationMode::Asynchronous ); + connect( m_qmlComponent, &QQmlComponent::statusChanged, this, &ExecutionViewStep::loadQmlV2Complete ); } - if ( m_qmlComponent && !m_qmlObject ) +} + +void +ExecutionViewStep::loadQmlV2Complete() +{ + if ( m_qmlComponent && m_qmlComponent->isReady() && !m_qmlObject ) { + cDebug() << "QML loading complete, API 2"; + // Don't do this again + disconnect( m_qmlComponent, &QQmlComponent::statusChanged, this, &ExecutionViewStep::loadQmlV2Complete ); + QObject* o = m_qmlComponent->create(); m_qmlObject = qobject_cast< QQuickItem* >( o ); if ( !m_qmlObject ) @@ -160,39 +199,16 @@ ExecutionViewStep::loadQml() // what is needed: sets up visual parent by replacing the root // item, and handling resizes. m_qmlShow->setContent( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ), m_qmlComponent, m_qmlObject ); + if ( ViewManager::instance()->currentStep() == this ) + { + // We're alreay visible! Must have been slow QML loading, and we + // passed onActivate already. + callQMLFunction( m_qmlObject, "onActivate" ); + } } } } -/** @brief Calls the QML method @p method() - * - * Pass in only the name of the method (e.g. onActivate). This function - * checks if the method exists (with no arguments) before trying to - * call it, so that no warnings are printed due to missing methods. - * - * If there is a return value from the QML method, it is logged (but not otherwise used). - */ -void -callQMLFunction( QQuickItem* qmlObject, const char* method ) -{ - QByteArray methodSignature( method ); - methodSignature.append( "()" ); - - if ( qmlObject && qmlObject->metaObject()->indexOfMethod( methodSignature ) >= 0 ) - { - QVariant returnValue; - QMetaObject::invokeMethod( qmlObject, method, Q_RETURN_ARG( QVariant, returnValue ) ); - if ( !returnValue.isNull() ) - { - cDebug() << "QML" << methodSignature << "returned" << returnValue; - } - } - else if ( qmlObject ) - { - cDebug() << "QML" << methodSignature << "is missing."; - } -} - void ExecutionViewStep::onActivate() { diff --git a/src/libcalamaresui/ExecutionViewStep.h b/src/libcalamaresui/ExecutionViewStep.h index c8a0a59d6..c1183e110 100644 --- a/src/libcalamaresui/ExecutionViewStep.h +++ b/src/libcalamaresui/ExecutionViewStep.h @@ -60,6 +60,9 @@ public: void appendJobModuleInstanceKey( const QString& instanceKey ); +public slots: + void loadQmlV2Complete(); + private: QWidget* m_widget; QProgressBar* m_progressBar; @@ -70,7 +73,7 @@ private: QStringList m_jobInstanceKeys; - void loadQml(); //< Loads the slideshow QML (from branding) + void loadQmlV2(); //< Loads the slideshow QML (from branding) for API version 2 void updateFromJobQueue( qreal percent, const QString& message ); }; From 58f6635ca074bf934a69059463220e8c1dd7aa8f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 11:52:20 +0200 Subject: [PATCH 22/45] [libcalamaresui] Force retranslation on language change --- src/libcalamaresui/ExecutionViewStep.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index fbc239a03..4d28a24b2 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -108,6 +108,7 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) } connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue ); + CALAMARES_RETRANSLATE( m_qmlShow->engine()->retranslate(); ) } From c7d09f06c5703f123e0fe64aedabe73086f3ddc1 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 12:23:31 +0200 Subject: [PATCH 23/45] [libcalamaresui] QML Retranslation since Qt 5.10 --- src/libcalamaresui/ExecutionViewStep.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index 4d28a24b2..e242622a0 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -108,7 +108,9 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) } connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue ); +#if QT_VERSION >= QT_VERSION_CHECK( 5, 10, 0 ) CALAMARES_RETRANSLATE( m_qmlShow->engine()->retranslate(); ) +#endif } From bba0b7ce12e1b0b7be9fdb73acf12aa2db6a84a5 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 12:45:06 +0200 Subject: [PATCH 24/45] [branding] Update documentation about API versions --- src/branding/README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/branding/README.md b/src/branding/README.md index 146de0d5b..1b9eb57fd 100644 --- a/src/branding/README.md +++ b/src/branding/README.md @@ -12,6 +12,7 @@ forking Calamares just for adding some files. Calamares installs CMake support macros to help create branding packages. See the calamares-branding repository for examples of stand-alone branding. + ## Examples There is one example of a branding component included with Calamares, @@ -31,6 +32,41 @@ repository. [1] https://github.com/calamares/calamares-branding + +## API Versions + +In Calamares versions prior to 3.2.10, the QML slideshow was loaded +synchronously when the installation page is shown. This can lead to +noticeable lag when showing that page. The QML is written start when +it is loaded, by responding to the `onComplete` signal. + +Calamares 3.2.10 introduces an API versioning scheme which uses different +loading mechanisms. + + - **API version 1** Loads the QML slideshow synchronously, as before. + - The QML can use `onComplete` to start timers, etc. for progress + or animation. + - Translations are supported through `qsTr()` and the language that is + in use when the installation slideshow is loaded, will be used + (once the installation part is running, it can't change anyway). + - **API version 2** Loads the QML slideshow **a**synchronously, on + startup (generally during the requirements-checking phase of Calamares) + so that no compilation lag is seen. + - The QML should **not** use `onComplete`, since the QML is loaded and + instantiated at startup. Instead, + - The QML should provide functions `onActivate()` and `onLeave()` in the + root object of the slideshow. These are called when the slideshow + should start (e.g. becomes visible) and stop. + - Translations are supported through `qsTr()`. However, since the language + can change after the QML is loaded, code should count on the bindings + being re-evaluated on language change. Translation updates (e.g. change + of language) is **only supported** with Qt 5.10 and later. + +The setting *slideshowAPI* in `branding.desc` indicates which one to use +for a given branding slideshow. Which API to use is really a function of +the QML. Expect the version 1 API to be deprecated in the course of Calamares 3.3. + + ## Translations QML files in a branding component can be translated. Translations should @@ -58,6 +94,7 @@ If you are packaging the branding by hand, use ``` with all the language suffixes to *file*. + ## Presentation The default QML classes provided by Calamares can be used for a simple @@ -113,6 +150,7 @@ The presentation classes can be used to produce a fairly dry slideshow for the installation process; it is recommended to experiment with the visual effects and classes available in QtQuick. + ## Project Layout A branding component that is created and installed outside of Calamares From 1c5a37d7d2bda7bbef4bf2efd7375e17e2a77733 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 12:52:59 +0200 Subject: [PATCH 25/45] [branding] Add French and Arabic default translations --- .../default/lang/calamares-default_ar.ts | 17 +++++++++++++++++ .../default/lang/calamares-default_fr.ts | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/branding/default/lang/calamares-default_ar.ts create mode 100644 src/branding/default/lang/calamares-default_fr.ts diff --git a/src/branding/default/lang/calamares-default_ar.ts b/src/branding/default/lang/calamares-default_ar.ts new file mode 100644 index 000000000..05463dd72 --- /dev/null +++ b/src/branding/default/lang/calamares-default_ar.ts @@ -0,0 +1,17 @@ + + + + + show + + + This is a second Slide element. + عرض الثاني + + + + This is a third Slide element. + عرض الثالث + + + diff --git a/src/branding/default/lang/calamares-default_fr.ts b/src/branding/default/lang/calamares-default_fr.ts new file mode 100644 index 000000000..9329e61ee --- /dev/null +++ b/src/branding/default/lang/calamares-default_fr.ts @@ -0,0 +1,17 @@ + + + + + show + + + This is a second Slide element. + Ceci est la deuxieme affiche. + + + + This is a third Slide element. + La troisième affice ce trouve ici. + + + From 13d949f913a77387b66e966709d27189b2a7552e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 13:11:04 +0200 Subject: [PATCH 26/45] Changes: point to slideshow API versions FIXES #1152 --- CHANGES | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 7e9fc22be..dcc32eea0 100644 --- a/CHANGES +++ b/CHANGES @@ -22,14 +22,12 @@ require changes in the slideshow. configured after the last *exec* section of the sequence has been solved. The *finished* page can be left out (but then you don't get the restart-now functionality). #1168 - - The *slideshow* which is run during installation is now loaded on - startup (while requirements checking is being done). This should - improve responsiveness when the slideshow starts. If the slideshow - has methods `onActivate()` and `onLeave()` those will be called - when the installation step is activated (e.g. the installation - starts and the slideshow becomes visible) or is finished (and the - slideshow becomes hidden). - - The example slideshow now starts its timers when it becomes visible. + - The *slideshow* which is run during installation now has API versions. + API version 1 (the default) runs as before, where the slideshow is loaded + when the installation starts. API version 2 loads the slideshow on + Calamares startup, thus improving responsiveness. Documentation + in `src/branding/README.md`. #1152 + - The example slideshow now uses API version 2. ## Modules ## From 63d13787217be147d479b73966e33bea947e41d8 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 15:17:29 +0200 Subject: [PATCH 27/45] CMake: need to create dir before copying to it --- CMakeModules/CalamaresAddBrandingSubdirectory.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeModules/CalamaresAddBrandingSubdirectory.cmake b/CMakeModules/CalamaresAddBrandingSubdirectory.cmake index 344777eb0..80cf86f38 100644 --- a/CMakeModules/CalamaresAddBrandingSubdirectory.cmake +++ b/CMakeModules/CalamaresAddBrandingSubdirectory.cmake @@ -108,6 +108,7 @@ function( calamares_add_branding_translations NAME ) if ( BRANDING_TRANSLATION_FILES ) qt5_add_translation( QM_FILES ${BRANDING_TRANSLATION_FILES} ) add_custom_target( branding-translation-${NAME} ALL DEPENDS ${QM_FILES} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/lang/ COMMAND ${CMAKE_COMMAND} -E copy ${QM_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/lang/ ) install( FILES ${QM_FILES} DESTINATION ${BRANDING_COMPONENT_DESTINATION}/lang/ ) From 8e2b49364c1e0119d4de10724271f20d925682a7 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 17 Jun 2019 15:35:07 +0200 Subject: [PATCH 28/45] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_ca@valencia.ts | 3142 +++++++++++++++++++++++++++++++++ lang/calamares_eo.ts | 32 +- lang/calamares_fi_FI.ts | 230 +-- lang/calamares_ja.ts | 12 +- lang/calamares_pl.ts | 16 +- 5 files changed, 3288 insertions(+), 144 deletions(-) create mode 100644 lang/calamares_ca@valencia.ts diff --git a/lang/calamares_ca@valencia.ts b/lang/calamares_ca@valencia.ts new file mode 100644 index 000000000..e738a9628 --- /dev/null +++ b/lang/calamares_ca@valencia.ts @@ -0,0 +1,3142 @@ + + + BootInfoWidget + + + The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. + + + + + This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. + + + + + This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. + + + + + BootLoaderModel + + + Master Boot Record of %1 + + + + + Boot Partition + + + + + System Partition + + + + + Do not install a boot loader + + + + + %1 (%2) + + + + + Calamares::BlankViewStep + + + Blank Page + + + + + Calamares::DebugWindow + + + Form + + + + + GlobalStorage + + + + + JobQueue + + + + + Modules + + + + + Type: + + + + + + none + + + + + Interface: + + + + + Tools + + + + + Debug information + + + + + Calamares::ExecutionViewStep + + + Set up + + + + + Install + + + + + Calamares::FailJob + + + Job failed (%1) + + + + + Programmed job failure was explicitly requested. + + + + + Calamares::JobThread + + + Done + + + + + Calamares::NamedJob + + + Example job (%1) + + + + + Calamares::ProcessJob + + + Run command %1 %2 + + + + + Running command %1 %2 + + + + + Calamares::PythonJob + + + Running %1 operation. + + + + + Bad working directory path + + + + + Working directory %1 for python job %2 is not readable. + + + + + Bad main script file + + + + + Main script file %1 for python job %2 is not readable. + + + + + Boost.Python error in job "%1". + + + + + Calamares::RequirementsChecker + + + Waiting for %n module(s). + + + + + (%n second(s)) + + + + + System-requirements checking is complete. + + + + + Calamares::ViewManager + + + &Back + + + + + + &Next + + + + + + &Cancel + + + + + + Cancel setup without changing the system. + + + + + + Cancel installation without changing the system. + + + + + Setup Failed + + + + + Calamares Initialization Failed + + + + + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. + + + + + <br/>The following modules could not be loaded: + + + + + Continue with installation? + + + + + The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> + + + + + &Set up now + + + + + &Set up + + + + + &Install + + + + + Setup is complete. Close the setup program. + + + + + Cancel setup? + + + + + Cancel installation? + + + + + Do you really want to cancel the current setup process? +The setup program will quit and all changes will be lost. + + + + + Do you really want to cancel the current install process? +The installer will quit and all changes will be lost. + + + + + &Yes + + + + + &No + + + + + &Close + + + + + Continue with setup? + + + + + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> + + + + + &Install now + + + + + Go &back + + + + + &Done + + + + + The installation is complete. Close the installer. + + + + + Error + + + + + Installation Failed + + + + + CalamaresPython::Helper + + + Unknown exception type + + + + + unparseable Python error + + + + + unparseable Python traceback + + + + + Unfetchable Python error. + + + + + CalamaresWindow + + + %1 Setup Program + + + + + %1 Installer + + + + + Show debug information + + + + + CheckerContainer + + + Gathering system information... + + + + + ChoicePage + + + Form + + + + + After: + + + + + <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. + + + + + Boot loader location: + + + + + Select storage de&vice: + + + + + + + + Current: + + + + + Reuse %1 as home partition for %2. + + + + + <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> + + + + + %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. + + + + + <strong>Select a partition to install on</strong> + + + + + An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. + + + + + The EFI system partition at %1 will be used for starting %2. + + + + + EFI system partition: + + + + + This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + + + + <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. + + + + + This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + No Swap + + + + + Reuse Swap + + + + + Swap (no Hibernate) + + + + + Swap (with Hibernate) + + + + + Swap to file + + + + + + + + <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. + + + + + + + + <strong>Replace a partition</strong><br/>Replaces a partition with %1. + + + + + This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + ClearMountsJob + + + Clear mounts for partitioning operations on %1 + + + + + Clearing mounts for partitioning operations on %1. + + + + + Cleared all mounts for %1 + + + + + ClearTempMountsJob + + + Clear all temporary mounts. + + + + + Clearing all temporary mounts. + + + + + Cannot get list of temporary mounts. + + + + + Cleared all temporary mounts. + + + + + CommandList + + + + Could not run command. + + + + + The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. + + + + + The command needs to know the user's name, but no username is defined. + + + + + ContextualProcessJob + + + Contextual Processes Job + + + + + CreatePartitionDialog + + + Create a Partition + + + + + MiB + + + + + Partition &Type: + + + + + &Primary + + + + + E&xtended + + + + + Fi&le System: + + + + + LVM LV name + + + + + Flags: + + + + + &Mount Point: + + + + + Si&ze: + + + + + En&crypt + + + + + Logical + + + + + Primary + + + + + GPT + + + + + Mountpoint already in use. Please select another one. + + + + + CreatePartitionJob + + + Create new %2MiB partition on %4 (%3) with file system %1. + + + + + Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. + + + + + Creating new %1 partition on %2. + + + + + The installer failed to create partition on disk '%1'. + + + + + CreatePartitionTableDialog + + + Create Partition Table + + + + + Creating a new partition table will delete all existing data on the disk. + + + + + What kind of partition table do you want to create? + + + + + Master Boot Record (MBR) + + + + + GUID Partition Table (GPT) + + + + + CreatePartitionTableJob + + + Create new %1 partition table on %2. + + + + + Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). + + + + + Creating new %1 partition table on %2. + + + + + The installer failed to create a partition table on %1. + + + + + CreateUserJob + + + Create user %1 + + + + + Create user <strong>%1</strong>. + + + + + Creating user %1. + + + + + Sudoers dir is not writable. + + + + + Cannot create sudoers file for writing. + + + + + Cannot chmod sudoers file. + + + + + Cannot open groups file for reading. + + + + + CreateVolumeGroupDialog + + + Create Volume Group + + + + + CreateVolumeGroupJob + + + Create new volume group named %1. + + + + + Create new volume group named <strong>%1</strong>. + + + + + Creating new volume group named %1. + + + + + The installer failed to create a volume group named '%1'. + + + + + DeactivateVolumeGroupJob + + + + Deactivate volume group named %1. + + + + + Deactivate volume group named <strong>%1</strong>. + + + + + The installer failed to deactivate a volume group named %1. + + + + + DeletePartitionJob + + + Delete partition %1. + + + + + Delete partition <strong>%1</strong>. + + + + + Deleting partition %1. + + + + + The installer failed to delete partition %1. + + + + + DeviceInfoWidget + + + The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. + + + + + This device has a <strong>%1</strong> partition table. + + + + + This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. + + + + + This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. + + + + + <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. + + + + + <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. + + + + + DeviceModel + + + %1 - %2 (%3) + device[name] - size[number] (device-node[name]) + + + + + %1 - (%2) + device[name] - (device-node[name]) + + + + + DracutLuksCfgJob + + + Write LUKS configuration for Dracut to %1 + + + + + Skip writing LUKS configuration for Dracut: "/" partition is not encrypted + + + + + Failed to open %1 + + + + + DummyCppJob + + + Dummy C++ Job + + + + + EditExistingPartitionDialog + + + Edit Existing Partition + + + + + Content: + + + + + &Keep + + + + + Format + + + + + Warning: Formatting the partition will erase all existing data. + + + + + &Mount Point: + + + + + Si&ze: + + + + + MiB + + + + + Fi&le System: + + + + + Flags: + + + + + Mountpoint already in use. Please select another one. + + + + + EncryptWidget + + + Form + + + + + En&crypt system + + + + + Passphrase + + + + + Confirm passphrase + + + + + Please enter the same passphrase in both boxes. + + + + + FillGlobalStorageJob + + + Set partition information + + + + + Install %1 on <strong>new</strong> %2 system partition. + + + + + Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. + + + + + Install %2 on %3 system partition <strong>%1</strong>. + + + + + Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. + + + + + Install boot loader on <strong>%1</strong>. + + + + + Setting up mount points. + + + + + FinishedPage + + + Form + + + + + <Restart checkbox tooltip> + + + + + &Restart now + + + + + <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. + + + + + <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> + + + + + <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. + + + + + <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> + + + + + <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. + + + + + <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. + + + + + FinishedViewStep + + + Finish + + + + + Setup Complete + + + + + Installation Complete + + + + + The setup of %1 is complete. + + + + + The installation of %1 is complete. + + + + + FormatPartitionJob + + + Format partition %1 (file system: %2, size: %3 MiB) on %4. + + + + + Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. + + + + + Formatting partition %1 with file system %2. + + + + + The installer failed to format partition %1 on disk '%2'. + + + + + GeneralRequirements + + + has at least %1 GiB available drive space + + + + + There is not enough drive space. At least %1 GiB is required. + + + + + has at least %1 GiB working memory + + + + + The system does not have enough working memory. At least %1 GiB is required. + + + + + is plugged in to a power source + + + + + The system is not plugged in to a power source. + + + + + is connected to the Internet + + + + + The system is not connected to the Internet. + + + + + The setup program is not running with administrator rights. + + + + + The installer is not running with administrator rights. + + + + + The screen is too small to display the setup program. + + + + + The screen is too small to display the installer. + + + + + IDJob + + + + + + OEM Batch Identifier + + + + + Could not create directories <code>%1</code>. + + + + + Could not open file <code>%1</code>. + + + + + Could not write to file <code>%1</code>. + + + + + InteractiveTerminalPage + + + Konsole not installed + + + + + Please install KDE Konsole and try again! + + + + + Executing script: &nbsp;<code>%1</code> + + + + + InteractiveTerminalViewStep + + + Script + + + + + KeyboardPage + + + Set keyboard model to %1.<br/> + + + + + Set keyboard layout to %1/%2. + + + + + KeyboardViewStep + + + Keyboard + + + + + LCLocaleDialog + + + System locale setting + + + + + The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. + + + + + &Cancel + + + + + &OK + + + + + LicensePage + + + Form + + + + + I accept the terms and conditions above. + + + + + <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. + + + + + Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. + + + + + <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. + + + + + Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. + + + + + LicenseViewStep + + + License + + + + + LicenseWidget + + + <strong>%1 driver</strong><br/>by %2 + %1 is an untranslatable product name, example: Creative Audigy driver + + + + + <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> + %1 is usually a vendor name, example: Nvidia graphics driver + + + + + <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> + + + + + <strong>%1 codec</strong><br/><font color="Grey">by %2</font> + + + + + <strong>%1 package</strong><br/><font color="Grey">by %2</font> + + + + + <strong>%1</strong><br/><font color="Grey">by %2</font> + + + + + Shows the complete license text + + + + + Hide license text + + + + + Show license agreement + + + + + Hide license agreement + + + + + Opens the license agreement in a browser window. + + + + + <a href="%1">View license agreement</a> + + + + + LocalePage + + + The system language will be set to %1. + + + + + The numbers and dates locale will be set to %1. + + + + + Region: + + + + + Zone: + + + + + + &Change... + + + + + Set timezone to %1/%2.<br/> + + + + + LocaleViewStep + + + Loading location data... + + + + + Location + + + + + NetInstallPage + + + Name + + + + + Description + + + + + Network Installation. (Disabled: Unable to fetch package lists, check your network connection) + + + + + Network Installation. (Disabled: Received invalid groups data) + + + + + NetInstallViewStep + + + Package selection + + + + + OEMPage + + + Ba&tch: + + + + + <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> + + + + + <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> + + + + + OEMViewStep + + + OEM Configuration + + + + + Set the OEM Batch Identifier to <code>%1</code>. + + + + + PWQ + + + Password is too short + + + + + Password is too long + + + + + Password is too weak + + + + + Memory allocation error when setting '%1' + + + + + Memory allocation error + + + + + The password is the same as the old one + + + + + The password is a palindrome + + + + + The password differs with case changes only + + + + + The password is too similar to the old one + + + + + The password contains the user name in some form + + + + + The password contains words from the real name of the user in some form + + + + + The password contains forbidden words in some form + + + + + The password contains less than %1 digits + + + + + The password contains too few digits + + + + + The password contains less than %1 uppercase letters + + + + + The password contains too few uppercase letters + + + + + The password contains less than %1 lowercase letters + + + + + The password contains too few lowercase letters + + + + + The password contains less than %1 non-alphanumeric characters + + + + + The password contains too few non-alphanumeric characters + + + + + The password is shorter than %1 characters + + + + + The password is too short + + + + + The password is just rotated old one + + + + + The password contains less than %1 character classes + + + + + The password does not contain enough character classes + + + + + The password contains more than %1 same characters consecutively + + + + + The password contains too many same characters consecutively + + + + + The password contains more than %1 characters of the same class consecutively + + + + + The password contains too many characters of the same class consecutively + + + + + The password contains monotonic sequence longer than %1 characters + + + + + The password contains too long of a monotonic character sequence + + + + + No password supplied + + + + + Cannot obtain random numbers from the RNG device + + + + + Password generation failed - required entropy too low for settings + + + + + The password fails the dictionary check - %1 + + + + + The password fails the dictionary check + + + + + Unknown setting - %1 + + + + + Unknown setting + + + + + Bad integer value of setting - %1 + + + + + Bad integer value + + + + + Setting %1 is not of integer type + + + + + Setting is not of integer type + + + + + Setting %1 is not of string type + + + + + Setting is not of string type + + + + + Opening the configuration file failed + + + + + The configuration file is malformed + + + + + Fatal failure + + + + + Unknown error + + + + + Page_Keyboard + + + Form + + + + + Keyboard Model: + + + + + Type here to test your keyboard + + + + + Page_UserSetup + + + Form + + + + + What is your name? + + + + + What name do you want to use to log in? + + + + + Choose a password to keep your account safe. + + + + + <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> + + + + + What is the name of this computer? + + + + + <small>This name will be used if you make the computer visible to others on a network.</small> + + + + + Log in automatically without asking for the password. + + + + + Use the same password for the administrator account. + + + + + Choose a password for the administrator account. + + + + + <small>Enter the same password twice, so that it can be checked for typing errors.</small> + + + + + PartitionLabelsView + + + Root + + + + + Home + + + + + Boot + + + + + EFI system + + + + + Swap + + + + + New partition for %1 + + + + + New partition + + + + + %1 %2 + size[number] filesystem[name] + + + + + PartitionModel + + + + Free Space + + + + + + New partition + + + + + Name + + + + + File System + + + + + Mount Point + + + + + Size + + + + + PartitionPage + + + Form + + + + + Storage de&vice: + + + + + &Revert All Changes + + + + + New Partition &Table + + + + + Cre&ate + + + + + &Edit + + + + + &Delete + + + + + New Volume Group + + + + + Resize Volume Group + + + + + Deactivate Volume Group + + + + + Remove Volume Group + + + + + I&nstall boot loader on: + + + + + Are you sure you want to create a new partition table on %1? + + + + + Can not create new partition + + + + + The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. + + + + + PartitionViewStep + + + Gathering system information... + + + + + Partitions + + + + + Install %1 <strong>alongside</strong> another operating system. + + + + + <strong>Erase</strong> disk and install %1. + + + + + <strong>Replace</strong> a partition with %1. + + + + + <strong>Manual</strong> partitioning. + + + + + Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). + + + + + <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. + + + + + <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. + + + + + <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). + + + + + Disk <strong>%1</strong> (%2) + + + + + Current: + + + + + After: + + + + + No EFI system partition configured + + + + + An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. + + + + + EFI system partition flag not set + + + + + An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. + + + + + Boot partition not encrypted + + + + + A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. + + + + + has at least one disk device available. + + + + + There are no partitons to install on. + + + + + PlasmaLnfJob + + + Plasma Look-and-Feel Job + + + + + + Could not select KDE Plasma Look-and-Feel package + + + + + PlasmaLnfPage + + + Form + + + + + Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. + + + + + Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. + + + + + PlasmaLnfViewStep + + + Look-and-Feel + + + + + PreserveFiles + + + Saving files for later ... + + + + + No files configured to save for later. + + + + + Not all of the configured files could be preserved. + + + + + ProcessResult + + + +There was no output from the command. + + + + + +Output: + + + + + + External command crashed. + + + + + Command <i>%1</i> crashed. + + + + + External command failed to start. + + + + + Command <i>%1</i> failed to start. + + + + + Internal error when starting command. + + + + + Bad parameters for process job call. + + + + + External command failed to finish. + + + + + Command <i>%1</i> failed to finish in %2 seconds. + + + + + External command finished with errors. + + + + + Command <i>%1</i> finished with exit code %2. + + + + + QObject + + + Default Keyboard Model + + + + + + Default + + + + + unknown + + + + + extended + + + + + unformatted + + + + + swap + + + + + Unpartitioned space or unknown partition table + + + + + (no mount point) + + + + + Requirements checking for module <i>%1</i> is complete. + + + + + %1 (%2) + language[name] (country[name]) + + + + + RemoveVolumeGroupJob + + + + Remove Volume Group named %1. + + + + + Remove Volume Group named <strong>%1</strong>. + + + + + The installer failed to remove a volume group named '%1'. + + + + + ReplaceWidget + + + Form + + + + + Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. + + + + + The selected item does not appear to be a valid partition. + + + + + %1 cannot be installed on empty space. Please select an existing partition. + + + + + %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. + + + + + %1 cannot be installed on this partition. + + + + + Data partition (%1) + + + + + Unknown system partition (%1) + + + + + %1 system partition (%2) + + + + + <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. + + + + + <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. + + + + + + + <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. + + + + + The EFI system partition at %1 will be used for starting %2. + + + + + EFI system partition: + + + + + ResizeFSJob + + + Resize Filesystem Job + + + + + Invalid configuration + + + + + The file-system resize job has an invalid configuration and will not run. + + + + + + KPMCore not Available + + + + + + Calamares cannot start KPMCore for the file-system resize job. + + + + + + + + + Resize Failed + + + + + The filesystem %1 could not be found in this system, and cannot be resized. + + + + + The device %1 could not be found in this system, and cannot be resized. + + + + + + The filesystem %1 cannot be resized. + + + + + + The device %1 cannot be resized. + + + + + The filesystem %1 must be resized, but cannot. + + + + + The device %1 must be resized, but cannot + + + + + ResizePartitionJob + + + Resize partition %1. + + + + + Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong>. + + + + + Resizing %2MiB partition %1 to %3MiB. + + + + + The installer failed to resize partition %1 on disk '%2'. + + + + + ResizeVolumeGroupDialog + + + Resize Volume Group + + + + + ResizeVolumeGroupJob + + + + Resize volume group named %1 from %2 to %3. + + + + + Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong>. + + + + + The installer failed to resize a volume group named '%1'. + + + + + ResultsListWidget + + + This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> + + + + + This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> + + + + + This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. + + + + + This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. + + + + + This program will ask you some questions and set up %2 on your computer. + + + + + For best results, please ensure that this computer: + + + + + System requirements + + + + + ScanningDialog + + + Scanning storage devices... + + + + + Partitioning + + + + + SetHostNameJob + + + Set hostname %1 + + + + + Set hostname <strong>%1</strong>. + + + + + Setting hostname %1. + + + + + + Internal Error + + + + + + Cannot write hostname to target system + + + + + SetKeyboardLayoutJob + + + Set keyboard model to %1, layout to %2-%3 + + + + + Failed to write keyboard configuration for the virtual console. + + + + + + + Failed to write to %1 + + + + + Failed to write keyboard configuration for X11. + + + + + Failed to write keyboard configuration to existing /etc/default directory. + + + + + SetPartFlagsJob + + + Set flags on partition %1. + + + + + Set flags on %1MiB %2 partition. + + + + + Set flags on new partition. + + + + + Clear flags on partition <strong>%1</strong>. + + + + + Clear flags on %1MiB <strong>%2</strong> partition. + + + + + Flag %1MiB <strong>%2</strong> partition as <strong>%3</strong>. + + + + + Clearing flags on %1MiB <strong>%2</strong> partition. + + + + + Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition. + + + + + Clear flags on new partition. + + + + + Flag partition <strong>%1</strong> as <strong>%2</strong>. + + + + + Flag new partition as <strong>%1</strong>. + + + + + Clearing flags on partition <strong>%1</strong>. + + + + + Clearing flags on new partition. + + + + + Setting flags <strong>%2</strong> on partition <strong>%1</strong>. + + + + + Setting flags <strong>%1</strong> on new partition. + + + + + The installer failed to set flags on partition %1. + + + + + SetPasswordJob + + + Set password for user %1 + + + + + Setting password for user %1. + + + + + Bad destination system path. + + + + + rootMountPoint is %1 + + + + + Cannot disable root account. + + + + + passwd terminated with error code %1. + + + + + Cannot set password for user %1. + + + + + usermod terminated with error code %1. + + + + + SetTimezoneJob + + + Set timezone to %1/%2 + + + + + Cannot access selected timezone path. + + + + + Bad path: %1 + + + + + Cannot set timezone. + + + + + Link creation failed, target: %1; link name: %2 + + + + + Cannot set timezone, + + + + + Cannot open /etc/timezone for writing + + + + + ShellProcessJob + + + Shell Processes Job + + + + + SlideCounter + + + %L1 / %L2 + slide counter, %1 of %2 (numeric) + + + + + SummaryPage + + + This is an overview of what will happen once you start the setup procedure. + + + + + This is an overview of what will happen once you start the install procedure. + + + + + SummaryViewStep + + + Summary + + + + + TrackingInstallJob + + + Installation feedback + + + + + Sending installation feedback. + + + + + Internal error in install-tracking. + + + + + HTTP request timed out. + + + + + TrackingMachineNeonJob + + + Machine feedback + + + + + Configuring machine feedback. + + + + + + Error in machine feedback configuration. + + + + + Could not configure machine feedback correctly, script error %1. + + + + + Could not configure machine feedback correctly, Calamares error %1. + + + + + TrackingPage + + + Form + + + + + Placeholder + + + + + <html><head/><body><p>By selecting this, you will send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> + + + + + <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> + + + + + Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with the last two options below), get continuous information about preferred applications. To see what will be sent, please click the help icon next to each area. + + + + + By selecting this you will send information about your installation and hardware. This information will <b>only be sent once</b> after the installation finishes. + + + + + By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. + + + + + By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. + + + + + TrackingViewStep + + + Feedback + + + + + UsersPage + + + <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> + + + + + <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> + + + + + Your username is too long. + + + + + Your username contains invalid characters. Only lowercase letters and numbers are allowed. + + + + + Your hostname is too short. + + + + + Your hostname is too long. + + + + + Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. + + + + + + Your passwords do not match! + + + + + UsersViewStep + + + Users + + + + + VolumeGroupBaseDialog + + + Create Volume Group + + + + + List of Physical Volumes + + + + + Volume Group Name: + + + + + Volume Group Type: + + + + + Physical Extent Size: + + + + + MiB + + + + + Total Size: + + + + + Used Size: + + + + + Total Sectors: + + + + + Quantity of LVs: + + + + + WelcomePage + + + Form + + + + + &Release notes + + + + + &Known issues + + + + + + Select language + + + + + &Support + + + + + &About + + + + + <h1>Welcome to the %1 installer.</h1> + + + + + <h1>Welcome to the Calamares installer for %1.</h1> + + + + + <h1>Welcome to the Calamares setup program for %1.</h1> + + + + + <h1>Welcome to %1 setup.</h1> + + + + + About %1 setup + + + + + About %1 installer + + + + + <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2019 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. + + + + + %1 support + + + + + WelcomeViewStep + + + Welcome + + + + \ No newline at end of file diff --git a/lang/calamares_eo.ts b/lang/calamares_eo.ts index 558006b8e..df38c5e88 100644 --- a/lang/calamares_eo.ts +++ b/lang/calamares_eo.ts @@ -58,7 +58,7 @@ Form - + Formularo @@ -73,23 +73,23 @@ Modules - + Moduloj Type: - + Tipo: none - + neniu Interface: - + Interfaco: @@ -422,7 +422,7 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. Form - + Formularo @@ -1025,7 +1025,7 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. Form - + Formularo @@ -1091,7 +1091,7 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. Form - + Formularo @@ -1349,7 +1349,7 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. Form - + Formularo @@ -1807,7 +1807,7 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. Form - + Formularo @@ -1825,7 +1825,7 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. Form - + Formularo @@ -1962,7 +1962,7 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. Form - + Formularo @@ -2162,7 +2162,7 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. Form - + Formularo @@ -2346,7 +2346,7 @@ Output: Form - + Formularo @@ -2907,7 +2907,7 @@ Output: Form - + Formularo @@ -3063,7 +3063,7 @@ Output: Form - + Formularo diff --git a/lang/calamares_fi_FI.ts b/lang/calamares_fi_FI.ts index c2868130d..ee397d052 100644 --- a/lang/calamares_fi_FI.ts +++ b/lang/calamares_fi_FI.ts @@ -2051,47 +2051,47 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. Install %1 <strong>alongside</strong> another operating system. - + Asenna toisen käyttöjärjestelmän %1 <strong>rinnalle</strong>. <strong>Erase</strong> disk and install %1. - + <strong>Tyhjennä</strong> levy ja asenna %1. <strong>Replace</strong> a partition with %1. - + <strong>Vaihda</strong> osio jolla on %1. <strong>Manual</strong> partitioning. - + <strong>Manuaalinen</strong> osointi. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). - + Asenna toisen käyttöjärjestelmän %1 <strong>rinnalle</strong> levylle <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. - + <strong>Tyhjennä</strong> levy <strong>%2</strong> (%3) ja asenna %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. - + <strong>Korvaa</strong> levyn osio <strong>%2</strong> (%3) jolla on %1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). - + <strong>Manuaalinen</strong> osiointi levyllä <strong>%1</strong> (%2). Disk <strong>%1</strong> (%2) - + Levy <strong>%1</strong> (%2) @@ -2111,7 +2111,7 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. - + EFI-järjestelmäosio on välttämätön käynnistystä varten %1.<br/><br/>Jos haluat tehdä EFI-järjestelmäosion, mene takaisin ja luo FAT32-tiedostojärjestelmä, jossa on<strong>esp</strong> lippu yhdistettynä asennuspisteen liitokseen <strong>%2</strong>.<br/><br/>Voit jatkaa ilman EFI-järjestelmäosiota, mutta järjestelmä ei ehkä käynnisty. @@ -2121,7 +2121,7 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. - + EFI-järjestelmäosio on välttämätön käynnistystä varten %1.<br/><br/>Osio määritettiin liittymäpisteellä, <strong>%2</strong> mutta sen <strong>esp</strong> lippua ei ole asetettu.<br/>Jos haluat asettaa lipun, palaa takaisin ja muokkaa osiota.<br/><br/>Voit jatkaa lippua asettamatta, mutta järjestelmä ei ehkä käynnisty. @@ -2131,7 +2131,7 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. - + Erillinen käynnistysosio perustettiin yhdessä salatun juuriosion kanssa, mutta käynnistysosio ei ole salattu.<br/><br/>Tällaisissa asetuksissa on tietoturvaongelmia, koska tärkeät järjestelmätiedostot pidetään salaamattomassa osiossa.<br/>Voit jatkaa, jos haluat, mutta tiedostojärjestelmän lukituksen avaaminen tapahtuu myöhemmin järjestelmän käynnistyksen aikana.<br/>Käynnistysosion salaamiseksi siirry takaisin ja luo se uudelleen valitsemalla <strong>Salaa</strong> osion luominen -ikkunassa. @@ -2141,7 +2141,7 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. There are no partitons to install on. - + Asennettavia osioita ei ole. @@ -2149,13 +2149,13 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. Plasma Look-and-Feel Job - + Plasman ulkoasu Could not select KDE Plasma Look-and-Feel package - + KDE-plasman ulkoasupakettia ei voi valita @@ -2168,12 +2168,12 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. - + Valitse ulkoasu KDE-plasma -työpöydälle. Voit myös ohittaa tämän vaiheen ja määrittää ulkoasun, kun järjestelmä on asetettu. Klikkaamalla ulkoasun valintaa saat suoran esikatselun tästä ulkoasusta. Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. - + Valitse KDE-plasma -työpöydän ulkoasu. Voit myös ohittaa tämän vaiheen ja määrittää ulkoasun, kun järjestelmä on asennettu. Klikkaamalla ulkoasun valintaa saat suoran esikatselun tästä ulkoasusta. @@ -2181,7 +2181,7 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. Look-and-Feel - + Ulkoasu @@ -2194,12 +2194,12 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. No files configured to save for later. - + Ei tiedostoja, joita olisi määritetty tallentamaan myöhemmin. Not all of the configured files could be preserved. - + Kaikkia määritettyjä tiedostoja ei voitu säilyttää. @@ -2208,7 +2208,8 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. There was no output from the command. - + +Komentoa ei voitu ajaa. @@ -2222,27 +2223,27 @@ Ulostulo: External command crashed. - + Ulkoinen komento kaatui. Command <i>%1</i> crashed. - + Komento <i>%1</i> kaatui. External command failed to start. - + Ulkoisen komennon käynnistäminen epäonnistui. Command <i>%1</i> failed to start. - + Komennon <i>%1</i> käynnistäminen epäonnistui. Internal error when starting command. - + Sisäinen virhe käynnistettäessä komentoa. @@ -2252,22 +2253,22 @@ Ulostulo: External command failed to finish. - + Ulkoinen komento ei onnistunut. Command <i>%1</i> failed to finish in %2 seconds. - + Komento <i>%1</i> epäonnistui %2 sekunnissa. External command finished with errors. - + Ulkoinen komento päättyi virheisiin. Command <i>%1</i> finished with exit code %2. - + Komento <i>%1</i> päättyi koodiin %2. @@ -2306,7 +2307,7 @@ Ulostulo: Unpartitioned space or unknown partition table - + Osioimaton tila tai tuntematon osion taulu @@ -2316,7 +2317,7 @@ Ulostulo: Requirements checking for module <i>%1</i> is complete. - + Moduulin vaatimusten tarkistaminen <i>%1</i> on valmis. @@ -2331,17 +2332,17 @@ Ulostulo: Remove Volume Group named %1. - + Poista asemaryhmä nimeltä %1. Remove Volume Group named <strong>%1</strong>. - + Poista asemaryhmä nimeltä <strong>%1</strong>. The installer failed to remove a volume group named '%1'. - + Asentaja ei onnistunut poistamaan nimettyä asemaryhmää '%1'. @@ -2394,19 +2395,19 @@ Ulostulo: <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. - + <strong>%4</strong><br/><br/>Osio %1 on liian pieni %2. Valitse osio, jonka kapasiteetti on vähintään %3 GiB. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. - + <strong>%2</strong><br/><br/>EFI-järjestelmäosiota ei löydy mistään tässä järjestelmässä. Palaa takaisin ja käytä manuaalista osiointia määrittämällä %1. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. - + <strong>%3</strong><br/><br/>%1 asennetaan %2.<br/><font color="red">Varoitus: </font>kaikki osion %2 tiedot katoavat. @@ -2424,7 +2425,7 @@ Ulostulo: Resize Filesystem Job - + Muuta tiedostojärjestelmän kokoa @@ -2434,7 +2435,7 @@ Ulostulo: The file-system resize job has an invalid configuration and will not run. - + Tiedostojärjestelmän koon muutto ei kelpaa eikä sitä suoriteta. @@ -2446,7 +2447,7 @@ Ulostulo: Calamares cannot start KPMCore for the file-system resize job. - + Calamares ei voi käynnistää KPMCore-tiedostoa tiedostojärjestelmän koon muuttamiseksi. @@ -2460,34 +2461,34 @@ Ulostulo: The filesystem %1 could not be found in this system, and cannot be resized. - + Tiedostojärjestelmää %1 ei löydy tästä järjestelmästä, eikä sen kokoa voi muuttaa. The device %1 could not be found in this system, and cannot be resized. - + Laitetta %1 ei löydy tästä järjestelmästä, eikä sen kokoa voi muuttaa. The filesystem %1 cannot be resized. - + Tiedostojärjestelmän %1 kokoa ei voi muuttaa. The device %1 cannot be resized. - + Laitteen %1 kokoa ei voi muuttaa. The filesystem %1 must be resized, but cannot. - + Tiedostojärjestelmän %1 kokoa on muutettava, mutta ei onnistu. The device %1 must be resized, but cannot - + Laitteen %1 kokoa on muutettava, mutta ei onnistu. @@ -2500,12 +2501,12 @@ Ulostulo: Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong>. - + Muuta <strong>%2MiB</strong> osiota <strong>%1</strong> - <strong>%3MiB</strong>. Resizing %2MiB partition %1 to %3MiB. - + Muuntaa %2MiB osion %1 to %3MiB. @@ -2527,17 +2528,17 @@ Ulostulo: Resize volume group named %1 from %2 to %3. - + Muuta %1 levyn kokoa %2:sta %3. Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong>. - + Muuta levyä nimeltä <strong>%1</strong> lähde <strong>%2</strong> - <strong>%3</strong>. The installer failed to resize a volume group named '%1'. - + Asentaja ei onnistunut muuttamaan nimettyä levyä '%1'. @@ -2545,27 +2546,28 @@ Ulostulo: This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> - + Tämä tietokone ei täytä vähimmäisvaatimuksia, %1.<br/>Asennusta ei voi jatkaa. <a href="#details">Yksityiskohdat...</a> This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> - + Tämä tietokone ei täytä asennuksen vähimmäisvaatimuksia, %1.<br/>Asennus ei voi jatkua. <a href="#details">Yksityiskohdat...</a> This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. - + Tämä tietokone ei täytä joitakin suositeltuja vaatimuksia %1.<br/>Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä. This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. - + Tämä tietokone ei täytä joitakin suositeltuja vaatimuksia %1. +Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä. This program will ask you some questions and set up %2 on your computer. - + Tämä ohjelma kysyy joitakin kysymyksiä %2 ja asentaa tietokoneeseen. @@ -2601,12 +2603,12 @@ Ulostulo: Set hostname <strong>%1</strong>. - + Aseta koneellenimi <strong>%1</strong>. Setting hostname %1. - + Asetetaan koneellenimi %1. @@ -2648,7 +2650,7 @@ Ulostulo: Failed to write keyboard configuration to existing /etc/default directory. - + Näppäimistöasetusten kirjoittaminen epäonnistui olemassa olevaan /etc/default hakemistoon. @@ -2656,82 +2658,82 @@ Ulostulo: Set flags on partition %1. - + Aseta liput osioon %1. Set flags on %1MiB %2 partition. - + Aseta liput %1MiB %2 osioon. Set flags on new partition. - + Aseta liput uuteen osioon. Clear flags on partition <strong>%1</strong>. - + Poista liput osiosta <strong>%1</strong>. Clear flags on %1MiB <strong>%2</strong> partition. - + Poista liput %1MiB <strong>%2</strong> osiosta. Flag %1MiB <strong>%2</strong> partition as <strong>%3</strong>. - + Lippu %1MiB <strong>%2</strong> osiosta <strong>%3</strong>. Clearing flags on %1MiB <strong>%2</strong> partition. - + Tyhjennä liput %1MiB <strong>%2</strong> osiossa. Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition. - + Asetetaan liput <strong>%3</strong> %1MiB <strong>%2</strong> osioon. Clear flags on new partition. - + Tyhjennä liput uuteen osioon. Flag partition <strong>%1</strong> as <strong>%2</strong>. - + Merkitse osio <strong>%1</strong> - <strong>%2</strong>. Flag new partition as <strong>%1</strong>. - + Merkitse uusi osio <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. - + Lipun poisto osiosta <strong>%1</strong>. Clearing flags on new partition. - + Uusien osioiden lippujen poistaminen. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. - + Lippujen <strong>%2</strong> asettaminen osioon <strong>%1</strong>. Setting flags <strong>%1</strong> on new partition. - + Asetetaan liput <strong>%1</strong> uuteen osioon. The installer failed to set flags on partition %1. - + Asennusohjelma ei voinut asettaa lippuja osioon %1. @@ -2744,7 +2746,7 @@ Ulostulo: Setting password for user %1. - + Salasanan asettaminen käyttäjälle %1. @@ -2764,7 +2766,7 @@ Ulostulo: passwd terminated with error code %1. - + passwd päättyi virhekoodiin %1. @@ -2812,7 +2814,7 @@ Ulostulo: Cannot open /etc/timezone for writing - + Ei voi avata /etc/timezone @@ -2820,7 +2822,7 @@ Ulostulo: Shell Processes Job - + Shell-prosessien työ @@ -2829,7 +2831,7 @@ Ulostulo: %L1 / %L2 slide counter, %1 of %2 (numeric) - + %L1 / %L2 @@ -2837,12 +2839,12 @@ Ulostulo: This is an overview of what will happen once you start the setup procedure. - + Tämä on yleiskuva siitä, mitä tapahtuu, kun asennusohjelma käynnistetään. This is an overview of what will happen once you start the install procedure. - + Tämä on yleiskuva siitä, mitä tapahtuu asennuksen aloittamisen jälkeen. @@ -2863,17 +2865,17 @@ Ulostulo: Sending installation feedback. - + Lähetetään asennuksen palautetta. Internal error in install-tracking. - + Sisäinen virhe asennuksen seurannassa. HTTP request timed out. - + HTTP -pyyntö aikakatkaistiin. @@ -2881,28 +2883,28 @@ Ulostulo: Machine feedback - + Koneen palaute Configuring machine feedback. - + Konekohtaisen palautteen määrittäminen. Error in machine feedback configuration. - + Virhe koneen palautteen määrityksessä. Could not configure machine feedback correctly, script error %1. - + Konekohtaista palautetta ei voitu määrittää oikein, komentosarjan virhe %1. Could not configure machine feedback correctly, Calamares error %1. - + Koneen palautetta ei voitu määrittää oikein, Calamares-virhe %1. @@ -2915,37 +2917,37 @@ Ulostulo: Placeholder - + Paikkamerkki <html><head/><body><p>By selecting this, you will send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> - + <html><head/><body><p>Valitsemalla tämän, <span style=" font-weight:600;">et lähetä mitään</span> tietoja asennuksesta.</p></body></html> <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> - + <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Klikkaa tästä saadaksesi lisätietoja käyttäjäpalautteesta</span></a></p></body></html> Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with the last two options below), get continuous information about preferred applications. To see what will be sent, please click the help icon next to each area. - + Asentamalla seuranta autat %1 näkemään, kuinka monta käyttäjää heillä on, mitä laitteita he asentavat %1 ja (kahdella viimeisellä vaihtoehdolla), saat jatkuvaa tietoa suosituista sovelluksista. Jos haluat nähdä, mitä tietoa lähetetään, napsauta kunkin alueen vieressä olevaa ohjekuvaketta. By selecting this you will send information about your installation and hardware. This information will <b>only be sent once</b> after the installation finishes. - + Kun valitset tämän, lähetät tietoja asennuksesta ja laitteistosta. <b>Nämä tiedot lähetetään vain kerran</b> asennuksen päättymisen jälkeen. By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. - + Kun valitset tämän, lähetät <b>määräajoin </b> tietoja asennuksesta, laitteistosta ja sovelluksista osoitteeseen %1. By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. - + Kun valitset tämän, lähetät <b>säännöllisesti </b> tietoja asennuksesta, laitteistosta, sovelluksista ja käyttötavoista osoitteeseen %1. @@ -2961,12 +2963,12 @@ Ulostulo: <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> - + <small>Jos useampi kuin yksi henkilö käyttää tätä tietokonetta, voit luoda useita tilejä asennuksen jälkeen.</small> <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> - + <small>Jos useampi kuin yksi henkilö käyttää tätä tietokonetta, voit luoda useita tilejä asennuksen jälkeen.</small> @@ -2976,7 +2978,7 @@ Ulostulo: Your username contains invalid characters. Only lowercase letters and numbers are allowed. - + Käyttäjätunnuksesi sisältää virheellisiä merkkejä. Vain pienet kirjaimet ja numerot ovat sallittuja. @@ -3018,17 +3020,17 @@ Ulostulo: List of Physical Volumes - + Fyysisten levyjen luoettelo Volume Group Name: - + Aseman ryhmän nimi: Volume Group Type: - + Aseman ryhmän tyyppi: @@ -3058,7 +3060,7 @@ Ulostulo: Quantity of LVs: - + Määrä LVs: @@ -3071,12 +3073,12 @@ Ulostulo: &Release notes - + &Julkaisutiedot &Known issues - + &Tunnetut ongelmat @@ -3087,7 +3089,7 @@ Ulostulo: &Support - + &Tuki @@ -3097,27 +3099,27 @@ Ulostulo: <h1>Welcome to the %1 installer.</h1> - + <h1>Tervetuloa %1 -asennusohjelmaan.</h1> <h1>Welcome to the Calamares installer for %1.</h1> - + <h1>Tervetuloa Calamares -asennusohjelmaan %1.</h1> <h1>Welcome to the Calamares setup program for %1.</h1> - + <h1>Tervetuloa Calamares -asennusohjelmaan %1.</h1> <h1>Welcome to %1 setup.</h1> - + <h1>Tervetuloa %1 asennukseen.</h1> About %1 setup - + Tietoja %1 asetuksista @@ -3127,7 +3129,7 @@ Ulostulo: <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2019 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. - + <h1>%1</h1><br/><strong>%2<br/>- %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2019 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Kiitokset <a href="https://calamares.io/team/">Calamares-tiimille</a> ja <a href="https://www.transifex.com/calamares/calamares/">Calamares kääntäjille</a>.<br/><br/><a href="https://calamares.io/">Calamaresin</a> kehitystä sponsoroi <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. diff --git a/lang/calamares_ja.ts b/lang/calamares_ja.ts index 0efaed04b..cc379bc46 100644 --- a/lang/calamares_ja.ts +++ b/lang/calamares_ja.ts @@ -107,7 +107,7 @@ Set up - + セットアップ @@ -195,12 +195,12 @@ Waiting for %n module(s). - + %n モジュールを待機中。 (%n second(s)) - + (%n 秒(s)) @@ -466,7 +466,7 @@ The installer will quit and all changes will be lost. %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. - + %1 は %2MiB に縮小され新たに %4 に %3MiB のパーティションが作成されます。 @@ -709,12 +709,12 @@ The installer will quit and all changes will be lost. Create new %2MiB partition on %4 (%3) with file system %1. - + %4 (%3) に新たにファイルシステム %1 の %2MiB のパーティションが作成されます。 Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. - + Create new <strong>%4</strong> (%3) に新たにファイルシステム<strong>%1</strong>の <strong>%2MiB</strong> のパーティションが作成されます。 diff --git a/lang/calamares_pl.ts b/lang/calamares_pl.ts index bbdfe0294..4cd49e159 100644 --- a/lang/calamares_pl.ts +++ b/lang/calamares_pl.ts @@ -292,7 +292,7 @@ Cancel setup? - + Anulować ustawianie? @@ -1144,7 +1144,7 @@ Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone. Setup Complete - + Ustawianie ukończone @@ -1154,7 +1154,7 @@ Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone. The setup of %1 is complete. - + Ustawianie %1 jest ukończone. @@ -1551,7 +1551,7 @@ Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone. OEM Configuration - + Konfiguracja OEM @@ -2140,7 +2140,7 @@ Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone. There are no partitons to install on. - + Brak partycji, na których można zainstalować. @@ -2311,7 +2311,7 @@ Wyjście: (no mount point) - + (brak punktu montowania) @@ -3083,7 +3083,7 @@ i nie uruchomi się Select language - + Wybierz język @@ -3113,7 +3113,7 @@ i nie uruchomi się <h1>Welcome to %1 setup.</h1> - + <h1>Witamy w ustawianiu %1.</h1> From 1d0125324932d5da8dec36a8e63365480e154661 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 17 Jun 2019 15:35:07 +0200 Subject: [PATCH 29/45] i18n: [dummypythonqt] Automatic merge of Transifex translations --- .../ca@valencia/LC_MESSAGES/dummypythonqt.mo | Bin 0 -> 410 bytes .../ca@valencia/LC_MESSAGES/dummypythonqt.po | 42 ++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/modules/dummypythonqt/lang/ca@valencia/LC_MESSAGES/dummypythonqt.mo create mode 100644 src/modules/dummypythonqt/lang/ca@valencia/LC_MESSAGES/dummypythonqt.po diff --git a/src/modules/dummypythonqt/lang/ca@valencia/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/ca@valencia/LC_MESSAGES/dummypythonqt.mo new file mode 100644 index 0000000000000000000000000000000000000000..b22984ed705f55012f798124e85046c99ba1cee2 GIT binary patch literal 410 zcmYk0Ur)j?6vZ+6)JLCvxF$Y8v~=AAnI%g^9EK>e;N;ml%Bb1er7eH_AbveRi=7(q zB){~wJty~kot}KQypB9)o(s>h=gQM4^1S-bYkxMLy;7s!Megu;f#3w*mSEY36oluq$XY-E$cciagEVL*GBhM4w%hKxp+ffst@ zs#x&@mbPC95Zo+O9*v>TwIR!%5~vya;Ma$@I5U2>`VkgvG0!o@Gy2uBBBvvVm7 wPE@WJQWXrMH|h4>8T{Lb(sFHhiAUO0mVv5&t~L()@H@tB1?Mr)P9L?t0X>>_EC2ui literal 0 HcmV?d00001 diff --git a/src/modules/dummypythonqt/lang/ca@valencia/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/ca@valencia/LC_MESSAGES/dummypythonqt.po new file mode 100644 index 000000000..e67e371f3 --- /dev/null +++ b/src/modules/dummypythonqt/lang/ca@valencia/LC_MESSAGES/dummypythonqt.po @@ -0,0 +1,42 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-10 19:18-0400\n" +"PO-Revision-Date: 2016-12-16 12:18+0000\n" +"Language-Team: Catalan (Valencian) (https://www.transifex.com/calamares/teams/20061/ca@valencia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca@valencia\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/modules/dummypythonqt/main.py:84 +msgid "Click me!" +msgstr "" + +#: src/modules/dummypythonqt/main.py:94 +msgid "A new QLabel." +msgstr "" + +#: src/modules/dummypythonqt/main.py:97 +msgid "Dummy PythonQt ViewStep" +msgstr "" + +#: src/modules/dummypythonqt/main.py:183 +msgid "The Dummy PythonQt Job" +msgstr "" + +#: src/modules/dummypythonqt/main.py:186 +msgid "This is the Dummy PythonQt Job. The dummy job says: {}" +msgstr "" + +#: src/modules/dummypythonqt/main.py:190 +msgid "A status message for Dummy PythonQt Job." +msgstr "" From 74059dcaef3d4906011af3746ca25badf9fd1b9b Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 17 Jun 2019 15:35:07 +0200 Subject: [PATCH 30/45] i18n: [python] Automatic merge of Transifex translations --- lang/python/ca@valencia/LC_MESSAGES/python.mo | Bin 0 -> 410 bytes lang/python/ca@valencia/LC_MESSAGES/python.po | 372 ++++++++++++++++++ lang/python/fi_FI/LC_MESSAGES/python.mo | Bin 2126 -> 8463 bytes lang/python/fi_FI/LC_MESSAGES/python.po | 109 ++--- lang/python/pl/LC_MESSAGES/python.mo | Bin 4315 -> 5690 bytes lang/python/pl/LC_MESSAGES/python.po | 48 +-- 6 files changed, 456 insertions(+), 73 deletions(-) create mode 100644 lang/python/ca@valencia/LC_MESSAGES/python.mo create mode 100644 lang/python/ca@valencia/LC_MESSAGES/python.po diff --git a/lang/python/ca@valencia/LC_MESSAGES/python.mo b/lang/python/ca@valencia/LC_MESSAGES/python.mo new file mode 100644 index 0000000000000000000000000000000000000000..ab2697f1ec2ad9316c51d2e1498f989f360f1a33 GIT binary patch literal 410 zcmYk0Ur)j?6vZ+6)JLCvxF$Y8w6sH`qhyJS!w^LloIG1c88utGwB?T<#INUPu~P${ z%|b^=IwbDlz(9WDXB!cq)vQS}{m&`VTkv zF-+sh^KkrxCZf{D;gQYd4Bswui&M=2C1X4hD_Ljo9e093hXz-ehM0CCpzQqOlzO2@ zuJR?%1x^Jo8T7g11y|6V@, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-10 19:18-0400\n" +"PO-Revision-Date: 2017-08-09 10:34+0000\n" +"Language-Team: Catalan (Valencian) (https://www.transifex.com/calamares/teams/20061/ca@valencia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca@valencia\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/modules/grubcfg/main.py:37 +msgid "Configure GRUB." +msgstr "" + +#: src/modules/mount/main.py:38 +msgid "Mounting partitions." +msgstr "" + +#: src/modules/mount/main.py:150 src/modules/initcpiocfg/main.py:187 +#: src/modules/initcpiocfg/main.py:191 +#: src/modules/luksopenswaphookcfg/main.py:95 +#: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 +#: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 +#: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 +#: src/modules/openrcdmcryptcfg/main.py:82 +#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 +#: src/modules/networkcfg/main.py:48 +msgid "Configuration Error" +msgstr "" + +#: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 +#: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 +#: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 +#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +msgid "No partitions are defined for
{!s}
to use." +msgstr "" + +#: src/modules/services-systemd/main.py:35 +msgid "Configure systemd services" +msgstr "" + +#: src/modules/services-systemd/main.py:68 +#: src/modules/services-openrc/main.py:102 +msgid "Cannot modify service" +msgstr "" + +#: src/modules/services-systemd/main.py:69 +msgid "" +"systemctl {arg!s} call in chroot returned error code {num!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:72 +#: src/modules/services-systemd/main.py:76 +msgid "Cannot enable systemd service {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:74 +msgid "Cannot enable systemd target {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:78 +msgid "Cannot disable systemd target {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:80 +msgid "Cannot mask systemd unit {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:82 +msgid "" +"Unknown systemd commands {command!s} and " +"{suffix!s} for unit {name!s}." +msgstr "" + +#: src/modules/umount/main.py:40 +msgid "Unmount file systems." +msgstr "" + +#: src/modules/unpackfs/main.py:41 +msgid "Filling up filesystems." +msgstr "" + +#: src/modules/unpackfs/main.py:159 +msgid "rsync failed with error code {}." +msgstr "" + +#: src/modules/unpackfs/main.py:220 src/modules/unpackfs/main.py:238 +msgid "Failed to unpack image \"{}\"" +msgstr "" + +#: src/modules/unpackfs/main.py:221 +msgid "" +"Failed to find unsquashfs, make sure you have the squashfs-tools package " +"installed" +msgstr "" + +#: src/modules/unpackfs/main.py:320 +msgid "No mount point for root partition" +msgstr "" + +#: src/modules/unpackfs/main.py:321 +msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing" +msgstr "" + +#: src/modules/unpackfs/main.py:326 +msgid "Bad mount point for root partition" +msgstr "" + +#: src/modules/unpackfs/main.py:327 +msgid "rootMountPoint is \"{}\", which does not exist, doing nothing" +msgstr "" + +#: src/modules/unpackfs/main.py:340 src/modules/unpackfs/main.py:347 +#: src/modules/unpackfs/main.py:352 +msgid "Bad unsquash configuration" +msgstr "" + +#: src/modules/unpackfs/main.py:341 +msgid "The filesystem for \"{}\" ({}) is not supported" +msgstr "" + +#: src/modules/unpackfs/main.py:348 +msgid "The source filesystem \"{}\" does not exist" +msgstr "" + +#: src/modules/unpackfs/main.py:353 +msgid "The destination \"{}\" in the target system is not a directory" +msgstr "" + +#: src/modules/displaymanager/main.py:381 +msgid "Cannot write KDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:382 +msgid "KDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:443 +msgid "Cannot write LXDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:444 +msgid "LXDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:527 +msgid "Cannot write LightDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:528 +msgid "LightDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:602 +msgid "Cannot configure LightDM" +msgstr "" + +#: src/modules/displaymanager/main.py:603 +msgid "No LightDM greeter installed." +msgstr "" + +#: src/modules/displaymanager/main.py:634 +msgid "Cannot write SLIM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:635 +msgid "SLIM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:750 +msgid "No display managers selected for the displaymanager module." +msgstr "" + +#: src/modules/displaymanager/main.py:751 +msgid "" +"The displaymanagers list is empty or undefined in bothglobalstorage and " +"displaymanager.conf." +msgstr "" + +#: src/modules/displaymanager/main.py:831 +msgid "Display manager configuration was incomplete" +msgstr "" + +#: src/modules/initcpiocfg/main.py:36 +msgid "Configuring mkinitcpio." +msgstr "" + +#: src/modules/initcpiocfg/main.py:192 +#: src/modules/luksopenswaphookcfg/main.py:100 +#: src/modules/machineid/main.py:50 src/modules/initramfscfg/main.py:99 +#: src/modules/openrcdmcryptcfg/main.py:83 src/modules/fstab/main.py:317 +#: src/modules/localecfg/main.py:145 src/modules/networkcfg/main.py:49 +msgid "No root mount point is given for
{!s}
to use." +msgstr "" + +#: src/modules/initcpio/main.py:33 +msgid "Creating initramfs with mkinitcpio." +msgstr "" + +#: src/modules/initcpio/main.py:47 +msgid "Process Failed" +msgstr "" + +#: src/modules/initcpio/main.py:48 +msgid "" +"Process
mkinitcpio
failed with error code {!s}. The command was " +"
{!s}
." +msgstr "" + +#: src/modules/luksopenswaphookcfg/main.py:35 +msgid "Configuring encrypted swap." +msgstr "" + +#: src/modules/rawfs/main.py:35 +msgid "Installing data." +msgstr "" + +#: src/modules/services-openrc/main.py:38 +msgid "Configure OpenRC services" +msgstr "" + +#: src/modules/services-openrc/main.py:66 +msgid "Cannot add service {name!s} to run-level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:68 +msgid "Cannot remove service {name!s} from run-level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:70 +msgid "" +"Unknown service-action {arg!s} for service {name!s} in run-" +"level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:103 +msgid "" +"rc-update {arg!s} call in chroot returned error code {num!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:110 +msgid "Target runlevel does not exist" +msgstr "" + +#: src/modules/services-openrc/main.py:111 +msgid "" +"The path for runlevel {level!s} is {path!s}, which does not " +"exist." +msgstr "" + +#: src/modules/services-openrc/main.py:119 +msgid "Target service does not exist" +msgstr "" + +#: src/modules/services-openrc/main.py:120 +msgid "" +"The path for service {name!s} is {path!s}, which does not " +"exist." +msgstr "" + +#: src/modules/plymouthcfg/main.py:36 +msgid "Configure Plymouth theme" +msgstr "" + +#: src/modules/machineid/main.py:36 +msgid "Generate machine-id." +msgstr "" + +#: src/modules/packages/main.py:62 +#, python-format +msgid "Processing packages (%(count)d / %(total)d)" +msgstr "" + +#: src/modules/packages/main.py:64 src/modules/packages/main.py:74 +msgid "Install packages." +msgstr "" + +#: src/modules/packages/main.py:67 +#, python-format +msgid "Installing one package." +msgid_plural "Installing %(num)d packages." +msgstr[0] "" +msgstr[1] "" + +#: src/modules/packages/main.py:70 +#, python-format +msgid "Removing one package." +msgid_plural "Removing %(num)d packages." +msgstr[0] "" +msgstr[1] "" + +#: src/modules/bootloader/main.py:51 +msgid "Install bootloader." +msgstr "" + +#: src/modules/removeuser/main.py:34 +msgid "Remove live user from target system" +msgstr "" + +#: src/modules/initramfs/main.py:35 +msgid "Creating initramfs." +msgstr "" + +#: src/modules/initramfs/main.py:49 +msgid "Failed to run update-initramfs on the target" +msgstr "" + +#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + +#: src/modules/hwclock/main.py:35 +msgid "Setting hardware clock." +msgstr "" + +#: src/modules/dracut/main.py:36 +msgid "Creating initramfs with dracut." +msgstr "" + +#: src/modules/dracut/main.py:58 +msgid "Failed to run dracut on the target" +msgstr "" + +#: src/modules/initramfscfg/main.py:41 +msgid "Configuring initramfs." +msgstr "" + +#: src/modules/openrcdmcryptcfg/main.py:34 +msgid "Configuring OpenRC dmcrypt service." +msgstr "" + +#: src/modules/luksbootkeyfile/main.py:35 +msgid "Configuring LUKS key file." +msgstr "" + +#: src/modules/luksbootkeyfile/main.py:74 +msgid "Encrypted rootfs setup error" +msgstr "" + +#: src/modules/luksbootkeyfile/main.py:75 +msgid "Rootfs partition {!s} is LUKS but no passphrase found." +msgstr "" + +#: src/modules/fstab/main.py:38 +msgid "Writing fstab." +msgstr "" + +#: src/modules/dummypython/main.py:44 +msgid "Dummy python job." +msgstr "" + +#: src/modules/dummypython/main.py:97 +msgid "Dummy python step {}" +msgstr "" + +#: src/modules/localecfg/main.py:39 +msgid "Configuring locales." +msgstr "" + +#: src/modules/networkcfg/main.py:37 +msgid "Saving network configuration." +msgstr "" diff --git a/lang/python/fi_FI/LC_MESSAGES/python.mo b/lang/python/fi_FI/LC_MESSAGES/python.mo index 02ef2d1f4f60884793171cc5ed03c87c770811f1..b46237dde675512ca782769121253c28727ed5ce 100644 GIT binary patch literal 8463 zcmbuETWlOx8OMi`(&ExkN-1sW=RQwn-eP#&KiWPAI(y#=B>|CLyK;kMSP>aMvfd?cIzwgXtFSgSF zBaQz%bI$qBcR$}Z{>_a$zGiXFa^KGV`Kv5z8T`u*{&0QqJ(l%x@Jl)V9Nf+GUDsIF zZQyb60q|+?7Vsn-a+@F`IA_X7AN_y)KWyq7=sgZn|D zzXa|FzW~ZU-v@>6A3)(#lzJy{3n=dofJeZy;8WlWpz!lo&<1zF{26dBI17Fb907j@ zJ`Vm9{4}_Luwv&|LAJ7f3{HZ-1Vx@ZZ?r50J^?=eF3Va2Pw{*mo5{QdP{zLwie6s> z9|3;>3g0(F{5V(vC&2SLemBQIfiiD5#yEU_do^y5tR8?2DeHPRJqF$j3Vjz8KX?`td;bU&f4KGb%&u)v=spXI9It`gDaTbE2hvz{|XuS-Mfg4~Od>h1M)(VrvKA#022EPM73cdx3{QDsGB-j9J;158V zKcceri=g^I9Tekj*)2Ib#}_=Q=` zCB8GkEj}mLQSM#b;(L3!RN8OFuA$jEq{+x!VY-Si}IZ@&!ZWvfHB@N>9sS`I~B&fT~Y2=up6HXAotW&G0 zSVwKQDoi@QhD()%DoO*}(`^lh1`PB0nu3s4r`_d7GC6DI12s2xmOQO8@oFkTPdZVV z`U>i~)+)s!9rUd!nE9_3UC~Cq6E{oN(!hNu#{976);ooE3U(vyhiyb0)LA_W{mW`? zHF9yCnaSCHL#Vpz>4JDR=k()OGAUF2I}%$sJ-zjgz22ZsimO^D@^@ODnm>CS3zg4j zS~{3NQAi#4jLdl*oG@vqq@jHTDVG#ZkZY>D#toL$>9aEns;N6h`tC+Dly6n@t5K(w z6kGPs(SaEx#^P0{)j#H9*~szhasO*CBuw?dOTQ_zt1UNVa-@k27$^y-RTsHxkyA~R z?Z+=qqhd|Eam#Z$%69^1SxY|X2}8B&#B5j%{g$T_ZB3@W-%+hj(g*{!5-zd4_YGO2 zrPeN5CrkMy;OjA3O43%AaI7f@k0SU&lpA#8zaEdmLlf6cBdt1Nsu~WCjM-F{AnLK5 zgrOI!mQ!uQDtyHWsZG~hoXxpt-tm%wJwS*eH(5dOD`z{xQrTHwOO8#~#RyPXG z9%@apUM6%j1|-NLyjtm-&cX1p6QIr)0#u_oMl4^26A)FNUMABb2p(K4__#VTlL zeqTIh$~KN1tKoZwt73tXni^C03@0IeJyIL7=Cfq(!M_L?DU-$X(UZZ0On>xV69B$VW%J~_o5Ybc!I9Y_(g;B>6TlBkJ ztUQ86=4!u{bQFGx__-@Vb}396%U-zTcrg?t$iEvZM z4HzGjETM+iE{+r&#%Ze+Mudf#-Ev6UrWPvnQ&uptAg?QAmho>>!i}ochFc}q_oaZ0 zrIKEu(4vs}pQy!Q8c}NXh-Ad+-`F}EG=p$8C=Nf{sY=aO@ZMj2im01e3%0IBO2Vc9 ztrdY)swEG!u4at6a-GF#z3yJ<8I!F|AyufP0_Rz75CL;XBGY|>+D9C{&Vj<2*6$Fd z?6^VV;4_ZeEm_9o%sDA-cT1@-igiq|;8CE}KShion%vrwo7TpipsKb@JCy02EzoFMibLSsVBxV|5%nRJC$X{wI+ zQ8WMj$g)p{BuxB=MuplT76;2I(PS@b$DdGBZV>jo1j}8>#ej=Bat;jXi(_{p*81t zbXBR-?Y6XQw?kL*=*D`ou}*y!5-w>o=1fhTIHUsWZNl=NOZgk?8|zH$#D+_2Aq#1{ z88&Jh9FEHA(i{?Xj%seKcan`uv23wTb5)Q){)|WMs<>Fn+Ko$P4$51_vY9KE_UwM8 zOHaB=6)m6aiZMPVZQ53hEo<5md!AZno1V{0r>_r6*!NpAs^tSp7X*vFlbd7l_=1 zo@f9>^naB(bcB5W}9uA(8qO_J#O^$GkFQv3wrrWcV&c>z6=GUm2 z5{OF3XevofqM_rX)C__&kA3{z+ql$8IzcBXKln()*LEUb!hcke5+tCT9wt zABwb}vti6HW-320Cw&RhxQWc1slFM^HMXwb}m!9h;VNCXx zqhcjZBe#2^aRA8_k-msecJ5>+ibSdeZD1I6Id=vcG*vMzl${anKQ)a{Zdy=?C}xLa zb8zu%W4*nx&XHiMvzTtu-KL$CgSYUpo-#oEUQ}ICGoepG6Plm?%I7`BSwj(823CJYEvtk p6+d#Ky5evgddhbRV^ZK?Pl`gbp0vkSTdyU##Yy$2UD9~3hF_{7mAT6qSWHS!;)^>(PXz|r-gzT z#Dm9*gV>{moO`G@K@X;<9z_2Div>^q0SY4GcQ&ODJp0+nPG){HYga#~+Pj&^Ye9|B zqx3dCMmPF+P~WkHdsxKCAt4HQ0?mKU<0-t2!x-REe1T^E8_eStp2Z!!i@))h5N&a@ zzc*nXQ+#-eSzJRCq=Q5F3C%`d(QNz+ZA?a(OSlO%;}3_!g~cwKjsNVM84#k(xQr&? z45rv$xV(@=tnB*=D~vbsK7PXzPDOhGX3?DV37UmoqJ?kK1bdGY_yx^||Ih?KGbjW( z!^1(Z>cIDK!8n>5;ATXI=754j9n=xtSmU5LSQx-;nxM%UR+?v$Hn$d|_3`MmUXNP3 zJ($y%V>SITHWqI_mY!7gCF$$!_@q9Uc&L9Q%BiXsD5ueo-hw^nD5s)#l2e&GEx+yt zfj#ZWhC3(j)vEegvNST|HT`8z+4KBr2djZ{n?dE>gUnW+Ue8|4*W|*Yx_--Uc01ip zORCjiMYa}QeKKeDnTO{!s} to use." -msgstr "" +msgstr "Ei ole määritetty käyttämään osioita
{!s}
." #: src/modules/services-systemd/main.py:35 msgid "Configure systemd services" @@ -61,30 +61,32 @@ msgstr "Palvelua ei voi muokata" #: src/modules/services-systemd/main.py:69 msgid "" "systemctl {arg!s} call in chroot returned error code {num!s}." -msgstr "" +msgstr "systemctl {arg!s} chroot palautti virhe koodin {num!s}." #: src/modules/services-systemd/main.py:72 #: src/modules/services-systemd/main.py:76 msgid "Cannot enable systemd service {name!s}." -msgstr "" +msgstr "Systemd-palvelua ei saa käyttöön {name!s}." #: src/modules/services-systemd/main.py:74 msgid "Cannot enable systemd target {name!s}." -msgstr "" +msgstr "Systemd-kohdetta ei saa käyttöön {name!s}." #: src/modules/services-systemd/main.py:78 msgid "Cannot disable systemd target {name!s}." -msgstr "" +msgstr "Systemd-kohdetta ei-voi poistaa käytöstä {name!s}." #: src/modules/services-systemd/main.py:80 msgid "Cannot mask systemd unit {name!s}." -msgstr "" +msgstr "Ei voi peittää systemd-yksikköä {name!s}." #: src/modules/services-systemd/main.py:82 msgid "" "Unknown systemd commands {command!s} and " "{suffix!s} for unit {name!s}." msgstr "" +"Tuntematon systemd-komennot {command!s} ja " +"{suffix!s} yksikölle {name!s}." #: src/modules/umount/main.py:40 msgid "Unmount file systems." @@ -112,11 +114,11 @@ msgstr "" #: src/modules/unpackfs/main.py:320 msgid "No mount point for root partition" -msgstr "" +msgstr "Ei liitoskohtaa juuri root-osiolle" #: src/modules/unpackfs/main.py:321 msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing" -msgstr "" +msgstr "globalstorage ei sisällä \"rootMountPoint\" avainta, eikä tee mitään" #: src/modules/unpackfs/main.py:326 msgid "Bad mount point for root partition" @@ -124,7 +126,7 @@ msgstr "Huono kiinnityspiste root-osioon" #: src/modules/unpackfs/main.py:327 msgid "rootMountPoint is \"{}\", which does not exist, doing nothing" -msgstr "" +msgstr "rootMountPoint on \"{}\", jota ei ole, eikä tee mitään" #: src/modules/unpackfs/main.py:340 src/modules/unpackfs/main.py:347 #: src/modules/unpackfs/main.py:352 @@ -133,39 +135,39 @@ msgstr "Huono epäpuhdas kokoonpano" #: src/modules/unpackfs/main.py:341 msgid "The filesystem for \"{}\" ({}) is not supported" -msgstr "" +msgstr "Tiedostojärjestelmää \"{}\" ({}) ei tueta" #: src/modules/unpackfs/main.py:348 msgid "The source filesystem \"{}\" does not exist" -msgstr "" +msgstr "Lähde tiedostojärjestelmää \"{}\" ei ole olemassa" #: src/modules/unpackfs/main.py:353 msgid "The destination \"{}\" in the target system is not a directory" -msgstr "" +msgstr "Kohdejärjestelmän \"{}\" kohde ei ole hakemisto" #: src/modules/displaymanager/main.py:381 msgid "Cannot write KDM configuration file" -msgstr "" +msgstr "KDM-määritystiedostoa ei voi kirjoittaa" #: src/modules/displaymanager/main.py:382 msgid "KDM config file {!s} does not exist" -msgstr "" +msgstr "KDM-määritystiedostoa {!s} ei ole olemassa" #: src/modules/displaymanager/main.py:443 msgid "Cannot write LXDM configuration file" -msgstr "" +msgstr "LXDM-määritystiedostoa ei voi kirjoittaa" #: src/modules/displaymanager/main.py:444 msgid "LXDM config file {!s} does not exist" -msgstr "" +msgstr "LXDM-määritystiedostoa {!s} ei ole olemassa" #: src/modules/displaymanager/main.py:527 msgid "Cannot write LightDM configuration file" -msgstr "" +msgstr "LightDM-määritystiedostoa ei voi kirjoittaa" #: src/modules/displaymanager/main.py:528 msgid "LightDM config file {!s} does not exist" -msgstr "" +msgstr "LightDM-määritystiedostoa {!s} ei ole olemassa" #: src/modules/displaymanager/main.py:602 msgid "Cannot configure LightDM" @@ -185,13 +187,15 @@ msgstr "SLIM-määritystiedostoa {!s} ei ole olemassa" #: src/modules/displaymanager/main.py:750 msgid "No display managers selected for the displaymanager module." -msgstr "" +msgstr "Displaymanager-moduulia varten ei ole valittu näyttönhallintaa." #: src/modules/displaymanager/main.py:751 msgid "" "The displaymanagers list is empty or undefined in bothglobalstorage and " "displaymanager.conf." msgstr "" +"Displaymanager-luettelo on tyhjä tai määrittelemätön, sekä globalstorage, " +"että displaymanager.conf tiedostossa." #: src/modules/displaymanager/main.py:831 msgid "Display manager configuration was incomplete" @@ -208,10 +212,11 @@ msgstr "Määritetään mkinitcpio." #: src/modules/localecfg/main.py:145 src/modules/networkcfg/main.py:49 msgid "No root mount point is given for
{!s}
to use." msgstr "" +"Root-juuri kiinnityspistettä
{!s}
ei ole annettu käytettäväksi." #: src/modules/initcpio/main.py:33 msgid "Creating initramfs with mkinitcpio." -msgstr "" +msgstr "Initramfs luominen mkinitcpion avulla." #: src/modules/initcpio/main.py:47 msgid "Process Failed" @@ -222,10 +227,12 @@ msgid "" "Process
mkinitcpio
failed with error code {!s}. The command was " "
{!s}
." msgstr "" +"Prosessi
mkinitcpio
epäonnistui virhekoodilla {!s}. Komento oli " +"
{!s}
." #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." -msgstr "" +msgstr "Salatun swapin määrittäminen." #: src/modules/rawfs/main.py:35 msgid "Installing data." @@ -233,63 +240,67 @@ msgstr "Asennetaan tietoja." #: src/modules/services-openrc/main.py:38 msgid "Configure OpenRC services" -msgstr "" +msgstr "Määritä OpenRC-palvelut" #: src/modules/services-openrc/main.py:66 msgid "Cannot add service {name!s} to run-level {level!s}." -msgstr "" +msgstr "Palvelua {name!s} ei-voi lisätä suorituksen tasolle {level!s}." #: src/modules/services-openrc/main.py:68 msgid "Cannot remove service {name!s} from run-level {level!s}." -msgstr "" +msgstr "Ei voi poistaa palvelua {name!s} ajo-tasolla {level!s}." #: src/modules/services-openrc/main.py:70 msgid "" "Unknown service-action {arg!s} for service {name!s} in run-" "level {level!s}." msgstr "" +"Tuntematon huoltotoiminto{arg!s} palvelun {name!s} " +"palvelutasolle {level!s}." #: src/modules/services-openrc/main.py:103 msgid "" "rc-update {arg!s} call in chroot returned error code {num!s}." msgstr "" +"rc-update {arg!s} palautti chrootissa virhekoodin {num!s}." #: src/modules/services-openrc/main.py:110 msgid "Target runlevel does not exist" -msgstr "" +msgstr "Kohde runlevel ei ole olemassa" #: src/modules/services-openrc/main.py:111 msgid "" "The path for runlevel {level!s} is {path!s}, which does not " "exist." -msgstr "" +msgstr "Ajotason polku {level!s} on {path!s}, jota ei ole." #: src/modules/services-openrc/main.py:119 msgid "Target service does not exist" -msgstr "" +msgstr "Kohdepalvelua ei ole" #: src/modules/services-openrc/main.py:120 msgid "" "The path for service {name!s} is {path!s}, which does not " "exist." msgstr "" +"Palvelun polku {name!s} on {path!s}, jota ei ole olemassa." #: src/modules/plymouthcfg/main.py:36 msgid "Configure Plymouth theme" -msgstr "" +msgstr "Määritä Plymouthin teema" #: src/modules/machineid/main.py:36 msgid "Generate machine-id." -msgstr "" +msgstr "Luo koneen-id." #: src/modules/packages/main.py:62 #, python-format msgid "Processing packages (%(count)d / %(total)d)" -msgstr "" +msgstr "Pakettien käsittely (%(count)d / %(total)d)" #: src/modules/packages/main.py:64 src/modules/packages/main.py:74 msgid "Install packages." -msgstr "" +msgstr "Asenna paketteja." #: src/modules/packages/main.py:67 #, python-format @@ -307,72 +318,72 @@ msgstr[1] "" #: src/modules/bootloader/main.py:51 msgid "Install bootloader." -msgstr "" +msgstr "Asenna bootloader." #: src/modules/removeuser/main.py:34 msgid "Remove live user from target system" -msgstr "" +msgstr "Poista Live-käyttäjä kohdejärjestelmästä" #: src/modules/initramfs/main.py:35 msgid "Creating initramfs." -msgstr "" +msgstr "Luodaan initramfs." #: src/modules/initramfs/main.py:49 msgid "Failed to run update-initramfs on the target" -msgstr "" +msgstr "Kohteen update-initramfs suorittaminen epäonnistui" #: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 msgid "The exit code was {}" -msgstr "" +msgstr "Poistumiskoodi oli {}" #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." -msgstr "" +msgstr "Laitteiston kellon asettaminen." #: src/modules/dracut/main.py:36 msgid "Creating initramfs with dracut." -msgstr "" +msgstr "Initramfs luominen dracut:lla." #: src/modules/dracut/main.py:58 msgid "Failed to run dracut on the target" -msgstr "" +msgstr "Dracut-ohjelman suorittaminen ei onnistunut" #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." -msgstr "" +msgstr "Määritetään initramfs." #: src/modules/openrcdmcryptcfg/main.py:34 msgid "Configuring OpenRC dmcrypt service." -msgstr "" +msgstr "OpenRC dmcrypt-palvelun määrittäminen." #: src/modules/luksbootkeyfile/main.py:35 msgid "Configuring LUKS key file." -msgstr "" +msgstr "LUKS-avaintiedoston määrittäminen." #: src/modules/luksbootkeyfile/main.py:74 msgid "Encrypted rootfs setup error" -msgstr "" +msgstr "Salattu rootfs asennusvirhe" #: src/modules/luksbootkeyfile/main.py:75 msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" +msgstr "Rootfs-osio {!s} on LUKS, mutta salasanaa ei löydy." #: src/modules/fstab/main.py:38 msgid "Writing fstab." -msgstr "" +msgstr "Fstab kirjoittaminen." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." -msgstr "" +msgstr "Harjoitus python-työ." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" -msgstr "" +msgstr "Harjoitus python-vaihe {}" #: src/modules/localecfg/main.py:39 msgid "Configuring locales." -msgstr "" +msgstr "Määritetään locales." #: src/modules/networkcfg/main.py:37 msgid "Saving network configuration." -msgstr "" +msgstr "Tallennetaan verkon määrityksiä." diff --git a/lang/python/pl/LC_MESSAGES/python.mo b/lang/python/pl/LC_MESSAGES/python.mo index cf7829295b8b84852e7f82e500c24cd8beaec070..ea1d342693fcc31e4e4f7db0a09b9f82a2d295a8 100644 GIT binary patch delta 2231 zcmaKsTTC2P7{?EHfwGhqETHJAR_KLpskM!XMhyiq7TN}AOcbNT?ywBIJG0Kt6qjf= zy?Bc?sZNYfDt$6BK9~?qY#JXFv{4gHe9>rH)cVj@Z%H*#f8XpbEUob*hu@sr_nq_q zf6I59&-UgoY^Z)!(e~1Bq%T$|H3U;t{GmNxt<){>1=tDSf$i{9*any3t?&=H1$Ndb z)dTN^GETsa@Dyx@^RNTH3yG6gpYb7qe=72Ccs=8eTBTZHAKU~7;mz<-C<&j268H@4 zh3~-@_#>2azrj&hU#HX!a01HwlTgmR1Y5|j&hW9Gi3NBET!fO~3X~UgT~~NfKa>D7 zunXqlUGR0d8GZ{R@GrOnHq>)@xDSR(Ksk4+$hYC$dxdTezAt+v2P!u}>W&c}HUiuM~ealdkt3>8I;U*|Gba*}b zi?sJPlNK1r(d4)r*FDzo26wAbK zk(%-dA0ldtVwx@&%2P9;L~?6sB8xPBg`uZ75jH6(k&cI`+vwtR6xkpqVXlnfdX`9-jRw!woUGIL z8$2i;RMwv89W#!~b!^j{b=;(ml`9@qjLC%;>$X+3 zVO?&@N;fkGl-NBa)eZkiaTZ5j)J^B8n5eer(#AH51Ol_`0Twnqez3?FB7OZT%yT z?Ugj4NOE`*RR>XM&aiAAnvz9Fn@QKOeVuWrRh~>B9mW_Ki3V>r4OT>hOHJL8qQNAN xnOQ%mkDTv&*vMGfTtW15<8{_DW272jtK=vajj`}?WOqeN`KhqVf?t|1{|ns;=u!Xx delta 929 zcmXZaO-R#m7{KvoZRs|3?!~vJ=6}sx<#G~Iu%vL~V^8;Q@@|aqP!3#_(=^ypD0k-!On7mq;7##1ojrZjq`i z*I%rn{_q+4@ePjP21c=C>*hj9)P>GrFJ8xk_y{AofrIF55E;e<_TzaR#U(t0&v7s7 zOJAeNZoZhrcAUd;Tt=Pv9a`vfi?mXO1jZO2_KIxBEb7A7a1XAaZs0u*;lKKLsEMjE zK8;$zTiD6^vc`k%=mqLTRx{H!|0p8P9n zOT9jk8BC)7Zw0G|czDZ04*jhn`*0q0qQ|%mKi~xZME%_u{Yl^&I#BOL2dNPxb+Z~; zO>L0|OGqE72h*x)SlWN>H7yet$^7 Date: Mon, 17 Jun 2019 15:43:28 +0200 Subject: [PATCH 31/45] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_ar.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/calamares_ar.ts b/lang/calamares_ar.ts index e60c06393..3a7d77f4d 100644 --- a/lang/calamares_ar.ts +++ b/lang/calamares_ar.ts @@ -149,12 +149,12 @@ Run command %1 %2 - شغّل الأمر 1% 2% + شغّل الأمر %1 %2 Running command %1 %2 - يشغّل الأمر 1% 2% + يشغّل الأمر %1 %2
From e94bbc5e0cc0c6c4bee8ec506da7c29c554fb6aa Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 15:53:02 +0200 Subject: [PATCH 32/45] [dummyprocess] Add some delay in the dummy --- src/modules/dummyprocess/module.desc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/dummyprocess/module.desc b/src/modules/dummyprocess/module.desc index 6463e7a43..55d11cfab 100644 --- a/src/modules/dummyprocess/module.desc +++ b/src/modules/dummyprocess/module.desc @@ -5,5 +5,5 @@ type: "job" name: "dummyprocess" interface: "process" chroot: false -command: "/bin/sh -c \"touch ~/calamares-dummyprocess\"" -timeout: 5 +command: "/bin/sh -c \"sleep 5 ; touch ~/calamares-dummyprocess\"" +timeout: 8 From 36789d23fb7a6e66b38af17aa5fec99fbb6b1fd6 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 16:04:41 +0200 Subject: [PATCH 33/45] CMake: update language list (add ca@valencia) --- CMakeLists.txt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 882aafe6c..7bd572a3b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,12 +106,11 @@ set( CALAMARES_DESCRIPTION_SUMMARY # the original four lines with the current translations). set( _tx_complete ca cs_CZ da de fr he hr hu ko lt pt_BR sq tr_TR zh_TW ) -set( _tx_good ast en_GB es es_MX et gl id it_IT ja nl pl pt_PT ro - ru sk zh_CN ) -set( _tx_ok ar bg el es_PR eu fi_FI hi is mr nb sl sr sr@latin sv - th uk ) -set( _tx_bad be eo fa fr_CH gu kk kn lo mk ne_NP ur uz ) - +set( _tx_good ast en_GB es es_MX et fi_FI gl id it_IT ja nl pl + pt_PT ro ru sk zh_CN ) +set( _tx_ok ar bg el eo es_PR eu hi is mr nb sl sr sr@latin sv th + uk ) +set( _tx_bad be ca@valencia fa fr_CH gu kk kn lo mk ne_NP ur uz ) ### Required versions # From b1f9d1334c8d0b92f6cb32b308f3379e7bd1d4c7 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Jun 2019 16:07:06 +0200 Subject: [PATCH 34/45] CI: chase Python deprecations in ConfigParser --- ci/txstats.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/txstats.py b/ci/txstats.py index 39ec65575..1304c8265 100644 --- a/ci/txstats.py +++ b/ci/txstats.py @@ -14,8 +14,8 @@ def get_tx_credentials(): txconfig_name = os.path.expanduser("~/.transifexrc") try: with open(txconfig_name, "r") as f: - parser = configparser.SafeConfigParser() - parser.readfp(f) + parser = configparser.ConfigParser() + parser.read_file(f) return parser.get("https://www.transifex.com", "password") except IOError as e: From 25fe8f73c91253769a5ba160b4a68cc3bc91618e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 11:44:19 +0200 Subject: [PATCH 35/45] CI: label languages "incomplete" at < 5% --- CMakeLists.txt | 10 +++++----- ci/txstats.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7bd572a3b..cf078193c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,7 +84,7 @@ set( CALAMARES_DESCRIPTION_SUMMARY # complete = 100% translated, # good = nearly complete (use own judgement, right now >= 75%) # ok = incomplete (more than 25% untranslated, at least 5% translated), -# bad = 0% translated, placeholder in tx; these are not included. +# incomplete = <5% translated, placeholder in tx; these are not included. # # Language en (source language) is added later. It isn't listed in # Transifex either. Get the list of languages and their status @@ -108,9 +108,9 @@ set( _tx_complete ca cs_CZ da de fr he hr hu ko lt pt_BR sq tr_TR zh_TW ) set( _tx_good ast en_GB es es_MX et fi_FI gl id it_IT ja nl pl pt_PT ro ru sk zh_CN ) -set( _tx_ok ar bg el eo es_PR eu hi is mr nb sl sr sr@latin sv th +set( _tx_ok ar bg el es_PR eu hi is mr nb sl sr sr@latin sv th uk ) -set( _tx_bad be ca@valencia fa fr_CH gu kk kn lo mk ne_NP ur uz ) +set( _tx_incomplete be ca@valencia eo fa fr_CH gu kk kn lo mk ne_NP ur uz ) ### Required versions # @@ -324,8 +324,8 @@ endif() # then run an extra cmake-time check for consistency of the old # (p_tx*) and new (_tx*) lists. # -set( prev_tx ${p_tx_complete} ${p_tx_good} ${p_tx_ok} ${p_tx_bad} ) -set( curr_tx ${_tx_complete} ${_tx_good} ${_tx_ok} ${_tx_bad} ) +set( prev_tx ${p_tx_complete} ${p_tx_good} ${p_tx_ok} ${p_tx_incomplete} ) +set( curr_tx ${_tx_complete} ${_tx_good} ${_tx_ok} ${_tx_incomplete} ) set( tx_errors OFF ) if ( prev_tx ) # Gone in new list diff --git a/ci/txstats.py b/ci/txstats.py index 1304c8265..d29e7dc75 100644 --- a/ci/txstats.py +++ b/ci/txstats.py @@ -71,7 +71,7 @@ def get_tx_stats(token): output_langs(all_langs, "complete", lambda s : s == 1.0) output_langs(all_langs, "good", lambda s : 1.0 > s >= 0.75) output_langs(all_langs, "ok", lambda s : 0.75 > s >= 0.05) - output_langs(all_langs, "bad", lambda s : 0.05 > s) + output_langs(all_langs, "incomplete", lambda s : 0.05 > s) return 0 From 5fdaeaa8993726cfb4cfd2af52b5295cbfdfd2a3 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 11:58:03 +0200 Subject: [PATCH 36/45] [libcalamaresui] Improve wording when module is missing configuration --- src/libcalamaresui/modulesystem/Module.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcalamaresui/modulesystem/Module.cpp b/src/libcalamaresui/modulesystem/Module.cpp index d05245384..44798b32b 100644 --- a/src/libcalamaresui/modulesystem/Module.cpp +++ b/src/libcalamaresui/modulesystem/Module.cpp @@ -198,7 +198,7 @@ Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Ex return; } } - cDebug() << "No config file found in" << Logger::DebugList( configCandidates ); + cDebug() << "No config file for" << m_name << "found anywhere at" << Logger::DebugList( configCandidates ); } From 34b1a250bae02896c14d2e0cf7d32c5013e1a650 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 12:06:13 +0200 Subject: [PATCH 37/45] [libcalamares] Improve warnings when module descriptor files are bad --- .../modulesystem/ModuleManager.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp index 185ec37e9..a030e55cd 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.cpp +++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp @@ -90,10 +90,14 @@ ModuleManager::doInit() if ( success ) { QFileInfo descriptorFileInfo( currentDir.absoluteFilePath( QLatin1Literal( "module.desc") ) ); - if ( ! ( descriptorFileInfo.exists() && descriptorFileInfo.isReadable() ) ) + if ( !descriptorFileInfo.exists() ) { - cDebug() << Q_FUNC_INFO << "unreadable file: " - << descriptorFileInfo.absoluteFilePath(); + cDebug() << "ModuleManager expected descriptor is missing:" << descriptorFileInfo.absoluteFilePath(); + continue; + } + if ( !descriptorFileInfo.isReadable() ) + { + cDebug() << "ModuleManager descriptor file is unreadable:" << descriptorFileInfo.absoluteFilePath(); continue; } @@ -111,13 +115,14 @@ ModuleManager::doInit() } else { - cWarning() << "Cannot cd into module directory " - << path << "/" << subdir; + cWarning() << "ModuleManager module directory is not accessible:" << path << "/" << subdir; } } } else - cDebug() << "ModuleManager bad search path" << path; + { + cDebug() << "ModuleManager module search path does not exist:" << path; + } } // At this point m_availableModules is filled with whatever was found in the // search paths. @@ -359,7 +364,7 @@ ModuleManager::checkDependencies() m_availableDescriptorsByModuleName.erase( it ); failed << moduleName; cWarning() << "Module" << moduleName << "requires modules" << Logger::DebugList( unmet ); - cWarning() << Logger::SubEntry << "but these are not available (listed in settings, or installed)."; + cWarning() << Logger::SubEntry << "but these are not available (listed in settings, or installed)."; break; } } From 6183c4e2f40eb49b40e0bdcc6cb866729d0afc3b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 12:17:25 +0200 Subject: [PATCH 38/45] [libcalamares] Add accessors for GeoIP handler attributes --- src/libcalamares/geoip/Handler.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libcalamares/geoip/Handler.h b/src/libcalamares/geoip/Handler.h index 5c3207b60..8e435b5b7 100644 --- a/src/libcalamares/geoip/Handler.h +++ b/src/libcalamares/geoip/Handler.h @@ -25,7 +25,7 @@ #include #include -namespace CalamaresUtils +namespace CalamaresUtils { namespace GeoIP { @@ -80,6 +80,8 @@ public: bool isValid() const { return m_type != Type::None; } Type type() const { return m_type; } + QString url() const { return m_url; } + QString selector() const { return m_selector; } private: Type m_type; From 3967f6c5ae75ac23c6b97bcbeb5258285caf6b23 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 12:24:30 +0200 Subject: [PATCH 39/45] [welcome] Log where GeoIP information came from, if it's unusable - This helps chase down broken GeoIP configurations, since you can check the URL and handler type shown in the log. --- src/modules/welcome/WelcomeViewStep.cpp | 15 +++++++++++++-- src/modules/welcome/WelcomeViewStep.h | 13 +++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/modules/welcome/WelcomeViewStep.cpp b/src/modules/welcome/WelcomeViewStep.cpp index a27cc4cf0..cccf49458 100644 --- a/src/modules/welcome/WelcomeViewStep.cpp +++ b/src/modules/welcome/WelcomeViewStep.cpp @@ -133,7 +133,7 @@ WelcomeViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { QString countryResult = f->future().result(); cDebug() << "GeoIP result for welcome=" << countryResult; - view->setCountry( countryResult ); + view->setCountry( countryResult, h ); f->deleteLater(); delete h; } ); @@ -156,12 +156,22 @@ WelcomeViewStep::checkRequirements() return m_requirementsChecker->checkRequirements(); } +static inline void +logGeoIPHandler( CalamaresUtils::GeoIP::Handler* handler ) +{ + if ( handler ) + { + cDebug() << Logger::SubEntry << "Obtained from" << handler->url() << " (" << static_cast( handler->type() ) << handler->selector() << ')'; + } +} + void -WelcomeViewStep::setCountry( const QString& countryCode ) +WelcomeViewStep::setCountry( const QString& countryCode, CalamaresUtils::GeoIP::Handler* handler ) { if ( countryCode.length() != 2 ) { cDebug() << "Unusable country code" << countryCode; + logGeoIPHandler( handler ); return; } @@ -169,6 +179,7 @@ WelcomeViewStep::setCountry( const QString& countryCode ) if ( c_l.first == QLocale::Country::AnyCountry ) { cDebug() << "Unusable country code" << countryCode; + logGeoIPHandler( handler ); return; } else diff --git a/src/modules/welcome/WelcomeViewStep.h b/src/modules/welcome/WelcomeViewStep.h index 7deed2167..5d27d7aad 100644 --- a/src/modules/welcome/WelcomeViewStep.h +++ b/src/modules/welcome/WelcomeViewStep.h @@ -32,6 +32,14 @@ class WelcomePage; class GeneralRequirements; +namespace CalamaresUtils +{ + namespace GeoIP + { + class Handler; + } +} // namespace + class PLUGINDLLEXPORT WelcomeViewStep : public Calamares::ViewStep { Q_OBJECT @@ -57,9 +65,10 @@ public: /** @brief Sets the country that Calamares is running in. * * This (ideally) sets up language and locale settings that are right for - * the given 2-letter country code. + * the given 2-letter country code. Uses the handler's information (if + * given) for error reporting. */ - void setCountry( const QString& ); + void setCountry( const QString&, CalamaresUtils::GeoIP::Handler* handler ); Calamares::RequirementsList checkRequirements() override; From 68dc1f5e318ae59bc80690d525de35e6af5802ec Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 12:33:56 +0200 Subject: [PATCH 40/45] [libcalamares] Warn about badly-configured GeoIP - Warn when type will be none - Re-order warnings from general to specific --- src/libcalamares/geoip/Handler.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/libcalamares/geoip/Handler.cpp b/src/libcalamares/geoip/Handler.cpp index 192ab1a7c..df033f476 100644 --- a/src/libcalamares/geoip/Handler.cpp +++ b/src/libcalamares/geoip/Handler.cpp @@ -64,17 +64,21 @@ Handler::Handler( const QString& implementation, const QString& url, const QStri { bool ok = false; m_type = handlerTypes().find( implementation, ok ); -#if !defined(QT_XML_LIB) - if ( m_type == Type::XML ) - { - m_type = Type::None; - cWarning() << "GeoIP style XML is not supported in this version of Calamares."; - } -#endif if ( !ok ) { - cWarning() << "GeoIP Style" << implementation << "is not recognized."; + cWarning() << "GeoIP style" << implementation << "is not recognized."; } + else if ( m_type == Type::None ) + { + cWarning() << "GeoIP style *none* does not do anything."; + } +#if !defined(QT_XML_LIB) + else if ( m_type == Type::XML ) + { + m_type = Type::None; + cWarning() << "GeoIP style *xml* is not supported in this version of Calamares."; + } +#endif } Handler::~Handler() From 0f66a892363a6f0972726da14fd7dfae4e75f8bc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 12:34:52 +0200 Subject: [PATCH 41/45] [welcome] Only do GeoIP query if it's useful - If badly-configured, then type is none; this is warned about in the constructor of Handler() - Only run the query if it's a useful type. --- src/modules/welcome/WelcomeViewStep.cpp | 26 ++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/modules/welcome/WelcomeViewStep.cpp b/src/modules/welcome/WelcomeViewStep.cpp index cccf49458..938fe1f45 100644 --- a/src/modules/welcome/WelcomeViewStep.cpp +++ b/src/modules/welcome/WelcomeViewStep.cpp @@ -128,16 +128,24 @@ WelcomeViewStep::setConfigurationMap( const QVariantMap& configurationMap ) CalamaresUtils::getString( geoip, "style" ), CalamaresUtils::getString( geoip, "url" ), CalamaresUtils::getString( geoip, "selector" ) ); - auto* future = new FWString(); - connect( future, &FWString::finished, [view=this, f=future, h=handler]() + if ( handler->type() != CalamaresUtils::GeoIP::Handler::Type::None ) { - QString countryResult = f->future().result(); - cDebug() << "GeoIP result for welcome=" << countryResult; - view->setCountry( countryResult, h ); - f->deleteLater(); - delete h; - } ); - future->setFuture( handler->queryRaw() ); + auto* future = new FWString(); + connect( future, &FWString::finished, [view=this, f=future, h=handler]() + { + QString countryResult = f->future().result(); + cDebug() << "GeoIP result for welcome=" << countryResult; + view->setCountry( countryResult, h ); + f->deleteLater(); + delete h; + } ); + future->setFuture( handler->queryRaw() ); + } + else + { + // Would not produce useful country code anyway. + delete handler; + } } From a5cef2175e27add57fa761ebdd045e7323adfbd8 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 15:27:59 +0200 Subject: [PATCH 42/45] [libcalamares] Add tests for the locale service - Minimal tests just check that all the availableTranslations() entries have a reasonable language setting. - Checks that Esperanto is still broken as a locale in Qt. --- src/libcalamares/CMakeLists.txt | 14 ++++- src/libcalamares/locale/Tests.cpp | 87 +++++++++++++++++++++++++++++++ src/libcalamares/locale/Tests.h | 38 ++++++++++++++ 3 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 src/libcalamares/locale/Tests.cpp create mode 100644 src/libcalamares/locale/Tests.h diff --git a/src/libcalamares/CMakeLists.txt b/src/libcalamares/CMakeLists.txt index b414887c4..f74c11b0c 100644 --- a/src/libcalamares/CMakeLists.txt +++ b/src/libcalamares/CMakeLists.txt @@ -167,16 +167,26 @@ if ( ECM_FOUND AND BUILD_TESTING ) ${YAMLCPP_LIBRARY} ) calamares_automoc( geoiptest ) - + ecm_add_test( partition/Tests.cpp TEST_NAME libcalamarespartitiontest LINK_LIBRARIES - calamares + calamares Qt5::Test ) calamares_automoc( libcalamarespartitiontest ) + + ecm_add_test( + locale/Tests.cpp + TEST_NAME + libcalamareslocaletest + LINK_LIBRARIES + calamares + Qt5::Test + ) + calamares_automoc( libcalamareslocaletest ) endif() if( BUILD_TESTING ) diff --git a/src/libcalamares/locale/Tests.cpp b/src/libcalamares/locale/Tests.cpp new file mode 100644 index 000000000..6fd0f3e61 --- /dev/null +++ b/src/libcalamares/locale/Tests.cpp @@ -0,0 +1,87 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "Tests.h" + +#include "locale/LabelModel.h" +#include "utils/Logger.h" + +#include + +QTEST_GUILESS_MAIN( LocaleTests ) + +LocaleTests::LocaleTests() +{ +} + +LocaleTests::~LocaleTests() +{ +} + +void +LocaleTests::initTestCase() +{ +} + +void +LocaleTests::testLanguageModelCount() +{ + const auto* m = CalamaresUtils::Locale::availableTranslations(); + + QVERIFY( m ); + QVERIFY( m->rowCount( QModelIndex() ) > 1 ); + + int dutch = m->find( QLocale( "nl_NL" ) ); + QVERIFY( dutch > 0 ); + QCOMPARE( m->find( "NL" ), dutch ); + // must be capitals + QCOMPARE( m->find( "nl" ), -1 ); + QCOMPARE( m->find( QLocale( "nl" ) ), dutch ); + + // Belgium speaks Dutch as well + QCOMPARE( m->find( "BE" ), dutch ); +} + +void +LocaleTests::testEsperanto() +{ + Logger::setupLogLevel( Logger::LOGDEBUG ); + + const auto* m = CalamaresUtils::Locale::availableTranslations(); + + QVERIFY( m ); + + // Cursory test that all the locales found have a sensible language, + // and that some specific languages have sensible corresponding data. + // + // This fails on Esperanto (or, if Esperanto is added to Qt, then + // this will pass and the test after the loop will fail. + for ( int i = 0; i < m->rowCount( QModelIndex() ); ++i ) + { + const auto& label = m->locale( i ); + const auto locale = label.locale(); + cDebug() << label.label() << locale; + + QVERIFY( locale.language() == QLocale::Greek ? locale.script() == QLocale::GreekScript : true ); + QVERIFY( locale.language() == QLocale::Korean ? locale.script() == QLocale::KoreanScript : true ); + QVERIFY( locale.language() == QLocale::Lithuanian ? locale.country() == QLocale::Lithuania : true ); + QVERIFY( locale.language() != QLocale::C ); + } + + QCOMPARE( QLocale( "eo" ).language(), QLocale::C ); +} diff --git a/src/libcalamares/locale/Tests.h b/src/libcalamares/locale/Tests.h new file mode 100644 index 000000000..be712388f --- /dev/null +++ b/src/libcalamares/locale/Tests.h @@ -0,0 +1,38 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef LIBCALAMARES_LOCALE_TESTS_H +#define LIBCALAMARES_LOCALE_TESTS_H + +#include + +class LocaleTests : public QObject +{ + Q_OBJECT +public: + LocaleTests(); + ~LocaleTests() override; + +private Q_SLOTS: + void initTestCase(); + + void testLanguageModelCount(); + void testEsperanto(); +}; + +#endif From 780fe125f7c1f9b5c6c46bc24e1cadc179acb3c6 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 16:18:18 +0200 Subject: [PATCH 43/45] [libcalamaresui] Give the buttons icons - Next, Back, Cancel/Quit have somewhat-appropriate icons. --- src/libcalamaresui/ViewManager.cpp | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 3a5d24feb..05cefb390 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -54,6 +54,28 @@ ViewManager::instance( QObject* parent ) return s_instance; } +/** @brief Creates a button with a given icon-name + * + * Creates a new button as child of @p parent. + * Sets the named icon, if it exists, onto the button. + * Returns the new button. + * + * There is a QPushButton constructor that takes an icon, + * but it also needs a text and we've got translations + * to worry about as well as state. + */ +static inline QPushButton* +makeButton( QWidget* parent, const QString& name ) +{ + QPushButton* button = new QPushButton( parent ); + auto icon = Calamares::Branding::instance()->image( name, QSize( 22, 22 ) ); + if ( button && !icon.isNull() ) + { + button->setIcon( icon ); + } + return button; +} + ViewManager::ViewManager( QObject* parent ) : QObject( parent ) , m_currentStep( 0 ) @@ -68,9 +90,10 @@ ViewManager::ViewManager( QObject* parent ) m_stack->setContentsMargins( 0, 0, 0, 0 ); mainLayout->addWidget( m_stack ); - m_back = new QPushButton( m_widget ); - m_next = new QPushButton( m_widget ); - m_quit = new QPushButton( m_widget ); + // Create buttons and sets an initial icon; the icons may change + m_back = makeButton( m_widget, "go-previous" ); + m_next = makeButton( m_widget, "go-next" ); + m_quit = makeButton( m_widget, "dialog-cancel" ); CALAMARES_RETRANSLATE( m_back->setText( tr( "&Back" ) ); From b3d9af4cae3356bc3c34cf8cf3a3d6491d882f74 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 22:45:49 +0200 Subject: [PATCH 44/45] [libcalamaresui] Apply correct button labels - updateButtonLabels() knows all the special cases for buttons, so use it when the language changes instead of setting up some possibly-wrong values. - One edge case that this fixes is: have **just** the welcome page before the first exec section in sequence. Then the *next* button label was *next* instead of *install*. --- src/libcalamaresui/ViewManager.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 05cefb390..ad8892802 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -96,13 +96,7 @@ ViewManager::ViewManager( QObject* parent ) m_quit = makeButton( m_widget, "dialog-cancel" ); CALAMARES_RETRANSLATE( - m_back->setText( tr( "&Back" ) ); - m_next->setText( tr( "&Next" ) ); - m_quit->setText( tr( "&Cancel" ) ); - QString tooltip = Calamares::Settings::instance()->isSetupMode() - ? tr( "Cancel setup without changing the system." ) - : tr( "Cancel installation without changing the system." ); - m_quit->setToolTip( tooltip ); + updateButtonLabels(); ) QBoxLayout* bottomLayout = new QHBoxLayout; @@ -344,26 +338,30 @@ ViewManager::updateButtonLabels() { const auto* const settings = Calamares::Settings::instance(); - QString next = settings->isSetupMode() + QString nextIsInstallationStep = settings->isSetupMode() ? tr( "&Set up" ) : tr( "&Install" ); - QString complete = settings->isSetupMode() + QString quitOnCompleteTooltip = settings->isSetupMode() ? tr( "Setup is complete. Close the setup program." ) : tr( "The installation is complete. Close the installer." ); - QString quit = settings->isSetupMode() + QString cancelBeforeInstallationTooltip = settings->isSetupMode() ? tr( "Cancel setup without changing the system." ) : tr( "Cancel installation without changing the system." ); // If we're going into the execution step / install phase, other message if ( stepIsExecute( m_steps, m_currentStep+1 ) ) - m_next->setText( next ); + m_next->setText( nextIsInstallationStep ); else m_next->setText( tr( "&Next" ) ); + // Going back is always simple + m_back->setText( tr( "&Back" ) ); + + // Cancel button changes label at the end if ( isAtVeryEnd() ) { m_quit->setText( tr( "&Done" ) ); - m_quit->setToolTip( complete ); + m_quit->setToolTip( quitOnCompleteTooltip ); m_quit->setVisible( true ); // At end, always visible and enabled. updateCancelEnabled( true ); } @@ -374,7 +372,7 @@ ViewManager::updateButtonLabels() updateCancelEnabled( !settings->disableCancel() && !( stepIsExecute( m_steps, m_currentStep ) && settings->disableCancelDuringExec() ) ); m_quit->setText( tr( "&Cancel" ) ); - m_quit->setToolTip( quit ); + m_quit->setToolTip( cancelBeforeInstallationTooltip ); } } From 79dc9e34632e1055fd9c55262f472b48813d8e81 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 18 Jun 2019 22:54:41 +0200 Subject: [PATCH 45/45] [libcalamares] Update button icons as we go along - Adapt the button icons (previous, next, do-install, all-done) to the state of the buttons and the corresponding text. --- src/libcalamaresui/ViewManager.cpp | 31 +++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index ad8892802..16c38b1bc 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -54,6 +54,23 @@ ViewManager::instance( QObject* parent ) return s_instance; } +/** @brief Get a button-sized icon. */ +static inline QPixmap +getButtonIcon( const QString& name ) +{ + return Calamares::Branding::instance()->image( name, QSize( 22, 22 ) ); +} + +static inline void +setButtonIcon( QPushButton* button, const QString& name ) +{ + auto icon = getButtonIcon( name ); + if ( button && !icon.isNull() ) + { + button->setIcon( icon ); + } +} + /** @brief Creates a button with a given icon-name * * Creates a new button as child of @p parent. @@ -68,11 +85,7 @@ static inline QPushButton* makeButton( QWidget* parent, const QString& name ) { QPushButton* button = new QPushButton( parent ); - auto icon = Calamares::Branding::instance()->image( name, QSize( 22, 22 ) ); - if ( button && !icon.isNull() ) - { - button->setIcon( icon ); - } + setButtonIcon( button, name ); return button; } @@ -350,9 +363,15 @@ ViewManager::updateButtonLabels() // If we're going into the execution step / install phase, other message if ( stepIsExecute( m_steps, m_currentStep+1 ) ) + { m_next->setText( nextIsInstallationStep ); + setButtonIcon( m_next, "run-install" ); + } else + { m_next->setText( tr( "&Next" ) ); + setButtonIcon( m_next, "go-next" ); + } // Going back is always simple m_back->setText( tr( "&Back" ) ); @@ -363,6 +382,7 @@ ViewManager::updateButtonLabels() m_quit->setText( tr( "&Done" ) ); m_quit->setToolTip( quitOnCompleteTooltip ); m_quit->setVisible( true ); // At end, always visible and enabled. + setButtonIcon( m_quit, "dialog-ok-apply" ); updateCancelEnabled( true ); } else @@ -373,6 +393,7 @@ ViewManager::updateButtonLabels() m_quit->setText( tr( "&Cancel" ) ); m_quit->setToolTip( cancelBeforeInstallationTooltip ); + setButtonIcon( m_quit, "dialog-cancel" ); } }